File size: 1,084 Bytes
4e23b01
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
export type TranscriptGrade = 'off' | 'turn' | 'block' | 'delta';

export const GRADE_RANK: Readonly<Record<TranscriptGrade, number>> = {
  off: 0,
  turn: 1,
  block: 2,
  delta: 3,
};

export type TranscriptGradeSpec = Readonly<Record<string, TranscriptGrade | undefined>>;

export function gradeFor(spec: TranscriptGradeSpec | undefined, agentId: string): TranscriptGrade {
  if (!spec) return 'off';
  return spec[agentId] ?? spec['*'] ?? 'off';
}

export function needsResetOnTransition(prev: TranscriptGrade, next: TranscriptGrade): boolean {
  return GRADE_RANK[next] > GRADE_RANK[prev];
}

export function detachGrades(
  spec: TranscriptGradeSpec | undefined,
  agentIds: readonly string[],
): TranscriptGradeSpec | undefined {
  if (spec === undefined) return undefined;
  const next: Record<string, TranscriptGrade | undefined> = { ...spec };
  for (const agentId of agentIds) {
    if (agentId === '*') delete next['*'];
    else next[agentId] = 'off';
  }
  return Object.values(next).some((grade) => grade !== undefined && grade !== 'off')
    ? next
    : undefined;
}