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