Matthias Nott
9 days ago 8d1f94e02e927fcb80d170fc85d13a091e5dc304
lib/screens/chat_screen.dart
....@@ -20,6 +20,7 @@
2020 import '../services/audio_service.dart';
2121 import '../services/message_store.dart';
2222 import '../services/mqtt_service.dart';
23
+import '../services/trace_service.dart';
2324 import '../services/navigate_notifier.dart';
2425 import '../services/push_service.dart';
2526 import '../theme/app_theme.dart';
....@@ -43,6 +44,7 @@
4344
4445 Future<void> _chatLog(String msg) async {
4546 debugPrint('[Chat] $msg');
47
+ TraceService.instance.addTrace('Chat', msg);
4648 if (!kDebugMode) return;
4749 try {
4850 final dir = await getApplicationDocumentsDirectory();
....@@ -256,12 +258,25 @@
256258
257259 void _handleMessage(Map<String, dynamic> msg) {
258260 final type = msg['type'] as String?;
261
+ final msgSessionId = msg['sessionId'] as String?;
262
+ final msgSeq = msg['seq'];
263
+
264
+ TraceService.instance.addTrace(
265
+ 'handleMessage processing',
266
+ 'type=$type sessionId=${msgSessionId?.substring(0, msgSessionId.length.clamp(0, 8))} seq=$msgSeq',
267
+ );
259268
260269 // Track sequence numbers for catch_up protocol
261270 final seq = msg['seq'] as int?;
262271 if (seq != null) {
263272 // Dedup: skip messages we've already processed
264
- if (_seenSeqs.contains(seq)) return;
273
+ if (_seenSeqs.contains(seq)) {
274
+ TraceService.instance.addTrace(
275
+ 'handleMessage seq deduped',
276
+ 'seq=$seq type=$type — already seen, dropping',
277
+ );
278
+ return;
279
+ }
265280 _seenSeqs.add(seq);
266281 _seenSeqsList.add(seq);
267282 // Keep bounded at 500 with O(1) FIFO eviction (drop oldest first)
....@@ -491,6 +506,11 @@
491506 msg['text'] as String? ??
492507 '';
493508
509
+ TraceService.instance.addTrace(
510
+ 'handleMessage processing type=text',
511
+ 'sessionId=${sessionId?.substring(0, sessionId.length.clamp(0, 8))}',
512
+ );
513
+
494514 final message = Message.text(
495515 role: MessageRole.assistant,
496516 content: content,
....@@ -500,6 +520,10 @@
500520 final activeId = ref.read(activeSessionIdProvider);
501521 if (sessionId != null && sessionId != activeId) {
502522 // Store message for the other session so it's there when user switches
523
+ TraceService.instance.addTrace(
524
+ 'message stored for session',
525
+ 'sessionId=${sessionId.substring(0, sessionId.length.clamp(0, 8))}, toast shown',
526
+ );
503527 await _storeForSession(sessionId, message);
504528 _incrementUnread(sessionId);
505529 final sessions = ref.read(sessionsProvider);
....@@ -516,6 +540,10 @@
516540 );
517541 }
518542 } else {
543
+ TraceService.instance.addTrace(
544
+ 'message displayed in chat',
545
+ 'sessionId=${sessionId?.substring(0, sessionId.length.clamp(0, 8)) ?? "global"} len=${content.length}',
546
+ );
519547 ref.read(messagesProvider.notifier).addMessage(message);
520548 ref.read(isTypingProvider.notifier).state = false;
521549 _scrollToBottom();