feat(chat): System-Hints in Bubbles ausblenden (Toggle in Settings)
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) <noreply@anthropic.com>
This commit is contained in:
@@ -149,6 +149,22 @@ const MAX_THOUGHTS = 500;
|
|||||||
// im Gespraechsmodus bei sehr vielen Nachrichten.
|
// im Gespraechsmodus bei sehr vielen Nachrichten.
|
||||||
const capMessages = (msgs: ChatMessage[]): ChatMessage[] =>
|
const capMessages = (msgs: ChatMessage[]): ChatMessage[] =>
|
||||||
msgs.length > MAX_MEMORY_MESSAGES ? msgs.slice(-MAX_MEMORY_MESSAGES) : msgs;
|
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 DEFAULT_ATTACHMENT_DIR = `${RNFS.DocumentDirectoryPath}/chat_attachments`;
|
||||||
const STORAGE_PATH_KEY = 'aria_attachment_storage_path';
|
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)
|
// Gerätelokale TTS-Config: globaler Toggle (aus Settings) + temporäres Muten (Mund-Button)
|
||||||
const [ttsDeviceEnabled, setTtsDeviceEnabled] = useState(true);
|
const [ttsDeviceEnabled, setTtsDeviceEnabled] = useState(true);
|
||||||
const [ttsMuted, setTtsMuted] = useState(false);
|
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)
|
// Gerätelokale XTTS-Voice-Wahl (bevorzugt gegenueber dem globalen Default)
|
||||||
const localXttsVoiceRef = useRef<string>('');
|
const localXttsVoiceRef = useRef<string>('');
|
||||||
// Geraetelokale TTS-Wiedergabegeschwindigkeit (speed-Param an F5-TTS)
|
// Geraetelokale TTS-Wiedergabegeschwindigkeit (speed-Param an F5-TTS)
|
||||||
@@ -446,6 +468,8 @@ const ChatScreen: React.FC = () => {
|
|||||||
ttsSpeedRef.current = await loadTtsSpeed();
|
ttsSpeedRef.current = await loadTtsSpeed();
|
||||||
const gps = await AsyncStorage.getItem('aria_gps_enabled');
|
const gps = await AsyncStorage.getItem('aria_gps_enabled');
|
||||||
setGpsEnabled(gps === 'true');
|
setGpsEnabled(gps === 'true');
|
||||||
|
const hints = await AsyncStorage.getItem('aria_show_hints');
|
||||||
|
setShowSystemHints(hints === 'true'); // default false
|
||||||
};
|
};
|
||||||
loadSettings();
|
loadSettings();
|
||||||
const interval = setInterval(loadSettings, 2000);
|
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) */}
|
{/* 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)) && (
|
{!(item.text === 'Anhang empfangen' && item.attachments?.some(a => a.type === 'image' && a.uri)) && (
|
||||||
<MessageText
|
<MessageText
|
||||||
text={item.text}
|
text={showSystemHints ? item.text : stripSystemHints(item.text)}
|
||||||
style={[styles.messageText, isUser ? styles.userText : styles.ariaText]}
|
style={[styles.messageText, isUser ? styles.userText : styles.ariaText]}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ const SettingsScreen: React.FC = () => {
|
|||||||
const [gpsEnabled, setGpsEnabled] = useState(false);
|
const [gpsEnabled, setGpsEnabled] = useState(false);
|
||||||
const [gpsTracking, setGpsTracking] = useState(gpsTrackingService.isActive());
|
const [gpsTracking, setGpsTracking] = useState(gpsTrackingService.isActive());
|
||||||
const [backgroundMode, setBackgroundMode] = useState(true); // Default an
|
const [backgroundMode, setBackgroundMode] = useState(true); // Default an
|
||||||
|
const [showSystemHints, setShowSystemHints] = useState(false); // Default aus
|
||||||
const [scannerVisible, setScannerVisible] = useState(false);
|
const [scannerVisible, setScannerVisible] = useState(false);
|
||||||
const [logTab, setLogTab] = useState<LogTab>('live');
|
const [logTab, setLogTab] = useState<LogTab>('live');
|
||||||
const [logs, setLogs] = useState<LogEntry[]>([]);
|
const [logs, setLogs] = useState<LogEntry[]>([]);
|
||||||
@@ -202,6 +203,10 @@ const SettingsScreen: React.FC = () => {
|
|||||||
// Default ist an — nur explicit 'false' deaktiviert
|
// Default ist an — nur explicit 'false' deaktiviert
|
||||||
setBackgroundMode(saved !== 'false');
|
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
|
// gpsTrackingService status syncen + auf Aenderungen lauschen
|
||||||
setGpsTracking(gpsTrackingService.isActive());
|
setGpsTracking(gpsTrackingService.isActive());
|
||||||
const offGps = gpsTrackingService.onChange(setGpsTracking);
|
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 ---
|
// --- XTTS Voice ---
|
||||||
|
|
||||||
const selectVoice = useCallback((voiceName: string) => {
|
const selectVoice = useCallback((voiceName: string) => {
|
||||||
@@ -1103,6 +1115,28 @@ const SettingsScreen: React.FC = () => {
|
|||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
|
{/* === Bubble-Anzeige === */}
|
||||||
|
<Text style={styles.sectionTitle}>Chat-Bubbles</Text>
|
||||||
|
<View style={styles.card}>
|
||||||
|
<View style={styles.toggleRow}>
|
||||||
|
<View style={styles.toggleInfo}>
|
||||||
|
<Text style={styles.toggleLabel}>System-Hints in Bubbles anzeigen</Text>
|
||||||
|
<Text style={styles.toggleHint}>
|
||||||
|
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.
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
<Switch
|
||||||
|
value={showSystemHints}
|
||||||
|
onValueChange={handleShowSystemHintsToggle}
|
||||||
|
trackColor={{ false: '#2A2A3E', true: '#0096FF' }}
|
||||||
|
thumbColor={showSystemHints ? '#FFFFFF' : '#666680'}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
{/* === Hintergrund-Modus === */}
|
{/* === Hintergrund-Modus === */}
|
||||||
<Text style={styles.sectionTitle}>Hintergrund-Modus</Text>
|
<Text style={styles.sectionTitle}>Hintergrund-Modus</Text>
|
||||||
<View style={styles.card}>
|
<View style={styles.card}>
|
||||||
|
|||||||
Reference in New Issue
Block a user