| |
|
|
| import { describe, expect, it } from "vitest"; |
| import { renderToStaticMarkup } from "react-dom/server"; |
| import type { TranscriptEntry } from "../../adapters"; |
| import { ThemeProvider } from "../../context/ThemeContext"; |
| import { RunTranscriptView, normalizeTranscript } from "./RunTranscriptView"; |
|
|
| describe("RunTranscriptView", () => { |
| it("keeps running command stdout inside the command fold instead of a standalone stdout block", () => { |
| const entries: TranscriptEntry[] = [ |
| { |
| kind: "tool_call", |
| ts: "2026-03-12T00:00:00.000Z", |
| name: "command_execution", |
| toolUseId: "cmd_1", |
| input: { command: "ls -la" }, |
| }, |
| { |
| kind: "stdout", |
| ts: "2026-03-12T00:00:01.000Z", |
| text: "file-a\nfile-b", |
| }, |
| ]; |
|
|
| const blocks = normalizeTranscript(entries, false); |
|
|
| expect(blocks).toHaveLength(1); |
| expect(blocks[0]).toMatchObject({ |
| type: "command_group", |
| items: [{ result: "file-a\nfile-b", status: "running" }], |
| }); |
| }); |
|
|
| it("renders assistant and thinking content as markdown in compact mode", () => { |
| const html = renderToStaticMarkup( |
| <ThemeProvider> |
| <RunTranscriptView |
| density="compact" |
| entries={[ |
| { |
| kind: "assistant", |
| ts: "2026-03-12T00:00:00.000Z", |
| text: "Hello **world**", |
| }, |
| { |
| kind: "thinking", |
| ts: "2026-03-12T00:00:01.000Z", |
| text: "- first\n- second", |
| }, |
| ]} |
| /> |
| </ThemeProvider>, |
| ); |
|
|
| expect(html).toContain("<strong>world</strong>"); |
| expect(html).toContain("<li>first</li>"); |
| expect(html).toContain("<li>second</li>"); |
| }); |
|
|
| it("hides saved-session resume skip stderr from nice mode normalization", () => { |
| const entries: TranscriptEntry[] = [ |
| { |
| kind: "stderr", |
| ts: "2026-03-12T00:00:00.000Z", |
| text: "[paperclip] Skipping saved session resume for task \"PAP-485\" because wake reason is issue_assigned.", |
| }, |
| { |
| kind: "assistant", |
| ts: "2026-03-12T00:00:01.000Z", |
| text: "Working on the task.", |
| }, |
| ]; |
|
|
| const blocks = normalizeTranscript(entries, false); |
|
|
| expect(blocks).toHaveLength(1); |
| expect(blocks[0]).toMatchObject({ |
| type: "message", |
| role: "assistant", |
| text: "Working on the task.", |
| }); |
| }); |
| }); |
|
|