File size: 1,177 Bytes
6a2bc3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
interface ForkTurnItem {
  readonly type: string;
}

interface ForkTurnMessage {
  readonly role: "user" | "assistant";
  readonly forkable?: boolean;
  readonly steps?: readonly {
    readonly items: readonly ForkTurnItem[];
  }[];
}

/** Return the core's zero-based user-visible turn index for an assistant bubble. */
export function getForkTurnIndex(
  messages: readonly ForkTurnMessage[],
  messageIndex: number,
): number | undefined {
  const target = messages[messageIndex];
  if (target?.role !== "assistant" || target.forkable === false) return undefined;

  let visibleTurns = 0;
  for (let index = 0; index <= messageIndex; index += 1) {
    const message = messages[index];
    if (message === undefined) continue;
    if (message.role === "user" && message.forkable !== false) {
      visibleTurns += 1;
      continue;
    }
    if (message.role === "assistant") {
      visibleTurns += countSteers(message);
    }
  }
  return visibleTurns - 1;
}

function countSteers(message: ForkTurnMessage): number {
  return (
    message.steps?.reduce(
      (count, step) => count + step.items.filter((item) => item.type === "steer").length,
      0,
    ) ?? 0
  );
}