-- WhispAssist initial schema (Phase 2). Mirrors docs/03-data-model.md. -- Forward-only migration applied via sqlx::migrate!. PRAGMA foreign_keys = ON; CREATE TABLE meetings ( id TEXT PRIMARY KEY, title TEXT NOT NULL DEFAULT 'Untitled meeting', started_at INTEGER NOT NULL, ended_at INTEGER, duration_secs INTEGER, folder_path TEXT NOT NULL, audio_path TEXT NOT NULL, status TEXT NOT NULL, -- recording|transcribing|ready|recovering|error language TEXT, backend_used TEXT, model_used TEXT, calendar_event_id TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); CREATE TABLE participants ( id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT, UNIQUE(name, email) ); CREATE TABLE speakers ( id TEXT PRIMARY KEY, meeting_id TEXT NOT NULL REFERENCES meetings(id) ON DELETE CASCADE, label TEXT NOT NULL, -- 'S1','S2',… display_name TEXT, participant_id TEXT REFERENCES participants(id), color TEXT, UNIQUE(meeting_id, label) ); CREATE TABLE meeting_participants ( meeting_id TEXT NOT NULL REFERENCES meetings(id) ON DELETE CASCADE, participant_id TEXT NOT NULL REFERENCES participants(id), role TEXT, -- organizer|required|optional PRIMARY KEY (meeting_id, participant_id) ); CREATE TABLE calendar_events ( id TEXT PRIMARY KEY, source TEXT NOT NULL, -- pst|graph|ics subject TEXT, organizer TEXT, starts_at INTEGER, ends_at INTEGER, description TEXT, raw_uid TEXT ); CREATE TABLE tags ( id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE ); CREATE TABLE meeting_tags ( meeting_id TEXT NOT NULL REFERENCES meetings(id) ON DELETE CASCADE, tag_id TEXT NOT NULL REFERENCES tags(id) ON DELETE CASCADE, PRIMARY KEY (meeting_id, tag_id) ); CREATE TABLE action_items ( id TEXT PRIMARY KEY, meeting_id TEXT NOT NULL REFERENCES meetings(id) ON DELETE CASCADE, text TEXT NOT NULL, owner TEXT, due_at INTEGER, confirmed INTEGER NOT NULL DEFAULT 0, reminder_set INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL ); CREATE VIRTUAL TABLE meeting_fts USING fts5( meeting_id UNINDEXED, title, transcript_text, notes_text, tokenize = 'porter unicode61' ); CREATE INDEX idx_meetings_started ON meetings(started_at DESC); CREATE INDEX idx_speakers_meeting ON speakers(meeting_id); CREATE INDEX idx_action_meeting ON action_items(meeting_id);