@excitedjs/agent-runtime-claude-code 0.5.0-beta.168 → 0.5.0

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.
Files changed (94) hide show
  1. package/README.md +43 -1
  2. package/dist/args.d.ts +2 -0
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +5 -0
  5. package/dist/args.js.map +1 -1
  6. package/dist/index.d.ts +2 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/provider.d.ts +5 -0
  10. package/dist/provider.d.ts.map +1 -1
  11. package/dist/provider.js +10 -4
  12. package/dist/provider.js.map +1 -1
  13. package/dist/rpc.d.ts +79 -6
  14. package/dist/rpc.d.ts.map +1 -1
  15. package/dist/rpc.js +329 -57
  16. package/dist/rpc.js.map +1 -1
  17. package/dist/runtime-deps.d.ts +30 -0
  18. package/dist/runtime-deps.d.ts.map +1 -0
  19. package/dist/runtime-deps.js +2 -0
  20. package/dist/runtime-deps.js.map +1 -0
  21. package/dist/runtime-session.d.ts +13 -0
  22. package/dist/runtime-session.d.ts.map +1 -0
  23. package/dist/runtime-session.js +41 -0
  24. package/dist/runtime-session.js.map +1 -0
  25. package/dist/runtime-submissions.d.ts +34 -0
  26. package/dist/runtime-submissions.d.ts.map +1 -0
  27. package/dist/runtime-submissions.js +200 -0
  28. package/dist/runtime-submissions.js.map +1 -0
  29. package/dist/runtime.d.ts +33 -131
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +286 -268
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/skill-adapter.d.ts +11 -1
  34. package/dist/skill-adapter.d.ts.map +1 -1
  35. package/dist/skill-adapter.js +60 -7
  36. package/dist/skill-adapter.js.map +1 -1
  37. package/dist/skill-materializer.d.ts +6 -0
  38. package/dist/skill-materializer.d.ts.map +1 -0
  39. package/dist/skill-materializer.js +45 -0
  40. package/dist/skill-materializer.js.map +1 -0
  41. package/dist/source-reservation.d.ts +6 -0
  42. package/dist/source-reservation.d.ts.map +1 -0
  43. package/dist/source-reservation.js +48 -0
  44. package/dist/source-reservation.js.map +1 -0
  45. package/dist/stream.d.ts +3 -1
  46. package/dist/stream.d.ts.map +1 -1
  47. package/dist/stream.js +48 -1
  48. package/dist/stream.js.map +1 -1
  49. package/dist/supervisor.d.ts.map +1 -1
  50. package/dist/supervisor.js +68 -14
  51. package/dist/supervisor.js.map +1 -1
  52. package/dist/transcript/budget.d.ts +8 -0
  53. package/dist/transcript/budget.d.ts.map +1 -0
  54. package/dist/transcript/budget.js +9 -0
  55. package/dist/transcript/budget.js.map +1 -0
  56. package/dist/transcript/completion.d.ts +8 -0
  57. package/dist/transcript/completion.d.ts.map +1 -0
  58. package/dist/transcript/completion.js +57 -0
  59. package/dist/transcript/completion.js.map +1 -0
  60. package/dist/transcript/cursor.d.ts +25 -0
  61. package/dist/transcript/cursor.d.ts.map +1 -0
  62. package/dist/transcript/cursor.js +62 -0
  63. package/dist/transcript/cursor.js.map +1 -0
  64. package/dist/transcript/error.d.ts +9 -0
  65. package/dist/transcript/error.d.ts.map +1 -0
  66. package/dist/transcript/error.js +9 -0
  67. package/dist/transcript/error.js.map +1 -0
  68. package/dist/transcript/native-hash.d.ts +2 -0
  69. package/dist/transcript/native-hash.d.ts.map +1 -0
  70. package/dist/transcript/native-hash.js +79 -0
  71. package/dist/transcript/native-hash.js.map +1 -0
  72. package/dist/transcript/opened-file.d.ts +13 -0
  73. package/dist/transcript/opened-file.d.ts.map +1 -0
  74. package/dist/transcript/opened-file.js +110 -0
  75. package/dist/transcript/opened-file.js.map +1 -0
  76. package/dist/transcript/parallel-tools.d.ts +6 -0
  77. package/dist/transcript/parallel-tools.d.ts.map +1 -0
  78. package/dist/transcript/parallel-tools.js +123 -0
  79. package/dist/transcript/parallel-tools.js.map +1 -0
  80. package/dist/transcript/path.d.ts +25 -0
  81. package/dist/transcript/path.d.ts.map +1 -0
  82. package/dist/transcript/path.js +253 -0
  83. package/dist/transcript/path.js.map +1 -0
  84. package/dist/transcript/reader.d.ts +7 -0
  85. package/dist/transcript/reader.d.ts.map +1 -0
  86. package/dist/transcript/reader.js +476 -0
  87. package/dist/transcript/reader.js.map +1 -0
  88. package/dist/transcript/rewrites.d.ts +5 -0
  89. package/dist/transcript/rewrites.d.ts.map +1 -0
  90. package/dist/transcript/rewrites.js +65 -0
  91. package/dist/transcript/rewrites.js.map +1 -0
  92. package/dist/types.d.ts +33 -3
  93. package/dist/types.d.ts.map +1 -1
  94. package/package.json +4 -3
