evOo-local/apps/web/e2e/run-steps.spec.ts
cynarAI 5cf9d679b4
Fold a run's step messages behind its latest message (#188)
* Fold a run's step messages behind its latest message

Long tool runs posted every step as its own bubble, so the answer drowned in
narration and a summary written before saving a file appeared twice. Web and
mobile now fold a run's text-only step messages behind one "N steps" line
above the run's latest message. The thread snapshot also stops replaying live
narration that was already posted, which showed steps again after a refresh.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ

* Keep a run's last step visible above a card

A card such as the peer-message receipt has no words of its own, so folding
the narration into it hid everything the bot said. Steps now fold only into
a written answer or the live row; before a card the last step stays visible.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-09 19:32:21 +02:00

25 lines
1.2 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { captureScreenshot, completeOnboarding, signup, waitForChatComposer } from "./helpers";
test("a long run shows its answer with the earlier steps folded", async ({ page }, testInfo) => {
const stamp = Date.now();
await signup(page, `run-steps-${stamp}@rakazo.test`, "password12", "Steps");
await completeOnboarding(page);
await waitForChatComposer(page);
const composer = page.getByRole("combobox", { name: /Message|Nachricht/i });
await composer.fill("Show your steps");
await composer.press("Enter");
const transcript = page.getByTestId("transcript");
await expect(transcript.getByText("Here is the summary.")).toBeVisible({ timeout: 60_000 });
const steps = transcript.getByTestId("run-steps");
await expect(steps).toHaveCount(1);
await expect(transcript.getByText("Opening the page.")).toHaveCount(0);
await captureScreenshot(page, testInfo, "run-steps-folded");
await steps.getByRole("button", { name: "2 steps" }).click();
await expect(steps.getByText("Opening the page.")).toBeVisible();
await expect(steps.getByText("Reading the article.")).toBeVisible();
await captureScreenshot(page, testInfo, "run-steps-open");
});