Files
byre/internal/store/migrations/100-baseline.sql
T

239 lines
11 KiB
SQL

CREATE TABLE projects (
id TEXT PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
repo_path TEXT NOT NULL UNIQUE,
default_branch TEXT NOT NULL,
remote TEXT NOT NULL,
created_by TEXT NOT NULL REFERENCES users(login),
created_at TEXT NOT NULL
, review_workflow TEXT NOT NULL DEFAULT '', audit_workflow TEXT NOT NULL DEFAULT '');
CREATE TABLE tasks (
id TEXT PRIMARY KEY,
project_id TEXT NOT NULL REFERENCES projects(id),
title TEXT NOT NULL,
branch TEXT NOT NULL,
worktree_path TEXT NOT NULL,
base_ref TEXT NOT NULL,
status TEXT NOT NULL,
created_by TEXT NOT NULL REFERENCES users(login),
created_at TEXT NOT NULL,
closed_at TEXT
, merge_commit TEXT NOT NULL DEFAULT '', merge_title TEXT NOT NULL DEFAULT '', todo_item TEXT NOT NULL DEFAULT '', merging_by TEXT NOT NULL DEFAULT '', forked_from TEXT NOT NULL DEFAULT '', forked_at INTEGER NOT NULL DEFAULT 0, merge_queued_by TEXT NOT NULL DEFAULT '', merge_queued_at TEXT NOT NULL DEFAULT '', color INTEGER NOT NULL DEFAULT 0, workflow_name TEXT NOT NULL DEFAULT '', workflow_brief TEXT NOT NULL DEFAULT '', workflow_stage TEXT NOT NULL DEFAULT '', workflow_title TEXT NOT NULL DEFAULT '', stage_output TEXT NOT NULL DEFAULT '', stage_commit TEXT NOT NULL DEFAULT '', summary TEXT NOT NULL DEFAULT '', discarding_by TEXT NOT NULL DEFAULT '', discard_state TEXT NOT NULL DEFAULT '', discard_session TEXT NOT NULL DEFAULT '', parent_task_id TEXT NOT NULL DEFAULT '', parent_merge_by TEXT NOT NULL DEFAULT '', finalizing TEXT NOT NULL DEFAULT '', state TEXT NOT NULL DEFAULT '', review_requests INTEGER NOT NULL DEFAULT 0, finalizing_commit TEXT NOT NULL DEFAULT '', finalizing_notes TEXT NOT NULL DEFAULT '', finalizing_unchanged INTEGER NOT NULL DEFAULT 0, merge_after_review_by TEXT NOT NULL DEFAULT '', merge_after_review_id TEXT NOT NULL DEFAULT '', merge_after_review_target TEXT NOT NULL DEFAULT '', ready TEXT NOT NULL DEFAULT '', ready_prompt_seq INTEGER NOT NULL DEFAULT 0, audit TEXT NOT NULL DEFAULT '', workflow_definition_id TEXT REFERENCES workflow_definitions(id), merge_after_turn INTEGER NOT NULL DEFAULT 0, pushing_to_main INTEGER NOT NULL DEFAULT 0, unmerged_commits INTEGER NOT NULL DEFAULT 0, unmerged_files INTEGER NOT NULL DEFAULT 0, unreviewed_changes INTEGER NOT NULL DEFAULT 0, review_snapshot INTEGER NOT NULL DEFAULT 0, review_count INTEGER NOT NULL DEFAULT 0, review_running INTEGER NOT NULL DEFAULT 0, review_failed INTEGER NOT NULL DEFAULT 0, review_findings INTEGER NOT NULL DEFAULT 0, landing_session TEXT NOT NULL DEFAULT '', landing_by TEXT NOT NULL DEFAULT '');
CREATE TABLE events (
seq INTEGER PRIMARY KEY AUTOINCREMENT,
kind TEXT NOT NULL,
project_id TEXT,
task_id TEXT,
actor TEXT NOT NULL,
payload TEXT NOT NULL,
created_at TEXT NOT NULL
, agent_session_id TEXT, owner TEXT);
CREATE TABLE blobs (
id TEXT PRIMARY KEY,
content_type TEXT NOT NULL,
created_by TEXT NOT NULL REFERENCES users(login),
created_at TEXT NOT NULL
);
CREATE TABLE snapshots (
id TEXT PRIMARY KEY,
task_id TEXT NOT NULL REFERENCES tasks(id),
agent_session_id TEXT NOT NULL REFERENCES agent_sessions(id),
n INTEGER NOT NULL,
commit_sha TEXT NOT NULL,
tree_sha TEXT NOT NULL,
event_seq INTEGER NOT NULL,
trigger TEXT NOT NULL,
created_at TEXT NOT NULL, review INTEGER NOT NULL DEFAULT 0, settle_state TEXT NOT NULL DEFAULT '',
UNIQUE (task_id, n)
);
CREATE TABLE "agent_sessions" (
id TEXT PRIMARY KEY,
task_id TEXT REFERENCES tasks(id),
owner TEXT NOT NULL DEFAULT '',
vendor TEXT NOT NULL,
model TEXT NOT NULL,
vendor_session_id TEXT NOT NULL,
state TEXT NOT NULL,
role TEXT NOT NULL,
created_by TEXT NOT NULL REFERENCES users(login),
created_at TEXT NOT NULL
, forked_from TEXT NOT NULL DEFAULT '', forked_at TEXT NOT NULL DEFAULT '', stage_output TEXT NOT NULL DEFAULT '', stage_finished INTEGER NOT NULL DEFAULT 0, subagents INTEGER NOT NULL DEFAULT 0, member TEXT NOT NULL DEFAULT '', started INTEGER NOT NULL DEFAULT 0, pending INTEGER NOT NULL DEFAULT 0);
CREATE TABLE lead_inputs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
owner TEXT NOT NULL REFERENCES users(login),
kind TEXT NOT NULL,
actor TEXT NOT NULL,
text TEXT NOT NULL,
images TEXT NOT NULL DEFAULT '[]',
created_at TEXT NOT NULL
, send_id TEXT NOT NULL DEFAULT '', client_id TEXT NOT NULL DEFAULT '');
CREATE TABLE previews (
task_id TEXT NOT NULL REFERENCES tasks(id),
name TEXT NOT NULL,
port INTEGER NOT NULL,
created_at TEXT NOT NULL,
PRIMARY KEY (task_id, name),
UNIQUE (task_id, port)
);
CREATE TABLE task_inputs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id TEXT NOT NULL REFERENCES tasks(id),
actor TEXT NOT NULL,
text TEXT NOT NULL,
images TEXT NOT NULL DEFAULT '[]',
created_at TEXT NOT NULL
, member TEXT NOT NULL DEFAULT '', send_id TEXT NOT NULL DEFAULT '', client_id TEXT NOT NULL DEFAULT '');
CREATE TABLE lead_notes (
id TEXT PRIMARY KEY,
owner TEXT NOT NULL REFERENCES users(login),
text TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
, project_id TEXT NOT NULL DEFAULT '');
CREATE TABLE summary_reads (
login TEXT NOT NULL REFERENCES users(login),
task_id TEXT NOT NULL REFERENCES tasks(id),
seq INTEGER NOT NULL,
PRIMARY KEY (login, task_id)
);
CREATE TABLE "users" (
login TEXT PRIMARY KEY,
display_name TEXT NOT NULL,
git_name TEXT NOT NULL DEFAULT '',
git_email TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL,
default_model TEXT NOT NULL DEFAULT 'claude-opus-5-5',
away INTEGER NOT NULL DEFAULT 0, notify_questions INTEGER NOT NULL DEFAULT 1, notify_reports INTEGER NOT NULL DEFAULT 0, notify_errors INTEGER NOT NULL DEFAULT 0, notify_rate_limits INTEGER NOT NULL DEFAULT 0, notify_ready INTEGER NOT NULL DEFAULT 0, notify_discard INTEGER NOT NULL DEFAULT 0, notify_merge_problems INTEGER NOT NULL DEFAULT 0, notify_workflows INTEGER NOT NULL DEFAULT 0, focus_task_id TEXT, focus_project_id TEXT);
CREATE TABLE usage_commands (
vendor TEXT PRIMARY KEY,
command TEXT NOT NULL
);
CREATE TABLE "inbox_items" (
id TEXT PRIMARY KEY,
project_id TEXT NOT NULL REFERENCES projects(id),
task_id TEXT NOT NULL REFERENCES tasks(id),
agent_session_id TEXT NOT NULL REFERENCES agent_sessions(id),
payload TEXT NOT NULL,
state TEXT NOT NULL,
created_at TEXT NOT NULL,
resolved_by TEXT,
resolved_at TEXT
);
CREATE TABLE "inbox_responses" (
id TEXT PRIMARY KEY,
item_id TEXT NOT NULL REFERENCES inbox_items(id),
actor TEXT NOT NULL,
type TEXT NOT NULL,
text TEXT,
attachments TEXT NOT NULL,
created_at TEXT NOT NULL,
delivered_at TEXT,
options TEXT,
images TEXT NOT NULL DEFAULT '[]',
snapshot_n INTEGER
);
CREATE TABLE "reviews" (
id TEXT PRIMARY KEY,
task_id TEXT NOT NULL REFERENCES tasks(id),
snapshot_n INTEGER NOT NULL,
agent_session_id TEXT REFERENCES agent_sessions(id),
vendor TEXT NOT NULL,
model TEXT NOT NULL,
state TEXT NOT NULL,
result TEXT NOT NULL DEFAULT '',
error TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL,
finished_at TEXT NOT NULL DEFAULT '',
finding_states TEXT NOT NULL DEFAULT '{}',
finding_responses TEXT NOT NULL DEFAULT '{}',
stage TEXT NOT NULL DEFAULT '',
definition_id TEXT REFERENCES workflow_definitions(id),
UNIQUE (task_id, snapshot_n, stage)
);
CREATE TABLE workflow_definitions (
id TEXT PRIMARY KEY,
description TEXT NOT NULL
);
CREATE TABLE workflow_steps (
definition_id TEXT NOT NULL REFERENCES workflow_definitions(id),
id INTEGER NOT NULL,
parent INTEGER,
position INTEGER NOT NULL,
kind TEXT NOT NULL CHECK (kind IN ('stage', 'order', 'parallel')),
stage TEXT NOT NULL,
model TEXT NOT NULL,
prompt TEXT NOT NULL,
PRIMARY KEY (definition_id, id),
UNIQUE (definition_id, parent, position)
);
CREATE TABLE workflow_agents (
definition_id TEXT NOT NULL REFERENCES workflow_definitions(id),
step_id INTEGER NOT NULL,
position INTEGER NOT NULL,
name TEXT NOT NULL,
model TEXT NOT NULL,
prompt TEXT NOT NULL,
PRIMARY KEY (definition_id, step_id, position),
FOREIGN KEY (definition_id, step_id) REFERENCES workflow_steps(definition_id, id)
);
CREATE TABLE "workflows" (
name TEXT PRIMARY KEY,
definition_id TEXT NOT NULL REFERENCES workflow_definitions(id)
);
CREATE TABLE saved_commands (
id TEXT PRIMARY KEY,
owner TEXT NOT NULL REFERENCES users(login),
name TEXT NOT NULL,
command TEXT NOT NULL
);
CREATE TABLE task_participants (
task_id TEXT NOT NULL REFERENCES tasks (id),
position INTEGER NOT NULL,
login TEXT NOT NULL,
display_name TEXT NOT NULL,
git_name TEXT NOT NULL,
git_email TEXT NOT NULL,
PRIMARY KEY (task_id, position)
);
CREATE TABLE schedules (
id TEXT PRIMARY KEY,
project_id TEXT NOT NULL REFERENCES projects(id),
owner TEXT NOT NULL REFERENCES users(login),
title TEXT NOT NULL,
every TEXT NOT NULL CHECK (every IN ('hour', 'day', 'week', 'month')),
hour INTEGER NOT NULL CHECK (hour BETWEEN 0 AND 23),
minute INTEGER NOT NULL CHECK (minute BETWEEN 0 AND 59),
day_of_month INTEGER NOT NULL CHECK (day_of_month BETWEEN 0 AND 31),
prompt TEXT NOT NULL,
workflow TEXT NOT NULL,
next_run_at TEXT NOT NULL,
created_at TEXT NOT NULL
);
CREATE TABLE schedule_weekdays (
schedule_id TEXT NOT NULL REFERENCES schedules(id),
weekday TEXT NOT NULL CHECK (weekday IN ('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun')),
PRIMARY KEY (schedule_id, weekday)
);
CREATE INDEX tasks_project ON tasks(project_id, created_at);
CREATE INDEX events_task ON events(task_id, seq);
CREATE INDEX agent_sessions_task ON agent_sessions(task_id, created_at);
CREATE INDEX agent_sessions_state ON agent_sessions(state);
CREATE INDEX agent_sessions_owner ON agent_sessions(owner, created_at);
CREATE INDEX events_owner ON events(owner, seq) WHERE owner IS NOT NULL;
CREATE INDEX lead_inputs_owner ON lead_inputs(owner, id);
CREATE INDEX task_inputs_task ON task_inputs(task_id, id);
CREATE INDEX tasks_parent ON tasks(parent_task_id) WHERE parent_task_id != '';
CREATE INDEX lead_notes_owner ON lead_notes(owner, created_at);
CREATE INDEX events_summary ON events(task_id, seq) WHERE kind = 'turn.ended' AND json_extract(payload, '$.summary') = 1;
CREATE INDEX inbox_items_open ON inbox_items(state, created_at);
CREATE INDEX inbox_items_session ON inbox_items(agent_session_id, state);
CREATE INDEX inbox_responses_item ON inbox_responses(item_id, created_at);
CREATE INDEX events_send_id ON events(json_extract(payload, '$.send_id')) WHERE kind IN ('user.queued', 'user.message');
CREATE UNIQUE INDEX reviews_session ON reviews(agent_session_id);
CREATE INDEX events_attention ON events(task_id) WHERE kind IN ('inbox.created', 'task.ready', 'session.error', 'session.rate_limited');
CREATE INDEX events_message_session ON events(agent_session_id, seq) WHERE kind = 'user.message';
CREATE INDEX saved_commands_owner ON saved_commands(owner, name);
CREATE INDEX tasks_status ON tasks (status);
CREATE INDEX reviews_running ON reviews(state) WHERE state = 'running';
CREATE INDEX schedules_by_next_run ON schedules (next_run_at);