@@ -0,0 +1,476 @@
1
+ import { budgetTranscriptTurns, isTranscriptTurnCount, readTranscriptBytesAt, renderTranscriptValue, } from '@excitedjs/dreamux-utils';
2
+ import { hasAssistantWithoutHumanBoundary, hasCompletionEvidence, hasOpenTail, isHumanPrompt, } from './completion.js';
3
+ import { claudeQueryFingerprint, decodeClaudeCursor, digest, encodeClaudeCursor, } from './cursor.js';
4
+ import { ClaudeTranscriptError } from './error.js';
5
+ import { openClaudeTranscript, validateClaudeSessionEvidence, } from './opened-file.js';
6
+ import { recoverParallelToolBranches } from './parallel-tools.js';
7
+ import { locateClaudeTranscript, } from './path.js';
8
+ import { applyNativeRewrites } from './rewrites.js';
9
+ const MAX_DECODED_BYTES = 8_388_608;
10
+ const MAX_NATIVE_RECORDS = 20_000;
11
+ const MAX_ELAPSED_MS = 2_000;
12
+ export async function readClaudeTranscript(query, context, testHooks = {}) {
13
+ if (!isTranscriptTurnCount(query.turns)) {
14
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript query turns must be an integer in 1..50');
15
+ }
16
+ const checkpoint = context.checkpoint;
17
+ if (checkpoint === null) {
18
+ throw new ClaudeTranscriptError('checkpoint_missing', 'Claude Code transcript is unavailable before a session is established');
19
+ }
20
+ const includeTools = query.includeTools ?? true;
21
+ const env = effectiveEnvironment(context);
22
+ const located = await locateClaudeTranscript({
23
+ sessionId: checkpoint.id,
24
+ cwd: context.cwd,
25
+ locator: checkpoint.transcript_locator,
26
+ env,
27
+ });
28
+ await testHooks.afterLocate?.();
29
+ const opened = await openClaudeTranscript(located.path, located.root);
30
+ if (opened.dev !== located.dev || opened.ino !== located.ino) {
31
+ await opened.handle.close();
32
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript changed after validation');
33
+ }
34
+ try {
35
+ await validateClaudeSessionEvidence(opened, checkpoint.id, {
36
+ ...(testHooks.maxReadChunkBytes !== undefined
37
+ ? { maxReadChunkBytes: testHooks.maxReadChunkBytes }
38
+ : {}),
39
+ });
40
+ const fingerprint = claudeQueryFingerprint(includeTools);
41
+ const cursor = query.cursor === undefined
42
+ ? null
43
+ : decodeClaudeCursor(query.cursor, fingerprint);
44
+ const endOffset = Math.min(cursor?.pos ?? opened.size, opened.size);
45
+ const rewriteEvidence = await verifyRewriteEvidence(opened, cursor, testHooks.maxReadChunkBytes);
46
+ if (cursor !== null) {
47
+ await verifyCursorBoundaryDigest(opened, cursor.pos, cursor.bd, testHooks.maxReadChunkBytes);
48
+ }
49
+ const window = await readWindow(opened, endOffset, testHooks.maxReadChunkBytes);
50
+ const parsed = parseEntries(window.bytes, window.startOffset, checkpoint.id);
51
+ const logical = applyNativeRewrites(parsed.entries);
52
+ const chain = recoverParallelToolBranches(logical, buildSelectedChain(logical));
53
+ const nativeTurns = groupTurns(chain, includeTools);
54
+ const candidates = nativeTurns.slice(-query.turns).reverse();
55
+ const openTailOnly = cursor === null &&
56
+ candidates.length === 0 &&
57
+ (!hasCompletionEvidence(chain) || hasOpenTail(chain));
58
+ if (candidates.length === 0 &&
59
+ !openTailOnly &&
60
+ parsed.boundReached &&
61
+ hasCompletionEvidence(chain) &&
62
+ hasAssistantWithoutHumanBoundary(chain)) {
63
+ throw new ClaudeTranscriptError('scan_unsupported', 'Claude Code completed turn exceeds the bounded scan limit');
64
+ }
65
+ const budgeted = budgetTranscriptTurns(candidates.map((candidate) => candidate.turn), context.outputBudgetBytes);
66
+ const consumed = candidates.slice(0, budgeted.consumed);
67
+ const hasOlder = !openTailOnly &&
68
+ (consumed.at(-1)?.start ?? endOffset) > 0 &&
69
+ (nativeTurns.length > consumed.length || parsed.boundReached);
70
+ const boundary = consumed.at(-1) ??
71
+ (hasOlder && candidates.length === 0 ? parsed.oldestProcessed : null);
72
+ if (boundary !== null &&
73
+ cursor !== null &&
74
+ boundary.start >= cursor.pos) {
75
+ throw new ClaudeTranscriptError('scan_unsupported', 'Claude Code transcript pagination cannot make safe progress');
76
+ }
77
+ const nextCursor = boundary !== null && hasOlder
78
+ ? encodeClaudeCursor({
79
+ fingerprint,
80
+ generation: rewriteGeneration(rewriteEvidence),
81
+ position: boundary.start,
82
+ boundaryDigest: 'boundaryDigest' in boundary
83
+ ? boundary.boundaryDigest
84
+ : digest(boundary.boundaryBytes),
85
+ rewriteWatermark: rewriteEvidence.watermark,
86
+ rewritePosition: rewriteEvidence.position,
87
+ rewriteDigest: rewriteEvidence.digest,
88
+ })
89
+ : null;
90
+ return {
91
+ turns: [...budgeted.turnsNewestFirst].reverse(),
92
+ nextCursor,
93
+ truncated: budgeted.truncated,
94
+ };
95
+ }
96
+ finally {
97
+ await opened.handle.close();
98
+ }
99
+ }
100
+ async function readWindow(opened, endOffset, maxReadChunkBytes) {
101
+ const startOffset = Math.max(0, endOffset - MAX_DECODED_BYTES);
102
+ const length = endOffset - startOffset;
103
+ const bytes = await readTranscriptBytesAt(opened.handle, startOffset, length, {
104
+ ...(maxReadChunkBytes !== undefined
105
+ ? { maxChunkBytes: maxReadChunkBytes }
106
+ : {}),
107
+ });
108
+ return { bytes, startOffset };
109
+ }
110
+ function parseEntries(bytes, baseOffset, sessionId) {
111
+ const deadline = Date.now() + MAX_ELAPSED_MS;
112
+ const entriesNewestFirst = [];
113
+ const firstBoundary = baseOffset === 0 ? 0 : Math.max(0, bytes.indexOf(0x0a) + 1);
114
+ let lineEnd = bytes.length;
115
+ if (lineEnd > 0 && bytes[lineEnd - 1] !== 0x0a) {
116
+ lineEnd = bytes.lastIndexOf(0x0a, lineEnd - 1) + 1;
117
+ }
118
+ let cursor = lineEnd;
119
+ while (cursor > firstBoundary &&
120
+ entriesNewestFirst.length < MAX_NATIVE_RECORDS &&
121
+ Date.now() <= deadline) {
122
+ const previousNewline = bytes.lastIndexOf(0x0a, cursor - 2);
123
+ const lineStart = Math.max(firstBoundary, previousNewline + 1);
124
+ const rawEnd = cursor - 1;
125
+ const raw = bytes.subarray(lineStart, rawEnd).toString('utf8');
126
+ const value = parseRecord(raw);
127
+ if (value === null && raw.trim() !== '') {
128
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript contains an invalid native record');
129
+ }
130
+ if (value !== null) {
131
+ const nativeSessionId = stringValue(value['sessionId']);
132
+ if (nativeSessionId !== null) {
133
+ if (sessionId !== null && nativeSessionId !== sessionId) {
134
+ throw new ClaudeTranscriptError('session_mismatch', 'Claude Code transcript does not belong to the selected session');
135
+ }
136
+ }
137
+ if (isProjectableRecord(value) && nativeSessionId === null) {
138
+ throw new ClaudeTranscriptError('invalid', 'Claude Code conversation record has no native session id');
139
+ }
140
+ entriesNewestFirst.push({
141
+ start: baseOffset + lineStart,
142
+ end: baseOffset + cursor,
143
+ raw,
144
+ boundaryBytes: bytes.subarray(lineStart, cursor),
145
+ value,
146
+ });
147
+ }
148
+ cursor = lineStart;
149
+ }
150
+ const entries = entriesNewestFirst.reverse();
151
+ return {
152
+ entries,
153
+ oldestProcessed: entries[0] ?? null,
154
+ boundReached: baseOffset > 0 ||
155
+ cursor > firstBoundary ||
156
+ entriesNewestFirst.length >= MAX_NATIVE_RECORDS ||
157
+ Date.now() > deadline,
158
+ };
159
+ }
160
+ function buildSelectedChain(entries) {
161
+ const byId = new Map();
162
+ const parents = new Set();
163
+ for (const entry of entries) {
164
+ const uuid = stringValue(entry.value['uuid']);
165
+ if (uuid === null)
166
+ continue;
167
+ byId.set(uuid, entry);
168
+ const parent = stringValue(entry.value['parentUuid']);
169
+ if (parent !== null)
170
+ parents.add(parent);
171
+ }
172
+ const leaf = [...entries]
173
+ .reverse()
174
+ .find((entry) => {
175
+ const uuid = stringValue(entry.value['uuid']);
176
+ return (uuid !== null &&
177
+ !parents.has(uuid) &&
178
+ isConversationParticipant(entry.value));
179
+ }) ?? null;
180
+ if (leaf === null)
181
+ return [];
182
+ const chain = [];
183
+ const seen = new Set();
184
+ let current = leaf;
185
+ while (current !== undefined && chain.length < MAX_NATIVE_RECORDS) {
186
+ const uuid = stringValue(current.value['uuid']);
187
+ if (uuid === null || seen.has(uuid))
188
+ break;
189
+ seen.add(uuid);
190
+ chain.push(current);
191
+ const parent = stringValue(current.value['parentUuid']) ??
192
+ stringValue(current.value['logicalParentUuid']);
193
+ current = parent === null ? undefined : byId.get(parent);
194
+ }
195
+ return chain.reverse();
196
+ }
197
+ function groupTurns(chain, includeTools) {
198
+ const turns = [];
199
+ let current = [];
200
+ for (const entry of chain) {
201
+ if (isHumanPrompt(entry.value)) {
202
+ commitCurrentTurn(turns, current, includeTools);
203
+ current = [entry];
204
+ }
205
+ else if (current.length > 0) {
206
+ current.push(entry);
207
+ }
208
+ }
209
+ commitCurrentTurn(turns, current, includeTools);
210
+ return turns;
211
+ }
212
+ function commitCurrentTurn(turns, entries, includeTools) {
213
+ if (entries.length === 0 ||
214
+ !hasCompletionEvidence(entries)) {
215
+ return;
216
+ }
217
+ const blocks = [];
218
+ const tools = new Map();
219
+ let startedAt = null;
220
+ let endedAt = null;
221
+ for (const entry of entries) {
222
+ const timestamp = timestampMs(entry.value['timestamp']);
223
+ startedAt ??= timestamp;
224
+ endedAt = timestamp ?? endedAt;
225
+ const type = entry.value['type'];
226
+ const message = recordValue(entry.value['message']);
227
+ const content = message?.['content'];
228
+ if (type === 'user' && isHumanPrompt(entry.value)) {
229
+ const text = visibleText(content, 'text');
230
+ if (text !== '') {
231
+ blocks.push({
232
+ kind: 'message',
233
+ role: 'user',
234
+ text,
235
+ truncated: false,
236
+ });
237
+ }
238
+ }
239
+ else if (type === 'assistant') {
240
+ if (!Array.isArray(content))
241
+ continue;
242
+ const text = visibleText(content, 'text');
243
+ if (text !== '') {
244
+ blocks.push({
245
+ kind: 'message',
246
+ role: 'assistant',
247
+ text,
248
+ truncated: false,
249
+ });
250
+ }
251
+ for (const nativeBlock of content) {
252
+ const block = recordValue(nativeBlock);
253
+ if (block?.['type'] !== 'tool_use')
254
+ continue;
255
+ const id = stringValue(block['id']);
256
+ const name = stringValue(block['name']);
257
+ if (id === null || name === null)
258
+ continue;
259
+ const publicIndex = includeTools ? blocks.length : -1;
260
+ tools.set(id, {
261
+ index: publicIndex,
262
+ name,
263
+ input: renderTranscriptValue(block['input']),
264
+ output: null,
265
+ status: 'error',
266
+ });
267
+ if (includeTools) {
268
+ blocks.push({
269
+ kind: 'tool',
270
+ name,
271
+ input: renderTranscriptValue(block['input']),
272
+ output: null,
273
+ status: 'error',
274
+ inputTruncated: false,
275
+ outputTruncated: false,
276
+ });
277
+ }
278
+ }
279
+ }
280
+ else if (type === 'user' && Array.isArray(content)) {
281
+ for (const nativeBlock of content) {
282
+ const block = recordValue(nativeBlock);
283
+ if (block?.['type'] !== 'tool_result')
284
+ continue;
285
+ const toolUseId = stringValue(block['tool_use_id']);
286
+ if (toolUseId === null)
287
+ continue;
288
+ const tool = tools.get(toolUseId);
289
+ if (tool === undefined)
290
+ continue;
291
+ tool.output = renderToolResult(block['content']);
292
+ tool.status = block['is_error'] === true ? 'error' : 'ok';
293
+ if (includeTools) {
294
+ const publicBlock = blocks[tool.index];
295
+ if (publicBlock?.kind === 'tool') {
296
+ publicBlock.output = tool.output;
297
+ publicBlock.status = tool.status;
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ turns.push({
304
+ start: entries[0].start,
305
+ boundaryDigest: digest(entries[0].boundaryBytes),
306
+ turn: { startedAt, endedAt, blocks },
307
+ });
308
+ }
309
+ async function verifyCursorBoundaryDigest(opened, position, expected, maxReadChunkBytes) {
310
+ const length = Math.min(MAX_DECODED_BYTES, Math.max(0, opened.size - position));
311
+ const bytes = await readTranscriptBytesAt(opened.handle, position, length, {
312
+ ...(maxReadChunkBytes !== undefined
313
+ ? { maxChunkBytes: maxReadChunkBytes }
314
+ : {}),
315
+ });
316
+ const newline = bytes.indexOf(0x0a, 0);
317
+ if (bytes.length === 0) {
318
+ throw new ClaudeTranscriptError('cursor_stale', 'Claude Code transcript cursor is stale');
319
+ }
320
+ if (newline < 0) {
321
+ throw new ClaudeTranscriptError('scan_unsupported', 'Claude Code cursor boundary record exceeds the bounded scan limit');
322
+ }
323
+ const boundaryBytes = bytes.subarray(0, newline + 1);
324
+ if (digest(boundaryBytes) !== expected) {
325
+ throw new ClaudeTranscriptError('cursor_stale', 'Claude Code transcript cursor is stale');
326
+ }
327
+ }
328
+ function isConversationParticipant(value) {
329
+ if (value['isSidechain'] === true || value['isMeta'] === true)
330
+ return false;
331
+ return (value['type'] === 'user' ||
332
+ value['type'] === 'assistant' ||
333
+ (value['type'] === 'system' &&
334
+ (value['subtype'] === 'compact_boundary' ||
335
+ value['subtype'] === 'turn_duration')));
336
+ }
337
+ function isProjectableRecord(value) {
338
+ return (value['type'] === 'user' ||
339
+ value['type'] === 'assistant' ||
340
+ (value['type'] === 'system' && value['subtype'] === 'turn_duration'));
341
+ }
342
+ async function verifyRewriteEvidence(opened, cursor, maxReadChunkBytes) {
343
+ if (cursor === null) {
344
+ const start = Math.max(0, opened.size - MAX_DECODED_BYTES);
345
+ return scanRewriteEvidence(opened, start, opened.size, start === 0, maxReadChunkBytes);
346
+ }
347
+ if (cursor.gen !==
348
+ rewriteGeneration({
349
+ watermark: cursor.rw,
350
+ position: cursor.rp,
351
+ digest: cursor.rd,
352
+ })) {
353
+ throw new ClaudeTranscriptError('cursor_stale', 'Claude Code transcript cursor is stale');
354
+ }
355
+ if (cursor.rw > opened.size) {
356
+ throw new ClaudeTranscriptError('cursor_stale', 'Claude Code transcript cursor is stale');
357
+ }
358
+ if (cursor.rp !== null && cursor.rd !== null) {
359
+ await verifyCursorBoundaryDigest(opened, cursor.rp, cursor.rd, maxReadChunkBytes);
360
+ }
361
+ const appended = await scanRewriteEvidence(opened, cursor.rw, opened.size, true, maxReadChunkBytes);
362
+ if (appended.position !== null) {
363
+ throw new ClaudeTranscriptError('cursor_stale', 'Claude Code transcript cursor is stale');
364
+ }
365
+ return {
366
+ watermark: appended.watermark,
367
+ position: cursor.rp,
368
+ digest: cursor.rd,
369
+ };
370
+ }
371
+ async function scanRewriteEvidence(opened, start, end, startsAtBoundary, maxReadChunkBytes) {
372
+ const length = end - start;
373
+ if (length > MAX_DECODED_BYTES) {
374
+ throw new ClaudeTranscriptError('scan_unsupported', 'Claude Code rewrite interval exceeds the bounded scan limit');
375
+ }
376
+ const data = await readTranscriptBytesAt(opened.handle, start, length, {
377
+ ...(maxReadChunkBytes !== undefined
378
+ ? { maxChunkBytes: maxReadChunkBytes }
379
+ : {}),
380
+ });
381
+ let position = null;
382
+ let evidenceDigest = null;
383
+ let cursor = startsAtBoundary
384
+ ? 0
385
+ : data.indexOf(0x0a) + 1;
386
+ if (cursor === 0 && !startsAtBoundary && data.length > 0) {
387
+ throw new ClaudeTranscriptError('scan_unsupported', 'Claude Code rewrite scan cannot find a bounded record boundary');
388
+ }
389
+ while (cursor < data.length) {
390
+ const newline = data.indexOf(0x0a, cursor);
391
+ if (newline < 0)
392
+ break;
393
+ const raw = data.subarray(cursor, newline).toString('utf8');
394
+ const value = parseRecord(raw);
395
+ if (value === null && raw.trim() !== '') {
396
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript contains an invalid native record');
397
+ }
398
+ if (value !== null && isRewriteRecord(value)) {
399
+ position = start + cursor;
400
+ evidenceDigest = digest(data.subarray(cursor, newline + 1));
401
+ }
402
+ cursor = newline + 1;
403
+ }
404
+ return {
405
+ watermark: start + cursor,
406
+ position,
407
+ digest: evidenceDigest,
408
+ };
409
+ }
410
+ function rewriteGeneration(evidence) {
411
+ return digest(JSON.stringify({
412
+ watermark: evidence.watermark,
413
+ position: evidence.position,
414
+ digest: evidence.digest,
415
+ }));
416
+ }
417
+ function isRewriteRecord(value) {
418
+ return (value['type'] === 'summary' ||
419
+ (value['type'] === 'system' &&
420
+ value['subtype'] === 'compact_boundary') ||
421
+ value['snipMetadata'] !== undefined);
422
+ }
423
+ function visibleText(value, type) {
424
+ if (typeof value === 'string')
425
+ return value;
426
+ if (!Array.isArray(value))
427
+ return '';
428
+ return value
429
+ .flatMap((entry) => {
430
+ const block = recordValue(entry);
431
+ return block?.['type'] === type && typeof block['text'] === 'string'
432
+ ? [block['text']]
433
+ : [];
434
+ })
435
+ .join('');
436
+ }
437
+ function renderToolResult(value) {
438
+ if (typeof value === 'string')
439
+ return value;
440
+ if (Array.isArray(value)) {
441
+ const text = visibleText(value, 'text');
442
+ if (text !== '')
443
+ return text;
444
+ }
445
+ return renderTranscriptValue(value);
446
+ }
447
+ function parseRecord(raw) {
448
+ try {
449
+ return recordValue(JSON.parse(raw));
450
+ }
451
+ catch {
452
+ return null;
453
+ }
454
+ }
455
+ function effectiveEnvironment(context) {
456
+ return {
457
+ ...process.env,
458
+ ...(context.injectEnv ?? {}),
459
+ ...context.config.extra_env,
460
+ };
461
+ }
462
+ function timestampMs(value) {
463
+ if (typeof value !== 'string')
464
+ return null;
465
+ const parsed = Date.parse(value);
466
+ return Number.isNaN(parsed) ? null : parsed;
467
+ }
468
+ function recordValue(value) {
469
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
470
+ ? value
471
+ : null;
472
+ }
473
+ function stringValue(value) {
474
+ return typeof value === 'string' ? value : null;
475
+ }
476
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/transcript/reader.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,gCAAgC,EAChC,qBAAqB,EACrB,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,MAAM,EACN,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,oBAAoB,EAEpB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,iBAAiB,GAAG,SAAS,CAAC;AACpC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,cAAc,GAAG,KAAK,CAAC;AA4B7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAkC,EAClC,OAAkE,EAClE,YAGI,EAAE;IAEN,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,qBAAqB,CAC7B,SAAS,EACT,gEAAgE,CACjE,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,qBAAqB,CAC7B,oBAAoB,EACpB,uEAAuE,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC;IAChD,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC;QAC3C,SAAS,EAAE,UAAU,CAAC,EAAE;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,UAAU,CAAC,kBAAkB;QACtC,GAAG;KACJ,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QAC7D,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,qBAAqB,CAC7B,YAAY,EACZ,iDAAiD,CAClD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACL,MAAM,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE;YACzD,GAAG,CAAC,SAAS,CAAC,iBAAiB,KAAK,SAAS;gBAC3C,CAAC,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,iBAAiB,EAAE;gBACpD,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,SAAS;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,eAAe,GAAG,MAAM,qBAAqB,CACjD,MAAM,EACN,MAAM,EACN,SAAS,CAAC,iBAAiB,CAC5B,CAAC;QACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,0BAA0B,CAC9B,MAAM,EACN,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,EAAE,EACT,SAAS,CAAC,iBAAiB,CAC5B,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,MAAM,EACN,SAAS,EACT,SAAS,CAAC,iBAAiB,CAC5B,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,2BAA2B,CACvC,OAAO,EACP,kBAAkB,CAAC,OAAO,CAAC,CAC5B,CAAC;QACF,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7D,MAAM,YAAY,GAChB,MAAM,KAAK,IAAI;YACf,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,IACE,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,YAAY;YACb,MAAM,CAAC,YAAY;YACnB,qBAAqB,CAAC,KAAK,CAAC;YAC5B,gCAAgC,CAAC,KAAK,CAAC,EACvC,CAAC;YACD,MAAM,IAAI,qBAAqB,CAC7B,kBAAkB,EAClB,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,qBAAqB,CACpC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAC7C,OAAO,CAAC,iBAAiB,CAC1B,CAAC;QACF,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GACZ,CAAC,YAAY;YACb,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC;YACzC,CAAC,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,QAAQ,GACZ,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACf,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,IACE,QAAQ,KAAK,IAAI;YACjB,MAAM,KAAK,IAAI;YACf,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,EAC5B,CAAC;YACD,MAAM,IAAI,qBAAqB,CAC7B,kBAAkB,EAClB,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GACd,QAAQ,KAAK,IAAI,IAAI,QAAQ;YAC3B,CAAC,CAAC,kBAAkB,CAAC;gBACjB,WAAW;gBACX,UAAU,EAAE,iBAAiB,CAAC,eAAe,CAAC;gBAC9C,QAAQ,EAAE,QAAQ,CAAC,KAAK;gBACxB,cAAc,EACZ,gBAAgB,IAAI,QAAQ;oBAC1B,CAAC,CAAC,QAAQ,CAAC,cAAc;oBACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACpC,gBAAgB,EAAE,eAAe,CAAC,SAAS;gBAC3C,eAAe,EAAE,eAAe,CAAC,QAAQ;gBACzC,aAAa,EAAE,eAAe,CAAC,MAAM;aACtC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC;QACX,OAAO;YACL,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE;YAC/C,UAAU;YACV,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC;IACF,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAA8B,EAC9B,SAAiB,EACjB,iBAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE;QAC5E,GAAG,CAAC,iBAAiB,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE;YACtC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CACnB,KAAa,EACb,UAAkB,EAClB,SAAwB;IAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAC7C,MAAM,kBAAkB,GAAkB,EAAE,CAAC;IAC7C,MAAM,aAAa,GACjB,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,OACE,MAAM,GAAG,aAAa;QACtB,kBAAkB,CAAC,MAAM,GAAG,kBAAkB;QAC9C,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EACtB,CAAC;QACD,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,qBAAqB,CAC7B,SAAS,EACT,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACxD,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,IAAI,SAAS,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACxD,MAAM,IAAI,qBAAqB,CAC7B,kBAAkB,EAClB,gEAAgE,CACjE,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC3D,MAAM,IAAI,qBAAqB,CAC7B,SAAS,EACT,0DAA0D,CAC3D,CAAC;YACJ,CAAC;YACD,kBAAkB,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAE,UAAU,GAAG,SAAS;gBAC7B,GAAG,EAAE,UAAU,GAAG,MAAM;gBACxB,GAAG;gBACH,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAChD,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC;IAC7C,OAAO;QACL,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;QACnC,YAAY,EACV,UAAU,GAAG,CAAC;YACd,MAAM,GAAG,aAAa;YACtB,kBAAkB,CAAC,MAAM,IAAI,kBAAkB;YAC/C,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA+B;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GACR,CAAC,GAAG,OAAO,CAAC;SACT,OAAO,EAAE;SACT,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,OAAO,CACL,IAAI,KAAK,IAAI;YACb,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAClB,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CACvC,CAAC;IACJ,CAAC,CAAC,IAAI,IAAI,CAAC;IACf,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,OAAO,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,MAAM,MAAM,GACV,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAClD,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,UAAU,CACjB,KAA6B,EAC7B,YAAqB;IAErB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAChD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAmB,EACnB,OAA+B,EAC/B,YAAqB;IAErB,IACE,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAC/B,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EASlB,CAAC;IACJ,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,SAAS,KAAK,SAAS,CAAC;QACxB,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,MAAM;oBACZ,IAAI;oBACJ,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,IAAI;oBACJ,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;gBACvC,IAAI,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,UAAU;oBAAE,SAAS;gBAC7C,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxC,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;oBAAE,SAAS;gBAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;oBACZ,KAAK,EAAE,WAAW;oBAClB,IAAI;oBACJ,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC5C,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;gBACH,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,MAAM;wBACZ,IAAI;wBACJ,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC5C,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,OAAO;wBACf,cAAc,EAAE,KAAK;wBACrB,eAAe,EAAE,KAAK;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;gBACvC,IAAI,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,aAAa;oBAAE,SAAS;gBAChD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;gBACpD,IAAI,SAAS,KAAK,IAAI;oBAAE,SAAS;gBACjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAClC,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAS;gBACjC,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1D,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACvC,IAAI,WAAW,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;wBACjC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;wBACjC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC;QACT,KAAK,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK;QACxB,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,aAAa,CAAC;QACjD,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE;KACrC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,MAA8B,EAC9B,QAAgB,EAChB,QAAgB,EAChB,iBAA0B;IAExB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,iBAAiB,EACjB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,CACpC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;QACzE,GAAG,CAAC,iBAAiB,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE;YACtC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,qBAAqB,CAC7B,cAAc,EACd,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,qBAAqB,CAC7B,kBAAkB,EAClB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,qBAAqB,CAC7B,cAAc,EACd,wCAAwC,CACzC,CAAC;IACJ,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,KAA8B;IAC/D,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5E,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM;QACxB,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW;QAC7B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,kBAAkB;gBACtC,KAAK,CAAC,SAAS,CAAC,KAAK,eAAe,CAAC,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA8B;IACzD,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM;QACxB,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW;QAC7B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,eAAe,CAAC,CACrE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAA8B,EAC9B,MAAoD,EACpD,iBAA0B;IAE1B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,CAAC;QAC3D,OAAO,mBAAmB,CACxB,MAAM,EACN,KAAK,EACL,MAAM,CAAC,IAAI,EACX,KAAK,KAAK,CAAC,EACX,iBAAiB,CAClB,CAAC;IACJ,CAAC;IACD,IACE,MAAM,CAAC,GAAG;QACV,iBAAiB,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC,EAAE;YACpB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,MAAM,CAAC,EAAE;SAClB,CAAC,EACF,CAAC;QACD,MAAM,IAAI,qBAAqB,CAC7B,cAAc,EACd,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,qBAAqB,CAC7B,cAAc,EACd,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,0BAA0B,CAC9B,MAAM,EACN,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,EAAE,EACT,iBAAiB,CAClB,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,MAAM,EACN,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,IAAI,EACX,IAAI,EACJ,iBAAiB,CAClB,CAAC;IACF,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,qBAAqB,CAC7B,cAAc,EACd,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAA8B,EAC9B,KAAa,EACb,GAAW,EACX,gBAAyB,EACzB,iBAA0B;IAE1B,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC;IAC3B,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC/B,MAAM,IAAI,qBAAqB,CAC7B,kBAAkB,EAClB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QACrE,GAAG,CAAC,iBAAiB,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE;YACtC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,MAAM,GAAG,gBAAgB;QAC3B,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,qBAAqB,CAC7B,kBAAkB,EAClB,gEAAgE,CACjE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,qBAAqB,CAC7B,SAAS,EACT,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;YAC1B,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO;QACL,SAAS,EAAE,KAAK,GAAG,MAAM;QACzB,QAAQ;QACR,MAAM,EAAE,cAAc;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAyB;IAClD,OAAO,MAAM,CACX,IAAI,CAAC,SAAS,CAAC;QACb,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAA8B;IACrD,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS;QAC3B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;YACzB,KAAK,CAAC,SAAS,CAAC,KAAK,kBAAkB,CAAC;QAC1C,KAAK,CAAC,cAAc,CAAC,KAAK,SAAS,CACpC,CAAC;AACJ,CAAC;AAGD,SAAS,WAAW,CAAC,KAAc,EAAE,IAAY;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;YAClE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;IAC/B,CAAC;IACD,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAkE;IAElE,OAAO;QACL,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface ClaudeRewriteEntry {
2
+ value: Record<string, unknown>;
3
+ }
4
+ export declare function applyNativeRewrites<TEntry extends ClaudeRewriteEntry>(entries: readonly TEntry[]): TEntry[];
5
+ //# sourceMappingURL=rewrites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrites.d.ts","sourceRoot":"","sources":["../../src/transcript/rewrites.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,kBAAkB,EACnE,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,EAAE,CAqDV"}
@@ -0,0 +1,65 @@
1
+ export function applyNativeRewrites(entries) {
2
+ const removed = new Set();
3
+ for (const entry of entries) {
4
+ const metadata = recordValue(entry.value['snipMetadata']);
5
+ const uuids = metadata?.['removedUuids'];
6
+ if (Array.isArray(uuids)) {
7
+ for (const uuid of uuids) {
8
+ if (typeof uuid === 'string')
9
+ removed.add(uuid);
10
+ }
11
+ }
12
+ }
13
+ const byId = new Map();
14
+ const parentById = new Map();
15
+ for (const entry of entries) {
16
+ const uuid = stringValue(entry.value['uuid']);
17
+ if (uuid === null)
18
+ continue;
19
+ parentById.set(uuid, stringValue(entry.value['parentUuid']));
20
+ if (!removed.has(uuid))
21
+ byId.set(uuid, entry);
22
+ }
23
+ if (removed.size === 0)
24
+ return [...byId.values()];
25
+ const resolvedParents = new Map();
26
+ const resolveParent = (uuid) => {
27
+ if (resolvedParents.has(uuid))
28
+ return resolvedParents.get(uuid) ?? null;
29
+ const path = [];
30
+ const seen = new Set();
31
+ let current = uuid;
32
+ while (current !== null &&
33
+ removed.has(current) &&
34
+ !seen.has(current)) {
35
+ seen.add(current);
36
+ path.push(current);
37
+ if (resolvedParents.has(current)) {
38
+ current = resolvedParents.get(current) ?? null;
39
+ break;
40
+ }
41
+ current = parentById.get(current) ?? null;
42
+ }
43
+ const resolved = current !== null && seen.has(current) ? null : current;
44
+ for (const removedUuid of path) {
45
+ resolvedParents.set(removedUuid, resolved);
46
+ }
47
+ return resolved;
48
+ };
49
+ for (const entry of byId.values()) {
50
+ let parent = stringValue(entry.value['parentUuid']);
51
+ if (parent !== null && removed.has(parent))
52
+ parent = resolveParent(parent);
53
+ entry.value['parentUuid'] = parent;
54
+ }
55
+ return [...byId.values()];
56
+ }
57
+ function recordValue(value) {
58
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
59
+ ? value
60
+ : null;
61
+ }
62
+ function stringValue(value) {
63
+ return typeof value === 'string' ? value : null;
64
+ }
65
+ //# sourceMappingURL=rewrites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrites.js","sourceRoot":"","sources":["../../src/transcript/rewrites.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -13,6 +13,7 @@ export type ParsedLine = {
13
13
  kind: 'init';
14
14
  sessionId: string | null;
15
15
  model: string | null;
16
+ capabilities: readonly string[];
16
17
  raw: JsonObject;
17
18
  } | {
18
19
  kind: 'assistant';
@@ -23,6 +24,11 @@ export type ParsedLine = {
23
24
  kind: 'result';
24
25
  outcome: ResultEnvelope;
25
26
  raw: JsonObject;
27
+ } | {
28
+ kind: 'command_lifecycle';
29
+ commandUuid: string | null;
30
+ state: CommandLifecycleState | null;
31
+ raw: JsonObject;
26
32
  } | {
27
33
  kind: 'control_request';
28
34
  requestId: string | null;
@@ -45,6 +51,7 @@ export type ParsedLine = {
45
51
  kind: 'parse_error';
46
52
  raw: string;
47
53
  };
54
+ export type CommandLifecycleState = 'queued' | 'started' | 'completed' | 'cancelled' | 'discarded' | 'refused';
48
55
  /** The terminal `result` envelope, reduced to what the runtime records per turn. */
49
56
  export interface ResultEnvelope {
50
57
  /** `success` or one of the `error_*` subtypes. Unknown subtypes pass through. */
@@ -53,6 +60,17 @@ export interface ResultEnvelope {
53
60
  /** The success-path final text (`result`); `null` for error subtypes. */
54
61
  readonly text: string | null;
55
62
  readonly sessionId: string | null;
63
+ /**
64
+ * The `uuid` of the inbound user message this result answers
65
+ * (`result.user_message_uuid`), or `null` on builds that omit it.
66
+ *
67
+ * This is an optional attribution hint on the wire: `result` carries no
68
+ * `command_uuid`, its own `uuid` is server-generated, and `session_id` is
69
+ * shared by every execution window of the resident session. The RPC layer
70
+ * validates a present value against submitted commands; started lifecycle
71
+ * facts own attribution when this field is absent.
72
+ */
73
+ readonly userMessageUuid: string | null;
56
74
  /** Error subtypes may carry a message list; empty otherwise. */
57
75
  readonly errors: readonly string[];
58
76
  /**
@@ -119,7 +137,19 @@ export interface ClaudeCodeSessionSpec {
119
137
  onRemoteControlUrl?: (url: string) => void;
120
138
  /** Diagnostic logger for protocol-level events (parse errors, control answers). */
121
139
  log?: (level: 'info' | 'warn' | 'error', msg: string, err?: unknown) => void;
140
+ onProtocolEvent?: (event: ClaudeProtocolEvent) => void;
122
141
  }
142
+ export type ClaudeProtocolEvent = {
143
+ readonly kind: 'command_lifecycle';
144
+ readonly commandUuid: string;
145
+ readonly state: CommandLifecycleState;
146
+ } | {
147
+ readonly kind: 'stream';
148
+ readonly line: ParsedLine;
149
+ } | {
150
+ readonly kind: 'result';
151
+ readonly outcome: TurnOutcome;
152
+ };
123
153
  /**
124
154
  * A resident Claude Code session. Full turns are serialized by the caller;
125
155
  * `steerTurn` is the one allowed concurrent write, used to steer the active
@@ -128,10 +158,10 @@ export interface ClaudeCodeSessionSpec {
128
158
  export interface ClaudeCodeSession {
129
159
  /** Spawn the child and resolve once it is up (reject on spawn error). */
130
160
  start(): Promise<void>;
131
- /** Submit one user turn; resolve with the outcome when `result` lands. */
132
- submitTurn(prompt: string, options?: TurnSubmitOptions): Promise<TurnOutcome>;
161
+ /** Submit one user turn; resolve once all accepted commands have drained. */
162
+ submitTurn(prompt: string, options?: TurnSubmitOptions, commandUuid?: string): Promise<void>;
133
163
  /** Send a user message into the active turn without awaiting a separate result. */
134
- steerTurn(prompt: string, options?: TurnSubmitOptions): Promise<void>;
164
+ steerTurn(prompt: string, options?: TurnSubmitOptions, commandUuid?: string): Promise<void>;
135
165
  /** Whether the child is currently alive. */
136
166
  isAlive(): boolean;
137
167
  /**