-- Antigravity Notebook Database Schema -- Enable UUID extension CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- Notebooks table CREATE TABLE IF NOT EXISTS notebooks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Sources table (PDFs, URLs, Text) CREATE TABLE IF NOT EXISTS sources ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), notebook_id UUID REFERENCES notebooks(id) ON DELETE CASCADE, source_type VARCHAR(10) NOT NULL CHECK (source_type IN ('pdf', 'url', 'text')), filename VARCHAR(255), url TEXT, content_hash VARCHAR(64), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, metadata JSONB DEFAULT '{}'::jsonb ); -- Latent tensors (CLaRa-compressed representations) CREATE TABLE IF NOT EXISTS latent_tensors ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), source_id UUID REFERENCES sources(id) ON DELETE CASCADE, tensor_path VARCHAR(512) NOT NULL, segment_index INTEGER NOT NULL, token_count INTEGER NOT NULL, original_text_length INTEGER, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, metadata JSONB DEFAULT '{}'::jsonb ); -- Chat messages CREATE TABLE IF NOT EXISTS chat_messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), notebook_id UUID REFERENCES notebooks(id) ON DELETE CASCADE, role VARCHAR(20) NOT NULL CHECK (role IN ('user', 'assistant')), content TEXT NOT NULL, sources_used JSONB DEFAULT '[]'::jsonb, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Indexes for performance CREATE INDEX IF NOT EXISTS idx_sources_notebook_id ON sources(notebook_id); CREATE INDEX IF NOT EXISTS idx_latent_tensors_source_id ON latent_tensors(source_id); CREATE INDEX IF NOT EXISTS idx_chat_messages_notebook_id ON chat_messages(notebook_id); CREATE INDEX IF NOT EXISTS idx_notebooks_created_at ON notebooks(created_at DESC); -- Function to update updated_at timestamp CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; -- Trigger to auto-update updated_at CREATE TRIGGER update_notebooks_updated_at BEFORE UPDATE ON notebooks FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();