fix(voice): Sprach-Nachricht landet im richtigen Projekt (Registry-Race)
Bug: bei manuellem Stop landete die Sprachnachricht (und ARIAs Antwort) im Hauptchat statt im fokussierten Projekt — mal so, mal so, je nachdem ob der Endpoint natuerlich kam oder man den Stop-Button drueckte. Ursache: stt_stream_end popte die Focus-projectId-Registry SOFORT. Nach einem manuellen Stop folgt aber noch der finale stt_endpoint (Whisper-Final- Transcribe), der die projectId aus genau dieser Registry braucht. War sie schon weg → focused_pid="" → Voice-Router faellt auf Hauptchat zurueck. Die User-Bubble (lokal getaggt) blieb im Projekt, ARIAs Antwort kam aber mit project_id="" → nur in EINEM Kontext sichtbar. Fix: stt_stream_end raeumt die Registry nicht mehr sofort auf, sondern per verzoegertem call_later(20s) als Leak-Schutz. Der stt_endpoint-Handler popt selbst wenn er zuerst kommt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+18
-2
@@ -2811,9 +2811,25 @@ class ARIABridge:
|
|||||||
return
|
return
|
||||||
|
|
||||||
elif msg_type == "stt_stream_end":
|
elif msg_type == "stt_stream_end":
|
||||||
# Session vorbei — Focus-Tracking fuer diese requestId aufraeumen.
|
# Session vorbei — ABER nicht sofort aufraeumen: nach einem manuellen
|
||||||
|
# Stop folgt noch der finale stt_endpoint (Whisper-Final-Transcribe),
|
||||||
|
# der die Focus-projectId aus dieser Registry braucht. Wuerden wir hier
|
||||||
|
# sofort poppen, bekaeme der Endpoint "" → die Nachricht (und ARIA's
|
||||||
|
# Antwort) landet im Hauptchat statt im fokussierten Projekt. Der
|
||||||
|
# stt_endpoint-Handler popt selbst; hier nur ein verzoegerter Cleanup
|
||||||
|
# als Leak-Schutz, falls gar kein Endpoint mehr kommt.
|
||||||
req_id = payload.get("requestId", "") or ""
|
req_id = payload.get("requestId", "") or ""
|
||||||
self._stt_stream_projects.pop(req_id, None)
|
if req_id:
|
||||||
|
try:
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
loop.call_later(
|
||||||
|
20.0,
|
||||||
|
lambda rid=req_id: self._stt_stream_projects.pop(rid, None),
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
# Kein laufender Loop (sollte im ws-Handler nie passieren) —
|
||||||
|
# dann lieber gar nicht aufraeumen als crashen.
|
||||||
|
pass
|
||||||
return
|
return
|
||||||
|
|
||||||
elif msg_type == "stt_endpoint":
|
elif msg_type == "stt_endpoint":
|
||||||
|
|||||||
Reference in New Issue
Block a user