diff --git a/apps/web/tests/cordis-tool-round.e2e.ts b/apps/web/tests/cordis-tool-round.e2e.ts index e0ad2d26e1..66bc9c6900 100644 --- a/apps/web/tests/cordis-tool-round.e2e.ts +++ b/apps/web/tests/cordis-tool-round.e2e.ts @@ -107,7 +107,8 @@ describe('web e2e: Cordis tools use the generic row variants', () => { const mountRow = page.locator('[data-tool="cordis_mount"]').filter({ hasText: 'Mount temporary Plugin' }).first() await mountRow.waitFor({ timeout: 10_000 }) - await mountRow.locator('button[aria-expanded]').click() + // The whole summary row is the expand toggle (unified tool-row interaction). + await mountRow.locator('[aria-expanded]').first().click() await expect.poll(() => mountRow.locator('pre.shiki').textContent(), { timeout: 10_000 }) .toContain(MOUNT_CODE) diff --git a/apps/web/tests/navigation-panes.e2e.ts b/apps/web/tests/navigation-panes.e2e.ts index e88cfa8857..d5464af553 100644 --- a/apps/web/tests/navigation-panes.e2e.ts +++ b/apps/web/tests/navigation-panes.e2e.ts @@ -180,11 +180,13 @@ describe('web e2e: navigation & panes over a rich seeded session', () => { await bashRow.waitFor({ timeout: 15_000 }) const frame = page.locator('[style*="grid-template-columns"]').first() expect(await frame.getAttribute('data-details-collapsed')).toBe('true') + // The row click is the card's expand toggle (unified tool-row + // interaction); it must not drive layout geometry either way. await bashRow.click() await expect.poll(() => frame.getAttribute('data-details-collapsed'), { timeout: 5_000 }).toBe('true') // The card's own controls are outside the summary row and must not open - // details either — the terminal card is read in place. - await page.locator('[data-sample="bash-global"] ~ [data-terminal] [class*="_copyButton_"]').first().click() + // details either — the expanded terminal card is read in place. + await page.locator('[data-sample="bash-global"] ~ div [data-terminal] [class*="_copyButton_"]').first().click() await expect.poll(() => frame.getAttribute('data-details-collapsed'), { timeout: 5_000 }).toBe('true') // Read summaries are host-open file links; they also must not open details. const fileLink = page.locator('[data-variant="read"] button').first() @@ -196,10 +198,14 @@ describe('web e2e: navigation & panes over a rich seeded session', () => { it.skipIf(MODE === 'record')('renders the bash row as a terminal card in the real browser', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-navigation-terminal')) await page.getByRole('tab', { name: 'Chat' }).click() - // The card is resident in the keyed bash row (no expand gesture): the - // recorded command's own output sits in the message flow, derived from the - // logged call/result presentations alone. - const card = page.locator('[data-sample="bash-global"] ~ [data-terminal], [data-sample="bash-global"] [data-terminal]').first() + // The card is expand-gated behind the whole-row toggle (the unified + // tool-row interaction): open it if a previous case left it collapsed. + // Expanded, the recorded command's own output sits in the message flow, + // derived from the logged call/result presentations alone. + const bashRow = page.locator('[data-sample="bash-global"]').first() + await bashRow.waitFor({ timeout: 15_000 }) + if (await bashRow.getAttribute('aria-expanded') !== 'true') await bashRow.click() + const card = page.locator('[data-sample="bash-global"] ~ div [data-terminal]').first() await card.waitFor({ timeout: 15_000 }) // Real layout, not jsdom's stub (which computes no geometry at all): // squeeze the output pane below its content width and the line must keep diff --git a/apps/web/tests/snapshots/code-mode-round/ui.expected.md b/apps/web/tests/snapshots/code-mode-round/ui.expected.md index 0282a16f80..1b6396a9cb 100644 --- a/apps/web/tests/snapshots/code-mode-round/ui.expected.md +++ b/apps/web/tests/snapshots/code-mode-round/ui.expected.md @@ -15,13 +15,15 @@ - img - img - text: "Think The user wants me to write a single `run_code` program that:" -- button: +- button "Code Run bash echo and catch missing file read": - img - img -- text: Code Run bash echo and catch missing file read + - text: Code Run bash echo and catch missing file read - img -- text: Bash Echo CODE_ROUND_OK Read -- button "missing.txt" +- text: Bash Echo CODE_ROUND_OK +- 'button "Read Error: cannot read \"{{cwd}}/workspace/missing.txt\": not found"': + - img + - text: "Read Error: cannot read \"{{cwd}}/workspace/missing.txt\": not found" - button "Think The program ran successfully. Let me now reply DONE as instructed.": - img - img diff --git a/apps/web/tests/snapshots/cordis-tool-round/ui.expected.md b/apps/web/tests/snapshots/cordis-tool-round/ui.expected.md index 5b51e47cf4..1aee8fc03f 100644 --- a/apps/web/tests/snapshots/cordis-tool-round/ui.expected.md +++ b/apps/web/tests/snapshots/cordis-tool-round/ui.expected.md @@ -15,27 +15,30 @@ - img - img - text: "Think The user wants me to:" -- button: +- button "Inspect temporary": - img - img -- text: Inspect temporary + - text: Inspect temporary - 'button "Think Good, no temporary plugins running. Now step 2: call cordis_mount with the exact code."': - img - img - text: "Think Good, no temporary plugins running. Now step 2: call cordis_mount with the exact code." -- button [expanded]: +- 'button "Mount temporary Plugin return { name: \"snapshot-noop\", apply(ctx) {} }" [expanded]': - img -- text: Mount temporary Plugin typescript + - text: "Mount temporary Plugin return { name: \"snapshot-noop\", apply(ctx) {} }" +- text: typescript - button "复制" - code: "return { name: \"snapshot-noop\", apply(ctx) {} }" +- text: OUT Temporary Plugin dyn-1 is running (plugin "snapshot-noop"; available until unmounted or DSH restarts). +- button "Inspect" - 'button "Think The id is \"dyn-1\". Now step 3: call cordis_unmount with that id."': - img - img - text: "Think The id is \"dyn-1\". Now step 3: call cordis_unmount with that id." -- button: +- button "Unmount temporary Plugin dyn-1": - img - img -- text: Unmount temporary Plugin dyn-1 + - text: Unmount temporary Plugin dyn-1 - button "Think All three calls succeeded. I should now reply exactly \"CORDIS_UI_DONE\" and stop.": - img - img diff --git a/apps/web/tests/snapshots/fresh-round-trip/ui.expected.md b/apps/web/tests/snapshots/fresh-round-trip/ui.expected.md index 49c7958292..06a9a40367 100644 --- a/apps/web/tests/snapshots/fresh-round-trip/ui.expected.md +++ b/apps/web/tests/snapshots/fresh-round-trip/ui.expected.md @@ -15,10 +15,10 @@ - img - img - text: Think The user wants me to run a simple bash command and reply with "DONE". -- img -- text: Bash Echo the test string 已完成 workspace echo WEB_E2E_OK -- button "复制" -- text: WEB_E2E_OK +- button "Bash Echo the test string": + - img + - img + - text: Bash Echo the test string - button "Think The command executed successfully and output \"WEB_E2E_OK\". I just need to reply with \"DONE\".": - img - img diff --git a/apps/web/tests/snapshots/message-actions/ui.expected.md b/apps/web/tests/snapshots/message-actions/ui.expected.md index 19ba02d99d..09ecd0c41d 100644 --- a/apps/web/tests/snapshots/message-actions/ui.expected.md +++ b/apps/web/tests/snapshots/message-actions/ui.expected.md @@ -16,12 +16,16 @@ - img - img - text: Think The user wants me to read a.txt and b.txt, then reply with "DONE". Let me do both reads in parallel. -- img -- text: Read -- button "a.txt" -- img -- text: Read -- button "b.txt" +- button "Read a.txt": + - img + - img + - text: Read + - button "a.txt" +- button "Read b.txt": + - img + - img + - text: Read + - button "b.txt" - button "Think Both files have been read. a.txt contains \"alpha\" and b.txt contains \"beta\". I'll now reply with DONE as instructed.": - img - img diff --git a/apps/web/tests/snapshots/plan-review/approved.expected.md b/apps/web/tests/snapshots/plan-review/approved.expected.md index aca0bc31bb..84cadffe2a 100644 --- a/apps/web/tests/snapshots/plan-review/approved.expected.md +++ b/apps/web/tests/snapshots/plan-review/approved.expected.md @@ -25,10 +25,10 @@ - button "在新对话中分支": - img - text: {{clock}} -- button: +- 'button "Tool call exit_plan_mode · # Add `--greeting` flag to CLI"': - img - img -- text: "Tool call exit_plan_mode · # Add `--greeting` flag to CLI" + - text: "Tool call exit_plan_mode · # Add `--greeting` flag to CLI" - 'button "Think The plan was approved. The user''s last instruction says: \"Once the plan is approved, reply with the single word DONE and stop.\" So I should just reply with DONE and stop."': - img - img diff --git a/apps/web/tests/snapshots/question-composer/answered.expected.md b/apps/web/tests/snapshots/question-composer/answered.expected.md index 36752c783a..f9ed8017c6 100644 --- a/apps/web/tests/snapshots/question-composer/answered.expected.md +++ b/apps/web/tests/snapshots/question-composer/answered.expected.md @@ -15,10 +15,10 @@ - img - img - text: Think The user wants me to use the ask_user_question tool with specific parameters. Let me do exactly that. -- button: +- button "Ask question 1/1 answered": - img - img -- text: Ask question 1/1 answered + - text: Ask question 1/1 answered - button "Think The user answered \"Blue\". I should now reply with the single word DONE and stop.": - img - img diff --git a/apps/web/tests/snapshots/seeded-history/ui.expected.md b/apps/web/tests/snapshots/seeded-history/ui.expected.md index efc43a272e..928c1dd879 100644 --- a/apps/web/tests/snapshots/seeded-history/ui.expected.md +++ b/apps/web/tests/snapshots/seeded-history/ui.expected.md @@ -15,12 +15,16 @@ - img - img - text: Think The user wants me to read a.txt and b.txt, then reply with "DONE". Let me do both reads in parallel. -- img -- text: Read -- button "a.txt" -- img -- text: Read -- button "b.txt" +- button "Read a.txt": + - img + - img + - text: Read + - button "a.txt" +- button "Read b.txt": + - img + - img + - text: Read + - button "b.txt" - button "Think Both files have been read. a.txt contains \"alpha\" and b.txt contains \"beta\". I'll now reply with DONE as instructed.": - img - img diff --git a/apps/web/tests/snapshots/steering/mid-steer.expected.md b/apps/web/tests/snapshots/steering/mid-steer.expected.md index 28127fd73b..5c88526fe8 100644 --- a/apps/web/tests/snapshots/steering/mid-steer.expected.md +++ b/apps/web/tests/snapshots/steering/mid-steer.expected.md @@ -15,10 +15,10 @@ - img - img - text: Think The user wants me to use the ask_user_question tool to ask them a specific question with the given parameters. Let me do exactly that. -- button: +- button "Ask question waiting": - img - img -- text: Ask question waiting + - text: Ask question waiting - region "Ready to continue?": - text: Checkpoint - heading "Ready to continue?" [level=2] diff --git a/apps/web/tests/snapshots/steering/settled.expected.md b/apps/web/tests/snapshots/steering/settled.expected.md index 5efbcf385d..253420f7ab 100644 --- a/apps/web/tests/snapshots/steering/settled.expected.md +++ b/apps/web/tests/snapshots/steering/settled.expected.md @@ -15,10 +15,11 @@ - img - img - text: Think The user wants me to use the ask_user_question tool to ask them a specific question with the given parameters. Let me do exactly that. -- button: +- button "Ask question 1/1 answered": - img - img -- text: "Ask question 1/1 answered 插话 Interjection: include the word BANANA in your final reply." + - text: Ask question 1/1 answered +- text: "插话 Interjection: include the word BANANA in your final reply." - button "Think The user selected \"Yes\" and wants me to include the word \"BANANA\" in my final reply. Let me acknowledge their answer.": - img - img