Add /admin/uploads HTML page and JSON API backed by the upload_files
DB index. The page lists file_id, name, size (KB), uploaded_at, and
sha256 with client-side search by name, column sort, and per-row delete.
DELETE /admin/uploads/:id removes the DB index row and the on-disk
data file plus .meta.json sidecar. Admin deletes are written to the
audit log.
Wire the new dependencies through admin.Mount and main.go, and run
the backfill step on startup so pre-existing sidecars are indexed.
Tests cover auth, HTML rendering, JSON search, delete removing all
artifacts, and audit entry creation.
Co-Authored-By: Claude <noreply@anthropic.com>
Add the upload_files SQLite table and UploadRepo CRUD methods
(Create/Get/List/Delete). The table stores file_id, name, size,
sha256, and uploaded_at as a queryable index.
The .meta.json sidecar remains the source of truth for uploads;
the DB is only an index for admin visibility. On startup the next
commit will backfill any pre-existing sidecars into this table.
Tests cover Create/Get/List/Delete round-trip, name search
filtering, descending time ordering, and limit defaults/cap.
Co-Authored-By: Claude <noreply@anthropic.com>