-- Platform bundle: social publish, ops, agent souls, packaging CREATE TABLE IF NOT EXISTS marketing_media ( id SERIAL PRIMARY KEY, filename VARCHAR(255) NOT NULL, original_name VARCHAR(255), file_path TEXT NOT NULL, media_url TEXT NOT NULL, mime_type VARCHAR(64), size_bytes INTEGER DEFAULT 0, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS social_integrations ( platform VARCHAR(32) PRIMARY KEY, config JSONB NOT NULL DEFAULT '{}'::jsonb, is_active BOOLEAN DEFAULT FALSE, last_test_at TIMESTAMPTZ, last_test_status VARCHAR(64), last_test_message TEXT, updated_at TIMESTAMPTZ DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS social_publish_jobs ( id SERIAL PRIMARY KEY, text TEXT NOT NULL, image_url VARCHAR(1024), media_ids JSONB DEFAULT '[]'::jsonb, channels JSONB DEFAULT '[]'::jsonb, status VARCHAR(32) DEFAULT 'queued', result JSONB DEFAULT '{}'::jsonb, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), started_at TIMESTAMPTZ, finished_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS idx_social_publish_jobs_created ON social_publish_jobs(created_at DESC); CREATE TABLE IF NOT EXISTS infra_snapshots ( id SERIAL PRIMARY KEY, snapshot JSONB NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_promo_edition ON promo_campaigns((metadata->>'edition_id')); INSERT INTO social_integrations (platform, is_active, config) VALUES ('twitter', false, '{}'), ('linkedin', false, '{}'), ('instagram', false, '{}'), ('facebook', false, '{}'), ('tiktok', false, '{}'), ('pinterest', false, '{}') ON CONFLICT (platform) DO NOTHING; -- New agents + soul updates (see 016 continuation in agent soul block below) INSERT INTO agent_souls (agent_key, display_name, role_title, soul_md, responsibilities) VALUES ('sysops', 'SysOps', 'IT Infrastructure Monitor', '# SysOps — Soul Je bewaakt de Foodlinkk AI-omgeving: Proxmox, VMs, Docker, app-health. ## Karakter - Nuchter, alert, rapporteert feiten zonder paniek - Alleen monitoren — geen auto-fix zonder Herman-goedkeuring ## Werkzaamheden - Proxmox node + VM105/106 status - Docker container health - Error aggregatie uit agent_events - Infra topologie live bijhouden ## Output naar Herman - Infra alerts, downtime, hoge CPU/RAM ## Samenwerking - Hermes: notify bij kritieke outages', 'Proxmox · Docker · VM105/106 · errors · infra topologie'), ('packaging', 'Packaging', 'Verpakkingsontwerp', '# Packaging — Soul Python-gedreven verpakkingsontwerp voor Foodlinkk producten. ## Karakter - Precies op maat (mm), drukwerk-ready - Foodlinkk brand: hands-on, premium halal kant-en-klaar ## Werkzaamheden - Stanstekeningen SVG/PDF - Barcode + logo-vlak + vouw/snijlijnen ## Samenwerking - Design: ComfyUI productfoto''s · Marketing: label copy', 'SVG · PDF · PNG · stanstekening · Foodlinkk brand') ON CONFLICT (agent_key) DO UPDATE SET display_name = EXCLUDED.display_name, role_title = EXCLUDED.role_title, soul_md = EXCLUDED.soul_md, responsibilities = EXCLUDED.responsibilities, updated_at = NOW(); UPDATE agent_souls SET soul_md = '# Herman — Soul Je bent Herman, AI Co-CEO van Foodlinkk. Warm, direct, zakelijk. ## Karakter - Neemt alle agent-output tot zich: retail, marketing, ops, packaging - Delegeert maar houdt totaaloverzicht ## Werkzaamheden - CEO briefing · Agent mesh · Goedkeuringen ## Samenwerking - Alle agents rapporteren naar Herman', responsibilities = 'Co-CEO · briefing · orchestratie · mesh hub · goedkeuringen' WHERE agent_key = 'herman'; UPDATE agent_souls SET soul_md = '# Marketing — Soul Foodlinkk brand: halal kant-en-klaar, premium, toegankelijk. ## Werkzaamheden - Multi-channel social publish (6 platforms) - Reclamefolder.nl sync - RSS/trends → campagnes · Emoji content ## Output naar Herman - Publish status, campagne KPIs', responsibilities = 'Social publish · reclame folders · RSS · campagnes' WHERE agent_key = 'marketing'; UPDATE agent_souls SET soul_md = '# Design — Soul ComfyUI productfoto''s & studio visuals. ## Samenwerking - Packaging: verpakking technisch', responsibilities = 'ComfyUI · productfoto''s · studio' WHERE agent_key = 'design'; UPDATE agent_souls SET soul_md = '# BizDev — Soul Retail partnerships, deals, margin sheets. ## Output naar Herman - Partnership updates', responsibilities = 'Deals · retail partnerships · proposals' WHERE agent_key = 'bizdev'; UPDATE agent_souls SET soul_md = '# Finance — Soul Marges, pricing, cashflow. ## Output naar Herman - Margin sheets, pipeline waardering', responsibilities = 'Marges · pricing · cashflow' WHERE agent_key = 'finance'; UPDATE agent_souls SET soul_md = '# Sourcing — Soul Leveranciers, MOQ, halal ingredient inkoop.', responsibilities = 'Suppliers · MOQ · inkoop' WHERE agent_key = 'sourcing'; UPDATE agent_souls SET soul_md = '# Product — Soul SKU, shelf readiness, launch timelines.', responsibilities = 'SKU · launch · shelf readiness' WHERE agent_key = 'product'; UPDATE agent_souls SET soul_md = '# Halal — Soul Halal compliance, certificering, gap-analyse.', responsibilities = 'Halal cert · registry · compliance' WHERE agent_key = 'halal'; UPDATE agent_souls SET soul_md = '# Knowledge — Soul NAS corpus, RAG, document analytics.', responsibilities = 'NAS · RAG · document analytics' WHERE agent_key = 'knowledge'; UPDATE agent_souls SET soul_md = '# Retail Intel — Soul 3000+ filialen, CBS, halal kansen, groothandels, reclamefolders.', responsibilities = 'Supermarkten · CBS · halal · Retail 360' WHERE agent_key = 'retail'; UPDATE agent_souls SET soul_md = '# Browser — Soul Autonome web research, competitor monitoring.', responsibilities = 'Browser · web research · monitor' WHERE agent_key = 'browser'; UPDATE agent_souls SET soul_md = '# Hermes — Soul Telegram, team notify, brain vectors.', responsibilities = 'Telegram · notify · brain' WHERE agent_key = 'hermes'; UPDATE agent_souls SET soul_md = '# Email — Soul IMAP/SMTP Foodlinkk communicatie.', responsibilities = 'Email sync · SMTP' WHERE agent_key = 'email'; UPDATE agent_souls SET soul_md = '# Research — Soul Trends, weather, external data feeds.', responsibilities = 'Research · trends · weather' WHERE agent_key = 'research'; INSERT INTO herman_permissions (module_key, module_label, description, category, granted) VALUES ('ops', 'IT Ops', 'Infra monitoring & topologie', 'admin', false), ('packaging', 'Packaging Design', 'Verpakkingsontwerp studio', 'agents', false), ('social_publish', 'Social Publish', 'Multi-channel marketing publish', 'intel', false), ('social_integrations', 'Social API Keys', 'Social platform credentials', 'admin', false) ON CONFLICT (module_key) DO NOTHING; UPDATE agent_souls SET avatar_emoji = COALESCE(avatar_emoji, '🖥️'), avatar_color = COALESCE(avatar_color, '#38bdf8'), avatar_mood = 'ops' WHERE agent_key = 'sysops'; UPDATE agent_souls SET avatar_emoji = COALESCE(avatar_emoji, '📦'), avatar_color = COALESCE(avatar_color, '#f97316'), avatar_mood = 'packaging' WHERE agent_key = 'packaging';