import { describe, expect, it, vi } from "vitest"; import { createParagraphChunkedBlockReplyHarness, emitAssistantTextDeltaAndEnd, } from "./pi-embedded-subscribe.e2e-harness.js"; describe("subscribeEmbeddedPiSession", () => { it("streams soft chunks with paragraph preference", () => { const onBlockReply = vi.fn(); const { emit, subscription } = createParagraphChunkedBlockReplyHarness({ onBlockReply, chunking: { minChars: 5, maxChars: 25, }, }); const text = "First block line\n\nSecond block line"; emitAssistantTextDeltaAndEnd({ emit, text }); expect(onBlockReply).toHaveBeenCalledTimes(2); expect(onBlockReply.mock.calls[0][0].text).toBe("First block line"); expect(onBlockReply.mock.calls[1][0].text).toBe("Second block line"); expect(subscription.assistantTexts).toEqual(["First block line", "Second block line"]); }); it("avoids splitting inside fenced code blocks", () => { const onBlockReply = vi.fn(); const { emit } = createParagraphChunkedBlockReplyHarness({ onBlockReply, chunking: { minChars: 5, maxChars: 25, }, }); const text = "Intro\n\n```bash\nline1\nline2\n```\n\nOutro"; emitAssistantTextDeltaAndEnd({ emit, text }); expect(onBlockReply).toHaveBeenCalledTimes(3); expect(onBlockReply.mock.calls[0][0].text).toBe("Intro"); expect(onBlockReply.mock.calls[1][0].text).toBe("```bash\nline1\nline2\n```"); expect(onBlockReply.mock.calls[2][0].text).toBe("Outro"); }); });