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("includes canvas action metadata in tool summaries", async () => { let handler: ((evt: unknown) => void) | undefined; const session: StubSession = { subscribe: (fn) => { handler = fn; return () => {}; }, }; const onToolResult = vi.fn(); subscribeEmbeddedPiSession({ session: session as unknown as Parameters[0]["session"], runId: "run-canvas-tool", verboseLevel: "on", onToolResult, }); handler?.({ type: "tool_execution_start", toolName: "canvas", toolCallId: "tool-canvas-1", args: { action: "a2ui_push", jsonlPath: "/tmp/a2ui.jsonl" }, }); // Wait for async handler to complete await Promise.resolve(); expect(onToolResult).toHaveBeenCalledTimes(1); const payload = onToolResult.mock.calls[0][0]; expect(payload.text).toContain("🖼️"); expect(payload.text).toContain("canvas"); expect(payload.text).toContain("A2UI push"); expect(payload.text).toContain("/tmp/a2ui.jsonl"); }); it("skips tool summaries when shouldEmitToolResult is false", () => { let handler: ((evt: unknown) => void) | undefined; const session: StubSession = { subscribe: (fn) => { handler = fn; return () => {}; }, }; const onToolResult = vi.fn(); subscribeEmbeddedPiSession({ session: session as unknown as Parameters[0]["session"], runId: "run-tool-off", shouldEmitToolResult: () => false, onToolResult, }); handler?.({ type: "tool_execution_start", toolName: "read", toolCallId: "tool-2", args: { path: "/tmp/b.txt" }, }); expect(onToolResult).not.toHaveBeenCalled(); }); it("emits tool summaries when shouldEmitToolResult overrides verbose", async () => { let handler: ((evt: unknown) => void) | undefined; const session: StubSession = { subscribe: (fn) => { handler = fn; return () => {}; }, }; const onToolResult = vi.fn(); subscribeEmbeddedPiSession({ session: session as unknown as Parameters[0]["session"], runId: "run-tool-override", verboseLevel: "off", shouldEmitToolResult: () => true, onToolResult, }); handler?.({ type: "tool_execution_start", toolName: "read", toolCallId: "tool-3", args: { path: "/tmp/c.txt" }, }); // Wait for async handler to complete await Promise.resolve(); expect(onToolResult).toHaveBeenCalledTimes(1); }); });