import { describe, expect, test, vi } from "vitest"; import { InteractiveMode } from "../src/modes/interactive/interactive-mode.js"; describe("InteractiveMode compaction events", () => { test("rebuilds chat and appends a synthetic compaction summary at the bottom", async () => { const fakeThis = { isInitialized: true, footer: { invalidate: vi.fn() }, autoCompactionEscapeHandler: undefined as (() => void) | undefined, autoCompactionLoader: undefined, defaultEditor: {}, statusContainer: { clear: vi.fn() }, chatContainer: { clear: vi.fn() }, rebuildChatFromMessages: vi.fn(), addMessageToChat: vi.fn(), showError: vi.fn(), showStatus: vi.fn(), flushCompactionQueue: vi.fn().mockResolvedValue(undefined), settingsManager: { getShowTerminalProgress: () => false }, ui: { requestRender: vi.fn(), terminal: { setProgress: vi.fn() } }, }; const handleEvent = Reflect.get(InteractiveMode.prototype, "handleEvent") as ( this: typeof fakeThis, event: { type: "compaction_end"; reason: "manual" | "threshold" | "overflow"; result: { tokensBefore: number; summary: string } | undefined; aborted: boolean; willRetry: boolean; errorMessage?: string; }, ) => Promise; await handleEvent.call(fakeThis, { type: "compaction_end", reason: "manual", result: { tokensBefore: 123, summary: "summary", }, aborted: false, willRetry: false, }); expect(fakeThis.chatContainer.clear).toHaveBeenCalledTimes(1); expect(fakeThis.rebuildChatFromMessages).toHaveBeenCalledTimes(1); expect(fakeThis.addMessageToChat).toHaveBeenCalledTimes(1); expect(fakeThis.addMessageToChat).toHaveBeenCalledWith( expect.objectContaining({ role: "compactionSummary", tokensBefore: 123, summary: "summary", }), ); expect(fakeThis.flushCompactionQueue).toHaveBeenCalledWith({ willRetry: false }); }); });