@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.
- package/dist_ts_agent/classes.sessionengine.d.ts +93 -0
- package/dist_ts_agent/classes.sessionengine.js +2140 -0
- package/dist_ts_agent/index.d.ts +3 -2
- package/dist_ts_agent/index.js +3 -2
- package/dist_ts_agent/persistence.file.d.ts +24 -0
- package/dist_ts_agent/persistence.file.js +199 -0
- package/dist_ts_agent/plugins.d.ts +0 -7
- package/dist_ts_agent/plugins.js +1 -9
- package/dist_ts_agent/plugins.node.d.ts +7 -0
- package/dist_ts_agent/plugins.node.js +9 -0
- package/dist_ts_agent/plugins.portable.d.ts +4 -0
- package/dist_ts_agent/plugins.portable.js +5 -0
- package/dist_ts_agent/runner.d.ts +4 -0
- package/dist_ts_agent/runner.js +34 -0
- package/dist_ts_agent/runtime.interfaces.d.ts +21 -0
- package/dist_ts_agent/runtime.interfaces.js +2 -0
- package/dist_ts_agent/runtime.run.d.ts +3 -0
- package/dist_ts_agent/runtime.run.js +94 -0
- package/dist_ts_agent/smartagent.classes.agent.js +4 -93
- package/dist_ts_agent/smartagent.classes.session.d.ts +5 -88
- package/dist_ts_agent/smartagent.classes.session.js +19 -2134
- package/dist_ts_agent/smartagent.events.js +2 -2
- package/dist_ts_agent/smartagent.persistence.d.ts +2 -22
- package/dist_ts_agent/smartagent.persistence.js +3 -198
- package/package.json +9 -3
- package/readme.md +6 -0
- package/ts_agent/classes.sessionengine.ts +2591 -0
- package/ts_agent/index.ts +2 -2
- package/ts_agent/persistence.file.ts +232 -0
- package/ts_agent/plugins.node.ts +10 -0
- package/ts_agent/plugins.portable.ts +5 -0
- package/ts_agent/plugins.ts +0 -10
- package/ts_agent/readme.md +6 -0
- package/ts_agent/runner.ts +40 -0
- package/ts_agent/runtime.interfaces.ts +21 -0
- package/ts_agent/runtime.run.ts +107 -0
- package/ts_agent/smartagent.classes.agent.ts +4 -101
- package/ts_agent/smartagent.classes.session.ts +24 -2582
- package/ts_agent/smartagent.events.ts +1 -1
- package/ts_agent/smartagent.persistence.ts +2 -224
|
@@ -1,2139 +1,24 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
}
|
|
1
|
+
import * as plugins from './plugins.node.js';
|
|
2
|
+
import { AgentSessionEngine } from './classes.sessionengine.js';
|
|
3
|
+
const nodePlatform = {
|
|
4
|
+
createClaimToken: () => plugins.crypto.randomBytes(32).toString('base64url'),
|
|
5
|
+
hashClaimToken: (token) => plugins.crypto.createHash('sha256').update(token).digest('hex'),
|
|
6
|
+
equalClaimDigests: (left, right) => plugins.crypto.timingSafeEqual(Buffer.from(left, 'hex'), Buffer.from(right, 'hex')),
|
|
7
|
+
isDeepEqual: plugins.isDeepStrictEqual,
|
|
8
|
+
reportListenerError: (error) => process.emitWarning(error instanceof Error ? error : String(error), {
|
|
9
|
+
code: 'SMARTAGENT_SESSION_LISTENER_ERROR',
|
|
10
|
+
}),
|
|
11
|
+
};
|
|
12
|
+
/** Node session facade; callback ancestry remains isolated with AsyncLocalStorage. */
|
|
13
|
+
export class AgentSession extends AgentSessionEngine {
|
|
272
14
|
constructor(options) {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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();
|
|
15
|
+
super(options, nodePlatform, {
|
|
16
|
+
kind: 'exposed',
|
|
17
|
+
callbackScope: new plugins.AsyncLocalStorage(),
|
|
1140
18
|
});
|
|
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
19
|
}
|
|
2085
|
-
|
|
2086
|
-
|
|
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;
|
|
20
|
+
static create(options) {
|
|
21
|
+
return this.createWithFactory(options, () => new AgentSession(options));
|
|
2137
22
|
}
|
|
2138
23
|
}
|
|
2139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19hZ2VudC9zbWFydGFnZW50LmNsYXNzZXMuc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQiwwQkFBMEIsR0FpQjNCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGdDQUFnQyxFQUNoQyxvQkFBb0IsR0FxQnJCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiw0QkFBNEIsR0FDN0IsTUFBTSw2QkFBNkIsQ0FBQztBQU9yQyxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDhCQUE4QixFQUM5QixrQ0FBa0MsRUFDbEMsZ0NBQWdDLEdBRWpDLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFrQixFQUFXLEVBQUUsQ0FDbEUsS0FBSyxDQUFDLElBQUksS0FBSyxrQkFBa0I7T0FDOUIsS0FBSyxDQUFDLElBQUksS0FBSyw4QkFBOEI7T0FDN0MsS0FBSyxDQUFDLElBQUksS0FBSyxnQ0FBZ0M7T0FDL0MsS0FBSyxDQUFDLElBQUksS0FBSyxvQkFBb0I7T0FDbkMsS0FBSyxDQUFDLElBQUksS0FBSyx1QkFBdUI7T0FDdEMsS0FBSyxDQUFDLElBQUksS0FBSywrQkFBK0IsQ0FBQztBQThEcEQsTUFBTSxpQkFBaUIs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
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19hZ2VudC9zbWFydGFnZW50LmNsYXNzZXMuc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSWhFLE1BQU0sWUFBWSxHQUEwQjtJQUMxQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQzVFLGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDMUYsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FDaEUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQ3BEO0lBQ0QsV0FBVyxFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7SUFDdEMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbEcsSUFBSSxFQUFFLG1DQUFtQztLQUMxQyxDQUFDO0NBQ0gsQ0FBQztBQUVGLHNGQUFzRjtBQUN0RixNQUFNLE9BQU8sWUFBYSxTQUFRLGtCQUFrQjtJQUNsRCxZQUFZLE9BQTZCO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO1lBQzNCLElBQUksRUFBRSxTQUFTO1lBQ2YsYUFBYSxFQUFFLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUF1QjtTQUNwRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUE2QjtRQUNoRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0YifQ==
|