diff --git a/frontend/src/components/AgentPanel.test.tsx b/frontend/src/components/AgentPanel.test.tsx index 324362b..e1d517c 100644 --- a/frontend/src/components/AgentPanel.test.tsx +++ b/frontend/src/components/AgentPanel.test.tsx @@ -70,6 +70,47 @@ describe("AgentPanel active work list removed", () => { }); }); +describe("Running count visibility in header", () => { + beforeAll(() => { + Element.prototype.scrollIntoView = vi.fn(); + }); + + beforeEach(() => { + mockedAgents.getAgentConfig.mockResolvedValue(ROSTER); + mockedAgents.listAgents.mockResolvedValue([]); + }); + + // AC1: When no agents are running, "0 running" is NOT visible + it("does not show running count when no agents are running", async () => { + render(); + + // Wait for roster to load + await screen.findByTestId("roster-badge-coder-1"); + + expect(screen.queryByText(/0 running/)).not.toBeInTheDocument(); + }); + + // AC2: When agents are running, "N running" IS visible + it("shows running count when agents are running", async () => { + const agentList: AgentInfo[] = [ + { + story_id: "99_active", + agent_name: "coder-1", + status: "running", + session_id: null, + worktree_path: "/tmp/wt", + base_branch: "master", + log_session_id: null, + }, + ]; + mockedAgents.listAgents.mockResolvedValue(agentList); + + render(); + + await screen.findByText(/1 running/); + }); +}); + describe("RosterBadge availability state", () => { beforeAll(() => { Element.prototype.scrollIntoView = vi.fn(); diff --git a/frontend/src/components/AgentPanel.tsx b/frontend/src/components/AgentPanel.tsx index 6b9dc50..e1eaff9 100644 --- a/frontend/src/components/AgentPanel.tsx +++ b/frontend/src/components/AgentPanel.tsx @@ -268,16 +268,22 @@ export function AgentPanel({ configVersion = 0 }: AgentPanelProps) { }} >
Agents
-
- {Object.values(agents).filter((a) => a.status === "running").length}{" "} - running -
+ {Object.values(agents).filter((a) => a.status === "running").length > + 0 && ( +
+ { + Object.values(agents).filter((a) => a.status === "running") + .length + }{" "} + running +
+ )} {lastRefresh && (