Feat/r2 transaction receipts
Summary
Store newly uploaded transaction receipts in private Cloudflare R2 storage while preserving compatibility with existing locally stored receipts.
Changes
- Upload new receipt files to ownership-scoped R2 keys under
receipts/<userId>/. - Retrieve protected receipts from R2 after transaction ownership validation.
- Return receipt content with the correct MIME type, extension, length, and private cache headers.
- Delete R2 receipt objects using best-effort cleanup.
- Preserve read and delete compatibility for legacy files stored under
RECEIPT_UPLOAD_DIR. - Return a clear service error when R2 storage is not configured.
- Improve AI structured-response typing by inferring output types directly from Zod schemas.
- Update API, R2 storage, environment, and project-memory documentation.