The repository JSONB column on the issue table is unused. This removes it end-to-end: migration to drop the column, sqlc queries, Go handler/ service/daemon/protocol structs, TypeScript types, and the RepositoryEditor UI component. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
177 lines
6.7 KiB
SQL
177 lines
6.7 KiB
SQL
-- Enable extensions
|
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
|
|
|
-- Users
|
|
CREATE TABLE "user" (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
email TEXT UNIQUE NOT NULL,
|
|
avatar_url TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Workspaces
|
|
CREATE TABLE workspace (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
slug TEXT UNIQUE NOT NULL,
|
|
description TEXT,
|
|
settings JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Members (user <-> workspace)
|
|
CREATE TABLE member (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
user_id UUID NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
|
|
role TEXT NOT NULL CHECK (role IN ('owner', 'admin', 'member')),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
UNIQUE(workspace_id, user_id)
|
|
);
|
|
|
|
-- Agents
|
|
CREATE TABLE agent (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
avatar_url TEXT,
|
|
runtime_mode TEXT NOT NULL CHECK (runtime_mode IN ('local', 'cloud')),
|
|
runtime_config JSONB NOT NULL DEFAULT '{}',
|
|
visibility TEXT NOT NULL DEFAULT 'workspace' CHECK (visibility IN ('workspace', 'private')),
|
|
status TEXT NOT NULL DEFAULT 'offline' CHECK (status IN ('idle', 'working', 'blocked', 'error', 'offline')),
|
|
max_concurrent_tasks INT NOT NULL DEFAULT 1,
|
|
owner_id UUID REFERENCES "user"(id),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Issues
|
|
CREATE TABLE issue (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
status TEXT NOT NULL DEFAULT 'backlog'
|
|
CHECK (status IN ('backlog', 'todo', 'in_progress', 'in_review', 'done', 'blocked', 'cancelled')),
|
|
priority TEXT NOT NULL DEFAULT 'none'
|
|
CHECK (priority IN ('urgent', 'high', 'medium', 'low', 'none')),
|
|
assignee_type TEXT CHECK (assignee_type IN ('member', 'agent')),
|
|
assignee_id UUID,
|
|
creator_type TEXT NOT NULL CHECK (creator_type IN ('member', 'agent')),
|
|
creator_id UUID NOT NULL,
|
|
parent_issue_id UUID REFERENCES issue(id) ON DELETE SET NULL,
|
|
acceptance_criteria JSONB NOT NULL DEFAULT '[]',
|
|
context_refs JSONB NOT NULL DEFAULT '[]',
|
|
position FLOAT NOT NULL DEFAULT 0,
|
|
due_date TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Issue labels
|
|
CREATE TABLE issue_label (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
color TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE issue_to_label (
|
|
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
|
label_id UUID NOT NULL REFERENCES issue_label(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (issue_id, label_id)
|
|
);
|
|
|
|
-- Issue dependencies
|
|
CREATE TABLE issue_dependency (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
|
depends_on_issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
|
type TEXT NOT NULL CHECK (type IN ('blocks', 'blocked_by', 'related'))
|
|
);
|
|
|
|
-- Comments
|
|
CREATE TABLE comment (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
|
author_type TEXT NOT NULL CHECK (author_type IN ('member', 'agent')),
|
|
author_id UUID NOT NULL,
|
|
content TEXT NOT NULL,
|
|
type TEXT NOT NULL DEFAULT 'comment'
|
|
CHECK (type IN ('comment', 'status_change', 'progress_update', 'system')),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Inbox items
|
|
CREATE TABLE inbox_item (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
recipient_type TEXT NOT NULL CHECK (recipient_type IN ('member', 'agent')),
|
|
recipient_id UUID NOT NULL,
|
|
type TEXT NOT NULL,
|
|
severity TEXT NOT NULL DEFAULT 'info'
|
|
CHECK (severity IN ('action_required', 'attention', 'info')),
|
|
issue_id UUID REFERENCES issue(id) ON DELETE CASCADE,
|
|
title TEXT NOT NULL,
|
|
body TEXT,
|
|
read BOOLEAN NOT NULL DEFAULT FALSE,
|
|
archived BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Agent task queue
|
|
CREATE TABLE agent_task_queue (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
agent_id UUID NOT NULL REFERENCES agent(id) ON DELETE CASCADE,
|
|
issue_id UUID NOT NULL REFERENCES issue(id) ON DELETE CASCADE,
|
|
status TEXT NOT NULL DEFAULT 'queued'
|
|
CHECK (status IN ('queued', 'dispatched', 'running', 'completed', 'failed', 'cancelled')),
|
|
priority INT NOT NULL DEFAULT 0,
|
|
dispatched_at TIMESTAMPTZ,
|
|
started_at TIMESTAMPTZ,
|
|
completed_at TIMESTAMPTZ,
|
|
result JSONB,
|
|
error TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Daemon connections
|
|
CREATE TABLE daemon_connection (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
agent_id UUID NOT NULL REFERENCES agent(id) ON DELETE CASCADE,
|
|
daemon_id TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'disconnected'
|
|
CHECK (status IN ('connected', 'disconnected')),
|
|
last_heartbeat_at TIMESTAMPTZ,
|
|
runtime_info JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Activity log
|
|
CREATE TABLE activity_log (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
workspace_id UUID NOT NULL REFERENCES workspace(id) ON DELETE CASCADE,
|
|
issue_id UUID REFERENCES issue(id) ON DELETE CASCADE,
|
|
actor_type TEXT CHECK (actor_type IN ('member', 'agent', 'system')),
|
|
actor_id UUID,
|
|
action TEXT NOT NULL,
|
|
details JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE INDEX idx_issue_workspace ON issue(workspace_id);
|
|
CREATE INDEX idx_issue_assignee ON issue(assignee_type, assignee_id);
|
|
CREATE INDEX idx_issue_status ON issue(workspace_id, status);
|
|
CREATE INDEX idx_issue_parent ON issue(parent_issue_id);
|
|
CREATE INDEX idx_comment_issue ON comment(issue_id);
|
|
CREATE INDEX idx_inbox_recipient ON inbox_item(recipient_type, recipient_id, read);
|
|
CREATE INDEX idx_agent_task_queue_agent ON agent_task_queue(agent_id, status);
|
|
CREATE INDEX idx_activity_log_issue ON activity_log(issue_id);
|
|
CREATE INDEX idx_member_workspace ON member(workspace_id);
|
|
CREATE INDEX idx_agent_workspace ON agent(workspace_id);
|