Skip to content

Commit 041cda9

Browse files
authored
fix(tui): label only detached subagents as background (#37306)
1 parent 2ad6c42 commit 041cda9

2 files changed

Lines changed: 19 additions & 6 deletions

File tree

packages/tui/src/routes/session/index.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2548,10 +2548,8 @@ function WebSearch(props: ToolProps) {
25482548
function Subagent(props: ToolProps) {
25492549
const { navigate } = useRoute()
25502550
const data = useData()
2551-
const input = createMemo(() => (typeof props.part.state.input === "string" ? {} : props.part.state.input))
2552-
const metadata = createMemo(() => (props.part.state.status === "streaming" ? {} : props.part.state.structured))
2553-
const sessionID = createMemo(() => stringValue(metadata().sessionID) ?? stringValue(metadata().sessionId))
2554-
const description = createMemo(() => stringValue(input().description))
2551+
const sessionID = createMemo(() => stringValue(props.metadata.sessionID) ?? stringValue(props.metadata.sessionId))
2552+
const description = createMemo(() => stringValue(props.input.description))
25552553
const isRunning = createMemo(() => {
25562554
const id = sessionID()
25572555
return props.part.state.status === "running" || Boolean(id && data.session.status(id) === "running")
@@ -2569,16 +2567,23 @@ function Subagent(props: ToolProps) {
25692567
if (id) navigate({ type: "session", sessionID: id })
25702568
}}
25712569
status={
2572-
input().background === true || metadata().status === "running" ? (
2570+
isBackgroundSubagent(props.metadata, props.part.state.status) ? (
25732571
<StatusBadge>Background</StatusBadge>
25742572
) : undefined
25752573
}
25762574
>
2577-
{`${Locale.titlecase(stringValue(input().agent) ?? stringValue(input().subagent_type) ?? "General")} Subagent — ${description() ?? "Subagent"}`}
2575+
{`${Locale.titlecase(stringValue(props.input.agent) ?? stringValue(props.input.subagent_type) ?? "General")} Subagent — ${description() ?? "Subagent"}`}
25782576
</InlineTool>
25792577
)
25802578
}
25812579

2580+
export function isBackgroundSubagent(
2581+
metadata: Record<string, unknown>,
2582+
status: SessionMessageAssistantTool["state"]["status"],
2583+
) {
2584+
return status === "completed" && metadata.status === "running"
2585+
}
2586+
25822587
export function formatSubagentRetry(attempt: number, message: string) {
25832588
return `Retrying (attempt ${attempt}) · ${message}`
25842589
}

packages/tui/test/cli/tui/inline-tool-wrap-snapshot.test.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { testRender, type JSX } from "@opentui/solid"
44
import {
55
formatSubagentRetry,
66
InlineToolRow,
7+
isBackgroundSubagent,
78
parseApplyPatchFiles,
89
parseDiagnostics,
910
parseQuestionAnswers,
@@ -201,6 +202,13 @@ describe("TUI inline tool wrapping", () => {
201202
expect(formatSubagentRetry(2, "Rate limited by provider")).toBe("Retrying (attempt 2) · Rate limited by provider")
202203
})
203204

205+
test("labels only detached or async subagents as background", () => {
206+
expect(isBackgroundSubagent({ status: "running" }, "running")).toBeFalse()
207+
expect(isBackgroundSubagent({ status: "running" }, "completed")).toBeTrue()
208+
expect(isBackgroundSubagent({ status: "running" }, "error")).toBeFalse()
209+
expect(isBackgroundSubagent({ status: "completed" }, "completed")).toBeFalse()
210+
})
211+
204212
test("snapshots consecutive grep, glob, and read rows at a narrow width", async () => {
205213
expect(await renderFrame(() => <Fixture />, { width: 72, height: 12 })).toMatchSnapshot()
206214
})

0 commit comments

Comments
 (0)