1import type { OrchestrationV2Run, OrchestrationV2ThreadProjection } from "@t3tools/contracts";
2
3export function isAutomaticCompletionRun(
4 projection: Pick<OrchestrationV2ThreadProjection, "runs" | "messages">,
5 run: OrchestrationV2Run,
6): boolean {
7 return projection.messages.some(
8 (message) => message.id === run.userMessageId && message.delegatedCompletion !== undefined,
9 );
10}
11
12export function queuedRunsInDeliveryOrder(
13 projection: Pick<OrchestrationV2ThreadProjection, "runs" | "messages">,
14): ReadonlyArray<OrchestrationV2Run> {
15 const automaticCompletionMessageIds = new Set(
16 projection.messages
17 .filter((message) => message.delegatedCompletion !== undefined)
18 .map((message) => message.id),
19 );
20 return projection.runs
21 .filter((run) => run.status === "queued")
22 .toSorted((left, right) => {
23 const deliveryPriority =
24 Number(automaticCompletionMessageIds.has(right.userMessageId)) -
25 Number(automaticCompletionMessageIds.has(left.userMessageId));
26 return (
27 deliveryPriority ||
28 (left.queuePosition ?? left.ordinal) - (right.queuePosition ?? right.ordinal) ||
29 left.ordinal - right.ordinal
30 );
31 });
32}