Adds a transcript surface for a Structured-view session alongside the existing xterm attach view: a WS /api/structured/:id connection (structured.ts) mounted by ConnectionPool whenever a session's `view` is `"Structured"`, and pure per-row/rail renderers (structuredRender.ts, structuredDiff.ts) covering all eight transcript row kinds. Hierarchy follows the design reference (artifact 88ecd690): the approval is the only lifted, card-like element; a user turn is a tinted block with an accent rail; agent prose is plain text; tool calls are compact bordered rows expanding to output or a coloured, horizontally-scrolling diff computed from ACP's full old/new text. The client renders `reduced_state` and rows exactly as received, with no raw-event folding or turn tracking of its own. Extracted attach.ts's pane-header title building into paneTitle.ts and its connection interface into pane.ts (PaneConnection) so both connection kinds share one contract and one header.
29 lines
997 B
TypeScript
29 lines
997 B
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { paneTitleAttr, paneTitleHtml } from "./paneTitle.js";
|
|
|
|
describe("paneTitleHtml", () => {
|
|
it("falls back to a short session id when there is no info yet", () => {
|
|
expect(paneTitleHtml("abcdef12-3456-7890-abcd-ef1234567890")).toContain("abcdef12");
|
|
});
|
|
|
|
it("shows the name alone when command matches it", () => {
|
|
const html = paneTitleHtml("s1", { name: "claude", command: "claude" });
|
|
expect(html).toContain("claude");
|
|
expect(html).not.toContain("at-cmd");
|
|
});
|
|
|
|
it("escapes a name that looks like markup", () => {
|
|
const html = paneTitleHtml("s1", { name: "<img onerror=x>", command: "claude" });
|
|
expect(html).not.toContain("<img");
|
|
});
|
|
});
|
|
|
|
describe("paneTitleAttr", () => {
|
|
it("escapes the attribute form too", () => {
|
|
const attr = paneTitleAttr("s1", { name: '"quoted"', command: "claude" });
|
|
expect(attr).not.toContain('"quoted"');
|
|
expect(attr).toContain(""quoted"");
|
|
});
|
|
});
|