Commit 456bd03
authored
🤖 fix: prevent UI freeze during reasoning stream by bypassing useDeferredValue (#1158)
## Summary
Fixes a bug where stream updates stopped showing in the UI during
thinking blocks, while the token counter continued showing activity.
## Root Cause
The `useDeferredValue` hook can defer rendering indefinitely when React
keeps receiving new work (rapid streaming deltas). The previous logic
only showed immediate messages when the message array length changed:
```tsx
const deferredMessages =
transformedMessages.length !== deferredTransformedMessages.length
? transformedMessages
: deferredTransformedMessages;
```
During reasoning block streaming, the array length stays constant - only
the content changes within existing reasoning messages. This caused
React to keep deferring indefinitely.
## Symptoms
- Token counter kept updating (reads aggregator directly during render,
bypassing React state)
- Message UI appeared frozen (useDeferredValue kept deferring updates)
- Reload fixed it (cleared the deferral queue)
## Fix
Added a `hasActiveStream` check that bypasses deferred rendering when
any message has `isStreaming=true`, ensuring real-time UI updates during
streaming while still benefiting from deferred rendering for idle
scrollback:
```tsx
const hasActiveStream = transformedMessages.some((m) => "isStreaming" in m && m.isStreaming);
const deferredMessages =
hasActiveStream || transformedMessages.length !== deferredTransformedMessages.length
? transformedMessages
: deferredTransformedMessages;
```
---
_Generated with `mux` • Model: `anthropic:claude-opus-4-5` • Thinking:
`medium`_1 parent e277b21 commit 456bd03
1 file changed
+7
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
173 | 173 | | |
174 | 174 | | |
175 | 175 | | |
176 | | - | |
177 | | - | |
178 | | - | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
179 | 182 | | |
180 | | - | |
| 183 | + | |
181 | 184 | | |
182 | 185 | | |
183 | 186 | | |
| |||
0 commit comments