From 4fe72cc4a8320f3de3dde237211a7da235687c97 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 16 May 2026 16:21:12 +0200 Subject: [PATCH] feat(chat): System-Hints in Bubbles ausblenden (Toggle in Settings) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bridge fuegt User-Texten Praefixe in eckigen Klammern hinzu damit Brain Kontext hat — z.B. '[Stefans aktuelle GPS-Position: 53.0, 8.5. Nutze die nur wenn ...]' oder '[Hinweis: Stefan hat dich gerade unterbrochen...]'. Die landeten via chat_backup auch in der App-Bubble — Stefan sieht jeden Hint mit, hat nichts in der UI verloren. Fix: App-side stripSystemHints() filtert aufeinanderfolgende `[...]`- Bloecke am Textanfang inkl. Trennleerzeichen. Wird in renderMessage angewendet, default an (Hints versteckt). Toggle in Settings → Allgemein → 'Chat-Bubbles' kehrt's um falls Debug gewuenscht. Brain bekommt weiterhin den vollen Text — Bridge-Side unveraendert. Live-Toggle: Settings setzt aria_show_hints in AsyncStorage, ChatScreen re-liest alle 2s (gleicher Mechanismus wie tts_enabled etc.). Co-Authored-By: Claude Opus 4.7 (1M context) --- android/src/screens/ChatScreen.tsx | 26 +++++++++++++++++++- android/src/screens/SettingsScreen.tsx | 34 ++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index a88639e..99faf84 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -149,6 +149,22 @@ const MAX_THOUGHTS = 500; // im Gespraechsmodus bei sehr vielen Nachrichten. const capMessages = (msgs: ChatMessage[]): ChatMessage[] => msgs.length > MAX_MEMORY_MESSAGES ? msgs.slice(-MAX_MEMORY_MESSAGES) : msgs; + +// Bridge fuegt User-Texten Praefixe in eckigen Klammern hinzu damit Brain +// Kontext hat (GPS-Position, Barge-In-Hint etc.). Diese sollen nicht in der +// Bubble auftauchen — nur Brain sieht sie. Filtert alle aufeinanderfolgenden +// [...]-Bloecke am Textanfang weg, inkl. der Trennleerzeichen dahinter. +function stripSystemHints(text: string): string { + if (!text) return text; + let out = text; + // Mehrere Hints koennen aneinanderhaengen — "[A] [B] Hallo" → "Hallo" + while (true) { + const m = out.match(/^\s*\[[^\]]*\]\s*/); + if (!m) break; + out = out.slice(m[0].length); + } + return out; +} const DEFAULT_ATTACHMENT_DIR = `${RNFS.DocumentDirectoryPath}/chat_attachments`; const STORAGE_PATH_KEY = 'aria_attachment_storage_path'; @@ -279,6 +295,12 @@ const ChatScreen: React.FC = () => { // Gerätelokale TTS-Config: globaler Toggle (aus Settings) + temporäres Muten (Mund-Button) const [ttsDeviceEnabled, setTtsDeviceEnabled] = useState(true); const [ttsMuted, setTtsMuted] = useState(false); + // System-Hints in Bubble: Bridge fuegt User-Text Praefixe wie + // "[Stefans aktuelle GPS-Position: ...]" oder "[Hinweis: Stefan hat + // dich gerade unterbrochen...]" hinzu damit Brain Kontext hat. Die + // App soll sie standardmaessig NICHT anzeigen — Stefan sieht sonst + // jeden Hint mit. Toggle in Settings. + const [showSystemHints, setShowSystemHints] = useState(false); // Gerätelokale XTTS-Voice-Wahl (bevorzugt gegenueber dem globalen Default) const localXttsVoiceRef = useRef(''); // Geraetelokale TTS-Wiedergabegeschwindigkeit (speed-Param an F5-TTS) @@ -446,6 +468,8 @@ const ChatScreen: React.FC = () => { ttsSpeedRef.current = await loadTtsSpeed(); const gps = await AsyncStorage.getItem('aria_gps_enabled'); setGpsEnabled(gps === 'true'); + const hints = await AsyncStorage.getItem('aria_show_hints'); + setShowSystemHints(hints === 'true'); // default false }; loadSettings(); const interval = setInterval(loadSettings, 2000); @@ -2032,7 +2056,7 @@ const ChatScreen: React.FC = () => { {/* Text (nicht anzeigen wenn nur "Anhang empfangen" und ein Bild da ist) */} {!(item.text === 'Anhang empfangen' && item.attachments?.some(a => a.type === 'image' && a.uri)) && ( )} diff --git a/android/src/screens/SettingsScreen.tsx b/android/src/screens/SettingsScreen.tsx index 1a1402e..f7aad21 100644 --- a/android/src/screens/SettingsScreen.tsx +++ b/android/src/screens/SettingsScreen.tsx @@ -131,6 +131,7 @@ const SettingsScreen: React.FC = () => { const [gpsEnabled, setGpsEnabled] = useState(false); const [gpsTracking, setGpsTracking] = useState(gpsTrackingService.isActive()); const [backgroundMode, setBackgroundMode] = useState(true); // Default an + const [showSystemHints, setShowSystemHints] = useState(false); // Default aus const [scannerVisible, setScannerVisible] = useState(false); const [logTab, setLogTab] = useState('live'); const [logs, setLogs] = useState([]); @@ -202,6 +203,10 @@ const SettingsScreen: React.FC = () => { // Default ist an — nur explicit 'false' deaktiviert setBackgroundMode(saved !== 'false'); }); + AsyncStorage.getItem('aria_show_hints').then(saved => { + // Default ist aus — nur explicit 'true' aktiviert + setShowSystemHints(saved === 'true'); + }); // gpsTrackingService status syncen + auf Aenderungen lauschen setGpsTracking(gpsTrackingService.isActive()); const offGps = gpsTrackingService.onChange(setGpsTracking); @@ -616,6 +621,13 @@ const SettingsScreen: React.FC = () => { } }, []); + // --- System-Hints Toggle --- + + const handleShowSystemHintsToggle = useCallback((value: boolean) => { + setShowSystemHints(value); + AsyncStorage.setItem('aria_show_hints', String(value)).catch(() => {}); + }, []); + // --- XTTS Voice --- const selectVoice = useCallback((voiceName: string) => { @@ -1103,6 +1115,28 @@ const SettingsScreen: React.FC = () => { + {/* === Bubble-Anzeige === */} + Chat-Bubbles + + + + System-Hints in Bubbles anzeigen + + Wenn aktiviert: GPS-Position, Barge-In-Hinweise und andere + System-Praefixe in eckigen Klammern bleiben in der User-Bubble + sichtbar (Debug). Standardmaessig versteckt — Brain bekommt sie + trotzdem, sie sind nur fuer dich nicht relevant. + + + + + + {/* === Hintergrund-Modus === */} Hintergrund-Modus