Umsetzung von #564.
Das WebUI zeigte bisher nur den Live-Stream seit dem Prozessstart. GET
/api/logs lieferte den Verlauf im Speicher, die Oberflaeche nutzte ihn nicht.
Der Desktop hat einen Log-Viewer ueber die Tagesdateien. Den gibt es jetzt auch
im WebUI.
- GET /api/logs/files listet die vorhandenen Tage (Logs/yyyy-MM-dd.jsonl),
neueste zuerst. Die .log-Textdateien und fremde Dateien bleiben aussen vor.
- GET /api/logs/file filtert nach Level, Korrelations-ID und Text, alle ohne
Gross-/Kleinschreibung. Hoechstens 20000 Treffer wie im Desktop, dazu
Seitenaufteilung. Unlesbare Zeilen werden uebersprungen und gezaehlt.
- Der Dateiname entsteht aus dem geprueften Datum, nie aus der Eingabe.
"../../etc/passwd" kommt deshalb gar nicht erst in den Pfad; die Tests halten
das fest.
- Gelesen wird mit FileShare.ReadWrite, weil der Logger laufend an die
Tagesdatei anhaengt.
Oberflaeche: "Live" und "Log-Viewer (vergangene Tage)" als Unter-Tabs.
"Alles kopieren" im Live-Tab, "Seite kopieren" im Viewer. navigator.clipboard
gibt es nur in sicheren Kontexten, ueber LAN/VPN laeuft das WebUI aber per
http. Dafuer gibt es einen Rueckweg ueber ein unsichtbares Textfeld, sonst
schluege das Kopieren dort still fehl. Logzeilen werden per textContent
eingesetzt, nicht per innerHTML: Logtexte enthalten, was andere eingegeben
haben.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>