fix(diag): zwei Bugs — Memory-Liste nach Delete + Thinking-Indikator im RVS-Chat

Bug 1: Memory loeschen + Liste zeigt geloeschten Eintrag weiter
  deleteMemory rief loadBrainMemoryList — die fiel bei aktiver Such-
  Ansicht in den Cache-Pfad und renderte den geloeschten Eintrag aus
  brainMemoryCache/brainSearchIds wieder. Fix: nach Delete den Cache-
  Eintrag + brainSearchIds bereinigen und bei aktiver Suche re-search
  ausfuehren (single oder advanced), sonst Vollliste vom Server.

Bug 2: "ARIA denkt..."-Indikator erscheint nicht mehr im Chat-Fenster
  Diagnostic-Server hatte fuer RVS-eingehende agent_activity-Events
  keinen Relay an die Browser-Clients. Bridge sendet die Events brav,
  Diagnostic schluckt sie still. Fix: agent_activity vom RVS an
  Browser broadcasten (mit dem gleichen settled-window-Schutz wie
  beim alten Gateway-Pfad — Trailing-Events nach chat:final werden
  weiter ignoriert).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 01:55:08 +02:00
parent df60bb6d74
commit 351c58e88e
2 changed files with 27 additions and 1 deletions
+12 -1
View File
@@ -4120,7 +4120,18 @@
try { try {
const r = await fetch('/api/brain/memory/delete/' + encodeURIComponent(id), { method: 'DELETE' }); const r = await fetch('/api/brain/memory/delete/' + encodeURIComponent(id), { method: 'DELETE' });
if (!r.ok) throw new Error('HTTP ' + r.status); if (!r.ok) throw new Error('HTTP ' + r.status);
loadBrainMemoryList(); // Lokalen Cache + Such-State bereinigen damit die Liste nicht den Geist
// des geloeschten Eintrags weiterzeigt.
delete brainMemoryCache[id];
if (Array.isArray(brainSearchIds)) {
brainSearchIds = brainSearchIds.filter(x => x !== id);
}
// Re-Render: bei aktiver Suche neu suchen (Filter respektieren),
// sonst die Vollliste neu vom Server holen.
const which = (typeof brainSearchActive === 'function') ? brainSearchActive() : null;
if (which === 'single') await runBrainSearch();
else if (which === 'advanced') await runAdvancedSearch();
else await loadBrainMemoryList();
loadBrainStatus(); loadBrainStatus();
} catch (e) { } catch (e) {
alert('Löschen fehlgeschlagen: ' + e.message); alert('Löschen fehlgeschlagen: ' + e.message);
+15
View File
@@ -617,6 +617,21 @@ function connectRVS(forcePlain) {
// Mode-Broadcast von der Bridge → an Browser-Clients weiterreichen // Mode-Broadcast von der Bridge → an Browser-Clients weiterreichen
log("info", "rvs", `Mode-Broadcast: ${msg.payload?.mode} (${msg.payload?.name})`); log("info", "rvs", `Mode-Broadcast: ${msg.payload?.mode} (${msg.payload?.name})`);
broadcast({ type: "mode", payload: msg.payload }); broadcast({ type: "mode", payload: msg.payload });
} else if (msg.type === "agent_activity") {
// Bridge meldet "ARIA denkt/schreibt/tool" oder "idle" — an Browser
// weiterreichen, damit der Thinking-Indikator im Chat erscheint.
// Wenn gerade ein chat:final vorbei ist, unterdruecken wir trailing
// 'thinking'-Events (gleiches Schema wie alter OpenClaw-Pfad).
const activity = msg.payload?.activity || msg.activity || "idle";
if (activity !== "idle" && Date.now() - lastChatFinalAt < SETTLED_WINDOW_MS) {
// chat:final ist gerade durch — verstaubende thinking-Events ignorieren
} else {
broadcast({
type: "agent_activity",
activity,
tool: msg.payload?.tool || msg.tool || "",
});
}
} else if (msg.type === "memory_saved") { } else if (msg.type === "memory_saved") {
// ARIA hat selber etwas in die Qdrant-DB gespeichert (via memory_save Tool). // ARIA hat selber etwas in die Qdrant-DB gespeichert (via memory_save Tool).
const m = msg.payload || {}; const m = msg.payload || {};