From 607c25b07e4c96cd739f4a4d860ab082f1fd079a Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Sat, 28 Feb 2026 16:29:42 +0000 Subject: [PATCH] fix(site): remove optimistic message when real server message arrives on agents page (#22432) --- .../AgentsPage/AgentDetail/ChatContext.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/site/src/pages/AgentsPage/AgentDetail/ChatContext.ts b/site/src/pages/AgentsPage/AgentDetail/ChatContext.ts index 1b6b765e34..b5ed72e45b 100644 --- a/site/src/pages/AgentsPage/AgentDetail/ChatContext.ts +++ b/site/src/pages/AgentsPage/AgentDetail/ChatContext.ts @@ -236,9 +236,23 @@ const createChatStore = (): ChatStore => { const nextMessagesByID = new Map(state.messagesByID); nextMessagesByID.set(message.id, message); - const nextOrderedMessageIDs = isDuplicate - ? state.orderedMessageIDs - : buildOrderedMessageIDs(Array.from(nextMessagesByID.values())); + + // When a real server message (positive ID) arrives, remove any + // optimistic placeholder (negative ID) for the same role so the + // user doesn't momentarily see the message twice. + if (message.id > 0) { + for (const [id, existing] of nextMessagesByID) { + if (id < 0 && existing.role === message.role) { + nextMessagesByID.delete(id); + } + } + } + + const needsReorder = + !isDuplicate || nextMessagesByID.size !== state.messagesByID.size; + const nextOrderedMessageIDs = needsReorder + ? buildOrderedMessageIDs(Array.from(nextMessagesByID.values())) + : state.orderedMessageIDs; setState((current) => ({ ...current,