-- Chat Switchboard — 006 Knowledge Bases (SQLite) CREATE TABLE IF NOT EXISTS knowledge_bases ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', scope TEXT NOT NULL DEFAULT 'global', owner_id TEXT REFERENCES users(id) ON DELETE CASCADE, team_id TEXT REFERENCES teams(id) ON DELETE CASCADE, embedding_config TEXT NOT NULL DEFAULT '{}', document_count INTEGER NOT NULL DEFAULT 0, chunk_count INTEGER NOT NULL DEFAULT 0, total_bytes INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'active', discoverable INTEGER NOT NULL DEFAULT 1, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_kb_scope ON knowledge_bases(scope); CREATE INDEX IF NOT EXISTS idx_kb_owner ON knowledge_bases(owner_id); CREATE INDEX IF NOT EXISTS idx_kb_team ON knowledge_bases(team_id); CREATE TABLE IF NOT EXISTS kb_documents ( id TEXT PRIMARY KEY, kb_id TEXT NOT NULL REFERENCES knowledge_bases(id) ON DELETE CASCADE, filename TEXT NOT NULL, content_type TEXT NOT NULL, size_bytes INTEGER NOT NULL, storage_key TEXT NOT NULL, extracted_text TEXT, chunk_count INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL DEFAULT 'pending', error TEXT, uploaded_by TEXT NOT NULL REFERENCES users(id), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_kbdoc_kb ON kb_documents(kb_id); CREATE TABLE IF NOT EXISTS kb_chunks ( id TEXT PRIMARY KEY, kb_id TEXT NOT NULL REFERENCES knowledge_bases(id) ON DELETE CASCADE, document_id TEXT NOT NULL REFERENCES kb_documents(id) ON DELETE CASCADE, chunk_index INTEGER NOT NULL, content TEXT NOT NULL, token_count INTEGER NOT NULL DEFAULT 0, metadata TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_kbchunk_kb ON kb_chunks(kb_id); CREATE INDEX IF NOT EXISTS idx_kbchunk_doc ON kb_chunks(document_id); CREATE TABLE IF NOT EXISTS channel_knowledge_bases ( channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE, kb_id TEXT NOT NULL REFERENCES knowledge_bases(id) ON DELETE CASCADE, enabled INTEGER NOT NULL DEFAULT 1, added_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (channel_id, kb_id) ); CREATE TABLE IF NOT EXISTS persona_knowledge_bases ( persona_id TEXT NOT NULL REFERENCES personas(id) ON DELETE CASCADE, kb_id TEXT NOT NULL REFERENCES knowledge_bases(id) ON DELETE CASCADE, auto_search INTEGER NOT NULL DEFAULT 0, added_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (persona_id, kb_id) ); CREATE INDEX IF NOT EXISTS idx_persona_kb_persona ON persona_knowledge_bases(persona_id); CREATE INDEX IF NOT EXISTS idx_persona_kb_kb ON persona_knowledge_bases(kb_id);