39 lines
1.5 KiB
SQL
39 lines
1.5 KiB
SQL
-- War Room + 1:1 agent chat rooms/messages
|
|
CREATE TABLE IF NOT EXISTS warroom_rooms (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
kind TEXT NOT NULL CHECK (kind IN ('warroom', 'dm')),
|
|
agent_key VARCHAR(64) REFERENCES agent_souls(agent_key) ON DELETE CASCADE,
|
|
title TEXT NOT NULL DEFAULT '',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT warroom_rooms_kind_agent CHECK (
|
|
(kind = 'warroom' AND agent_key IS NULL) OR
|
|
(kind = 'dm' AND agent_key IS NOT NULL)
|
|
)
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS warroom_rooms_one_warroom
|
|
ON warroom_rooms ((kind)) WHERE kind = 'warroom';
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS warroom_rooms_dm_agent
|
|
ON warroom_rooms (agent_key) WHERE kind = 'dm';
|
|
|
|
CREATE TABLE IF NOT EXISTS warroom_messages (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
room_id BIGINT NOT NULL REFERENCES warroom_rooms(id) ON DELETE CASCADE,
|
|
sender_type TEXT NOT NULL CHECK (sender_type IN ('user', 'agent', 'system')),
|
|
agent_key VARCHAR(64),
|
|
username TEXT,
|
|
sender_avatar_url TEXT,
|
|
content TEXT NOT NULL,
|
|
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS warroom_messages_room_created
|
|
ON warroom_messages (room_id, created_at);
|
|
|
|
INSERT INTO warroom_rooms (kind, agent_key, title)
|
|
SELECT 'warroom', NULL, 'War Room'
|
|
WHERE NOT EXISTS (SELECT 1 FROM warroom_rooms WHERE kind = 'warroom');
|