feat(realism): synthetic-files browser API

Adds GET /api/v1/realism/synthetic-files (paginated list, filters by
decky_uuid, persona, content_class) and
GET /api/v1/realism/synthetic-files/{uuid} (single row with last_body
and a truncated:bool flag set when the stored body is at the 64KB cap).

Repo gains count_synthetic_files() and get_synthetic_file(uuid). The
list view drops last_body to keep the wire payload bounded; the detail
endpoint is the only path that returns it. Read-only — orchestrator
remains the sole writer.
This commit is contained in:
2026-04-27 17:44:53 -04:00
parent 2eeec15f9c
commit 87cb61c8b2
6 changed files with 337 additions and 2 deletions

View File

@@ -1130,16 +1130,35 @@ class BaseRepository(ABC):
*,
decky_uuid: Optional[str] = None,
persona: Optional[str] = None,
content_class: Optional[str] = None,
limit: int = 100,
offset: int = 0,
) -> list[dict[str, Any]]:
"""Paginated synthetic_files newest-first.
Optional filters narrow to one decky and/or one persona, used by
the dashboard's "files this decky has grown" view.
Optional filters narrow to one decky, persona, and/or content
class — used by the dashboard's "files this decky has grown"
view.
"""
raise NotImplementedError
async def count_synthetic_files(
self,
*,
decky_uuid: Optional[str] = None,
persona: Optional[str] = None,
content_class: Optional[str] = None,
) -> int:
"""Total synthetic_files matching the same filters as
:meth:`list_synthetic_files`. Used to drive paginated UI."""
raise NotImplementedError
async def get_synthetic_file(
self, uuid: str,
) -> Optional[dict[str, Any]]:
"""Single synthetic_files row by uuid, or ``None``."""
raise NotImplementedError
async def pick_random_synthetic_file_for_edit(
self,
decky_uuid: str,