# 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}")