import { describe, expect, it } from "vitest"; import type { ClawdbotConfig } from "../../config/config.js"; import type { FollowupRun, QueueSettings } from "./queue.js"; import { enqueueFollowupRun, scheduleFollowupDrain } from "./queue.js"; function createRun(params: { prompt: string; originatingChannel?: FollowupRun["originatingChannel"]; originatingTo?: string; }): FollowupRun { return { prompt: params.prompt, enqueuedAt: Date.now(), originatingChannel: params.originatingChannel, originatingTo: params.originatingTo, run: { agentId: "agent", agentDir: "/tmp", sessionId: "sess", sessionFile: "/tmp/session.json", workspaceDir: "/tmp", config: {} as ClawdbotConfig, provider: "openai", model: "gpt-test", timeoutMs: 10_000, blockReplyBreak: "text_end", }, }; } describe("followup queue collect routing", () => { it("does not collect when destinations differ", async () => { const key = `test-collect-diff-to-${Date.now()}`; const calls: FollowupRun[] = []; const runFollowup = async (run: FollowupRun) => { calls.push(run); }; const settings: QueueSettings = { mode: "collect", debounceMs: 0, cap: 50, dropPolicy: "summarize", }; enqueueFollowupRun( key, createRun({ prompt: "one", originatingChannel: "slack", originatingTo: "channel:A", }), settings, ); enqueueFollowupRun( key, createRun({ prompt: "two", originatingChannel: "slack", originatingTo: "channel:B", }), settings, ); scheduleFollowupDrain(key, runFollowup); await expect.poll(() => calls.length).toBe(2); expect(calls[0]?.prompt).toBe("one"); expect(calls[1]?.prompt).toBe("two"); }); it("collects when channel+destination match", async () => { const key = `test-collect-same-to-${Date.now()}`; const calls: FollowupRun[] = []; const runFollowup = async (run: FollowupRun) => { calls.push(run); }; const settings: QueueSettings = { mode: "collect", debounceMs: 0, cap: 50, dropPolicy: "summarize", }; enqueueFollowupRun( key, createRun({ prompt: "one", originatingChannel: "slack", originatingTo: "channel:A", }), settings, ); enqueueFollowupRun( key, createRun({ prompt: "two", originatingChannel: "slack", originatingTo: "channel:A", }), settings, ); scheduleFollowupDrain(key, runFollowup); await expect.poll(() => calls.length).toBe(1); expect(calls[0]?.prompt).toContain( "[Queued messages while agent was busy]", ); expect(calls[0]?.originatingChannel).toBe("slack"); expect(calls[0]?.originatingTo).toBe("channel:A"); }); });