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>