Files
foodlinkk-command-center/migrations/043_warroom_chat.sql
T

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');