release: prepare v2.0.56

Document the notification center, recurring scheduler, deterministic stop and restart lifecycle, interface improvements, package-scoped extraction outputs, and global extraction coordination. Remove internal agent reports from the public Git tree and set package metadata to version 2.0.56.
This commit is contained in:
Sucukdeluxe
2026-08-22 18:00:17 +02:00
parent d4f8166c86
commit ea904aff79
7 changed files with 41 additions and 351 deletions
@@ -1,46 +0,0 @@
# Residual Hardening Report
## Status
PASS. Alle fünf Residuals sind mit beobachteten REDs, fokussierten GREENs und frischen Abschlussgates umgesetzt.
Basis: `7a052e995c38cd8d98589d2485f7b49b8c2d4c70`
## Umsetzung
1. Persistierte Outputzahlen besitzen jetzt einen expliziten Provenienzvertrag in Version 1. Beim Laden wird `outputCount` ausschließlich aus gültiger Paketprovenienz abgeleitet; unversionierte globale Legacy-Zahlen ohne Provenienz werden auf 0 invalidiert.
2. Archivfortschritt transportiert den tatsächlichen Archivpfad. Die Zuordnung verwendet normalisierte verschachtelte Itempfade, gleiche Basenames in verschiedenen Unterordnern bleiben getrennt und Items ohne Pfadprovenienz erhöhen `partCount` nicht.
3. Explizites Paketlöschen entfernt sämtliche Generationen aus finalisierten, standalone, unterdrückten und Digest-Resultaten sowie Run-Referenzen und Outputprovenienz. Automatische `package_done`-Bereinigung behält bereits finalisierte Run- und Digest-Belege.
4. Post-Process-Waiter besitzen einen Run-Owner. Selektiver Stop verwirft nur Waiter des gestoppten Runs. Ein freier Slot wird atomar an genau einen Waiter übertragen, ohne den Aktivzähler zwischenzeitlich auf 0 zu setzen.
5. Outputprovenienz entsteht aus paket-eigenen Staging-Ausgaben im selben Zielroot. Entpacker verschiedener Pakete dürfen parallel arbeiten; nur der konfliktbehaftete Merge in denselben Root wird in Aufrufreihenfolge serialisiert. Der Merge verwendet Rename/Move, erhält `overwrite`, `skip` und `rename`, übernimmt Partial-Ausgaben bei Abort deterministisch und traversiert ausschließlich das jeweilige Staging-Verzeichnis.
## RED
- `npx vitest run tests/storage.test.ts -t "invalidates an unversioned legacy package output count on load"`: 1/1 fehlgeschlagen; geladen wurden `outputCount: 48000` und keine Provenienzversion.
- `npx vitest run tests/download-manager.test.ts -t "captures shared-root provenance|preserves .* conflicts|retains partial staged outputs|uses normalized nested item paths|keeps foreign post-process waiters"`: 6 Fehler. Die Traversalinjektion wurde nicht verwendet, `skip` und `rename` überschrieben die Fremddatei, Abort verwendete keinen bounded Traversal, zwei Nested-Archive kollidierten zu zwei statt drei Operationen und der gestoppte Waiter wurde mit `undefined` statt `false` freigegeben. Der isolierte `overwrite`-Fall war bereits grün.
- `npx vitest run tests/notify-hooks.test.ts -t "prunes only the removed package result generations"`: 1/1 fehlgeschlagen; beide Generationen des entfernten Pakets blieben erhalten.
- Der erste fokussierte Regressionlauf zeigte zusätzlich zwei Fehler in bestehenden `package_done`-Notification-Fällen. Ursache war zu breites Pruning bei automatischer Bereinigung. Nach Begrenzung auf explizites Löschen bestanden die beiden Regressionen zusammen mit dem neuen Removal-Test 3/3.
## GREEN
- Neue Residualfälle in `tests/download-manager.test.ts`: 7/7.
- Legacy-Invalidierung und versionierte Persistenz in `tests/storage.test.ts`: 2/2.
- Explizites Removal-Pruning in `tests/notify-hooks.test.ts`: 1/1.
- Shared-Root-Lasttest: 2.000 Fremddateien, zwei parallele Paketoperationen, kein Traversal des Shared Roots und eine literale Traversalobergrenze von höchstens 4 Aufrufen.
- Konflikt- und Abbruchabdeckung: `overwrite`, `skip`, `rename` sowie Partial-Abort und vollständiges Entfernen der Staging-Verzeichnisse.
## Abschlussgates
- `npx vitest run tests/notify-hooks.test.ts tests/package-telemetry.test.ts tests/notification-outbox.test.ts tests/history-reveal.test.ts tests/history-view.test.tsx tests/storage.test.ts tests/extractor.test.ts tests/extractor-jvm.test.ts tests/main-shutdown-lifecycle.test.ts`: 324/324.
- `npx vitest run tests/download-manager.test.ts -t "deterministic stop and restart lifecycle|package lifecycle telemetry boundaries|recovers pending extraction on startup"`: 23/23.
- Fokussierte Gesamtsumme: 347/347.
- `npx tsc --noEmit`: Exit 0.
- `npm run build:main`: Exit 0.
- `npm run build:renderer`: Exit 0.
- `git diff --check`: Exit 0 nach Produktions-, Test- und Berichtsänderungen.
## Restbedenken
- Der Renderer-Build meldet weiterhin den bestehenden JavaScript-Chunk über 500 kB.
- Native WinRAR-/7-Zip-Prozesse wurden nicht als reales Windows-End-to-End-Szenario gestartet; die fokussierten Extractor- und JVM-Suites bestanden 86/86.
- Auf Vorgabe wurden keine Vollsuite und keine GUI-, RDP-, Maus-, Fenster- oder Zwischenablageprüfungen ausgeführt.
@@ -1,103 +0,0 @@
# Task 3: Deterministischer Stop→Start-Lifecycle
## Status
Umgesetzt und fokussiert verifiziert.
## Umsetzung
- Expliziter `DownloadLifecycleSnapshot` mit Phase, Grund, optionalem Retry-Zeitpunkt, aktiven Downloads, aktiven Nachbearbeitungen und angenommenem Startwunsch.
- Generation-Guard für `start()` nach beiden asynchronen Recovery-Grenzen.
- `stopping` bleibt bis zum tatsächlichen Drain von Start-Recovery, Downloads und Nachbearbeitung aktiv.
- Ein Start während `stopping` wird einmal angenommen und nach dem Drain genau einmal ausgeführt.
- ActiveTask-Cleanup ist an den konkreten Map-Eigentümer gebunden; verspätetes Cleanup kann keinen neueren Task löschen oder dessen Ressourcen freigeben.
- Stop abortiert laufende Nachbearbeitung auch bei aktivierter Nachbearbeitung ohne laufende Sitzung und zeigt die verbleibende Arbeit bis zum Promise-Ende.
- Real-Debrid-, AllDebrid- und BestDebrid-Webqueues geben abortierte Aufrufer über eine äußere Abort-Race sofort frei und beobachten die spätere terminale Promise-Auflösung weiterhin.
- Der früheste endliche Provider-Cooldown plant im Idle-Zustand ein State-Event zum Ablaufzeitpunkt.
- Startbutton und Download-Footer zeigen Pending-Start, Lifecycle-Phase, Grund, Retry-Restzeit und verbleibende Download-/Nachbearbeitungsarbeit.
## RED-Nachweise
- Recovery-Rennen: Nach Stop wurde `session.running` wieder `true`.
- Pending-Start: Während `stopping` fehlten Lifecycle und angenommener Startwunsch.
- ActiveTask-Eigentümer: Ein verspätetes altes `finally` löschte den neueren Map-Eintrag.
- Webqueues: Alle drei nie endenden Requests liefen nach Abort in den 200-ms-Testtimeout.
- Cooldown: Der Snapshot blieb bei `idle` mit `retryAt=null`.
- Renderer: Pending-Start-Button und Lifecycle-/Restarbeitsanzeige fehlten.
- Nachbearbeitung: Stop ließ das aktive Postprocessing-Signal bei `autoExtractWhenStopped=true` unabgebrochen.
## Verifikation
- 7 fokussierte Manager-Regressionen bestanden.
- 152/152 Real-Debrid-, AllDebrid-, BestDebrid- und Download-Renderer-Tests bestanden.
- `npx tsc --noEmit` bestand.
- `npm run build` bestand für Main und Renderer.
- `git diff --check` bestand vor dem Bericht.
## Commits
- `1f97ce8 Harden download stop and restart lifecycle`
- `Complete provider waits and lifecycle visibility`
## Bedenken
- Der vollständige Fünf-Dateien-Lauf erreichte vor der letzten Korrektur 395/397. Die beiden isolierten Fehler wurden anschließend einzeln und im finalen 7-Test-Manager-Gate grün verifiziert; die übrigen 393 Manager-/Web-/Renderer-Tests wurden nach dieser letzten kleinen Kompatibilitätskorrektur nicht nochmals gemeinsam ausgeführt.
- Der Renderer-Build bleibt grün, meldet aber die bereits bestehende Warnung für einen JavaScript-Chunk über 500 kB.
## Fixrunde 1/5
### Korrekturen
- Die Webqueue-Tail folgt jetzt dem abortbaren Caller-Abschluss. Ein alter Roh-Request darf intern weiterlaufen, blockiert aber keine neue Real-Debrid-, AllDebrid- oder BestDebrid-Umwandlung mehr; seine späte terminale Rejection bleibt beobachtet.
- Ein weiterer `stop()` während eines bereits laufenden Stop-Drains bewahrt den angenommenen Startwunsch. Nach dem tatsächlichen Drain wird weiterhin genau ein Folgestart ausgeführt.
- Provider-Retry-Zeitpunkte werden aus der aktuellen startfähigen Queue abgeleitet. Berücksichtigt werden nur die reale Providerkette des Links sowie aktivierbare Accounts beziehungsweise Keys und passende Provider-/Hoster-Circuit-Breaker.
- Cooldowns deaktivierter Accounts, verfügbare Alternativprovider, fremde Provider oder Hoster und reine Nachbearbeitung erzeugen weder `waiting_provider` noch `retryAt`.
### RED→GREEN
- Alle drei Webqueues: Der zweite Request lief vor dem Fix in den 200-ms-Timeout, solange der erste Roh-Promise offen blieb; danach erreichte er den Provider und schloss erfolgreich ab, bevor die erste späte Rejection ausgelöst wurde.
- Doppelter Stop: Der zweite Stop setzte `pendingStart` vor dem Fix auf `false`; danach blieb der Wunsch sichtbar und es wurden insgesamt exakt zwei Provideraufrufe beobachtet.
- Cooldown-Kontext: Deaktivierter Account, verfügbarer Alternativprovider, fremder Hoster/Provider und reine Nachbearbeitung lieferten vor dem Fix falsche Retry-Zeitpunkte; danach blieben Phase und `retryAt` korrekt. Der wirklich blockierende Ein-Provider-Cooldown blieb grün und emittierte sein Ablaufereignis.
### Verifikation
- 9/9 fokussierte Manager-Regressionen bestanden.
- 152/152 Provider-/Renderer-Tests bestanden.
- `npx tsc --noEmit` bestand.
- `npm run build` bestand für Main und Renderer.
- `git diff --check` bestand.
### Bedenken
- Der vollständige Manager-Testlauf wurde in dieser Fixrunde nicht erneut ausgeführt; die geänderten Lifecycle-/Cooldown-Fälle sowie alle drei vollständigen Providerdateien und der vollständige Download-Renderer-Test wurden fokussiert geprüft.
- Der bestehende Renderer-Buildhinweis für einen JavaScript-Chunk über 500 kB bleibt unverändert.
## Fixrunde 2/5
### Korrekturen
- Eine gemeinsame pure Providerplanung liefert Hosterroute, direkte 1Fichier-/DDownload-Pfade und die geordnete Providerkette sowohl an den echten Unrestrictpfad als auch an die Cooldown-Projektion.
- Bei deaktiviertem automatischem Fehlerfallback bildet die Projektion weiterhin den realen Sonderfall ab, dass ein wegen Real-Debrid-Cooldown nicht auswählbarer Primärprovider auf einen sofort verfügbaren Sekundärprovider wechseln darf.
- Die gemeinsame Provider-Deaktivierungsprüfung behandelt `megadebrid` als Alias für beide konkreten Mega-Debrid-Modi und wird auch vom Manager-Startgate verwendet.
- Die äußere Abort-Race hängt ihren terminalen Observer an den rohen Queue-Promise, bevor ein bereits abgebrochenes Signal ausgewertet wird. Dadurch bleibt auch die spätere rohe Rejection behandelt und die Queue sofort für den Folgejob frei.
### RED→GREEN
- `autoProviderFallback=false`: Vorher blieb ein falsches Real-Debrid-`retryAt` trotz sofort verfügbarem AllDebrid-Zweitprovider; danach `retryAt=null`.
- Direkte 1Fichier-/DDownload-Links: Vorher überlagerte der Real-Debrid-Cooldown beide Direktpfade; danach bleiben sie startfähig. Der Direktpfad wurde zusätzlich mit einer gezielten Mutation wieder rot und nach Wiederherstellung grün belegt.
- `disabledProviders: ["megadebrid"]`: Vorher waren `canStart=true` und ein Mega-Retry sichtbar; danach `canStart=false`, `phase=idle`, `retryAt=null`.
- Bereits abgebrochenes Signal: Real-Debrid, AllDebrid und BestDebrid erzeugten vor dem Fix jeweils eine rohe `unhandledRejection`; danach keine, und der jeweilige Folgejob schloss erfolgreich ab.
### Verifikation
- 12/12 fokussierte Manager-Lifecycle-/Cooldown-Tests bestanden.
- 6/6 bestehende Debrid-Providerwahltests bestanden.
- 155/155 vollständige Webprovider-/Download-Renderer-Tests bestanden.
- `npx tsc --noEmit` bestand.
- `npm run build` bestand für Main und Renderer.
- `git diff --check` bestand.
### Bedenken
- Die vollständigen Manager- und Debrid-Testdateien wurden nicht komplett ausgeführt; die geänderten Auswahl-, Lifecycle- und Queuepfade wurden fokussiert abgedeckt.
- Der bestehende Renderer-Buildhinweis für einen JavaScript-Chunk über 500 kB bleibt unverändert.
@@ -1,130 +0,0 @@
# Notification Center v2 Final Fix Report
## Status
PASS.
Alle Findings der finalen Whole-Branch-Prüfung wurden in einer testgetriebenen Fixwelle behoben. Es wurden keine Subagents eingesetzt, keine fremden Änderungen zurückgesetzt und keine alten ungetrackten Release-, Audit-, Stage- oder Build-Verzeichnisse verändert.
## Behobene Findings
### Globales Shutdown-Deadlinebudget
- `AppController.shutdown()` verwendet ein gemeinsames Deadlinebudget von 3000 ms.
- Health-Timer, Runtime-Timer und weitere Produzenten werden zuerst gestoppt.
- Eine bereits laufende Health-Auswertung, die finale Health-Auswertung, der Digest-Flush und der Outbox-Drain teilen sich dasselbe Restbudget.
- `DownloadManager.prepareForShutdown()` läuft vor Digest-Flush und Drain.
- Ein blockierter Discord-Versand blockiert neue Outbox-Persistenz nicht mehr.
- Ein Paket-Digest, der erst während des Shutdown-Fensters final wird, wird sofort in die persistente Outbox geschrieben.
### Delivery-Ack und Stall-Cooldown
- `NotificationOutbox` meldet ausschließlich erfolgreiche tatsächliche Zustellungen mit Event und realem Zustellzeitpunkt zurück.
- `DownloadHealthMonitor` startet den Stall-Cooldown erst mit diesem Zustellzeitpunkt.
- Ein während eines Discord-Ausfalls gepufferter Stall bleibt über seine stabile Event-ID dedupliziert.
- Health-Samples und Delivery-Acks werden serialisiert, sodass keine veraltete Sample-Persistenz einen gerade gesetzten Cooldown überschreibt.
- Wiederholte Acks derselben stabilen Stall-ID sind idempotent.
- Ein fehlgeschlagener Health-Ack führt weder zur erneuten Discord-Zustellung noch zur Blockade nachfolgender Outbox-Ereignisse.
- Persistierte Ack-IDs werden strikt auf das interne Stall-ID-Format begrenzt.
### Atomare Legacy-Outbox-Bereinigung
- Eine vorhandene Outbox-Datei wird beim Laden sofort in den bereinigten kanonischen Zustand zurückgeschrieben.
- Abgelaufene und ungültige Ereignisse verschwinden auch dann atomar auf Disk, wenn danach keine Queue-Einträge verbleiben.
- Private Legacy-Felder und private Fehler-Sentinels verbleiben nicht bis zum nächsten Enqueue oder Drain in der Datei.
### Ereignis-TTL
- `run_completed` besitzt unabhängig von seiner Erfolgs- oder Fehlerpriorität immer eine TTL von 24 Stunden.
- Paket-Erfolgsmeldungen behalten ihre sechs Stunden TTL.
### History-Dedup
- Das autoritative finale `PackageResult` markiert das Paket unmittelbar als fachlich im Verlauf erfasst.
- Eine anschließende manuelle Paketlöschung erzeugt keinen zweiten `deleted`-Verlaufseintrag.
- Ein echter Reset entfernt die Markierung weiterhin für eine neue Ergebnisgeneration.
### Postprocess-Startzeit
- `postProcessStartedAt` wird nicht mehr aus `postProcessQueuedAt` erfunden.
- Wenn ein Paket nie einen Postprocess-Slot erhalten hat, bleiben Startzeit und Postprocess-Dauer bei 0.
## TDD-Nachweis
Erster RED-Lauf:
```text
Test Files 4 failed (4)
Tests 9 failed | 76 passed (85)
```
Die neun erwarteten Fehler belegten das bisherige Verhalten für Deadline, späte Digest-Persistenz, blockierenden Send/Enqueue-Lock, fehlenden Delivery-Ack, zu frühen Cooldown, Legacy-Datei, Erfolg-Run-TTL, History-Doppelentry und erfundenen Postprocess-Start.
Zusätzliche gezielte RED-Läufe belegten:
- ein nach begonnenem Shutdown-Flush finalisierter Digest blieb zunächst nur im Speicher;
- ein Ack-Fehler blockierte nachfolgende Outbox-Ereignisse;
- eine frei gesetzte Ack-ID gelangte in die Health-Datei;
- ein paralleler Recovery-Sample konnte einen Delivery-Cooldown überschreiben.
Alle jeweiligen GREEN-Läufe bestanden nach der minimalen Produktionskorrektur.
## Finaler fokussierter Gate
```text
.\node_modules\.bin\vitest.cmd run tests\notification-outbox.test.ts tests\download-health-monitor.test.ts tests\notify-hooks.test.ts tests\download-manager.test.ts tests\session-restart-loss.test.ts tests\main-shutdown-lifecycle.test.ts
Test Files 6 passed (6)
Tests 344 passed (344)
Duration 163.36s
Exit 0
```
Enthalten:
- Notification Outbox: 22 Tests
- Download Health Monitor: 34 Tests
- Notification Hooks: 27 Tests
- Download Manager: 240 Tests
- Session Restart/Loss: 16 Tests
- Main Shutdown Lifecycle: 5 Tests
TypeScript:
```text
.\node_modules\.bin\tsc.cmd --noEmit
Exit 0
```
Diffprüfung:
```text
git diff --check
Exit 0
```
Vitest meldete ausschließlich die bereits vorhandene Vite-CJS-Node-API-Deprecation-Warnung. Es gab keine Testfehler, unbehandelten Ablehnungen oder Timer-Leak-Meldungen.
## Geänderter Scope
Produktionsdateien:
- `src/main/app-controller.ts`
- `src/main/notification-outbox.ts`
- `src/main/download-health-monitor.ts`
- `src/main/notification-events.ts`
- `src/main/download-manager.ts`
Tests:
- `tests/notification-outbox.test.ts`
- `tests/download-health-monitor.test.ts`
- `tests/notify-hooks.test.ts`
- `tests/main-shutdown-lifecycle.test.ts`
Bericht:
- `.superpowers/sdd/2026-08-22-notification-center-v2/final-fix-report.md`
## Restbedenken
Keine offenen bekannten Korrektheitsfehler innerhalb des beauftragten Scopes. Der Discord-Transport kann eine Zustellung bei einem Prozessabbruch exakt zwischen externer HTTP-Annahme und lokaler atomarer Entfernung grundsätzlich nicht transaktional mit Discord koordinieren; stabile IDs und die persistente FIFO-Outbox begrenzen dieses unvermeidbare externe Exactly-once-Fenster.
@@ -1,68 +0,0 @@
# Notification Outbox In-Flight Fix
## Status
Abgeschlossen auf `feature/notification-center-v2`.
Commit-Betreff: `fix(notifications): preserve in-flight outbox events`
## Ursache
`NotificationOutbox.performDrain()` wählte das nächste Event unter der Exclusivkette aus, führte `sendEvent(current)` danach aber außerhalb dieser Kette aus. Während der Send wartete, konnte ein paralleles `enqueue()` über `persist()` und `enforceLimits()` genau dieses Event wegen Ablauf oder Kapazitätsgrenze aus der Queue entfernen. Die anschließende Ergebnisverarbeitung fand die Objekt-ID nicht mehr. Dadurch gingen bei einem Fehler Retry-Zustand und Fehlerzeit verloren; bei einem Erfolg entfielen Erfolgszeit, `onDelivered` und der daran gekoppelte Cooldown.
## TDD RED
Command:
```text
node_modules\.bin\vitest.cmd run tests\notification-outbox.test.ts
```
Result: Exit 1. Zwei neue Regressionstests schlugen erwartungsgemäß fehl, 22 bestehende Tests bestanden.
- Ein langsamer erfolgreicher Send wurde während eines parallelen Enqueue ablaufbedingt entfernt; der Delivery-Ack blieb aus.
- Ein langsamer fehlgeschlagener Send wurde während eines parallelen Enqueue durch das 250er-Limit entfernt; der Retry wurde nicht gespeichert.
## Umsetzung
- Das exakt ausgewählte Event wird während des externen Sends als In-Flight-Objekt reserviert.
- Ablaufbereinigung und Kapazitäts-Eviction überspringen ausschließlich dieses Objekt.
- Die Ergebnisverarbeitung findet das reservierte Objekt über Identität, verarbeitet Erfolg oder Fehler genau einmal und löst den Schutz innerhalb derselben Exclusivoperation vor dem abschließenden Persistieren.
- Nach einem Erfolg wird das Event entfernt und `onDelivered` mit der tatsächlichen Ergebniszeit ausgeführt.
- Nach einem Fehler bleiben Versuchszähler, Retry-Termin und Fehlerzeit erhalten, sofern das Event nach der Ergebniszeit noch gültig ist.
## GREEN und Verifikation
Command:
```text
node_modules\.bin\vitest.cmd run tests\notification-outbox.test.ts tests\download-health-monitor.test.ts
```
Result: Exit 0. Zwei Testdateien mit 58 von 58 Tests bestanden.
Command:
```text
node_modules\.bin\tsc.cmd --noEmit
```
Result: Exit 0, keine Ausgabe.
Command:
```text
git diff --check -- src/main/notification-outbox.ts tests/notification-outbox.test.ts
```
Result: Exit 0, keine Ausgabe.
## Geänderte Dateien
- `src/main/notification-outbox.ts`
- `tests/notification-outbox.test.ts`
- `.superpowers/sdd/2026-08-22-notification-center-v2/inflight-fix-report.md`
## Bedenken
Keine offenen funktionalen Bedenken. Vitest zeigt ausschließlich die bereits vorhandene Deprecation-Warnung für die CJS-Ausgabe der Vite Node API; die Tests selbst sind vollständig grün.
+38 -1
View File
@@ -2,7 +2,7 @@
All notable changes to Multi-Debrid Downloader are documented in this file. All notable changes to Multi-Debrid Downloader are documented in this file.
## [Unreleased] ## [2.0.56] - 2026-08-22
### Notification Center ### Notification Center
@@ -14,6 +14,43 @@ All notable changes to Multi-Debrid Downloader are documented in this file.
- Expanded History with separate download, extraction, remux, post-processing, and total durations plus final file, archive, part, output, and failure-phase details. - Expanded History with separate download, extraction, remux, post-processing, and total durations plus final file, archive, part, output, and failure-phase details.
- Keep webhook details, local paths, account data, and credentials out of persisted notification events and failure messages. - Keep webhook details, local paths, account data, and credentials out of persisted notification events and failure messages.
### Recurring daily schedule
- Replaced the one-time Downloads scheduler with a recurring local-time schedule that can begin today or tomorrow.
- Persist daily schedules across restarts and reconcile them after startup, account changes, suspend, and resume.
- Prevent duplicate starts for the same local day while handling daylight-saving changes, missed dates, empty queues, active runs, unavailable accounts, and retryable start failures.
- Added strict time validation, a next-start countdown, and visible save errors.
### Stop and restart lifecycle
- Serialize full-queue, package, and item starts through one lifecycle so starts requested during stopping run once after existing work drains.
- Prevent late recovery callbacks and stale task finalizers from reviving stopped work or replacing a newer run.
- Release cancelled Real-Debrid, AllDebrid, and BestDebrid web waits without blocking later requests.
- Show the current lifecycle phase, reason, provider retry countdown, pending start, and remaining work.
- Keep active and deferred post-processing bound to the run that owns it.
### Interface polish
- Added coordinated fade and size transitions when package rows expand or collapse while respecting the animation preference.
- Added global expand and collapse actions to Downloads and the link collector, including packages outside the active filter.
- Kept the Downloads package action visible in a responsive toolbar and disabled it for an empty queue.
- Changed contextual help to open on pointer hover or keyboard focus and grouped download filters into a compact sidebar section.
### Extraction safety and coordination
- Validate complete archive target plans before any extraction writes, including invalid Windows names, aliases, duplicate targets, and file-directory collisions.
- Track concrete extraction outputs per package generation across writes, renames, partial results, removal, and restarts.
- Limit nested extraction, renaming, audio processing, cleanup, and library collection to files owned by the producing package.
- Added one global extraction coordinator for the configured parallel limit across packages and extraction modes, with fair scheduling and live limit changes.
- Hold multipart disk reservations and extraction permits until the real child process closes and output ownership is finalized.
- Keep run and package cancellation isolated and prevent recursive discovery of unrelated archives in shared roots.
### Telemetry and History
- Added completed, partial, failed, and cancelled package results with separate download, extraction, remux, post-processing, and total durations.
- Record file counts, downloaded bytes, archive groups, parts, outputs, failure phases, and error categories in History and final run summaries.
- Preserve mixed package outcomes and separate download, offline, extraction, remux, and cleanup failure totals.
## [2.0.55] - 2026-08-22 ## [2.0.55] - 2026-08-22
### 1Fichier imports ### 1Fichier imports
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "multi-debrid-downloader", "name": "multi-debrid-downloader",
"version": "2.0.55", "version": "2.0.56",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "multi-debrid-downloader", "name": "multi-debrid-downloader",
"version": "2.0.55", "version": "2.0.56",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"adm-zip": "0.6.0", "adm-zip": "0.6.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "multi-debrid-downloader", "name": "multi-debrid-downloader",
"version": "2.0.55", "version": "2.0.56",
"description": "Desktop downloader", "description": "Desktop downloader",
"main": "build/main/main/main.js", "main": "build/main/main/main.js",
"author": "Sucukdeluxe", "author": "Sucukdeluxe",