#!/usr/bin/env python3 import json import os from pathlib import Path import re import sys from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # Add backend to path for imports sys.path.append(str(Path(__file__).parent.parent)) from core.database import DATABASE_URL from core.models import Base, IntegrationCatalog def seed_integrations(): print(f"Connecting to database: {DATABASE_URL}") engine = create_engine(DATABASE_URL) Session = sessionmaker(bind=engine) session = Session() # Ensure table exists Base.metadata.create_all(engine) # Use a hardcoded list of integrations derived from the TypeScript file # This avoids parsing errors and dependency on the frontend file being in a specific state def make_obj(name): return {"id": name, "name": name.replace("_", " ").title()} integrations_data = [ # CORE PIECES { "id": "atom-memory", "name": "Atom Memory", "description": "Store and retrieve data from Atom's intelligent memory system", "category": "core", "color": "#6366F1", "authType": "none", "triggers": [make_obj(x) for x in ["memory_updated", "pattern_detected", "insight_generated"]], "actions": [make_obj(x) for x in ["store_memory", "retrieve_memory", "search_memories", "create_embedding", "find_similar", "update_context", "ingest_document", "ingest_conversation", "create_knowledge_graph", "query_graph", "extract_entities", "summarize_memories"]], "popular": True }, { "id": "loop", "name": "Loop", "description": "Iterate over arrays", "category": "core", "color": "#14B8A6", "authType": "none", "triggers": [], "actions": [make_obj(x) for x in ["for_each", "repeat", "loop_until"]] }, { "id": "code", "name": "Code", "description": "Run custom code", "category": "core", "color": "#334155", "authType": "none", "triggers": [], "actions": [make_obj(x) for x in ["run_typescript", "run_javascript", "run_python"]] }, { "id": "condition", "name": "Condition", "description": "Branch based on conditions", "category": "core", "color": "#F59E0B", "authType": "none", "triggers": [], "actions": [make_obj(x) for x in ["if_else", "switch", "filter"]] }, { "id": "delay", "name": "Delay", "description": "Wait for time", "category": "core", "color": "#6366F1", "authType": "none", "triggers": [make_obj(x) for x in ["schedule", "cron"]], "actions": [make_obj(x) for x in ["wait", "wait_until"]] }, { "id": "http", "name": "HTTP", "description": "Make HTTP requests", "category": "core", "color": "#EA580C", "authType": "none", "triggers": [make_obj(x) for x in ["webhook"]], "actions": [make_obj(x) for x in ["get", "post", "put", "delete", "patch"]] }, # AI & ML PIECES { "id": "openai", "name": "OpenAI", "description": "GPT-4, DALL-E, Whisper", "category": "ai", "color": "#412991", "authType": "api_key", "triggers": [], "actions": [make_obj(x) for x in ["chat", "complete", "embed", "generate_image", "transcribe", "translate"]], "popular": True }, { "id": "anthropic", "name": "Anthropic Claude", "description": "Claude AI models", "category": "ai", "color": "#CC785C", "authType": "api_key", "triggers": [], "actions": [make_obj(x) for x in ["chat", "complete", "analyze"]], "popular": True }, # COMMUNICATION PIECES { "id": "slack", "name": "Slack", "description": "Team messaging", "category": "communication", "color": "#4A154B", "authType": "oauth2", "triggers": [make_obj(x) for x in ["message", "reaction", "mention", "channel_created"]], "actions": [make_obj(x) for x in ["send_message", "create_channel", "add_reaction", "upload_file", "update_status"]], "popular": True }, { "id": "discord", "name": "Discord", "description": "Community platform", "category": "communication", "color": "#5865F2", "authType": "oauth2", "triggers": [make_obj(x) for x in ["message", "member_join"]], "actions": [make_obj(x) for x in ["send_message", "create_channel", "add_role"]], "popular": True }, { "id": "gmail", "name": "Gmail", "description": "Email service", "category": "communication", "color": "#EA4335", "authType": "oauth2", "triggers": [make_obj(x) for x in ["new_email", "labeled"]], "actions": [make_obj(x) for x in ["send_email", "create_draft", "add_label"]], "popular": True }, # CRM & SALES PIECES { "id": "salesforce", "name": "Salesforce", "description": "Enterprise CRM", "category": "crm", "color": "#00A1E0", "authType": "oauth2", "triggers": [make_obj(x) for x in ["new_lead", "deal_updated", "opportunity_won"]], "actions": [make_obj(x) for x in ["create_lead", "update_contact", "create_opportunity"]], "popular": True }, { "id": "hubspot", "name": "HubSpot", "description": "Marketing & sales CRM", "category": "crm", "color": "#FF7A59", "authType": "oauth2", "triggers": [make_obj(x) for x in ["new_contact", "deal_stage_changed", "form_submitted"]], "actions": [make_obj(x) for x in ["create_contact", "update_deal", "add_to_list"]], "popular": True }, # PRODUCTIVITY PIECES { "id": "notion", "name": "Notion", "description": "All-in-one workspace", "category": "productivity", "color": "#000000", "authType": "oauth2", "triggers": [make_obj(x) for x in ["page_created", "database_updated"]], "actions": [make_obj(x) for x in ["create_page", "update_database", "add_block"]], "popular": True }, { "id": "google-calendar", "name": "Google Calendar", "description": "Calendar", "category": "productivity", "color": "#4285F4", "authType": "oauth2", "triggers": [make_obj(x) for x in ["event_created", "event_starting"]], "actions": [make_obj(x) for x in ["create_event", "update_event"]], "popular": True }, # DEVELOPER PIECES { "id": "github", "name": "GitHub", "description": "Code hosting", "category": "developer", "color": "#181717", "authType": "oauth2", "triggers": [make_obj(x) for x in ["push", "pull_request", "issue_created", "star"]], "actions": [make_obj(x) for x in ["create_issue", "create_pr", "add_comment", "add_label"]], "popular": True }, # STORAGE PIECES { "id": "google-drive", "name": "Google Drive", "description": "Cloud storage", "category": "storage", "color": "#4285F4", "authType": "oauth2", "triggers": [make_obj(x) for x in ["file_created", "file_updated"]], "actions": [make_obj(x) for x in ["upload_file", "create_folder", "share_file"]], "popular": True }, { "id": "dropbox", "name": "Dropbox", "description": "Cloud storage", "category": "storage", "color": "#0061FF", "authType": "oauth2", "triggers": [make_obj(x) for x in ["file_added", "file_modified"]], "actions": [make_obj(x) for x in ["upload_file", "create_folder", "share_link"]], "popular": True }, # ECOMMERCE PIECES { "id": "stripe", "name": "Stripe", "description": "Payment processing", "category": "ecommerce", "color": "#635BFF", "authType": "api_key", "triggers": [make_obj(x) for x in ["payment_succeeded", "subscription_created", "invoice_paid"]], "actions": [make_obj(x) for x in ["create_customer", "create_charge", "create_subscription"]], "popular": True }, # FINANCE PIECES { "id": "quickbooks", "name": "QuickBooks", "description": "Accounting", "category": "finance", "color": "#2CA01C", "authType": "oauth2", "triggers": [make_obj(x) for x in ["invoice_created", "payment_received"]], "actions": [make_obj(x) for x in ["create_invoice", "create_customer"]], "popular": True }, { "id": "xero", "name": "Xero", "description": "Accounting", "category": "finance", "color": "#13B5EA", "authType": "oauth2", "triggers": [make_obj(x) for x in ["invoice_created"]], "actions": [make_obj(x) for x in ["create_invoice", "create_contact"]], "popular": True }, ] count = 0 for p in integrations_data: # Check if already exists existing = session.query(IntegrationCatalog).filter_by(id=p['id']).first() if existing: # Update existing.name = p['name'] existing.description = p.get('description', '') existing.category = p['category'] existing.icon = p.get('icon', '') existing.color = p.get('color', '#6366F1') existing.auth_type = p.get('authType', 'none') existing.triggers = p.get('triggers', []) existing.actions = p.get('actions', []) existing.popular = p.get('popular', False) else: # Insert new_piece = IntegrationCatalog( id=p['id'], name=p['name'], description=p.get('description', ''), category=p['category'], icon=p.get('icon', ''), color=p.get('color', '#6366F1'), auth_type=p.get('authType', 'none'), triggers=p.get('triggers', []), actions=p.get('actions', []), popular=p.get('popular', False) ) session.add(new_piece) count += 1 session.commit() print(f"Successfully seeded {count} integrations into the database.") session.close() if __name__ == "__main__": seed_integrations()