-- AI Assistant plugin migration 0002: chat folders + attachments CREATE TABLE IF NOT EXISTS ai_chat_folders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL, parent_id UUID REFERENCES ai_chat_folders(id) ON DELETE CASCADE, user_id UUID NOT NULL, tenant_id UUID NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), deleted_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS ix_ai_folders_user ON ai_chat_folders(user_id); CREATE INDEX IF NOT EXISTS ix_ai_folders_tenant ON ai_chat_folders(tenant_id); CREATE INDEX IF NOT EXISTS ix_ai_folders_parent ON ai_chat_folders(parent_id); ALTER TABLE ai_chat_sessions ADD COLUMN IF NOT EXISTS folder_id UUID REFERENCES ai_chat_folders(id) ON DELETE SET NULL; CREATE TABLE IF NOT EXISTS ai_chat_attachments ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), message_id UUID REFERENCES ai_chat_messages(id) ON DELETE CASCADE, session_id UUID NOT NULL REFERENCES ai_chat_sessions(id) ON DELETE CASCADE, filename VARCHAR(255) NOT NULL, mime_type VARCHAR(255) NOT NULL DEFAULT 'application/octet-stream', size_bytes INTEGER NOT NULL DEFAULT 0, storage_path VARCHAR(1024) NOT NULL, tenant_id UUID NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), deleted_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS ix_ai_attachments_message ON ai_chat_attachments(message_id); CREATE INDEX IF NOT EXISTS ix_ai_attachments_session ON ai_chat_attachments(session_id); CREATE INDEX IF NOT EXISTS ix_ai_attachments_tenant ON ai_chat_attachments(tenant_id);