Skip to content

Commit 72eb0ff

Browse files
authored
🤖 fix: show user messages immediately without deferral (#1041)
## Summary Fixes a UX issue where there was an occasional delay between sending a message and it appearing in the chat window. During this delay, the input was cleared but the user message wasn't visible anywhere. ### Root Cause `useDeferredValue` (added in #1004 to improve streaming performance) was deferring **all** message list updates, including new user messages. This is correct for streaming deltas (where rapid updates benefit from deferral) but wrong for user-initiated messages (where immediate feedback is expected). ### Fix Compare the message counts between the current and deferred values: - **Count differs** (new message added) → Show immediately - **Count same** (content changes in existing messages) → Defer for performance This preserves the streaming optimization while ensuring user messages appear instantly. ### Testing - `make static-check` ✅ - `make test` on WorkspaceStore ✅ _Generated with `mux`_
1 parent e889d20 commit 72eb0ff

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

src/browser/components/AIView.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,15 @@ const AIViewInner: React.FC<AIViewProps> = ({
169169
// during rapid updates (streaming), keeping the UI responsive.
170170
// Must be defined before any early returns to satisfy React Hooks rules.
171171
const mergedMessages = useMemo(() => mergeConsecutiveStreamErrors(messages), [messages]);
172-
const deferredMessages = useDeferredValue(mergedMessages);
172+
const deferredMergedMessages = useDeferredValue(mergedMessages);
173+
174+
// CRITICAL: When message count changes (new message sent/received), show immediately.
175+
// Only defer content changes within existing messages (streaming deltas).
176+
// This ensures user messages appear instantly while keeping streaming performant.
177+
const deferredMessages =
178+
mergedMessages.length !== deferredMergedMessages.length
179+
? mergedMessages
180+
: deferredMergedMessages;
173181

174182
// Get active stream message ID for token counting
175183
const activeStreamMessageId = aggregator?.getActiveStreamMessageId();

0 commit comments

Comments
 (0)