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(); + }); });