"""Skill Discovery routes — view and manage auto-discovered skills.""" import logging from fastapi import APIRouter, Form, HTTPException, Request from fastapi.responses import HTMLResponse from dashboard.templating import templates logger = logging.getLogger(__name__) router = APIRouter(prefix="/skills", tags=["skills"]) @router.get("", response_class=HTMLResponse) async def skills_page(request: Request): """Main skill discovery page.""" from timmy.skill_discovery import get_skill_discovery_engine engine = get_skill_discovery_engine() skills = engine.list_skills(limit=50) counts = engine.skill_count() return templates.TemplateResponse( request, "skills.html", {"skills": skills, "counts": counts}, ) @router.get("/list", response_class=HTMLResponse) async def skills_list_partial(request: Request, status: str = ""): """HTMX partial: return skill list for polling.""" from timmy.skill_discovery import get_skill_discovery_engine engine = get_skill_discovery_engine() skills = engine.list_skills(status=status or None, limit=50) counts = engine.skill_count() return templates.TemplateResponse( request, "partials/skills_list.html", {"skills": skills, "counts": counts}, ) @router.post("/{skill_id}/status", response_class=HTMLResponse) async def update_skill_status(request: Request, skill_id: str, status: str = Form(...)): """Update a skill's status (confirm / reject / archive).""" from timmy.skill_discovery import get_skill_discovery_engine engine = get_skill_discovery_engine() if not engine.update_status(skill_id, status): raise HTTPException(status_code=400, detail=f"Invalid status: {status}") skills = engine.list_skills(limit=50) counts = engine.skill_count() return templates.TemplateResponse( request, "partials/skills_list.html", {"skills": skills, "counts": counts}, ) @router.post("/scan", response_class=HTMLResponse) async def trigger_scan(request: Request): """Manually trigger a skill discovery scan.""" from timmy.skill_discovery import get_skill_discovery_engine engine = get_skill_discovery_engine() try: discovered = await engine.scan() msg = f"Scan complete: {len(discovered)} new skill(s) found." except Exception as exc: logger.warning("Manual skill scan failed: %s", exc) msg = f"Scan failed: {exc}" skills = engine.list_skills(limit=50) counts = engine.skill_count() return templates.TemplateResponse( request, "partials/skills_list.html", {"skills": skills, "counts": counts, "scan_message": msg}, )