import { beforeEach, describe, expect, it, vi } from "vitest"; const callGatewayMock = vi.fn(); vi.mock("../../gateway/call.js", () => ({ callGateway: (opts: unknown) => callGatewayMock(opts), })); import { readLatestAssistantReply } from "./agent-step.js"; describe("readLatestAssistantReply", () => { beforeEach(() => { callGatewayMock.mockClear(); }); it("returns the most recent assistant message when compaction markers trail history", async () => { callGatewayMock.mockResolvedValue({ messages: [ { role: "assistant", content: [{ type: "text", text: "All checks passed and changes were pushed." }], }, { role: "toolResult", content: [{ type: "text", text: "tool output" }] }, { role: "system", content: [{ type: "text", text: "Compaction" }] }, ], }); const result = await readLatestAssistantReply({ sessionKey: "agent:main:child" }); expect(result).toBe("All checks passed and changes were pushed."); expect(callGatewayMock).toHaveBeenCalledWith({ method: "chat.history", params: { sessionKey: "agent:main:child", limit: 50 }, }); }); it("falls back to older assistant text when latest assistant has no text", async () => { callGatewayMock.mockResolvedValue({ messages: [ { role: "assistant", content: [{ type: "text", text: "older output" }] }, { role: "assistant", content: [] }, { role: "system", content: [{ type: "text", text: "Compaction" }] }, ], }); const result = await readLatestAssistantReply({ sessionKey: "agent:main:child" }); expect(result).toBe("older output"); }); });