""" Read/write the Inara identity markdown files. Only whitelisted filenames are accessible — no path traversal possible. """ from fastapi import APIRouter, HTTPException from pydantic import BaseModel from config import settings router = APIRouter() ALLOWED = { "SOUL.md", "IDENTITY.md", "USER.md", "MEMORY.md", "PROTOCOLS.md", "CONTEXT_TIERS.md", } def _path(filename: str): if filename not in ALLOWED: raise HTTPException(status_code=404, detail=f"File not found: {filename}") return settings.inara_path() / filename @router.get("/files") async def list_files() -> dict: inara_dir = settings.inara_path() files = [] for name in sorted(ALLOWED): p = inara_dir / name files.append({ "name": name, "exists": p.exists(), "size": p.stat().st_size if p.exists() else 0, }) return {"files": files} @router.get("/files/{filename}") async def get_file(filename: str) -> dict: p = _path(filename) if not p.exists(): raise HTTPException(status_code=404, detail=f"{filename} does not exist") return {"name": filename, "content": p.read_text()} class FileWrite(BaseModel): content: str @router.put("/files/{filename}") async def save_file(filename: str, req: FileWrite) -> dict: p = _path(filename) p.write_text(req.content) return {"ok": True, "name": filename, "size": len(req.content)}