From 6d527b02aa5e0fb4f2f7bdd37a8cb3e4980fb211 Mon Sep 17 00:00:00 2001 From: Dotta Date: Wed, 9 Sep 2026 11:35:06 -0500 Subject: [PATCH] fix(ui): cover both agent lists and preserve detail run action Co-Authored-By: Paperclip --- ui/src/pages/AgentDetail.tsx | 1 - ui/src/pages/Agents.production.tsx | 17 --------------- ui/src/pages/Agents.test.tsx | 35 ++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/ui/src/pages/AgentDetail.tsx b/ui/src/pages/AgentDetail.tsx index f9d92dabe5..0d09353efd 100644 --- a/ui/src/pages/AgentDetail.tsx +++ b/ui/src/pages/AgentDetail.tsx @@ -1264,7 +1264,6 @@ export function AgentDetail() { agent={agent} companyId={resolvedCompanyId} assignLabel="Assign Task" - showRun={false} showStatus={false} canRunWithProviderTrace={canUseProviderTrace} actionsDisabled={agentAction.isPending} diff --git a/ui/src/pages/Agents.production.tsx b/ui/src/pages/Agents.production.tsx index 8e519f538b..7ba12ed9e4 100644 --- a/ui/src/pages/Agents.production.tsx +++ b/ui/src/pages/Agents.production.tsx @@ -13,7 +13,6 @@ import { useSidebar } from "../context/SidebarContext"; import { queryKeys } from "../lib/queryKeys"; import { isPlatformManagedEnvironment } from "../lib/managed-sandbox-environment"; import { AgentStatusBadge, AgentStatusCapsule } from "../components/StatusBadge"; -import { AgentActionButtons } from "../components/AgentActionButtons"; import { MembershipAction } from "../components/MembershipAction"; import { StarToggle } from "../components/StarToggle"; import { EntityRow } from "../components/EntityRow"; @@ -442,22 +441,6 @@ export function Agents() { - {/* Row actions mirror the agent detail page; stop the click - from bubbling to the row link so buttons don't navigate. - Hidden on mobile so the agent name keeps room to render. */} -
{ - e.preventDefault(); - e.stopPropagation(); - }} - > - -
({ @@ -357,6 +358,40 @@ describe("Agents", () => { vi.clearAllMocks(); }); + it.each([ + ["streamlined", Agents], + ["production", ProductionAgents], + ] as const)("omits the action bar from %s agent list rows", async (_mode, AgentList) => { + mockAgentsApi.list.mockResolvedValue([ + makeAgent({ name: "Alpha", status: "active" }), + makeAgent({ id: "agent-paused", name: "Paused agent", status: "paused" }), + ]); + root = createRoot(container); + await act(async () => { + root!.render( + + + + + , + ); + }); + await flushReact(); + await flushReact(); + const listToggle = container.querySelector('button[aria-label="List view"]'); + await act(async () => { listToggle?.click(); }); + await flushReact(); + + for (const name of ["Alpha", "Paused agent"]) { + const row = findAgentRow(container, name); + expect(row).not.toBeNull(); + expect(row?.getAttribute("href")).toMatch(/^\/agents\//); + expect(row?.querySelector('button[aria-label^="Open actions for"]')).toBeNull(); + const buttons = Array.from(row?.querySelectorAll("button") ?? []).map((button) => button.textContent); + expect(buttons).not.toEqual(expect.arrayContaining([expect.stringMatching(/Assign Task|Run Heartbeat|Run with provider trace|Pause|Resume/)])); + } + }); + it("shows the configured model beside the adapter on the all agents page", async () => { root = createRoot(container); await act(async () => {