@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.
Files changed (56) hide show
  1. package/README.md +39 -1
  2. package/dist/events.d.ts +8 -0
  3. package/dist/events.d.ts.map +1 -1
  4. package/dist/events.js +119 -47
  5. package/dist/events.js.map +1 -1
  6. package/dist/provider.d.ts +3 -0
  7. package/dist/provider.d.ts.map +1 -1
  8. package/dist/provider.js +6 -3
  9. package/dist/provider.js.map +1 -1
  10. package/dist/rpc.d.ts +1 -0
  11. package/dist/rpc.d.ts.map +1 -1
  12. package/dist/rpc.js +9 -1
  13. package/dist/rpc.js.map +1 -1
  14. package/dist/runtime.d.ts +15 -7
  15. package/dist/runtime.d.ts.map +1 -1
  16. package/dist/runtime.js +242 -80
  17. package/dist/runtime.js.map +1 -1
  18. package/dist/supervisor.d.ts +7 -0
  19. package/dist/supervisor.d.ts.map +1 -1
  20. package/dist/supervisor.js +99 -43
  21. package/dist/supervisor.js.map +1 -1
  22. package/dist/transcript/budget.d.ts +8 -0
  23. package/dist/transcript/budget.d.ts.map +1 -0
  24. package/dist/transcript/budget.js +9 -0
  25. package/dist/transcript/budget.js.map +1 -0
  26. package/dist/transcript/cursor.d.ts +23 -0
  27. package/dist/transcript/cursor.d.ts.map +1 -0
  28. package/dist/transcript/cursor.js +57 -0
  29. package/dist/transcript/cursor.js.map +1 -0
  30. package/dist/transcript/error.d.ts +9 -0
  31. package/dist/transcript/error.d.ts.map +1 -0
  32. package/dist/transcript/error.js +9 -0
  33. package/dist/transcript/error.js.map +1 -0
  34. package/dist/transcript/opened-file.d.ts +10 -0
  35. package/dist/transcript/opened-file.d.ts.map +1 -0
  36. package/dist/transcript/opened-file.js +61 -0
  37. package/dist/transcript/opened-file.js.map +1 -0
  38. package/dist/transcript/path.d.ts +28 -0
  39. package/dist/transcript/path.d.ts.map +1 -0
  40. package/dist/transcript/path.js +422 -0
  41. package/dist/transcript/path.js.map +1 -0
  42. package/dist/transcript/projection.d.ts +6 -0
  43. package/dist/transcript/projection.d.ts.map +1 -0
  44. package/dist/transcript/projection.js +170 -0
  45. package/dist/transcript/projection.js.map +1 -0
  46. package/dist/transcript/reader.d.ts +7 -0
  47. package/dist/transcript/reader.d.ts.map +1 -0
  48. package/dist/transcript/reader.js +421 -0
  49. package/dist/transcript/reader.js.map +1 -0
  50. package/dist/turn-manager.d.ts +34 -56
  51. package/dist/turn-manager.d.ts.map +1 -1
  52. package/dist/turn-manager.js +369 -303
  53. package/dist/turn-manager.js.map +1 -1
  54. package/dist/types.d.ts +7 -0
  55. package/dist/types.d.ts.map +1 -1
  56. 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":"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"}
@@ -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 { InboundTurnInput, InboundDeliveryResult, AgentRuntimeTextInput, TurnSettledSignal } from '@excitedjs/dreamux-types';
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
- /** Optional logger; defaults to console.error. */
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
- * Submit one accepted inbound message to Codex. Returns duplicate when this
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 claimActiveTurnSlot;
68
- private recordTurnStartSuccess;
69
- private recordTurnStartFailure;
70
- private activateTurnSlot;
71
- /**
72
- * Record a submitted turn as pending and wire its completion. On
73
- * `turn/completed` the turn is removed from the pending set and the snapshot
74
- * hook fires (which is where the runtime emits the `completed` settlement). On
75
- * a terminal turn failure (collector rejects: codex `error` with
76
- * `willRetry: false`, or a `turn/completed` carrying `turn.error`) the turn is
77
- * settled as `failed` here, so a teammate turn that errors at the model level
78
- * is delivered with a status instead of hanging until teardown.
79
- */
80
- private trackTurn;
81
- private rememberMessageId;
82
- private rememberTextInputId;
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;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAC;AAKrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAclC,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,0DAA0D;IAC1D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kDAAkD;IAClD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,4EAA4E;IAC5E,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACtD;AAED,qBAAa,WAAW;IAsBV,OAAO,CAAC,QAAQ,CAAC,IAAI;IArBjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAAuB;IAC3C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGzB;IACJ,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyC;IAC7D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;gBAElB,IAAI,EAAE,kBAAkB;IAYrD,MAAM,IAAI,OAAO;IAIjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwDhE,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAmE7E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B,OAAO,CAAC,mBAAmB;IAsC3B,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,sBAAsB;IAqB9B,OAAO,CAAC,gBAAgB;IAOxB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAsDjB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,wBAAwB;CAOjC"}
1
+ {"version":3,"file":"turn-manager.d.ts","sourceRoot":"","sources":["../src/turn-manager.ts"],"names":[],"mappings":"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"}