takotrace 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +37 -0
- package/PRODUCT.md +33 -0
- package/README.md +69 -0
- package/README.zh-CN.md +69 -0
- package/TECHNICAL_DESIGN.md +46 -0
- package/assets/star-takotrace.gif +0 -0
- package/assets/takotrace-logo.png +0 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.js +152 -0
- package/dist/cli.js.map +1 -0
- package/dist/server/claude-client.d.ts +63 -0
- package/dist/server/claude-client.js +512 -0
- package/dist/server/claude-client.js.map +1 -0
- package/dist/server/codex-client.d.ts +57 -0
- package/dist/server/codex-client.js +414 -0
- package/dist/server/codex-client.js.map +1 -0
- package/dist/server/codex-command.d.ts +15 -0
- package/dist/server/codex-command.js +131 -0
- package/dist/server/codex-command.js.map +1 -0
- package/dist/server/http-server.d.ts +39 -0
- package/dist/server/http-server.js +429 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/multi-provider.d.ts +30 -0
- package/dist/server/multi-provider.js +178 -0
- package/dist/server/multi-provider.js.map +1 -0
- package/dist/server/native-path-opener.d.ts +7 -0
- package/dist/server/native-path-opener.js +45 -0
- package/dist/server/native-path-opener.js.map +1 -0
- package/dist/server/provider.d.ts +27 -0
- package/dist/server/provider.js +2 -0
- package/dist/server/provider.js.map +1 -0
- package/dist/server/rollout-reader.d.ts +9 -0
- package/dist/server/rollout-reader.js +333 -0
- package/dist/server/rollout-reader.js.map +1 -0
- package/dist/server/subagent-assignment.d.ts +9 -0
- package/dist/server/subagent-assignment.js +146 -0
- package/dist/server/subagent-assignment.js.map +1 -0
- package/dist/shared/jsonl.d.ts +6 -0
- package/dist/shared/jsonl.js +23 -0
- package/dist/shared/jsonl.js.map +1 -0
- package/dist/shared/store.d.ts +35 -0
- package/dist/shared/store.js +351 -0
- package/dist/shared/store.js.map +1 -0
- package/dist/shared/trace.d.ts +7 -0
- package/dist/shared/trace.js +256 -0
- package/dist/shared/trace.js.map +1 -0
- package/dist/shared/types.d.ts +144 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/web/assets/SequenceDiagram-D2zGAyJN.js +8 -0
- package/dist/web/assets/favicon-16-DQXCs6B9.png +0 -0
- package/dist/web/assets/favicon-32-By9ik0BF.png +0 -0
- package/dist/web/assets/index-D6VA1lK-.css +1 -0
- package/dist/web/assets/index-vnUrUuB8.js +84 -0
- package/dist/web/assets/takotrace-logo-DtWm9Bax.png +0 -0
- package/dist/web/index.html +29 -0
- package/package.json +57 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
function record(value) {
|
|
2
|
+
return value && typeof value === 'object' ? value : {};
|
|
3
|
+
}
|
|
4
|
+
function stringAt(value, ...paths) {
|
|
5
|
+
for (const path of paths) {
|
|
6
|
+
let current = value;
|
|
7
|
+
for (const key of path)
|
|
8
|
+
current = record(current)[key];
|
|
9
|
+
if (typeof current === 'string' && current)
|
|
10
|
+
return current;
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
function numberAt(value, ...paths) {
|
|
15
|
+
for (const path of paths) {
|
|
16
|
+
let current = value;
|
|
17
|
+
for (const key of path)
|
|
18
|
+
current = record(current)[key];
|
|
19
|
+
if (typeof current === 'number' && Number.isFinite(current))
|
|
20
|
+
return current;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
function summaryFor(method, params) {
|
|
25
|
+
const values = record(params);
|
|
26
|
+
const item = record(record(params).item);
|
|
27
|
+
const content = Array.isArray(item.content) ? item.content : [];
|
|
28
|
+
const firstText = content.map(record).find((entry) => entry.type === 'text');
|
|
29
|
+
const text = stringAt(item, ['text'], ['command'], ['name'], ['tool'])
|
|
30
|
+
?? stringAt(firstText, ['text'])
|
|
31
|
+
?? stringAt(values, ['thread', 'name'], ['thread', 'preview']);
|
|
32
|
+
if (text) {
|
|
33
|
+
const summary = item.type === 'userMessage' ? extractUserRequest(text) : text;
|
|
34
|
+
return summary.length > 160 ? `${summary.slice(0, 157)}...` : summary;
|
|
35
|
+
}
|
|
36
|
+
return method.replaceAll('/', ' ');
|
|
37
|
+
}
|
|
38
|
+
function extractUserRequest(text) {
|
|
39
|
+
const marker = /## My request:\s*/i.exec(text);
|
|
40
|
+
return marker ? text.slice(marker.index + marker[0].length).trim() : text;
|
|
41
|
+
}
|
|
42
|
+
function eventStatus(method, params) {
|
|
43
|
+
const explicit = stringAt(params, ['status'], ['turn', 'status'], ['item', 'status']);
|
|
44
|
+
if (explicit === 'failed' || explicit === 'error' || explicit === 'cancelled' || explicit === 'systemError')
|
|
45
|
+
return 'failed';
|
|
46
|
+
if (explicit === 'interrupted')
|
|
47
|
+
return 'interrupted';
|
|
48
|
+
if (explicit === 'inProgress' || explicit === 'running')
|
|
49
|
+
return 'running';
|
|
50
|
+
if (explicit === 'completed' || explicit === 'approved')
|
|
51
|
+
return 'completed';
|
|
52
|
+
if (method.endsWith('/completed'))
|
|
53
|
+
return 'completed';
|
|
54
|
+
if (method.endsWith('/started'))
|
|
55
|
+
return 'running';
|
|
56
|
+
return 'pending';
|
|
57
|
+
}
|
|
58
|
+
function entityStatus(value) {
|
|
59
|
+
if (value && typeof value === 'object')
|
|
60
|
+
return entityStatus(record(value).type);
|
|
61
|
+
if (value === 'failed' || value === 'error' || value === 'cancelled' || value === 'systemError')
|
|
62
|
+
return 'failed';
|
|
63
|
+
if (value === 'interrupted')
|
|
64
|
+
return 'interrupted';
|
|
65
|
+
if (value === 'inProgress' || value === 'running' || value === 'active')
|
|
66
|
+
return 'running';
|
|
67
|
+
if (value === 'completed' || value === 'complete' || value === 'approved' || value === 'idle')
|
|
68
|
+
return 'completed';
|
|
69
|
+
return 'pending';
|
|
70
|
+
}
|
|
71
|
+
function isoAt(value, fallback) {
|
|
72
|
+
return typeof value === 'number' && Number.isFinite(value) ? new Date(value * 1_000).toISOString() : fallback;
|
|
73
|
+
}
|
|
74
|
+
function folderName(path) {
|
|
75
|
+
const normalized = path.replace(/[\\/]+$/, '');
|
|
76
|
+
return normalized.split(/[\\/]/).pop() || path;
|
|
77
|
+
}
|
|
78
|
+
function nullableString(value) {
|
|
79
|
+
return value === null || typeof value === 'string' ? value : undefined;
|
|
80
|
+
}
|
|
81
|
+
const TOKEN_FIELDS = [
|
|
82
|
+
['totalTokens', 'total_tokens'],
|
|
83
|
+
['inputTokens', 'input_tokens'],
|
|
84
|
+
['cachedInputTokens', 'cached_input_tokens'],
|
|
85
|
+
['cacheWriteInputTokens', 'cache_write_input_tokens'],
|
|
86
|
+
['outputTokens', 'output_tokens'],
|
|
87
|
+
['reasoningOutputTokens', 'reasoning_output_tokens'],
|
|
88
|
+
];
|
|
89
|
+
export function normalizeTokenUsageBreakdown(value) {
|
|
90
|
+
const source = record(value);
|
|
91
|
+
if (!TOKEN_FIELDS.some(([camel, snake]) => numberAt(source, [camel], [snake]) !== undefined))
|
|
92
|
+
return undefined;
|
|
93
|
+
return Object.fromEntries(TOKEN_FIELDS.map(([camel, snake]) => [camel, numberAt(source, [camel], [snake]) ?? 0]));
|
|
94
|
+
}
|
|
95
|
+
export function normalizeThreadTokenUsage(value) {
|
|
96
|
+
const source = record(value);
|
|
97
|
+
const total = normalizeTokenUsageBreakdown(source.total ?? source.totalTokenUsage ?? source.total_token_usage);
|
|
98
|
+
const last = normalizeTokenUsageBreakdown(source.last ?? source.lastTokenUsage ?? source.last_token_usage);
|
|
99
|
+
if (!total && !last)
|
|
100
|
+
return undefined;
|
|
101
|
+
const modelContextWindow = numberAt(source, ['modelContextWindow'], ['model_context_window']);
|
|
102
|
+
return {
|
|
103
|
+
total: total ?? last,
|
|
104
|
+
last: last ?? total,
|
|
105
|
+
...(modelContextWindow === undefined ? {} : { modelContextWindow }),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function tokenUsageDelta(current, previous, fallback) {
|
|
109
|
+
if (!previous || current.totalTokens < previous.totalTokens)
|
|
110
|
+
return { ...fallback };
|
|
111
|
+
return Object.fromEntries(TOKEN_FIELDS.map(([field]) => [field, Math.max(0, current[field] - previous[field])]));
|
|
112
|
+
}
|
|
113
|
+
export function addTokenUsage(current, delta) {
|
|
114
|
+
return Object.fromEntries(TOKEN_FIELDS.map(([field]) => [field, (current?.[field] ?? 0) + delta[field]]));
|
|
115
|
+
}
|
|
116
|
+
function subagentSpawnSource(value) {
|
|
117
|
+
const source = record(value);
|
|
118
|
+
const subagent = record(source.subAgent ?? source.subagent);
|
|
119
|
+
return record(subagent.thread_spawn ?? subagent.threadSpawn);
|
|
120
|
+
}
|
|
121
|
+
function threadProvider(value) {
|
|
122
|
+
return record(value).provider === 'claude' ? 'claude' : undefined;
|
|
123
|
+
}
|
|
124
|
+
export function notificationToTrace(notification) {
|
|
125
|
+
const params = notification.params;
|
|
126
|
+
const method = notification.method;
|
|
127
|
+
const type = stringAt(params, ['item', 'type'], ['type']) ?? method.split('/')[0] ?? 'unknown';
|
|
128
|
+
const startedAtMs = numberAt(params, ['item', 'startedAtMs'], ['startedAtMs']);
|
|
129
|
+
const completedAtMs = numberAt(params, ['item', 'completedAtMs'], ['completedAtMs']);
|
|
130
|
+
const emittedAtMs = numberAt(notification, ['emittedAtMs'])
|
|
131
|
+
?? completedAtMs
|
|
132
|
+
?? startedAtMs;
|
|
133
|
+
const turnAtSeconds = method.endsWith('/completed')
|
|
134
|
+
? numberAt(params, ['turn', 'completedAt'])
|
|
135
|
+
: numberAt(params, ['turn', 'startedAt']);
|
|
136
|
+
const timestamp = emittedAtMs ?? (turnAtSeconds === undefined ? Date.now() : turnAtSeconds * 1_000);
|
|
137
|
+
const tokenUsage = normalizeThreadTokenUsage(record(params).tokenUsage ?? record(params).token_usage ?? record(params).info);
|
|
138
|
+
return {
|
|
139
|
+
at: new Date(timestamp).toISOString(),
|
|
140
|
+
startedAt: startedAtMs === undefined
|
|
141
|
+
? (method.endsWith('/started') ? new Date(timestamp).toISOString() : undefined)
|
|
142
|
+
: new Date(startedAtMs).toISOString(),
|
|
143
|
+
completedAt: completedAtMs === undefined
|
|
144
|
+
? (method.endsWith('/completed') || method.endsWith('/failed') ? new Date(timestamp).toISOString() : undefined)
|
|
145
|
+
: new Date(completedAtMs).toISOString(),
|
|
146
|
+
method,
|
|
147
|
+
type,
|
|
148
|
+
status: eventStatus(method, params),
|
|
149
|
+
threadId: stringAt(params, ['threadId'], ['thread_id'], ['thread', 'id']) ?? '',
|
|
150
|
+
turnId: stringAt(params, ['turnId'], ['turn_id'], ['turn', 'id']),
|
|
151
|
+
itemId: stringAt(params, ['itemId'], ['item_id'], ['item', 'id']),
|
|
152
|
+
parentItemId: stringAt(params, ['parentItemId'], ['parent_item_id'], ['item', 'parentItemId'], ['item', 'parent_id']),
|
|
153
|
+
summary: summaryFor(method, params),
|
|
154
|
+
durationMs: numberAt(params, ['item', 'durationMs'], ['turn', 'durationMs']),
|
|
155
|
+
model: stringAt(params, ['model'], ['turn', 'model'], ['turn', 'modelName'], ['turn', 'model_name'], ['threadSettings', 'model'], ['thread_settings', 'model']),
|
|
156
|
+
tokenUsage,
|
|
157
|
+
raw: notification,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
export function threadToHistory(value) {
|
|
161
|
+
const thread = record(value);
|
|
162
|
+
const id = stringAt(thread, ['id']);
|
|
163
|
+
if (!id)
|
|
164
|
+
return undefined;
|
|
165
|
+
const provider = threadProvider(thread);
|
|
166
|
+
const createdAt = isoAt(thread.createdAt, new Date().toISOString());
|
|
167
|
+
const updatedAt = isoAt(thread.updatedAt, createdAt);
|
|
168
|
+
const cwd = stringAt(thread, ['cwd'], ['cwd', 'path']);
|
|
169
|
+
const projectFolder = stringAt(thread, ['projectFolder']) ?? (cwd ? folderName(cwd) : undefined);
|
|
170
|
+
const rawTurns = Array.isArray(thread.turns) ? thread.turns : [];
|
|
171
|
+
const spawnSource = subagentSpawnSource(thread.source);
|
|
172
|
+
const parentThreadId = nullableString(thread.parentThreadId) ?? nullableString(spawnSource.parent_thread_id);
|
|
173
|
+
const agentNickname = nullableString(thread.agentNickname) ?? nullableString(spawnSource.agent_nickname);
|
|
174
|
+
const agentRole = nullableString(thread.agentRole) ?? nullableString(spawnSource.agent_role);
|
|
175
|
+
const agentPath = nullableString(thread.agentPath)
|
|
176
|
+
?? nullableString(spawnSource.agent_path)
|
|
177
|
+
?? nullableString(spawnSource.agentPath);
|
|
178
|
+
const tokenUsage = normalizeThreadTokenUsage(thread.tokenUsage ?? thread.token_usage);
|
|
179
|
+
const turns = rawTurns.flatMap((rawTurn) => {
|
|
180
|
+
const turn = record(rawTurn);
|
|
181
|
+
const turnId = stringAt(turn, ['id']);
|
|
182
|
+
if (!turnId)
|
|
183
|
+
return [];
|
|
184
|
+
const status = entityStatus(turn.status);
|
|
185
|
+
const startedAt = typeof turn.startedAt === 'number' ? isoAt(turn.startedAt, createdAt) : undefined;
|
|
186
|
+
const completedAt = typeof turn.completedAt === 'number' ? isoAt(turn.completedAt, updatedAt) : undefined;
|
|
187
|
+
const durationMs = numberAt(turn, ['durationMs']);
|
|
188
|
+
const model = stringAt(turn, ['model'], ['modelName'], ['model_name']);
|
|
189
|
+
const tokenUsage = normalizeTokenUsageBreakdown(turn.tokenUsage ?? turn.token_usage);
|
|
190
|
+
const at = completedAt ?? startedAt ?? updatedAt;
|
|
191
|
+
const rawItems = Array.isArray(turn.items) ? turn.items : [];
|
|
192
|
+
const items = rawItems.flatMap((rawItem) => {
|
|
193
|
+
const item = record(rawItem);
|
|
194
|
+
const itemId = stringAt(item, ['id']);
|
|
195
|
+
if (!itemId)
|
|
196
|
+
return [];
|
|
197
|
+
const type = stringAt(item, ['type']) ?? 'item';
|
|
198
|
+
// Items returned by thread/read are committed history entries. Their status is
|
|
199
|
+
// independent from the containing turn, which may still be running or interrupted.
|
|
200
|
+
const finalStatus = item.status === undefined ? 'completed' : entityStatus(item.status);
|
|
201
|
+
const method = ['completed', 'interrupted', 'failed'].includes(finalStatus) ? 'item/completed' : 'item/started';
|
|
202
|
+
const itemStartedAt = typeof item.startedAt === 'number' ? isoAt(item.startedAt, at) : undefined;
|
|
203
|
+
const itemCompletedAt = typeof item.completedAt === 'number' ? isoAt(item.completedAt, at) : undefined;
|
|
204
|
+
return [{
|
|
205
|
+
at: itemCompletedAt ?? itemStartedAt ?? at,
|
|
206
|
+
startedAt: itemStartedAt,
|
|
207
|
+
completedAt: itemCompletedAt,
|
|
208
|
+
method,
|
|
209
|
+
type,
|
|
210
|
+
status: finalStatus,
|
|
211
|
+
threadId: id,
|
|
212
|
+
turnId,
|
|
213
|
+
itemId,
|
|
214
|
+
parentItemId: stringAt(item, ['parentItemId'], ['parent_id']),
|
|
215
|
+
provider,
|
|
216
|
+
summary: summaryFor(method, { item }),
|
|
217
|
+
durationMs: numberAt(item, ['durationMs']),
|
|
218
|
+
timingSource: itemStartedAt !== undefined || itemCompletedAt !== undefined ? 'observed' : 'turn-fallback',
|
|
219
|
+
raw: rawItem,
|
|
220
|
+
}];
|
|
221
|
+
});
|
|
222
|
+
return [{ id: turnId, status, startedAt, completedAt, durationMs, model, tokenUsage, items }];
|
|
223
|
+
});
|
|
224
|
+
const declaredStatus = entityStatus(thread.status);
|
|
225
|
+
const shouldDeriveStatus = record(thread.status).type === 'notLoaded';
|
|
226
|
+
return {
|
|
227
|
+
id,
|
|
228
|
+
sessionId: stringAt(thread, ['sessionId']),
|
|
229
|
+
forkedFromId: nullableString(thread.forkedFromId),
|
|
230
|
+
parentThreadId,
|
|
231
|
+
title: stringAt(thread, ['name'], ['preview']) ?? `Session ${id.slice(0, 8)}`,
|
|
232
|
+
status: shouldDeriveStatus && turns.length ? turns[turns.length - 1].status : declaredStatus,
|
|
233
|
+
turnsLoaded: thread.turnsLoaded === true,
|
|
234
|
+
historySource: thread.historySource === 'rollout-file' || thread.historySource === 'app-server'
|
|
235
|
+
? thread.historySource
|
|
236
|
+
: (thread.historySource === 'claude' ? 'claude' : undefined),
|
|
237
|
+
provider,
|
|
238
|
+
createdAt,
|
|
239
|
+
updatedAt,
|
|
240
|
+
cwd,
|
|
241
|
+
projectFolder,
|
|
242
|
+
ephemeral: typeof thread.ephemeral === 'boolean' ? thread.ephemeral : undefined,
|
|
243
|
+
modelProvider: stringAt(thread, ['modelProvider']),
|
|
244
|
+
path: nullableString(thread.path),
|
|
245
|
+
cliVersion: stringAt(thread, ['cliVersion']),
|
|
246
|
+
source: thread.source,
|
|
247
|
+
threadSource: nullableString(thread.threadSource),
|
|
248
|
+
agentNickname,
|
|
249
|
+
agentRole,
|
|
250
|
+
agentPath,
|
|
251
|
+
depth: numberAt(thread, ['depth']) ?? numberAt(spawnSource, ['depth']),
|
|
252
|
+
tokenUsage,
|
|
253
|
+
turns,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/shared/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export type ConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'error';
|
|
2
|
+
export type EntityStatus = 'pending' | 'running' | 'completed' | 'interrupted' | 'failed';
|
|
3
|
+
export type ProviderId = 'codex' | 'claude';
|
|
4
|
+
export type ProviderSelection = ProviderId | 'all';
|
|
5
|
+
export type HistorySource = 'app-server' | 'rollout-file' | 'claude';
|
|
6
|
+
export interface TokenUsageBreakdown {
|
|
7
|
+
totalTokens: number;
|
|
8
|
+
inputTokens: number;
|
|
9
|
+
cachedInputTokens: number;
|
|
10
|
+
cacheWriteInputTokens: number;
|
|
11
|
+
outputTokens: number;
|
|
12
|
+
reasoningOutputTokens: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ThreadTokenUsage {
|
|
15
|
+
total: TokenUsageBreakdown;
|
|
16
|
+
last: TokenUsageBreakdown;
|
|
17
|
+
modelContextWindow?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface TraceEvent {
|
|
20
|
+
seq: number;
|
|
21
|
+
startedSeq?: number;
|
|
22
|
+
completedSeq?: number;
|
|
23
|
+
at: string;
|
|
24
|
+
startedAt?: string;
|
|
25
|
+
completedAt?: string;
|
|
26
|
+
method: string;
|
|
27
|
+
type: string;
|
|
28
|
+
status: EntityStatus;
|
|
29
|
+
threadId: string;
|
|
30
|
+
turnId?: string;
|
|
31
|
+
itemId?: string;
|
|
32
|
+
parentItemId?: string;
|
|
33
|
+
summary: string;
|
|
34
|
+
durationMs?: number;
|
|
35
|
+
timingSource?: 'observed' | 'turn-fallback';
|
|
36
|
+
model?: string;
|
|
37
|
+
tokenUsage?: ThreadTokenUsage;
|
|
38
|
+
provider?: ProviderId;
|
|
39
|
+
raw: unknown;
|
|
40
|
+
}
|
|
41
|
+
export interface TurnState {
|
|
42
|
+
id: string;
|
|
43
|
+
status: EntityStatus;
|
|
44
|
+
startedAt?: string;
|
|
45
|
+
completedAt?: string;
|
|
46
|
+
durationMs?: number;
|
|
47
|
+
model?: string;
|
|
48
|
+
tokenUsage?: TokenUsageBreakdown;
|
|
49
|
+
items: TraceEvent[];
|
|
50
|
+
}
|
|
51
|
+
export interface ThreadState {
|
|
52
|
+
id: string;
|
|
53
|
+
title: string;
|
|
54
|
+
status: EntityStatus;
|
|
55
|
+
turnsLoaded: boolean;
|
|
56
|
+
historySource?: HistorySource;
|
|
57
|
+
provider?: ProviderId;
|
|
58
|
+
createdAt: string;
|
|
59
|
+
updatedAt: string;
|
|
60
|
+
cwd?: string;
|
|
61
|
+
projectFolder?: string;
|
|
62
|
+
tokenUsage?: ThreadTokenUsage;
|
|
63
|
+
turns: TurnState[];
|
|
64
|
+
}
|
|
65
|
+
export interface AppState {
|
|
66
|
+
connection: {
|
|
67
|
+
status: ConnectionStatus;
|
|
68
|
+
provider?: ProviderSelection;
|
|
69
|
+
userAgent?: string;
|
|
70
|
+
error?: string;
|
|
71
|
+
};
|
|
72
|
+
threads: ThreadState[];
|
|
73
|
+
events: TraceEvent[];
|
|
74
|
+
}
|
|
75
|
+
export type CompactTraceEvent = Omit<TraceEvent, 'raw'>;
|
|
76
|
+
export type CompactTurnState = Omit<TurnState, 'items'> & {
|
|
77
|
+
summary: string;
|
|
78
|
+
itemCount: number;
|
|
79
|
+
items: CompactTraceEvent[];
|
|
80
|
+
};
|
|
81
|
+
export type CompactThreadState = Omit<ThreadState, 'turns'> & {
|
|
82
|
+
turns: CompactTurnState[];
|
|
83
|
+
};
|
|
84
|
+
export interface CompactAppState {
|
|
85
|
+
connection: AppState['connection'];
|
|
86
|
+
threads: CompactThreadState[];
|
|
87
|
+
events: [];
|
|
88
|
+
}
|
|
89
|
+
export interface HistoricalTurn {
|
|
90
|
+
id: string;
|
|
91
|
+
status: EntityStatus;
|
|
92
|
+
startedAt?: string;
|
|
93
|
+
completedAt?: string;
|
|
94
|
+
durationMs?: number;
|
|
95
|
+
model?: string;
|
|
96
|
+
tokenUsage?: TokenUsageBreakdown;
|
|
97
|
+
items: Array<Omit<TraceEvent, 'seq'>>;
|
|
98
|
+
}
|
|
99
|
+
export interface HistoricalThread {
|
|
100
|
+
id: string;
|
|
101
|
+
sessionId?: string;
|
|
102
|
+
forkedFromId?: string | null;
|
|
103
|
+
parentThreadId?: string | null;
|
|
104
|
+
title: string;
|
|
105
|
+
status: EntityStatus;
|
|
106
|
+
turnsLoaded: boolean;
|
|
107
|
+
historySource?: HistorySource;
|
|
108
|
+
provider?: ProviderId;
|
|
109
|
+
createdAt: string;
|
|
110
|
+
updatedAt: string;
|
|
111
|
+
cwd?: string;
|
|
112
|
+
projectFolder?: string;
|
|
113
|
+
ephemeral?: boolean;
|
|
114
|
+
modelProvider?: string;
|
|
115
|
+
path?: string | null;
|
|
116
|
+
cliVersion?: string;
|
|
117
|
+
source?: unknown;
|
|
118
|
+
threadSource?: string | null;
|
|
119
|
+
agentNickname?: string | null;
|
|
120
|
+
agentRole?: string | null;
|
|
121
|
+
agentPath?: string | null;
|
|
122
|
+
depth?: number;
|
|
123
|
+
tokenUsage?: ThreadTokenUsage;
|
|
124
|
+
turns: HistoricalTurn[];
|
|
125
|
+
}
|
|
126
|
+
export interface RpcNotification {
|
|
127
|
+
method: string;
|
|
128
|
+
params?: unknown;
|
|
129
|
+
}
|
|
130
|
+
export interface RpcRequest {
|
|
131
|
+
id: number | string;
|
|
132
|
+
method: string;
|
|
133
|
+
params?: unknown;
|
|
134
|
+
}
|
|
135
|
+
export interface RpcResponse {
|
|
136
|
+
id: number | string;
|
|
137
|
+
result?: unknown;
|
|
138
|
+
error?: {
|
|
139
|
+
code: number;
|
|
140
|
+
message: string;
|
|
141
|
+
data?: unknown;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export type RpcMessage = RpcNotification | RpcRequest | RpcResponse;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{n as v,a as A,t as k,e as C,b as B,c as je,w as se,d as pe,f as N,r as q,j as r,g as Ae,S as J,I as L,h as Ie,i as ae,k as ie,E as oe,H as Ne,u as Te,l as Ce,M as Ee}from"./index-vnUrUuB8.js";function ge(e){var n;const t=(n=v(e))==null?void 0:n.replaceAll("\\","/");if(!(!t||!t.includes("/skills/")&&!t.startsWith("skills/")||!t.endsWith("/SKILL.md")))return t.split("/").at(-2)}function Pe(e){return(Array.isArray(e.commandActions)?e.commandActions:Array.isArray(e.parsed_cmd)?e.parsed_cmd:[]).map(A)}function Le(e){return((v(e)??(Array.isArray(e)?e.filter(i=>typeof i=="string").join(" "):"")).match(/(?:file:\/\/)?[^\s"'`]*skills\/[^\s"'`]+\/SKILL\.md/g)??[]).map(ge).filter(i=>!!i)}function Re(e){const t=Pe(e).filter(s=>{var a;return((a=v(s.type))==null?void 0:a.toLowerCase())==="read"}).map(s=>ge(s.path)),n=[...new Set([...t,...Le(e.command)].filter(s=>!!s))];if(!n.length)return;const i=n.length>1?` +${n.length-1}`:"";return{names:n,displayTitle:`Skill load · ${n[0]}${i} (inferred)`}}function re(e){const i=(Array.isArray(e.receiverAgents)?e.receiverAgents:Array.isArray(e.receiver_agents)?e.receiver_agents:[]).map(A).map(s=>v(s.agentNickname)??v(s.agent_nickname)??v(s.agentPath)??v(s.agent_path)).find(Boolean)??v(e.agentPath)??v(e.agent_path);return i==null?void 0:i.split("/").filter(Boolean).pop()}function Be(e){const t=e.content;if(!Array.isArray(t))return;const n=t.map(a=>v(A(a).text)).filter(Boolean).join(`
|
|
2
|
+
|
|
3
|
+
`),i="## My request:",s=n.indexOf(i);return(s>=0?n.slice(s+i.length):n).trim()||void 0}function We(e){if(Array.isArray(e.summary))return e.summary.map(v).filter(Boolean).join(`
|
|
4
|
+
`)||void 0}function De(e){if(e!=null)try{const t=JSON.stringify(e,null,2);return t.length>1200?`${t.slice(0,1200)}
|
|
5
|
+
…`:t}catch{return String(e)}}function Fe(e){return(Array.isArray(e.changes)?e.changes.map(n=>{const i=A(n),s=v(A(i.kind).type)??v(i.kind)??v(i.type)??"changed",a=v(i.path);return a?`${s} · ${a}`:void 0}):Object.entries(A(e.changes)).map(([n,i])=>{const s=A(i);return`${v(s.type)??v(A(s.kind).type)??v(s.kind)??"changed"} · ${n}`})).join(`
|
|
6
|
+
`)||void 0}function F(e){const t=C(e);let i=(v(t.type)??e.type).toLowerCase();i==="item"&&(e.method.includes("agentMessage")?i="agentmessage":e.method.includes("reasoning")?i="reasoning":e.method.includes("commandExecution")?i="commandexecution":e.method.includes("mcpToolCall")&&(i="mcptoolcall"));const s=e.summary&&e.summary!=="item started"&&e.summary!=="item completed"?e.summary:"No additional detail";if(i==="usermessage")return{kind:"user",label:"User",title:"Request",detail:Be(t)??s};if(i==="agentmessage"){const a=v(t.phase);return{kind:"agent",label:"Agent",title:a==="commentary"?"Update":a==="final_answer"?"Final response":"Message",detail:v(t.text)??s,meta:a}}if(i==="reasoning")return{kind:"reasoning",label:"Agent",title:"Reasoning",detail:We(t)??s};if(i==="subagentactivity"){const a=v(t.kind)??"activity",d=B(a),c=v(t.agentPath)??v(t.agent_path)??"Subagent",p=re(t)??"Subagent",m={started:{label:"Start",title:"Started",direction:"call"},interacted:{label:"Update",title:"Update",direction:"return"},completed:{label:"Result",title:"Result",direction:"return"},interrupted:{label:"Interrupted",title:"Interrupted",direction:"return"},failed:{label:"Failed",title:"Failed",direction:"return"}}[d],f=`${a[0].toUpperCase()}${a.slice(1)}`;return{kind:"subagent",label:(m==null?void 0:m.label)??"Subagent",title:`${(m==null?void 0:m.title)??f} · ${p}`,detail:c,meta:v(t.agentThreadId)??v(t.agent_thread_id),sequenceDirection:(m==null?void 0:m.direction)??"call"}}if(i==="collabagenttoolcall"){const a=v(t.tool)??"collaboration",d=B(a),c={spawnagent:"Fork",sendinput:"Message",sendmessage:"Message",followuptask:"Message",resumeagent:"Resume",wait:"Wait",waitagent:"Wait",interruptagent:"Interrupt",closeagent:"Close"}[d]??a,m=(Array.isArray(t.receiverThreadIds)?t.receiverThreadIds:Array.isArray(t.receiver_thread_ids)?t.receiver_thread_ids:[]).filter(x=>typeof x=="string"),b=re(t)??(m.length>1?`${m.length} subagents`:void 0),h=c==="Wait",o=h?`Wait for ${b??"subagents"}`:b?`${c} · ${b}`:c,l=A(t.result),g=v(l.message),_=l.timed_out===!0||l.timedOut===!0;return{kind:"subagent",label:c,title:o,detail:g??v(t.prompt)??(m.length?`Targets: ${m.join(", ")}`:s),meta:v(t.model)??void 0,showStatus:!0,statusLabel:_?"Timed out":h&&e.status==="completed"?"Wait ended":void 0,sequenceDirection:"call"}}if(i==="commandexecution"){const a=typeof t.exitCode=="number"?`exit ${t.exitCode}`:void 0,d=je(t.command),c=Re(t);return c?{kind:"skill",label:"Skill",title:c.displayTitle,detail:d??s,meta:[se(t.cwd),a].filter(Boolean).join(" · ")||void 0,showStatus:!0}:{kind:"tool",label:"Tool",title:d?`Shell · ${d.split(`
|
|
7
|
+
`,1)[0].slice(0,112)}`:"Shell",detail:d??s,meta:[se(t.cwd),a].filter(Boolean).join(" · ")||void 0,showStatus:!0}}if(i.includes("skill"))return{kind:"skill",label:"Skill",title:`Skill · ${v(t.name)??v(t.skill)??e.summary??"Skill"}`,detail:v(t.prompt)??v(t.path)??s,showStatus:!0};if(i==="mcptoolcall"){const a=v(t.server),d=v(t.tool)??e.summary??"MCP tool",c=pe(t);return{kind:"mcp",label:"MCP",title:(c==null?void 0:c.displayTitle)??[a,d].filter(Boolean).join(" · "),participantName:a,detail:De(t.arguments)??s,showStatus:!0}}return i==="filechange"?{kind:"file",label:"Tool",title:"File change",detail:Fe(t)??s,showStatus:!0}:i.includes("websearch")?{kind:"web",label:"Tool",title:"Web search",detail:s,showStatus:!0}:i.includes("tool")||i.includes("image")||i.includes("browser")?{kind:"tool",label:"Tool",title:e.type,detail:s,showStatus:!0}:{kind:"system",label:"System",title:e.type||e.method,detail:s}}function fe(e){const t=new Map;for(const n of e){const i=n.method.includes("started"),s=n.method.includes("completed")||n.method.includes("failed"),a={...n,startedSeq:n.startedSeq??(i?n.seq:void 0),completedSeq:n.completedSeq??(s?n.seq:void 0),startedAt:n.startedAt??(i?n.at:void 0),completedAt:n.completedAt??(s?n.at:void 0)},d=a.itemId?`item:${a.threadId}:${a.turnId??""}:${a.itemId}`:`event:${a.threadId}:${a.turnId??""}:${a.seq}`,c=t.get(d);if(!c){t.set(d,a);continue}const p=a.method.includes("completed")||a.method.includes("failed"),m=c.method.includes("completed")||c.method.includes("failed"),f=p||!m?a:c,b=f===a?c:a;t.set(d,{...b,...f,seq:Math.min(c.seq,a.seq),at:c.at<a.at?c.at:a.at,startedSeq:c.startedSeq??a.startedSeq,completedSeq:a.completedSeq??c.completedSeq,startedAt:c.startedAt??a.startedAt,completedAt:a.completedAt??c.completedAt,parentItemId:a.parentItemId??c.parentItemId,durationMs:a.durationMs??c.durationMs})}return[...t.values()].sort((n,i)=>{const s=k(n.startedAt)??k(n.at)??k(n.completedAt),a=k(i.startedAt)??k(i.at)??k(i.completedAt);return s!==void 0&&a!==void 0&&s!==a?s-a:n.seq-i.seq})}function I(e){return e==="user"?"user":e==="agent"||e==="reasoning"?"agent":e==="mcp"?"mcp":e==="subagent"?"subagent":e==="skill"?"skill":e==="file"?"file":e==="web"?"web":e==="tool"?"tool":"activity"}function W(e){return N(e)}function Oe(e){return e.filter(t=>{const n=F(t).kind;return n!=="user"&&n!=="agent"&&n!=="reasoning"&&n!=="system"})}function He(e){return e.flatMap(t=>{if(t.timingSource==="turn-fallback")return[];const n=k(t.startedAt),i=k(t.completedAt);return n!==void 0&&i!==void 0&&i>n?[{id:W(t),start:n,end:i}]:[]})}function Ue(e){const t=Math.max(0,...e.map(n=>n.completedSeq??n.startedSeq??n.seq))+1;return e.flatMap(n=>{const i=n.startedSeq,s=n.completedSeq??(n.status==="running"?t:void 0);return i!==void 0&&s!==void 0&&s>i?[{id:W(n),start:i,end:s}]:[]})}function ce(e,t,n){const i=[...e].sort((p,m)=>p.start-m.start||p.end-m.end),s=[];let a=[],d=Number.NEGATIVE_INFINITY;const c=()=>{if(a.length<2)return;const p=a.flatMap(h=>[{at:h.start,delta:1},{at:h.end,delta:-1}]).sort((h,o)=>h.at-o.at||h.delta-o.delta);let m=0,f=0;for(const h of p)m+=h.delta,f=Math.max(f,m);if(f<2)return;const b=a.map(h=>h.id);s.push({id:`parallel-${t}-${b.join("-")}`,eventIds:b,maxConcurrency:f,evidence:t,confidence:n})};for(const p of i)a.length&&p.start>=d&&(c(),a=[],d=Number.NEGATIVE_INFINITY),a.push(p),d=Math.max(d,p.end);return c(),s}function le(e){return(Array.isArray(e.receiverThreadIds)?e.receiverThreadIds:Array.isArray(e.receiver_thread_ids)?e.receiver_thread_ids:[]).filter(n=>typeof n=="string"&&!!n.trim())}function ze(e){const t=[];let n=[];const i=(s=n)=>{if(!s.length)return;const a=new Set(s.flatMap(c=>c.targets)),d=Math.max(a.size,s.length===1?0:s.length);if(d>1){const c=s.map(p=>p.id);t.push({id:`parallel-fork-join-${c.join("-")}`,eventIds:c,maxConcurrency:d,evidence:"fork-join",confidence:"structured"})}};for(const s of e){const a=C(s),d=B(a.type??s.type);if(d==="subagentactivity"){const p=B(a.kind),m=typeof(a.agentThreadId??a.agent_thread_id)=="string"?String(a.agentThreadId??a.agent_thread_id).trim():"";m&&["completed","failed","interrupted"].includes(p)&&(n=n.filter(f=>!f.targets.includes(m)));continue}if(d!=="collabagenttoolcall")continue;const c=B(a.tool);if(c==="spawnagent"||c==="resumeagent")n.push({id:W(s),targets:le(a)});else if(c==="wait"||c==="waitagent"){const p=new Set(le(a)),m=p.size?n.filter(b=>b.targets.some(h=>p.has(h))):n;i(m);const f=new Set(m.map(b=>b.id));n=n.filter(b=>!f.has(b.id))}}return i(),t}function Ve(e){return[...e.eventIds].sort().join("\0")}function he(e){const t=Oe(e),n=[...ce(He(t),"timestamp","confirmed"),...ce(Ue(t),"lifecycle","confirmed"),...ze(t)],i={timestamp:3,lifecycle:2,"fork-join":1},s=new Map;for(const a of n){const d=Ve(a),c=s.get(d);(!c||i[a.evidence]>i[c.evidence])&&s.set(d,a)}return[...s.values()]}function Ke(e){return e.evidence==="fork-join"?`Parallel dispatch ×${e.maxConcurrency}`:`Parallel ×${e.maxConcurrency}`}function Ge(e){if(e.timingSource==="turn-fallback")return{timing:"order"};const t=k(e.startedAt),n=k(e.completedAt);if(t!==void 0&&n!==void 0&&n>=t)return{startedAtMs:t,completedAtMs:n,timing:"observed"};if(e.durationMs!==void 0&&e.durationMs>0){const i=n??(e.method.includes("completed")||e.method.includes("failed")?k(e.at):void 0);if(i!==void 0)return{startedAtMs:i-e.durationMs,completedAtMs:i,timing:"inferred"}}return{timing:"order"}}function de(e,t,n,i){const s=t.kind==="mcp",a=Ge(e),d=C(e),c=t.kind==="tool"&&typeof d.exitCode=="number"&&d.exitCode!==0;return{id:N(e),batch:n,event:e,kind:t.kind,label:s?"Tool":t.label,title:s?`MCP · ${t.title}`:t.title,detail:t.detail,meta:t.meta,status:c?"failed":e.status,statusLabel:c?void 0:t.statusLabel,durationMs:e.durationMs,parallel:i,...a}}function Je(e){const t=fe(e).map(c=>({event:c,node:F(c)})),n=new Map;for(const c of he(t.map(({event:p})=>p)))for(const p of c.eventIds)n.has(p)||n.set(p,c);const i=[];let s,a=!0,d=0;for(const c of t){if(c.node.kind==="user"||c.node.kind==="agent"){const f=N(c.event);i.push({type:"message",id:f,event:c.event,node:c.node}),s=c.node.kind==="agent"?f:void 0,a=!0,d=0;continue}(c.node.kind==="reasoning"||c.node.kind==="system")&&(d+=1);const p=i[i.length-1],m=n.get(W(c.event));!a&&(p==null?void 0:p.type)==="execution"?p.actions.push(de(c.event,c.node,d,m)):i.push({type:"execution",id:`execution-${N(c.event)}`,ownerAgentId:s,actions:[de(c.event,c.node,d,m)]}),a=!1}return{blocks:i}}const X=[{key:"user",label:"Input"},{key:"agent",label:"Agent"},{key:"tools",label:"Tools"},{key:"mcp",label:"MCP"},{key:"subagents",label:"Subagents"}],R=.8,V=8;function ue(e){return e==="user"?"user":e==="agent"||e==="reasoning"?"agent":e==="mcp"?"mcp":e==="subagent"?"subagents":"tools"}function Xe(e){if(e.timingSource==="turn-fallback")return{startedAtMs:e.seq,completedAtMs:e.seq,timing:"order"};const t=k(e.startedAt),n=k(e.completedAt);if(t!==void 0&&n!==void 0&&n>=t)return{startedAtMs:t,completedAtMs:n,timing:"observed"};const i=n??k(e.at)??e.seq;return e.durationMs!==void 0&&e.durationMs>0?{startedAtMs:i-e.durationMs,completedAtMs:i,timing:"inferred"}:{startedAtMs:i,completedAtMs:i,timing:"order"}}function Ye(e){const t=[];for(const n of Je(e).blocks){if(n.type==="execution"){for(const s of n.actions){const a=s.startedAtMs??k(s.event.startedAt)??k(s.event.at)??s.event.seq,d=s.completedAtMs??k(s.event.completedAt)??(s.durationMs===void 0?a:a+s.durationMs);t.push({id:s.id,kind:s.kind,label:`${s.label} · ${s.title}`,lane:ue(s.kind),startedAtMs:a,completedAtMs:Math.max(a,d),timing:s.timing})}continue}const i=Xe(n.event);t.push({id:n.id,kind:n.node.kind,label:`${n.node.label} · ${n.node.title}`,lane:ue(n.node.kind),...i})}return t}function Qe(e,t){if(!e.length)return[];const n=Math.min(...e.map(m=>m.startedAtMs)),i=Math.max(...e.map(m=>m.completedAtMs)),s=Math.max(1,i-n),a=new Map(X.map(m=>[m.key,Math.max(1,...e.filter(f=>f.lane===m.key).map(f=>f.completedAtMs-f.startedAtMs))])),d=100/e.length,c=Math.min(1,d*.15),p=e.map((m,f)=>{const b=Math.max(0,m.completedAtMs-m.startedAtMs);if(t==="logical"){const g=Math.max(R,d-c),_=b===0?0:Math.sqrt(b/a.get(m.lane)),x=R+(g-R)*_;return{...m,left:f*d,width:x,track:0}}const h=Math.min(100-R,(m.startedAtMs-n)/s*100),o=b/s*100,l=Math.min(100-h,Math.max(0,o));return{...m,left:h,width:l,track:0}});for(const m of X){const f=[],b=p.filter(h=>h.lane===m.key).sort((h,o)=>h.left-o.left);for(const h of b){const o=t==="logical"?0:Math.max(0,f.findIndex(l=>l<=h.left));h.track=o===-1?f.length:o,f[h.track]=h.left+h.width}}return p}function Ze(e){const t=e.filter(i=>i.timing!=="order");if(t.length<2||t.every(i=>i.timing==="inferred")&&new Set(t.map(i=>i.completedAtMs)).size===1)return!1;const n=t.map(i=>i.startedAtMs);return new Set(n).size>1&&Math.max(...t.map(i=>i.completedAtMs))>Math.min(...n)}function et({items:e,onSelect:t,selectedId:n}){const i=q.useMemo(()=>Ye(e),[e]);if(!i.length)return null;const s=Ze(i)?"actual":"logical",a=Qe(i,s),d=X.filter(o=>a.some(l=>l.lane===o.key)),c=new Map,p=new Map;let m=0;for(const o of d){const l=a.filter(x=>x.lane===o.key),g=Math.max(1,...l.map(x=>x.track+1)),_=Math.max(18,g*V+6);p.set(o.key,m),c.set(o.key,_),m+=_}const b=(s==="actual"?[...a].sort((o,l)=>o.startedAtMs-l.startedAtMs):a).map(o=>({x:o.left+Math.min(o.width/2,R/2),y:p.get(o.lane)+o.track*V+7})),h=b.reduce((o,l,g)=>g===0?`M ${l.x} ${l.y}`:`${o} H ${l.x} V ${l.y}`,"");return r.jsx("div",{"aria-label":"Trace overview",className:"vbg-custom-replay-overview",title:s==="actual"?"Bar width represents duration":"Bar width represents relative duration",children:r.jsxs("div",{className:"vbg-custom-replay-overview__plot",style:{height:`${m}px`},children:[s==="logical"&&b.length>1&&r.jsxs("svg",{"aria-hidden":"true",className:"vbg-custom-replay-overview__sequence",preserveAspectRatio:"none",viewBox:`0 0 100 ${m}`,children:[r.jsx("defs",{children:r.jsx("marker",{id:"vbg-replay-arrow",markerHeight:"5",markerWidth:"5",orient:"auto",refX:"4",refY:"2.5",children:r.jsx("path",{d:"M 0 0 L 5 2.5 L 0 5 z"})})}),r.jsx("path",{d:h,markerEnd:"url(#vbg-replay-arrow)"})]}),d.map(o=>{const l=a.filter(g=>g.lane===o.key);return r.jsxs("div",{className:"vbg-custom-replay-overview__lane",style:{height:`${c.get(o.key)}px`},children:[r.jsx("span",{children:o.label}),r.jsx("div",{className:"vbg-custom-replay-overview__track",children:l.map(g=>{const _=Ae(Math.max(0,g.completedAtMs-g.startedAtMs)),x=g.timing==="observed"?"Observed timing":g.timing==="inferred"?"Estimated timing":"Order only",$=`${g.label} · ${_} · ${x}`,w=g.timing==="order"||g.completedAtMs===g.startedAtMs;return r.jsx("button",{"aria-label":$,"aria-pressed":n===g.id,className:`vbg-custom-replay-overview__bar vbg-custom-replay-overview__bar--${g.kind}${w?" vbg-custom-replay-overview__bar--point":""}`,"data-timing":g.timing,onClick:()=>t(g.id),style:{left:`${g.left}%`,top:`${g.track*V+3}px`,width:w?"8px":`max(6px, ${g.width}%)`},title:$,type:"button"},g.id)})})]},o.key)})]})})}function me({duration:e,durationLabel:t="Duration",from:n,startedAt:i,startedAtLabel:s,startedAtTitle:a,to:d,type:c}){const p=!!(n&&d);return r.jsx("section",{"aria-label":p?`Execution from ${n} to ${d}`:"Execution timing",className:"vbg-custom-execution-meta",children:r.jsxs("dl",{className:"vbg-custom-execution-meta__facts",children:[r.jsxs("div",{children:[r.jsx("dt",{children:"Started"}),r.jsx("dd",{children:r.jsx("time",{dateTime:i,title:a,children:s})})]}),r.jsxs("div",{children:[r.jsx("dt",{children:t}),r.jsx("dd",{children:e??"Not recorded"})]}),p&&r.jsxs("div",{children:[r.jsx("dt",{children:"Direction"}),r.jsxs("dd",{className:"vbg-custom-execution-meta__route",children:[r.jsx("code",{title:n,children:n}),r.jsx("span",{"aria-hidden":"true",className:"vbg-custom-execution-meta__arrow",children:"→"}),r.jsx("code",{title:d,children:d})]})]}),c&&r.jsxs("div",{children:[r.jsx("dt",{children:"Type"}),r.jsx("dd",{children:r.jsx("span",{className:"vbg-custom-execution-meta__type",children:c})})]})]})})}function tt(e){window.requestAnimationFrame(()=>{var t;return(t=document.getElementById(e))==null?void 0:t.focus()})}function nt({value:e}){const t=typeof e=="string";let n;try{n=t?e:JSON.stringify(e,null,2)}catch{n=String(e)}return r.jsx(Ne,{className:"vbg-custom-sequence__inspector-value",code:n,language:t?"plaintext":"json"})}function st({autoFocusClose:e=!0,item:t,onClose:n,onOpenSubagent:i,subagentView:s="trace"}){const a=`execution-inspector-title-${t.seq}`,[d,c]=q.useState("overview"),p=[{id:"overview",label:"Overview"},{id:"raw",label:"Raw event"}],m=t.kind==="file"||t.kind==="web"?"tool":t.kind,f=m==="reasoning"?"Agent":m,b=m==="subagent",h=F(t.event).statusLabel??t.status,o=t.event.startedAt??t.at;return r.jsxs("aside",{className:"vbg-custom-sequence__inspector vbg-custom-sequence__inspector--tabbed",id:"execution-inspector","aria-labelledby":a,children:[r.jsxs("header",{className:"vbg-custom-sequence__inspector-header",children:[r.jsxs("div",{className:"vbg-custom-sequence__inspector-title",id:a,"aria-live":"polite",children:[r.jsxs("div",{className:"vbg-custom-sequence__inspector-title-meta",children:[r.jsx("span",{className:`vbg-custom-sequence__inspector-kind vbg-custom-sequence__inspector-kind--${m}`,children:f.toUpperCase()}),r.jsxs("span",{"aria-label":`Step ${t.seq}`,className:"vbg-custom-sequence__inspector-step",children:["#",t.seq]})]}),r.jsx("strong",{title:t.fullTitle??t.title,children:t.title})]}),r.jsxs("div",{className:"vbg-custom-sequence__inspector-actions",children:[r.jsx(J,{status:h}),r.jsx("button",{autoFocus:e,type:"button",className:"vbg-custom-sequence__inspector-close",onClick:n,"aria-label":"Close execution details",title:"Close details",children:r.jsx(L,{name:"close"})})]})]}),!b&&r.jsx("div",{"aria-label":"Execution details",className:"vbg-custom-sequence__inspector-tabs",role:"tablist",children:p.map(l=>r.jsx("button",{"aria-controls":"execution-inspector-panel","aria-selected":d===l.id,className:d===l.id?"is-active":void 0,id:`execution-inspector-tab-${l.id}`,onClick:()=>c(l.id),onKeyDown:Ie,role:"tab",tabIndex:d===l.id?0:-1,type:"button",children:l.label},l.id))}),r.jsx("div",{"aria-labelledby":b?a:`execution-inspector-tab-${d}`,className:"vbg-custom-sequence__inspector-panel",id:"execution-inspector-panel",role:b?void 0:"tabpanel",children:b?r.jsxs("div",{className:"vbg-custom-sequence__inspector-summary vbg-custom-sequence__inspector-summary--subagent",children:[r.jsx(me,{duration:t.durationMs===void 0?void 0:`${t.durationMs}ms`,durationLabel:"Event latency",startedAt:o,startedAtLabel:ie(o),startedAtTitle:ae(o)}),r.jsx(oe,{autoLoadSubagent:!0,event:t.event,expandResult:!0,fallback:t.detail,onOpenSubagent:i,subagentView:s})]}):d==="overview"?r.jsxs("div",{className:"vbg-custom-sequence__inspector-summary",children:[r.jsx(me,{duration:t.durationMs===void 0?void 0:`${t.durationMs}ms`,from:t.from,startedAt:o,startedAtLabel:ie(o),startedAtTitle:ae(o),to:t.to,type:t.type}),r.jsxs("section",{className:"vbg-custom-sequence__inspector-section","aria-label":"Execution content",children:[r.jsx("h3",{children:"Content"}),r.jsx(oe,{autoLoadSubagent:!0,event:t.event,expandResult:!0,fallback:t.detail,onOpenSubagent:i,subagentView:s})]})]}):r.jsx(nt,{value:C(t.event)})})]})}const be={user:{key:"user",label:"User",subtext:"Prompt / Feedback",iconName:I("user")},agent:{key:"agent",label:"Agent",subtext:"Orchestrator",iconName:I("agent")},tool:{key:"tool",label:"Tools",subtext:"Shell / Files",iconName:I("tool")},mcp:{key:"mcp",label:"MCP",subtext:"Protocol Tools",iconName:I("mcp")},subagent:{key:"subagent",label:"Subagent",subtext:"Collaborators",iconName:I("subagent")}},at={...be,user:{key:"user",label:"Parent Agent",subtext:"Orchestrator",iconName:I("agent")},agent:{key:"agent",label:"Subagent",subtext:"Current worker",iconName:I("subagent")},subagent:{key:"subagent",label:"Child Subagent",subtext:"Delegated worker",iconName:I("subagent")}};function it(e){return e==="user"?"user":e==="agent"||e==="reasoning"?"agent":e==="mcp"?"mcp":e==="subagent"?"subagent":"tool"}function ot(e,t){if(!t)return!1;const n=C(e),i=typeof n.agentThreadId=="string"?n.agentThreadId:typeof n.agent_thread_id=="string"?n.agent_thread_id:void 0;if(t.parentThreadId&&i===t.parentThreadId)return!0;const s=typeof n.agentPath=="string"?n.agentPath:typeof n.agent_path=="string"?n.agent_path:void 0;return!s||!t.agentPath||s===t.agentPath?!1:t.agentPath.startsWith(`${s.replace(/\/$/,"")}/`)}const rt=/^(?:(?:\/usr)?\/bin\/)?(?:zsh|bash|sh)\s+-(?:lc|c)\s+/i;function ct(e){const t=e.trim(),n=t[0];if(n!=='"'&&n!=="'"||t.at(-1)!==n)return;if(n==='"'){let s=0;for(let a=t.length-2;a>=0&&t[a]==="\\";a-=1)s+=1;if(s%2===1)return}const i=t.slice(1,-1);return n==='"'?i.replace(/\\(["'\\])/g,"$1"):i.replace(/'\\''/g,"'")}function lt(e){var n;const t=e.match(/^((?:node|cat)\s+)(["']?)([^"'\s]*\/)([^/"'\s]+)\2(?=$|\s)/);return!t||(((n=t[3].match(/\//g))==null?void 0:n.length)??0)<2?e:e.replace(t[0],`${t[1]}${t[2]}…/${t[4]}${t[2]}`)}function ve(e){let t=e.trim().split(/\r?\n/,1)[0]??"";for(let n=0;n<4;n+=1){const i=t.match(rt);if(!i)break;const s=ct(t.slice(i[0].length));if(s===void 0)break;t=s}return t.replace(/\s+/g," ").trim()||e.trim()}function dt(e,t){let n=ve(e);if(t!=null&&t.startsWith("/")){const i=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp(`${i}(?=$|[\\s/"'])`,"g"),".")}return n=n.replace(/\/Users\/[^/\s"'\\]+/g,"~"),n=lt(n),n||e.trim()}function ut(e){return e.type.toLowerCase()==="commandexecution"||e.method.toLowerCase().includes("commandexecution")}function mt(e){return e.replace(/^Skill(?: load)? · /,"").replace(/ \(inferred\)$/,"")}function pt(e,t){const n=e.split(/\r?\n/).map(s=>s.trim()).find(s=>s&&!/^```/.test(s));return!n||n==="No additional detail"?t:n.replace(/^#{1,6}\s+/,"").replace(/^>\s*/,"").replace(/^[-+*]\s+/,"").replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\*\*([^*]+)\*\*/g,"$1").replace(/__([^_]+)__/g,"$1").replace(/~~([^~]+)~~/g,"$1").replace(/[*_]/g,"").replace(/\s+/g," ").trim()||t}function gt(e){if(!(e.kind!=="user"&&e.kind!=="agent"&&e.kind!=="reasoning"))return pt(e.detail,e.title)}function ft(e,t,n){return t?"terminal":e.kind==="agent"?"message":e.kind==="reasoning"?"activity":n??I(e.kind)}function D(e,t){var f;const n=e.kind==="tool"&&ut(t),i=e.kind==="skill",s=e.kind==="mcp"?pe(C(t)):void 0,a=(s==null?void 0:s.kind)==="browser"?"web":(s==null?void 0:s.kind)==="computer-use"?"monitor":(s==null?void 0:s.kind)==="javascript"?"braces":void 0,d=(f=e.meta)==null?void 0:f.split(" · ",1)[0],c=n?dt(e.detail,d):void 0,p=n?ve(e.detail):void 0,m=gt(e);return{displayIcon:ft(e,n,a),displayTitle:c??m??(i?mt(e.title):(s==null?void 0:s.title)??e.title),detailTitle:p?`Shell · ${p}`:m&&m!==e.title?`${e.title} · ${m}`:e.title,exportTitle:c?`Shell · ${c}`:e.title,isCommand:n}}function ht(e,t="main",n){const i=fe(e).map(o=>({event:o,node:F(o)})),s=[],a=new Set(["user","agent"]);let d=1;for(const{event:o,node:l}of i)if(l.kind==="user")a.add("user"),a.add("agent"),s.push({id:`seq-${N(o)}`,seq:d++,from:"user",to:"agent",type:"call",label:t==="subagent"?"Task input":"User prompt",title:l.title,...D(l,o),detail:l.detail,meta:l.meta,status:o.status,durationMs:o.durationMs,at:o.at,event:o,node:l});else if(l.kind==="agent"){a.add("agent"),a.add("user");const g=l.meta==="final_answer";s.push({id:`seq-${N(o)}`,seq:d++,from:"agent",to:"user",type:g?"return":"call",label:g?t==="subagent"?"Result":"Final Answer":t==="subagent"?"Progress update":"Commentary / Update",title:l.title,...D(l,o),detail:l.detail,meta:l.meta,status:o.status,durationMs:o.durationMs,at:o.at,event:o,node:l})}else if(l.kind==="reasoning"||l.kind==="skill"){a.add("agent");const g=l.kind==="skill";s.push({id:`seq-${N(o)}`,seq:d++,from:"agent",to:"agent",type:"self",label:g?"Skill load":"Think & Plan",title:l.title,...D(l,o),detail:l.detail,meta:l.meta,status:o.status,durationMs:o.durationMs,at:o.at,event:o,node:l})}else{const g=it(l.kind),_=t==="subagent"&&g==="subagent"&&ot(o,n);a.add(_?"user":g),a.add("agent");const x=g==="subagent"&&l.sequenceDirection==="return",$=_?x?"agent":"user":x?"subagent":"agent",w=_?x?"user":"agent":x?"agent":g;s.push({id:`seq-${N(o)}`,seq:d++,from:$,to:w,toLabel:w==="mcp"?l.participantName:void 0,type:x?"return":"call",label:`${l.label} execution`,title:l.title,...D(l,o),detail:l.detail,meta:l.meta,status:o.status,durationMs:o.durationMs,at:o.at,event:o,node:l})}const c=[];if(s.length>0){c.push({participant:"agent",startStepIndex:0,endStepIndex:s.length-1,status:"completed"});const o=new Map;s.forEach((l,g)=>{const _=l.to!=="agent"&&l.to!=="user"?l.to:l.from!=="agent"&&l.from!=="user"?l.from:null;if(_){const x=o.get(_);x?(x.end=g,(l.status==="failed"||l.status==="error")&&(x.status="failed")):o.set(_,{start:g,end:g,status:l.status})}}),o.forEach((l,g)=>{c.push({participant:g,startStepIndex:l.start,endStepIndex:l.end,status:l.status})})}const p=["user","agent","tool","mcp","subagent"],m=t==="subagent"?at:be,f=p.filter(o=>a.has(o)).map(o=>m[o]),b=new Map(s.map((o,l)=>[W(o.event),l])),h=he(i.map(({event:o})=>o)).flatMap(o=>{const l=o.eventIds.flatMap(x=>{const $=b.get(x);return $===void 0?[]:[$]});if(!l.length)return[];const g=Math.min(...l),_=Math.max(...l);return[{id:o.id,stepIds:l.map(x=>s[x].id),startStepIndex:g,endStepIndex:_,maxConcurrency:o.maxConcurrency,evidence:o.evidence,label:Ke(o)}]});return{participants:f,steps:s,activations:c,parallelGroups:h}}function K(e){return e.replace(/["\n\r;]/g," ").slice(0,80).trim()}function bt(e){const t=["sequenceDiagram"," autonumber"];for(const a of e.participants)t.push(` participant ${a.key} as ${a.label}`);t.push("");const n=new Map(e.parallelGroups.map(a=>[a.startStepIndex,a])),i=new Map(e.parallelGroups.map(a=>[a.endStepIndex,a])),s=new Map(e.parallelGroups.flatMap(a=>a.stepIds.map((d,c)=>[d,{group:a,index:c}])));for(const[a,d]of e.steps.entries()){const c=n.get(a),p=s.get(d.id);c?t.push(` par ${K(c.label)}`):p&&p.index>0&&t.push(` and ${K(d.exportTitle)}`);const m=K(d.exportTitle||d.label),f=d.durationMs!==void 0?` (${d.durationMs}ms)`:"",b=`${m}${f}`;d.type==="self"?t.push(` ${d.from}->>${d.to}: ${b}`):d.type==="return"?t.push(` ${d.from}-->>${d.to}: ${b}`):t.push(` ${d.from}->>+${d.to}: ${b}`),i.has(a)&&t.push(" end")}return t.join(`
|
|
8
|
+
`)}function vt(e,t){return{seq:e.seq,kind:e.node.kind,title:e.displayTitle,fullTitle:e.detailTitle,detail:e.detail,status:e.status,durationMs:e.durationMs,at:e.at,from:t.get(e.from)??e.from,to:e.toLabel??t.get(e.to)??e.to,type:e.type,event:e.event}}function xt(e,t){const s=Math.max(1,Math.min(480,t.width-24))/2,a=Math.max(0,t.height-e.bottom-12),d=Math.max(0,e.top-12),c=a<Math.min(240,d);return{above:c,left:Math.min(Math.max(e.left+e.width/2,12+s),t.width-12-s),maxHeight:Math.max(24,Math.min(320,c?d:a)),top:c?e.top-8:e.bottom+8}}function G(e){return e.detail.trim()||e.detailTitle}function yt(e,t,n){return t<=0?null:n==="Home"?0:n==="End"?t-1:n==="ArrowUp"?Math.max(0,e-1):n==="ArrowDown"?Math.min(t-1,e+1):null}function kt({initialSelectedStepId:e,items:t,onOpenSubagent:n,scope:i="main",threadContext:s}){const[a,d]=q.useState(e??null),{copy:c,state:p}=Te(t,2e3),[m,f]=q.useState(null),b=q.useRef(null),h=q.useRef(null),o=q.useMemo(()=>ht(t,i,s),[t,i,s]),l=q.useMemo(()=>o.steps.find(u=>u.id===a),[o.steps,a]),g=u=>{const M=o.steps.find(y=>y.id===`seq-${u}`);M&&(f(null),d(y=>y===M.id?null:M.id))};q.useEffect(()=>{a&&!l&&d(null)},[l,a]),q.useEffect(()=>()=>{h.current&&clearTimeout(h.current)},[]),q.useLayoutEffect(()=>{if(!l)return;const u=b.current,M=document.getElementById(`sequence-step-${l.seq}`);if(!u||!M)return;const y=u.getBoundingClientRect(),S=M.getBoundingClientRect(),T=12;S.bottom>y.bottom-T?u.scrollTop+=S.bottom-y.bottom+T:S.top<y.top+T&&(u.scrollTop-=y.top-S.top+T)},[l]);const _=()=>{if(!l)return;const u=`sequence-step-${l.seq}`;d(null),tt(u)},x=()=>{h.current&&(clearTimeout(h.current),h.current=null)},$=(u=0)=>{if(x(),u===0){f(null);return}h.current=setTimeout(()=>{h.current=null,f(null)},u)},w=(u,M)=>{x();const y=u.getBoundingClientRect(),S=xt(y,{height:window.innerHeight,width:window.innerWidth});f({stepId:M.id,text:G(M),...S})},Y=q.useMemo(()=>{const u=new Map;return o.participants.forEach((M,y)=>{u.set(M.key,y)}),u},[o.participants]),O=q.useMemo(()=>new Map(o.participants.map(u=>[u.key,u.label])),[o.participants]),xe=q.useMemo(()=>new Map(o.parallelGroups.flatMap(u=>u.stepIds.map(M=>[M,u]))),[o.parallelGroups]),ye={"--vbg-sequence-columns":o.participants.length,minWidth:`${Math.max(420,o.participants.length*156)}px`};return r.jsxs("section",{"aria-label":"Run sequence diagram",className:"vbg-custom-sequence",onKeyDown:u=>{u.key==="Escape"&&l&&(u.preventDefault(),_())},children:[o.steps.length===0?r.jsx("div",{className:"vbg-custom-sequence__empty",children:r.jsx("p",{children:"No sequence events to display for this run."})}):r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"vbg-custom-sequence__overview",children:r.jsx(et,{items:t,onSelect:g,selectedId:l==null?void 0:l.id.replace(/^seq-/,"")})}),r.jsxs("div",{className:`vbg-custom-sequence__workspace${l?" vbg-custom-sequence__workspace--with-inspector":""}`,children:[r.jsxs("button",{type:"button","aria-label":p==="copied"?"Mermaid copied":p==="error"?"Copy Mermaid failed":"Copy Mermaid",className:"vbg-custom-sequence__copy-btn",onClick:()=>void c(bt(o)),title:p==="copied"?"Mermaid copied":p==="error"?"Copy failed":"Copy Mermaid sequence syntax",children:[r.jsx(L,{name:p==="copied"?"check":p==="error"?"alert":"copy"},p),r.jsx("span",{"aria-live":"polite",className:"vbg-custom-sr-only",children:p==="copied"?"Copied":p==="error"?"Copy failed":"Copy Mermaid"})]}),r.jsx("div",{ref:b,className:"vbg-custom-sequence__canvas","aria-label":"Sequence interaction flow",onScroll:()=>$(),children:r.jsxs("div",{className:"vbg-custom-sequence__diagram",style:ye,children:[r.jsx("div",{className:"vbg-custom-sequence__lifelines-header",children:o.participants.map(u=>r.jsx("div",{className:`vbg-custom-sequence__participant vbg-custom-sequence__participant--${u.key}`,children:r.jsxs("div",{className:"vbg-custom-sequence__participant-box",children:[r.jsx("span",{className:"vbg-custom-sequence__participant-icon",children:r.jsx(L,{name:u.iconName})}),r.jsxs("div",{className:"vbg-custom-sequence__participant-info",children:[r.jsx("strong",{children:u.label}),r.jsx("span",{children:u.subtext})]})]})},u.key))}),r.jsxs("div",{className:"vbg-custom-sequence__body",children:[r.jsx("div",{className:"vbg-custom-sequence__lifelines-bg",children:o.participants.map(u=>r.jsx("div",{className:"vbg-custom-sequence__lifeline-col",children:r.jsx("div",{className:"vbg-custom-sequence__lifeline-wire"})},u.key))}),r.jsx("div",{className:"vbg-custom-sequence__steps",children:o.steps.map((u,M)=>{const y=xe.get(u.id),S=(y==null?void 0:y.startStepIndex)===M,T=(y==null?void 0:y.endStepIndex)===M,H=Y.get(u.from)??0,U=Y.get(u.to)??0,_e=u.type==="self"||H===U,Me=u.type==="return",Q=100/o.participants.length,E=a===u.id,Z=u.status==="completed"||u.status==="complete"||u.status==="approved",ke=`sequence-step-${u.seq}`,qe=u.node.kind==="file"||u.node.kind==="web"?"tool":u.node.kind==="reasoning"?"agent":u.node.kind,z=(H+.5)*Q,ee=(U+.5)*Q,$e=Math.min(z,ee),we=Math.abs(ee-z),Se=U>=H?"right":"left";return r.jsxs("button",{id:ke,className:`vbg-custom-sequence__step-row vbg-custom-sequence__step-row--role-${qe} vbg-custom-sequence__step-row--status-${u.status}${y?" vbg-custom-sequence__step-row--parallel":""}${S?" vbg-custom-sequence__step-row--parallel-start":""}${T?" vbg-custom-sequence__step-row--parallel-end":""} ${E?"vbg-custom-sequence__step-row--selected":""}`,onClick:()=>{if(E){_();return}d(u.id)},onKeyDown:j=>{const P=yt(M,o.steps.length,j.key);if(P===null)return;j.preventDefault();const te=o.steps[P];f(null),d(te.id),window.requestAnimationFrame(()=>{var ne;(ne=document.getElementById(`sequence-step-${te.seq}`))==null||ne.focus()})},type:"button",tabIndex:a?E?0:-1:M===0?0:-1,"aria-expanded":E,"aria-controls":E?"execution-inspector":void 0,"aria-describedby":(m==null?void 0:m.stepId)===u.id?"sequence-step-tooltip":void 0,"aria-label":`Step ${u.seq}: ${u.label} - ${u.detailTitle}, ${O.get(u.from)??u.from} to ${u.toLabel??O.get(u.to)??u.to}${y?`, ${y.label}`:""}`,onBlur:()=>$(),onFocus:j=>{if(!j.currentTarget.matches(":focus-visible"))return;const P=j.currentTarget.querySelector(".vbg-custom-sequence__step-title");P&&w(P,u)},children:[y&&S&&r.jsxs("span",{className:"vbg-custom-sequence__parallel-label",children:[r.jsx("strong",{children:y.label}),r.jsx("small",{children:y.evidence==="lifecycle"?"lifecycle overlap":y.evidence.replace("-"," ")})]}),r.jsx("div",{className:"vbg-custom-sequence__step-line-container",children:_e?r.jsxs("div",{className:"vbg-custom-sequence__self-loop",style:{left:`${z}%`},children:[r.jsx("span",{"aria-hidden":"true",className:"vbg-custom-sequence__self-path"}),r.jsxs("span",{className:"vbg-custom-sequence__self-badge",children:[r.jsx("span",{className:"vbg-custom-sequence__step-num",children:u.seq}),u.displayIcon&&r.jsx("span",{"aria-hidden":"true",className:"vbg-custom-sequence__step-icon",children:r.jsx(L,{name:u.displayIcon})}),r.jsx("strong",{className:`vbg-custom-sequence__step-title${u.isCommand?" vbg-custom-sequence__step-title--command":""}`,"data-tooltip":G(u),onMouseEnter:j=>w(j.currentTarget,u),onMouseLeave:()=>$(100),children:u.displayTitle}),!Z&&r.jsx(J,{status:u.status})]})]}):r.jsxs("div",{className:`vbg-custom-sequence__arrow vbg-custom-sequence__arrow--${Se} ${Me?"vbg-custom-sequence__arrow--return":"vbg-custom-sequence__arrow--call"} vbg-custom-sequence__arrow--status-${u.status}`,style:{left:`${$e}%`,width:`${we}%`},children:[r.jsx("div",{className:"vbg-custom-sequence__arrow-line"}),r.jsx("div",{className:"vbg-custom-sequence__arrow-head"}),r.jsxs("div",{className:"vbg-custom-sequence__arrow-label",children:[r.jsx("span",{className:"vbg-custom-sequence__step-num",children:u.seq}),u.displayIcon&&r.jsx("span",{"aria-hidden":"true",className:"vbg-custom-sequence__step-icon",children:r.jsx(L,{name:u.displayIcon})}),r.jsx("strong",{className:`vbg-custom-sequence__step-title${u.isCommand?" vbg-custom-sequence__step-title--command":""}`,"data-tooltip":G(u),onMouseEnter:j=>w(j.currentTarget,u),onMouseLeave:()=>$(100),children:u.displayTitle}),!Z&&r.jsx(J,{status:u.status})]})]})})]},u.id)})})]})]})}),l&&r.jsx(st,{autoFocusClose:!1,item:vt(l,O),onClose:_,onOpenSubagent:n,subagentView:"sequence"},l.id)]})]}),m&&typeof document<"u"&&Ce.createPortal(r.jsx("div",{className:`vbg-custom-sequence__tooltip${m.above?" vbg-custom-sequence__tooltip--above":""}`,id:"sequence-step-tooltip",onMouseEnter:x,onMouseLeave:()=>$(),role:"tooltip",style:{left:m.left,maxHeight:m.maxHeight,top:m.top},children:r.jsx(Ee,{children:m.text})}),document.body)]})}export{kt as SequenceDiagram,yt as nextSequenceStepIndex,G as sequenceTooltipContent,xt as sequenceTooltipLayout};
|
|
Binary file
|
|
Binary file
|