import { describe, expect, it } from "vite-plus/test"; import { CommandId, EnvironmentId, MessageId, ThreadId } from "@t3tools/contracts"; import type { QueuedThreadMessage } from "../../state/thread-outbox-model"; import { appendPendingThreadMessages } from "./pending-thread-feed"; const pending = (id: string): QueuedThreadMessage => ({ environmentId: EnvironmentId.make("env"), threadId: ThreadId.make("thread"), messageId: MessageId.make(id), commandId: CommandId.make(id), text: id, attachments: [], createdAt: "2026-09-06T10:00:00.000Z", }); describe("pending timeline messages", () => { it("keeps pending messages after newer agent activity in queue order", () => { const activity = { type: "thinking", turnId: null, id: "thinking", createdAt: "2026-09-06T11:00:00.000Z", } as const; const entries = appendPendingThreadMessages( [activity], [], [pending("first"), pending("second")], ); expect(entries.map((entry) => entry.id)).toEqual(["thinking", "first", "second"]); expect(entries[1]?.pendingMessage?.text).toBe("first"); }); it("reuses the message id and suppresses the pending copy when delivery appears", () => { const queued = pending("sent"); const optimistic = appendPendingThreadMessages([], [], [queued])[0]!; const delivered = { ...optimistic, pendingMessage: undefined }; expect(appendPendingThreadMessages([delivered], [delivered], [queued])).toEqual([delivered]); // Folded messages still count as delivered even when absent from the presented rows. expect(appendPendingThreadMessages([], [delivered], [queued])).toEqual([]); }); });