@modelprofile.com/flexharness 2.0.0 → 3.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.
@@ -1,6 +1,5 @@
1
- import type { TFlexAgentModelMessage, TFlexAgentPrompt, TFlexPrompt, TFlexPromptPart } from './interfaces.js';
1
+ import type { TFlexAgentModelMessage, TFlexPrompt, TFlexPromptPart } from './interfaces.js';
2
2
  export interface INormalizedFlexPrompt {
3
- agentPrompt: TFlexAgentPrompt;
4
3
  modelMessage: TFlexAgentModelMessage;
5
4
  parts: TFlexPromptPart[];
6
5
  }
@@ -1,6 +1,5 @@
1
1
  import { FlexHarnessValidationError } from './errors.js';
2
- import { cloneSerializable } from './utils.json.js';
3
- import { assertJsonSerializable } from './utils.json.js';
2
+ import { assertJsonSerializable, cloneSerializable, serializeAgentMessages, } from './utils.json.js';
4
3
  function isPlainObject(value) {
5
4
  if (!value || typeof value !== 'object' || Array.isArray(value)) {
6
5
  return false;
@@ -78,26 +77,6 @@ function rejectUnknownKeys(value, allowedKeys, path) {
78
77
  throw new FlexHarnessValidationError(`${path}.${unknownKey} is not a supported prompt field.`);
79
78
  }
80
79
  }
81
- function toAgentParts(parts) {
82
- return parts.map((part) => {
83
- if (part.type === 'text') {
84
- return { type: 'text', text: part.text };
85
- }
86
- if (part.type === 'image') {
87
- return {
88
- type: 'image',
89
- image: toAgentData(part.data),
90
- ...(part.mediaType ? { mediaType: part.mediaType } : {}),
91
- };
92
- }
93
- return {
94
- type: 'file',
95
- data: toAgentData(part.data),
96
- mediaType: part.mediaType,
97
- ...(part.name ? { filename: part.name } : {}),
98
- };
99
- });
100
- }
101
80
  function toStoredModelParts(parts) {
102
81
  return parts.map((part) => {
103
82
  if (part.type === 'text') {
@@ -132,7 +111,6 @@ export function normalizeFlexPrompt(prompt) {
132
111
  throw new FlexHarnessValidationError('prompt must not be empty.');
133
112
  }
134
113
  return {
135
- agentPrompt: prompt,
136
114
  modelMessage: { role: 'user', content: prompt },
137
115
  parts: [{ type: 'text', text: prompt }],
138
116
  };
@@ -142,7 +120,6 @@ export function normalizeFlexPrompt(prompt) {
142
120
  }
143
121
  const parts = prompt.map(validatePart);
144
122
  return {
145
- agentPrompt: toAgentParts(parts),
146
123
  modelMessage: {
147
124
  role: 'user',
148
125
  content: toStoredModelParts(parts),
@@ -151,7 +128,7 @@ export function normalizeFlexPrompt(prompt) {
151
128
  };
152
129
  }
153
130
  export function hydrateAgentMessages(messages) {
154
- const hydrated = cloneSerializable(messages);
131
+ const hydrated = serializeAgentMessages(messages);
155
132
  for (const message of hydrated) {
156
133
  if (!Array.isArray(message.content)) {
157
134
  continue;
@@ -167,4 +144,4 @@ export function hydrateAgentMessages(messages) {
167
144
  }
168
145
  return hydrated;
169
146
  }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMucHJvbXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdXRpbHMucHJvbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVF6RCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUN6RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLElBQUksOEJBQThCLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUMxRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsV0FB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
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMucHJvbXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdXRpbHMucHJvbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVN6RCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixzQkFBc0IsR0FDdkIsTUFBTSxpQkFBaUIsQ0FBQztBQU96QixTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUN6RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLElBQUksOEJBQThCLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUMxRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0Is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
@@ -0,0 +1 @@
1
+ export * from './v3_legacyflexharness.js';
@@ -0,0 +1,2 @@
1
+ export * from './v3_legacyflexharness.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQyJ9
@@ -0,0 +1,17 @@
1
+ import type { IFlexHarnessStores, IFlexMessage, IFlexSession, TJsonValue } from '../dist_ts/interfaces.js';
2
+ export interface IFlexLegacyStoredSessionSnapshot {
3
+ session: IFlexSession;
4
+ messages: IFlexMessage[];
5
+ modelHistory: TJsonValue[];
6
+ rememberedPermissionKeys: string[];
7
+ }
8
+ export interface IFlexLegacyHarnessSnapshot {
9
+ schemaVersion: 1;
10
+ revision: number;
11
+ sessions: IFlexLegacyStoredSessionSnapshot[];
12
+ }
13
+ export interface IFlexLegacyHarnessStore {
14
+ load(storageKey: string): Promise<IFlexLegacyHarnessSnapshot | undefined>;
15
+ }
16
+ /** Migrates one stopped, exclusively owned 2.x storage namespace into the 3.x stores. */
17
+ export declare function migrateLegacyFlexHarnessSnapshot(storageKey: string, legacySnapshot: IFlexLegacyHarnessSnapshot, stores: IFlexHarnessStores): Promise<void>;
@@ -0,0 +1,385 @@
1
+ import * as plugins from '../dist_ts/plugins.js';
2
+ import { FlexHarnessStoreFormatError, FlexHarnessValidationError } from '../dist_ts/errors.js';
3
+ import { assertFlexPermissionSnapshot, assertFlexProjectionSnapshot, assertFlexScopeSnapshot, assertJsonSerializable, cloneSerializable, } from '../dist_ts/utils.json.js';
4
+ function requireRecord(value, path) {
5
+ if (!value
6
+ || typeof value !== 'object'
7
+ || Array.isArray(value)
8
+ || (Object.getPrototypeOf(value) !== Object.prototype
9
+ && Object.getPrototypeOf(value) !== null)) {
10
+ throw new FlexHarnessStoreFormatError(`${path} must be a plain object.`);
11
+ }
12
+ return value;
13
+ }
14
+ function requireOnlyKeys(value, allowedKeys, path) {
15
+ const unexpectedKey = Object.keys(value).find((key) => !allowedKeys.includes(key));
16
+ if (unexpectedKey) {
17
+ throw new FlexHarnessStoreFormatError(`${path}.${unexpectedKey} is not supported.`);
18
+ }
19
+ }
20
+ function requireNonNegativeInteger(value, path) {
21
+ if (!Number.isSafeInteger(value) || Number(value) < 0) {
22
+ throw new FlexHarnessStoreFormatError(`${path} must be a non-negative integer.`);
23
+ }
24
+ }
25
+ function deterministicDigest(...values) {
26
+ return plugins.crypto.createHash('sha256').update(JSON.stringify(values)).digest('hex');
27
+ }
28
+ function deterministicEventId(storageKey, sessionId, ...coordinates) {
29
+ return `legacy_${deterministicDigest(storageKey, sessionId, ...coordinates)}`;
30
+ }
31
+ function deterministicTimestamp(value, path) {
32
+ if (!/(?:Z|[+-]\d{2}:\d{2})$/i.test(value)) {
33
+ throw new FlexHarnessStoreFormatError(`${path} must include an explicit timezone.`);
34
+ }
35
+ const timestamp = Date.parse(value);
36
+ if (!Number.isSafeInteger(timestamp) || timestamp < 0) {
37
+ throw new FlexHarnessStoreFormatError(`${path} is invalid.`);
38
+ }
39
+ return timestamp;
40
+ }
41
+ function canonicalJson(value) {
42
+ const canonicalize = (current) => {
43
+ if (Array.isArray(current))
44
+ return current.map(canonicalize);
45
+ if (current && typeof current === 'object') {
46
+ return Object.fromEntries(Object.entries(current)
47
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
48
+ .map(([key, entry]) => [key, canonicalize(entry)]));
49
+ }
50
+ return current;
51
+ };
52
+ return JSON.stringify(canonicalize(value));
53
+ }
54
+ function withoutRevision(snapshot) {
55
+ const { revision: _revision, ...content } = snapshot;
56
+ return content;
57
+ }
58
+ function assertSameContent(actual, expected, destination) {
59
+ if (canonicalJson(actual) !== canonicalJson(expected)) {
60
+ throw new FlexHarnessStoreFormatError(`Legacy migration destination ${destination} already contains different content.`);
61
+ }
62
+ }
63
+ function groupLegacyRuns(messages, sessionId, path) {
64
+ const groups = new Map();
65
+ let priorTimestamp = -1;
66
+ for (const [index, message] of messages.entries()) {
67
+ const messagePath = `${path}[${index}]`;
68
+ if (message.sessionId !== sessionId) {
69
+ throw new FlexHarnessStoreFormatError(`${messagePath}.sessionId does not match its session.`);
70
+ }
71
+ const timestamp = deterministicTimestamp(message.createdAt, `${messagePath}.createdAt`);
72
+ if (timestamp < priorTimestamp) {
73
+ throw new FlexHarnessStoreFormatError(`${path} must be in chronological order.`);
74
+ }
75
+ priorTimestamp = timestamp;
76
+ const group = groups.get(message.runId) ?? [];
77
+ group.push({ message, index, timestamp });
78
+ groups.set(message.runId, group);
79
+ }
80
+ const runs = [];
81
+ let expectedIndex = 0;
82
+ for (const [runId, group] of groups) {
83
+ if (group.length !== 2) {
84
+ throw new FlexHarnessStoreFormatError(`${path} run "${runId}" must contain exactly one user and one assistant message.`);
85
+ }
86
+ const [user, assistant] = group;
87
+ if (user.index !== expectedIndex || assistant.index !== expectedIndex + 1) {
88
+ throw new FlexHarnessStoreFormatError(`${path} contains ambiguous interleaved run groups.`);
89
+ }
90
+ expectedIndex += 2;
91
+ if (user.message.role !== 'user' || assistant.message.role !== 'assistant') {
92
+ throw new FlexHarnessStoreFormatError(`${path} run "${runId}" must contain a user message followed by an assistant message.`);
93
+ }
94
+ if (user.message.runId !== runId || assistant.message.runId !== runId) {
95
+ throw new FlexHarnessStoreFormatError(`${path} run "${runId}" has mismatched run IDs.`);
96
+ }
97
+ if (user.timestamp > assistant.timestamp) {
98
+ throw new FlexHarnessStoreFormatError(`${path} run "${runId}" is not chronological.`);
99
+ }
100
+ if (user.message.status === 'streaming' || assistant.message.status === 'streaming') {
101
+ throw new FlexHarnessStoreFormatError(`${path} run "${runId}" is not terminal.`);
102
+ }
103
+ if (user.message.status !== assistant.message.status) {
104
+ throw new FlexHarnessStoreFormatError(`${path} run "${runId}" has mismatched statuses.`);
105
+ }
106
+ runs.push({
107
+ runId,
108
+ status: user.message.status,
109
+ userMessage: user.message,
110
+ assistantMessage: assistant.message,
111
+ });
112
+ }
113
+ return runs;
114
+ }
115
+ function generationOutcome(status) {
116
+ if (status === 'completed')
117
+ return 'accepted';
118
+ if (status === 'failed')
119
+ return 'rejected';
120
+ return 'interrupted';
121
+ }
122
+ function createSessionAgentEvents(storageKey, stored, runs, path) {
123
+ const { sessionId } = stored.session;
124
+ const baseTimestamp = deterministicTimestamp(stored.session.createdAt, `${path}.session.createdAt`);
125
+ let sequence = 0;
126
+ const nextIdentity = () => {
127
+ sequence++;
128
+ const timestamp = baseTimestamp + sequence - 1;
129
+ if (!Number.isSafeInteger(timestamp)) {
130
+ throw new FlexHarnessStoreFormatError(`${path} contains too many events for its createdAt timestamp.`);
131
+ }
132
+ return { sequence, timestamp };
133
+ };
134
+ const converted = plugins.modelMessagesToAgentEvents(stored.modelHistory, {
135
+ identityFactory: (coordinates) => deterministicEventId(storageKey, sessionId, 'model-history', coordinates.messageIndex, coordinates.partIndex ?? null, coordinates.eventKind),
136
+ });
137
+ const events = converted.map((event) => ({
138
+ ...event,
139
+ ...nextIdentity(),
140
+ }));
141
+ for (const run of runs) {
142
+ const begun = plugins.createAgentEvent({
143
+ type: 'generation-begun',
144
+ id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'begun'),
145
+ ...nextIdentity(),
146
+ generationId: run.runId,
147
+ claimTokenDigest: deterministicDigest(storageKey, sessionId, run.runId, 'claim-token'),
148
+ ...(events.length > 0 ? { parentIds: [events[events.length - 1].id] } : {}),
149
+ });
150
+ const started = plugins.createAgentEvent({
151
+ type: 'generation-execution-started',
152
+ id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'execution-started'),
153
+ ...nextIdentity(),
154
+ generationId: run.runId,
155
+ parentIds: [begun.id],
156
+ });
157
+ const completed = plugins.createAgentEvent({
158
+ type: 'generation-execution-completed',
159
+ id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'execution-completed'),
160
+ ...nextIdentity(),
161
+ generationId: run.runId,
162
+ parentIds: [started.id],
163
+ });
164
+ const outcome = plugins.createAgentEvent({
165
+ type: 'generation-outcome',
166
+ id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'outcome'),
167
+ ...nextIdentity(),
168
+ generationId: run.runId,
169
+ outcome: generationOutcome(run.status),
170
+ parentIds: [completed.id],
171
+ });
172
+ events.push(begun, started, completed, outcome);
173
+ }
174
+ const jsonEvents = JSON.parse(JSON.stringify(events));
175
+ try {
176
+ plugins.validateAgentEventSnapshotV2({
177
+ schemaVersion: 2,
178
+ sessionId,
179
+ revision: 1,
180
+ updatedAt: baseTimestamp,
181
+ events: jsonEvents,
182
+ }, sessionId);
183
+ }
184
+ catch (error) {
185
+ throw new FlexHarnessStoreFormatError(`${path}.modelHistory cannot be converted to valid canonical Agent events: ${error instanceof Error ? error.message : String(error)}`);
186
+ }
187
+ const transactions = plugins.getAgentGenerationTransactions(jsonEvents);
188
+ if (transactions.size !== runs.length) {
189
+ throw new FlexHarnessStoreFormatError(`${path}.messages do not produce unambiguous transactions.`);
190
+ }
191
+ for (const run of runs) {
192
+ if (transactions.get(run.runId)?.state !== generationOutcome(run.status)) {
193
+ throw new FlexHarnessStoreFormatError(`${path}.messages run "${run.runId}" produces an invalid transaction lifecycle.`);
194
+ }
195
+ }
196
+ return jsonEvents;
197
+ }
198
+ function createMigrationPlan(storageKey, legacySnapshot) {
199
+ if (typeof storageKey !== 'string' || !storageKey.trim()) {
200
+ throw new FlexHarnessValidationError('storageKey must be a non-empty string.');
201
+ }
202
+ assertJsonSerializable(legacySnapshot, '$legacySnapshot');
203
+ const snapshot = requireRecord(legacySnapshot, '$legacySnapshot');
204
+ requireOnlyKeys(snapshot, ['schemaVersion', 'revision', 'sessions'], '$legacySnapshot');
205
+ if (snapshot.schemaVersion !== 1) {
206
+ throw new FlexHarnessStoreFormatError('Legacy snapshot schemaVersion must be 1.');
207
+ }
208
+ requireNonNegativeInteger(snapshot.revision, '$legacySnapshot.revision');
209
+ if (!Array.isArray(snapshot.sessions)) {
210
+ throw new FlexHarnessStoreFormatError('$legacySnapshot.sessions must be an array.');
211
+ }
212
+ const legacy = cloneSerializable(legacySnapshot);
213
+ const sessionIds = new Set();
214
+ const eventIds = new Set();
215
+ const sessions = legacy.sessions.map((stored, index) => {
216
+ const path = `$legacySnapshot.sessions[${index}]`;
217
+ const storedRecord = requireRecord(stored, path);
218
+ requireOnlyKeys(storedRecord, ['session', 'messages', 'modelHistory', 'rememberedPermissionKeys'], path);
219
+ const scopeSnapshot = {
220
+ schemaVersion: 1,
221
+ revision: 1,
222
+ sessions: [stored.session],
223
+ tombstones: [],
224
+ };
225
+ const projectionSnapshot = {
226
+ schemaVersion: 1,
227
+ revision: 1,
228
+ messages: stored.messages,
229
+ stagedTerminals: [],
230
+ };
231
+ const permissionSnapshot = {
232
+ schemaVersion: 1,
233
+ revision: 1,
234
+ rememberedPermissionKeys: stored.rememberedPermissionKeys,
235
+ };
236
+ assertFlexScopeSnapshot(scopeSnapshot);
237
+ assertFlexProjectionSnapshot(projectionSnapshot);
238
+ assertFlexPermissionSnapshot(permissionSnapshot);
239
+ const { sessionId } = stored.session;
240
+ if (sessionIds.has(sessionId)) {
241
+ throw new FlexHarnessStoreFormatError(`$legacySnapshot contains duplicate session "${sessionId}".`);
242
+ }
243
+ sessionIds.add(sessionId);
244
+ const runs = groupLegacyRuns(stored.messages, sessionId, `${path}.messages`);
245
+ const agentEvents = createSessionAgentEvents(storageKey, stored, runs, path);
246
+ for (const event of agentEvents) {
247
+ if (eventIds.has(event.id)) {
248
+ throw new FlexHarnessStoreFormatError(`$legacySnapshot produces duplicate Agent event ID "${event.id}".`);
249
+ }
250
+ eventIds.add(event.id);
251
+ }
252
+ return {
253
+ sessionId,
254
+ projectionSnapshot: cloneSerializable(projectionSnapshot),
255
+ permissionSnapshot: cloneSerializable(permissionSnapshot),
256
+ agentEvents,
257
+ };
258
+ });
259
+ const scopeSnapshot = {
260
+ schemaVersion: 1,
261
+ revision: 1,
262
+ sessions: legacy.sessions.map((stored) => cloneSerializable(stored.session)),
263
+ tombstones: [],
264
+ };
265
+ assertFlexScopeSnapshot(scopeSnapshot);
266
+ return { scopeSnapshot, sessions };
267
+ }
268
+ function assertCompatibleJobSnapshot(snapshot, sessionId) {
269
+ if (!snapshot)
270
+ return;
271
+ if (snapshot.schemaVersion !== 1
272
+ || !Number.isSafeInteger(snapshot.revision)
273
+ || snapshot.revision < 0
274
+ || !Number.isSafeInteger(snapshot.updatedAt)
275
+ || snapshot.updatedAt < 0
276
+ || !Array.isArray(snapshot.jobs)
277
+ || snapshot.jobs.length > 0) {
278
+ throw new FlexHarnessStoreFormatError(`Legacy migration destination jobs for session "${sessionId}" is not an empty job snapshot.`);
279
+ }
280
+ }
281
+ async function inspectDestinations(storageKey, plan, stores, ownership) {
282
+ const scope = await stores.scopes.load(storageKey);
283
+ const sessions = [];
284
+ for (const session of plan.sessions) {
285
+ const [projection, permission] = await Promise.all([
286
+ stores.projections.load(storageKey, session.sessionId),
287
+ stores.permissions.load(storageKey, session.sessionId),
288
+ ]);
289
+ const eventStore = await stores.agentEvents.getStore(storageKey, session.sessionId);
290
+ ownership.agentEvents.add(session.sessionId);
291
+ const jobStore = await stores.jobs.getStore(storageKey, session.sessionId);
292
+ ownership.jobs.add(session.sessionId);
293
+ const [eventSnapshot, jobSnapshot] = await Promise.all([
294
+ eventStore.load(session.sessionId),
295
+ jobStore.load(),
296
+ ]);
297
+ sessions.push({
298
+ plan: session,
299
+ projection,
300
+ permission,
301
+ eventStore,
302
+ eventSnapshot: eventSnapshot,
303
+ jobSnapshot,
304
+ });
305
+ }
306
+ if (scope) {
307
+ assertSameContent(withoutRevision(scope), withoutRevision(plan.scopeSnapshot), 'scope snapshot');
308
+ }
309
+ for (const session of sessions) {
310
+ if (session.projection) {
311
+ assertSameContent(withoutRevision(session.projection), withoutRevision(session.plan.projectionSnapshot), `projection snapshot for session "${session.plan.sessionId}"`);
312
+ }
313
+ if (session.permission) {
314
+ assertSameContent(withoutRevision(session.permission), withoutRevision(session.plan.permissionSnapshot), `permission snapshot for session "${session.plan.sessionId}"`);
315
+ }
316
+ if (session.eventSnapshot) {
317
+ assertSameContent({
318
+ schemaVersion: session.eventSnapshot.schemaVersion,
319
+ sessionId: session.eventSnapshot.sessionId,
320
+ events: session.eventSnapshot.events,
321
+ }, {
322
+ schemaVersion: 2,
323
+ sessionId: session.plan.sessionId,
324
+ events: session.plan.agentEvents,
325
+ }, `Agent events for session "${session.plan.sessionId}"`);
326
+ }
327
+ assertCompatibleJobSnapshot(session.jobSnapshot, session.plan.sessionId);
328
+ }
329
+ return { scope, sessions };
330
+ }
331
+ async function releaseMigrationProviders(storageKey, stores, ownership) {
332
+ const releases = [];
333
+ if (stores.agentEvents.releaseSession) {
334
+ for (const sessionId of ownership.agentEvents) {
335
+ releases.push(Promise.resolve().then(() => stores.agentEvents.releaseSession(storageKey, sessionId)));
336
+ }
337
+ }
338
+ if (stores.jobs.releaseSession) {
339
+ for (const sessionId of ownership.jobs) {
340
+ releases.push(Promise.resolve().then(() => stores.jobs.releaseSession(storageKey, sessionId)));
341
+ }
342
+ }
343
+ const results = await Promise.allSettled(releases);
344
+ return results
345
+ .filter((result) => result.status === 'rejected')
346
+ .map((result) => result.reason);
347
+ }
348
+ /** Migrates one stopped, exclusively owned 2.x storage namespace into the 3.x stores. */
349
+ export async function migrateLegacyFlexHarnessSnapshot(storageKey, legacySnapshot, stores) {
350
+ const plan = createMigrationPlan(storageKey, legacySnapshot);
351
+ const ownership = {
352
+ agentEvents: new Set(),
353
+ jobs: new Set(),
354
+ };
355
+ let operationError;
356
+ try {
357
+ const destinations = await inspectDestinations(storageKey, plan, stores, ownership);
358
+ for (const destination of destinations.sessions) {
359
+ const session = destination.plan;
360
+ if (!destination.projection) {
361
+ await stores.projections.save(storageKey, session.sessionId, session.projectionSnapshot, 0);
362
+ }
363
+ if (!destination.permission) {
364
+ await stores.permissions.save(storageKey, session.sessionId, session.permissionSnapshot, 0);
365
+ }
366
+ if (!destination.eventSnapshot) {
367
+ await destination.eventStore.save(session.sessionId, session.agentEvents, 0);
368
+ }
369
+ }
370
+ if (!destinations.scope) {
371
+ await stores.scopes.save(storageKey, plan.scopeSnapshot, 0);
372
+ }
373
+ }
374
+ catch (error) {
375
+ operationError = error;
376
+ }
377
+ const errors = await releaseMigrationProviders(storageKey, stores, ownership);
378
+ if (operationError !== undefined)
379
+ errors.unshift(operationError);
380
+ if (errors.length === 1)
381
+ throw errors[0];
382
+ if (errors.length > 1)
383
+ throw new AggregateError(errors, 'Legacy FlexHarness migration failed.');
384
+ }
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjNfbGVnYWN5ZmxleGhhcm5lc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vdjNfbGVnYWN5ZmxleGhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVcxRixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLGlCQUFpQixHQUNsQixNQUFNLHFCQUFxQixDQUFDO0FBb0Q3QixTQUFTLGFBQWEsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUNqRCxJQUNFLENBQUMsS0FBSztXQUNILE9BQU8sS0FBSyxLQUFLLFFBQVE7V0FDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7V0FDcEIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO2VBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQzNDLENBQUM7UUFDRCxNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxJQUFJLDBCQUEwQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sS0FBZ0MsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBQThCLEVBQzlCLFdBQThCLEVBQzlCLElBQVk7SUFFWixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkYsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxJQUFJLElBQUksYUFBYSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLDJCQUEyQixDQUFDLEdBQUcsSUFBSSxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ25GLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLE1BQWlCO0lBQy9DLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQzNCLFVBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLEdBQUcsV0FBc0I7SUFFekIsT0FBTyxVQUFVLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQ2hGLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQ3pELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxJQUFJLHFDQUFxQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBZ0IsRUFBVyxFQUFFO1FBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0MsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztpQkFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25FLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLFFBQW1CO0lBRW5CLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQWUsRUFBRSxRQUFpQixFQUFFLFdBQW1CO0lBQ2hGLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSwyQkFBMkIsQ0FDbkMsZ0NBQWdDLFdBQVcsc0NBQXNDLENBQ2xGLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUN0QixRQUFpQyxFQUNqQyxTQUFpQixFQUNqQixJQUFZO0lBRVosTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQThFLENBQUM7SUFDckcsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQ3hDLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxXQUFXLHdDQUF3QyxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxXQUFXLFlBQVksQ0FBQyxDQUFDO1FBQ3hGLElBQUksU0FBUyxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLElBQUksa0NBQWtDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFpQixFQUFFLENBQUM7SUFDOUIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNwQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLDJCQUEyQixDQUNuQyxHQUFHLElBQUksU0FBUyxLQUFLLDREQUE0RCxDQUNsRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxhQUFhLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUUsTUFBTSxJQUFJLDJCQUEyQixDQUFDLEdBQUcsSUFBSSw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFDRCxhQUFhLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzNFLE1BQU0sSUFBSSwyQkFBMkIsQ0FDbkMsR0FBRyxJQUFJLFNBQVMsS0FBSyxpRUFBaUUsQ0FDdkYsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN0RSxNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxJQUFJLFNBQVMsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLElBQUksU0FBUyxLQUFLLHlCQUF5QixDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BGLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLElBQUksU0FBUyxLQUFLLG9CQUFvQixDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxJQUFJLFNBQVMsS0FBSyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ1IsS0FBSztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3pCLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxPQUFPO1NBQ3BDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQTRCO0lBQ3JELElBQUksTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLFVBQVUsQ0FBQztJQUM5QyxJQUFJLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFDM0MsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQy9CLFVBQWtCLEVBQ2xCLE1BQXdDLEVBQ3hDLElBQTJCLEVBQzNCLElBQVk7SUFFWixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUNyQyxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksb0JBQW9CLENBQUMsQ0FBQztJQUNwRyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO1FBQ3hCLFFBQVEsRUFBRSxDQUFDO1FBQ1gsTUFBTSxTQUFTLEdBQUcsYUFBYSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksMkJBQTJCLENBQ25DLEdBQUcsSUFBSSx3REFBd0QsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUMsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsQ0FDbEQsTUFBTSxDQUFDLFlBQW1ELEVBQzFEO1FBQ0UsZUFBZSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FDcEQsVUFBVSxFQUNWLFNBQVMsRUFDVCxlQUFlLEVBQ2YsV0FBVyxDQUFDLFlBQVksRUFDeEIsV0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQzdCLFdBQVcsQ0FBQyxTQUFTLENBQ3RCO0tBQ0YsQ0FDRixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQTBCLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsR0FBRyxLQUFLO1FBQ1IsR0FBRyxZQUFZLEVBQUU7S0FDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0M7WUFDcEUsSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixFQUFFLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDMUUsR0FBRyxZQUFZLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ3ZCLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7WUFDdEYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM1RSxDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQTJDO1lBQ2pGLElBQUksRUFBRSw4QkFBOEI7WUFDcEMsRUFBRSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUM7WUFDdEYsR0FBRyxZQUFZLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUE2QztZQUNyRixJQUFJLEVBQUUsZ0NBQWdDO1lBQ3RDLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDO1lBQ3hGLEdBQUcsWUFBWSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxHQUFHLENBQUMsS0FBSztZQUN2QixTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3hCLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBa0M7WUFDeEUsSUFBSSxFQUFFLG9CQUFvQjtZQUMxQixFQUFFLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7WUFDNUUsR0FBRyxZQUFZLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUEwQixDQUFDO0lBQy9FLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQztZQUNuQyxhQUFhLEVBQUUsQ0FBQztZQUNoQixTQUFTO1lBQ1QsUUFBUSxFQUFFLENBQUM7WUFDWCxTQUFTLEVBQUUsYUFBYTtZQUN4QixNQUFNLEVBQUUsVUFBVTtTQUNuQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLDJCQUEyQixDQUNuQyxHQUFHLElBQUksc0VBQ0wsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDdkQsRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hFLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLDJCQUEyQixDQUFDLEdBQUcsSUFBSSxvREFBb0QsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sSUFBSSwyQkFBMkIsQ0FDbkMsR0FBRyxJQUFJLGtCQUFrQixHQUFHLENBQUMsS0FBSyw4Q0FBOEMsQ0FDakYsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQzFCLFVBQWtCLEVBQ2xCLGNBQTBDO0lBRTFDLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELHNCQUFzQixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hGLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksMkJBQTJCLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QseUJBQXlCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ3pFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUErQixFQUFFO1FBQ2xGLE1BQU0sSUFBSSxHQUFHLDRCQUE0QixLQUFLLEdBQUcsQ0FBQztRQUNsRCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELGVBQWUsQ0FDYixZQUFZLEVBQ1osQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSwwQkFBMEIsQ0FBQyxFQUNuRSxJQUFJLENBQ0wsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUF1QjtZQUN4QyxhQUFhLEVBQUUsQ0FBQztZQUNoQixRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDMUIsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBNEI7WUFDbEQsYUFBYSxFQUFFLENBQUM7WUFDaEIsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsZUFBZSxFQUFFLEVBQUU7U0FDcEIsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQTRCO1lBQ2xELGFBQWEsRUFBRSxDQUFDO1lBQ2hCLFFBQVEsRUFBRSxDQUFDO1lBQ1gsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QjtTQUMxRCxDQUFDO1FBQ0YsdUJBQXVCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkMsNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqRCw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3JDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSwyQkFBMkIsQ0FDbkMsK0NBQStDLFNBQVMsSUFBSSxDQUM3RCxDQUFDO1FBQ0osQ0FBQztRQUNELFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQztRQUM3RSxNQUFNLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RSxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLDJCQUEyQixDQUNuQyxzREFBc0QsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUNuRSxDQUFDO1lBQ0osQ0FBQztZQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPO1lBQ0wsU0FBUztZQUNULGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO1lBQ3pELGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO1lBQ3pELFdBQVc7U0FDWixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLGFBQWEsR0FBdUI7UUFDeEMsYUFBYSxFQUFFLENBQUM7UUFDaEIsUUFBUSxFQUFFLENBQUM7UUFDWCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RSxVQUFVLEVBQUUsRUFBRTtLQUNmLENBQUM7SUFDRix1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUNsQyxRQUE4QyxFQUM5QyxTQUFpQjtJQUVqQixJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU87SUFDdEIsSUFDRSxRQUFRLENBQUMsYUFBYSxLQUFLLENBQUM7V0FDekIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7V0FDeEMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDO1dBQ3JCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1dBQ3pDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQztXQUN0QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztXQUM3QixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzNCLENBQUM7UUFDRCxNQUFNLElBQUksMkJBQTJCLENBQ25DLGtEQUFrRCxTQUFTLGlDQUFpQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLFVBQWtCLEVBQ2xCLElBQTBCLEVBQzFCLE1BQTBCLEVBQzFCLFNBQXNDO0lBS3RDLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsTUFBTSxRQUFRLEdBQW1DLEVBQUUsQ0FBQztJQUNwRCxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNqRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUN0RCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUN2RCxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEYsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDckQsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2xDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLElBQUksRUFBRSxPQUFPO1lBQ2IsVUFBVTtZQUNWLFVBQVU7WUFDVixVQUFVO1lBQ1YsYUFBYSxFQUFFLGFBQTBEO1lBQ3pFLFdBQVc7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUNELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsaUJBQWlCLENBQ2YsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFDaEQsb0NBQW9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQzlELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsaUJBQWlCLENBQ2YsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFDaEQsb0NBQW9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQzlELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsaUJBQWlCLENBQ2Y7Z0JBQ0UsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYTtnQkFDbEQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUztnQkFDMUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTTthQUNyQyxFQUNEO2dCQUNFLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTO2dCQUNqQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXO2FBQ2pDLEVBQ0QsNkJBQTZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQ3ZELENBQUM7UUFDSixDQUFDO1FBQ0QsMkJBQTJCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQzdCLENBQUM7QUFFRCxLQUFLLFVBQVUseUJBQXlCLENBQ3RDLFVBQWtCLEVBQ2xCLE1BQTBCLEVBQzFCLFNBQXNDO0lBRXRDLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDeEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBZSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsT0FBTyxPQUFPO1NBQ1gsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFtQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUM7U0FDakYsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixNQUFNLENBQUMsS0FBSyxVQUFVLGdDQUFnQyxDQUNwRCxVQUFrQixFQUNsQixjQUEwQyxFQUMxQyxNQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDN0QsTUFBTSxTQUFTLEdBQWdDO1FBQzdDLFdBQVcsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUN0QixJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUU7S0FDaEIsQ0FBQztJQUNGLElBQUksY0FBdUIsQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXBGLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDM0IsVUFBVSxFQUNWLE9BQU8sQ0FBQyxTQUFTLEVBQ2pCLE9BQU8sQ0FBQyxrQkFBa0IsRUFDMUIsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDM0IsVUFBVSxFQUNWLE9BQU8sQ0FBQyxTQUFTLEVBQ2pCLE9BQU8sQ0FBQyxrQkFBa0IsRUFDMUIsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlFLElBQUksY0FBYyxLQUFLLFNBQVM7UUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO0FBQ2xHLENBQUMifQ==
package/package.json CHANGED
@@ -1,31 +1,45 @@
1
1
  {
2
2
  "name": "@modelprofile.com/flexharness",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
5
  "description": "Provider-neutral model-session runtime with durable history, permissions, typed events, and pluggable local or remote tool execution.",
6
6
  "main": "dist_ts/index.js",
7
7
  "typings": "dist_ts/index.d.ts",
8
8
  "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist_ts/index.d.ts",
12
+ "import": "./dist_ts/index.js"
13
+ },
14
+ "./migration": {
15
+ "types": "./dist_ts_migration/index.d.ts",
16
+ "import": "./dist_ts_migration/index.js"
17
+ }
18
+ },
9
19
  "author": "Task Venture Capital GmbH",
10
20
  "license": "MIT",
11
21
  "engines": {
12
22
  "node": ">=24"
13
23
  },
14
24
  "dependencies": {
15
- "@push.rocks/smartagent": "^4.0.0",
25
+ "@push.rocks/smartagent": "^4.6.0",
16
26
  "@types/json-schema": "7.0.15"
17
27
  },
18
28
  "devDependencies": {
19
29
  "@git.zone/tsbuild": "4.4.2",
20
30
  "@git.zone/tsrun": "2.0.6",
21
31
  "@git.zone/tstest": "4.0.0",
22
- "@types/node": "26.1.2"
32
+ "@types/node": "26.2.0",
33
+ "ai": "6.0.237"
23
34
  },
24
35
  "files": [
25
36
  "ts/**/*",
37
+ "ts_migration/**/*",
26
38
  "dist_ts/**/*",
39
+ "dist_ts_migration/**/*",
27
40
  ".smartconfig.json",
28
41
  "readme.md",
42
+ "changelog.md",
29
43
  "license.md"
30
44
  ],
31
45
  "scripts": {