From 9d4a4228381b6999bc9149e2f1faa524dc8049f3 Mon Sep 17 00:00:00 2001 From: "paseo-bot[bot]" <266920839+paseo-bot[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 14:20:59 +0200 Subject: [PATCH] test(terminal): reproduce stale alternate-screen content after restore --- packages/server/src/terminal/terminal.test.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/server/src/terminal/terminal.test.ts b/packages/server/src/terminal/terminal.test.ts index f83b6b9ba3..df3abb08a7 100644 --- a/packages/server/src/terminal/terminal.test.ts +++ b/packages/server/src/terminal/terminal.test.ts @@ -567,6 +567,38 @@ describe("createTerminal", () => { expect(state.grid[0][1].char).toBe(""); }); + it("clears restored fullscreen content when the application leaves the alternate screen", async () => { + const session = trackSession( + await createTerminal({ + workspaceId: "ws-test", + cwd: realpathSync(tmpdir()), + cols: 80, + rows: 10, + command: process.execPath, + args: [ + "-e", + "process.stdout.write('SHELL\\r\\n\\x1b[?1049h\\x1b[2J\\x1b[HFULLSCREEN'); setInterval(() => {}, 100000);", + ], + }), + ); + const state = await waitForState(session, (current) => getRowText(current, 0) === "FULLSCREEN"); + const restored = new xterm.Terminal({ cols: 80, rows: 10, allowProposedApi: true }); + try { + await new Promise((resolve) => + restored.write(renderTerminalSnapshotToAnsi(state), resolve), + ); + expect(restored.buffer.active.getLine(0)?.translateToString(true)).toBe("FULLSCREEN"); + await new Promise((resolve) => restored.write("\x1b[?1049lPROMPT", resolve)); + const visible = Array.from({ length: restored.rows }, (_, row) => + restored.buffer.active.getLine(row)?.translateToString(true), + ).join("\n"); + expect(visible).not.toContain("FULLSCREEN"); + expect(visible.trim()).toBe("PROMPT"); + } finally { + restored.dispose(); + } + }); + it("captures exit diagnostics from the terminal buffer", async () => { const session = trackSession( await createTerminal({