fix(messages): bulletproof dedup in appendMessage — check msg.id before adding
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions

Root cause: appendMessage() had no dedup check, so both send() and polling
could add the same message. Now appendMessage() checks if msg.id already
exists in state.messages[convId] before adding — guaranteed single display.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-03-28 16:46:45 +01:00
parent 720d7a2d7d
commit 643a9cd94a

View File

@ -725,6 +725,11 @@
appendMessage: function (msg) { appendMessage: function (msg) {
var convId = msg.conversation_id; var convId = msg.conversation_id;
if (!state.messages[convId]) state.messages[convId] = []; if (!state.messages[convId]) state.messages[convId] = [];
// Dedup: skip if message with this ID already exists
if (msg.id && state.messages[convId].some(function(m) { return m.id === msg.id; })) {
return; // Already displayed
}
state.messages[convId].push(msg); state.messages[convId].push(msg);
if (convId !== state.currentConversationId) return; if (convId !== state.currentConversationId) return;
@ -1290,10 +1295,8 @@
if (replyPreview) replyPreview.style.display = 'none'; if (replyPreview) replyPreview.style.display = 'none';
Composer.renderAttachments(); Composer.renderAttachments();
// Append the sent message and track it so polling doesn't duplicate // Append the sent message (dedup check inside appendMessage)
ChatView.appendMessage(result); ChatView.appendMessage(result);
if (!state.messages[convId]) state.messages[convId] = [];
state.messages[convId].push(result);
// Update conversation in list // Update conversation in list
ConversationList.updateConversation(convId, { ConversationList.updateConversation(convId, {
@ -1653,7 +1656,6 @@
newMsgs.sort(function (a, b) { return a.id - b.id; }); newMsgs.sort(function (a, b) { return a.id - b.id; });
newMsgs.forEach(function (msg) { newMsgs.forEach(function (msg) {
ChatView.appendMessage(msg); ChatView.appendMessage(msg);
state.messages[convId].push(msg);
}); });
// Update conversation list with the NEWEST message // Update conversation list with the NEWEST message