@modelprofile.com/flexharness-agent 6.0.0 → 6.1.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 (40) hide show
  1. package/dist_ts_agent/classes.sessionengine.d.ts +93 -0
  2. package/dist_ts_agent/classes.sessionengine.js +2140 -0
  3. package/dist_ts_agent/index.d.ts +3 -2
  4. package/dist_ts_agent/index.js +3 -2
  5. package/dist_ts_agent/persistence.file.d.ts +24 -0
  6. package/dist_ts_agent/persistence.file.js +199 -0
  7. package/dist_ts_agent/plugins.d.ts +0 -7
  8. package/dist_ts_agent/plugins.js +1 -9
  9. package/dist_ts_agent/plugins.node.d.ts +7 -0
  10. package/dist_ts_agent/plugins.node.js +9 -0
  11. package/dist_ts_agent/plugins.portable.d.ts +4 -0
  12. package/dist_ts_agent/plugins.portable.js +5 -0
  13. package/dist_ts_agent/runner.d.ts +4 -0
  14. package/dist_ts_agent/runner.js +34 -0
  15. package/dist_ts_agent/runtime.interfaces.d.ts +21 -0
  16. package/dist_ts_agent/runtime.interfaces.js +2 -0
  17. package/dist_ts_agent/runtime.run.d.ts +3 -0
  18. package/dist_ts_agent/runtime.run.js +94 -0
  19. package/dist_ts_agent/smartagent.classes.agent.js +4 -93
  20. package/dist_ts_agent/smartagent.classes.session.d.ts +5 -88
  21. package/dist_ts_agent/smartagent.classes.session.js +19 -2134
  22. package/dist_ts_agent/smartagent.events.js +2 -2
  23. package/dist_ts_agent/smartagent.persistence.d.ts +2 -22
  24. package/dist_ts_agent/smartagent.persistence.js +3 -198
  25. package/package.json +9 -3
  26. package/readme.md +6 -0
  27. package/ts_agent/classes.sessionengine.ts +2591 -0
  28. package/ts_agent/index.ts +2 -2
  29. package/ts_agent/persistence.file.ts +232 -0
  30. package/ts_agent/plugins.node.ts +10 -0
  31. package/ts_agent/plugins.portable.ts +5 -0
  32. package/ts_agent/plugins.ts +0 -10
  33. package/ts_agent/readme.md +6 -0
  34. package/ts_agent/runner.ts +40 -0
  35. package/ts_agent/runtime.interfaces.ts +21 -0
  36. package/ts_agent/runtime.run.ts +107 -0
  37. package/ts_agent/smartagent.classes.agent.ts +4 -101
  38. package/ts_agent/smartagent.classes.session.ts +24 -2582
  39. package/ts_agent/smartagent.events.ts +1 -1
  40. package/ts_agent/smartagent.persistence.ts +2 -224
