import type { AssistantMessage } from "@mariozechner/pi-ai"; import { describe, expect, it, vi } from "vitest"; import { subscribeEmbeddedPiSession } from "./pi-embedded-subscribe.js"; type StubSession = { subscribe: (fn: (evt: unknown) => void) => () => void; }; describe("subscribeEmbeddedPiSession", () => { const THINKING_TAG_CASES = [ { tag: "think", open: "", close: "" }, { tag: "thinking", open: "", close: "" }, { tag: "thought", open: "", close: "" }, { tag: "antthinking", open: "", close: "" }, ] as const; it("emits reasoning as a separate message when enabled", () => { let handler: ((evt: unknown) => void) | undefined; const session: StubSession = { subscribe: (fn) => { handler = fn; return () => {}; }, }; const onBlockReply = vi.fn(); subscribeEmbeddedPiSession({ session: session as unknown as Parameters[0]["session"], runId: "run", onBlockReply, blockReplyBreak: "message_end", reasoningMode: "on", }); const assistantMessage = { role: "assistant", content: [ { type: "thinking", thinking: "Because it helps" }, { type: "text", text: "Final answer" }, ], } as AssistantMessage; handler?.({ type: "message_end", message: assistantMessage }); expect(onBlockReply).toHaveBeenCalledTimes(2); expect(onBlockReply.mock.calls[0][0].text).toBe("Reasoning:\n_Because it helps_"); expect(onBlockReply.mock.calls[1][0].text).toBe("Final answer"); }); it.each(THINKING_TAG_CASES)( "promotes <%s> tags to thinking blocks at write-time", ({ open, close }) => { let handler: ((evt: unknown) => void) | undefined; const session: StubSession = { subscribe: (fn) => { handler = fn; return () => {}; }, }; const onBlockReply = vi.fn(); subscribeEmbeddedPiSession({ session: session as unknown as Parameters[0]["session"], runId: "run", onBlockReply, blockReplyBreak: "message_end", reasoningMode: "on", }); const assistantMessage = { role: "assistant", content: [ { type: "text", text: `${open}\nBecause it helps\n${close}\n\nFinal answer`, }, ], } as AssistantMessage; handler?.({ type: "message_end", message: assistantMessage }); expect(onBlockReply).toHaveBeenCalledTimes(2); expect(onBlockReply.mock.calls[0][0].text).toBe("Reasoning:\n_Because it helps_"); expect(onBlockReply.mock.calls[1][0].text).toBe("Final answer"); expect(assistantMessage.content).toEqual([ { type: "thinking", thinking: "Because it helps" }, { type: "text", text: "Final answer" }, ]); }, ); });