From a009ae4dfa7d46b838388e8e9b13abf1b52ae646 Mon Sep 17 00:00:00 2001 From: murashit Date: Fri, 29 May 2026 20:05:02 +0900 Subject: [PATCH] Focus agent live summaries on running agents --- src/features/chat/display/agent.ts | 28 ++++++------------- .../chat/display/display-model.test.ts | 18 ++++++------ .../features/chat/ui/message-stream.test.tsx | 5 ++-- 3 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/features/chat/display/agent.ts b/src/features/chat/display/agent.ts index d84c57e4..7f8901f1 100644 --- a/src/features/chat/display/agent.ts +++ b/src/features/chat/display/agent.ts @@ -5,7 +5,6 @@ import { agentActivitySummaryLabel, agentMessagePreview } from "./labels"; import { classifyExecutionState } from "./state"; const ACTIVE_AGENT_PREVIEW_LIMIT = 96; -const ACTIVE_AGENT_PREVIEW_COUNT = 3; type AgentRunState = "running" | "completed" | "failed"; type CollabAgentToolCallItem = Extract; @@ -60,13 +59,14 @@ export function activeAgentRunSummary(items: readonly DisplayItem[], activeTurnI if (summary.running === 0 && summary.failed === 0) return null; - const visibleAgents = agents.sort(compareActiveAgentStates).slice(0, ACTIVE_AGENT_PREVIEW_COUNT); - summary.agents = visibleAgents.map((agent) => ({ - threadId: agent.threadId, - status: agent.status, - messagePreview: agentMessagePreview(agent.message, ACTIVE_AGENT_PREVIEW_LIMIT), - })); - summary.additionalAgents = Math.max(0, agents.length - visibleAgents.length); + summary.agents = agents + .filter((agent) => agentRunState(agent.status) === "running") + .sort((a, b) => a.threadId.localeCompare(b.threadId)) + .map((agent) => ({ + threadId: agent.threadId, + status: agent.status, + messagePreview: agentMessagePreview(agent.message, ACTIVE_AGENT_PREVIEW_LIMIT), + })); return summary; } @@ -96,15 +96,3 @@ function collabAgentExecutionState(status: string, receiverThreadIds: string[], function agentRunState(status: string): AgentRunState { return classifyExecutionState({ status }) ?? "running"; } - -function compareActiveAgentStates(a: AgentStateDisplay, b: AgentStateDisplay): number { - const stateDiff = agentRunStatePriority(agentRunState(a.status)) - agentRunStatePriority(agentRunState(b.status)); - if (stateDiff !== 0) return stateDiff; - return a.threadId.localeCompare(b.threadId); -} - -function agentRunStatePriority(state: AgentRunState): number { - if (state === "failed") return 0; - if (state === "running") return 1; - return 2; -} diff --git a/tests/features/chat/display/display-model.test.ts b/tests/features/chat/display/display-model.test.ts index e333484f..bb2fc047 100644 --- a/tests/features/chat/display/display-model.test.ts +++ b/tests/features/chat/display/display-model.test.ts @@ -1068,11 +1068,7 @@ describe("display block grouping keeps work logs subordinate to conversation mes running: 1, completed: 1, failed: 1, - agents: [ - { threadId: "failed", status: "errored", messagePreview: null }, - { threadId: "running", status: "running", messagePreview: null }, - { threadId: "done", status: "completed", messagePreview: null }, - ], + agents: [{ threadId: "running", status: "running", messagePreview: null }], additionalAgents: 0, }); expect(activeAgentRunSummary(items, null)).toBeNull(); @@ -1104,7 +1100,7 @@ describe("display block grouping keeps work logs subordinate to conversation mes tool: "wait", status: "running", senderThreadId: "parent", - receiverThreadIds: ["a", "b", "c"], + receiverThreadIds: ["a", "b", "c", "d", "e"], prompt: null, model: null, reasoningEffort: null, @@ -1112,20 +1108,24 @@ describe("display block grouping keeps work logs subordinate to conversation mes { threadId: "a", status: "running", message: "\n Inspecting renderer tests \nmore details" }, { threadId: "b", status: "failed", message: "Could not reproduce" }, { threadId: "c", status: "running", message: null }, + { threadId: "d", status: "running", message: "Reviewing details" }, + { threadId: "e", status: "running", message: "Checking scroll behavior" }, ], }, ]; expect(activeAgentRunSummary(items, "t1")).toMatchObject({ - running: 3, + running: 5, completed: 0, failed: 1, agents: [ - { threadId: "b", status: "failed", messagePreview: "Could not reproduce" }, { threadId: "a", status: "running", messagePreview: "Inspecting renderer tests" }, { threadId: "c", status: "running", messagePreview: null }, + { threadId: "d", status: "running", messagePreview: "Reviewing details" }, + { threadId: "e", status: "running", messagePreview: "Checking scroll behavior" }, + { threadId: "fallback-child", status: "inProgress", messagePreview: null }, ], - additionalAgents: 1, + additionalAgents: 0, }); }); diff --git a/tests/features/chat/ui/message-stream.test.tsx b/tests/features/chat/ui/message-stream.test.tsx index 21c79542..cac64f76 100644 --- a/tests/features/chat/ui/message-stream.test.tsx +++ b/tests/features/chat/ui/message-stream.test.tsx @@ -2159,7 +2159,7 @@ describe("work log renderer decisions", () => { expect(summary.textContent).toContain("agents"); expect(summary.textContent).toContain("Agents 1 running, 1 done"); expect(summary.textContent).toContain("runningrunning: Inspecting renderer"); - expect(summary.textContent).toContain("donecompleted"); + expect(summary.textContent).not.toContain("donecompleted"); }); it("renders the compact live agent summary as a React block", () => { @@ -2300,7 +2300,8 @@ describe("work log renderer decisions", () => { expect(summary.classList.contains("codex-panel__execution--failed")).toBe(true); expect(summary.textContent).toContain("Agents 1 failed, 1 running"); - expect(summary.textContent).toContain("failederrored: Failed"); + expect(summary.textContent).toContain("runningrunning"); + expect(summary.textContent).not.toContain("failederrored: Failed"); }); });