-- AI Assistant plugin initial migration CREATE TABLE IF NOT EXISTS ai_providers ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) NOT NULL, provider_type VARCHAR(50) NOT NULL, api_key TEXT NOT NULL DEFAULT '', base_url VARCHAR(500) NOT NULL DEFAULT '', is_active BOOLEAN NOT NULL DEFAULT TRUE, is_default BOOLEAN NOT NULL DEFAULT FALSE, config JSONB NOT NULL DEFAULT '{}', 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_providers_tenant ON ai_providers(tenant_id); CREATE TABLE IF NOT EXISTS ai_models ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), provider_id UUID NOT NULL REFERENCES ai_providers(id) ON DELETE CASCADE, model_id VARCHAR(200) NOT NULL, display_name VARCHAR(200) NOT NULL, context_window INTEGER NOT NULL DEFAULT 4096, supports_tools BOOLEAN NOT NULL DEFAULT FALSE, supports_streaming BOOLEAN NOT NULL DEFAULT TRUE, is_active BOOLEAN NOT NULL DEFAULT TRUE, config JSONB NOT NULL DEFAULT '{}', 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_models_provider ON ai_models(provider_id); CREATE INDEX IF NOT EXISTS ix_ai_models_tenant ON ai_models(tenant_id); CREATE TABLE IF NOT EXISTS ai_presets ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) NOT NULL, model_id VARCHAR(200) NOT NULL, provider_id UUID REFERENCES ai_providers(id) ON DELETE SET NULL, temperature REAL NOT NULL DEFAULT 0.7, max_tokens INTEGER NOT NULL DEFAULT 2048, top_p REAL NOT NULL DEFAULT 1.0, system_prompt TEXT NOT NULL DEFAULT '', config JSONB NOT NULL DEFAULT '{}', is_active BOOLEAN NOT NULL DEFAULT TRUE, 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_presets_tenant ON ai_presets(tenant_id); CREATE TABLE IF NOT EXISTS ai_agents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) NOT NULL, description TEXT NOT NULL DEFAULT '', system_prompt TEXT NOT NULL DEFAULT '', preset_id UUID REFERENCES ai_presets(id) ON DELETE SET NULL, tool_ids JSONB NOT NULL DEFAULT '[]', is_default BOOLEAN NOT NULL DEFAULT FALSE, is_active BOOLEAN NOT NULL DEFAULT TRUE, config JSONB NOT NULL DEFAULT '{}', 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_agents_tenant ON ai_agents(tenant_id); CREATE TABLE IF NOT EXISTS ai_chat_sessions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL, agent_id UUID REFERENCES ai_agents(id) ON DELETE SET NULL, title VARCHAR(255) NOT NULL DEFAULT 'Neuer Chat', is_pinned BOOLEAN NOT NULL DEFAULT FALSE, is_sidebar BOOLEAN NOT NULL DEFAULT FALSE, 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_sessions_user ON ai_chat_sessions(user_id); CREATE INDEX IF NOT EXISTS ix_ai_sessions_tenant ON ai_chat_sessions(tenant_id); CREATE TABLE IF NOT EXISTS ai_chat_messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), session_id UUID NOT NULL REFERENCES ai_chat_sessions(id) ON DELETE CASCADE, role VARCHAR(20) NOT NULL, content TEXT NOT NULL DEFAULT '', tool_calls JSONB, tool_results JSONB, tokens INTEGER NOT NULL DEFAULT 0, model_used VARCHAR(200) NOT NULL DEFAULT '', 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_messages_session ON ai_chat_messages(session_id); CREATE INDEX IF NOT EXISTS ix_ai_messages_tenant ON ai_chat_messages(tenant_id);