From ea904aff79b8450a7438290adbc7a91cc9f521a4 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Sat, 22 Aug 2026 18:00:17 +0200 Subject: [PATCH] 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. --- .../residual-hardening-report.md | 46 ------- .../task-3-report.md | 103 -------------- .../final-fix-report.md | 130 ------------------ .../inflight-fix-report.md | 68 --------- CHANGELOG.md | 39 +++++- package-lock.json | 4 +- package.json | 2 +- 7 files changed, 41 insertions(+), 351 deletions(-) delete mode 100644 .superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/residual-hardening-report.md delete mode 100644 .superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/task-3-report.md delete mode 100644 .superpowers/sdd/2026-08-22-notification-center-v2/final-fix-report.md delete mode 100644 .superpowers/sdd/2026-08-22-notification-center-v2/inflight-fix-report.md diff --git a/.superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/residual-hardening-report.md b/.superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/residual-hardening-report.md deleted file mode 100644 index 195bfa6..0000000 --- a/.superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/residual-hardening-report.md +++ /dev/null @@ -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. diff --git a/.superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/task-3-report.md b/.superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/task-3-report.md deleted file mode 100644 index 26389a0..0000000 --- a/.superpowers/sdd/2026-08-22-daily-schedule-stop-ui-polish/task-3-report.md +++ /dev/null @@ -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. diff --git a/.superpowers/sdd/2026-08-22-notification-center-v2/final-fix-report.md b/.superpowers/sdd/2026-08-22-notification-center-v2/final-fix-report.md deleted file mode 100644 index 5643a65..0000000 --- a/.superpowers/sdd/2026-08-22-notification-center-v2/final-fix-report.md +++ /dev/null @@ -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. diff --git a/.superpowers/sdd/2026-08-22-notification-center-v2/inflight-fix-report.md b/.superpowers/sdd/2026-08-22-notification-center-v2/inflight-fix-report.md deleted file mode 100644 index 44c94a3..0000000 --- a/.superpowers/sdd/2026-08-22-notification-center-v2/inflight-fix-report.md +++ /dev/null @@ -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. diff --git a/CHANGELOG.md b/CHANGELOG.md index 4277060..41b2e5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to Multi-Debrid Downloader are documented in this file. -## [Unreleased] +## [2.0.56] - 2026-08-22 ### 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. - 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 ### 1Fichier imports diff --git a/package-lock.json b/package-lock.json index 8fb787a..3ac4d9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "multi-debrid-downloader", - "version": "2.0.55", + "version": "2.0.56", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "multi-debrid-downloader", - "version": "2.0.55", + "version": "2.0.56", "license": "MIT", "dependencies": { "adm-zip": "0.6.0", diff --git a/package.json b/package.json index 1d44f7e..7a1d6f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "multi-debrid-downloader", - "version": "2.0.55", + "version": "2.0.56", "description": "Desktop downloader", "main": "build/main/main/main.js", "author": "Sucukdeluxe",