@excitedjs/agent-runtime-codex 0.3.5-beta.168 → 0.4.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 +39 -1
- package/dist/events.d.ts +8 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +119 -47
- package/dist/events.js.map +1 -1
- package/dist/provider.d.ts +3 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +6 -3
- package/dist/provider.js.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +9 -1
- package/dist/rpc.js.map +1 -1
- package/dist/runtime.d.ts +15 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +242 -80
- package/dist/runtime.js.map +1 -1
- package/dist/supervisor.d.ts +7 -0
- package/dist/supervisor.d.ts.map +1 -1
- package/dist/supervisor.js +99 -43
- 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/cursor.d.ts +23 -0
- package/dist/transcript/cursor.d.ts.map +1 -0
- package/dist/transcript/cursor.js +57 -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/opened-file.d.ts +10 -0
- package/dist/transcript/opened-file.d.ts.map +1 -0
- package/dist/transcript/opened-file.js +61 -0
- package/dist/transcript/opened-file.js.map +1 -0
- package/dist/transcript/path.d.ts +28 -0
- package/dist/transcript/path.d.ts.map +1 -0
- package/dist/transcript/path.js +422 -0
- package/dist/transcript/path.js.map +1 -0
- package/dist/transcript/projection.d.ts +6 -0
- package/dist/transcript/projection.d.ts.map +1 -0
- package/dist/transcript/projection.js +170 -0
- package/dist/transcript/projection.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 +421 -0
- package/dist/transcript/reader.js.map +1 -0
- package/dist/turn-manager.d.ts +34 -56
- package/dist/turn-manager.d.ts.map +1 -1
- package/dist/turn-manager.js +369 -303
- package/dist/turn-manager.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { budgetTranscriptTurns, isTranscriptTurnCount, readTranscriptBytesAt, } from '@excitedjs/dreamux-utils';
|
|
2
|
+
import { createCodexTranscriptBudget } from './budget.js';
|
|
3
|
+
import { codexQueryFingerprint, decodeCodexCursor, digest, encodeCodexCursor, } from './cursor.js';
|
|
4
|
+
import { CodexTranscriptError } from './error.js';
|
|
5
|
+
import { openCodexTranscript, } from './opened-file.js';
|
|
6
|
+
import { findCodexRolloutById, locateCodexTranscript, readCodexTranscriptText, resolveCodexTranscriptRoots, } from './path.js';
|
|
7
|
+
import { projectCodexTurn } from './projection.js';
|
|
8
|
+
const MAX_DECODED_BYTES = 8_388_608;
|
|
9
|
+
const MAX_NATIVE_RECORDS = 20_000;
|
|
10
|
+
const MAX_ELAPSED_MS = 2_000;
|
|
11
|
+
export async function readCodexTranscript(query, context, testHooks = {}) {
|
|
12
|
+
if (!isTranscriptTurnCount(query.turns)) {
|
|
13
|
+
throw new CodexTranscriptError('invalid', 'Codex transcript query turns must be an integer in 1..50');
|
|
14
|
+
}
|
|
15
|
+
const checkpoint = context.checkpoint;
|
|
16
|
+
if (checkpoint === null) {
|
|
17
|
+
throw new CodexTranscriptError('checkpoint_missing', 'Codex transcript is unavailable before a session is established');
|
|
18
|
+
}
|
|
19
|
+
const includeTools = query.includeTools ?? true;
|
|
20
|
+
const roots = await resolveCodexTranscriptRoots(effectiveEnvironment(context));
|
|
21
|
+
const discoveryBudget = createCodexTranscriptBudget();
|
|
22
|
+
const tail = await locateCodexTranscript(checkpoint.transcript_locator, checkpoint.id, roots, discoveryBudget);
|
|
23
|
+
const lineage = await buildLineage(tail, roots, discoveryBudget);
|
|
24
|
+
await testHooks.afterLocate?.();
|
|
25
|
+
const generation = lineageGeneration(lineage);
|
|
26
|
+
const fingerprint = codexQueryFingerprint(includeTools);
|
|
27
|
+
const cursor = query.cursor === undefined
|
|
28
|
+
? null
|
|
29
|
+
: decodeCodexCursor(query.cursor, fingerprint);
|
|
30
|
+
if (cursor !== null && cursor.gen !== generation) {
|
|
31
|
+
throw new CodexTranscriptError('cursor_stale', 'Codex transcript cursor is stale');
|
|
32
|
+
}
|
|
33
|
+
if (cursor !== null) {
|
|
34
|
+
await verifyBoundaryDigest(lineage, cursor.pos, cursor.bd, testHooks.maxReadChunkBytes);
|
|
35
|
+
}
|
|
36
|
+
const scan = await scanTurns({
|
|
37
|
+
lineage,
|
|
38
|
+
roots,
|
|
39
|
+
startPosition: cursor?.pos ?? null,
|
|
40
|
+
turns: query.turns,
|
|
41
|
+
includeTools,
|
|
42
|
+
maxReadChunkBytes: testHooks.maxReadChunkBytes,
|
|
43
|
+
});
|
|
44
|
+
const budgeted = budgetTranscriptTurns(scan.candidates.map((candidate) => candidate.native.turn), context.outputBudgetBytes);
|
|
45
|
+
const consumed = scan.candidates.slice(0, budgeted.consumed);
|
|
46
|
+
const omittedForBudget = budgeted.consumed < scan.candidates.length;
|
|
47
|
+
const cursorTarget = consumed.at(-1) ??
|
|
48
|
+
(budgeted.consumed === 0 ? null : scan.candidates[0] ?? null);
|
|
49
|
+
let nextPosition = null;
|
|
50
|
+
let nextBoundaryDigest = null;
|
|
51
|
+
if (cursorTarget !== null && (omittedForBudget || scan.hasOlder)) {
|
|
52
|
+
nextPosition = {
|
|
53
|
+
segment: cursorTarget.segment,
|
|
54
|
+
offset: cursorTarget.native.start,
|
|
55
|
+
};
|
|
56
|
+
nextBoundaryDigest = cursorTarget.native.boundaryDigest;
|
|
57
|
+
}
|
|
58
|
+
else if (consumed.length === 0 && scan.resumePosition !== null) {
|
|
59
|
+
nextPosition = scan.resumePosition;
|
|
60
|
+
nextBoundaryDigest = scan.resumeBoundaryDigest;
|
|
61
|
+
}
|
|
62
|
+
if (nextPosition !== null &&
|
|
63
|
+
cursor !== null &&
|
|
64
|
+
!isStrictlyOlder(nextPosition, cursor.pos)) {
|
|
65
|
+
throw new CodexTranscriptError('scan_unsupported', 'Codex transcript pagination cannot make safe progress');
|
|
66
|
+
}
|
|
67
|
+
const nextCursor = nextPosition !== null && nextBoundaryDigest !== null
|
|
68
|
+
? encodeCodexCursor({
|
|
69
|
+
fingerprint,
|
|
70
|
+
generation,
|
|
71
|
+
position: nextPosition,
|
|
72
|
+
boundaryDigest: nextBoundaryDigest,
|
|
73
|
+
})
|
|
74
|
+
: null;
|
|
75
|
+
return {
|
|
76
|
+
turns: [...budgeted.turnsNewestFirst].reverse(),
|
|
77
|
+
nextCursor,
|
|
78
|
+
truncated: budgeted.truncated,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async function buildLineage(tail, roots, budget) {
|
|
82
|
+
const lineage = [{ transcript: tail, endOffset: null }];
|
|
83
|
+
const visited = new Set([tail.rolloutId]);
|
|
84
|
+
let current = tail;
|
|
85
|
+
while (current.historyBase !== null) {
|
|
86
|
+
if (visited.has(current.historyBase.rolloutId)) {
|
|
87
|
+
throw new CodexTranscriptError('invalid', 'Codex transcript lineage contains a cycle');
|
|
88
|
+
}
|
|
89
|
+
const parent = await findCodexRolloutById(roots, current.historyBase.rolloutId, budget);
|
|
90
|
+
visited.add(parent.rolloutId);
|
|
91
|
+
lineage.push({
|
|
92
|
+
transcript: parent,
|
|
93
|
+
endOffset: current.historyBase.endByteOffset,
|
|
94
|
+
});
|
|
95
|
+
current = parent;
|
|
96
|
+
if (lineage.length > 64) {
|
|
97
|
+
throw new CodexTranscriptError('scan_unsupported', 'Codex transcript lineage exceeds the bounded depth');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return lineage;
|
|
101
|
+
}
|
|
102
|
+
function lineageGeneration(lineage) {
|
|
103
|
+
return digest(JSON.stringify({
|
|
104
|
+
lineage: lineage.map((segment) => ({
|
|
105
|
+
rollout: digest(segment.transcript.rolloutId),
|
|
106
|
+
end: segment.endOffset,
|
|
107
|
+
})),
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
async function scanTurns(input) {
|
|
111
|
+
if (input.startPosition !== null &&
|
|
112
|
+
input.startPosition.segment >= input.lineage.length) {
|
|
113
|
+
throw new CodexTranscriptError('cursor_stale', 'Codex transcript cursor is stale');
|
|
114
|
+
}
|
|
115
|
+
const deadline = Date.now() + MAX_ELAPSED_MS;
|
|
116
|
+
let bytesRemaining = MAX_DECODED_BYTES;
|
|
117
|
+
let recordsRemaining = MAX_NATIVE_RECORDS;
|
|
118
|
+
const candidates = [];
|
|
119
|
+
let resumePosition = null;
|
|
120
|
+
let resumeBoundaryDigest = null;
|
|
121
|
+
let stoppedBeforeOrigin = false;
|
|
122
|
+
const firstSegment = input.startPosition?.segment ?? 0;
|
|
123
|
+
for (let segmentIndex = firstSegment; segmentIndex < input.lineage.length; segmentIndex += 1) {
|
|
124
|
+
if (Date.now() > deadline) {
|
|
125
|
+
stoppedBeforeOrigin = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
const segment = input.lineage[segmentIndex];
|
|
129
|
+
const endOffset = segmentIndex === firstSegment && input.startPosition !== null
|
|
130
|
+
? input.startPosition.offset
|
|
131
|
+
: segment.endOffset;
|
|
132
|
+
const window = await loadLineWindow(segment.transcript, endOffset, bytesRemaining, input.maxReadChunkBytes);
|
|
133
|
+
bytesRemaining -= window.bytesRead;
|
|
134
|
+
const parsed = parseNativeTurns(window.lines, input.includeTools, recordsRemaining, deadline);
|
|
135
|
+
recordsRemaining -= parsed.records;
|
|
136
|
+
for (const native of parsed.turns) {
|
|
137
|
+
if (candidates.length >= input.turns) {
|
|
138
|
+
return {
|
|
139
|
+
candidates,
|
|
140
|
+
hasOlder: true,
|
|
141
|
+
resumePosition: null,
|
|
142
|
+
resumeBoundaryDigest: null,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
candidates.push({ segment: segmentIndex, native });
|
|
146
|
+
}
|
|
147
|
+
const segmentOriginReached = window.bytesRead > 0 &&
|
|
148
|
+
parsed.incompleteBoundary === null &&
|
|
149
|
+
!parsed.boundReached &&
|
|
150
|
+
window.startOffset === 0;
|
|
151
|
+
if (candidates.length >= input.turns &&
|
|
152
|
+
(!segmentOriginReached ||
|
|
153
|
+
segmentIndex + 1 < input.lineage.length)) {
|
|
154
|
+
return {
|
|
155
|
+
candidates,
|
|
156
|
+
hasOlder: true,
|
|
157
|
+
resumePosition: null,
|
|
158
|
+
resumeBoundaryDigest: null,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (parsed.incompleteBoundary !== null) {
|
|
162
|
+
if (candidates.length === 0 &&
|
|
163
|
+
input.startPosition === null &&
|
|
164
|
+
segmentIndex === 0 &&
|
|
165
|
+
parsed.sawOpenTail) {
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
if (candidates.length === 0) {
|
|
169
|
+
throw new CodexTranscriptError('scan_unsupported', 'Codex completed turn exceeds the bounded scan limit');
|
|
170
|
+
}
|
|
171
|
+
stoppedBeforeOrigin = true;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
if (parsed.boundReached || window.startOffset > 0) {
|
|
175
|
+
if (candidates.length === 0 &&
|
|
176
|
+
input.startPosition === null &&
|
|
177
|
+
segmentIndex === 0 &&
|
|
178
|
+
!parsed.sawCompleteMarker) {
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
if (candidates.length === 0) {
|
|
182
|
+
const boundary = parsed.oldestProcessed;
|
|
183
|
+
if (boundary === null) {
|
|
184
|
+
throw new CodexTranscriptError('scan_unsupported', 'Codex transcript pagination cannot make safe progress');
|
|
185
|
+
}
|
|
186
|
+
resumePosition = {
|
|
187
|
+
segment: segmentIndex,
|
|
188
|
+
offset: boundary.start,
|
|
189
|
+
};
|
|
190
|
+
resumeBoundaryDigest = digest(boundary.boundaryBytes);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
stoppedBeforeOrigin = true;
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
if (bytesRemaining <= 0 || recordsRemaining <= 0 || Date.now() > deadline) {
|
|
198
|
+
if (candidates.length === 0) {
|
|
199
|
+
throw new CodexTranscriptError('scan_unsupported', 'Codex transcript pagination cannot make safe progress');
|
|
200
|
+
}
|
|
201
|
+
if (!segmentOriginReached ||
|
|
202
|
+
segmentIndex + 1 < input.lineage.length) {
|
|
203
|
+
stoppedBeforeOrigin = true;
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
candidates,
|
|
210
|
+
hasOlder: resumePosition !== null || stoppedBeforeOrigin,
|
|
211
|
+
resumePosition,
|
|
212
|
+
resumeBoundaryDigest,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async function loadLineWindow(transcript, requestedEndOffset, maxBytes, maxReadChunkBytes) {
|
|
216
|
+
if (maxBytes <= 0) {
|
|
217
|
+
return { lines: [], startOffset: 0, endOffset: 0, bytesRead: 0 };
|
|
218
|
+
}
|
|
219
|
+
const opened = await openValidatedSegment(transcript);
|
|
220
|
+
try {
|
|
221
|
+
if (opened.path.endsWith('.zst')) {
|
|
222
|
+
const text = await readCodexTranscriptText(opened, maxBytes);
|
|
223
|
+
const bytes = Buffer.from(text, 'utf8');
|
|
224
|
+
const end = Math.min(requestedEndOffset ?? bytes.length, bytes.length);
|
|
225
|
+
const limited = bytes.subarray(0, end);
|
|
226
|
+
return {
|
|
227
|
+
lines: parseLines(limited, 0, true),
|
|
228
|
+
startOffset: 0,
|
|
229
|
+
endOffset: end,
|
|
230
|
+
bytesRead: limited.length,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
const end = Math.min(requestedEndOffset ?? opened.size, opened.size);
|
|
234
|
+
const start = Math.max(0, end - maxBytes);
|
|
235
|
+
const length = end - start;
|
|
236
|
+
const data = await readTranscriptBytesAt(opened.handle, start, length, {
|
|
237
|
+
...(maxReadChunkBytes !== undefined
|
|
238
|
+
? { maxChunkBytes: maxReadChunkBytes }
|
|
239
|
+
: {}),
|
|
240
|
+
});
|
|
241
|
+
return {
|
|
242
|
+
lines: parseLines(data, start, start === 0),
|
|
243
|
+
startOffset: start,
|
|
244
|
+
endOffset: start + data.length,
|
|
245
|
+
bytesRead: data.length,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
finally {
|
|
249
|
+
await opened.handle.close();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function parseLines(bytes, baseOffset, startsAtBoundary) {
|
|
253
|
+
let localStart = 0;
|
|
254
|
+
if (!startsAtBoundary) {
|
|
255
|
+
const firstNewline = bytes.indexOf(0x0a);
|
|
256
|
+
if (firstNewline < 0)
|
|
257
|
+
return [];
|
|
258
|
+
localStart = firstNewline + 1;
|
|
259
|
+
}
|
|
260
|
+
const lines = [];
|
|
261
|
+
let cursor = localStart;
|
|
262
|
+
while (cursor < bytes.length) {
|
|
263
|
+
const newline = bytes.indexOf(0x0a, cursor);
|
|
264
|
+
if (newline < 0)
|
|
265
|
+
break;
|
|
266
|
+
const raw = bytes.subarray(cursor, newline).toString('utf8');
|
|
267
|
+
if (raw.trim() !== '') {
|
|
268
|
+
let value;
|
|
269
|
+
try {
|
|
270
|
+
value = JSON.parse(raw);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
throw new CodexTranscriptError('invalid', 'Codex transcript contains an invalid native record', { cause: error });
|
|
274
|
+
}
|
|
275
|
+
if (isRecord(value)) {
|
|
276
|
+
lines.push({
|
|
277
|
+
start: baseOffset + cursor,
|
|
278
|
+
end: baseOffset + newline + 1,
|
|
279
|
+
raw,
|
|
280
|
+
boundaryBytes: bytes.subarray(cursor, newline + 1),
|
|
281
|
+
value,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
cursor = newline + 1;
|
|
286
|
+
}
|
|
287
|
+
return lines;
|
|
288
|
+
}
|
|
289
|
+
function parseNativeTurns(lines, includeTools, recordBudget, deadline) {
|
|
290
|
+
const turns = [];
|
|
291
|
+
let terminal = null;
|
|
292
|
+
let collected = [];
|
|
293
|
+
let records = 0;
|
|
294
|
+
let oldestProcessed = null;
|
|
295
|
+
let sawStartMarker = false;
|
|
296
|
+
let sawCompleteMarker = false;
|
|
297
|
+
let sawOpenTail = false;
|
|
298
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
299
|
+
if (records >= recordBudget || Date.now() > deadline)
|
|
300
|
+
break;
|
|
301
|
+
const line = lines[index];
|
|
302
|
+
records += 1;
|
|
303
|
+
oldestProcessed = line;
|
|
304
|
+
const marker = eventMarker(line.value);
|
|
305
|
+
sawStartMarker ||= isStartMarker(marker);
|
|
306
|
+
sawCompleteMarker ||= isCompleteMarker(marker);
|
|
307
|
+
if (terminal === null) {
|
|
308
|
+
if (isStartMarker(marker))
|
|
309
|
+
sawOpenTail = true;
|
|
310
|
+
if (isCompleteMarker(marker)) {
|
|
311
|
+
terminal = line;
|
|
312
|
+
collected = [line];
|
|
313
|
+
}
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
collected.push(line);
|
|
317
|
+
if (!isStartMarker(marker))
|
|
318
|
+
continue;
|
|
319
|
+
const chronological = [...collected].reverse();
|
|
320
|
+
turns.push({
|
|
321
|
+
start: line.start,
|
|
322
|
+
end: terminal.end,
|
|
323
|
+
boundaryDigest: digest(line.boundaryBytes),
|
|
324
|
+
turn: projectCodexTurn(chronological, includeTools),
|
|
325
|
+
});
|
|
326
|
+
terminal = null;
|
|
327
|
+
collected = [];
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
turns,
|
|
331
|
+
records,
|
|
332
|
+
incompleteBoundary: terminal,
|
|
333
|
+
oldestProcessed,
|
|
334
|
+
sawStartMarker,
|
|
335
|
+
sawCompleteMarker,
|
|
336
|
+
sawOpenTail,
|
|
337
|
+
boundReached: records < lines.length &&
|
|
338
|
+
(records >= recordBudget || Date.now() > deadline),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
async function verifyBoundaryDigest(lineage, position, expectedDigest, maxReadChunkBytes) {
|
|
342
|
+
const segment = lineage[position.segment];
|
|
343
|
+
if (segment === undefined) {
|
|
344
|
+
throw new CodexTranscriptError('cursor_stale', 'Codex transcript cursor is stale');
|
|
345
|
+
}
|
|
346
|
+
const boundaryBytes = await readBoundaryRecordBytes(segment.transcript, position.offset, maxReadChunkBytes);
|
|
347
|
+
if (digest(boundaryBytes) !== expectedDigest) {
|
|
348
|
+
throw new CodexTranscriptError('cursor_stale', 'Codex transcript cursor is stale');
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async function readBoundaryRecordBytes(transcript, offset, maxReadChunkBytes) {
|
|
352
|
+
const opened = await openValidatedSegment(transcript);
|
|
353
|
+
try {
|
|
354
|
+
if (opened.path.endsWith('.zst')) {
|
|
355
|
+
const text = await readCodexTranscriptText(opened, MAX_DECODED_BYTES);
|
|
356
|
+
return boundaryRecordFromBuffer(Buffer.from(text, 'utf8'), offset);
|
|
357
|
+
}
|
|
358
|
+
if (offset >= opened.size) {
|
|
359
|
+
throw new CodexTranscriptError('cursor_stale', 'Codex transcript cursor is stale');
|
|
360
|
+
}
|
|
361
|
+
const length = Math.min(MAX_DECODED_BYTES, opened.size - offset);
|
|
362
|
+
const bytes = await readTranscriptBytesAt(opened.handle, offset, length, {
|
|
363
|
+
...(maxReadChunkBytes !== undefined
|
|
364
|
+
? { maxChunkBytes: maxReadChunkBytes }
|
|
365
|
+
: {}),
|
|
366
|
+
});
|
|
367
|
+
return boundaryRecordFromBuffer(bytes, 0);
|
|
368
|
+
}
|
|
369
|
+
finally {
|
|
370
|
+
await opened.handle.close();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async function openValidatedSegment(transcript) {
|
|
374
|
+
const opened = await openCodexTranscript(transcript.path, [transcript.root]);
|
|
375
|
+
if (transcript.dev !== -1 &&
|
|
376
|
+
(opened.dev !== transcript.dev || opened.ino !== transcript.ino)) {
|
|
377
|
+
await opened.handle.close();
|
|
378
|
+
throw new CodexTranscriptError('unreadable', 'Codex transcript changed after validation');
|
|
379
|
+
}
|
|
380
|
+
return opened;
|
|
381
|
+
}
|
|
382
|
+
function boundaryRecordFromBuffer(bytes, offset) {
|
|
383
|
+
const newline = bytes.indexOf(0x0a, offset);
|
|
384
|
+
if (newline < 0) {
|
|
385
|
+
throw new CodexTranscriptError('scan_unsupported', 'Codex cursor boundary record exceeds the bounded scan limit');
|
|
386
|
+
}
|
|
387
|
+
return bytes.subarray(offset, newline + 1);
|
|
388
|
+
}
|
|
389
|
+
function eventMarker(value) {
|
|
390
|
+
if (value['type'] !== 'event_msg')
|
|
391
|
+
return null;
|
|
392
|
+
return stringValue(recordValue(value['payload'])?.['type']);
|
|
393
|
+
}
|
|
394
|
+
function isStartMarker(value) {
|
|
395
|
+
return value === 'task_started' || value === 'turn_started';
|
|
396
|
+
}
|
|
397
|
+
function isCompleteMarker(value) {
|
|
398
|
+
return value === 'task_complete' || value === 'turn_complete';
|
|
399
|
+
}
|
|
400
|
+
function effectiveEnvironment(context) {
|
|
401
|
+
return {
|
|
402
|
+
...process.env,
|
|
403
|
+
...(context.injectEnv ?? {}),
|
|
404
|
+
...context.config.extra_env,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
function recordValue(value) {
|
|
408
|
+
return isRecord(value) ? value : null;
|
|
409
|
+
}
|
|
410
|
+
function isRecord(value) {
|
|
411
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
412
|
+
}
|
|
413
|
+
function stringValue(value) {
|
|
414
|
+
return typeof value === 'string' ? value : null;
|
|
415
|
+
}
|
|
416
|
+
function isStrictlyOlder(candidate, previous) {
|
|
417
|
+
return (candidate.segment > previous.segment ||
|
|
418
|
+
(candidate.segment === previous.segment &&
|
|
419
|
+
candidate.offset < previous.offset));
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/transcript/reader.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,MAAM,EACN,iBAAiB,GAElB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,mBAAmB,GAEpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,GAG5B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,iBAAiB,GAAG,SAAS,CAAC;AACpC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,cAAc,GAAG,KAAK,CAAC;AAkC7B,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAkC,EAClC,OAA6D,EAC7D,YAGI,EAAE;IAEN,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,oBAAoB,CAC5B,SAAS,EACT,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,oBAAoB,CAC5B,oBAAoB,EACpB,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,MAAM,eAAe,GAAG,2BAA2B,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CACtC,UAAU,CAAC,kBAAkB,EAC7B,UAAU,CAAC,EAAE,EACb,KAAK,EACL,eAAe,CAChB,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IACjE,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,SAAS;QACxB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QACjD,MAAM,IAAI,oBAAoB,CAC5B,cAAc,EACd,kCAAkC,CACnC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,oBAAoB,CACxB,OAAO,EACP,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,EAAE,EACT,SAAS,CAAC,iBAAiB,CAC5B,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC;QAC3B,OAAO;QACP,KAAK;QACL,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,YAAY;QACZ,iBAAiB,EAAE,SAAS,CAAC,iBAAiB;KAC/C,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,qBAAqB,CACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EACzD,OAAO,CAAC,iBAAiB,CAC1B,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IACpE,MAAM,YAAY,GAChB,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAChE,IAAI,YAAY,GAA+B,IAAI,CAAC;IACpD,IAAI,kBAAkB,GAAkB,IAAI,CAAC;IAC7C,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjE,YAAY,GAAG;YACb,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK;SAClC,CAAC;QACF,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC;IAC1D,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QACjE,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC;QACnC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC;IACjD,CAAC;IACD,IACE,YAAY,KAAK,IAAI;QACrB,MAAM,KAAK,IAAI;QACf,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,EAC1C,CAAC;QACD,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,EAClB,uDAAuD,CACxD,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GACd,YAAY,KAAK,IAAI,IAAI,kBAAkB,KAAK,IAAI;QAClD,CAAC,CAAC,iBAAiB,CAAC;YAChB,WAAW;YACX,UAAU;YACV,QAAQ,EAAE,YAAY;YACtB,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IACX,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE;QAC/C,UAAU;QACV,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAA8B,EAC9B,KAA2B,EAC3B,MAAsD;IAEtD,MAAM,OAAO,GAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAC5B,SAAS,EACT,2CAA2C,CAC5C,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,KAAK,EACL,OAAO,CAAC,WAAW,CAAC,SAAS,EAC7B,MAAM,CACP,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,aAAa;SAC7C,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,CAAC;QACjB,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,EAClB,oDAAoD,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAkC;IAElC,OAAO,MAAM,CACX,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAC7C,GAAG,EAAE,OAAO,CAAC,SAAS;SACvB,CAAC,CAAC;KACJ,CAAC,CACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAOxB;IACC,IACE,KAAK,CAAC,aAAa,KAAK,IAAI;QAC5B,KAAK,CAAC,aAAa,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EACnD,CAAC;QACD,MAAM,IAAI,oBAAoB,CAC5B,cAAc,EACd,kCAAkC,CACnC,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAC7C,IAAI,cAAc,GAAG,iBAAiB,CAAC;IACvC,IAAI,gBAAgB,GAAG,kBAAkB,CAAC;IAC1C,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,cAAc,GAA+B,IAAI,CAAC;IACtD,IAAI,oBAAoB,GAAkB,IAAI,CAAC;IAC/C,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,IAAI,CAAC,CAAC;IAEvD,KACE,IAAI,YAAY,GAAG,YAAY,EAC/B,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EACnC,YAAY,IAAI,CAAC,EACjB,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1B,mBAAmB,GAAG,IAAI,CAAC;YAC3B,MAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAE,CAAC;QAC7C,MAAM,SAAS,GACb,YAAY,KAAK,YAAY,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI;YAC3D,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM;YAC5B,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,OAAO,CAAC,UAAU,EAClB,SAAS,EACT,cAAc,EACd,KAAK,CAAC,iBAAiB,CACxB,CAAC;QACF,cAAc,IAAI,MAAM,CAAC,SAAS,CAAC;QACnC,MAAM,MAAM,GAAG,gBAAgB,CAC7B,MAAM,CAAC,KAAK,EACZ,KAAK,CAAC,YAAY,EAClB,gBAAgB,EAChB,QAAQ,CACT,CAAC;QACF,gBAAgB,IAAI,MAAM,CAAC,OAAO,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACrC,OAAO;oBACL,UAAU;oBACV,QAAQ,EAAE,IAAI;oBACd,cAAc,EAAE,IAAI;oBACpB,oBAAoB,EAAE,IAAI;iBAC3B,CAAC;YACJ,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,oBAAoB,GACxB,MAAM,CAAC,SAAS,GAAG,CAAC;YACpB,MAAM,CAAC,kBAAkB,KAAK,IAAI;YAClC,CAAC,MAAM,CAAC,YAAY;YACpB,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC;QAC3B,IACE,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK;YAChC,CACE,CAAC,oBAAoB;gBACrB,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CACxC,EACD,CAAC;YACD,OAAO;gBACL,UAAU;gBACV,QAAQ,EAAE,IAAI;gBACd,cAAc,EAAE,IAAI;gBACpB,oBAAoB,EAAE,IAAI;aAC3B,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACvC,IACE,UAAU,CAAC,MAAM,KAAK,CAAC;gBACvB,KAAK,CAAC,aAAa,KAAK,IAAI;gBAC5B,YAAY,KAAK,CAAC;gBAClB,MAAM,CAAC,WAAW,EAClB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,EAClB,qDAAqD,CACtD,CAAC;YACJ,CAAC;YACD,mBAAmB,GAAG,IAAI,CAAC;YAC3B,MAAM;QACR,CAAC;QACD,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAClD,IACE,UAAU,CAAC,MAAM,KAAK,CAAC;gBACvB,KAAK,CAAC,aAAa,KAAK,IAAI;gBAC5B,YAAY,KAAK,CAAC;gBAClB,CAAC,MAAM,CAAC,iBAAiB,EACzB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;gBACxC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACtB,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,EAClB,uDAAuD,CACxD,CAAC;gBACJ,CAAC;gBACD,cAAc,GAAG;oBACf,OAAO,EAAE,YAAY;oBACrB,MAAM,EAAE,QAAQ,CAAC,KAAK;iBACvB,CAAC;gBACF,oBAAoB,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,MAAM;QACR,CAAC;QACD,IAAI,cAAc,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,EAClB,uDAAuD,CACxD,CAAC;YACJ,CAAC;YACD,IACE,CAAC,oBAAoB;gBACrB,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EACvC,CAAC;gBACD,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO;QACL,UAAU;QACV,QAAQ,EAAE,cAAc,KAAK,IAAI,IAAI,mBAAmB;QACxD,cAAc;QACd,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,UAAoC,EACpC,kBAAiC,EACjC,QAAgB,EAChB,iBAA0B;IAO1B,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC;QACL,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO;gBACL,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC;gBACnC,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,OAAO,CAAC,MAAM;aAC1B,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YACrE,GAAG,CAAC,iBAAiB,KAAK,SAAS;gBACjC,CAAC,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE;gBACtC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC;YAC3C,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM;YAC9B,SAAS,EAAE,IAAI,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,KAAa,EACb,UAAkB,EAClB,gBAAyB;IAEzB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,UAAU,CAAC;IACxB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM;QACvB,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtB,IAAI,KAAc,CAAC;YACnB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,oBAAoB,CAC5B,SAAS,EACT,oDAAoD,EACpD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE,UAAU,GAAG,MAAM;oBAC1B,GAAG,EAAE,UAAU,GAAG,OAAO,GAAG,CAAC;oBAC7B,GAAG;oBACH,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC;oBAClD,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA4B,EAC5B,YAAqB,EACrB,YAAoB,EACpB,QAAgB;IAWhB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,QAAQ,GAAsB,IAAI,CAAC;IACvC,IAAI,SAAS,GAAiB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,eAAe,GAAsB,IAAI,CAAC;IAC9C,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,IAAI,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YAAE,MAAM;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,CAAC;QACb,eAAe,GAAG,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,cAAc,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,iBAAiB,KAAK,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,aAAa,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,IAAI,CAAC;YAC9C,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YACD,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,SAAS;QACrC,MAAM,aAAa,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1C,IAAI,EAAE,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC;SACpD,CAAC,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC;QAChB,SAAS,GAAG,EAAE,CAAC;IACjB,CAAC;IACD,OAAO;QACL,KAAK;QACL,OAAO;QACP,kBAAkB,EAAE,QAAQ;QAC5B,eAAe;QACf,cAAc;QACd,iBAAiB;QACjB,WAAW;QACX,YAAY,EACV,OAAO,GAAG,KAAK,CAAC,MAAM;YACtB,CAAC,OAAO,IAAI,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,OAAkC,EAClC,QAA6B,EAC7B,cAAsB,EACtB,iBAA0B;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,oBAAoB,CAC5B,cAAc,EACd,kCAAkC,CACnC,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,uBAAuB,CACjD,OAAO,CAAC,UAAU,EAClB,QAAQ,CAAC,MAAM,EACf,iBAAiB,CAClB,CAAC;IACF,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,cAAc,EAAE,CAAC;QAC7C,MAAM,IAAI,oBAAoB,CAC5B,cAAc,EACd,kCAAkC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,UAAoC,EACpC,MAAc,EACd,iBAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC;QACL,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACtE,OAAO,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,oBAAoB,CAC5B,cAAc,EACd,kCAAkC,CACnC,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;YACvE,GAAG,CAAC,iBAAiB,KAAK,SAAS;gBACjC,CAAC,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE;gBACtC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,OAAO,wBAAwB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,UAAoC;IAEpC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,UAAU,CAAC,IAAI,EACf,CAAC,UAAU,CAAC,IAAI,CAAC,CAClB,CAAC;IACF,IACE,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC;QACrB,CAAC,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,CAAC,EAChE,CAAC;QACD,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,oBAAoB,CAC5B,YAAY,EACZ,2CAA2C,CAC5C,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa,EAAE,MAAc;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,oBAAoB,CAC5B,kBAAkB,EAClB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,WAAW,CAAC,KAA8B;IACjD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IACzC,OAAO,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,cAAc,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoB;IAC5C,OAAO,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,eAAe,CAAC;AAChE,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAA6D;IAE7D,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,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CACtB,SAA8B,EAC9B,QAA6B;IAE7B,OAAO,CACL,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO;QACpC,CAAC,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;YACrC,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CACtC,CAAC;AACJ,CAAC"}
|
package/dist/turn-manager.d.ts
CHANGED
|
@@ -1,39 +1,15 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-dispatcher in-memory inbound submitter.
|
|
3
|
-
*
|
|
4
|
-
* Contract:
|
|
5
|
-
* - accepted inbound messages are not persisted;
|
|
6
|
-
* - Feishu message_id redelivery is deduped within this server process;
|
|
7
|
-
* - one accepted inbound message becomes one Codex `turn/start` submission;
|
|
8
|
-
* - Codex text output alone does not send anything to Feishu.
|
|
9
|
-
*/
|
|
10
1
|
import { type CollectedTurn } from './events.js';
|
|
11
2
|
import type { CodexWsClient } from './rpc.js';
|
|
12
|
-
import type {
|
|
3
|
+
import type { AgentRuntimeTextInput, InboundTurnInput, RuntimeActivitySink, RuntimeAdmission } from '@excitedjs/dreamux-types';
|
|
13
4
|
export interface TurnManagerOptions {
|
|
14
5
|
dispatcherId: string;
|
|
15
|
-
/** Lazily resolved Codex thread id (set after thread/start | resume). */
|
|
16
6
|
getThreadId(): string | null;
|
|
17
7
|
client: CodexWsClient;
|
|
18
|
-
/**
|
|
19
|
-
* Codex cwd to pass on each turn/start. Issue #2 Q1: for MVP we leave
|
|
20
|
-
* this null because thread cwd is set once at thread/start time.
|
|
21
|
-
*/
|
|
22
8
|
turnCwd?: string | null;
|
|
23
|
-
/** Process-local Feishu message_id dedupe window size. */
|
|
24
9
|
messageIdDedupeWindow?: number;
|
|
25
|
-
|
|
10
|
+
activitySink: RuntimeActivitySink;
|
|
26
11
|
log?: (level: 'info' | 'warn' | 'error', msg: string, err?: unknown) => void;
|
|
27
|
-
/** Best-effort runtime-local snapshot hook for `AgentRuntime.getLast()`. */
|
|
28
12
|
onTurnCompleted?: (turn: CollectedTurn) => void;
|
|
29
|
-
/**
|
|
30
|
-
* Fired when a submitted turn is cut short by `stop()` before it reached
|
|
31
|
-
* `turn/completed` (a crashed or torn-down runtime). The successful
|
|
32
|
-
* `completed` settlement is fired by the runtime from its `onTurnCompleted`
|
|
33
|
-
* handler; this hook only covers the `stopped` case so an in-flight teammate
|
|
34
|
-
* turn never vanishes silently.
|
|
35
|
-
*/
|
|
36
|
-
onTurnSettled?: (settled: TurnSettledSignal) => void;
|
|
37
13
|
}
|
|
38
14
|
export declare class TurnManager {
|
|
39
15
|
private readonly opts;
|
|
@@ -41,15 +17,20 @@ export declare class TurnManager {
|
|
|
41
17
|
private readonly seenMessageIdOrder;
|
|
42
18
|
private readonly seenTextInputIds;
|
|
43
19
|
private readonly seenTextInputIdOrder;
|
|
20
|
+
private readonly pendingMessageIds;
|
|
21
|
+
private readonly pendingTextInputIds;
|
|
22
|
+
private readonly pendingAdmissions;
|
|
23
|
+
private readonly inFlightNativeAdmissions;
|
|
24
|
+
private nextNativeAdmission;
|
|
25
|
+
private readonly nativeTurns;
|
|
26
|
+
private readonly pendingActivity;
|
|
27
|
+
private readonly unboundObservedTurnIds;
|
|
28
|
+
private readonly terminalOrder;
|
|
29
|
+
private protocolFailure;
|
|
30
|
+
private collector;
|
|
31
|
+
private collectorThreadId;
|
|
32
|
+
private decisionTail;
|
|
44
33
|
private stopped;
|
|
45
|
-
private activeTurnSlot;
|
|
46
|
-
private activeTurnId;
|
|
47
|
-
/**
|
|
48
|
-
* Turn ids submitted to Codex that have not yet reached `turn/completed`. On
|
|
49
|
-
* `stop()` each still-pending turn is settled as `stopped` so a teammate turn
|
|
50
|
-
* interrupted by teardown is not lost.
|
|
51
|
-
*/
|
|
52
|
-
private readonly pendingTurns;
|
|
53
34
|
private idlePromise;
|
|
54
35
|
private idleResolve;
|
|
55
36
|
private readonly log;
|
|
@@ -57,29 +38,26 @@ export declare class TurnManager {
|
|
|
57
38
|
constructor(opts: TurnManagerOptions);
|
|
58
39
|
isBusy(): boolean;
|
|
59
40
|
waitIdle(): Promise<void>;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* process already saw the message_id.
|
|
63
|
-
*/
|
|
64
|
-
enqueue(input: InboundTurnInput): Promise<InboundDeliveryResult>;
|
|
65
|
-
submitTextInput(input: AgentRuntimeTextInput): Promise<InboundDeliveryResult>;
|
|
41
|
+
enqueue(input: InboundTurnInput): Promise<RuntimeAdmission>;
|
|
42
|
+
submitTextInput(input: AgentRuntimeTextInput): Promise<RuntimeAdmission>;
|
|
66
43
|
stop(): Promise<void>;
|
|
67
|
-
private
|
|
68
|
-
private
|
|
69
|
-
private
|
|
70
|
-
private
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
private
|
|
81
|
-
private
|
|
82
|
-
private
|
|
44
|
+
private submit;
|
|
45
|
+
private enqueueDecision;
|
|
46
|
+
private incompatibleCodecError;
|
|
47
|
+
private ensureCollector;
|
|
48
|
+
private bindSubmission;
|
|
49
|
+
private observeTerminal;
|
|
50
|
+
private drainTerminalOrder;
|
|
51
|
+
private finalize;
|
|
52
|
+
private failProtocol;
|
|
53
|
+
private failRecord;
|
|
54
|
+
private releaseCompletedRecords;
|
|
55
|
+
private releaseRecordIfReady;
|
|
56
|
+
private dropOrphanActivityIfIdle;
|
|
57
|
+
private observeItem;
|
|
58
|
+
private emitActivity;
|
|
59
|
+
private reserveSource;
|
|
60
|
+
private trackAdmission;
|
|
83
61
|
private resolveIdleWaitersIfIdle;
|
|
84
62
|
}
|
|
85
63
|
//# sourceMappingURL=turn-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-manager.d.ts","sourceRoot":"","sources":["../src/turn-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"turn-manager.d.ts","sourceRoot":"","sources":["../src/turn-manager.ts"],"names":[],"mappings":"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"}
|