@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.
- package/README.md +43 -1
- package/dist/args.d.ts +2 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +5 -0
- package/dist/args.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts +5 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +10 -4
- package/dist/provider.js.map +1 -1
- package/dist/rpc.d.ts +79 -6
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +329 -57
- package/dist/rpc.js.map +1 -1
- package/dist/runtime-deps.d.ts +30 -0
- package/dist/runtime-deps.d.ts.map +1 -0
- package/dist/runtime-deps.js +2 -0
- package/dist/runtime-deps.js.map +1 -0
- package/dist/runtime-session.d.ts +13 -0
- package/dist/runtime-session.d.ts.map +1 -0
- package/dist/runtime-session.js +41 -0
- package/dist/runtime-session.js.map +1 -0
- package/dist/runtime-submissions.d.ts +34 -0
- package/dist/runtime-submissions.d.ts.map +1 -0
- package/dist/runtime-submissions.js +200 -0
- package/dist/runtime-submissions.js.map +1 -0
- package/dist/runtime.d.ts +33 -131
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +286 -268
- package/dist/runtime.js.map +1 -1
- package/dist/skill-adapter.d.ts +11 -1
- package/dist/skill-adapter.d.ts.map +1 -1
- package/dist/skill-adapter.js +60 -7
- package/dist/skill-adapter.js.map +1 -1
- package/dist/skill-materializer.d.ts +6 -0
- package/dist/skill-materializer.d.ts.map +1 -0
- package/dist/skill-materializer.js +45 -0
- package/dist/skill-materializer.js.map +1 -0
- package/dist/source-reservation.d.ts +6 -0
- package/dist/source-reservation.d.ts.map +1 -0
- package/dist/source-reservation.js +48 -0
- package/dist/source-reservation.js.map +1 -0
- package/dist/stream.d.ts +3 -1
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +48 -1
- package/dist/stream.js.map +1 -1
- package/dist/supervisor.d.ts.map +1 -1
- package/dist/supervisor.js +68 -14
- package/dist/supervisor.js.map +1 -1
- package/dist/transcript/budget.d.ts +8 -0
- package/dist/transcript/budget.d.ts.map +1 -0
- package/dist/transcript/budget.js +9 -0
- package/dist/transcript/budget.js.map +1 -0
- package/dist/transcript/completion.d.ts +8 -0
- package/dist/transcript/completion.d.ts.map +1 -0
- package/dist/transcript/completion.js +57 -0
- package/dist/transcript/completion.js.map +1 -0
- package/dist/transcript/cursor.d.ts +25 -0
- package/dist/transcript/cursor.d.ts.map +1 -0
- package/dist/transcript/cursor.js +62 -0
- package/dist/transcript/cursor.js.map +1 -0
- package/dist/transcript/error.d.ts +9 -0
- package/dist/transcript/error.d.ts.map +1 -0
- package/dist/transcript/error.js +9 -0
- package/dist/transcript/error.js.map +1 -0
- package/dist/transcript/native-hash.d.ts +2 -0
- package/dist/transcript/native-hash.d.ts.map +1 -0
- package/dist/transcript/native-hash.js +79 -0
- package/dist/transcript/native-hash.js.map +1 -0
- package/dist/transcript/opened-file.d.ts +13 -0
- package/dist/transcript/opened-file.d.ts.map +1 -0
- package/dist/transcript/opened-file.js +110 -0
- package/dist/transcript/opened-file.js.map +1 -0
- package/dist/transcript/parallel-tools.d.ts +6 -0
- package/dist/transcript/parallel-tools.d.ts.map +1 -0
- package/dist/transcript/parallel-tools.js +123 -0
- package/dist/transcript/parallel-tools.js.map +1 -0
- package/dist/transcript/path.d.ts +25 -0
- package/dist/transcript/path.d.ts.map +1 -0
- package/dist/transcript/path.js +253 -0
- package/dist/transcript/path.js.map +1 -0
- package/dist/transcript/reader.d.ts +7 -0
- package/dist/transcript/reader.d.ts.map +1 -0
- package/dist/transcript/reader.js +476 -0
- package/dist/transcript/reader.js.map +1 -0
- package/dist/transcript/rewrites.d.ts +5 -0
- package/dist/transcript/rewrites.d.ts.map +1 -0
- package/dist/transcript/rewrites.js +65 -0
- package/dist/transcript/rewrites.js.map +1 -0
- package/dist/types.d.ts +33 -3
- package/dist/types.d.ts.map +1 -1
- 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 @@
|
|
|
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
|
|
132
|
-
submitTurn(prompt: string, options?: TurnSubmitOptions): Promise<
|
|
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
|
/**
|