-- Track async insight generation jobs so the client can poll for -- completion after the server returns 202 Accepted. The UNIQUE -- constraint on (library_id, file_path, generation_type) ensures -- idempotent inserts: if a running job already exists, the caller -- should return that job_id instead of creating a duplicate. CREATE TABLE insight_generation_jobs ( id INTEGER PRIMARY KEY AUTOINCREMENT, library_id INTEGER NOT NULL DEFAULT 1, file_path TEXT NOT NULL, generation_type TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'running', started_at INTEGER NOT NULL, completed_at INTEGER, result_insight_id INTEGER, error_message TEXT, UNIQUE(library_id, file_path, generation_type) ); -- For the status endpoint: fast lookup by (library_id, file_path) CREATE INDEX idx_insight_gen_jobs_file ON insight_generation_jobs(library_id, file_path); -- For startup cleanup (future): prune old completed/failed jobs CREATE INDEX idx_insight_gen_jobs_status_cleanup ON insight_generation_jobs(status, started_at);