* Expand patch download diagnostics
Separate request and body failures, capture response sizes, and sample successful fetches so protocol and truncation patterns can be compared.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Move the details migration after hack review threads.
CI rejects new migration filenames that sort before the tip on main.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add a Discord review thread and Resend reply loop for submitted hacks.
Admins can email submitters from a forum thread and inbound replies land back in that same thread.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add an admin endpoint to register Discord guild commands.
Local still uses the npm script; production can hit /api/discord/register while logged in as an admin.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add an admin backup to create a missing Discord review thread.
If submit fails to open a thread, an admin can create one from the hack details menu.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Match inbound review replies when the plus-address token is lowercased.
Mail delivers To in lowercase, so tokens are now hex and lookups are case-insensitive.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Use distinct review embeds for /reply and inbound creator mail.
/reply posts a green embed with subject, Discord avatar, and the creator username; thread replies drop the To field.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Gate /reply by Discord role and mark inbound From as verified.
DISCORD_REPLY_ROLE_IDS is required; creator mail still posts when the address does not match the account.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Retry inbound review mail when Discord does not post the embed.
A failed thread post no longer records the email as processed or returns 200 to Resend.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Notify the admin webhook when a review thread cannot be loaded.
Patch upload no longer stays silent if getHackReviewThread throws.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Keep the /reply ack honest after the review email is sent.
A later Discord or deferred-response failure no longer claims the email failed.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Make the admin review message stand out in the reply email.
The quote sits in a rose-tinted box so it is not just another paragraph.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Tag review threads as claimed or unclaimed and announce claims.
New and backup-created threads get the matching forum tag; dashboard claims swap Unclaimed to Claimed.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
* Add xdelta patch support
* Fix potential race on reupload to new format + update typings
* Fix waiting too long to call showSaveFilePicker
* Allow seeing patch format in version history
* Add `hack_patcher_patches` table
* Implement patcher version server actions
* Use first curated patch as default when custom patcher list is active
* Allow saving custom patcher lists with unpublished patch auto-publish
* Keep custom patcher list consistent across archive and new uploads
* Add creator UI for Latest vs Custom patcher version settings
* Add patch version picker to hack page downloader
* Add custom public version names for Custom patcher mode
* Fix direct patch download consistency between Latest vs Custom modes
* Consolidate download and patch to one button press
* Fix rom ready for patching checks
* Fix Select ROM pop-in while base roms loading
* Tighten patcher patches db insertion
* Harden getSignedPatchUrl permission checks
* Fix not using selected patch's filename
* Acknowledge Custom patcher setting in HackPatchForm
* Update types/db.ts
* Refresh discover cache on patch published
* Add migration ordering check to ci.yaml
* Fix new migrations ordering