From 3b6d36f2ded7832faa66e9475e2c83b58561321e Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 11 Jul 2026 16:23:41 +0200 Subject: [PATCH] fix(sync): "ARIA denkt" bleibt haengen obwohl Turn fertig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zwei Ursachen, beide adressiert: - App raeumte den (kontext-scoped) Thinking-Indikator nur ueber das agent_activity 'idle' der Bridge. Kam das nicht an (dedup/mismatch), blieb "ARIA denkt" + Abbrechen stehen. Jetzt raeumt die App den Indikator beim Eintreffen der Antwort selbst (definitiver Turn-Ende-Beweis). - Bridge sendete 'thinking' mit der REQUEST-projectId, 'idle' aber mit der TURN-projectId (Brain kann umrouten, z.B. Voice-Sticky). Bei Abweichung bekam der Request-Kontext nie sein idle → zusaetzliches idle fuer die Request-projectId am Turn-Ende. Co-Authored-By: Claude Opus 4.8 --- android/src/screens/ChatScreen.tsx | 15 +++++++++++++++ bridge/aria_bridge.py | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index d51ba29..a54d88d 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1172,6 +1172,21 @@ const ChatScreen: React.FC = () => { }); // ARIA hat geantwortet → Watchdog clearen, falls noch armiert clearStuckWatchdog(); + // Thinking-Indikator fuer DIESEN Kontext raeumen. Die Antwort ist der + // definitive Beweis, dass der Turn fertig ist — unabhaengig davon, ob + // das agent_activity 'idle' der Bridge ankam (es kann mit abweichender + // projectId gesendet oder wegdedupt worden sein → "ARIA denkt" blieb + // sonst haengen). Zusaetzlich global raeumen, falls der sichtbare + // Kontext ueber den Legacy-Indikator lief. + { + const ansPid = ((message.payload as any).projectId as string) || ''; + setAgentActivityByCtx(prev => + prev[ansPid] && prev[ansPid].activity !== 'idle' + ? { ...prev, [ansPid]: { activity: 'idle', tool: '' } } + : prev); + setAgentActivity(cur => + cur.activity === 'idle' ? cur : { activity: 'idle', tool: '' }); + } // ALLE noch laufenden ACK-Timer clearen — Bridge hat unsere Messages // ja offensichtlich verarbeitet (sonst keine ARIA-Antwort). Wenn // ein ACK aus Netzgruenden verloren ging, soll der Retry nicht diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index 901af76..4812c80 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -1786,6 +1786,14 @@ class ARIABridge: "timestamp": int(asyncio.get_event_loop().time() * 1000), }) + # Das 'thinking' oben ging mit der REQUEST-projectId raus, das 'idle' in + # _process_core_response aber mit der TURN-projectId (Brain kann den Turn + # umgeroutet haben, z.B. Voice-Sticky). Weichen sie ab, bekaeme der + # Request-Kontext nie sein idle → "ARIA denkt" bliebe dort haengen. + # Darum hier zusaetzlich fuer die Request-projectId ein idle. + if (project_id or "") != (turn_project_id or ""): + await self._emit_activity("idle", "", project_id=project_id) + if data.get("distilling"): logger.info("[brain] Destillat laeuft im Hintergrund")