File size: 3,096 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import type { StepUsage } from './turn';

export type GoalStatus = 'active' | 'paused' | 'blocked' | 'complete';

export interface GoalMeta {
  readonly objective: string;
  readonly status: GoalStatus;
  readonly completionCriterion?: string;
  readonly budgetUsed?: number;
  readonly budgetLimit?: number;
}

export interface ModesMeta {
  readonly plan?: { readonly reviewPath?: string; readonly version?: number };
  readonly swarm?: { readonly trigger?: string };
  readonly tower?: Record<string, never>;
}

export interface ModesMetaMerge {
  readonly plan?: { readonly reviewPath?: string; readonly version?: number } | null;
  readonly swarm?: { readonly trigger?: string } | null;
  readonly tower?: Record<string, never> | null;
}

export type ActivityMeta = 'idle' | 'turn' | 'disposing' | 'unknown';

export type TurnEndReasonMeta = 'completed' | 'cancelled' | 'failed' | 'blocked';

export type AgentPhaseMeta =
  | { readonly kind: 'idle' }
  | {
      readonly kind: 'running';
      readonly turnId: number;
      readonly step: number;
      readonly stepId: string;
      readonly since: number;
    }
  | {
      readonly kind: 'tool_call';
      readonly turnId: number;
      readonly step: number;
      readonly toolCallId: string;
      readonly name: string;
      readonly since: number;
    }
  | {
      readonly kind: 'retrying';
      readonly turnId: number;
      readonly step: number;
      readonly stepId: string;
      readonly failedAttempt: number;
      readonly nextAttempt: number;
      readonly maxAttempts: number;
      readonly delayMs: number;
      readonly errorName?: string;
      readonly statusCode?: number;
      readonly since: number;
    }
  | {
      readonly kind: 'awaiting_approval';
      readonly turnId: number;
      readonly step?: number;
      readonly approval?: unknown;
      readonly since: number;
    }
  | {
      readonly kind: 'interrupted';
      readonly turnId: number;
      readonly step?: number;
      readonly reason: 'aborted' | 'max_steps' | 'error';
      readonly message?: string;
      readonly at: number;
    }
  | {
      readonly kind: 'ended';
      readonly turnId: number;
      readonly reason: TurnEndReasonMeta;
      readonly durationMs?: number;
      readonly at: number;
    };

export interface AgentUsageMeta {
  readonly byModel?: Readonly<Record<string, StepUsage>>;
  readonly currentTurn?: StepUsage;
  readonly total?: StepUsage;
}

export interface AgentStatusMeta {
  readonly model?: string;
  readonly thinkingEffort?: string;
  readonly usage?: AgentUsageMeta;
  readonly contextTokens?: number;
  readonly maxContextTokens?: number;
  readonly contextUsage?: number;
  readonly permission?: 'manual' | 'yolo' | 'auto';
  readonly phase?: AgentPhaseMeta;
}

export interface TranscriptMeta {
  readonly goal?: GoalMeta;
  readonly modes?: ModesMeta;
  readonly activity?: ActivityMeta;
  readonly agent?: AgentStatusMeta;
}

export type TranscriptMetaMerge = Omit<TranscriptMeta, 'modes' | 'goal'> & {
  readonly modes?: ModesMetaMerge;
  readonly goal?: GoalMeta | null;
};