Maintainer ruling (a): Windows never uses the Recycle Bin, because it deletes
files larger than the bin's capacity permanently and IFileOperation's
PreDeleteItem guard cannot detect it (native probe runs 40951037575,
40953347904). Each file in the Delete review now reads "Moving files to the
Recycle Bin isn't available on Windows: files larger than the bin's capacity
would be deleted permanently." (code windows-recycle) instead of "This drive has
no trash.", and the summary line drops its "yet": "Moving to the trash is not
available for these files; each one lists why."
* fix(images): background jobs skip files hidden by the removal mark; walkers skip trash folders inside output roots (#501)
- Thumbnail jobs and the legacy scan_output_dir listing leave
library-removed files out (one mark check, mark_hides).
- Missing-file links also forgets removal marks that hide nothing any
more (file gone from a folder that exists, or changed), only under a
readable, non-empty source, re-checked at apply.
- The sidebar Images, Favorites and Needs review counts and the
collection counts are read again when an image_delete job ends.
- utils/media_folders.py: one skip for thumbnails and trash folders
(.Trash, .Trash-<uid>, .Trashes, $RECYCLE.BIN) used by every walker,
the image monitor and the delete review.
* test(browser): wait for the answers two specs raced in the merge queue (#501)
- System diagnostics "level filter": wait for each level's own log
answer, and poll the shown levels; the CRITICAL line is in the
previous level's answer too, so it proved nothing (firefox).
- Library editor "restored storage after a confirmed save": wait for
the PATCH answer, which waits for a whole restore in the test's
route, instead of the 5 s expect default (webkit).
* feat(trash): a freedesktop trash backend that renames without replacing or refuses (#480)
* feat(images): remove a file's records and hide it with a removal mark (#480)
Deletes every record of one file under every recorded spelling (image links,
tags, auto-tag marks, pending review items, category, collection memberships,
favorite) in one transaction. A Needs review item that is kept keeps its
annotation rows (ON DELETE RESTRICT). The image_removals table hides an exact
file (locator, size, mtime_ns) until it changes; linking skips a marked file,
and an explicit tag, category, favorite or collection write shows it again.
* feat(images): review and apply Delete images as a reviewed plan job (#480)
POST /prompt_manager/images/delete/preview reviews both modes; the
maintenance apply takes {token, mode}. Library mode removes the records and
writes the removal mark; trash mode moves the file first and removes its
records only after a successful move. The workspace listing, the output scan,
the duplicate find and Tag output images skip marked files.
* feat(images): Delete… in the Images selection bar, inspector and viewer (#480)
The concept's Remove links… place, D159: one review per selection that asks
each time (nothing preselected) whether to remove the files from the library
only or also move them to the trash. The browser test server uses a fake
trash.
* test(images): portable delete tests, the native no-trash proof, D159 in TESTING.md (#480)
* perf(images): cache the removal marks so a listing page reads no extra table (#480)
The marks reload only when this process writes or clears one, or a restore
replaces the database. The route snapshot gains the preview route.
* test(images): the full inspector specs expect D159's Delete… in the panel and the viewer (#480)
* fix(images): the delete review starts nothing without a chosen mode, and dims its primary until then (#480)
An aria-disabled primary ignores every activation, a chosen one starts once,
and the apply helper refuses a missing mode. Tests cover a forced click, a
double click, Enter and Space on the primary, Enter in the dialog and a
submit event, and the server refusing an apply without an exact mode.