diff --git a/scripts/check_react_compiler_coverage.ts b/scripts/check_react_compiler_coverage.ts index 07734dd544a..a4430c2f404 100644 --- a/scripts/check_react_compiler_coverage.ts +++ b/scripts/check_react_compiler_coverage.ts @@ -51,8 +51,6 @@ const HOT_COMPONENTS: Record = { * so fixing a component forces its removal here. */ const KNOWN_SKIPPED: ReadonlySet = new Set([ - "src/browser/features/Messages/MessageRenderer.tsx#MessageRenderer", - "src/browser/features/Messages/AssistantMessage.tsx#AssistantMessage", "src/browser/components/ProjectSidebar/ProjectSidebar.tsx#ProjectSidebarInner", "src/browser/components/AppLoader/AppLoader.tsx#UserPreferencesStartupGate", "src/browser/features/RightSidebar/RightSidebar.tsx#RightSidebarComponent", diff --git a/src/browser/features/Messages/AssistantMessage.tsx b/src/browser/features/Messages/AssistantMessage.tsx index 4f45cd63237..89d98c67a5d 100644 --- a/src/browser/features/Messages/AssistantMessage.tsx +++ b/src/browser/features/Messages/AssistantMessage.tsx @@ -31,6 +31,7 @@ import { ModelDisplay } from "./ModelDisplay"; import { ModelFallbackBadge } from "./ModelFallbackBadge"; import { AutoModelRoutingBadge } from "./AutoModelRoutingBadge"; import { TypewriterMarkdown } from "./TypewriterMarkdown"; +import { runWithCatch } from "@/browser/utils/compilerSafeControlFlow"; interface AssistantMessageProps { message: DisplayedMessage & { type: "assistant" }; @@ -100,22 +101,25 @@ export const AssistantMessage: React.FC = ({ return; } - try { - // Response-level forks branch from this assistant turn instead of cloning the entire - // transcript, so users can explore alternatives without carrying over later replies. - const result = await forkWorkspace({ - client: api, - sourceWorkspaceId: workspaceId, - sourceMessageId: message.historyId, - }); + await runWithCatch( + async () => { + // Response-level forks branch from this assistant turn instead of cloning the entire + // transcript, so users can explore alternatives without carrying over later replies. + const result = await forkWorkspace({ + client: api, + sourceWorkspaceId: workspaceId, + sourceMessageId: message.historyId, + }); - if (!result.success) { - forkError.showError(message.historyId, result.error ?? "Failed to fork chat"); + if (!result.success) { + forkError.showError(message.historyId, result.error ?? "Failed to fork chat"); + } + }, + (error) => { + const messageText = error instanceof Error ? error.message : "Failed to fork chat"; + forkError.showError(message.historyId, messageText); } - } catch (error) { - const messageText = error instanceof Error ? error.message : "Failed to fork chat"; - forkError.showError(message.historyId, messageText); - } + ); }; // Scratch chats cannot be forked (the backend rejects it), so hide the diff --git a/src/browser/features/Messages/MessageRenderer.tsx b/src/browser/features/Messages/MessageRenderer.tsx index da8c1daa24d..2e71bd4e276 100644 --- a/src/browser/features/Messages/MessageRenderer.tsx +++ b/src/browser/features/Messages/MessageRenderer.tsx @@ -79,7 +79,7 @@ function getTranscriptQuoteText(message: DisplayedMessage): string | null { // Memoized to prevent unnecessary re-renders when parent (AIView) updates export const MessageRenderer = React.memo( ({ - message, + message: messageProp, className, onEditUserMessage, workspaceId, @@ -90,7 +90,7 @@ export const MessageRenderer = React.memo( taskReportLinking, userMessageNavigation, }) => { - message = useStreamingMessageDelta(workspaceId, message); + const message = useStreamingMessageDelta(workspaceId, messageProp); let renderedMessage: React.ReactNode; // Route based on message type