@modelprofile.com/flexharness-agent 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist_ts_agent/index.d.ts +17 -0
  2. package/dist_ts_agent/index.js +14 -0
  3. package/dist_ts_agent/plugins.d.ts +16 -0
  4. package/dist_ts_agent/plugins.js +18 -0
  5. package/dist_ts_agent/smartagent.classes.agent.d.ts +2 -0
  6. package/dist_ts_agent/smartagent.classes.agent.js +95 -0
  7. package/dist_ts_agent/smartagent.classes.session.d.ts +90 -0
  8. package/dist_ts_agent/smartagent.classes.session.js +2139 -0
  9. package/dist_ts_agent/smartagent.classes.toolregistry.d.ts +12 -0
  10. package/dist_ts_agent/smartagent.classes.toolregistry.js +23 -0
  11. package/dist_ts_agent/smartagent.context.d.ts +3 -0
  12. package/dist_ts_agent/smartagent.context.js +247 -0
  13. package/dist_ts_agent/smartagent.events.d.ts +160 -0
  14. package/dist_ts_agent/smartagent.events.js +136 -0
  15. package/dist_ts_agent/smartagent.interfaces.d.ts +275 -0
  16. package/dist_ts_agent/smartagent.interfaces.js +24 -0
  17. package/dist_ts_agent/smartagent.persistence.d.ts +88 -0
  18. package/dist_ts_agent/smartagent.persistence.js +677 -0
  19. package/dist_ts_agent/smartagent.transactions.d.ts +15 -0
  20. package/dist_ts_agent/smartagent.transactions.js +141 -0
  21. package/dist_ts_agent/tool.adapter.d.ts +29 -0
  22. package/dist_ts_agent/tool.adapter.js +60 -0
  23. package/dist_ts_agent/tool.contracts.d.ts +126 -0
  24. package/dist_ts_agent/tool.contracts.js +2 -0
  25. package/dist_ts_agent/tool.persistence.d.ts +23 -0
  26. package/dist_ts_agent/tool.persistence.js +35 -0
  27. package/license.md +21 -0
  28. package/package.json +31 -0
  29. package/readme.md +37 -0
  30. package/ts_agent/index.ts +119 -0
  31. package/ts_agent/plugins.ts +62 -0
  32. package/ts_agent/readme.md +37 -0
  33. package/ts_agent/smartagent.classes.agent.ts +104 -0
  34. package/ts_agent/smartagent.classes.session.ts +2588 -0
  35. package/ts_agent/smartagent.classes.toolregistry.ts +26 -0
  36. package/ts_agent/smartagent.context.ts +280 -0
  37. package/ts_agent/smartagent.events.ts +347 -0
  38. package/ts_agent/smartagent.interfaces.ts +365 -0
  39. package/ts_agent/smartagent.persistence.ts +827 -0
  40. package/ts_agent/smartagent.transactions.ts +193 -0
  41. package/ts_agent/tool.adapter.ts +85 -0
  42. package/ts_agent/tool.contracts.ts +149 -0
  43. package/ts_agent/tool.persistence.ts +64 -0
