Let a misfiled series be moved from the finding that reported it

The triage could say Narcos is filed under anime and offer nothing to do about
it. Findings that recorded a destination now carry a Move action, which the AI
tab renders as a button on its own — actions are read from the server, so no UI
knew this existed. Armed like Fix and Dismiss, because it is the only action in
that card that relocates files rather than settings and the undo is another move.
Offered only where the triage said misfiled, never for uncertain: three
narrowings before a file is touched. Re-reads the series from Sonarr first, so a
finding gone stale cannot undo a move made by hand in the meantime.
This commit is contained in:
Gmer4Lfe
2026-08-14 22:13:25 -04:00
parent 00dee37e22
commit 60971f1af4
3 changed files with 108 additions and 6 deletions
+5 -1
View File
@@ -768,7 +768,7 @@ vv_ai_chat_markup('vv-ai', [
// Labels are the page's; meanings are not. The title on each button is the server's own
// description of that action, so the wording an operator hovers is the same wording the chat
// uses for the same row.
const FND_LABEL = { fix: 'Fix', ack: 'I know', dismiss: 'Never a problem', reopen: 'Reopen' };
const FND_LABEL = { fix: 'Fix', move: 'Move it', ack: 'I know', dismiss: 'Never a problem', reopen: 'Reopen' };
// Which presses take a second one, and what the button says while it waits. Source-aware on
// purpose: repair's Fix writes conf and its Dismiss is the one state the sweep will never
@@ -777,7 +777,11 @@ vv_ai_chat_markup('vv-ai', [
// ceremony — a single map keyed on the action name alone would have armed it by accident.
function qArmLabel(row, act) {
if (row.src === 'repair') {
// Move is armed because it is the only action here that touches files rather than settings.
// Sonarr relocates the episodes on disk, and the undo is another move that has to copy
// everything back — so the second press is the cheapest part of the whole operation.
return act === 'fix' ? 'Confirm write'
: act === 'move' ? 'Confirm move'
: act === 'dismiss' ? 'Confirm — permanent' : null;
}
// Keeping is armed because it is the only route by which model-written text reaches a future