-- Chat Switchboard — 004 Personas & Grants (SQLite) CREATE TABLE IF NOT EXISTS personas ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT DEFAULT '', icon TEXT DEFAULT '', avatar TEXT DEFAULT '', base_model_id TEXT NOT NULL, provider_config_id TEXT REFERENCES provider_configs(id) ON DELETE SET NULL, system_prompt TEXT DEFAULT '', temperature REAL, max_tokens INTEGER, thinking_budget INTEGER, top_p REAL, memory_enabled INTEGER NOT NULL DEFAULT 1, memory_extraction_prompt TEXT, scope TEXT NOT NULL CHECK (scope IN ('global', 'team', 'personal')), owner_id TEXT, created_by TEXT NOT NULL REFERENCES users(id), is_active INTEGER DEFAULT 1, is_shared INTEGER DEFAULT 0, created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_personas_scope ON personas(scope); CREATE INDEX IF NOT EXISTS idx_personas_owner ON personas(owner_id); CREATE INDEX IF NOT EXISTS idx_personas_active ON personas(is_active); CREATE TABLE IF NOT EXISTS persona_grants ( id TEXT PRIMARY KEY, persona_id TEXT NOT NULL REFERENCES personas(id) ON DELETE CASCADE, grant_type TEXT NOT NULL, grant_ref TEXT NOT NULL, config TEXT DEFAULT '{}', created_at TEXT DEFAULT (datetime('now')), UNIQUE(persona_id, grant_type, grant_ref) ); CREATE INDEX IF NOT EXISTS idx_persona_grants_persona ON persona_grants(persona_id); CREATE INDEX IF NOT EXISTS idx_persona_grants_type ON persona_grants(grant_type); CREATE TABLE IF NOT EXISTS resource_grants ( id TEXT PRIMARY KEY, resource_type TEXT NOT NULL CHECK (resource_type IN ('persona', 'knowledge_base', 'project')), resource_id TEXT NOT NULL, grant_scope TEXT NOT NULL DEFAULT 'team_only' CHECK (grant_scope IN ('team_only', 'global', 'groups')), granted_groups TEXT NOT NULL DEFAULT '[]', created_by TEXT NOT NULL REFERENCES users(id), created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')), UNIQUE(resource_type, resource_id) ); CREATE INDEX IF NOT EXISTS idx_resource_grants_resource ON resource_grants(resource_type, resource_id);