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