from pathlib import Path p=Path('/opt/struktur/social-media-agent/publish_ready.py'); s=p.read_text() # Add carousel schema before media_briefs creation. needle=''' CREATE TABLE IF NOT EXISTS media_briefs (''' carousel_sql=''' CREATE TABLE IF NOT EXISTS carousels ( carousel_id TEXT PRIMARY KEY, package_id TEXT NOT NULL REFERENCES publication_packages(package_id), media_brief_id TEXT NOT NULL, slide_count INTEGER NOT NULL, media_type TEXT NOT NULL DEFAULT 'carousel', media_type_reason TEXT NOT NULL, human_rating TEXT NOT NULL DEFAULT '', human_reason_verbatim TEXT NOT NULL DEFAULT '', human_reason_structured_json TEXT NOT NULL DEFAULT '{}', human_feedback_at TEXT NOT NULL DEFAULT '', human_feedback_by TEXT NOT NULL DEFAULT '', final_for_package INTEGER NOT NULL DEFAULT 0, selected_by_human INTEGER NOT NULL DEFAULT 0, selected_at TEXT NOT NULL DEFAULT '', selected_by TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_carousels_package ON carousels(package_id, created_at); CREATE TABLE IF NOT EXISTS carousel_slides ( slide_id TEXT PRIMARY KEY, carousel_id TEXT NOT NULL REFERENCES carousels(carousel_id), package_id TEXT NOT NULL, slide_number INTEGER NOT NULL, slide_count INTEGER NOT NULL, purpose TEXT NOT NULL, statement TEXT NOT NULL, image_path TEXT NOT NULL DEFAULT '', origin_path TEXT NOT NULL DEFAULT '', sha256 TEXT NOT NULL DEFAULT '', file_bytes INTEGER NOT NULL DEFAULT 0, generator TEXT NOT NULL DEFAULT 'Codex built-in image_gen', prompt TEXT NOT NULL DEFAULT '', media_brief_id TEXT NOT NULL, qa_status TEXT NOT NULL DEFAULT 'not_checked', qa_report_json TEXT NOT NULL DEFAULT '{}', qa_failure_reasons TEXT NOT NULL DEFAULT '', human_rating TEXT NOT NULL DEFAULT '', human_reason_verbatim TEXT NOT NULL DEFAULT '', human_reason_structured_json TEXT NOT NULL DEFAULT '{}', human_feedback_at TEXT NOT NULL DEFAULT '', human_feedback_by TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL, UNIQUE(carousel_id, slide_number) ); CREATE INDEX IF NOT EXISTS idx_carousel_slides_carousel ON carousel_slides(carousel_id, slide_number); CREATE TABLE IF NOT EXISTS media_briefs (''' assert s.count(needle)==1; s=s.replace(needle,carousel_sql) # Add package media type fields to ensure-column dict. old=''' "qa_status": "TEXT NOT NULL DEFAULT 'not_checked'", "qa_report_json": "TEXT NOT NULL DEFAULT '{}'", "qa_failure_reasons": "TEXT NOT NULL DEFAULT ''", "qa_checked_at": "TEXT NOT NULL DEFAULT ''", "human_visual_approval": "TEXT NOT NULL DEFAULT ''",''' new=''' "qa_status": "TEXT NOT NULL DEFAULT 'not_checked'", "qa_report_json": "TEXT NOT NULL DEFAULT '{}'", "qa_failure_reasons": "TEXT NOT NULL DEFAULT ''", "qa_checked_at": "TEXT NOT NULL DEFAULT ''", "human_visual_approval": "TEXT NOT NULL DEFAULT ''", "media_type": "TEXT NOT NULL DEFAULT 'single_image'", "media_type_reason": "TEXT NOT NULL DEFAULT ''",''' assert s.count(old)==1; s=s.replace(old,new) p.write_text(s); print('carousel schema added')