import type { ThreadFeedEntry } from "../../lib/threadActivity"; import type { QueuedThreadMessage } from "../../state/thread-outbox-model"; export type PendingThreadFeedEntry = ThreadFeedEntry & { readonly pendingMessage?: QueuedThreadMessage; readonly acknowledged?: boolean; }; /** Append the outbox after all presented activity, until the server echoes each message. */ export function appendPendingThreadMessages( presentedFeed: ReadonlyArray, feed: ReadonlyArray, queuedMessages: ReadonlyArray, ): ReadonlyArray { if (queuedMessages.length === 0) return presentedFeed; const deliveredIds = new Set( feed.flatMap((entry) => (entry.type === "message" ? [entry.message.id] : [])), ); return [ ...presentedFeed, ...queuedMessages .filter((message) => !deliveredIds.has(message.messageId)) .map((pendingMessage): PendingThreadFeedEntry => ({ type: "message", id: pendingMessage.messageId, createdAt: pendingMessage.createdAt, pendingMessage, message: { id: pendingMessage.messageId, role: "user", text: pendingMessage.text, createdAt: pendingMessage.createdAt, updatedAt: pendingMessage.createdAt, turnId: null, streaming: false, }, })), ]; }