diff --git a/frontend/src/features/agents/CustomAgentChatView.test.tsx b/frontend/src/features/agents/CustomAgentChatView.test.tsx index 113b1753..6c9e46a3 100644 --- a/frontend/src/features/agents/CustomAgentChatView.test.tsx +++ b/frontend/src/features/agents/CustomAgentChatView.test.tsx @@ -252,6 +252,17 @@ describe("CustomAgentChatView", () => { scrollback: [], })), sendAgentChat: vi.fn(async (_sessionId: string, _prompt: string, onChunk) => { + onChunk({ + kind: "progress", + progress: { + source: "providerNative", + kind: "turn", + stage: "started", + label: "turn.started", + provider: "codex", + nativeEvent: "turn.started", + }, + }); onChunk({ kind: "progress", progress: { @@ -285,6 +296,17 @@ describe("CustomAgentChatView", () => { toolName: "idea_ask_agent", }, }); + onChunk({ + kind: "progress", + progress: { + source: "providerNative", + kind: "turn", + stage: "completed", + label: "turn.completed", + provider: "codex", + nativeEvent: "turn.completed", + }, + }); onChunk({ kind: "final", content: "done" }); }), cancelAgentChat: vi.fn(async () => {}), @@ -326,13 +348,19 @@ describe("CustomAgentChatView", () => { fireEvent.click(screen.getByRole("button", { name: "Envoyer" })); await screen.findByText("Progress"); + expect(screen.getAllByTestId("chat-turn-marker")).toHaveLength(2); + expect(screen.getByText("turn.started")).toBeTruthy(); + expect(screen.getByText("turn.completed")).toBeTruthy(); + expect(screen.getByText("Progress").closest("[data-testid='chat-progress-status']")).toBeTruthy(); expect(screen.getByText("Analyse")).toBeTruthy(); expect(screen.getByText("Lecture du contexte disponible.")).toBeTruthy(); expect(screen.getByText("MCP")).toBeTruthy(); + expect(screen.getByText("MCP").closest("[data-testid='chat-tool-progress']")).toBeTruthy(); expect(screen.getByText("idea_ticket_read")).toBeTruthy(); - expect(screen.getByText("Délégation")).toBeTruthy(); - expect(screen.getByText("target=QA task=Valider le rendu progress")).toBeTruthy(); - await screen.findByText("done"); + expect(screen.getByText("Demande à QA")).toBeTruthy(); + expect(screen.getByText("Demande à QA").closest("[data-testid='chat-tool-progress']")).toBeTruthy(); + expect(screen.getByText("Valider le rendu progress")).toBeTruthy(); + expect((await screen.findAllByText("done")).length).toBeGreaterThan(0); }); it("renders available pre-MCP progress before the first MCP card", async () => { @@ -529,8 +557,9 @@ describe("CustomAgentChatView", () => { }); await screen.findByText("done"); - expect(screen.getAllByText("Délégation")).toHaveLength(2); - expect(screen.getByText("target=QA task=validate")).toBeTruthy(); + expect(screen.getByText("Demande à QA")).toBeTruthy(); + expect(screen.getByText("validate")).toBeTruthy(); + expect(screen.getByText("Appel inter-agent")).toBeTruthy(); expect(screen.getByText("reply delivered")).toBeTruthy(); expect(screen.queryByText("Tool")).toBeNull(); await waitFor(() => diff --git a/frontend/src/features/agents/CustomAgentChatView.tsx b/frontend/src/features/agents/CustomAgentChatView.tsx index 5b8cb14f..44765212 100644 --- a/frontend/src/features/agents/CustomAgentChatView.tsx +++ b/frontend/src/features/agents/CustomAgentChatView.tsx @@ -204,10 +204,6 @@ function isDelegationProgress(progress: ReplyProgress): boolean { return name === "idea_ask_agent" || name === "idea_ask_agents"; } -function isToolLikeProgress(progress: ReplyProgress): boolean { - return progress.kind === "tool" || progress.kind === "mcp" || isDelegationProgress(progress); -} - function progressEntityKey(progress: ReplyProgress): string | null { const name = normalizedProgressToolName(progress); if (!name) return null; @@ -217,7 +213,7 @@ function progressEntityKey(progress: ReplyProgress): string | null { } function progressStageBucket(progress: ReplyProgress): string { - if (!isToolLikeProgress(progress)) return progress.stage; + if (!isCenteredToolProgress(progress)) return progress.stage; if (progress.stage === "started" || progress.stage === "delta") return "started"; if (progress.stage === "completed") return "completed"; return "info"; @@ -255,6 +251,7 @@ function completeRunningProgress(turns: ChatTurn[]): ChatTurn[] { return turns.map((turn) => { if ( turn.role !== "progress" || + turn.progress.kind === "turn" || (turn.progress.stage !== "started" && turn.progress.stage !== "delta") ) { return turn; @@ -1316,9 +1313,9 @@ function ChatBubble({ turn }: { turn: ChatTurn }) { } if (turn.role === "final") { return ( -
{turn.text}
+ {delegation.excerpt} +
+ )} + {delegation && ( ++ {compactToolName(progress)} +
+ )} + {detail && ( ++ {detail} +
+ )} ++
{detail}
)}