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 ( -
-
-
- {TOOL_ICON} - Tool Call - {toolItem.toolPart.tool || "unknown"} -
- - - -
- -
- ) - })()} -
- - - - - - - - - -
- )} -
-
+ )}
@@ -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 ( +
+
+
+ {TOOL_ICON} + Tool Call + {toolItem.toolPart.tool || "unknown"} +
+ + + +
+ +
+ ) + })()} +
+ + + + + + + + + +
+ )} +
+
+ ) +} + interface StepCardProps { kind: "start" | "finish" part: ClientPart