mirror of
https://github.com/coder/coder.git
synced 2026-06-03 13:08:25 +00:00
5b1cf4a6a3
## Problem There is a race condition in the chat stream reconnect path. When a client connects (or reconnects) to `/stream`, sometimes they only see a `status: running` event but never receive any `message_part` events — the stream appears stuck. ## Root Cause In `processChat`, the sequence is: 1. `publishStatus(running)` — broadcasts `status: running` to all subscribers and via pubsub. 2. `runChat()` is called. 3. Inside `runChat`, there's significant setup work (model resolution, DB queries, title generation, prompt building, instruction resolution). 4. Only **after** all that setup does `runChat` set `buffering = true` on the stream state. If a client connects to `/stream` between steps 1 and 4: - `Subscribe()` reads `chat.Status == running` from the DB, so it includes `status: running` in the snapshot. - But `buffering` is still `false`, so `subscribeToStream` returns an **empty** local snapshot (no message_parts). - `publishToStream` **drops** all `message_part` events when `buffering` is false. - Result: client sees `running` but never gets any streaming content. ## Fix Move the `buffering = true` setup (and its deferred cleanup) from `runChat` into `processChat`, right before `publishStatus(running)`. This guarantees the buffer is active before any subscriber can observe `status: running`, so: - The snapshot always includes any in-flight `message_part` events. - `publishToStream` never drops parts because buffering is already on.