Release v0.3.0: paginate stash + sha1-keyed soft-delete

Summary

Two fixes from one bug report (Daanvr's "stash files missing" report → T425756):

  1. fetchStashedFiles now paginates. The previous code made a single mystashedfiles API call with no msflimit — MediaWiki's hard default cap (10) silently truncated the list before the UI ever saw it. Anyone with >10 stash files lost everything past the first page. Now uses msflimit=500 and follows the msfcontinue token until exhausted, with a 5000-item safety cap.

  2. Soft-delete state is keyed by sha1 instead of filekey. Filekey is per-stash-entry and not stable across stash regenerations / re-uploads, so a hide could vanish on reload. The canonical store is hiddenSha1s; legacy hiddenFilekeys entries are migrated on bootstrap by joining with the current stash's filekey → sha1 map. hiddenSha1s is content-permanent (a re-upload of the same bytes inherits any prior soft-delete).

cleanupAfterPublish also clears both sha1 and filekey hide entries on publish.

Phabricator: T425756

Test plan

  • npm run build clean.
  • API probe: mystashedfiles?msflimit=max → 25 entries (Daanvr's account); default no-limit call → 10 entries with continue token. Confirms the bug.
  • Headless chromium load → 25 stash rows in the rendered DOM (was 8 before fix). All filekeys match the live API response.
  • Visual + interactive test by maintainer (force-reload, soft-delete persistence across reload).

Versioning

  • 0.1.00.3.0 (MINOR; combined feature fix, no breaking external API).
  • package.json and src/config.js APP_USER_AGENT bumped together.
  • CHANGELOG.md [Unreleased] promoted to [0.3.0] — 2026-05-08.

Merge order

This branch was cut off main before MR !1 (merged) (Beta indicator). Recommend merging !1 (merged) first so version progression is 0.1.0 → 0.2.0 → 0.3.0 chronologically. If !1 (merged) lands first, the only conflict in this MR will be the CHANGELOG.md [Unreleased] block + the [0.2.0] entry — straightforward to resolve (keep both entries).

Out of scope (deliberately)

  • Stash item id redesign (still derived from filekey). The fix repairs cross-session persistence; in-session matching already worked.
  • filenames cache is still filekey-keyed (separate follow-up if it matters; not the cause of the reported bug).

Merge request reports

Loading