diff --git a/packages/tui/src/routes/session/index.tsx b/packages/tui/src/routes/session/index.tsx index 61f0328875..72103a027d 100644 --- a/packages/tui/src/routes/session/index.tsx +++ b/packages/tui/src/routes/session/index.tsx @@ -1719,18 +1719,23 @@ function ToolPart(props: { part: SessionMessageAssistantTool }) { const ctx = use() const data = useData() const display = createMemo(() => toolDisplay(props.part.name)) - const runningShell = createMemo( - () => { - if (display() !== "shell" || props.part.state.status === "pending") return false + const activeBackgroundWork = createMemo(() => { + if (props.part.state.status === "pending") return false + if (display() === "shell") { const shellID = stringValue(props.part.state.structured.shellID) return Boolean(shellID && data.shell.get(shellID)) - }, - ) + } + if (display() === "subagent") { + const sessionID = stringValue(props.part.state.structured.sessionID) ?? stringValue(props.part.state.structured.sessionId) + return Boolean(sessionID && data.session.status(sessionID) === "running") + } + return false + }) // Hide tool if showDetails is false and tool completed successfully const shouldHide = createMemo(() => { if (ctx.showDetails()) return false - if (runningShell()) return false + if (activeBackgroundWork()) return false if (props.part.state.status !== "completed") return false if (display() === "shell") return false return true @@ -1755,9 +1760,6 @@ function ToolPart(props: { part: SessionMessageAssistantTool }) { get part() { return props.part }, - get runningShell() { - return runningShell() - }, } return ( @@ -1788,7 +1790,7 @@ function ToolPart(props: { part: SessionMessageAssistantTool }) { - + @@ -1816,7 +1818,6 @@ type ToolProps = { tool: string output?: string part: SessionMessageAssistantTool - runningShell?: boolean } function GenericTool(props: ToolProps) { const { theme } = useTheme() @@ -2062,7 +2063,11 @@ function Shell(props: ToolProps) { return request?.source?.type === "tool" && request.source.callID === props.part.id }) const color = createMemo(() => (permission() ? theme.warning : theme.text)) - const isRunning = createMemo(() => props.part.state.status === "running" || props.runningShell === true) + const isRunning = createMemo(() => { + if (props.part.state.status === "running") return true + const shellID = stringValue(props.metadata.shellID) + return Boolean(shellID && data.shell.get(shellID)) + }) const command = createMemo(() => stringValue(props.input.command)) const output = createMemo(() => { if (props.part.state.status === "pending") return "" @@ -2225,15 +2230,20 @@ function WebSearch(props: ToolProps) { ) } -function Task(props: ToolProps) { +function Subagent(props: ToolProps) { const { navigate } = useRoute() + const data = useData() const sessionID = createMemo(() => stringValue(props.metadata.sessionID) ?? stringValue(props.metadata.sessionId)) const description = createMemo(() => stringValue(props.input.description)) + const isRunning = createMemo(() => { + const id = sessionID() + return props.part.state.status === "running" || Boolean(id && data.session.status(id) === "running") + }) return (