mirror of
https://github.com/coder/coder.git
synced 2026-06-03 13:08:25 +00:00
012a0497ce
## Problem Two bugs in the agents chat flow: 1. **Optimistic rendering glitch**: When sending a message while the agent is busy, a fake message with a negative ID appears in the timeline, then gets rolled back to the queued state. This causes a jarring flash. 2. **Auto-promoted messages not appearing**: When the server auto-promotes a queued message after finishing a task, the promoted user message doesn't show up in the timeline until the LLM finishes its response. ## Root Causes **Bug 1**: The optimistic rendering system injected placeholder messages with `id: -Date.now()` into the store. When the server responded with `queued: true`, the optimistic message was rolled back — but the user had already seen it flash in the timeline. **Bug 2**: In `processChat`'s deferred cleanup, the auto-promoted message was published via `publishEvent()`, which only delivers to local in-process stream subscribers. The SSE subscriber goroutine only forwards `message_part` events from the local channel — it ignores `message` events. Durable events reach the SSE client via pubsub → DB read, but `publishEvent` doesn't trigger a pubsub notification. The explicit `PromoteQueued` endpoint correctly used `publishMessage()` (which does both), but the auto-promote path did not. ## Changes ### Frontend (`site/`) - **AgentDetail.tsx**: Remove optimistic message injection from send and edit flows. Instead, use the `CreateChatMessageResponse.message` from the POST response to insert the real server message into the store immediately. - **ChatContext.ts**: Remove the negative-ID cleanup logic from `upsertDurableMessage` that stripped optimistic placeholders when real messages arrived. - **chatStore.test.ts**: Remove 2 tests for negative-ID optimistic message behavior. ### Backend (`coderd/chatd/`) - **chatd.go**: In `processChat` cleanup, replace `publishEvent()` with `publishMessage()` for auto-promoted messages. This ensures the pubsub notification (`AfterMessageID`) is sent, so SSE subscribers read the new message from the DB immediately.