import { afterEach, describe, expect, it, vi } from "vitest"; const mocked = vi.hoisted(() => ({ start: vi.fn(async () => "http://127.0.0.1:8787"), stop: vi.fn(async () => undefined), logger: { debug: vi.fn(), error: vi.fn(), info: vi.fn(), warn: vi.fn(), }, })); vi.mock("headroom-ai", () => ({ compress: vi.fn(), })); vi.mock("../src/proxy-manager.js", () => ({ ProxyManager: class { start = mocked.start; stop = mocked.stop; }, defaultLogger: mocked.logger, })); import { HeadroomContextEngine } from "../src/engine.js"; afterEach(() => { mocked.start.mockReset(); mocked.start.mockResolvedValue("http://127.0.0.1:8787"); mocked.stop.mockClear(); mocked.logger.debug.mockClear(); mocked.logger.error.mockClear(); mocked.logger.info.mockClear(); mocked.logger.warn.mockClear(); }); describe("HeadroomContextEngine proxy startup helpers", () => { it("bootstraps by scheduling proxy startup when enabled", async () => { const engine = new HeadroomContextEngine(); await expect( engine.bootstrap({ sessionId: "session-1", sessionFile: "session.jsonl", }), ).resolves.toEqual({ bootstrapped: true, reason: "proxy startup scheduled", }); expect(mocked.start).toHaveBeenCalledTimes(1); }); it("removes unsubscribed proxy listeners before notifying readiness", async () => { const engine = new HeadroomContextEngine(); const first = vi.fn(); const second = vi.fn(); const unsubscribeFirst = engine.onProxyReady(first); engine.onProxyReady(second); unsubscribeFirst(); engine.ensureProxyStarted(); await engine.ensureProxyUrl(); expect(first).not.toHaveBeenCalled(); expect(second).toHaveBeenCalledWith("http://127.0.0.1:8787"); }); it("returns the existing proxy URL without starting again", async () => { const engine = new HeadroomContextEngine(); (engine as { proxyUrl: string | null }).proxyUrl = "http://127.0.0.1:8787"; await expect(engine.ensureProxyUrl()).resolves.toBe("http://127.0.0.1:8787"); expect(mocked.start).not.toHaveBeenCalled(); }); it("throws when proxy startup is disabled", async () => { const engine = new HeadroomContextEngine({ enabled: false }); await expect(engine.ensureProxyUrl()).rejects.toThrow("Headroom proxy startup is disabled"); expect(mocked.start).not.toHaveBeenCalled(); }); it("schedules startup and returns original messages when assembling before proxy readiness", async () => { const engine = new HeadroomContextEngine(); const messages = [{ role: "user", content: "hello" }]; await expect( engine.assemble({ sessionId: "session-1", messages, }), ).resolves.toEqual({ messages, estimatedTokens: 0, }); expect(mocked.start).toHaveBeenCalledTimes(1); }); });