summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-06 10:54:54 -0600
committerGitHub <[email protected]>2026-02-06 10:54:54 -0600
commit9497cfdf455a3b57b837ddead1cc6b4b5bf5ff01 (patch)
treea6645ecd1e00a43c712b0ae15574ba163b6a368e /packages/ui/src
parent22353f0169a1570a6d3f16a3509d9f0b66a7853b (diff)
downloadopencode-9497cfdf455a3b57b837ddead1cc6b4b5bf5ff01.tar.gz
opencode-9497cfdf455a3b57b837ddead1cc6b4b5bf5ff01.zip
fix(app): don't rely on metadata.summary in task tool render (#12497)
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/message-part.tsx28
1 files changed, 18 insertions, 10 deletions
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 22aeaa3d5..83847a533 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -876,16 +876,18 @@ ToolRegistry.register({
render(props) {
const data = useData()
const i18n = useI18n()
- const summary = () =>
- (props.metadata.summary ?? []) as { id: string; tool: string; state: { status: string; title?: string } }[]
+ const childSessionId = () => props.metadata.sessionId as string | undefined
+ const childToolParts = createMemo(() => {
+ const sessionId = childSessionId()
+ if (!sessionId) return []
+ return getSessionToolParts(data.store, sessionId)
+ })
const autoScroll = createAutoScroll({
working: () => true,
overflowAnchor: "auto",
})
- const childSessionId = () => props.metadata.sessionId as string | undefined
-
const childPermission = createMemo(() => {
const sessionId = childSessionId()
if (!sessionId) return undefined
@@ -1006,15 +1008,21 @@ ToolRegistry.register({
data-scrollable
>
<div ref={autoScroll.contentRef} data-component="task-tools">
- <For each={summary()}>
+ <For each={childToolParts()}>
{(item) => {
- const info = getToolInfo(item.tool)
+ const info = createMemo(() => getToolInfo(item.tool, item.state.input))
+ const subtitle = createMemo(() => {
+ if (info().subtitle) return info().subtitle
+ if (item.state.status === "completed" || item.state.status === "running") {
+ return item.state.title
+ }
+ })
return (
<div data-slot="task-tool-item">
- <Icon name={info.icon} size="small" />
- <span data-slot="task-tool-title">{info.title}</span>
- <Show when={item.state.title}>
- <span data-slot="task-tool-subtitle">{item.state.title}</span>
+ <Icon name={info().icon} size="small" />
+ <span data-slot="task-tool-title">{info().title}</span>
+ <Show when={subtitle()}>
+ <span data-slot="task-tool-subtitle">{subtitle()}</span>
</Show>
</div>
)