@@ -0,0 +1,2140 @@
1
+ import * as plugins from './plugins.js';
2
+ import { buildModelMessages } from './smartagent.context.js';
3
+ import { createAgentEvent, createAgentEventId, modelMessagesToAgentEvents, } from './smartagent.events.js';
4
+ import { AgentGenerationLeaseCleanupError, ContextOverflowError, } from './smartagent.interfaces.js';
5
+ import { isAgentEventStoreV2, validateAgentEventSnapshotV2, } from './smartagent.persistence.js';
6
+ import { filterModelVisibleAgentEvents, getAgentGenerationTransactions, getOpenAgentGenerationTransactions, getUncertainToolExecutionIntents, } from './smartagent.transactions.js';
7
+ const RETRY_INITIAL_DELAY = 2000;
8
+ const RETRY_BACKOFF_FACTOR = 2;
9
+ const RETRY_MAX_DELAY = 30_000;
10
+ const MAX_RETRY_ATTEMPTS = 8;
11
+ const isTransactionalControlEvent = (event) => event.type === 'generation-begun'
12
+ || event.type === 'generation-execution-started'
13
+ || event.type === 'generation-execution-completed'
14
+ || event.type === 'generation-outcome'
15
+ || event.type === 'tool-execution-intent'
16
+ || event.type === 'tool-execution-reconciliation';
17
+ const sessionHydrations = new WeakMap();
18
+ const retryDelay = (attempt, headers) => {
19
+ if (headers) {
20
+ const milliseconds = headers['retry-after-ms'];
21
+ if (milliseconds) {
22
+ const parsed = Number.parseFloat(milliseconds);
23
+ if (!Number.isNaN(parsed))
24
+ return parsed;
25
+ }
26
+ const retryAfter = headers['retry-after'];
27
+ if (retryAfter) {
28
+ const seconds = Number.parseFloat(retryAfter);
29
+ if (!Number.isNaN(seconds))
30
+ return Math.ceil(seconds * 1000);
31
+ const dateDelay = Date.parse(retryAfter) - Date.now();
32
+ if (!Number.isNaN(dateDelay) && dateDelay > 0)
33
+ return Math.ceil(dateDelay);
34
+ }
35
+ }
36
+ return Math.min(RETRY_INITIAL_DELAY * Math.pow(RETRY_BACKOFF_FACTOR, attempt - 1), RETRY_MAX_DELAY);
37
+ };
38
+ const sleep = async (milliseconds, signal) => new Promise((resolve, reject) => {
39
+ if (signal?.aborted) {
40
+ reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
41
+ return;
42
+ }
43
+ let settled = false;
44
+ const cleanup = () => signal?.removeEventListener('abort', onAbort);
45
+ const onAbort = () => {
46
+ if (settled)
47
+ return;
48
+ settled = true;
49
+ clearTimeout(timer);
50
+ cleanup();
51
+ reject(signal?.reason ?? new DOMException('Aborted', 'AbortError'));
52
+ };
53
+ const timer = setTimeout(() => {
54
+ if (settled)
55
+ return;
56
+ settled = true;
57
+ cleanup();
58
+ resolve();
59
+ }, milliseconds);
60
+ signal?.addEventListener('abort', onAbort, { once: true });
61
+ });
62
+ const combineAbortSignals = (signals) => {
63
+ const controller = new AbortController();
64
+ const activeSignals = signals.filter((signal) => !!signal);
65
+ const listeners = new Map();
66
+ const cleanup = () => {
67
+ for (const [signal, listener] of listeners)
68
+ signal.removeEventListener('abort', listener);
69
+ listeners.clear();
70
+ };
71
+ for (const signal of activeSignals) {
72
+ const listener = () => {
73
+ if (!controller.signal.aborted) {
74
+ controller.abort(signal.reason ?? new DOMException('Aborted', 'AbortError'));
75
+ }
76
+ cleanup();
77
+ };
78
+ if (signal.aborted) {
79
+ listener();
80
+ break;
81
+ }
82
+ listeners.set(signal, listener);
83
+ signal.addEventListener('abort', listener, { once: true });
84
+ }
85
+ return { signal: controller.signal, cleanup };
86
+ };
87
+ const waitWithAbort = (promise, signals) => {
88
+ const activeSignals = signals.filter((signal) => !!signal);
89
+ if (activeSignals.length === 0)
90
+ return promise;
91
+ return new Promise((resolve, reject) => {
92
+ let settled = false;
93
+ const listeners = new Map();
94
+ const cleanup = () => {
95
+ for (const [signal, listener] of listeners)
96
+ signal.removeEventListener('abort', listener);
97
+ listeners.clear();
98
+ };
99
+ const settle = (handler) => {
100
+ if (settled)
101
+ return;
102
+ settled = true;
103
+ cleanup();
104
+ handler();
105
+ };
106
+ for (const signal of activeSignals) {
107
+ const listener = () => settle(() => reject(signal.reason ?? new DOMException('Aborted', 'AbortError')));
108
+ if (signal.aborted) {
109
+ listener();
110
+ return;
111
+ }
112
+ listeners.set(signal, listener);
113
+ signal.addEventListener('abort', listener, { once: true });
114
+ }
115
+ promise.then((value) => settle(() => resolve(value)), (error) => settle(() => reject(error)));
116
+ });
117
+ };
118
+ const isRetryableError = (error) => {
119
+ const candidate = error;
120
+ const status = candidate?.status ?? candidate?.statusCode;
121
+ if (status === 429 || status === 529 || status === 503)
122
+ return true;
123
+ if (!(error instanceof Error))
124
+ return false;
125
+ const message = error.message.toLowerCase();
126
+ return message.includes('rate limit')
127
+ || message.includes('overloaded')
128
+ || message.includes('too many requests');
129
+ };
130
+ const isContextOverflow = (error) => {
131
+ if (!(error instanceof Error))
132
+ return false;
133
+ const message = error.message.toLowerCase();
134
+ return message.includes('context_length_exceeded')
135
+ || message.includes('context window')
136
+ || message.includes('maximum context length')
137
+ || message.includes('too many tokens')
138
+ || message.includes('input is too long')
139
+ || error.name === 'AI_ContextWindowExceededError';
140
+ };
141
+ const parseToolInput = (input) => {
142
+ if (typeof input !== 'string')
143
+ return input;
144
+ try {
145
+ return JSON.parse(input);
146
+ }
147
+ catch {
148
+ return input;
149
+ }
150
+ };
151
+ const errorToString = (error) => error instanceof Error ? error.message : String(error);
152
+ const toolSignature = (toolName, input) => {
153
+ let serializedInput;
154
+ try {
155
+ serializedInput = JSON.stringify(input);
156
+ }
157
+ catch {
158
+ serializedInput = String(input);
159
+ }
160
+ return `${toolName}\n${serializedInput}`;
161
+ };
162
+ const isPromiseLike = (value) => ((typeof value === 'object' && value !== null) || typeof value === 'function')
163
+ && typeof value.then === 'function';
164
+ const isAsyncIterable = (value) => ((typeof value === 'object' && value !== null) || typeof value === 'function')
165
+ && typeof value[Symbol.asyncIterator] === 'function';
166
+ const fallbackModelOutput = (output, error) => {
167
+ if (error !== undefined)
168
+ return { type: 'error-text', value: error };
169
+ if (typeof output === 'string')
170
+ return { type: 'text', value: output };
171
+ let jsonOutput;
172
+ try {
173
+ jsonOutput = output === undefined ? null : JSON.parse(JSON.stringify(output));
174
+ }
175
+ catch {
176
+ jsonOutput = String(output);
177
+ }
178
+ return { type: 'json', value: jsonOutput };
179
+ };
180
+ const recordToolCall = (toolCalls, toolCallIndexes, toolCall, update = {}) => {
181
+ const toolCallId = String(toolCall.toolCallId ?? '');
182
+ const nextRecord = {
183
+ toolCallId,
184
+ toolName: String(toolCall.toolName ?? ''),
185
+ input: parseToolInput(toolCall.input ?? toolCall.args),
186
+ };
187
+ const hasOutput = Object.prototype.hasOwnProperty.call(update, 'output');
188
+ const hasError = Object.prototype.hasOwnProperty.call(update, 'error');
189
+ if (hasOutput)
190
+ nextRecord.output = update.output;
191
+ if (hasError && update.error !== undefined)
192
+ nextRecord.error = errorToString(update.error);
193
+ const existingIndex = toolCallIndexes.get(toolCallId);
194
+ if (existingIndex !== undefined) {
195
+ const existing = toolCalls[existingIndex];
196
+ existing.toolName = nextRecord.toolName || existing.toolName;
197
+ if (nextRecord.input !== undefined)
198
+ existing.input = nextRecord.input;
199
+ if (hasOutput)
200
+ existing.output = nextRecord.output;
201
+ if (nextRecord.error !== undefined)
202
+ existing.error = nextRecord.error;
203
+ return;
204
+ }
205
+ toolCalls.push(nextRecord);
206
+ toolCallIndexes.set(toolCallId, toolCalls.length - 1);
207
+ };
208
+ export class AgentSessionEngine {
209
+ platform;
210
+ ownership;
211
+ options;
212
+ events = [];
213
+ eventIds = new Set();
214
+ generationHandles = new Map();
215
+ unresolvedLeaseCleanups = new Set();
216
+ sequence = 0;
217
+ persistenceRevision = 0;
218
+ persistenceQueue = Promise.resolve();
219
+ persistenceError;
220
+ notificationDispatches = new Set();
221
+ listeners = new Map();
222
+ scheduledGenerations = new Map();
223
+ retentionPromise;
224
+ maintenanceError;
225
+ generationQueue = Promise.resolve();
226
+ currentGenerationAbortController;
227
+ sessionAbortController = new AbortController();
228
+ jobUnsubscribe;
229
+ closed = false;
230
+ closeFinalizationReached = false;
231
+ closeCleanupCompletedState = false;
232
+ get closeCleanupCompleted() {
233
+ return this.closeCleanupCompletedState;
234
+ }
235
+ refreshCloseCleanupCompleted() {
236
+ this.closeCleanupCompletedState = this.closeFinalizationReached
237
+ && this.jobUnsubscribe === undefined
238
+ && this.unresolvedLeaseCleanups.size === 0;
239
+ }
240
+ static async createWithFactory(options, create) {
241
+ if (!options.eventStore)
242
+ return create();
243
+ if (!options.sessionId?.trim()) {
244
+ throw new Error('AgentSession.create() requires sessionId when eventStore is configured.');
245
+ }
246
+ let snapshot = await options.eventStore.load(options.sessionId);
247
+ const v2Store = isAgentEventStoreV2(options.eventStore);
248
+ if (snapshot
249
+ && ((!v2Store && snapshot.schemaVersion !== 1)
250
+ || (v2Store && snapshot.schemaVersion !== 1 && snapshot.schemaVersion !== 2))) {
251
+ throw new Error(`Unsupported agent event snapshot schema version ${String(snapshot.schemaVersion)}.`);
252
+ }
253
+ if (!v2Store && snapshot?.events.some(isTransactionalControlEvent)) {
254
+ throw new Error('Transactional events require an IAgentEventStoreV2-capable event store.');
255
+ }
256
+ if (snapshot?.schemaVersion === 2) {
257
+ snapshot = validateAgentEventSnapshotV2(snapshot, options.sessionId);
258
+ }
259
+ sessionHydrations.set(options, snapshot);
260
+ let session;
261
+ try {
262
+ session = create();
263
+ }
264
+ finally {
265
+ sessionHydrations.delete(options);
266
+ }
267
+ await session.interruptRestoredTransactions();
268
+ await session.flushPersistence();
269
+ await session.runEventRetentionLocked();
270
+ session.attachJobSubscription();
271
+ return session;
272
+ }
273
+ constructor(options, platform, ownership) {
274
+ this.platform = platform;
275
+ this.ownership = ownership;
276
+ this.options = options;
277
+ const hasHydration = sessionHydrations.has(options);
278
+ const hydrationSnapshot = sessionHydrations.get(options);
279
+ if (options.eventStore && !hasHydration) {
280
+ throw new Error('Use AgentSession.create() when eventStore is configured.');
281
+ }
282
+ if (options.eventStore && !options.sessionId?.trim()) {
283
+ throw new Error('sessionId is required when eventStore is configured.');
284
+ }
285
+ const tools = options.tools ?? {};
286
+ if (Object.prototype.hasOwnProperty.call(tools, 'invalid')) {
287
+ throw new Error('Tool name "invalid" is reserved for SmartAgent tool-call repair.');
288
+ }
289
+ const maxContextOverflowRetries = options.maxContextOverflowRetries ?? 3;
290
+ if (!Number.isSafeInteger(maxContextOverflowRetries) || maxContextOverflowRetries < 0) {
291
+ throw new Error('maxContextOverflowRetries must be a non-negative integer.');
292
+ }
293
+ const changeListenerTimeoutMs = options.changeListenerTimeoutMs ?? 30_000;
294
+ if (!Number.isSafeInteger(changeListenerTimeoutMs) || changeListenerTimeoutMs <= 0) {
295
+ throw new Error('changeListenerTimeoutMs must be a positive integer.');
296
+ }
297
+ const maxPendingSessionChanges = options.maxPendingSessionChanges ?? 1000;
298
+ if (!Number.isSafeInteger(maxPendingSessionChanges) || maxPendingSessionChanges <= 0) {
299
+ throw new Error('maxPendingSessionChanges must be a positive integer.');
300
+ }
301
+ const generationLeaseCleanupTimeoutMs = options.generationLeaseCleanupTimeoutMs ?? 30_000;
302
+ if (!Number.isSafeInteger(generationLeaseCleanupTimeoutMs) || generationLeaseCleanupTimeoutMs <= 0) {
303
+ throw new Error('generationLeaseCleanupTimeoutMs must be a positive integer.');
304
+ }
305
+ const maxArchivedTransactionTombstones = options.maxArchivedTransactionTombstones ?? 1000;
306
+ if (!Number.isSafeInteger(maxArchivedTransactionTombstones)
307
+ || maxArchivedTransactionTombstones <= 0) {
308
+ throw new Error('maxArchivedTransactionTombstones must be a positive integer.');
309
+ }
310
+ if (options.eventRetention) {
311
+ if (!Number.isSafeInteger(options.eventRetention.maxEvents)
312
+ || options.eventRetention.maxEvents <= 0) {
313
+ throw new Error('eventRetention.maxEvents must be a positive integer.');
314
+ }
315
+ if (!options.contextCompactor) {
316
+ throw new Error('eventRetention requires contextCompactor.');
317
+ }
318
+ if (!options.eventStore?.archive) {
319
+ throw new Error('eventRetention requires an eventStore with archive support.');
320
+ }
321
+ }
322
+ if (hydrationSnapshot) {
323
+ this.persistenceRevision = hydrationSnapshot.revision;
324
+ for (const event of hydrationSnapshot.events)
325
+ this.restoreEvent(event);
326
+ }
327
+ const initialEvents = [
328
+ ...(options.events ?? []),
329
+ ...modelMessagesToAgentEvents(options.messages ?? []),
330
+ ];
331
+ if (hydrationSnapshot && initialEvents.length > 0) {
332
+ throw new Error('Persisted sessions cannot also receive initial events or messages.');
333
+ }
334
+ if (options.eventStore
335
+ && !isAgentEventStoreV2(options.eventStore)
336
+ && initialEvents.some(isTransactionalControlEvent)) {
337
+ throw new Error('Transactional events require an IAgentEventStoreV2-capable event store.');
338
+ }
339
+ for (const event of initialEvents)
340
+ this.commitEvent(event, false);
341
+ if (options.eventStore && (!hydrationSnapshot || initialEvents.length > 0)) {
342
+ this.queuePersistence();
343
+ }
344
+ if (!options.eventStore)
345
+ this.attachJobSubscription();
346
+ }
347
+ attachJobSubscription() {
348
+ if (this.jobUnsubscribe)
349
+ return;
350
+ this.jobUnsubscribe = this.options.executionContext?.jobs?.subscribe?.(async (jobEvent) => {
351
+ if (this.closed)
352
+ return;
353
+ const job = jobEvent.job;
354
+ const runtimeType = `${job.type}-${jobEvent.type}`;
355
+ await this.pushRuntimeEvent({
356
+ type: runtimeType,
357
+ executionId: job.executionId,
358
+ jobType: job.type,
359
+ state: job.state,
360
+ request: job.request,
361
+ exitCode: job.exitCode,
362
+ stdout: job.stdout,
363
+ stderr: job.stderr,
364
+ signal: job.signal,
365
+ ...(jobEvent.type === 'output'
366
+ ? {
367
+ stream: jobEvent.stream,
368
+ chunk: jobEvent.chunk,
369
+ outputSequence: jobEvent.sequence,
370
+ }
371
+ : {}),
372
+ });
373
+ });
374
+ }
375
+ restoreEvent(event) {
376
+ if (this.eventIds.has(event.id))
377
+ throw new Error(`Duplicate agent event id "${event.id}".`);
378
+ if (!Number.isSafeInteger(event.sequence) || (event.sequence ?? 0) <= this.sequence) {
379
+ throw new Error(`Invalid persisted sequence for agent event "${event.id}".`);
380
+ }
381
+ this.events.push(event);
382
+ this.eventIds.add(event.id);
383
+ this.sequence = event.sequence;
384
+ }
385
+ queuePersistence() {
386
+ if (!this.options.eventStore)
387
+ return Promise.resolve();
388
+ const snapshot = structuredClone(this.events);
389
+ const operation = this.persistenceQueue.then(async () => {
390
+ if (this.persistenceError !== undefined)
391
+ throw this.persistenceError;
392
+ this.persistenceRevision = await this.options.eventStore.save(this.options.sessionId, snapshot, this.persistenceRevision);
393
+ });
394
+ this.persistenceQueue = operation.catch((error) => {
395
+ this.persistenceError ??= error;
396
+ });
397
+ return operation;
398
+ }
399
+ async flushPersistence() {
400
+ await this.persistenceQueue;
401
+ if (this.persistenceError !== undefined)
402
+ throw this.persistenceError;
403
+ }
404
+ reportListenerError(error) {
405
+ this.platform.reportListenerError(error);
406
+ }
407
+ queueNotification(change, durability) {
408
+ const dispatch = (async () => {
409
+ try {
410
+ await durability;
411
+ }
412
+ catch {
413
+ return;
414
+ }
415
+ for (const state of this.listeners.values()) {
416
+ this.enqueueListenerChange(state, change);
417
+ }
418
+ })();
419
+ this.notificationDispatches.add(dispatch);
420
+ void dispatch.then(() => this.notificationDispatches.delete(dispatch), () => this.notificationDispatches.delete(dispatch));
421
+ }
422
+ enqueueListenerChange(state, change) {
423
+ if (!state.subscribed)
424
+ return;
425
+ const maxPending = this.options.maxPendingSessionChanges ?? 1000;
426
+ if (state.queue.length >= maxPending) {
427
+ state.subscribed = false;
428
+ state.queue.length = 0;
429
+ this.listeners.delete(state.listener);
430
+ this.reportListenerError(new Error(`Session change listener exceeded ${maxPending} pending changes and was removed.`));
431
+ return;
432
+ }
433
+ state.queue.push(change);
434
+ if (state.deliveryPromise)
435
+ return;
436
+ const delivery = this.deliverListenerChanges(state);
437
+ state.deliveryPromise = delivery;
438
+ void delivery.then(() => {
439
+ if (state.deliveryPromise === delivery)
440
+ state.deliveryPromise = undefined;
441
+ });
442
+ }
443
+ async deliverListenerChanges(state) {
444
+ while (state.subscribed && state.queue.length > 0) {
445
+ const change = state.queue.shift();
446
+ let timer;
447
+ state.executing = true;
448
+ try {
449
+ await Promise.race([
450
+ Promise.resolve().then(() => state.listener(change)),
451
+ new Promise((_resolve, reject) => {
452
+ timer = setTimeout(() => reject(new Error(`Session change listener timed out after ${this.options.changeListenerTimeoutMs ?? 30_000}ms.`)), this.options.changeListenerTimeoutMs ?? 30_000);
453
+ }),
454
+ ]);
455
+ }
456
+ catch (error) {
457
+ state.subscribed = false;
458
+ state.queue.length = 0;
459
+ this.listeners.delete(state.listener);
460
+ this.reportListenerError(error);
461
+ }
462
+ finally {
463
+ state.executing = false;
464
+ if (timer)
465
+ clearTimeout(timer);
466
+ }
467
+ }
468
+ }
469
+ commitEvents(events, notify = true) {
470
+ const nextIds = new Set();
471
+ for (const event of events) {
472
+ if (this.eventIds.has(event.id) || nextIds.has(event.id)) {
473
+ throw new Error(`Duplicate agent event id "${event.id}".`);
474
+ }
475
+ nextIds.add(event.id);
476
+ }
477
+ if (this.options.eventStore)
478
+ structuredClone(events);
479
+ const committedEvents = events.map((event) => ({
480
+ ...event,
481
+ sequence: ++this.sequence,
482
+ }));
483
+ for (const event of committedEvents) {
484
+ this.events.push(event);
485
+ this.eventIds.add(event.id);
486
+ if (event.type === 'generation-outcome') {
487
+ this.generationHandles.delete(event.generationId);
488
+ }
489
+ }
490
+ if (notify && committedEvents.length > 0) {
491
+ const durability = this.queuePersistence();
492
+ this.queueNotification({ type: 'committed', events: committedEvents }, durability);
493
+ }
494
+ return committedEvents;
495
+ }
496
+ commitEvent(event, notify = true) {
497
+ return this.commitEvents([event], notify)[0];
498
+ }
499
+ pushEvent(event) {
500
+ if (this.closed)
501
+ return Promise.reject(new Error('AgentSession is closed.'));
502
+ if (this.persistenceError !== undefined)
503
+ return Promise.reject(this.persistenceError);
504
+ if (this.maintenanceError !== undefined)
505
+ return Promise.reject(this.maintenanceError);
506
+ if (isTransactionalControlEvent(event)
507
+ && this.options.eventStore
508
+ && !isAgentEventStoreV2(this.options.eventStore)) {
509
+ return Promise.reject(new Error('Transactional events require an IAgentEventStoreV2-capable event store.'));
510
+ }
511
+ this.commitEvent(event);
512
+ return this.flushPersistence().then(async () => {
513
+ this.scheduleEventRetention();
514
+ if (!this.currentGenerationAbortController && this.retentionPromise) {
515
+ await this.retentionPromise;
516
+ }
517
+ });
518
+ }
519
+ pushUserMessage(content) {
520
+ return this.pushEvent(createAgentEvent({
521
+ type: 'user-message',
522
+ content,
523
+ parentIds: this.events.length > 0 ? [this.events[this.events.length - 1].id] : undefined,
524
+ }));
525
+ }
526
+ pushRuntimeEvent(event) {
527
+ return this.pushEvent(createAgentEvent({
528
+ type: 'runtime-event',
529
+ event,
530
+ parentIds: this.events.length > 0 ? [this.events[this.events.length - 1].id] : undefined,
531
+ }));
532
+ }
533
+ transaction(generationId) {
534
+ const transaction = getAgentGenerationTransactions(this.events).get(generationId);
535
+ if (!transaction) {
536
+ throw new Error(`Unknown transactional generation "${generationId}".`);
537
+ }
538
+ if (transaction.state === 'invalid') {
539
+ throw new Error(`Transactional generation "${generationId}" has an invalid event sequence.`);
540
+ }
541
+ return transaction;
542
+ }
543
+ archivedTransaction(generationId) {
544
+ for (let index = this.events.length - 1; index >= 0; index--) {
545
+ const event = this.events[index];
546
+ if (event.type !== 'context-compaction')
547
+ continue;
548
+ const transaction = event.archivedTransactions?.find((entry) => entry.generationId === generationId);
549
+ if (transaction)
550
+ return transaction;
551
+ }
552
+ return undefined;
553
+ }
554
+ verifyGenerationClaim(transaction) {
555
+ if (!transaction?.generationId?.trim() || !transaction.claimToken?.trim()) {
556
+ throw new Error('A valid transactional generation handle is required.');
557
+ }
558
+ const activeTransaction = getAgentGenerationTransactions(this.events).get(transaction.generationId);
559
+ if (activeTransaction?.state === 'invalid') {
560
+ throw new Error(`Transactional generation "${transaction.generationId}" has an invalid event sequence.`);
561
+ }
562
+ const state = activeTransaction ?? this.archivedTransaction(transaction.generationId);
563
+ if (!state)
564
+ throw new Error(`Unknown transactional generation "${transaction.generationId}".`);
565
+ const expectedDigest = 'begun' in state
566
+ ? state.begun.claimTokenDigest
567
+ : state.claimTokenDigest;
568
+ const actualDigest = this.platform.hashClaimToken(transaction.claimToken);
569
+ if (!/^[a-f0-9]{64}$/.test(expectedDigest)
570
+ || !this.platform.equalClaimDigests(expectedDigest, actualDigest)) {
571
+ throw new Error(`Invalid claim for transactional generation "${transaction.generationId}".`);
572
+ }
573
+ return state;
574
+ }
575
+ async interruptRestoredTransactions() {
576
+ const openTransactions = getOpenAgentGenerationTransactions(this.events);
577
+ if (openTransactions.length === 0)
578
+ return;
579
+ if (openTransactions.some((transaction) => transaction.state === 'invalid')) {
580
+ throw new Error('Cannot restore a session with an invalid transactional generation sequence.');
581
+ }
582
+ this.commitEvents(openTransactions.map((transaction) => createAgentEvent({
583
+ type: 'generation-outcome',
584
+ generationId: transaction.generationId,
585
+ outcome: 'interrupted',
586
+ reason: 'Session restoration interrupted nonterminal transactional execution.',
587
+ parentIds: [
588
+ transaction.executionCompleted?.id
589
+ ?? transaction.executionStarted?.id
590
+ ?? transaction.begun.id,
591
+ ],
592
+ })));
593
+ await this.flushPersistence();
594
+ }
595
+ transactionalStoreCapabilityError() {
596
+ return this.options.eventStore && !isAgentEventStoreV2(this.options.eventStore)
597
+ ? new Error('Transactional generations require an IAgentEventStoreV2-capable event store.')
598
+ : undefined;
599
+ }
600
+ beginGeneration(content, options = {}) {
601
+ const capabilityError = this.transactionalStoreCapabilityError();
602
+ if (capabilityError)
603
+ return Promise.reject(capabilityError);
604
+ return this.queueExclusive(async () => {
605
+ await this.flushPersistence();
606
+ const generationId = options.generationId ?? createAgentEventId('generation');
607
+ if (!generationId.trim())
608
+ throw new Error('Transactional generationId must not be empty.');
609
+ const existingTransaction = getAgentGenerationTransactions(this.events).get(generationId);
610
+ if (existingTransaction) {
611
+ if (existingTransaction.state === 'invalid') {
612
+ throw new Error(`Transactional generation "${generationId}" has an invalid event sequence.`);
613
+ }
614
+ const existingMessage = this.events.find((event) => event.type === 'user-message'
615
+ && event.generationId === generationId
616
+ && event.causationId === existingTransaction.begun.id);
617
+ const handle = this.generationHandles.get(generationId);
618
+ if (handle && existingMessage && this.platform.isDeepEqual(existingMessage.content, content)) {
619
+ return handle;
620
+ }
621
+ throw new Error(`Transactional generation "${generationId}" already exists and its claim cannot be reissued.`);
622
+ }
623
+ if (this.events.some((event) => event.generationId === generationId)) {
624
+ throw new Error(`Generation id "${generationId}" is already correlated with legacy events.`);
625
+ }
626
+ if (this.archivedTransaction(generationId) || this.generationHandles.has(generationId)) {
627
+ throw new Error(`Transactional generation "${generationId}" already exists and its claim cannot be reissued.`);
628
+ }
629
+ const claimToken = this.platform.createClaimToken();
630
+ const claimTokenDigest = this.platform.hashClaimToken(claimToken);
631
+ const priorEvent = this.events[this.events.length - 1];
632
+ const begun = createAgentEvent({
633
+ type: 'generation-begun',
634
+ generationId,
635
+ claimTokenDigest,
636
+ parentIds: priorEvent ? [priorEvent.id] : undefined,
637
+ });
638
+ const userMessage = createAgentEvent({
639
+ type: 'user-message',
640
+ content,
641
+ generationId,
642
+ causationId: begun.id,
643
+ parentIds: [begun.id],
644
+ });
645
+ this.commitEvents([begun, userMessage]);
646
+ const handle = Object.freeze({ generationId, claimToken });
647
+ this.generationHandles.set(generationId, handle);
648
+ await this.flushPersistence();
649
+ this.scheduleEventRetention();
650
+ return handle;
651
+ });
652
+ }
653
+ async appendGenerationOutcome(generationId, outcome, reason) {
654
+ const transaction = this.transaction(generationId);
655
+ if (transaction.state === 'accepted'
656
+ || transaction.state === 'rejected'
657
+ || transaction.state === 'interrupted') {
658
+ if (transaction.state === outcome)
659
+ return;
660
+ throw new Error(`Transactional generation "${generationId}" already has outcome "${transaction.state}".`);
661
+ }
662
+ if (outcome !== 'interrupted') {
663
+ if (transaction.state !== 'execution-completed') {
664
+ throw new Error(`Transactional generation "${generationId}" must be execution-completed before ${outcome}.`);
665
+ }
666
+ if (getUncertainToolExecutionIntents(this.events, generationId).length > 0) {
667
+ throw new Error(`Transactional generation "${generationId}" has unresolved tool execution intents.`);
668
+ }
669
+ }
670
+ const parent = transaction.executionCompleted
671
+ ?? transaction.executionStarted
672
+ ?? transaction.begun;
673
+ this.commitEvent(createAgentEvent({
674
+ type: 'generation-outcome',
675
+ generationId,
676
+ outcome,
677
+ reason,
678
+ parentIds: [parent.id],
679
+ }));
680
+ await this.flushPersistence();
681
+ this.scheduleEventRetention();
682
+ }
683
+ transactionOutcomeErrorReason(error) {
684
+ if (this.options.transactionOutcomeErrorProjector) {
685
+ try {
686
+ const projected = this.options.transactionOutcomeErrorProjector(error);
687
+ if (typeof projected === 'string' && projected.trim())
688
+ return projected;
689
+ }
690
+ catch {
691
+ // Invalid projectors fall back to the normal diagnostic reason.
692
+ }
693
+ }
694
+ return errorToString(error);
695
+ }
696
+ finalizeGeneration(transaction, outcome) {
697
+ const capabilityError = this.transactionalStoreCapabilityError();
698
+ if (capabilityError)
699
+ return Promise.reject(capabilityError);
700
+ return this.queueExclusive(async () => {
701
+ if (!['accepted', 'rejected', 'interrupted'].includes(outcome)) {
702
+ throw new Error(`Invalid transactional generation outcome "${String(outcome)}".`);
703
+ }
704
+ const state = this.verifyGenerationClaim(transaction);
705
+ if (!('begun' in state)) {
706
+ if (state.outcome === outcome)
707
+ return;
708
+ throw new Error(`Transactional generation "${transaction.generationId}" already has outcome "${state.outcome}".`);
709
+ }
710
+ await this.appendGenerationOutcome(transaction.generationId, outcome);
711
+ });
712
+ }
713
+ listUncertainToolExecutions() {
714
+ return structuredClone(getUncertainToolExecutionIntents(this.events));
715
+ }
716
+ reconcileToolExecution(intentId, reconciliation) {
717
+ const capabilityError = this.transactionalStoreCapabilityError();
718
+ if (capabilityError)
719
+ return Promise.reject(capabilityError);
720
+ return this.queueExclusive(async () => {
721
+ await this.flushPersistence();
722
+ const intent = this.events.find((event) => event.type === 'tool-execution-intent' && event.id === intentId);
723
+ if (!intent)
724
+ throw new Error(`Unknown tool execution intent "${intentId}".`);
725
+ const defaultError = reconciliation.resolution === 'not-executed'
726
+ ? 'Tool execution was reconciled as not executed.'
727
+ : reconciliation.resolution === 'abandoned-unknown'
728
+ ? 'Tool execution was abandoned with an unknown outcome.'
729
+ : undefined;
730
+ const error = reconciliation.resolution === 'executed'
731
+ ? undefined
732
+ : reconciliation.error ?? defaultError;
733
+ const existing = this.events.find((event) => event.type === 'tool-execution-reconciliation' && event.intentId === intentId);
734
+ if (existing) {
735
+ const same = existing.resolution === reconciliation.resolution
736
+ && existing.error === error
737
+ && this.platform.isDeepEqual(existing.output, reconciliation.resolution === 'executed' ? reconciliation.output : undefined)
738
+ && this.platform.isDeepEqual(existing.modelOutput, reconciliation.resolution === 'executed' ? reconciliation.modelOutput : undefined);
739
+ if (!same)
740
+ throw new Error(`Tool execution intent "${intentId}" has a conflicting reconciliation.`);
741
+ return;
742
+ }
743
+ if (!getUncertainToolExecutionIntents(this.events).some((entry) => entry.id === intentId)) {
744
+ throw new Error(`Tool execution intent "${intentId}" already has a terminal result.`);
745
+ }
746
+ if (reconciliation.resolution === 'executed'
747
+ && (!Object.prototype.hasOwnProperty.call(reconciliation, 'output') || !reconciliation.modelOutput)) {
748
+ throw new Error('Executed tool reconciliation requires explicit output and modelOutput.');
749
+ }
750
+ const toolCall = [...this.events].reverse().find((event) => event.type === 'tool-call'
751
+ && event.generationId === intent.generationId
752
+ && event.toolCallId === intent.toolCallId);
753
+ const reconciliationEvent = createAgentEvent({
754
+ type: 'tool-execution-reconciliation',
755
+ generationId: intent.generationId,
756
+ inferenceId: intent.inferenceId,
757
+ causationId: intent.id,
758
+ intentId: intent.id,
759
+ toolCallId: intent.toolCallId,
760
+ toolName: intent.toolName,
761
+ resolution: reconciliation.resolution,
762
+ output: reconciliation.resolution === 'executed' ? reconciliation.output : undefined,
763
+ modelOutput: reconciliation.resolution === 'executed' ? reconciliation.modelOutput : undefined,
764
+ error,
765
+ parentIds: [intent.id],
766
+ });
767
+ const resultEvent = createAgentEvent({
768
+ type: 'tool-result',
769
+ generationId: intent.generationId,
770
+ inferenceId: intent.inferenceId,
771
+ causationId: intent.inferenceId,
772
+ executionIntentId: intent.id,
773
+ toolCallId: intent.toolCallId,
774
+ toolName: intent.toolName,
775
+ output: reconciliation.resolution === 'executed' ? reconciliation.output : undefined,
776
+ error,
777
+ modelOutput: reconciliation.resolution === 'executed'
778
+ ? reconciliation.modelOutput
779
+ : { type: 'error-text', value: error },
780
+ parentIds: toolCall ? [toolCall.id] : [intent.id],
781
+ });
782
+ this.commitEvents([reconciliationEvent, resultEvent]);
783
+ await this.flushPersistence();
784
+ this.scheduleEventRetention();
785
+ });
786
+ }
787
+ getEvents() {
788
+ return this.events.slice();
789
+ }
790
+ getModelMessages() {
791
+ return this.buildContext(this.events);
792
+ }
793
+ buildContext(events) {
794
+ const visibleEvents = filterModelVisibleAgentEvents(events);
795
+ return this.options.contextBuilder
796
+ ? this.options.contextBuilder({ events: visibleEvents })
797
+ : buildModelMessages(visibleEvents);
798
+ }
799
+ subscribe(listener) {
800
+ if (this.closed)
801
+ throw new Error('AgentSession is closed.');
802
+ const existing = this.listeners.get(listener);
803
+ if (existing) {
804
+ return () => {
805
+ existing.subscribed = false;
806
+ existing.queue.length = 0;
807
+ this.listeners.delete(listener);
808
+ };
809
+ }
810
+ const state = {
811
+ listener,
812
+ queue: [],
813
+ executing: false,
814
+ subscribed: true,
815
+ };
816
+ this.listeners.set(listener, state);
817
+ return () => {
818
+ state.subscribed = false;
819
+ state.queue.length = 0;
820
+ this.listeners.delete(listener);
821
+ };
822
+ }
823
+ scheduleGenerate(options) {
824
+ if (this.closed)
825
+ return Promise.reject(new Error('AgentSession is closed.'));
826
+ const capabilityError = options.transaction
827
+ ? this.transactionalStoreCapabilityError()
828
+ : undefined;
829
+ if (capabilityError)
830
+ return Promise.reject(capabilityError);
831
+ if (!options.key.trim())
832
+ return Promise.reject(new Error('Scheduled generation key must not be empty.'));
833
+ const debounceMs = options.debounceMs ?? 50;
834
+ if (!Number.isSafeInteger(debounceMs) || debounceMs < 0) {
835
+ return Promise.reject(new Error('debounceMs must be a non-negative integer.'));
836
+ }
837
+ const existing = this.scheduledGenerations.get(options.key);
838
+ if (existing) {
839
+ if (existing.model !== options.model
840
+ || existing.system !== options.system
841
+ || existing.tools !== options.tools
842
+ || existing.providerOptions !== options.providerOptions
843
+ || existing.cache !== options.cache
844
+ || existing.maxSteps !== options.maxSteps
845
+ || existing.abort !== options.abort
846
+ || existing.prepare !== options.prepare
847
+ || existing.transaction?.generationId !== options.transaction?.generationId
848
+ || existing.transaction?.claimToken !== options.transaction?.claimToken) {
849
+ return Promise.reject(new Error(`Conflicting options for scheduled generation "${options.key}".`));
850
+ }
851
+ if (existing.state === 'debouncing') {
852
+ clearTimeout(existing.timer);
853
+ existing.debounceMs = debounceMs;
854
+ existing.timer = setTimeout(() => this.startScheduledGeneration(options.key), debounceMs);
855
+ }
856
+ return existing.promise;
857
+ }
858
+ if (options.abort?.aborted) {
859
+ const abortReason = options.abort.reason ?? new DOMException('Aborted', 'AbortError');
860
+ if (!options.transaction)
861
+ return Promise.reject(abortReason);
862
+ return this.queueExclusive(async () => {
863
+ const transaction = this.verifyGenerationClaim(options.transaction);
864
+ if (!('begun' in transaction)) {
865
+ if (transaction.outcome === 'interrupted')
866
+ throw abortReason;
867
+ throw new Error(`Transactional generation "${transaction.generationId}" already has outcome "${transaction.outcome}".`);
868
+ }
869
+ await this.appendGenerationOutcome(options.transaction.generationId, 'interrupted', this.transactionOutcomeErrorReason(abortReason));
870
+ throw abortReason;
871
+ });
872
+ }
873
+ let resolve;
874
+ let reject;
875
+ const promise = new Promise((resolvePromise, rejectPromise) => {
876
+ resolve = resolvePromise;
877
+ reject = rejectPromise;
878
+ });
879
+ const controller = new AbortController();
880
+ const onAbort = () => this.cancelScheduledGeneration(options.key, options.abort?.reason ?? new DOMException('Aborted', 'AbortError'));
881
+ options.abort?.addEventListener('abort', onAbort, { once: true });
882
+ const scheduled = {
883
+ state: 'debouncing',
884
+ debounceMs,
885
+ model: options.model,
886
+ system: options.system,
887
+ tools: options.tools,
888
+ providerOptions: options.providerOptions,
889
+ cache: options.cache,
890
+ maxSteps: options.maxSteps,
891
+ abort: options.abort,
892
+ transaction: options.transaction,
893
+ prepare: options.prepare,
894
+ timer: setTimeout(() => this.startScheduledGeneration(options.key), debounceMs),
895
+ controller,
896
+ removeAbortListener: () => options.abort?.removeEventListener('abort', onAbort),
897
+ promise,
898
+ resolve,
899
+ reject,
900
+ };
901
+ this.scheduledGenerations.set(options.key, scheduled);
902
+ return promise;
903
+ }
904
+ startScheduledGeneration(key) {
905
+ const scheduled = this.scheduledGenerations.get(key);
906
+ if (!scheduled || scheduled.state !== 'debouncing')
907
+ return;
908
+ scheduled.state = 'queued';
909
+ void this.generate({
910
+ model: scheduled.model,
911
+ system: scheduled.system,
912
+ tools: scheduled.tools,
913
+ providerOptions: scheduled.providerOptions,
914
+ cache: scheduled.cache,
915
+ maxSteps: scheduled.maxSteps,
916
+ abort: scheduled.controller.signal,
917
+ transaction: scheduled.transaction,
918
+ prepare: scheduled.prepare,
919
+ }).then((result) => this.settleScheduledGeneration(key, scheduled, () => scheduled.resolve(result)), (error) => this.settleScheduledGeneration(key, scheduled, () => scheduled.reject(error)));
920
+ }
921
+ settleScheduledGeneration(key, scheduled, settle) {
922
+ if (this.scheduledGenerations.get(key) === scheduled) {
923
+ this.scheduledGenerations.delete(key);
924
+ }
925
+ scheduled.removeAbortListener();
926
+ settle();
927
+ }
928
+ cancelScheduledGeneration(key, reason) {
929
+ const scheduled = this.scheduledGenerations.get(key);
930
+ if (!scheduled)
931
+ return false;
932
+ clearTimeout(scheduled.timer);
933
+ this.scheduledGenerations.delete(key);
934
+ scheduled.removeAbortListener();
935
+ const cancellationReason = reason
936
+ ?? new DOMException('Scheduled generation cancelled', 'AbortError');
937
+ if (!scheduled.controller.signal.aborted)
938
+ scheduled.controller.abort(cancellationReason);
939
+ if (!scheduled.transaction) {
940
+ scheduled.reject(cancellationReason);
941
+ return true;
942
+ }
943
+ let transaction;
944
+ try {
945
+ const claim = this.verifyGenerationClaim(scheduled.transaction);
946
+ if (!('begun' in claim)) {
947
+ scheduled.reject(new Error(`Transactional generation "${claim.generationId}" already has outcome "${claim.outcome}".`));
948
+ return true;
949
+ }
950
+ transaction = claim;
951
+ }
952
+ catch (error) {
953
+ scheduled.reject(error);
954
+ return true;
955
+ }
956
+ if (transaction.state === 'execution-started')
957
+ return true;
958
+ void this.appendGenerationOutcome(scheduled.transaction.generationId, 'interrupted', this.transactionOutcomeErrorReason(cancellationReason)).then(() => scheduled.reject(cancellationReason), (error) => scheduled.reject(error));
959
+ return true;
960
+ }
961
+ async performCompaction(reason, abortSignal) {
962
+ abortSignal?.throwIfAborted();
963
+ await this.flushPersistence();
964
+ abortSignal?.throwIfAborted();
965
+ const unresolvedIntents = getUncertainToolExecutionIntents(this.events);
966
+ if (unresolvedIntents.length > 0) {
967
+ if (reason === 'context-overflow' || reason === 'retention')
968
+ return undefined;
969
+ throw new Error('Context compaction is blocked by unresolved tool execution intents.');
970
+ }
971
+ const openTransactions = getOpenAgentGenerationTransactions(this.events);
972
+ if (openTransactions.some((transaction) => transaction.state === 'invalid')) {
973
+ throw new Error('Context compaction is blocked by an invalid transactional generation sequence.');
974
+ }
975
+ let coveredEvents;
976
+ if (openTransactions.length > 0) {
977
+ if (reason === 'retention')
978
+ return undefined;
979
+ if (reason !== 'context-overflow') {
980
+ throw new Error('Context compaction is blocked while a transactional generation is open.');
981
+ }
982
+ const openGenerationIds = new Set(openTransactions.map((transaction) => transaction.generationId));
983
+ const firstOpenIndex = this.events.findIndex((event) => !!event.generationId && openGenerationIds.has(event.generationId));
984
+ coveredEvents = firstOpenIndex < 0 ? [] : this.events.slice(0, firstOpenIndex);
985
+ }
986
+ else {
987
+ coveredEvents = this.events.slice();
988
+ }
989
+ if (coveredEvents.length === 0)
990
+ return undefined;
991
+ const visibleCoveredEvents = filterModelVisibleAgentEvents(coveredEvents);
992
+ const messages = this.buildContext(visibleCoveredEvents);
993
+ const replacementMessages = this.options.contextCompactor
994
+ ? await this.invokeGenerationCallback(() => this.options.contextCompactor(messages, visibleCoveredEvents, { abortSignal, reason }))
995
+ : reason === 'context-overflow' && this.options.onContextOverflow
996
+ ? await this.invokeGenerationCallback(() => this.options.onContextOverflow(messages, { abortSignal }))
997
+ : undefined;
998
+ if (!replacementMessages) {
999
+ throw new ContextOverflowError('Agent context compaction requires a contextCompactor.');
1000
+ }
1001
+ abortSignal?.throwIfAborted();
1002
+ const archivedTransactionMap = new Map();
1003
+ const rememberArchivedTransaction = (transaction) => {
1004
+ archivedTransactionMap.delete(transaction.generationId);
1005
+ archivedTransactionMap.set(transaction.generationId, transaction);
1006
+ };
1007
+ for (const event of coveredEvents) {
1008
+ if (event.type !== 'context-compaction')
1009
+ continue;
1010
+ for (const transaction of event.archivedTransactions ?? []) {
1011
+ rememberArchivedTransaction(transaction);
1012
+ }
1013
+ }
1014
+ const coveredTransactions = getAgentGenerationTransactions(coveredEvents);
1015
+ for (const event of coveredEvents) {
1016
+ if (event.type !== 'generation-outcome')
1017
+ continue;
1018
+ const transaction = coveredTransactions.get(event.generationId);
1019
+ if (!transaction || transaction.state === 'invalid')
1020
+ continue;
1021
+ rememberArchivedTransaction({
1022
+ generationId: transaction.generationId,
1023
+ claimTokenDigest: transaction.begun.claimTokenDigest,
1024
+ outcome: event.outcome,
1025
+ });
1026
+ }
1027
+ const archivedTransactions = [...archivedTransactionMap.values()]
1028
+ .slice(-(this.options.maxArchivedTransactionTombstones ?? 1000));
1029
+ const compaction = this.commitEvent(createAgentEvent({
1030
+ type: 'context-compaction',
1031
+ coveredEventIds: coveredEvents.map((event) => event.id),
1032
+ replacementEvents: modelMessagesToAgentEvents(replacementMessages),
1033
+ archivedTransactions: archivedTransactions.length > 0
1034
+ ? archivedTransactions
1035
+ : undefined,
1036
+ parentIds: [coveredEvents[coveredEvents.length - 1].id],
1037
+ }));
1038
+ await this.flushPersistence();
1039
+ return compaction;
1040
+ }
1041
+ queueExclusive(operation) {
1042
+ const run = this.generationQueue.then(() => {
1043
+ if (this.closed)
1044
+ throw new Error('AgentSession is closed.');
1045
+ if (this.maintenanceError !== undefined)
1046
+ throw this.maintenanceError;
1047
+ return operation();
1048
+ });
1049
+ this.generationQueue = run.then(() => undefined, () => undefined);
1050
+ return run;
1051
+ }
1052
+ compact(options = {}) {
1053
+ const combinedAbort = combineAbortSignals([options.abort, this.sessionAbortController.signal]);
1054
+ const operation = this.queueExclusive(async () => {
1055
+ combinedAbort.signal.throwIfAborted();
1056
+ await this.performCompaction(options.reason ?? 'manual', combinedAbort.signal);
1057
+ }).finally(combinedAbort.cleanup);
1058
+ return waitWithAbort(operation, [options.abort, this.sessionAbortController.signal]);
1059
+ }
1060
+ archiveCompactedEvents(compactionEventId) {
1061
+ return this.queueExclusive(() => this.archiveCompactedEventsLocked(compactionEventId));
1062
+ }
1063
+ async archiveCompactedEventsLocked(compactionEventId) {
1064
+ if (getOpenAgentGenerationTransactions(this.events).length > 0) {
1065
+ throw new Error('Archival is blocked while a transactional generation is open.');
1066
+ }
1067
+ if (getUncertainToolExecutionIntents(this.events).length > 0) {
1068
+ throw new Error('Archival is blocked by unresolved tool execution intents.');
1069
+ }
1070
+ const eventStore = this.options.eventStore;
1071
+ if (!eventStore?.archive) {
1072
+ throw new Error('Archival requires an eventStore with archive support.');
1073
+ }
1074
+ const compaction = compactionEventId
1075
+ ? this.events.find((event) => event.id === compactionEventId)
1076
+ : [...this.events].reverse().find((event) => event.type === 'context-compaction');
1077
+ if (!compaction || compaction.type !== 'context-compaction')
1078
+ return undefined;
1079
+ const coveredIds = new Set(compaction.coveredEventIds);
1080
+ const archivedEvents = this.events.filter((event) => coveredIds.has(event.id));
1081
+ if (archivedEvents.length === 0) {
1082
+ return isAgentEventStoreV2(eventStore)
1083
+ ? eventStore.loadArchive?.(this.options.sessionId, compaction.id)
1084
+ : eventStore.loadArchive?.(this.options.sessionId, compaction.id);
1085
+ }
1086
+ const archiveBase = {
1087
+ sessionId: this.options.sessionId,
1088
+ archiveId: compaction.id,
1089
+ createdAt: Date.now(),
1090
+ events: structuredClone(archivedEvents),
1091
+ };
1092
+ const archive = isAgentEventStoreV2(eventStore)
1093
+ ? { ...archiveBase, schemaVersion: 2 }
1094
+ : { ...archiveBase, schemaVersion: 1 };
1095
+ await this.flushPersistence();
1096
+ if (isAgentEventStoreV2(eventStore)) {
1097
+ await eventStore.archive?.(archive);
1098
+ }
1099
+ else {
1100
+ await eventStore.archive?.(archive);
1101
+ }
1102
+ this.events.splice(0, this.events.length, ...this.events.filter((event) => !coveredIds.has(event.id)));
1103
+ for (const event of archivedEvents)
1104
+ this.eventIds.delete(event.id);
1105
+ const durability = this.queuePersistence();
1106
+ this.queueNotification({ type: 'archived', events: archivedEvents }, durability);
1107
+ await durability;
1108
+ return archive;
1109
+ }
1110
+ async runEventRetentionLocked() {
1111
+ const retention = this.options.eventRetention;
1112
+ if (!retention)
1113
+ return;
1114
+ if (getOpenAgentGenerationTransactions(this.events).length > 0
1115
+ || getUncertainToolExecutionIntents(this.events).length > 0)
1116
+ return;
1117
+ while (this.events.length > retention.maxEvents) {
1118
+ const compaction = await this.performCompaction('retention', this.sessionAbortController.signal);
1119
+ if (!compaction)
1120
+ return;
1121
+ await this.archiveCompactedEventsLocked(compaction.id);
1122
+ }
1123
+ }
1124
+ scheduleEventRetention() {
1125
+ const retention = this.options.eventRetention;
1126
+ if (!retention
1127
+ || this.events.length <= retention.maxEvents
1128
+ || this.retentionPromise
1129
+ || this.closed)
1130
+ return;
1131
+ const operation = this.generationQueue.then(() => {
1132
+ if (this.maintenanceError !== undefined)
1133
+ throw this.maintenanceError;
1134
+ return this.runEventRetentionLocked();
1135
+ });
1136
+ this.generationQueue = operation.then(() => undefined, () => undefined);
1137
+ this.retentionPromise = operation;
1138
+ void operation.then(() => {
1139
+ if (this.retentionPromise === operation)
1140
+ this.retentionPromise = undefined;
1141
+ }, (error) => {
1142
+ const expectedCloseAbort = this.closed
1143
+ && (error === this.sessionAbortController.signal.reason
1144
+ || (error instanceof DOMException && error.name === 'AbortError'));
1145
+ if (!expectedCloseAbort)
1146
+ this.maintenanceError ??= error;
1147
+ if (this.retentionPromise === operation)
1148
+ this.retentionPromise = undefined;
1149
+ });
1150
+ }
1151
+ eventsByIds(ids) {
1152
+ return this.events.filter((event) => ids.has(event.id));
1153
+ }
1154
+ currentGenerationEvent(generationId, type, toolCallId, inferenceId) {
1155
+ return this.events.find((event) => event.generationId === generationId
1156
+ && event.type === type
1157
+ && event.toolCallId === toolCallId
1158
+ && (inferenceId === undefined || event.inferenceId === inferenceId));
1159
+ }
1160
+ reconcileToolResult(generationId, modelEvent) {
1161
+ const existingIndex = this.events.findIndex((event) => event.generationId === generationId
1162
+ && event.type === 'tool-result'
1163
+ && event.toolCallId === modelEvent.toolCallId
1164
+ && event.inferenceId === modelEvent.inferenceId);
1165
+ let provisionalIndex = existingIndex;
1166
+ if (provisionalIndex === -1) {
1167
+ for (let index = this.events.length - 1; index >= 0; index--) {
1168
+ const event = this.events[index];
1169
+ if (event.generationId === generationId
1170
+ && event.type === 'tool-result'
1171
+ && event.toolCallId === modelEvent.toolCallId
1172
+ && event.responseMessageCommitted !== true) {
1173
+ provisionalIndex = index;
1174
+ break;
1175
+ }
1176
+ }
1177
+ }
1178
+ if (provisionalIndex === -1) {
1179
+ this.commitEvent(modelEvent);
1180
+ return;
1181
+ }
1182
+ const existing = this.events[provisionalIndex];
1183
+ this.events[provisionalIndex] = {
1184
+ ...existing,
1185
+ modelOutput: modelEvent.modelOutput,
1186
+ responseMessageCommitted: true,
1187
+ providerOptions: modelEvent.providerOptions,
1188
+ messageProviderOptions: modelEvent.messageProviderOptions,
1189
+ };
1190
+ const updatedEvent = this.events[provisionalIndex];
1191
+ const durability = this.queuePersistence();
1192
+ this.queueNotification({ type: 'updated', events: [updatedEvent] }, durability);
1193
+ }
1194
+ commitResponseMessages(messages, generationId, inferenceId, executionIntentIds) {
1195
+ const convertedEvents = modelMessagesToAgentEvents(messages, {
1196
+ causationId: inferenceId,
1197
+ generationId,
1198
+ inferenceId,
1199
+ });
1200
+ for (const event of convertedEvents) {
1201
+ if (event.type === 'tool-call') {
1202
+ if (!this.currentGenerationEvent(generationId, 'tool-call', event.toolCallId, inferenceId)) {
1203
+ this.commitEvent(event);
1204
+ }
1205
+ }
1206
+ else if (event.type === 'tool-result') {
1207
+ const executionIntentId = event.executionIntentId
1208
+ ?? executionIntentIds.get(event.toolCallId);
1209
+ this.reconcileToolResult(generationId, executionIntentId ? { ...event, executionIntentId } : event);
1210
+ }
1211
+ else {
1212
+ this.commitEvent(event);
1213
+ }
1214
+ }
1215
+ }
1216
+ wrapToolsForGeneration(generationId, tools, preparations, completedPreparations, preparationErrors, ledger, getMessages) {
1217
+ const wrappedTools = {};
1218
+ for (const [toolName, toolDefinition] of Object.entries(tools)) {
1219
+ const executableTool = toolDefinition;
1220
+ if (!executableTool.execute) {
1221
+ wrappedTools[toolName] = toolDefinition;
1222
+ continue;
1223
+ }
1224
+ const originalExecute = executableTool.execute.bind(executableTool);
1225
+ wrappedTools[toolName] = {
1226
+ ...toolDefinition,
1227
+ execute: (input, executionOptions) => {
1228
+ const toolCallId = executionOptions.toolCallId;
1229
+ const signature = toolSignature(toolName, input);
1230
+ const preparation = preparations.get(toolCallId);
1231
+ if (!preparation) {
1232
+ throw new Error(`Tool call "${toolCallId}" executed before preparation in generation "${generationId}".`);
1233
+ }
1234
+ if (preparation.signature !== signature) {
1235
+ throw new Error(`Tool call id collision for "${toolCallId}" in generation "${generationId}".`);
1236
+ }
1237
+ if (!completedPreparations.has(toolCallId)) {
1238
+ throw preparationErrors.get(toolCallId)
1239
+ ?? new Error(`Tool call "${toolCallId}" executed before preparation completed in generation "${generationId}".`);
1240
+ }
1241
+ const existing = ledger.get(toolCallId);
1242
+ if (existing) {
1243
+ if (existing.signature !== signature) {
1244
+ throw new Error(`Tool call id collision for "${toolCallId}" in generation "${generationId}".`);
1245
+ }
1246
+ return existing.promise;
1247
+ }
1248
+ const contextualExecutionOptions = {
1249
+ ...executionOptions,
1250
+ messages: getMessages(),
1251
+ };
1252
+ let resolveCompletion;
1253
+ let rejectCompletion;
1254
+ const promise = new Promise((resolve, reject) => {
1255
+ resolveCompletion = resolve;
1256
+ rejectCompletion = reject;
1257
+ });
1258
+ void promise.catch(() => undefined);
1259
+ ledger.set(toolCallId, { signature, promise });
1260
+ try {
1261
+ const result = this.invokeGenerationCallback(() => originalExecute(input, contextualExecutionOptions));
1262
+ if (isAsyncIterable(result)) {
1263
+ return this.trackToolExecutionIterable(result, resolveCompletion, rejectCompletion);
1264
+ }
1265
+ if (isPromiseLike(result)) {
1266
+ const deferredIterable = (async function* () {
1267
+ const output = await result;
1268
+ if (isAsyncIterable(output)) {
1269
+ yield* output;
1270
+ }
1271
+ else {
1272
+ yield output;
1273
+ }
1274
+ })();
1275
+ return this.trackToolExecutionIterable(deferredIterable, resolveCompletion, rejectCompletion);
1276
+ }
1277
+ resolveCompletion(result);
1278
+ return result;
1279
+ }
1280
+ catch (error) {
1281
+ rejectCompletion(error);
1282
+ throw error;
1283
+ }
1284
+ },
1285
+ };
1286
+ }
1287
+ wrappedTools.invalid = plugins.tool({
1288
+ description: 'Sink for unrecognised tool calls; returns an error message to the model',
1289
+ inputSchema: plugins.z.object({ tool: plugins.z.string(), error: plugins.z.string() }),
1290
+ execute: async ({ tool, error }) => `Unknown tool "${tool}": ${error}`,
1291
+ });
1292
+ return wrappedTools;
1293
+ }
1294
+ trackToolExecutionIterable(iterable, resolveCompletion, rejectCompletion) {
1295
+ const iterator = iterable[Symbol.asyncIterator]();
1296
+ let settled = false;
1297
+ let lastOutput;
1298
+ const settleSuccess = () => {
1299
+ if (settled)
1300
+ return;
1301
+ settled = true;
1302
+ resolveCompletion(lastOutput);
1303
+ };
1304
+ const settleError = (error) => {
1305
+ if (settled)
1306
+ return;
1307
+ settled = true;
1308
+ rejectCompletion(error);
1309
+ };
1310
+ const incompleteError = () => new Error('Tool execution stream ended before normal completion.');
1311
+ const observe = (operation, cacheOutput, rejectWhenDone = false) => {
1312
+ let operationResult;
1313
+ try {
1314
+ operationResult = Promise.resolve(operation());
1315
+ }
1316
+ catch (error) {
1317
+ settleError(error);
1318
+ return Promise.reject(error);
1319
+ }
1320
+ return operationResult.then((result) => {
1321
+ if (!result.done && cacheOutput)
1322
+ lastOutput = result.value;
1323
+ if (result.done) {
1324
+ if (rejectWhenDone)
1325
+ settleError(incompleteError());
1326
+ else
1327
+ settleSuccess();
1328
+ }
1329
+ return result;
1330
+ }, (error) => {
1331
+ settleError(error);
1332
+ throw error;
1333
+ });
1334
+ };
1335
+ const wrappedIterator = {
1336
+ next: (...args) => observe(() => iterator.next(...args), true),
1337
+ return: iterator.return
1338
+ ? (...args) => {
1339
+ let returnResult;
1340
+ try {
1341
+ returnResult = Promise.resolve(iterator.return(...args));
1342
+ settleError(incompleteError());
1343
+ }
1344
+ catch (error) {
1345
+ settleError(error);
1346
+ return Promise.reject(error);
1347
+ }
1348
+ return returnResult.then((result) => result, (error) => {
1349
+ settleError(error);
1350
+ throw error;
1351
+ });
1352
+ }
1353
+ : async (...args) => {
1354
+ settleError(incompleteError());
1355
+ return { done: true, value: args[0] };
1356
+ },
1357
+ throw: iterator.throw
1358
+ ? (error) => observe(() => iterator.throw(error), true, true)
1359
+ : async (error) => {
1360
+ settleError(error);
1361
+ throw error;
1362
+ },
1363
+ [Symbol.asyncIterator]() {
1364
+ return this;
1365
+ },
1366
+ };
1367
+ return wrappedIterator;
1368
+ }
1369
+ ownGenerationLeaseCleanup(lease) {
1370
+ if (!lease?.close)
1371
+ return undefined;
1372
+ const ownership = { lease, settled: false };
1373
+ this.unresolvedLeaseCleanups.add(ownership);
1374
+ return ownership;
1375
+ }
1376
+ async cleanupGenerationLease(ownership) {
1377
+ if (ownership.settled)
1378
+ return;
1379
+ const timeoutMs = this.options.generationLeaseCleanupTimeoutMs ?? 30_000;
1380
+ const timeoutError = new Error(`Generation lease cleanup timed out after ${timeoutMs}ms.`);
1381
+ let timer;
1382
+ const closePromise = Promise.resolve().then(() => this.invokeGenerationCallback(() => ownership.lease.close()));
1383
+ void closePromise.then(() => {
1384
+ ownership.settled = true;
1385
+ this.unresolvedLeaseCleanups.delete(ownership);
1386
+ this.refreshCloseCleanupCompleted();
1387
+ }, () => undefined);
1388
+ const timeoutPromise = new Promise((_resolve, reject) => {
1389
+ timer = setTimeout(() => reject(timeoutError), timeoutMs);
1390
+ });
1391
+ try {
1392
+ await Promise.race([closePromise, timeoutPromise]);
1393
+ ownership.settled = true;
1394
+ this.unresolvedLeaseCleanups.delete(ownership);
1395
+ }
1396
+ catch (error) {
1397
+ throw new AgentGenerationLeaseCleanupError(ownership.lease, error, () => this.cleanupGenerationLease(ownership));
1398
+ }
1399
+ finally {
1400
+ if (timer)
1401
+ clearTimeout(timer);
1402
+ }
1403
+ }
1404
+ generate(options = {}) {
1405
+ const capabilityError = options.transaction
1406
+ ? this.transactionalStoreCapabilityError()
1407
+ : undefined;
1408
+ if (capabilityError)
1409
+ return Promise.reject(capabilityError);
1410
+ const run = this.generationQueue.then(async () => {
1411
+ if (!options.transaction)
1412
+ options.abort?.throwIfAborted();
1413
+ if (!options.transaction && this.sessionAbortController.signal.aborted) {
1414
+ throw this.sessionAbortController.signal.reason
1415
+ ?? new DOMException('Agent session aborted', 'AbortError');
1416
+ }
1417
+ if (this.closed)
1418
+ throw new Error('AgentSession is closed.');
1419
+ if (this.maintenanceError !== undefined)
1420
+ throw this.maintenanceError;
1421
+ await this.runEventRetentionLocked();
1422
+ return this.generateLocked(options);
1423
+ });
1424
+ this.generationQueue = run.then(() => undefined, () => undefined);
1425
+ return options.transaction
1426
+ ? run
1427
+ : waitWithAbort(run, [options.abort, this.sessionAbortController.signal]);
1428
+ }
1429
+ resolveEffectiveGenerationRuntime(options, lease) {
1430
+ const model = lease?.model ?? options.model ?? this.options.model;
1431
+ if (!model) {
1432
+ throw new Error('Agent generation requires a model from its prepared lease, generate options, or session defaults.');
1433
+ }
1434
+ const system = lease?.system ?? options.system ?? this.options.system;
1435
+ const tools = lease?.tools ?? options.tools ?? this.options.tools ?? {};
1436
+ if (Object.prototype.hasOwnProperty.call(tools, 'invalid')) {
1437
+ throw new Error('Tool name "invalid" is reserved for SmartAgent tool-call repair.');
1438
+ }
1439
+ const providerOptions = lease?.providerOptions
1440
+ ?? options.providerOptions
1441
+ ?? this.options.providerOptions;
1442
+ const cache = lease?.cache ?? options.cache ?? this.options.cache ?? 'auto';
1443
+ const maxSteps = lease?.maxSteps ?? options.maxSteps ?? this.options.maxSteps ?? 20;
1444
+ if (!Number.isSafeInteger(maxSteps) || maxSteps <= 0) {
1445
+ throw new Error('maxSteps must be a positive integer.');
1446
+ }
1447
+ const configuredCacheProvider = typeof cache === 'object' ? cache.provider : undefined;
1448
+ const messageCacheProvider = cache === false
1449
+ ? undefined
1450
+ : configuredCacheProvider
1451
+ ?? plugins.resolveSmartAiCacheProvider(model.provider, model.modelId);
1452
+ const effectiveModel = messageCacheProvider
1453
+ ? plugins.wrapLanguageModel({
1454
+ model,
1455
+ middleware: plugins.createSmartAiCachingMiddleware({
1456
+ ...(typeof cache === 'object' ? cache : {}),
1457
+ provider: messageCacheProvider,
1458
+ }),
1459
+ })
1460
+ : model;
1461
+ return {
1462
+ model: effectiveModel,
1463
+ system,
1464
+ tools,
1465
+ providerOptions: plugins.applySmartAiCacheProviderOptions({
1466
+ provider: model.provider,
1467
+ modelId: model.modelId,
1468
+ providerOptions,
1469
+ cache,
1470
+ sessionId: this.options.sessionId,
1471
+ }),
1472
+ maxSteps,
1473
+ };
1474
+ }
1475
+ async generateLocked(options) {
1476
+ await this.flushPersistence();
1477
+ const maxContextOverflowRetries = this.options.maxContextOverflowRetries ?? 3;
1478
+ const generationId = options.transaction?.generationId ?? createAgentEventId('generation');
1479
+ const generationAbortController = new AbortController();
1480
+ this.currentGenerationAbortController = generationAbortController;
1481
+ const combinedAbort = combineAbortSignals([
1482
+ this.sessionAbortController.signal,
1483
+ generationAbortController.signal,
1484
+ options.abort,
1485
+ ]);
1486
+ let lease;
1487
+ let leaseCleanupOwnership;
1488
+ let operationError;
1489
+ let completedResult;
1490
+ let transactionExecutionStarted = false;
1491
+ try {
1492
+ if (options.transaction) {
1493
+ const transaction = this.verifyGenerationClaim(options.transaction);
1494
+ if (!('begun' in transaction) || transaction.state !== 'begun') {
1495
+ const transactionState = 'begun' in transaction
1496
+ ? transaction.state
1497
+ : transaction.outcome;
1498
+ throw new Error(`Transactional generation "${generationId}" cannot execute from state "${transactionState}".`);
1499
+ }
1500
+ this.commitEvent(createAgentEvent({
1501
+ type: 'generation-execution-started',
1502
+ generationId,
1503
+ parentIds: [transaction.begun.id],
1504
+ }));
1505
+ await this.flushPersistence();
1506
+ transactionExecutionStarted = true;
1507
+ }
1508
+ combinedAbort.signal.throwIfAborted();
1509
+ lease = options.prepare
1510
+ ? await this.invokeGenerationCallback(() => options.prepare({ generationId, abortSignal: combinedAbort.signal }))
1511
+ : undefined;
1512
+ leaseCleanupOwnership = this.ownGenerationLeaseCleanup(lease);
1513
+ combinedAbort.signal.throwIfAborted();
1514
+ const runtime = this.resolveEffectiveGenerationRuntime(options, lease);
1515
+ const maxSteps = runtime.maxSteps;
1516
+ let stepCount = 0;
1517
+ let attempt = 0;
1518
+ let contextOverflowRetries = 0;
1519
+ let totalInput = 0;
1520
+ let totalOutput = 0;
1521
+ let totalCacheRead = 0;
1522
+ let totalCacheWrite = 0;
1523
+ let currentInferenceId;
1524
+ let latestInferenceVisibleIds = new Set(this.events.map((event) => event.id));
1525
+ const completedInferenceIds = new Set();
1526
+ const reasoningTextById = new Map();
1527
+ const toolCalls = [];
1528
+ const toolCallIndexes = new Map();
1529
+ const preparations = new Map();
1530
+ const completedPreparations = new Set();
1531
+ const preparationErrors = new Map();
1532
+ const ledger = new Map();
1533
+ const executionIntentIds = new Map();
1534
+ const preliminaryToolOutputs = new Map();
1535
+ const beginInference = async () => {
1536
+ const marker = this.commitEvent(createAgentEvent({
1537
+ type: 'runtime-event',
1538
+ event: {
1539
+ type: 'inference-started',
1540
+ generationId,
1541
+ completedSteps: stepCount,
1542
+ },
1543
+ modelVisible: false,
1544
+ generationId,
1545
+ parentIds: this.events.length > 0
1546
+ ? [this.events[this.events.length - 1].id]
1547
+ : undefined,
1548
+ }));
1549
+ currentInferenceId = marker.id;
1550
+ latestInferenceVisibleIds = new Set(this.events.map((event) => event.id));
1551
+ await this.flushPersistence();
1552
+ return marker.id;
1553
+ };
1554
+ const allTools = this.wrapToolsForGeneration(generationId, runtime.tools, preparations, completedPreparations, preparationErrors, ledger, () => this.buildContext(this.eventsByIds(latestInferenceVisibleIds)));
1555
+ const flushReasoning = () => {
1556
+ for (const [id, reasoningText] of reasoningTextById) {
1557
+ this.options.onReasoningEnd?.(id, reasoningText);
1558
+ }
1559
+ reasoningTextById.clear();
1560
+ };
1561
+ while (true) {
1562
+ const remainingSteps = maxSteps - stepCount;
1563
+ if (remainingSteps <= 0) {
1564
+ throw new Error(`Agent generation exhausted its ${maxSteps} step limit during retry.`);
1565
+ }
1566
+ let streamError;
1567
+ try {
1568
+ currentInferenceId = undefined;
1569
+ const result = plugins.streamText({
1570
+ model: runtime.model,
1571
+ instructions: runtime.system,
1572
+ messages: this.getModelMessages(),
1573
+ allowSystemInMessages: true,
1574
+ tools: allTools,
1575
+ providerOptions: runtime.providerOptions,
1576
+ stopWhen: plugins.stepCountIs(remainingSteps),
1577
+ maxRetries: 0,
1578
+ abortSignal: combinedAbort.signal,
1579
+ prepareStep: async () => {
1580
+ await beginInference();
1581
+ return { messages: this.buildContext(this.eventsByIds(latestInferenceVisibleIds)) };
1582
+ },
1583
+ onError: ({ error }) => {
1584
+ streamError = error;
1585
+ },
1586
+ repairToolCall: async ({ toolCall, tools: availableTools, error }) => {
1587
+ const lowerName = toolCall.toolName.toLowerCase();
1588
+ if (lowerName !== toolCall.toolName
1589
+ && Object.prototype.hasOwnProperty.call(availableTools, lowerName)) {
1590
+ return { ...toolCall, toolName: lowerName };
1591
+ }
1592
+ return {
1593
+ ...toolCall,
1594
+ toolName: 'invalid',
1595
+ input: JSON.stringify({ tool: toolCall.toolName, error: String(error) }),
1596
+ };
1597
+ },
1598
+ onChunk: ({ chunk }) => {
1599
+ const chunkType = String(chunk.type ?? '');
1600
+ if (chunkType === 'text-delta') {
1601
+ const textChunk = chunk;
1602
+ this.options.onToken?.(textChunk.delta ?? textChunk.textDelta ?? textChunk.text ?? '');
1603
+ return;
1604
+ }
1605
+ if (chunkType === 'tool-result') {
1606
+ const toolResultChunk = chunk;
1607
+ if (toolResultChunk.preliminary === true) {
1608
+ const previous = preliminaryToolOutputs.get(toolResultChunk.toolCallId);
1609
+ if (!previous || !this.platform.isDeepEqual(previous.output, toolResultChunk.output)) {
1610
+ const event = {
1611
+ toolCallId: toolResultChunk.toolCallId,
1612
+ toolName: toolResultChunk.toolName,
1613
+ input: toolResultChunk.input,
1614
+ output: toolResultChunk.output,
1615
+ };
1616
+ preliminaryToolOutputs.set(toolResultChunk.toolCallId, event);
1617
+ this.options.onToolCallUpdate?.(event);
1618
+ }
1619
+ }
1620
+ return;
1621
+ }
1622
+ const reasoningChunk = chunk;
1623
+ const id = reasoningChunk.id ?? 'reasoning';
1624
+ if (chunkType === 'reasoning-start') {
1625
+ reasoningTextById.set(id, '');
1626
+ this.options.onReasoningStart?.(id, reasoningChunk.providerMetadata);
1627
+ }
1628
+ else if (chunkType === 'reasoning-delta') {
1629
+ const delta = reasoningChunk.delta ?? reasoningChunk.textDelta ?? reasoningChunk.text ?? '';
1630
+ if (!reasoningTextById.has(id)) {
1631
+ reasoningTextById.set(id, '');
1632
+ this.options.onReasoningStart?.(id, reasoningChunk.providerMetadata);
1633
+ }
1634
+ reasoningTextById.set(id, (reasoningTextById.get(id) ?? '') + delta);
1635
+ this.options.onReasoningDelta?.(id, delta, reasoningChunk.providerMetadata);
1636
+ }
1637
+ else if (chunkType === 'reasoning-end') {
1638
+ const text = reasoningTextById.get(id) ?? '';
1639
+ reasoningTextById.delete(id);
1640
+ this.options.onReasoningEnd?.(id, text, reasoningChunk.providerMetadata);
1641
+ }
1642
+ },
1643
+ onToolExecutionStart: ({ toolCall }) => {
1644
+ const input = parseToolInput(toolCall.input);
1645
+ const signature = toolSignature(toolCall.toolName, input);
1646
+ const existing = preparations.get(toolCall.toolCallId);
1647
+ if (existing) {
1648
+ if (existing.signature !== signature) {
1649
+ throw new Error(`Tool call id collision for "${toolCall.toolCallId}" in generation "${generationId}".`);
1650
+ }
1651
+ return existing.promise;
1652
+ }
1653
+ const promise = Promise.resolve().then(async () => {
1654
+ const startedBeforeInference = !currentInferenceId;
1655
+ const inferenceId = currentInferenceId ?? await beginInference();
1656
+ const approvalAssistantEvent = startedBeforeInference
1657
+ ? [...this.events].reverse().find((candidate) => candidate.type === 'assistant-message'
1658
+ && Array.isArray(candidate.content)
1659
+ && candidate.content.some((part) => part.type === 'tool-call' && part.toolCallId === toolCall.toolCallId))
1660
+ : undefined;
1661
+ let callEvent = [...this.events].reverse().find((event) => event.type === 'tool-call'
1662
+ && event.toolCallId === toolCall.toolCallId
1663
+ && (event.generationId === generationId
1664
+ || (!!approvalAssistantEvent?.id
1665
+ && event.parentIds?.includes(approvalAssistantEvent.id) === true)));
1666
+ if (callEvent && toolSignature(callEvent.toolName, callEvent.input) !== signature) {
1667
+ throw new Error(`Tool call id collision for "${toolCall.toolCallId}" in generation "${generationId}".`);
1668
+ }
1669
+ if (!callEvent) {
1670
+ callEvent = this.commitEvent(createAgentEvent({
1671
+ type: 'tool-call',
1672
+ toolCallId: toolCall.toolCallId,
1673
+ toolName: toolCall.toolName,
1674
+ input,
1675
+ generationId,
1676
+ inferenceId,
1677
+ causationId: inferenceId,
1678
+ parentIds: [inferenceId],
1679
+ }));
1680
+ }
1681
+ await this.flushPersistence();
1682
+ recordToolCall(toolCalls, toolCallIndexes, toolCall);
1683
+ if (options.transaction) {
1684
+ let intent = [...this.events].reverse().find((event) => event.type === 'tool-execution-intent'
1685
+ && event.generationId === generationId
1686
+ && event.toolCallId === toolCall.toolCallId);
1687
+ if (intent && toolSignature(intent.toolName, intent.input) !== signature) {
1688
+ throw new Error(`Tool call id collision for "${toolCall.toolCallId}" in generation "${generationId}".`);
1689
+ }
1690
+ if (!intent) {
1691
+ intent = this.commitEvent(createAgentEvent({
1692
+ type: 'tool-execution-intent',
1693
+ generationId,
1694
+ inferenceId: callEvent.inferenceId,
1695
+ causationId: callEvent.id,
1696
+ toolCallId: toolCall.toolCallId,
1697
+ toolName: toolCall.toolName,
1698
+ input,
1699
+ parentIds: [callEvent.id],
1700
+ }));
1701
+ }
1702
+ executionIntentIds.set(toolCall.toolCallId, intent.id);
1703
+ await this.flushPersistence();
1704
+ }
1705
+ completedPreparations.add(toolCall.toolCallId);
1706
+ const callbackEvent = {
1707
+ toolCallId: toolCall.toolCallId,
1708
+ toolName: toolCall.toolName,
1709
+ input,
1710
+ };
1711
+ this.options.onToolCallStart?.(callbackEvent);
1712
+ this.options.onToolCall?.(callbackEvent.toolName, callbackEvent.input);
1713
+ });
1714
+ preparations.set(toolCall.toolCallId, { signature, promise });
1715
+ void promise.catch((error) => {
1716
+ if (!completedPreparations.has(toolCall.toolCallId)) {
1717
+ preparationErrors.set(toolCall.toolCallId, error);
1718
+ }
1719
+ });
1720
+ return promise;
1721
+ },
1722
+ onToolExecutionEnd: async (finish) => {
1723
+ preliminaryToolOutputs.delete(finish.toolCall.toolCallId);
1724
+ const inferenceId = currentInferenceId ?? await beginInference();
1725
+ const previousResult = this.currentGenerationEvent(generationId, 'tool-result', finish.toolCall.toolCallId);
1726
+ if (this.currentGenerationEvent(generationId, 'tool-result', finish.toolCall.toolCallId, inferenceId))
1727
+ return;
1728
+ const input = parseToolInput(finish.toolCall.input);
1729
+ const startEvent = {
1730
+ toolCallId: finish.toolCall.toolCallId,
1731
+ toolName: finish.toolCall.toolName,
1732
+ input,
1733
+ };
1734
+ const finishEvent = finish.toolOutput.type === 'tool-result'
1735
+ ? { ...startEvent, success: true, output: finish.toolOutput.output }
1736
+ : { ...startEvent, success: false, error: errorToString(finish.toolOutput.error) };
1737
+ const parentCall = this.currentGenerationEvent(generationId, 'tool-call', finish.toolCall.toolCallId, inferenceId);
1738
+ const toolWithModelOutput = allTools[finish.toolCall.toolName];
1739
+ const modelOutput = finishEvent.success && toolWithModelOutput?.toModelOutput
1740
+ ? await this.invokeGenerationCallback(() => toolWithModelOutput.toModelOutput({
1741
+ toolCallId: finish.toolCall.toolCallId,
1742
+ input,
1743
+ output: finishEvent.output,
1744
+ }))
1745
+ : fallbackModelOutput(finishEvent.success ? finishEvent.output : undefined, finishEvent.success ? undefined : finishEvent.error);
1746
+ const executionIntentId = executionIntentIds.get(finish.toolCall.toolCallId);
1747
+ this.commitEvent(createAgentEvent({
1748
+ type: 'tool-result',
1749
+ toolCallId: finish.toolCall.toolCallId,
1750
+ toolName: finish.toolCall.toolName,
1751
+ ...(executionIntentId ? { executionIntentId } : {}),
1752
+ output: finishEvent.success ? finishEvent.output : undefined,
1753
+ error: finishEvent.success ? undefined : finishEvent.error,
1754
+ modelOutput,
1755
+ generationId,
1756
+ inferenceId,
1757
+ causationId: inferenceId,
1758
+ parentIds: parentCall ? [parentCall.id] : [inferenceId],
1759
+ }));
1760
+ await this.flushPersistence();
1761
+ recordToolCall(toolCalls, toolCallIndexes, finish.toolCall, finishEvent.success ? { output: finishEvent.output } : { error: finishEvent.error });
1762
+ if (previousResult)
1763
+ return;
1764
+ this.options.onToolCallFinish?.(finishEvent);
1765
+ this.options.onToolResult?.(finishEvent.toolName, finishEvent.success ? finishEvent.output : undefined);
1766
+ },
1767
+ onStepEnd: async (step) => {
1768
+ if (!currentInferenceId)
1769
+ throw new Error('Model step finished outside an inference.');
1770
+ if (!completedInferenceIds.has(currentInferenceId)) {
1771
+ completedInferenceIds.add(currentInferenceId);
1772
+ stepCount++;
1773
+ }
1774
+ totalInput += step.usage.inputTokens ?? 0;
1775
+ totalOutput += step.usage.outputTokens ?? 0;
1776
+ totalCacheRead += step.usage.inputTokenDetails.cacheReadTokens ?? 0;
1777
+ totalCacheWrite += step.usage.inputTokenDetails.cacheWriteTokens ?? 0;
1778
+ for (const toolCall of step.toolCalls) {
1779
+ recordToolCall(toolCalls, toolCallIndexes, toolCall);
1780
+ }
1781
+ for (const toolResult of step.toolResults) {
1782
+ recordToolCall(toolCalls, toolCallIndexes, toolResult, { output: toolResult.output });
1783
+ }
1784
+ for (const part of step.content) {
1785
+ if (part.type === 'tool-error') {
1786
+ recordToolCall(toolCalls, toolCallIndexes, part, { error: part.error });
1787
+ }
1788
+ }
1789
+ this.commitResponseMessages(step.response.messages, generationId, currentInferenceId, executionIntentIds);
1790
+ await this.flushPersistence();
1791
+ attempt = 0;
1792
+ contextOverflowRetries = 0;
1793
+ },
1794
+ });
1795
+ const text = await result.text;
1796
+ const finishReason = await result.finishReason;
1797
+ await result.response;
1798
+ if (streamError)
1799
+ throw streamError;
1800
+ flushReasoning();
1801
+ await this.flushPersistence();
1802
+ const resultVisibleIds = new Set(latestInferenceVisibleIds);
1803
+ for (const event of this.events) {
1804
+ if (event.generationId === generationId)
1805
+ resultVisibleIds.add(event.id);
1806
+ }
1807
+ const generationResult = {
1808
+ text,
1809
+ messages: this.buildContext(this.eventsByIds(resultVisibleIds)),
1810
+ steps: stepCount,
1811
+ finishReason,
1812
+ usage: {
1813
+ inputTokens: totalInput,
1814
+ outputTokens: totalOutput,
1815
+ totalTokens: totalInput + totalOutput,
1816
+ cacheReadTokens: totalCacheRead,
1817
+ cacheWriteTokens: totalCacheWrite,
1818
+ },
1819
+ toolCalls,
1820
+ events: this.getEvents(),
1821
+ };
1822
+ await this.runEventRetentionLocked();
1823
+ generationResult.events = this.getEvents();
1824
+ completedResult = generationResult;
1825
+ return generationResult;
1826
+ }
1827
+ catch (error) {
1828
+ flushReasoning();
1829
+ const effectiveError = streamError ?? error;
1830
+ if (combinedAbort.signal.aborted) {
1831
+ throw combinedAbort.signal.reason ?? new DOMException('Aborted', 'AbortError');
1832
+ }
1833
+ if (effectiveError instanceof DOMException && effectiveError.name === 'AbortError') {
1834
+ throw effectiveError;
1835
+ }
1836
+ if (currentInferenceId
1837
+ && !completedInferenceIds.has(currentInferenceId)
1838
+ && this.events.some((event) => event.generationId === generationId
1839
+ && event.inferenceId === currentInferenceId
1840
+ && event.type === 'tool-result')) {
1841
+ completedInferenceIds.add(currentInferenceId);
1842
+ stepCount++;
1843
+ }
1844
+ if (isRetryableError(effectiveError) && attempt < MAX_RETRY_ATTEMPTS && stepCount < maxSteps) {
1845
+ attempt++;
1846
+ const errorWithHeaders = effectiveError;
1847
+ await sleep(retryDelay(attempt, errorWithHeaders.responseHeaders ?? errorWithHeaders.headers), combinedAbort.signal);
1848
+ continue;
1849
+ }
1850
+ if (isContextOverflow(effectiveError)) {
1851
+ if (!this.options.contextCompactor && !this.options.onContextOverflow) {
1852
+ throw new ContextOverflowError();
1853
+ }
1854
+ if (contextOverflowRetries >= maxContextOverflowRetries) {
1855
+ throw new ContextOverflowError(`Agent context overflow persisted after ${maxContextOverflowRetries} compaction retries`);
1856
+ }
1857
+ combinedAbort.signal.throwIfAborted();
1858
+ contextOverflowRetries++;
1859
+ await this.performCompaction('context-overflow', combinedAbort.signal);
1860
+ continue;
1861
+ }
1862
+ throw effectiveError;
1863
+ }
1864
+ }
1865
+ }
1866
+ catch (error) {
1867
+ operationError = error;
1868
+ }
1869
+ finally {
1870
+ let cleanupError;
1871
+ if (leaseCleanupOwnership) {
1872
+ try {
1873
+ await this.cleanupGenerationLease(leaseCleanupOwnership);
1874
+ }
1875
+ catch (error) {
1876
+ cleanupError = error;
1877
+ }
1878
+ }
1879
+ if (operationError === undefined && combinedAbort.signal.aborted) {
1880
+ operationError = combinedAbort.signal.reason
1881
+ ?? new DOMException('Aborted', 'AbortError');
1882
+ }
1883
+ let effectiveError = operationError !== undefined && cleanupError !== undefined
1884
+ ? new AggregateError([operationError, cleanupError], 'Agent generation and generation lease cleanup both failed.')
1885
+ : operationError ?? cleanupError;
1886
+ try {
1887
+ if (options.transaction && transactionExecutionStarted) {
1888
+ if (effectiveError === undefined && combinedAbort.signal.aborted) {
1889
+ effectiveError = combinedAbort.signal.reason
1890
+ ?? new DOMException('Aborted', 'AbortError');
1891
+ }
1892
+ try {
1893
+ if (effectiveError !== undefined) {
1894
+ await this.appendGenerationOutcome(generationId, 'interrupted', this.transactionOutcomeErrorReason(effectiveError));
1895
+ }
1896
+ else {
1897
+ const transaction = this.transaction(generationId);
1898
+ if (transaction.state !== 'execution-started') {
1899
+ throw new Error(`Transactional generation "${generationId}" cannot complete from state "${transaction.state}".`);
1900
+ }
1901
+ combinedAbort.signal.throwIfAborted();
1902
+ this.commitEvent(createAgentEvent({
1903
+ type: 'generation-execution-completed',
1904
+ generationId,
1905
+ parentIds: [transaction.executionStarted.id],
1906
+ }));
1907
+ await this.flushPersistence();
1908
+ if (combinedAbort.signal.aborted) {
1909
+ const abortError = combinedAbort.signal.reason
1910
+ ?? new DOMException('Aborted', 'AbortError');
1911
+ await this.appendGenerationOutcome(generationId, 'interrupted', this.transactionOutcomeErrorReason(abortError));
1912
+ throw abortError;
1913
+ }
1914
+ if (completedResult)
1915
+ completedResult.events = this.getEvents();
1916
+ }
1917
+ }
1918
+ catch (outcomeError) {
1919
+ if (effectiveError !== undefined) {
1920
+ throw new AggregateError([effectiveError, outcomeError], 'Agent generation failed and its interrupted outcome could not be persisted.');
1921
+ }
1922
+ throw outcomeError;
1923
+ }
1924
+ }
1925
+ if (effectiveError !== undefined)
1926
+ throw effectiveError;
1927
+ }
1928
+ finally {
1929
+ combinedAbort.cleanup();
1930
+ if (this.currentGenerationAbortController === generationAbortController) {
1931
+ this.currentGenerationAbortController = undefined;
1932
+ }
1933
+ }
1934
+ }
1935
+ throw operationError ?? new Error('Agent generation ended without a result.');
1936
+ }
1937
+ abortCurrentGeneration(reason) {
1938
+ this.currentGenerationAbortController?.abort(reason ?? new DOMException('Current agent generation aborted', 'AbortError'));
1939
+ }
1940
+ async abortSession(reason, options = {}) {
1941
+ if (!this.sessionAbortController.signal.aborted) {
1942
+ this.sessionAbortController.abort(reason ?? new DOMException('Agent session aborted', 'AbortError'));
1943
+ }
1944
+ this.abortCurrentGeneration(reason);
1945
+ for (const key of [...this.scheduledGenerations.keys()]) {
1946
+ this.cancelScheduledGeneration(key, reason ?? new DOMException('Agent session aborted', 'AbortError'));
1947
+ }
1948
+ if (options.abortBackgroundJobs) {
1949
+ const jobs = this.options.executionContext?.jobs;
1950
+ if (!jobs?.abort)
1951
+ return;
1952
+ const runningJobs = (await jobs.list()).filter((job) => job.state === 'running');
1953
+ await Promise.all(runningJobs.map((job) => jobs.abort(job.executionId)));
1954
+ }
1955
+ }
1956
+ async getBackgroundExecution(executionId) {
1957
+ const jobs = this.options.executionContext?.jobs;
1958
+ if (!jobs)
1959
+ throw new Error('This AgentSession has no background job context.');
1960
+ return jobs.get(executionId);
1961
+ }
1962
+ async abortBackgroundExecution(executionId) {
1963
+ const jobs = this.options.executionContext?.jobs;
1964
+ if (!jobs?.abort)
1965
+ throw new Error('This AgentSession cannot abort background jobs.');
1966
+ await jobs.abort(executionId);
1967
+ }
1968
+ async close() {
1969
+ if (this.ownership.kind === 'exposed' && this.ownership.callbackScope.getStore()?.active) {
1970
+ throw new Error('AgentSession.close() cannot be called from an active tool or compactor callback.');
1971
+ }
1972
+ this.closeFinalizationReached = false;
1973
+ this.refreshCloseCleanupCompleted();
1974
+ if (!this.closed) {
1975
+ this.closed = true;
1976
+ const closeReason = new DOMException('AgentSession closed', 'AbortError');
1977
+ if (!this.sessionAbortController.signal.aborted) {
1978
+ this.sessionAbortController.abort(closeReason);
1979
+ }
1980
+ this.abortCurrentGeneration(closeReason);
1981
+ for (const key of [...this.scheduledGenerations.keys()]) {
1982
+ this.cancelScheduledGeneration(key, closeReason);
1983
+ }
1984
+ }
1985
+ let closeError;
1986
+ const rememberCloseError = (error, message) => {
1987
+ closeError = closeError === undefined
1988
+ ? error
1989
+ : new AggregateError([closeError, error], message);
1990
+ };
1991
+ try {
1992
+ const unsubscribe = this.jobUnsubscribe;
1993
+ unsubscribe?.();
1994
+ this.jobUnsubscribe = undefined;
1995
+ }
1996
+ catch (error) {
1997
+ rememberCloseError(error, 'AgentSession close encountered multiple cleanup errors.');
1998
+ }
1999
+ try {
2000
+ await this.generationQueue;
2001
+ for (const transaction of getOpenAgentGenerationTransactions(this.events)) {
2002
+ await this.appendGenerationOutcome(transaction.generationId, 'interrupted', 'AgentSession closed before the transactional generation was finalized.');
2003
+ }
2004
+ if (this.retentionPromise)
2005
+ await this.retentionPromise;
2006
+ await this.flushPersistence();
2007
+ if (this.maintenanceError !== undefined)
2008
+ throw this.maintenanceError;
2009
+ }
2010
+ catch (error) {
2011
+ rememberCloseError(error, 'AgentSession close encountered persistence or maintenance errors.');
2012
+ }
2013
+ finally {
2014
+ for (const ownership of [...this.unresolvedLeaseCleanups]) {
2015
+ try {
2016
+ await this.cleanupGenerationLease(ownership);
2017
+ }
2018
+ catch (error) {
2019
+ rememberCloseError(error, 'AgentSession close encountered multiple cleanup errors.');
2020
+ }
2021
+ }
2022
+ this.generationHandles.clear();
2023
+ try {
2024
+ while (this.notificationDispatches.size > 0) {
2025
+ await Promise.all(this.notificationDispatches);
2026
+ }
2027
+ }
2028
+ catch (error) {
2029
+ rememberCloseError(error, 'AgentSession close encountered notification cleanup errors.');
2030
+ }
2031
+ const listenerStates = [...this.listeners.values()];
2032
+ this.listeners.clear();
2033
+ try {
2034
+ await Promise.all(listenerStates
2035
+ .filter((state) => !state.executing && state.deliveryPromise)
2036
+ .map((state) => state.deliveryPromise));
2037
+ }
2038
+ catch (error) {
2039
+ rememberCloseError(error, 'AgentSession close encountered listener cleanup errors.');
2040
+ }
2041
+ finally {
2042
+ this.closeFinalizationReached = true;
2043
+ this.refreshCloseCleanupCompleted();
2044
+ }
2045
+ }
2046
+ if (closeError !== undefined)
2047
+ throw closeError;
2048
+ }
2049
+ runInCallbackScope(state, callback) {
2050
+ return this.ownership.kind === 'exposed'
2051
+ ? this.ownership.callbackScope.run(state, callback)
2052
+ : callback();
2053
+ }
2054
+ invokeGenerationCallback(callback) {
2055
+ const state = { active: true };
2056
+ return this.runInCallbackScope(state, () => {
2057
+ try {
2058
+ const result = callback();
2059
+ return this.adoptGenerationCallbackResult(result, state);
2060
+ }
2061
+ catch (error) {
2062
+ state.active = false;
2063
+ throw error;
2064
+ }
2065
+ });
2066
+ }
2067
+ adoptGenerationCallbackResult(result, state) {
2068
+ try {
2069
+ if (isAsyncIterable(result)) {
2070
+ return this.wrapGenerationCallbackIterable(result, state);
2071
+ }
2072
+ if (isPromiseLike(result)) {
2073
+ return Promise.resolve(result).then((resolvedResult) => this.adoptGenerationCallbackResult(resolvedResult, state), (error) => {
2074
+ state.active = false;
2075
+ throw error;
2076
+ });
2077
+ }
2078
+ state.active = false;
2079
+ return result;
2080
+ }
2081
+ catch (error) {
2082
+ state.active = false;
2083
+ throw error;
2084
+ }
2085
+ }
2086
+ wrapGenerationCallbackIterable(iterable, state) {
2087
+ const iterator = this.runInCallbackScope(state, () => iterable[Symbol.asyncIterator]());
2088
+ let settled = false;
2089
+ const settle = () => {
2090
+ if (settled)
2091
+ return;
2092
+ settled = true;
2093
+ state.active = false;
2094
+ };
2095
+ const invoke = (operation) => {
2096
+ let operationResult;
2097
+ try {
2098
+ operationResult = this.runInCallbackScope(state, () => Promise.resolve(operation()));
2099
+ }
2100
+ catch (error) {
2101
+ settle();
2102
+ return Promise.reject(error);
2103
+ }
2104
+ return operationResult.then((iteratorResult) => {
2105
+ if (iteratorResult.done)
2106
+ settle();
2107
+ return iteratorResult;
2108
+ }, (error) => {
2109
+ settle();
2110
+ throw error;
2111
+ });
2112
+ };
2113
+ const wrappedIterator = {
2114
+ next: (...args) => invoke(() => iterator.next(...args)),
2115
+ return: iterator.return
2116
+ ? async (...args) => {
2117
+ let iteratorResult = await invoke(() => iterator.return(...args));
2118
+ while (!iteratorResult.done) {
2119
+ iteratorResult = await invoke(() => iterator.next());
2120
+ }
2121
+ return iteratorResult;
2122
+ }
2123
+ : async (...args) => {
2124
+ settle();
2125
+ return { done: true, value: args[0] };
2126
+ },
2127
+ throw: iterator.throw
2128
+ ? (error) => invoke(() => iterator.throw(error))
2129
+ : async (error) => {
2130
+ settle();
2131
+ throw error;
2132
+ },
2133
+ [Symbol.asyncIterator]() {
2134
+ return this;
2135
+ },
2136
+ };
2137
+ return wrappedIterator;
2138
+ }
2139
+ }
2140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXNzaW9uZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfYWdlbnQvY2xhc3Nlcy5zZXNzaW9uZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLDBCQUEwQixHQWlCM0IsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2hDLG9CQUFvQixHQXFCckIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLDRCQUE0QixHQUM3QixNQUFNLDZCQUE2QixDQUFDO0FBT3JDLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLGtDQUFrQyxFQUNsQyxnQ0FBZ0MsR0FFakMsTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFDL0IsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEtBQWtCLEVBQVcsRUFBRSxDQUNsRSxLQUFLLENBQUMsSUFBSSxLQUFLLGtCQUFrQjtPQUM5QixLQUFLLENBQUMsSUFBSSxLQUFLLDhCQUE4QjtPQUM3QyxLQUFLLENBQUMsSUFBSSxLQUFLLGdDQUFnQztPQUMvQyxLQUFLLENBQUMsSUFBSSxLQUFLLG9CQUFvQjtPQUNuQyxLQUFLLENBQUMsSUFBSSxLQUFLLHVCQUF1QjtPQUN0QyxLQUFLLENBQUMsSUFBSSxLQUFLLCtCQUErQixDQUFDO0FBOERwRCxNQUFNLGlCQUFpQixHQUFHLElBQUks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