params.scrollHelpers.registerContainer(element)} onScroll={params.scrollHelpers.handleScroll}>
+
params.scrollHelpers.registerContainer(element, { disableTracking: disableScrollTracking })}
+ onScroll={disableScrollTracking ? undefined : params.scrollHelpers.handleScroll}
+ >
{options.content}
- {params.scrollHelpers.renderSentinel()}
+ {params.scrollHelpers.renderSentinel({ disableTracking: disableScrollTracking })}
)
}
+ const cacheKey = typeof options.cacheKey === "string" && options.cacheKey.length > 0 ? options.cacheKey : undefined
const markdownPart: TextPart = {
- id: params.partId(),
+ id: cacheKey ? `${params.partId()}:${cacheKey}` : params.partId(),
type: "text",
text: options.content,
version: params.partVersion?.(),
@@ -48,7 +54,11 @@ export function createMarkdownContentRenderer(params: {
}
return (
-
params.scrollHelpers.registerContainer(element)} onScroll={params.scrollHelpers.handleScroll}>
+
params.scrollHelpers.registerContainer(element, { disableTracking: disableScrollTracking })}
+ onScroll={disableScrollTracking ? undefined : params.scrollHelpers.handleScroll}
+ >
- {params.scrollHelpers.renderSentinel()}
+ {params.scrollHelpers.renderSentinel({ disableTracking: disableScrollTracking })}
)
}
diff --git a/packages/ui/src/components/tool-call/renderers/task.tsx b/packages/ui/src/components/tool-call/renderers/task.tsx
index 0ac0ecdd..7d448609 100644
--- a/packages/ui/src/components/tool-call/renderers/task.tsx
+++ b/packages/ui/src/components/tool-call/renderers/task.tsx
@@ -1,8 +1,7 @@
import { For, Show, createMemo } from "solid-js"
import type { ToolState } from "@opencode-ai/sdk"
import type { ToolRenderer } from "../types"
-import { getDefaultToolAction, getToolIcon, getToolName, readToolStatePayload } from "../utils"
-import { getTodoTitle } from "./todo"
+import { ensureMarkdownContent, getDefaultToolAction, getToolIcon, getToolName, readToolStatePayload } from "../utils"
import { resolveTitleForTool } from "../tool-title"
interface TaskSummaryItem {
@@ -90,7 +89,29 @@ export const taskRenderer: ToolRenderer = {
const { input } = readToolStatePayload(state)
return describeTaskTitle(input)
},
- renderBody({ toolState, messageVersion, partVersion, scrollHelpers }) {
+ renderBody({ toolState, messageVersion, partVersion, scrollHelpers, renderMarkdown }) {
+ const promptContent = createMemo(() => {
+ const state = toolState()
+ if (!state) return null
+ const { input } = readToolStatePayload(state)
+ const prompt = typeof input.prompt === "string" ? input.prompt : null
+ return ensureMarkdownContent(prompt, undefined, false)
+ })
+
+ const outputContent = createMemo(() => {
+ const state = toolState()
+ if (!state) return null
+ const output = typeof (state as { output?: unknown }).output === "string" ? ((state as { output?: string }).output as string) : null
+ return ensureMarkdownContent(output, undefined, false)
+ })
+
+ const agentLabel = createMemo(() => {
+ const state = toolState()
+ if (!state) return null
+ const { input } = readToolStatePayload(state)
+ return typeof input.subagent_type === "string" ? input.subagent_type : null
+ })
+
const items = createMemo(() => {
// Track the reactive change points so we only recompute when the part/message changes
messageVersion?.()
@@ -114,41 +135,90 @@ export const taskRenderer: ToolRenderer = {
})
})
- if (items().length === 0) return null
-
return (
-
scrollHelpers?.registerContainer(element)}
- onScroll={scrollHelpers ? (event) => scrollHelpers.handleScroll(event as Event & { currentTarget: HTMLDivElement }) : undefined}
- >
-