"""Eigenleben-Endpoints — „Von allein“-Ansicht (Skills + Vorschlags-Bilanz), read-only.""" from fastapi import APIRouter, HTTPException from pydantic import BaseModel from services import eigenleben router = APIRouter(prefix="/api") class SkillItem(BaseModel): id: str name: str kategorie: str | None aktiv: bool | None beschreibung: str version: str autor: str herkunft: str herkunft_label: str genutzt: int zuletzt_genutzt: str | None erstellt: str | None status: str geaendert: float class EigenlebenOverviewResponse(BaseModel): available: bool skills: list[SkillItem] selbst_erstellt: int bilanz: dict class SkillTextResponse(BaseModel): id: str text: str @router.get("/eigenleben", response_model=EigenlebenOverviewResponse) def get_overview() -> dict: return eigenleben.overview() # :path — Kategorie-Skills haben einen Schrägstrich in der ID (autonomous-ai-agents/ # hermes-agent). Als normales {skill_id}-Segment matcht die Route dann nicht, der Request # fällt in den SPA-Fallback (index.html, Status 200) und die UI zeigt „Konnte den # Skill-Text nicht laden". Die Pfad-Validierung (max. eine Ebene, keine . /..) macht # services.eigenleben.skill_text. @router.get("/eigenleben/skill/{skill_id:path}", response_model=SkillTextResponse) def get_skill(skill_id: str) -> dict: text = eigenleben.skill_text(skill_id) if text is None: raise HTTPException(404, "Skill nicht gefunden.") return {"id": skill_id, "text": text}