import { describe, expect, it } from "vitest"; import { TuiStreamAssembler } from "./tui-stream-assembler.js"; describe("TuiStreamAssembler", () => { it("keeps thinking before content even when thinking arrives later", () => { const assembler = new TuiStreamAssembler(); const first = assembler.ingestDelta( "run-1", { role: "assistant", content: [{ type: "text", text: "Hello" }], }, true, ); expect(first).toBe("Hello"); const second = assembler.ingestDelta( "run-1", { role: "assistant", content: [{ type: "thinking", thinking: "Brain" }], }, true, ); expect(second).toBe("[thinking]\nBrain\n\nHello"); }); it("omits thinking when showThinking is false", () => { const assembler = new TuiStreamAssembler(); const text = assembler.ingestDelta( "run-2", { role: "assistant", content: [ { type: "thinking", thinking: "Hidden" }, { type: "text", text: "Visible" }, ], }, false, ); expect(text).toBe("Visible"); }); it("falls back to streamed text on empty final payload", () => { const assembler = new TuiStreamAssembler(); assembler.ingestDelta( "run-3", { role: "assistant", content: [{ type: "text", text: "Streamed" }], }, false, ); const finalText = assembler.finalize( "run-3", { role: "assistant", content: [], }, false, ); expect(finalText).toBe("Streamed"); }); it("returns null when delta text is unchanged", () => { const assembler = new TuiStreamAssembler(); const first = assembler.ingestDelta( "run-4", { role: "assistant", content: [{ type: "text", text: "Repeat" }], }, false, ); expect(first).toBe("Repeat"); const second = assembler.ingestDelta( "run-4", { role: "assistant", content: [{ type: "text", text: "Repeat" }], }, false, ); expect(second).toBeNull(); }); });