From 3bd3904902c415faae18ba3e690f77c031f1a436 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Wed, 4 Mar 2026 11:21:44 +0530 Subject: [PATCH] refine tui subagent status feedback --- .../src/cli/cmd/tui/routes/session/index.tsx | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 56e6b46cab..dac64faadf 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -146,15 +146,19 @@ export function Session() { const activeSubagents = createMemo(() => childSessions().flatMap((item) => { const status = sync.data.session_status?.[item.id] - if (status?.type === "busy" || status?.type === "retry") { - return [ - { - session: item, - status, - }, - ] - } - return [] + if (status?.type !== "busy" && status?.type !== "retry") return [] + const count = (sync.data.message[item.id] ?? []) + .flatMap((message) => sync.data.part[message.id] ?? []) + .filter( + (part) => part.type === "tool" && (part.state.status === "completed" || part.state.status === "error"), + ).length + return [ + { + session: item, + status, + count, + }, + ] }), ) @@ -1143,7 +1147,7 @@ export function Session() { Subagents {activeSubagents().length} running · {keybind.print("session_child_cycle")} open - + {(item) => ( - ↳ {Locale.truncate(item.session.title, 42)} + ↳ {Locale.truncate(item.session.title, 36)} · {item.count} toolcalls )} @@ -1961,10 +1965,29 @@ function Task(props: ToolProps) { } }) const childRunning = createMemo(() => status()?.type === "busy" || status()?.type === "retry") + const latest = createMemo(() => { + const user = msgs().findLast((msg) => msg.role === "user") + const assistant = msgs().findLast((msg) => msg.role === "assistant") + return { + user, + assistant, + } + }) + const terminal = createMemo(() => { + const assistant = latest().assistant + if (!assistant) return false + const user = latest().user + if (user && user.id > assistant.id) return false + if (assistant.error) return true + return !!assistant.finish && !["tool-calls", "unknown"].includes(assistant.finish) + }) const backgroundRunning = createMemo(() => background() && childRunning()) - const failed = createMemo(() => { - if (!background() || childRunning()) return false - return !!msgs().findLast((msg) => msg.role === "assistant")?.error + const failed = createMemo(() => !!background() && terminal() && !!latest().assistant?.error) + const statusLabel = createMemo(() => { + if (backgroundRunning()) return "running in background" + if (!terminal()) return "background task pending sync" + if (failed()) return "background task failed" + return "background task finished" }) const isRunning = createMemo(() => props.part.state.status === "running" || childRunning()) const toolLabel = createMemo(() => `${childRunning() ? counts().done : counts().all} toolcalls`) @@ -1988,12 +2011,7 @@ function Task(props: ToolProps) { - ↳{" "} - {backgroundRunning() - ? "running in background" - : failed() - ? "background task failed" - : "background task finished"} + ↳ {statusLabel()}