| 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"); |
| }); |
| }); |
|
|