239 lines
11 KiB
SQL
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);
|