feat(cli): repense la timeline de conversation (tools MCP centrés, progress à droite, tours compacts) — #174 (QA verte)

- ToolProgressCard: tools/MCP/délégations centrés, extrait succinct de la demande inter-agent

- ProgressBubble: progress non-outil alignés à droite, clamp 4 lignes (fourLineClamp)

- TurnMarker: marqueurs turn.started/turn.completed compacts et centrés

- Délégations explicites (« Demande à <target> », « Appel inter-agent ») + libellés FR (Terminé)
This commit is contained in:
2026-08-11 10:28:04 +02:00
parent d9894e0a28
commit ae3c55a13d
2 changed files with 173 additions and 27 deletions

View File

@ -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(() =>