From 31d9e8d5825c4c2264bcf5017072dfd3a28aefb4 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Fri, 7 Aug 2026 14:53:05 +0200 Subject: [PATCH] fix: prevent infinite render loop in assistant telemetry RequestTelemetry derived thread message metadata inside the useAuiState selector with messages.map(), returning a new array on every render. useSyncExternalStore treats the new reference as a changed snapshot, causing an infinite re-render loop (React error #185) while an assistant message streams. Select the stable messages reference and memoize the metadata derivation instead. --- apps/nextjs/src/components/assistant/assistant-panel.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/nextjs/src/components/assistant/assistant-panel.tsx b/apps/nextjs/src/components/assistant/assistant-panel.tsx index 443ceea1e..e7efa70a7 100644 --- a/apps/nextjs/src/components/assistant/assistant-panel.tsx +++ b/apps/nextjs/src/components/assistant/assistant-panel.tsx @@ -923,7 +923,8 @@ const RequestTelemetry = () => { const metadata = useAuiState((state) => state.message.metadata); const messageId = useAuiState((state) => state.message.id); const threadId = useAuiState((state) => state.threadListItem.remoteId); - const threadMessageMetadata = useAuiState((state) => state.thread.messages.map((message) => message.metadata)); + const threadMessages = useAuiState((state) => state.thread.messages); + const threadMessageMetadata = useMemo(() => threadMessages.map((message) => message.metadata), [threadMessages]); const persistedTelemetry = getAssistantTelemetry(metadata); const persistedUsage = getAssistantUsage(metadata); const generationQuery = clientApi.assistant.getGenerationTelemetry.useQuery(