From dd1e1ac4586d396549f1ca73c7e790938f01796d Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 1 Oct 2026 17:08:42 +0200 Subject: [PATCH] fix(app): verlorene Aufnahme sichtbar machen statt still zu loeschen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beweis aus den Logs: die Whisper-Bridge startete MITTEN in der ersten Aufnahme neu (stream.start 16:35:43 -> boot 16:36:02), damit war die Sitzung weg. Die App fiel in den 3s-Fallback (reason=...no-response) und entfernte die Bubble kommentarlos — fuer den Nutzer sah es aus, als waere nie etwas gesendet worden. Jetzt wird bei 'no-response' die Platzhalter-Bubble durch einen Hinweis ersetzt ('Aufnahme ging verloren — Spracherkennung war nicht erreichbar'). Der stille no-speech-Fall (Du hast wirklich nichts gesagt) bleibt wie bisher. tsc: 0 Fehler. Co-Authored-By: Claude Opus 4.8 --- android/src/screens/ChatScreen.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index b64402b..a6b5133 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1802,9 +1802,20 @@ const ChatScreen: React.FC = () => { // dem STT-Text gefuellte Bubble NICHT loeschen, sonst verschwindet die // Sprachnachricht obwohl ARIA schon an der Antwort arbeitet. if (ev.audioRequestId) { - setMessages(prev => prev.filter(m => - !(m.audioRequestId === ev.audioRequestId - && m.text.includes('Spracheingabe wird verarbeitet')))); + // 'no-response' heisst: die Spracherkennung hat GAR NICHT geantwortet + // (Worker neu gestartet / nicht erreichbar) — die Aufnahme ist also + // wirklich verloren gegangen, Du hast nicht etwa nichts gesagt. Das + // zeigen wir an, statt die Bubble stillschweigend zu entfernen; sonst + // wirkt es, als waere die Nachricht nie gesendet worden. + const lost = String(ev.reason || '').includes('no-response'); + setMessages(prev => lost + ? prev.map(m => (m.audioRequestId === ev.audioRequestId + && m.text.includes('Spracheingabe wird verarbeitet')) + ? { ...m, text: '⚠️ Aufnahme ging verloren — die Spracherkennung war gerade nicht erreichbar. Bitte nochmal aufnehmen.' } + : m) + : prev.filter(m => + !(m.audioRequestId === ev.audioRequestId + && m.text.includes('Spracheingabe wird verarbeitet')))); } // Passiv-Lauschen: leeres Endpoint (no-speech / Silero-Musik / speaker_ // mismatch). NICHT sofort beenden — solange die Stille-Toleranz ab