diff --git a/packages/ui/src/components/diff-viewer.tsx b/packages/ui/src/components/diff-viewer.tsx
index ab871fef..79f1af18 100644
--- a/packages/ui/src/components/diff-viewer.tsx
+++ b/packages/ui/src/components/diff-viewer.tsx
@@ -1,6 +1,7 @@
import { createMemo, Show, createEffect, onCleanup } from "solid-js"
import { DiffView, DiffModeEnum } from "@git-diff-view/solid"
import type { DiffHighlighterLang } from "@git-diff-view/core"
+import { ErrorBoundary } from "solid-js"
import { getLanguageFromPath } from "../lib/markdown"
import { normalizeDiffText } from "../lib/diff-utils"
import { setCacheEntry } from "../lib/global-cache"
@@ -154,14 +155,19 @@ export function ToolCallDiffViewer(props: ToolCallDiffViewerProps) {
fallback={
{props.diffText}}
>
{(data) => (
-
+ {
+ console.warn("Failed to render diff view", error)
+ return {props.diffText}
+ }}>
+
+
)}
diff --git a/packages/ui/src/components/message-stream-v2.tsx b/packages/ui/src/components/message-stream-v2.tsx
index 2ccd31e6..f65eabb8 100644
--- a/packages/ui/src/components/message-stream-v2.tsx
+++ b/packages/ui/src/components/message-stream-v2.tsx
@@ -838,106 +838,14 @@ export default function MessageStreamV2(props: MessageStreamV2Props) {
{(block) => (
-
-
- {(item) => (
-
-
-
-
-
- {(() => {
- const toolItem = item as ToolDisplayItem
- const toolState = toolItem.toolPart.state as ToolState | undefined
- const hasToolState =
- Boolean(toolState) &&
- (isToolStateRunning(toolState) || isToolStateCompleted(toolState) || isToolStateError(toolState))
- const taskSessionId = hasToolState ? extractTaskSessionId(toolState) : ""
- const taskLocation = taskSessionId ? findTaskSessionLocation(taskSessionId) : null
- const handleGoToTaskSession = (event: MouseEvent) => {
- event.preventDefault()
- event.stopPropagation()
- if (!taskLocation) return
- navigateToTaskSession(taskLocation)
-}
-
-
-
- return (
-
-
-
-
- )
- })()}
-
-
-
-
-
-
-
-
-
-
-
- )}
-
-
+
)}
@@ -974,6 +882,117 @@ export default function MessageStreamV2(props: MessageStreamV2Props) {
)
}
+interface MessageBlockProps {
+ block: MessageDisplayBlock
+ instanceId: string
+ sessionId: string
+ showUsagePreference: () => boolean
+ onRevert?: (messageId: string) => void
+ onFork?: (messageId?: string) => void
+}
+
+function MessageBlock(props: MessageBlockProps) {
+ return (
+
+
+ {(item) => (
+
+
+
+
+
+ {(() => {
+ const toolItem = item as ToolDisplayItem
+ const toolState = toolItem.toolPart.state as ToolState | undefined
+ const hasToolState =
+ Boolean(toolState) && (isToolStateRunning(toolState) || isToolStateCompleted(toolState) || isToolStateError(toolState))
+ const taskSessionId = hasToolState ? extractTaskSessionId(toolState) : ""
+ const taskLocation = taskSessionId ? findTaskSessionLocation(taskSessionId) : null
+ const handleGoToTaskSession = (event: MouseEvent) => {
+ event.preventDefault()
+ event.stopPropagation()
+ if (!taskLocation) return
+ navigateToTaskSession(taskLocation)
+ }
+
+ return (
+
+
+
+
+ )
+ })()}
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+
+ )
+}
+
interface StepCardProps {
kind: "start" | "finish"
part: ClientPart