fix(sync): "ARIA denkt" bleibt haengen obwohl Turn fertig
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 <noreply@anthropic.com>
This commit is contained in:
@@ -1172,6 +1172,21 @@ const ChatScreen: React.FC = () => {
|
|||||||
});
|
});
|
||||||
// ARIA hat geantwortet → Watchdog clearen, falls noch armiert
|
// ARIA hat geantwortet → Watchdog clearen, falls noch armiert
|
||||||
clearStuckWatchdog();
|
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
|
// ALLE noch laufenden ACK-Timer clearen — Bridge hat unsere Messages
|
||||||
// ja offensichtlich verarbeitet (sonst keine ARIA-Antwort). Wenn
|
// ja offensichtlich verarbeitet (sonst keine ARIA-Antwort). Wenn
|
||||||
// ein ACK aus Netzgruenden verloren ging, soll der Retry nicht
|
// ein ACK aus Netzgruenden verloren ging, soll der Retry nicht
|
||||||
|
|||||||
@@ -1786,6 +1786,14 @@ class ARIABridge:
|
|||||||
"timestamp": int(asyncio.get_event_loop().time() * 1000),
|
"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"):
|
if data.get("distilling"):
|
||||||
logger.info("[brain] Destillat laeuft im Hintergrund")
|
logger.info("[brain] Destillat laeuft im Hintergrund")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user