From cdadfde01b28a5eb0f7ed737e7dcd17f8cc163de Mon Sep 17 00:00:00 2001 From: Taylor Ho Date: Thu, 23 Apr 2026 11:15:20 -0700 Subject: [PATCH] fix(ui): prefer failed grouped tool status Signed-off-by: Taylor Ho --- .../src/features/chat/ui/ToolChainCards.tsx | 12 +++--- .../MessageBubbleToolChains.test.tsx | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/ui/goose2/src/features/chat/ui/ToolChainCards.tsx b/ui/goose2/src/features/chat/ui/ToolChainCards.tsx index 9c92fca585..f705edb65a 100644 --- a/ui/goose2/src/features/chat/ui/ToolChainCards.tsx +++ b/ui/goose2/src/features/chat/ui/ToolChainCards.tsx @@ -162,18 +162,18 @@ function getToolGroupTitle(toolItems: ToolChainItem[]): string { } function getToolGroupStatus(toolItems: ToolChainItem[]): ToolCallStatus { - if (toolItems.some((item) => getToolItemStatus(item) === "executing")) { - return "executing"; - } - if (toolItems.some((item) => getToolItemStatus(item) === "pending")) { - return "pending"; - } if (toolItems.some((item) => getToolItemStatus(item) === "error")) { return "error"; } if (toolItems.some((item) => getToolItemStatus(item) === "stopped")) { return "stopped"; } + if (toolItems.some((item) => getToolItemStatus(item) === "executing")) { + return "executing"; + } + if (toolItems.some((item) => getToolItemStatus(item) === "pending")) { + return "pending"; + } return "completed"; } diff --git a/ui/goose2/src/features/chat/ui/__tests__/MessageBubbleToolChains.test.tsx b/ui/goose2/src/features/chat/ui/__tests__/MessageBubbleToolChains.test.tsx index 31c49c42c9..c3d848a129 100644 --- a/ui/goose2/src/features/chat/ui/__tests__/MessageBubbleToolChains.test.tsx +++ b/ui/goose2/src/features/chat/ui/__tests__/MessageBubbleToolChains.test.tsx @@ -168,4 +168,41 @@ describe("MessageBubble tool chains", () => { expect(screen.getByText("Read main.js")).toBeInTheDocument(); }); + + it("shows a failed grouped chain even when another step is still pending", () => { + const msg = assistantMessage([ + { + type: "toolRequest", + id: "tool-1", + chainId: "chain-1", + chainSummary: "working", + name: "Edit main.swift", + arguments: {}, + status: "completed", + }, + { + type: "toolResponse", + id: "tool-1", + chainId: "chain-1", + chainSummary: "working", + name: "Edit main.swift", + result: "permission denied", + isError: true, + }, + { + type: "toolRequest", + id: "tool-2", + chainId: "chain-1", + chainSummary: "working", + name: "Edit README.md", + arguments: {}, + status: "pending", + }, + ]); + + render(); + + expect(screen.getByText("working through 2 steps")).toBeInTheDocument(); + expect(screen.getByText("Error")).toBeInTheDocument(); + }); });