From d097cc806508c6bdcfd3d9332a781d688c313ff4 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Fri, 3 Jul 2026 15:10:25 -0500 Subject: [PATCH] feat(tui): render execute child calls on v2 (#35231) --- packages/tui/src/routes/session/index.tsx | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/packages/tui/src/routes/session/index.tsx b/packages/tui/src/routes/session/index.tsx index d406fe664e8..b0f337c2d40 100644 --- a/packages/tui/src/routes/session/index.tsx +++ b/packages/tui/src/routes/session/index.tsx @@ -1810,6 +1810,9 @@ function ToolPart(props: { part: SessionMessageAssistantTool }) { + + + @@ -2296,6 +2299,65 @@ export function formatCompletedSubagentDetail(toolcalls: number, duration: strin return `${formatSubagentToolcalls(toolcalls)} · ${duration}` } +type ExecuteCall = { tool: string; status: "running" | "completed" | "error"; input?: Record } + +function executeCalls(value: unknown): ExecuteCall[] { + if (!Array.isArray(value)) return [] + return value.flatMap((call) => { + const item = recordValue(call) + const tool = stringValue(item?.tool) + const status = stringValue(item?.status) + if (!tool || !status || !["running", "completed", "error"].includes(status)) return [] + return [{ tool, status: status as ExecuteCall["status"], input: recordValue(item?.input) }] + }) +} + +function Execute(props: ToolProps) { + const ctx = use() + const { theme } = useTheme() + const isLoading = createMemo(() => props.part.state.status === "pending" || props.part.state.status === "running") + const calls = createMemo(() => executeCalls(props.metadata.toolCalls)) + const output = createMemo(() => stripAnsi(props.output?.trim() ?? "")) + const hasRuntimeError = createMemo(() => props.metadata.error === true) + const outputPreview = createMemo(() => collapseToolOutput(output(), 4, 4 * Math.max(20, ctx.width - 6)).output) + const showOutput = createMemo(() => output() && hasRuntimeError()) + const content = createMemo(() => { + const lines = ["execute"] + for (const call of calls()) { + const args = input(call.input ?? {}) + lines.push(`↳ ${call.tool}${args ? ` ${args}` : ""}${call.status === "error" ? " (failed)" : ""}`) + } + return lines.join("\n") + }) + + return ( + <> + + {content()} + + + + + {(line, index) => ( + + {index() === 0 ? "↳ " : " "} + {line} + + )} + + + + + ) +} + function Edit(props: ToolProps) { const ctx = use() const { theme, syntax } = useTheme() @@ -2571,6 +2633,7 @@ const toolDisplays = new Set([ "write", "edit", "subagent", + "execute", "apply_patch", "todowrite", "question",