@@ -0,0 +1,677 @@
1
+ import * as plugins from './plugins.js';
2
+ const SNAPSHOT_SCHEMA_VERSION = 2;
3
+ const ARCHIVE_SCHEMA_VERSION = 2;
4
+ export const isAgentEventStoreV2 = (store) => !!store
5
+ && 'eventSchemaVersion' in store
6
+ && store.eventSchemaVersion === 2;
7
+ const AGENT_EVENT_TYPES = new Set([
8
+ 'system-message',
9
+ 'user-message',
10
+ 'assistant-message',
11
+ 'tool-call',
12
+ 'tool-result',
13
+ 'runtime-event',
14
+ 'model-message',
15
+ 'generation-begun',
16
+ 'generation-execution-started',
17
+ 'generation-execution-completed',
18
+ 'generation-outcome',
19
+ 'tool-execution-intent',
20
+ 'tool-execution-reconciliation',
21
+ 'context-compaction',
22
+ ]);
23
+ const AGENT_CONVERSATION_EVENT_TYPES = new Set([
24
+ 'system-message',
25
+ 'user-message',
26
+ 'assistant-message',
27
+ 'tool-call',
28
+ 'tool-result',
29
+ 'model-message',
30
+ ]);
31
+ const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
32
+ const validationError = (path, message) => {
33
+ throw new Error(`${path} ${message}`);
34
+ };
35
+ const assertRecord = (value, path) => {
36
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
37
+ validationError(path, 'must be an object.');
38
+ }
39
+ };
40
+ const assertNonEmptyString = (value, path) => {
41
+ if (typeof value !== 'string' || !value.trim()) {
42
+ validationError(path, 'must be a non-empty string.');
43
+ }
44
+ };
45
+ const assertOptionalString = (value, path) => {
46
+ if (value !== undefined && typeof value !== 'string') {
47
+ validationError(path, 'must be a string when provided.');
48
+ }
49
+ };
50
+ const assertTimestamp = (value, path) => {
51
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
52
+ validationError(path, 'must be a non-negative finite number.');
53
+ }
54
+ };
55
+ const assertPositiveInteger = (value, path) => {
56
+ if (!Number.isSafeInteger(value) || Number(value) <= 0) {
57
+ validationError(path, 'must be a positive safe integer.');
58
+ }
59
+ };
60
+ const assertStringArray = (value, path) => {
61
+ if (!Array.isArray(value))
62
+ return validationError(path, 'must be an array.');
63
+ const values = new Set();
64
+ for (const [index, entry] of value.entries()) {
65
+ assertNonEmptyString(entry, `${path}[${index}]`);
66
+ if (values.has(entry))
67
+ validationError(path, 'must not contain duplicate values.');
68
+ values.add(entry);
69
+ }
70
+ };
71
+ const assertProviderOptions = (value, path) => {
72
+ if (value !== undefined)
73
+ assertRecord(value, path);
74
+ };
75
+ const assertToolResultOutput = (value, path) => {
76
+ assertRecord(value, path);
77
+ assertNonEmptyString(value.type, `${path}.type`);
78
+ assertProviderOptions(value.providerOptions, `${path}.providerOptions`);
79
+ if (value.type === 'text' || value.type === 'error-text') {
80
+ if (typeof value.value !== 'string')
81
+ validationError(`${path}.value`, 'must be a string.');
82
+ return;
83
+ }
84
+ if (value.type === 'json' || value.type === 'error-json') {
85
+ if (!hasOwn(value, 'value'))
86
+ validationError(`${path}.value`, 'is required.');
87
+ return;
88
+ }
89
+ if (value.type === 'execution-denied') {
90
+ assertOptionalString(value.reason, `${path}.reason`);
91
+ return;
92
+ }
93
+ if (value.type !== 'content')
94
+ return validationError(`${path}.type`, 'is invalid.');
95
+ if (!Array.isArray(value.value)) {
96
+ return validationError(`${path}.value`, 'must be an array.');
97
+ }
98
+ for (const [index, entryValue] of value.value.entries()) {
99
+ const entryPath = `${path}.value[${index}]`;
100
+ assertRecord(entryValue, entryPath);
101
+ assertNonEmptyString(entryValue.type, `${entryPath}.type`);
102
+ assertProviderOptions(entryValue.providerOptions, `${entryPath}.providerOptions`);
103
+ if (entryValue.type === 'text') {
104
+ if (typeof entryValue.text !== 'string')
105
+ validationError(`${entryPath}.text`, 'must be a string.');
106
+ }
107
+ else if (entryValue.type === 'media'
108
+ || entryValue.type === 'file-data'
109
+ || entryValue.type === 'image-data') {
110
+ if (typeof entryValue.data !== 'string')
111
+ validationError(`${entryPath}.data`, 'must be a string.');
112
+ if (typeof entryValue.mediaType !== 'string') {
113
+ validationError(`${entryPath}.mediaType`, 'must be a string.');
114
+ }
115
+ assertOptionalString(entryValue.filename, `${entryPath}.filename`);
116
+ }
117
+ else if (entryValue.type === 'file-url' || entryValue.type === 'image-url') {
118
+ if (typeof entryValue.url !== 'string')
119
+ validationError(`${entryPath}.url`, 'must be a string.');
120
+ }
121
+ else if (entryValue.type === 'file-id' || entryValue.type === 'image-file-id') {
122
+ if (typeof entryValue.fileId !== 'string') {
123
+ assertRecord(entryValue.fileId, `${entryPath}.fileId`);
124
+ for (const [provider, fileId] of Object.entries(entryValue.fileId)) {
125
+ if (typeof fileId !== 'string') {
126
+ validationError(`${entryPath}.fileId.${provider}`, 'must be a string.');
127
+ }
128
+ }
129
+ }
130
+ }
131
+ else if (entryValue.type !== 'custom') {
132
+ validationError(`${entryPath}.type`, 'is invalid.');
133
+ }
134
+ }
135
+ };
136
+ const assertMessageContentPart = (value, path, role) => {
137
+ assertRecord(value, path);
138
+ assertNonEmptyString(value.type, `${path}.type`);
139
+ assertProviderOptions(value.providerOptions, `${path}.providerOptions`);
140
+ if (value.type === 'text' || value.type === 'reasoning') {
141
+ if (value.type === 'reasoning' && role !== 'assistant') {
142
+ validationError(`${path}.type`, `is invalid for a ${role} message.`);
143
+ }
144
+ if (typeof value.text !== 'string')
145
+ validationError(`${path}.text`, 'must be a string.');
146
+ return;
147
+ }
148
+ if (value.type === 'image') {
149
+ if (role !== 'user')
150
+ validationError(`${path}.type`, `is invalid for a ${role} message.`);
151
+ if (!hasOwn(value, 'image'))
152
+ validationError(`${path}.image`, 'is required.');
153
+ assertOptionalString(value.mediaType, `${path}.mediaType`);
154
+ return;
155
+ }
156
+ if (value.type === 'file') {
157
+ if (role === 'tool')
158
+ validationError(`${path}.type`, 'is invalid for a tool message.');
159
+ if (!hasOwn(value, 'data'))
160
+ validationError(`${path}.data`, 'is required.');
161
+ if (typeof value.mediaType !== 'string')
162
+ validationError(`${path}.mediaType`, 'must be a string.');
163
+ assertOptionalString(value.filename, `${path}.filename`);
164
+ return;
165
+ }
166
+ if (value.type === 'tool-call') {
167
+ if (role !== 'assistant')
168
+ validationError(`${path}.type`, `is invalid for a ${role} message.`);
169
+ assertNonEmptyString(value.toolCallId, `${path}.toolCallId`);
170
+ assertNonEmptyString(value.toolName, `${path}.toolName`);
171
+ if (!hasOwn(value, 'input'))
172
+ validationError(`${path}.input`, 'is required.');
173
+ if (value.providerExecuted !== undefined && typeof value.providerExecuted !== 'boolean') {
174
+ validationError(`${path}.providerExecuted`, 'must be a boolean when provided.');
175
+ }
176
+ return;
177
+ }
178
+ if (value.type === 'tool-result') {
179
+ if (role === 'user')
180
+ validationError(`${path}.type`, 'is invalid for a user message.');
181
+ assertNonEmptyString(value.toolCallId, `${path}.toolCallId`);
182
+ assertNonEmptyString(value.toolName, `${path}.toolName`);
183
+ if (!hasOwn(value, 'output'))
184
+ validationError(`${path}.output`, 'is required.');
185
+ assertToolResultOutput(value.output, `${path}.output`);
186
+ return;
187
+ }
188
+ if (value.type === 'tool-approval-request') {
189
+ if (role !== 'assistant')
190
+ validationError(`${path}.type`, `is invalid for a ${role} message.`);
191
+ assertNonEmptyString(value.approvalId, `${path}.approvalId`);
192
+ assertNonEmptyString(value.toolCallId, `${path}.toolCallId`);
193
+ return;
194
+ }
195
+ if (value.type === 'tool-approval-response') {
196
+ if (role !== 'tool')
197
+ validationError(`${path}.type`, `is invalid for a ${role} message.`);
198
+ assertNonEmptyString(value.approvalId, `${path}.approvalId`);
199
+ if (typeof value.approved !== 'boolean')
200
+ validationError(`${path}.approved`, 'must be a boolean.');
201
+ assertOptionalString(value.reason, `${path}.reason`);
202
+ if (value.providerExecuted !== undefined && typeof value.providerExecuted !== 'boolean') {
203
+ validationError(`${path}.providerExecuted`, 'must be a boolean when provided.');
204
+ }
205
+ return;
206
+ }
207
+ validationError(`${path}.type`, `is invalid for a ${role} message.`);
208
+ };
209
+ const assertMessageContent = (value, path, role) => {
210
+ if (role === 'system') {
211
+ if (typeof value !== 'string')
212
+ validationError(path, 'must be a string.');
213
+ return;
214
+ }
215
+ if (typeof value === 'string' && role !== 'tool')
216
+ return;
217
+ if (!Array.isArray(value)) {
218
+ return validationError(path, 'must be a string or content-part array.');
219
+ }
220
+ for (const [index, part] of value.entries()) {
221
+ assertMessageContentPart(part, `${path}[${index}]`, role);
222
+ }
223
+ };
224
+ const assertModelMessage = (value, path) => {
225
+ assertRecord(value, path);
226
+ const role = value.role;
227
+ if (role !== 'system'
228
+ && role !== 'user'
229
+ && role !== 'assistant'
230
+ && role !== 'tool')
231
+ return validationError(`${path}.role`, 'is invalid.');
232
+ if (!hasOwn(value, 'content'))
233
+ validationError(`${path}.content`, 'is required.');
234
+ assertMessageContent(value.content, `${path}.content`, role);
235
+ assertProviderOptions(value.providerOptions, `${path}.providerOptions`);
236
+ };
237
+ const assertRequiredGenerationId = (event, path) => {
238
+ assertNonEmptyString(event.generationId, `${path}.generationId`);
239
+ };
240
+ const assertArchivedTransactions = (value, path) => {
241
+ if (!Array.isArray(value))
242
+ return validationError(path, 'must be an array.');
243
+ const generationIds = new Set();
244
+ for (const [index, entryValue] of value.entries()) {
245
+ const entryPath = `${path}[${index}]`;
246
+ assertRecord(entryValue, entryPath);
247
+ assertNonEmptyString(entryValue.generationId, `${entryPath}.generationId`);
248
+ assertNonEmptyString(entryValue.claimTokenDigest, `${entryPath}.claimTokenDigest`);
249
+ if (generationIds.has(entryValue.generationId)) {
250
+ validationError(path, 'must not contain duplicate generationId values.');
251
+ }
252
+ generationIds.add(entryValue.generationId);
253
+ if (entryValue.outcome !== 'accepted'
254
+ && entryValue.outcome !== 'rejected'
255
+ && entryValue.outcome !== 'interrupted')
256
+ validationError(`${entryPath}.outcome`, 'is invalid.');
257
+ }
258
+ };
259
+ const validateAgentEvents = (value, path, conversationOnly = false) => {
260
+ if (!Array.isArray(value))
261
+ return validationError(path, 'must be an array.');
262
+ const eventIds = new Set();
263
+ let priorSequence = 0;
264
+ for (const [index, eventValue] of value.entries()) {
265
+ const eventPath = `${path}[${index}]`;
266
+ assertRecord(eventValue, eventPath);
267
+ assertNonEmptyString(eventValue.id, `${eventPath}.id`);
268
+ if (eventIds.has(eventValue.id))
269
+ validationError(path, 'must not contain duplicate event IDs.');
270
+ eventIds.add(eventValue.id);
271
+ assertTimestamp(eventValue.timestamp, `${eventPath}.timestamp`);
272
+ if (eventValue.sequence !== undefined) {
273
+ assertPositiveInteger(eventValue.sequence, `${eventPath}.sequence`);
274
+ if (eventValue.sequence <= priorSequence) {
275
+ validationError(`${eventPath}.sequence`, 'must be strictly monotonic.');
276
+ }
277
+ priorSequence = eventValue.sequence;
278
+ }
279
+ if (eventValue.parentIds !== undefined) {
280
+ assertStringArray(eventValue.parentIds, `${eventPath}.parentIds`);
281
+ }
282
+ for (const field of ['causationId', 'generationId', 'inferenceId']) {
283
+ if (eventValue[field] !== undefined) {
284
+ assertNonEmptyString(eventValue[field], `${eventPath}.${field}`);
285
+ }
286
+ }
287
+ assertNonEmptyString(eventValue.type, `${eventPath}.type`);
288
+ if (!AGENT_EVENT_TYPES.has(eventValue.type))
289
+ validationError(`${eventPath}.type`, 'is invalid.');
290
+ if (conversationOnly && !AGENT_CONVERSATION_EVENT_TYPES.has(eventValue.type)) {
291
+ validationError(`${eventPath}.type`, 'must be a conversation event.');
292
+ }
293
+ switch (eventValue.type) {
294
+ case 'system-message':
295
+ if (!hasOwn(eventValue, 'content'))
296
+ validationError(`${eventPath}.content`, 'is required.');
297
+ assertMessageContent(eventValue.content, `${eventPath}.content`, 'system');
298
+ assertProviderOptions(eventValue.providerOptions, `${eventPath}.providerOptions`);
299
+ break;
300
+ case 'user-message':
301
+ case 'assistant-message':
302
+ if (!hasOwn(eventValue, 'content'))
303
+ validationError(`${eventPath}.content`, 'is required.');
304
+ assertMessageContent(eventValue.content, `${eventPath}.content`, eventValue.type === 'user-message'
305
+ ? 'user'
306
+ : 'assistant');
307
+ assertProviderOptions(eventValue.providerOptions, `${eventPath}.providerOptions`);
308
+ break;
309
+ case 'tool-call':
310
+ assertNonEmptyString(eventValue.toolCallId, `${eventPath}.toolCallId`);
311
+ assertNonEmptyString(eventValue.toolName, `${eventPath}.toolName`);
312
+ if (!hasOwn(eventValue, 'input'))
313
+ validationError(`${eventPath}.input`, 'is required.');
314
+ if (eventValue.providerExecuted !== undefined && typeof eventValue.providerExecuted !== 'boolean') {
315
+ validationError(`${eventPath}.providerExecuted`, 'must be a boolean when provided.');
316
+ }
317
+ assertProviderOptions(eventValue.providerOptions, `${eventPath}.providerOptions`);
318
+ break;
319
+ case 'tool-result':
320
+ assertNonEmptyString(eventValue.toolCallId, `${eventPath}.toolCallId`);
321
+ assertNonEmptyString(eventValue.toolName, `${eventPath}.toolName`);
322
+ if (eventValue.executionIntentId !== undefined) {
323
+ assertNonEmptyString(eventValue.executionIntentId, `${eventPath}.executionIntentId`);
324
+ }
325
+ assertOptionalString(eventValue.error, `${eventPath}.error`);
326
+ if (eventValue.responseMessageCommitted !== undefined
327
+ && typeof eventValue.responseMessageCommitted !== 'boolean') {
328
+ validationError(`${eventPath}.responseMessageCommitted`, 'must be a boolean when provided.');
329
+ }
330
+ if (eventValue.modelOutput !== undefined) {
331
+ assertToolResultOutput(eventValue.modelOutput, `${eventPath}.modelOutput`);
332
+ }
333
+ assertProviderOptions(eventValue.providerOptions, `${eventPath}.providerOptions`);
334
+ assertProviderOptions(eventValue.messageProviderOptions, `${eventPath}.messageProviderOptions`);
335
+ break;
336
+ case 'runtime-event':
337
+ assertRecord(eventValue.event, `${eventPath}.event`);
338
+ assertNonEmptyString(eventValue.event.type, `${eventPath}.event.type`);
339
+ if (eventValue.modelVisible !== undefined && typeof eventValue.modelVisible !== 'boolean') {
340
+ validationError(`${eventPath}.modelVisible`, 'must be a boolean when provided.');
341
+ }
342
+ break;
343
+ case 'model-message':
344
+ assertModelMessage(eventValue.message, `${eventPath}.message`);
345
+ break;
346
+ case 'generation-begun':
347
+ assertRequiredGenerationId(eventValue, eventPath);
348
+ assertNonEmptyString(eventValue.claimTokenDigest, `${eventPath}.claimTokenDigest`);
349
+ break;
350
+ case 'generation-execution-started':
351
+ case 'generation-execution-completed':
352
+ assertRequiredGenerationId(eventValue, eventPath);
353
+ break;
354
+ case 'generation-outcome':
355
+ assertRequiredGenerationId(eventValue, eventPath);
356
+ if (eventValue.outcome !== 'accepted'
357
+ && eventValue.outcome !== 'rejected'
358
+ && eventValue.outcome !== 'interrupted')
359
+ validationError(`${eventPath}.outcome`, 'is invalid.');
360
+ assertOptionalString(eventValue.reason, `${eventPath}.reason`);
361
+ break;
362
+ case 'tool-execution-intent':
363
+ assertRequiredGenerationId(eventValue, eventPath);
364
+ assertNonEmptyString(eventValue.toolCallId, `${eventPath}.toolCallId`);
365
+ assertNonEmptyString(eventValue.toolName, `${eventPath}.toolName`);
366
+ if (!hasOwn(eventValue, 'input'))
367
+ validationError(`${eventPath}.input`, 'is required.');
368
+ break;
369
+ case 'tool-execution-reconciliation':
370
+ assertRequiredGenerationId(eventValue, eventPath);
371
+ assertNonEmptyString(eventValue.intentId, `${eventPath}.intentId`);
372
+ assertNonEmptyString(eventValue.toolCallId, `${eventPath}.toolCallId`);
373
+ assertNonEmptyString(eventValue.toolName, `${eventPath}.toolName`);
374
+ if (eventValue.resolution !== 'executed'
375
+ && eventValue.resolution !== 'not-executed'
376
+ && eventValue.resolution !== 'abandoned-unknown')
377
+ validationError(`${eventPath}.resolution`, 'is invalid.');
378
+ assertOptionalString(eventValue.error, `${eventPath}.error`);
379
+ if (eventValue.modelOutput !== undefined) {
380
+ assertToolResultOutput(eventValue.modelOutput, `${eventPath}.modelOutput`);
381
+ }
382
+ break;
383
+ case 'context-compaction':
384
+ assertStringArray(eventValue.coveredEventIds, `${eventPath}.coveredEventIds`);
385
+ validateAgentEvents(eventValue.replacementEvents, `${eventPath}.replacementEvents`, true);
386
+ if (eventValue.archivedTransactions !== undefined) {
387
+ assertArchivedTransactions(eventValue.archivedTransactions, `${eventPath}.archivedTransactions`);
388
+ }
389
+ break;
390
+ }
391
+ }
392
+ return value;
393
+ };
394
+ /** Validates and returns a canonical schema-2 Agent event snapshot. */
395
+ export const validateAgentEventSnapshotV2 = (value, expectedSessionId) => {
396
+ assertRecord(value, 'Agent event snapshot');
397
+ if (value.schemaVersion !== SNAPSHOT_SCHEMA_VERSION) {
398
+ validationError('Agent event snapshot schemaVersion', 'must be 2.');
399
+ }
400
+ assertNonEmptyString(value.sessionId, 'Agent event snapshot sessionId');
401
+ if (expectedSessionId !== undefined && value.sessionId !== expectedSessionId) {
402
+ validationError('Agent event snapshot sessionId', `must equal "${expectedSessionId}".`);
403
+ }
404
+ assertPositiveInteger(value.revision, 'Agent event snapshot revision');
405
+ assertTimestamp(value.updatedAt, 'Agent event snapshot updatedAt');
406
+ validateAgentEvents(value.events, 'Agent event snapshot events');
407
+ return value;
408
+ };
409
+ /** Validates and returns a canonical schema-2 Agent event archive. */
410
+ export const validateAgentEventArchiveV2 = (value, expectedSessionId, expectedArchiveId) => {
411
+ assertRecord(value, 'Agent event archive');
412
+ if (value.schemaVersion !== ARCHIVE_SCHEMA_VERSION) {
413
+ validationError('Agent event archive schemaVersion', 'must be 2.');
414
+ }
415
+ assertNonEmptyString(value.sessionId, 'Agent event archive sessionId');
416
+ if (expectedSessionId !== undefined && value.sessionId !== expectedSessionId) {
417
+ validationError('Agent event archive sessionId', `must equal "${expectedSessionId}".`);
418
+ }
419
+ assertNonEmptyString(value.archiveId, 'Agent event archive archiveId');
420
+ if (expectedArchiveId !== undefined && value.archiveId !== expectedArchiveId) {
421
+ validationError('Agent event archive archiveId', `must equal "${expectedArchiveId}".`);
422
+ }
423
+ assertTimestamp(value.createdAt, 'Agent event archive createdAt');
424
+ validateAgentEvents(value.events, 'Agent event archive events');
425
+ return value;
426
+ };
427
+ export class AgentEventStoreConflictError extends Error {
428
+ sessionId;
429
+ expectedRevision;
430
+ actualRevision;
431
+ constructor(sessionId, expectedRevision, actualRevision) {
432
+ super(`Agent event store conflict for session "${sessionId}": expected revision ${expectedRevision}, found ${actualRevision}.`);
433
+ this.name = 'AgentEventStoreConflictError';
434
+ this.sessionId = sessionId;
435
+ this.expectedRevision = expectedRevision;
436
+ this.actualRevision = actualRevision;
437
+ }
438
+ }
439
+ const clone = (value) => structuredClone(value);
440
+ const createSnapshot = (sessionId, revision, events) => ({
441
+ schemaVersion: SNAPSHOT_SCHEMA_VERSION,
442
+ sessionId,
443
+ revision,
444
+ updatedAt: Date.now(),
445
+ events: clone([...events]),
446
+ });
447
+ export class InMemoryAgentEventStore {
448
+ eventSchemaVersion = 2;
449
+ snapshots = new Map();
450
+ archives = new Map();
451
+ async load(sessionId) {
452
+ const snapshot = this.snapshots.get(sessionId);
453
+ return snapshot ? clone(snapshot) : undefined;
454
+ }
455
+ async save(sessionId, events, expectedRevision) {
456
+ const actualRevision = this.snapshots.get(sessionId)?.revision ?? 0;
457
+ if (actualRevision !== expectedRevision) {
458
+ throw new AgentEventStoreConflictError(sessionId, expectedRevision, actualRevision);
459
+ }
460
+ const revision = expectedRevision + 1;
461
+ this.snapshots.set(sessionId, createSnapshot(sessionId, revision, events));
462
+ return revision;
463
+ }
464
+ async archive(archive) {
465
+ const nextArchive = clone(archive);
466
+ const key = `${archive.sessionId}\n${archive.archiveId}`;
467
+ const existing = this.archives.get(key);
468
+ if (existing) {
469
+ const existingIds = existing.events.map((event) => event.id).join('\n');
470
+ const nextIds = nextArchive.events.map((event) => event.id).join('\n');
471
+ if (existingIds !== nextIds) {
472
+ throw new Error(`Archive "${archive.archiveId}" already exists with different events.`);
473
+ }
474
+ return;
475
+ }
476
+ this.archives.set(key, nextArchive);
477
+ }
478
+ async loadArchive(sessionId, archiveId) {
479
+ const archive = this.archives.get(`${sessionId}\n${archiveId}`);
480
+ return archive ? clone(archive) : undefined;
481
+ }
482
+ }
483
+ const assertSessionId = (sessionId) => {
484
+ if (!sessionId.trim())
485
+ throw new Error('Agent event store sessionId must not be empty.');
486
+ };
487
+ const decodeSnapshot = (value, sessionId) => {
488
+ const snapshot = value;
489
+ if (snapshot?.schemaVersion === SNAPSHOT_SCHEMA_VERSION) {
490
+ try {
491
+ return validateAgentEventSnapshotV2(value, sessionId);
492
+ }
493
+ catch {
494
+ throw new Error(`Invalid agent event snapshot for session "${sessionId}".`);
495
+ }
496
+ }
497
+ if (!snapshot
498
+ || snapshot.schemaVersion !== 1
499
+ || snapshot.sessionId !== sessionId
500
+ || !Number.isSafeInteger(snapshot.revision)
501
+ || (snapshot.revision ?? -1) < 1
502
+ || !Array.isArray(snapshot.events)) {
503
+ throw new Error(`Invalid agent event snapshot for session "${sessionId}".`);
504
+ }
505
+ return snapshot;
506
+ };
507
+ const decodeArchive = (value, sessionId, archiveId) => {
508
+ const archive = value;
509
+ if (archive?.schemaVersion === ARCHIVE_SCHEMA_VERSION) {
510
+ try {
511
+ return validateAgentEventArchiveV2(value, sessionId, archiveId);
512
+ }
513
+ catch {
514
+ throw new Error(`Invalid agent event archive "${archiveId}" for session "${sessionId}".`);
515
+ }
516
+ }
517
+ if (!archive
518
+ || archive.schemaVersion !== 1
519
+ || archive.sessionId !== sessionId
520
+ || archive.archiveId !== archiveId
521
+ || !Array.isArray(archive.events)) {
522
+ throw new Error(`Invalid agent event archive "${archiveId}" for session "${sessionId}".`);
523
+ }
524
+ return archive;
525
+ };
526
+ const sleep = async (milliseconds) => {
527
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
528
+ };
529
+ export class FileAgentEventStore {
530
+ eventSchemaVersion = 2;
531
+ rootDir;
532
+ lockTimeoutMs;
533
+ constructor(options) {
534
+ if (!options.rootDir.trim())
535
+ throw new Error('FileAgentEventStore rootDir must not be empty.');
536
+ this.rootDir = plugins.path.resolve(options.rootDir);
537
+ this.lockTimeoutMs = options.lockTimeoutMs ?? 10_000;
538
+ if (!Number.isSafeInteger(this.lockTimeoutMs) || this.lockTimeoutMs <= 0) {
539
+ throw new Error('lockTimeoutMs must be a positive integer.');
540
+ }
541
+ }
542
+ sessionKey(sessionId) {
543
+ assertSessionId(sessionId);
544
+ return plugins.crypto.createHash('sha256').update(sessionId).digest('hex');
545
+ }
546
+ snapshotPath(sessionId) {
547
+ return plugins.path.join(this.rootDir, 'sessions', `${this.sessionKey(sessionId)}.bin`);
548
+ }
549
+ archivePath(sessionId, archiveId) {
550
+ if (!archiveId.trim())
551
+ throw new Error('Agent event archiveId must not be empty.');
552
+ const archiveKey = plugins.crypto.createHash('sha256').update(archiveId).digest('hex');
553
+ return plugins.path.join(this.rootDir, 'archives', this.sessionKey(sessionId), `${archiveKey}.bin`);
554
+ }
555
+ async readValue(filePath) {
556
+ try {
557
+ return plugins.v8.deserialize(await plugins.fs.readFile(filePath));
558
+ }
559
+ catch (error) {
560
+ if (error.code === 'ENOENT')
561
+ return undefined;
562
+ throw error;
563
+ }
564
+ }
565
+ async syncDirectory(directoryPath) {
566
+ const handle = await plugins.fs.open(directoryPath, 'r');
567
+ try {
568
+ await handle.sync();
569
+ }
570
+ finally {
571
+ await handle.close();
572
+ }
573
+ }
574
+ async writeAtomic(filePath, value) {
575
+ const directoryPath = plugins.path.dirname(filePath);
576
+ await plugins.fs.mkdir(directoryPath, { recursive: true });
577
+ const temporaryPath = `${filePath}.${process.pid}.${plugins.crypto.randomUUID()}.tmp`;
578
+ let handle;
579
+ try {
580
+ handle = await plugins.fs.open(temporaryPath, 'wx');
581
+ await handle.writeFile(plugins.v8.serialize(value));
582
+ await handle.sync();
583
+ await handle.close();
584
+ handle = undefined;
585
+ await plugins.fs.rename(temporaryPath, filePath);
586
+ await this.syncDirectory(directoryPath);
587
+ }
588
+ finally {
589
+ if (handle)
590
+ await handle.close().catch(() => undefined);
591
+ await plugins.fs.rm(temporaryPath, { force: true });
592
+ }
593
+ }
594
+ async withSessionLock(sessionId, operation) {
595
+ const lockPath = plugins.path.join(this.rootDir, 'locks', `${this.sessionKey(sessionId)}.lock`);
596
+ const ownerPath = plugins.path.join(lockPath, 'owner');
597
+ const ownerToken = plugins.crypto.randomUUID();
598
+ const ownerRecord = JSON.stringify({ token: ownerToken });
599
+ await plugins.fs.mkdir(plugins.path.dirname(lockPath), { recursive: true });
600
+ const startedAt = Date.now();
601
+ while (true) {
602
+ try {
603
+ await plugins.fs.mkdir(lockPath);
604
+ try {
605
+ await plugins.fs.writeFile(ownerPath, ownerRecord, 'utf8');
606
+ }
607
+ catch (error) {
608
+ await plugins.fs.rm(lockPath, { recursive: true, force: true });
609
+ throw error;
610
+ }
611
+ break;
612
+ }
613
+ catch (error) {
614
+ if (error.code !== 'EEXIST')
615
+ throw error;
616
+ if (Date.now() - startedAt >= this.lockTimeoutMs) {
617
+ throw new Error(`Timed out waiting for the event-store lock for session "${sessionId}" at "${lockPath}".`);
618
+ }
619
+ await sleep(20);
620
+ }
621
+ }
622
+ try {
623
+ return await operation();
624
+ }
625
+ finally {
626
+ let stillOwner = false;
627
+ try {
628
+ const owner = JSON.parse(await plugins.fs.readFile(ownerPath, 'utf8'));
629
+ stillOwner = owner.token === ownerToken;
630
+ }
631
+ catch { }
632
+ if (stillOwner)
633
+ await plugins.fs.rm(lockPath, { recursive: true, force: true });
634
+ }
635
+ }
636
+ async load(sessionId) {
637
+ const value = await this.readValue(this.snapshotPath(sessionId));
638
+ return value === undefined ? undefined : decodeSnapshot(value, sessionId);
639
+ }
640
+ async save(sessionId, events, expectedRevision) {
641
+ return this.withSessionLock(sessionId, async () => {
642
+ const filePath = this.snapshotPath(sessionId);
643
+ const currentValue = await this.readValue(filePath);
644
+ const actualRevision = currentValue === undefined
645
+ ? 0
646
+ : decodeSnapshot(currentValue, sessionId).revision;
647
+ if (actualRevision !== expectedRevision) {
648
+ throw new AgentEventStoreConflictError(sessionId, expectedRevision, actualRevision);
649
+ }
650
+ const revision = expectedRevision + 1;
651
+ await this.writeAtomic(filePath, createSnapshot(sessionId, revision, events));
652
+ return revision;
653
+ });
654
+ }
655
+ async archive(archive) {
656
+ const nextArchive = clone(archive);
657
+ await this.withSessionLock(archive.sessionId, async () => {
658
+ const filePath = this.archivePath(archive.sessionId, archive.archiveId);
659
+ const currentValue = await this.readValue(filePath);
660
+ if (currentValue !== undefined) {
661
+ const current = decodeArchive(currentValue, archive.sessionId, archive.archiveId);
662
+ const currentIds = current.events.map((event) => event.id).join('\n');
663
+ const nextIds = nextArchive.events.map((event) => event.id).join('\n');
664
+ if (currentIds !== nextIds) {
665
+ throw new Error(`Archive "${archive.archiveId}" already exists with different events.`);
666
+ }
667
+ return;
668
+ }
669
+ await this.writeAtomic(filePath, nextArchive);
670
+ });
671
+ }
672
+ async loadArchive(sessionId, archiveId) {
673
+ const value = await this.readValue(this.archivePath(sessionId, archiveId));
674
+ return value === undefined ? undefined : decodeArchive(value, sessionId, archiveId);
675
+ }
676
+ }
677
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5wZXJzaXN0ZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2FnZW50L3NtYXJ0YWdlbnQucGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSx1QkFBdUIsR0FBRyxDQUFVLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxDQUFVLENBQUM7QUFpRTFDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLEtBQW1DLEVBQ04sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLO09BQ3BDLG9CQUFvQixJQUFJLEtBQUs7T0FDN0IsS0FBSyxDQUFDLGtCQUFrQixLQUFLLENBQUMsQ0FBQztBQUlwQyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFTO0lBQ3hDLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsOEJBQThCO0lBQzlCLGdDQUFnQztJQUNoQyxvQkFBb0I7SUFDcEIsdUJBQXVCO0lBQ3ZCLCtCQUErQjtJQUMvQixvQkFBb0I7Q0FDVyxDQUFDLENBQUM7QUFFbkMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUNyRCxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsYUFBYTtJQUNiLGVBQWU7Q0FDZ0IsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBcUIsRUFBRSxHQUFXLEVBQVcsRUFBRSxDQUM3RCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRW5ELE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBUyxFQUFFO0lBQy9ELE1B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