Newer
Older
cortex-hub / ai-hub / app / core / skills / bootstrap.py
# app/core/skills/bootstrap.py
import logging
from sqlalchemy.orm import Session
from app.db import models
from .definitions import SYSTEM_SKILLS

logger = logging.getLogger(__name__)

def bootstrap_system_skills(db: Session):
    """
    Ensure all hardcoded system skills from definitions.py exist in the database.
    This runs on application startup (lifespan).
    """
    logger.info("Checking for system skills bootstrapping...")
    
    # We need a system owner ID. For now, we'll try to find an admin user or use a 'system' id.
    # In this DB, the root admin usually has a known ID or we can find it.
    admin = db.query(models.User).filter(models.User.role == 'admin').first()
    if not admin:
        logger.warning("No admin user found to own system skills. Skipping bootstrap.")
        return

    for skill_def in SYSTEM_SKILLS:
        existing = db.query(models.Skill).filter(models.Skill.name == skill_def["name"]).first()
        
        if existing:
            # We update it to ensure it matches the hardcoded version (RESTORE FACTORY)
            # but preserve the skill's identity.
            logger.info(f"Syncing system skill: {skill_def['name']}")
            existing.description = skill_def.get("description")
            existing.skill_type = skill_def.get("skill_type")
            existing.config = skill_def.get("config")
            existing.system_prompt = skill_def.get("system_prompt")
            existing.is_enabled = skill_def.get("is_enabled", True)
            existing.features = skill_def.get("features", ["chat"])
            existing.is_system = True
            existing.owner_id = admin.id
        else:
            logger.info(f"Creating new system skill: {skill_def['name']}")
            new_skill = models.Skill(
                name=skill_def["name"],
                description=skill_def.get("description"),
                skill_type=skill_def.get("skill_type"),
                config=skill_def["config"],
                system_prompt=skill_def.get("system_prompt"),
                is_enabled=skill_def.get("is_enabled", True),
                features=skill_def.get("features", ["chat"]),
                is_system=True,
                owner_id=admin.id
            )
            db.add(new_skill)
    
    try:
        db.commit()
        logger.info("System skills bootstrap completed.")
    except Exception as e:
        db.rollback()
        logger.error(f"Failed to bootstrap system skills: {e}")