From ebeacba8b5cac9798ac7461ecb831d20f5b19aeb Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 14 May 2026 13:56:39 +0200 Subject: [PATCH] =?UTF-8?q?fix(chat):=20Spezial-Bubbles=20raus=20aus=20Cha?= =?UTF-8?q?t=20=E2=86=92=20Inbox=20+=20Emoji-Bug=20behoben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zwei Bugs aus Stefans Screenshot: 1. memorySaved/triggerCreated/skillCreated bleiben permanent unten im Chat-Verlauf statt mit den anderen Bubbles zu scrollen — sieht aus wie Werbe-Bumper. Fix: chatVisibleMessages-Filter raus aus FlatList-Source, diese Bubbles werden im Chat ueberhaupt nicht mehr gerendert. Stefans urspruengliche Idee war ja "trigger und gedächtnis bubble in ein extra modal fenster" — genau das ist die Inbox jetzt. 2. Inbox-Emoji 🗂️ wurde als Literal "🗂️"-Text gerendert. Letztes Edit hat es ohne JSX-String-Literal-Schutz eingefuegt. Fix: {'🗂️'} statt direktes Emoji-Token. Modal-Header analog. Inbox-Modal erweitert: - Neue Section "AUS DIESEM CHAT" oben: kompakte Liste der Spezial- Bubbles aus messages (chronologisch neueste oben). Memory-Eintraege oeffnen MemoryDetailModal (mit Tap auf den Pfeil). Trigger/Skills zeigen nur Title+Meta — keine Edit-UI, dafuer gibt's die jeweiligen Tabs im Diagnostic. - Darunter wie bisher der volle MemoryBrowser mit allen DB-Memories. Co-Authored-By: Claude Opus 4.7 (1M context) --- android/src/screens/ChatScreen.tsx | 109 ++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 3 deletions(-) diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index ccce338..0b42cec 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1026,7 +1026,15 @@ const ChatScreen: React.FC = () => { }, [messages]); // Inverted FlatList: neueste Nachrichten unten, kein manuelles Scrollen noetig - const invertedMessages = useMemo(() => [...messages].reverse(), [messages]); + // Spezial-Bubbles (memorySaved/triggerCreated/skillCreated) sollen im Chat + // NICHT mehr erscheinen — sie werden in der Notizen-Inbox angezeigt. + // Das verhindert dass sie chronologisch unten im Chat haengen und der + // eigentliche Chat-Verlauf darunter verschwindet. + const chatVisibleMessages = useMemo( + () => messages.filter(m => !m.memorySaved && !m.triggerCreated && !m.skillCreated), + [messages], + ); + const invertedMessages = useMemo(() => [...chatVisibleMessages].reverse(), [chatVisibleMessages]); // Such-Treffer: alle Message-IDs die zur Query passen, in chronologischer // Reihenfolge (aelteste zuerst). Bei Query-Change resetten wir den Index. @@ -1597,7 +1605,7 @@ const ChatScreen: React.FC = () => { connectionState === 'connecting' ? 'Verbinde...' : 'Getrennt'} setInboxVisible(true)} style={{marginLeft: 'auto', paddingHorizontal: 6}} hitSlop={{top:8,bottom:8,left:6,right:6}}> - \uD83D\uDDC2\uFE0F + {'\uD83D\uDDC2\uFE0F'} setSearchVisible(!searchVisible)} style={{paddingHorizontal: 6}} hitSlop={{top:8,bottom:8,left:6,right:6}}> {'\uD83D\uDD0D'} @@ -1844,11 +1852,87 @@ const ChatScreen: React.FC = () => { setInboxVisible(false)}> - 🗂️ Notizen-Inbox + {'🗂️'} Notizen-Inbox setInboxVisible(false)} hitSlop={{top:8,bottom:8,left:8,right:8}}> × + {/* Aus aktuellem Chat: Spezial-Bubbles (memory/trigger/skill) kompakt + auflisten — neueste oben. Klick auf Memory oeffnet Detail-Modal. */} + {(() => { + const specials = messages + .filter(m => m.memorySaved || m.triggerCreated || m.skillCreated) + .slice().reverse(); + if (specials.length === 0) { + return ( + + + (keine Notizen-Bubbles im aktuellen Chat) + + + ); + } + return ( + + + Aus diesem Chat + + + {specials.map(m => { + if (m.memorySaved) { + const ms = m.memorySaved; + const action = ms.action || 'created'; + const verb = action === 'updated' ? 'geändert' : action === 'deleted' ? 'gelöscht' : 'angelegt'; + const dotColor = action === 'deleted' ? '#FF6B6B' : '#FFD60A'; + return ( + { if (ms.id && action !== 'deleted') { setInboxVisible(false); setMemoryDetailId(ms.id); } }} + disabled={!ms.id || action === 'deleted'} + > + {'🧠'} + + {ms.title} + Memory · {verb} · {ms.type} + + {ms.id && action !== 'deleted' ? : null} + + ); + } + if (m.triggerCreated) { + const t = m.triggerCreated; + return ( + + {'⏰'} + + {t.name} + Trigger · {t.type}{t.fires_at ? ` · ${t.fires_at.slice(0,16).replace('T',' ')}` : ''} + + + ); + } + if (m.skillCreated) { + const sk = m.skillCreated; + return ( + + {'🛠'} + + {sk.name} + Skill · {sk.execution} + + + ); + } + return null; + })} + + + ); + })()} + + Alle Memories aus der DB + @@ -2181,6 +2265,25 @@ const styles = StyleSheet.create({ playButtonText: { fontSize: 16, }, + inboxRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + backgroundColor: '#1E1E2E', + padding: 10, + borderRadius: 6, + marginBottom: 4, + }, + inboxRowTitle: { + color: '#E0E0F0', + fontSize: 13, + fontWeight: '600', + }, + inboxRowMeta: { + color: '#8888AA', + fontSize: 11, + marginTop: 1, + }, memoryAttachmentRow: { flexDirection: 'row', alignItems: 'center',