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",