export_summary.txt wird nicht mehr erstellt

Dieser Commit ist enthalten in:
Claude Project Manager
2025-12-15 22:59:27 +01:00
Ursprung 8e4a052b6c
Commit 4e82d5ef8f
10 geänderte Dateien mit 236 neuen und 760 gelöschten Zeilen

Datei anzeigen

@ -71,7 +71,10 @@ class PlaywrightManager:
self.browser = None
self.context = None
self.page = None
# Feature 5: Flag für Disconnect-Tracking (verhindert doppelte Counter-Dekrementierung)
self._browser_was_disconnected = False
# Zähler für Wiederhholungsversuche
self.retry_counter = {}
@ -141,12 +144,29 @@ class PlaywrightManager:
if self.page is not None:
return self.page
# Feature 5: Reset Disconnect-Flag bei neuem Browser-Start
self._browser_was_disconnected = False
# Feature 5: Browser-Instanz Schutz - Nur eine Instanz gleichzeitig
if PlaywrightManager._active_count >= 1:
raise RuntimeError(
"Browser bereits aktiv. Nur eine Browser-Instanz gleichzeitig erlaubt. "
"Beenden Sie den aktuellen Prozess."
)
# Safety-Check: Prüfe ob Counter "hängt" (Absturz-Schutz)
# Wenn ProcessGuard NICHT locked ist, aber Counter > 0, dann ist Counter "tot"
from utils.process_guard import get_guard
guard = get_guard()
if not guard.is_locked():
# Counter hängt! Process Guard ist frei, aber Counter sagt Browser läuft
logger.warning(
f"⚠️ SAFETY-RESET: _active_count war {PlaywrightManager._active_count}, "
f"aber ProcessGuard ist nicht locked. Counter wird zurückgesetzt."
)
PlaywrightManager._active_count = 0
else:
# Guard ist locked UND Counter ist > 0 → echte parallele Instanz
raise RuntimeError(
"Browser bereits aktiv. Nur eine Browser-Instanz gleichzeitig erlaubt. "
"Beenden Sie den aktuellen Prozess."
)
try:
self.playwright = sync_playwright().start()
@ -257,6 +277,10 @@ class PlaywrightManager:
# Event-Listener für Konsolen-Logs
self.page.on("console", lambda msg: logger.debug(f"BROWSER CONSOLE: {msg.text}"))
# Feature 5: Browser-Disconnect-Handler registrieren (für manuelles Schließen)
self.browser.on("disconnected", self._on_browser_disconnected)
logger.debug("Browser-Disconnect-Handler registriert")
# Feature 5: Browser-Instanz Counter erhöhen
PlaywrightManager._active_count += 1
logger.info(f"Browser gestartet (aktive Instanzen: {PlaywrightManager._active_count})")
@ -966,7 +990,33 @@ class PlaywrightManager:
self.protection_applied = False
self.protection_style = None
logger.info("Browser-Schutz entfernt")
def _on_browser_disconnected(self):
"""
Event-Handler: Wird aufgerufen wenn Browser-Verbindung getrennt wird.
Dekrementiert den aktiven Browser-Counter, auch wenn der Browser
manuell geschlossen wurde (z.B. durch User-Klick auf X-Button).
Dies stellt sicher dass der Missbrauchs-Schutz korrekt funktioniert,
selbst wenn close() nicht explizit aufgerufen wird.
"""
# Verhindere doppelte Dekrementierung
if self._browser_was_disconnected:
logger.debug("Browser bereits als disconnected markiert, überspringe Counter-Dekrementierung")
return
self._browser_was_disconnected = True
if PlaywrightManager._active_count > 0:
PlaywrightManager._active_count -= 1
logger.info(
f"🔌 Browser disconnected - Counter dekrementiert "
f"(aktive Instanzen: {PlaywrightManager._active_count})"
)
else:
logger.warning("Browser disconnected aber Counter war bereits 0")
def close(self):
"""Schließt den Browser und gibt Ressourcen frei."""
try:
@ -1012,9 +1062,15 @@ class PlaywrightManager:
self.playwright = None
# Feature 5: Browser-Instanz Counter dekrementieren
if PlaywrightManager._active_count > 0:
PlaywrightManager._active_count -= 1
logger.info(f"Browser geschlossen (aktive Instanzen: {PlaywrightManager._active_count})")
# (nur wenn nicht bereits durch disconnected-Event dekrementiert)
if not self._browser_was_disconnected:
if PlaywrightManager._active_count > 0:
PlaywrightManager._active_count -= 1
logger.info(f"Browser geschlossen (aktive Instanzen: {PlaywrightManager._active_count})")
else:
logger.warning("Browser-Counter war bereits 0 beim Schließen")
else:
logger.debug("Counter wurde bereits durch disconnected-Event dekrementiert")
logger.info("Browser-Sitzung erfolgreich geschlossen")