"""Trash MCP tools — unified, batch-based recovery surface. Deletes go through the per-type delete_* tools (which soft-delete via the trash service). These tools list / restore / permanently-purge trashed content by the deleted_batch_id that a delete operation returns. """ from __future__ import annotations from scribe.mcp._context import current_user_id from scribe.services import trash as trash_svc async def list_trash() -> dict: """List trashed items, grouped by the deletion batch they were removed in. Each batch has: batch_id, deleted_at, a summary (the lead item's title), count, and the member items (type + id + title). Restore a batch with restore(deleted_batch_id). """ return {"batches": await trash_svc.list_trash(current_user_id())} async def restore(deleted_batch_id: str) -> dict: """Restore a whole deletion batch from the trash (un-delete).""" n = await trash_svc.restore(current_user_id(), deleted_batch_id) return {"restored": n, "batch_id": deleted_batch_id} async def purge_trash(deleted_batch_id: str, confirmed: bool = False) -> dict: """Permanently delete a trashed batch. IRREVERSIBLE — pass confirmed=True. This is the only true hard-delete tool; everything else is recoverable. """ if not confirmed: return { "warning": ( f"Permanently delete batch {deleted_batch_id}? This cannot be " f"undone. Pass confirmed=True to proceed." ), "confirmed_required": True, } n = await trash_svc.purge(current_user_id(), deleted_batch_id) return {"purged": n, "batch_id": deleted_batch_id} def register(mcp) -> None: for fn in (list_trash, restore, purge_trash): mcp.tool(name=fn.__name__)(fn)