From 798112d632b970ab1649af541a43de6912d2d43a Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Sun, 22 Mar 2026 11:04:17 +0100
Subject: [PATCH] fix: seq-based dedup prevents catch_up from duplicating messages

---
 lib/screens/chat_screen.dart |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart
index cc58220..e60e02a 100644
--- a/lib/screens/chat_screen.dart
+++ b/lib/screens/chat_screen.dart
@@ -42,6 +42,7 @@
   int _lastSeq = 0;
   bool _isCatchingUp = false;
   bool _screenshotForChat = false;
+  final Set<int> _seenSeqs = {};
 
   @override
   void initState() {
@@ -153,9 +154,19 @@
   void _handleMessage(Map<String, dynamic> msg) {
     // Track sequence numbers for catch_up protocol
     final seq = msg['seq'] as int?;
-    if (seq != null && seq > _lastSeq) {
-      _lastSeq = seq;
-      _saveLastSeq();
+    if (seq != null) {
+      // Dedup: skip messages we've already processed
+      if (_seenSeqs.contains(seq)) return;
+      _seenSeqs.add(seq);
+      // Keep set bounded
+      if (_seenSeqs.length > 500) {
+        final sorted = _seenSeqs.toList()..sort();
+        _seenSeqs.removeAll(sorted.sublist(0, sorted.length - 300));
+      }
+      if (seq > _lastSeq) {
+        _lastSeq = seq;
+        _saveLastSeq();
+      }
     }
 
     final type = msg['type'] as String?;

--
Gitblit v1.3.1