feat(memory): Bubble-Header zeigt jetzt Aktion (angelegt/geaendert/geloescht)
Etappe 1 von Stefans App-Memory-UX-Wunsch:
Brain agent.py: memory_save Dispatcher pushed jetzt action="created",
memory_update Dispatcher pushed action="updated" mit demselben
memory_saved-Event-Typ. Bridge reicht das action-Feld im Payload mit
durch (in beiden Side-Channel-Pfaden — send_to_core + trigger-fired).
App ChatScreen: ChatMessage.memorySaved.action ('created' | 'updated'
| 'deleted'). Bubble-Header je nach Aktion:
- created → "🧠 ARIA hat etwas gemerkt" (gelb)
- updated → "🧠 ARIA hat eine Notiz geändert" (gelb)
- deleted → "🧠 ARIA hat eine Notiz gelöscht" (rot)
Naechste Etappen folgen (Detail-Modal beim Tap, Edit + Anhang-Upload,
Notizen-Inbox neben Lupe, Memory-Editor in Settings).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -95,6 +95,9 @@ interface ChatMessage {
|
|||||||
category?: string;
|
category?: string;
|
||||||
pinned: boolean;
|
pinned: boolean;
|
||||||
preview?: string;
|
preview?: string;
|
||||||
|
/** Was passiert ist: angelegt / geaendert / geloescht. Default created
|
||||||
|
* fuer Rueckwaerts-Kompatibilitaet mit aelteren Events. */
|
||||||
|
action?: 'created' | 'updated' | 'deleted';
|
||||||
attachments?: Array<{
|
attachments?: Array<{
|
||||||
name: string;
|
name: string;
|
||||||
mime?: string;
|
mime?: string;
|
||||||
@@ -560,6 +563,7 @@ const ChatScreen: React.FC = () => {
|
|||||||
category: p.category ? String(p.category) : undefined,
|
category: p.category ? String(p.category) : undefined,
|
||||||
pinned: !!p.pinned,
|
pinned: !!p.pinned,
|
||||||
preview: p.content_preview ? String(p.content_preview) : undefined,
|
preview: p.content_preview ? String(p.content_preview) : undefined,
|
||||||
|
action: (p.action === 'updated' || p.action === 'deleted') ? p.action : 'created',
|
||||||
attachments: atts.length ? atts : undefined,
|
attachments: atts.length ? atts : undefined,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -1326,10 +1330,17 @@ const ChatScreen: React.FC = () => {
|
|||||||
const m = item.memorySaved;
|
const m = item.memorySaved;
|
||||||
const catPart = m.category ? ` · [${m.category}]` : '';
|
const catPart = m.category ? ` · [${m.category}]` : '';
|
||||||
const atts = m.attachments || [];
|
const atts = m.attachments || [];
|
||||||
|
const action = m.action || 'created';
|
||||||
|
const headline =
|
||||||
|
action === 'updated' ? '🧠 ARIA hat eine Notiz geändert' :
|
||||||
|
action === 'deleted' ? '🧠 ARIA hat eine Notiz gelöscht' :
|
||||||
|
'🧠 ARIA hat etwas gemerkt';
|
||||||
|
const headlineColor = action === 'deleted' ? '#FF6B6B' : '#FFD60A';
|
||||||
|
const borderColor = action === 'deleted' ? '#FF6B6B' : '#FFD60A';
|
||||||
return (
|
return (
|
||||||
<View style={[styles.messageBubble, styles.ariaBubble, {borderLeftWidth: 3, borderLeftColor: '#FFD60A'}, searchHighlightStyle]}>
|
<View style={[styles.messageBubble, styles.ariaBubble, {borderLeftWidth: 3, borderLeftColor: borderColor}, searchHighlightStyle]}>
|
||||||
<Text style={{color: '#FFD60A', fontWeight: 'bold', fontSize: 14}}>
|
<Text style={{color: headlineColor, fontWeight: 'bold', fontSize: 14}}>
|
||||||
{'🧠 ARIA hat etwas gemerkt'}
|
{headline}
|
||||||
</Text>
|
</Text>
|
||||||
<Text style={{color: '#E0E0F0', marginTop: 4, fontSize: 14}}>
|
<Text style={{color: '#E0E0F0', marginTop: 4, fontSize: 14}}>
|
||||||
<Text style={{fontWeight: 'bold'}}>{m.title}</Text>
|
<Text style={{fontWeight: 'bold'}}>{m.title}</Text>
|
||||||
|
|||||||
@@ -672,6 +672,7 @@ class Agent:
|
|||||||
saved = self.store.get(pid)
|
saved = self.store.get(pid)
|
||||||
self._pending_events.append({
|
self._pending_events.append({
|
||||||
"type": "memory_saved",
|
"type": "memory_saved",
|
||||||
|
"action": "updated",
|
||||||
"memory": {
|
"memory": {
|
||||||
"id": saved.id, "type": saved.type, "title": saved.title,
|
"id": saved.id, "type": saved.type, "title": saved.title,
|
||||||
"content_preview": (saved.content or "")[:140],
|
"content_preview": (saved.content or "")[:140],
|
||||||
@@ -734,6 +735,7 @@ class Agent:
|
|||||||
saved = self.store.get(pid)
|
saved = self.store.get(pid)
|
||||||
self._pending_events.append({
|
self._pending_events.append({
|
||||||
"type": "memory_saved",
|
"type": "memory_saved",
|
||||||
|
"action": "created",
|
||||||
"memory": {
|
"memory": {
|
||||||
"id": saved.id, "type": saved.type, "title": saved.title,
|
"id": saved.id, "type": saved.type, "title": saved.title,
|
||||||
"content_preview": (saved.content or "")[:140],
|
"content_preview": (saved.content or "")[:140],
|
||||||
|
|||||||
@@ -2647,9 +2647,12 @@ class ARIABridge:
|
|||||||
"timestamp": int(asyncio.get_event_loop().time() * 1000),
|
"timestamp": int(asyncio.get_event_loop().time() * 1000),
|
||||||
})
|
})
|
||||||
elif etype == "memory_saved":
|
elif etype == "memory_saved":
|
||||||
|
mem = event.get("memory", {})
|
||||||
|
if event.get("action"):
|
||||||
|
mem = {**mem, "action": event.get("action")}
|
||||||
await self._send_to_rvs({
|
await self._send_to_rvs({
|
||||||
"type": "memory_saved",
|
"type": "memory_saved",
|
||||||
"payload": event.get("memory", {}),
|
"payload": mem,
|
||||||
"timestamp": int(asyncio.get_event_loop().time() * 1000),
|
"timestamp": int(asyncio.get_event_loop().time() * 1000),
|
||||||
})
|
})
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
Reference in New Issue
Block a user