@modelprofile.com/flexharness 1.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.
@@ -0,0 +1,8 @@
1
+ import type { IFlexHarnessSnapshot, IFlexJsonLimits, TFlexAgentModelMessage, TJsonValue } from './interfaces.js';
2
+ export declare function resolveJsonLimits(limits?: IFlexJsonLimits): Required<IFlexJsonLimits>;
3
+ export declare function normalizeJsonValue(value: unknown, limits?: IFlexJsonLimits): TJsonValue;
4
+ export declare function assertJsonSerializable(value: unknown, path?: string): void;
5
+ export declare function assertFlexHarnessSnapshot(value: unknown): asserts value is IFlexHarnessSnapshot;
6
+ export declare function cloneSerializable<T>(value: T): T;
7
+ export declare function deepFreeze<T>(value: T): T;
8
+ export declare function serializeAgentMessages(messages: TFlexAgentModelMessage[]): TFlexAgentModelMessage[];
@@ -0,0 +1,540 @@
1
+ import { FlexHarnessStoreFormatError, FlexHarnessValidationError } from './errors.js';
2
+ const DEFAULT_MAX_DEPTH = 12;
3
+ const DEFAULT_MAX_BYTES = 256 * 1024;
4
+ const MIN_MAX_BYTES = 128;
5
+ function isPlainObject(value) {
6
+ const prototype = Object.getPrototypeOf(value);
7
+ return prototype === Object.prototype || prototype === null;
8
+ }
9
+ function makeDescription(type, values = {}) {
10
+ return {
11
+ $flexType: type,
12
+ ...values,
13
+ };
14
+ }
15
+ function binaryBytes(value) {
16
+ if (value instanceof ArrayBuffer) {
17
+ return new Uint8Array(value);
18
+ }
19
+ if (ArrayBuffer.isView(value)) {
20
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
21
+ }
22
+ return undefined;
23
+ }
24
+ export function resolveJsonLimits(limits = {}) {
25
+ const maxDepth = limits.maxDepth ?? DEFAULT_MAX_DEPTH;
26
+ const maxBytes = limits.maxBytes ?? DEFAULT_MAX_BYTES;
27
+ if (!Number.isSafeInteger(maxDepth) || maxDepth < 1) {
28
+ throw new FlexHarnessValidationError('toolOutputLimits.maxDepth must be a positive integer.');
29
+ }
30
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < MIN_MAX_BYTES) {
31
+ throw new FlexHarnessValidationError(`toolOutputLimits.maxBytes must be an integer of at least ${MIN_MAX_BYTES}.`);
32
+ }
33
+ return { maxDepth, maxBytes };
34
+ }
35
+ export function normalizeJsonValue(value, limits = {}) {
36
+ const resolvedLimits = resolveJsonLimits(limits);
37
+ const seen = new WeakMap();
38
+ const measure = (entry) => ({
39
+ value: entry,
40
+ bytes: Buffer.byteLength(JSON.stringify(entry)),
41
+ });
42
+ const shortString = (entry, maximumCharacters = 160) => entry.length > maximumCharacters ? `${entry.slice(0, maximumCharacters)}...` : entry;
43
+ const description = (type, values, allowance) => {
44
+ const detailed = measure(makeDescription(type, values));
45
+ if (detailed.bytes <= allowance)
46
+ return detailed;
47
+ const compact = measure(makeDescription('truncated', { reason: 'bytes' }));
48
+ if (compact.bytes <= allowance)
49
+ return compact;
50
+ return measure('[truncated]');
51
+ };
52
+ const nextPath = (path, suffix) => `${path.slice(0, 80)}${suffix.slice(0, 48)}`;
53
+ const visit = (current, depth, path, allowance) => {
54
+ if (current === null || typeof current === 'boolean')
55
+ return measure(current);
56
+ if (typeof current === 'string') {
57
+ const rawBytes = Buffer.byteLength(current);
58
+ if (rawBytes + 2 > allowance) {
59
+ return description('truncated', { reason: 'bytes', byteLength: rawBytes }, allowance);
60
+ }
61
+ const encoded = measure(current);
62
+ return encoded.bytes <= allowance
63
+ ? encoded
64
+ : description('truncated', { reason: 'bytes', byteLength: rawBytes }, allowance);
65
+ }
66
+ if (typeof current === 'number') {
67
+ return Number.isFinite(current)
68
+ ? measure(current)
69
+ : description('number', { value: String(current) }, allowance);
70
+ }
71
+ if (typeof current === 'undefined') {
72
+ return description('undefined', {}, allowance);
73
+ }
74
+ if (typeof current === 'bigint') {
75
+ const valueString = current.toString();
76
+ return description('bigint', Buffer.byteLength(valueString) < allowance / 2
77
+ ? { value: valueString }
78
+ : { description: '[bigint exceeds byte budget]' }, allowance);
79
+ }
80
+ if (typeof current === 'function') {
81
+ return description('function', {
82
+ description: current.name
83
+ ? `[Function ${shortString(current.name)}]`
84
+ : '[Function anonymous]',
85
+ }, allowance);
86
+ }
87
+ if (typeof current === 'symbol') {
88
+ return description('symbol', { description: shortString(String(current)) }, allowance);
89
+ }
90
+ if (depth >= resolvedLimits.maxDepth) {
91
+ return description('truncated', { reason: 'depth', path: shortString(path) }, allowance);
92
+ }
93
+ const objectValue = current;
94
+ const firstPath = seen.get(objectValue);
95
+ if (firstPath) {
96
+ return description('circular', { path: firstPath }, allowance);
97
+ }
98
+ if (current instanceof Date) {
99
+ return description('date', { value: Number.isNaN(current.getTime()) ? 'Invalid Date' : current.toISOString() }, allowance);
100
+ }
101
+ if (current instanceof URL) {
102
+ const urlString = current.toString();
103
+ return description('url', { value: shortString(urlString), truncated: urlString.length > 160 }, allowance);
104
+ }
105
+ const binary = binaryBytes(objectValue);
106
+ if (binary) {
107
+ const maximumSourceBytes = Math.max(0, Math.floor((allowance - 120) * 0.7));
108
+ const included = binary.subarray(0, maximumSourceBytes);
109
+ return description('binary', {
110
+ encoding: 'base64',
111
+ data: Buffer.from(included).toString('base64'),
112
+ byteLength: binary.byteLength,
113
+ truncated: included.byteLength < binary.byteLength,
114
+ }, allowance);
115
+ }
116
+ if (current instanceof Error) {
117
+ return description('error', { name: shortString(current.name), message: shortString(current.message) }, allowance);
118
+ }
119
+ if (current instanceof RegExp) {
120
+ return description('regexp', { value: shortString(current.toString()) }, allowance);
121
+ }
122
+ seen.set(objectValue, path);
123
+ if (Array.isArray(current)) {
124
+ const normalized = [];
125
+ let encodedBytes = 2;
126
+ for (let index = 0; index < current.length; index++) {
127
+ const separatorBytes = normalized.length > 0 ? 1 : 0;
128
+ const remainingItems = current.length - index;
129
+ const truncation = description('truncated', { reason: 'bytes', omittedItems: remainingItems }, allowance);
130
+ const truncationReserve = index < current.length - 1
131
+ ? 1 + truncation.bytes
132
+ : 0;
133
+ const childAllowance = allowance - encodedBytes - separatorBytes - truncationReserve;
134
+ if (childAllowance < 48) {
135
+ if (encodedBytes + separatorBytes + truncation.bytes <= allowance) {
136
+ normalized.push(truncation.value);
137
+ encodedBytes += separatorBytes + truncation.bytes;
138
+ }
139
+ return { value: normalized, bytes: encodedBytes };
140
+ }
141
+ let entry;
142
+ try {
143
+ entry = current[index];
144
+ }
145
+ catch (error) {
146
+ entry = makeDescription('unreadable', {
147
+ description: shortString(error instanceof Error ? error.message : String(error)),
148
+ });
149
+ }
150
+ const child = visit(entry, depth + 1, nextPath(path, `[${index}]`), childAllowance);
151
+ normalized.push(child.value);
152
+ encodedBytes += separatorBytes + child.bytes;
153
+ }
154
+ return { value: normalized, bytes: encodedBytes };
155
+ }
156
+ if (!isPlainObject(objectValue)) {
157
+ const constructorName = objectValue.constructor?.name ?? 'Object';
158
+ return description('object', { description: `[${shortString(constructorName)}]` }, allowance);
159
+ }
160
+ const normalized = {};
161
+ let encodedBytes = 2;
162
+ let visitedProperties = 0;
163
+ let truncated = false;
164
+ let truncationKey = '$flexTruncated';
165
+ while (Object.prototype.hasOwnProperty.call(current, truncationKey)) {
166
+ truncationKey += '_';
167
+ }
168
+ for (const key in current) {
169
+ if (!Object.prototype.hasOwnProperty.call(current, key))
170
+ continue;
171
+ const separatorBytes = visitedProperties > 0 ? 1 : 0;
172
+ const truncation = description('truncated', { reason: 'bytes', visitedProperties }, allowance);
173
+ const truncationPropertyBytes = (visitedProperties > 0 ? 1 : 0) +
174
+ Buffer.byteLength(JSON.stringify(truncationKey)) +
175
+ 1 +
176
+ truncation.bytes;
177
+ const rawKeyBytes = Buffer.byteLength(key);
178
+ if (rawKeyBytes + 2 >= allowance - encodedBytes - truncationPropertyBytes) {
179
+ truncated = true;
180
+ break;
181
+ }
182
+ const encodedKeyBytes = Buffer.byteLength(JSON.stringify(key));
183
+ const childAllowance = allowance -
184
+ encodedBytes -
185
+ separatorBytes -
186
+ encodedKeyBytes -
187
+ 1 -
188
+ truncationPropertyBytes;
189
+ if (childAllowance < 48) {
190
+ truncated = true;
191
+ break;
192
+ }
193
+ let entry;
194
+ try {
195
+ entry = current[key];
196
+ }
197
+ catch (error) {
198
+ entry = makeDescription('unreadable', {
199
+ description: shortString(error instanceof Error ? error.message : String(error)),
200
+ });
201
+ }
202
+ const child = visit(entry, depth + 1, nextPath(path, `.${key}`), childAllowance);
203
+ normalized[key] = child.value;
204
+ encodedBytes += separatorBytes + encodedKeyBytes + 1 + child.bytes;
205
+ visitedProperties++;
206
+ }
207
+ if (truncated) {
208
+ const truncation = description('truncated', { reason: 'bytes', visitedProperties }, allowance);
209
+ const separatorBytes = visitedProperties > 0 ? 1 : 0;
210
+ normalized[truncationKey] = truncation.value;
211
+ encodedBytes +=
212
+ separatorBytes +
213
+ Buffer.byteLength(JSON.stringify(truncationKey)) +
214
+ 1 +
215
+ truncation.bytes;
216
+ }
217
+ return { value: normalized, bytes: encodedBytes };
218
+ };
219
+ const normalized = visit(value, 0, '$', resolvedLimits.maxBytes).value;
220
+ if (Buffer.byteLength(JSON.stringify(normalized)) <= resolvedLimits.maxBytes) {
221
+ return normalized;
222
+ }
223
+ return makeDescription('truncated', { reason: 'bytes' });
224
+ }
225
+ function assertJsonSerializableAt(value, path, seen) {
226
+ if (value === null || typeof value === 'string' || typeof value === 'boolean') {
227
+ return;
228
+ }
229
+ if (typeof value === 'number') {
230
+ if (!Number.isFinite(value)) {
231
+ throw new FlexHarnessStoreFormatError(`${path} contains a non-finite number.`);
232
+ }
233
+ return;
234
+ }
235
+ if (typeof value !== 'object') {
236
+ throw new FlexHarnessStoreFormatError(`${path} contains ${typeof value}, which is not JSON-safe.`);
237
+ }
238
+ if (seen.has(value)) {
239
+ throw new FlexHarnessStoreFormatError(`${path} contains a circular reference.`);
240
+ }
241
+ if (!Array.isArray(value) && !isPlainObject(value)) {
242
+ throw new FlexHarnessStoreFormatError(`${path} contains a non-plain object.`);
243
+ }
244
+ if (Object.getOwnPropertySymbols(value).length > 0) {
245
+ throw new FlexHarnessStoreFormatError(`${path} contains a symbol-keyed property.`);
246
+ }
247
+ seen.add(value);
248
+ if (Array.isArray(value)) {
249
+ const extraKey = Object.keys(value).find((key) => !/^(0|[1-9]\d*)$/.test(key) || Number(key) >= value.length);
250
+ if (extraKey) {
251
+ throw new FlexHarnessStoreFormatError(`${path}.${extraKey} is not a JSON array index.`);
252
+ }
253
+ const customHiddenKey = Object.getOwnPropertyNames(value).find((key) => key !== 'length' && !/^(0|[1-9]\d*)$/.test(key));
254
+ if (customHiddenKey) {
255
+ throw new FlexHarnessStoreFormatError(`${path}.${customHiddenKey} is not JSON-visible.`);
256
+ }
257
+ for (let index = 0; index < value.length; index++) {
258
+ if (!(index in value)) {
259
+ throw new FlexHarnessStoreFormatError(`${path}[${index}] is a sparse array entry.`);
260
+ }
261
+ assertJsonSerializableAt(value[index], `${path}[${index}]`, seen);
262
+ }
263
+ }
264
+ else {
265
+ for (const key of Object.getOwnPropertyNames(value)) {
266
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
267
+ if (!descriptor.enumerable || !('value' in descriptor)) {
268
+ throw new FlexHarnessStoreFormatError(`${path}.${key} is not a plain JSON property.`);
269
+ }
270
+ assertJsonSerializableAt(descriptor.value, `${path}.${key}`, seen);
271
+ }
272
+ }
273
+ seen.delete(value);
274
+ }
275
+ export function assertJsonSerializable(value, path = '$') {
276
+ assertJsonSerializableAt(value, path, new WeakSet());
277
+ }
278
+ function requireRecord(value, path) {
279
+ if (!value || typeof value !== 'object' || Array.isArray(value) || !isPlainObject(value)) {
280
+ throw new FlexHarnessStoreFormatError(`${path} must be a plain object.`);
281
+ }
282
+ return value;
283
+ }
284
+ function requireString(value, path) {
285
+ if (typeof value !== 'string' || value.length === 0) {
286
+ throw new FlexHarnessStoreFormatError(`${path} must be a non-empty string.`);
287
+ }
288
+ return value;
289
+ }
290
+ function requireOptionalString(value, path) {
291
+ if (value !== undefined)
292
+ requireString(value, path);
293
+ }
294
+ function requireNonNegativeNumber(value, path) {
295
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
296
+ throw new FlexHarnessStoreFormatError(`${path} must be a non-negative finite number.`);
297
+ }
298
+ }
299
+ function requireStringArray(value, path) {
300
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
301
+ throw new FlexHarnessStoreFormatError(`${path} must be an array of strings.`);
302
+ }
303
+ return value;
304
+ }
305
+ function validateSessionSnapshot(value, path) {
306
+ const stored = requireRecord(value, path);
307
+ const session = requireRecord(stored.session, `${path}.session`);
308
+ const sessionId = requireString(session.sessionId, `${path}.session.sessionId`);
309
+ requireString(session.scopeId, `${path}.session.scopeId`);
310
+ requireString(session.createdAt, `${path}.session.createdAt`);
311
+ requireString(session.updatedAt, `${path}.session.updatedAt`);
312
+ requireOptionalString(session.title, `${path}.session.title`);
313
+ requireOptionalString(session.archivedAt, `${path}.session.archivedAt`);
314
+ if (!['idle', 'running', 'waiting_permission', 'failed', 'cancelled'].includes(String(session.status))) {
315
+ throw new FlexHarnessStoreFormatError(`${path}.session.status is invalid.`);
316
+ }
317
+ const activity = requireRecord(session.activity, `${path}.session.activity`);
318
+ if (!['idle', 'running', 'waiting_permission', 'failed', 'cancelled'].includes(String(activity.status))) {
319
+ throw new FlexHarnessStoreFormatError(`${path}.session.activity.status is invalid.`);
320
+ }
321
+ requireOptionalString(activity.runId, `${path}.session.activity.runId`);
322
+ requireOptionalString(activity.startedAt, `${path}.session.activity.startedAt`);
323
+ requireOptionalString(activity.completedAt, `${path}.session.activity.completedAt`);
324
+ requireOptionalString(activity.error, `${path}.session.activity.error`);
325
+ if (!Array.isArray(stored.messages)) {
326
+ throw new FlexHarnessStoreFormatError(`${path}.messages must be an array.`);
327
+ }
328
+ const messageIds = new Set();
329
+ for (let index = 0; index < stored.messages.length; index++) {
330
+ const messagePath = `${path}.messages[${index}]`;
331
+ const message = requireRecord(stored.messages[index], messagePath);
332
+ const messageId = requireString(message.messageId, `${messagePath}.messageId`);
333
+ if (messageIds.has(messageId)) {
334
+ throw new FlexHarnessStoreFormatError(`${path}.messages contains duplicate message "${messageId}".`);
335
+ }
336
+ messageIds.add(messageId);
337
+ if (requireString(message.sessionId, `${messagePath}.sessionId`) !== sessionId) {
338
+ throw new FlexHarnessStoreFormatError(`${messagePath}.sessionId does not match its session.`);
339
+ }
340
+ requireString(message.runId, `${messagePath}.runId`);
341
+ requireString(message.createdAt, `${messagePath}.createdAt`);
342
+ requireOptionalString(message.completedAt, `${messagePath}.completedAt`);
343
+ requireOptionalString(message.error, `${messagePath}.error`);
344
+ if (!['user', 'assistant'].includes(String(message.role))) {
345
+ throw new FlexHarnessStoreFormatError(`${messagePath}.role is invalid.`);
346
+ }
347
+ if (!['streaming', 'completed', 'failed', 'cancelled'].includes(String(message.status))) {
348
+ throw new FlexHarnessStoreFormatError(`${messagePath}.status is invalid.`);
349
+ }
350
+ if (!Array.isArray(message.parts)) {
351
+ throw new FlexHarnessStoreFormatError(`${messagePath}.parts must be an array.`);
352
+ }
353
+ if (message.model !== undefined) {
354
+ const model = requireRecord(message.model, `${messagePath}.model`);
355
+ requireString(model.provider, `${messagePath}.model.provider`);
356
+ requireString(model.model, `${messagePath}.model.model`);
357
+ requireOptionalString(model.displayName, `${messagePath}.model.displayName`);
358
+ }
359
+ if (message.usage !== undefined) {
360
+ const usage = requireRecord(message.usage, `${messagePath}.usage`);
361
+ requireNonNegativeNumber(usage.inputTokens, `${messagePath}.usage.inputTokens`);
362
+ requireNonNegativeNumber(usage.outputTokens, `${messagePath}.usage.outputTokens`);
363
+ requireNonNegativeNumber(usage.totalTokens, `${messagePath}.usage.totalTokens`);
364
+ requireNonNegativeNumber(usage.cacheReadTokens, `${messagePath}.usage.cacheReadTokens`);
365
+ requireNonNegativeNumber(usage.cacheWriteTokens, `${messagePath}.usage.cacheWriteTokens`);
366
+ }
367
+ const partIds = new Set();
368
+ for (let partIndex = 0; partIndex < message.parts.length; partIndex++) {
369
+ const partPath = `${messagePath}.parts[${partIndex}]`;
370
+ const part = requireRecord(message.parts[partIndex], partPath);
371
+ const partId = requireString(part.partId, `${partPath}.partId`);
372
+ if (partIds.has(partId)) {
373
+ throw new FlexHarnessStoreFormatError(`${messagePath}.parts contains duplicate part "${partId}".`);
374
+ }
375
+ partIds.add(partId);
376
+ if (!['text', 'reasoning', 'tool', 'attachment'].includes(String(part.type))) {
377
+ throw new FlexHarnessStoreFormatError(`${partPath}.type is invalid.`);
378
+ }
379
+ if (part.type === 'text') {
380
+ if (typeof part.text !== 'string') {
381
+ throw new FlexHarnessStoreFormatError(`${partPath}.text must be a string.`);
382
+ }
383
+ }
384
+ else if (part.type === 'reasoning') {
385
+ if (typeof part.text !== 'string') {
386
+ throw new FlexHarnessStoreFormatError(`${partPath}.text must be a string.`);
387
+ }
388
+ if (!['running', 'completed', 'cancelled'].includes(String(part.status))) {
389
+ throw new FlexHarnessStoreFormatError(`${partPath}.status is invalid.`);
390
+ }
391
+ }
392
+ else if (part.type === 'tool') {
393
+ requireString(part.toolCallId, `${partPath}.toolCallId`);
394
+ requireString(part.toolName, `${partPath}.toolName`);
395
+ if (!['running', 'completed', 'failed', 'cancelled'].includes(String(part.status))) {
396
+ throw new FlexHarnessStoreFormatError(`${partPath}.status is invalid.`);
397
+ }
398
+ if (!Object.prototype.hasOwnProperty.call(part, 'input')) {
399
+ throw new FlexHarnessStoreFormatError(`${partPath}.input is required.`);
400
+ }
401
+ requireOptionalString(part.error, `${partPath}.error`);
402
+ }
403
+ else {
404
+ const unsupportedAttachmentField = Object.keys(part).find((key) => ![
405
+ 'partId',
406
+ 'type',
407
+ 'attachmentType',
408
+ 'source',
409
+ 'sizeBytes',
410
+ 'mediaType',
411
+ 'name',
412
+ ].includes(key));
413
+ if (unsupportedAttachmentField) {
414
+ throw new FlexHarnessStoreFormatError(`${partPath}.${unsupportedAttachmentField} is not public attachment metadata.`);
415
+ }
416
+ if (!['image', 'file'].includes(String(part.attachmentType))) {
417
+ throw new FlexHarnessStoreFormatError(`${partPath}.attachmentType is invalid.`);
418
+ }
419
+ if (!['inline-base64', 'data-url', 'remote-url'].includes(String(part.source))) {
420
+ throw new FlexHarnessStoreFormatError(`${partPath}.source is invalid.`);
421
+ }
422
+ if (part.sizeBytes !== undefined &&
423
+ (!Number.isSafeInteger(part.sizeBytes) || Number(part.sizeBytes) < 0)) {
424
+ throw new FlexHarnessStoreFormatError(`${partPath}.sizeBytes must be a non-negative integer.`);
425
+ }
426
+ requireOptionalString(part.mediaType, `${partPath}.mediaType`);
427
+ requireOptionalString(part.name, `${partPath}.name`);
428
+ }
429
+ }
430
+ }
431
+ if (!Array.isArray(stored.modelHistory)) {
432
+ throw new FlexHarnessStoreFormatError(`${path}.modelHistory must be an array.`);
433
+ }
434
+ for (let index = 0; index < stored.modelHistory.length; index++) {
435
+ const historyPath = `${path}.modelHistory[${index}]`;
436
+ const message = requireRecord(stored.modelHistory[index], historyPath);
437
+ if (!['system', 'user', 'assistant', 'tool'].includes(String(message.role))) {
438
+ throw new FlexHarnessStoreFormatError(`${historyPath}.role is invalid.`);
439
+ }
440
+ if (typeof message.content !== 'string' && !Array.isArray(message.content)) {
441
+ throw new FlexHarnessStoreFormatError(`${historyPath}.content is invalid.`);
442
+ }
443
+ }
444
+ const rememberedPermissionKeys = requireStringArray(stored.rememberedPermissionKeys, `${path}.rememberedPermissionKeys`);
445
+ if (rememberedPermissionKeys.some((key) => key.length === 0)) {
446
+ throw new FlexHarnessStoreFormatError(`${path}.rememberedPermissionKeys contains an empty key.`);
447
+ }
448
+ if (new Set(rememberedPermissionKeys).size !== rememberedPermissionKeys.length) {
449
+ throw new FlexHarnessStoreFormatError(`${path}.rememberedPermissionKeys contains duplicate keys.`);
450
+ }
451
+ return sessionId;
452
+ }
453
+ export function assertFlexHarnessSnapshot(value) {
454
+ assertJsonSerializable(value, '$snapshot');
455
+ const snapshot = requireRecord(value, '$snapshot');
456
+ if (snapshot.schemaVersion !== 1) {
457
+ throw new FlexHarnessStoreFormatError('Snapshot schemaVersion must be 1.');
458
+ }
459
+ if (!Number.isSafeInteger(snapshot.revision) || Number(snapshot.revision) < 0) {
460
+ throw new FlexHarnessStoreFormatError('Snapshot revision must be a non-negative integer.');
461
+ }
462
+ if (!Array.isArray(snapshot.sessions)) {
463
+ throw new FlexHarnessStoreFormatError('Snapshot sessions must be an array.');
464
+ }
465
+ const sessionIds = new Set();
466
+ for (let index = 0; index < snapshot.sessions.length; index++) {
467
+ const sessionId = validateSessionSnapshot(snapshot.sessions[index], `$snapshot.sessions[${index}]`);
468
+ if (sessionIds.has(sessionId)) {
469
+ throw new FlexHarnessStoreFormatError(`Snapshot contains duplicate session "${sessionId}".`);
470
+ }
471
+ sessionIds.add(sessionId);
472
+ }
473
+ }
474
+ export function cloneSerializable(value) {
475
+ assertJsonSerializable(value);
476
+ return JSON.parse(JSON.stringify(value));
477
+ }
478
+ export function deepFreeze(value) {
479
+ if (!value || typeof value !== 'object' || Object.isFrozen(value)) {
480
+ return value;
481
+ }
482
+ for (const entry of Object.values(value)) {
483
+ deepFreeze(entry);
484
+ }
485
+ return Object.freeze(value);
486
+ }
487
+ function serializeModelValue(value, path, seen) {
488
+ if (value === null ||
489
+ typeof value === 'string' ||
490
+ typeof value === 'boolean' ||
491
+ (typeof value === 'number' && Number.isFinite(value))) {
492
+ return value;
493
+ }
494
+ if (typeof value === 'undefined') {
495
+ return undefined;
496
+ }
497
+ if (typeof value !== 'object') {
498
+ throw new FlexHarnessStoreFormatError(`${path} contains a non-serializable model value.`);
499
+ }
500
+ if (value instanceof URL) {
501
+ return value.toString();
502
+ }
503
+ const bytes = binaryBytes(value);
504
+ if (bytes) {
505
+ return Buffer.from(bytes).toString('base64');
506
+ }
507
+ if (seen.has(value)) {
508
+ throw new FlexHarnessStoreFormatError(`${path} contains a circular model value.`);
509
+ }
510
+ if (!Array.isArray(value) && !isPlainObject(value)) {
511
+ throw new FlexHarnessStoreFormatError(`${path} contains a non-plain model value.`);
512
+ }
513
+ seen.add(value);
514
+ if (Array.isArray(value)) {
515
+ const result = value.map((entry, index) => {
516
+ const serialized = serializeModelValue(entry, `${path}[${index}]`, seen);
517
+ if (serialized === undefined) {
518
+ throw new FlexHarnessStoreFormatError(`${path}[${index}] is undefined.`);
519
+ }
520
+ return serialized;
521
+ });
522
+ seen.delete(value);
523
+ return result;
524
+ }
525
+ const result = {};
526
+ for (const [key, entry] of Object.entries(value)) {
527
+ const serialized = serializeModelValue(entry, `${path}.${key}`, seen);
528
+ if (serialized !== undefined) {
529
+ result[key] = serialized;
530
+ }
531
+ }
532
+ seen.delete(value);
533
+ return result;
534
+ }
535
+ export function serializeAgentMessages(messages) {
536
+ const serialized = serializeModelValue(messages, '$messages', new WeakSet());
537
+ assertJsonSerializable(serialized, '$messages');
538
+ return serialized;
539
+ }
540
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3V0aWxzLmpzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUXRGLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNyQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFFMUIsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNsQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBWSxFQUFFLFNBQXFDLEVBQUU7SUFDNUUsT0FBTztRQUNMLFNBQVMsRUFBRSxJQUFJO1FBQ2YsR0FBRyxNQUFNO0tBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFhO0lBQ2hDLElBQUksS0FBSyxZQUFZLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxTQUEwQixFQUFFO0lBQzVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFR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
@@ -0,0 +1,8 @@
1
+ import type { TFlexAgentModelMessage, TFlexAgentPrompt, TFlexPrompt, TFlexPromptPart } from './interfaces.js';
2
+ export interface INormalizedFlexPrompt {
3
+ agentPrompt: TFlexAgentPrompt;
4
+ modelMessage: TFlexAgentModelMessage;
5
+ parts: TFlexPromptPart[];
6
+ }
7
+ export declare function normalizeFlexPrompt(prompt: TFlexPrompt): INormalizedFlexPrompt;
8
+ export declare function hydrateAgentMessages(messages: TFlexAgentModelMessage[]): TFlexAgentModelMessage[];