diff --git a/ui/src/components/task-chat/TaskChatProtocolActivityRow.test.tsx b/ui/src/components/task-chat/TaskChatProtocolActivityRow.test.tsx index 716373aa92e..44414025d64 100644 --- a/ui/src/components/task-chat/TaskChatProtocolActivityRow.test.tsx +++ b/ui/src/components/task-chat/TaskChatProtocolActivityRow.test.tsx @@ -235,6 +235,7 @@ describe("TaskChatProtocolActivityRow", () => { ["info", "informational", "Provider update", "lucide-info"], ["warning", "informational", "Warning", "lucide-triangle-alert"], ["error", "failed", "Error", "lucide-triangle-alert"], + ["error", "informational", "Error", "lucide-triangle-alert"], ["info", "failed", "Error", "lucide-triangle-alert"], ] as const)("renders %s/%s notice severity without hiding its summary", (severity, status, label, icon) => { const summary = "Pi estimates this turn at $0.000617. Billing cost is unverified."; diff --git a/ui/src/components/task-chat/TaskChatProtocolActivityRow.tsx b/ui/src/components/task-chat/TaskChatProtocolActivityRow.tsx index ca10ee67cd6..b040c5253b5 100644 --- a/ui/src/components/task-chat/TaskChatProtocolActivityRow.tsx +++ b/ui/src/components/task-chat/TaskChatProtocolActivityRow.tsx @@ -22,6 +22,7 @@ import { protocolActivityIsRunning, protocolActivityLabel, protocolActivityPresentation, + providerNoticeSeverity, } from "./task-chat-activity-presentation"; const COMPACT_RESEARCH_RESULT_LIMIT = 5; @@ -281,6 +282,7 @@ export function TaskChatProtocolActivityRow({ item }: { item: TaskChatProtocolIt if (!presentation) return null; if (item.surface === "provider_activity" && item.family === "provider_notice") { const NoticeIcon = presentation.icon; + const severity = providerNoticeSeverity(item); const summary = item.summary ?? item.details.find((entry) => entry.label === "Summary")?.value ?? "The provider reported a notice without a message."; @@ -288,7 +290,7 @@ export function TaskChatProtocolActivityRow({ item }: { item: TaskChatProtocolIt
{summary}
{item.details.some(detail => detail.label !== "Summary") ? ( diff --git a/ui/src/components/task-chat/completed-activity-summary.test.ts b/ui/src/components/task-chat/completed-activity-summary.test.ts index 3c22f601cde..b4493e85b87 100644 --- a/ui/src/components/task-chat/completed-activity-summary.test.ts +++ b/ui/src/components/task-chat/completed-activity-summary.test.ts @@ -173,4 +173,17 @@ describe("completedActivitySummary", () => { }]).icon).toBe(AlertTriangle); }); + it("groups distinct notices and keeps a later error visible beside actual work", () => { + const notices = ["info", "info", "warning", "error"].map((severity, index) => ({ + ...provider("provider_notice", "informational"), + id: `notice-${index}`, + summary: `Distinct provider message ${index}`, + details: [{ label: "Severity", value: severity }], + })); + const result = completedActivitySummary([tool("bash"), ...notices]); + expect(result.label).toBe("Provider error reported, ran commands"); + expect(result.fullLabel).toBe(result.label); + expect(result.label).not.toContain("Distinct provider message"); + }); + }); diff --git a/ui/src/components/task-chat/completed-activity-summary.ts b/ui/src/components/task-chat/completed-activity-summary.ts index d2223dbb4ed..776faabbfb3 100644 --- a/ui/src/components/task-chat/completed-activity-summary.ts +++ b/ui/src/components/task-chat/completed-activity-summary.ts @@ -5,7 +5,7 @@ import { type ToolFamily, type ToolIcon, } from "./tool-taxonomy"; -import { protocolActivityPresentation } from "./task-chat-activity-presentation"; +import { protocolActivityPresentation, providerNoticeSeverity } from "./task-chat-activity-presentation"; type Activity = TaskChatActivityPhaseItem["items"][number]; const labels: Record