@modelprofile.com/flexharness 2.1.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +66 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.flexharness.d.ts +86 -30
- package/dist_ts/classes.flexharness.js +2593 -1131
- package/dist_ts/classes.stores.d.ts +19 -20
- package/dist_ts/classes.stores.js +968 -75
- package/dist_ts/errors.d.ts +5 -0
- package/dist_ts/errors.js +11 -1
- package/dist_ts/interfaces.d.ts +130 -23
- package/dist_ts/plugins.d.ts +3 -3
- package/dist_ts/plugins.js +3 -3
- package/dist_ts/utils.json.d.ts +4 -2
- package/dist_ts/utils.json.js +283 -140
- package/dist_ts/utils.prompt.d.ts +1 -2
- package/dist_ts/utils.prompt.js +3 -26
- package/dist_ts_migration/index.d.ts +1 -0
- package/dist_ts_migration/index.js +2 -0
- package/dist_ts_migration/v3_legacyflexharness.d.ts +17 -0
- package/dist_ts_migration/v3_legacyflexharness.js +426 -0
- package/package.json +17 -3
- package/readme.hints.md +13 -11
- package/readme.md +94 -27
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.flexharness.ts +2966 -1421
- package/ts/classes.stores.ts +1226 -97
- package/ts/errors.ts +20 -0
- package/ts/interfaces.ts +168 -22
- package/ts/plugins.ts +46 -3
- package/ts/utils.json.ts +341 -154
- package/ts/utils.prompt.ts +6 -27
- package/ts_migration/index.ts +1 -0
- package/ts_migration/v3_legacyflexharness.ts +620 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { TFlexAgentModelMessage,
|
|
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
|
}
|
package/dist_ts/utils.prompt.js
CHANGED
|
@@ -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 =
|
|
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,
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMucHJvbXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdXRpbHMucHJvbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVN6RCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixzQkFBc0IsR0FDdkIsTUFBTSxpQkFBaUIsQ0FBQztBQU96QixTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUN6RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLElBQUksOEJBQThCLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUMxRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0Is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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './v3_legacyflexharness.js';
|
|
@@ -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,426 @@
|
|
|
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
|
+
const interruptedMessageError = 'The process stopped before this message completed.';
|
|
64
|
+
const interruptedToolError = 'The process stopped before this tool call completed.';
|
|
65
|
+
function repairLegacyInterruptedSession(stored, path) {
|
|
66
|
+
const timestampValues = [
|
|
67
|
+
stored.session.createdAt,
|
|
68
|
+
stored.session.updatedAt,
|
|
69
|
+
stored.session.archivedAt,
|
|
70
|
+
...stored.messages.flatMap((message) => [message.createdAt, message.completedAt]),
|
|
71
|
+
].flatMap((value) => value === undefined ? [] : [value]);
|
|
72
|
+
const recoveredAt = new Date(Math.max(...timestampValues.map((value, index) => (deterministicTimestamp(value, `${path}.recoveryTimestamps[${index}]`))))).toISOString();
|
|
73
|
+
if (stored.session.status === 'running'
|
|
74
|
+
|| stored.session.status === 'waiting_permission') {
|
|
75
|
+
stored.session.status = 'idle';
|
|
76
|
+
stored.session.activity = { status: 'idle' };
|
|
77
|
+
stored.session.updatedAt = recoveredAt;
|
|
78
|
+
}
|
|
79
|
+
else if (stored.session.activity.status === 'running'
|
|
80
|
+
|| stored.session.activity.status === 'waiting_permission') {
|
|
81
|
+
stored.session.activity = { status: 'idle' };
|
|
82
|
+
stored.session.updatedAt = recoveredAt;
|
|
83
|
+
}
|
|
84
|
+
for (const message of stored.messages) {
|
|
85
|
+
if (message.status === 'streaming') {
|
|
86
|
+
message.status = 'cancelled';
|
|
87
|
+
message.completedAt = recoveredAt;
|
|
88
|
+
message.error = interruptedMessageError;
|
|
89
|
+
}
|
|
90
|
+
for (const part of message.parts) {
|
|
91
|
+
if (part.type === 'reasoning' && part.status === 'running') {
|
|
92
|
+
part.status = 'cancelled';
|
|
93
|
+
}
|
|
94
|
+
if (part.type === 'tool' && part.status === 'running') {
|
|
95
|
+
part.status = 'cancelled';
|
|
96
|
+
part.error = interruptedToolError;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function groupLegacyRuns(messages, sessionId, path) {
|
|
102
|
+
const groups = new Map();
|
|
103
|
+
let priorTimestamp = -1;
|
|
104
|
+
for (const [index, message] of messages.entries()) {
|
|
105
|
+
const messagePath = `${path}[${index}]`;
|
|
106
|
+
if (message.sessionId !== sessionId) {
|
|
107
|
+
throw new FlexHarnessStoreFormatError(`${messagePath}.sessionId does not match its session.`);
|
|
108
|
+
}
|
|
109
|
+
const timestamp = deterministicTimestamp(message.createdAt, `${messagePath}.createdAt`);
|
|
110
|
+
if (timestamp < priorTimestamp) {
|
|
111
|
+
throw new FlexHarnessStoreFormatError(`${path} must be in chronological order.`);
|
|
112
|
+
}
|
|
113
|
+
priorTimestamp = timestamp;
|
|
114
|
+
const group = groups.get(message.runId) ?? [];
|
|
115
|
+
group.push({ message, index, timestamp });
|
|
116
|
+
groups.set(message.runId, group);
|
|
117
|
+
}
|
|
118
|
+
const runs = [];
|
|
119
|
+
let expectedIndex = 0;
|
|
120
|
+
for (const [runId, group] of groups) {
|
|
121
|
+
if (group.length !== 2) {
|
|
122
|
+
throw new FlexHarnessStoreFormatError(`${path} run "${runId}" must contain exactly one user and one assistant message.`);
|
|
123
|
+
}
|
|
124
|
+
const [user, assistant] = group;
|
|
125
|
+
if (user.index !== expectedIndex || assistant.index !== expectedIndex + 1) {
|
|
126
|
+
throw new FlexHarnessStoreFormatError(`${path} contains ambiguous interleaved run groups.`);
|
|
127
|
+
}
|
|
128
|
+
expectedIndex += 2;
|
|
129
|
+
if (user.message.role !== 'user' || assistant.message.role !== 'assistant') {
|
|
130
|
+
throw new FlexHarnessStoreFormatError(`${path} run "${runId}" must contain a user message followed by an assistant message.`);
|
|
131
|
+
}
|
|
132
|
+
if (user.message.runId !== runId || assistant.message.runId !== runId) {
|
|
133
|
+
throw new FlexHarnessStoreFormatError(`${path} run "${runId}" has mismatched run IDs.`);
|
|
134
|
+
}
|
|
135
|
+
if (user.timestamp > assistant.timestamp) {
|
|
136
|
+
throw new FlexHarnessStoreFormatError(`${path} run "${runId}" is not chronological.`);
|
|
137
|
+
}
|
|
138
|
+
if (user.message.status === 'streaming' || assistant.message.status === 'streaming') {
|
|
139
|
+
throw new FlexHarnessStoreFormatError(`${path} run "${runId}" is not terminal.`);
|
|
140
|
+
}
|
|
141
|
+
if (user.message.status !== assistant.message.status) {
|
|
142
|
+
throw new FlexHarnessStoreFormatError(`${path} run "${runId}" has mismatched statuses.`);
|
|
143
|
+
}
|
|
144
|
+
runs.push({
|
|
145
|
+
runId,
|
|
146
|
+
status: user.message.status,
|
|
147
|
+
userMessage: user.message,
|
|
148
|
+
assistantMessage: assistant.message,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return runs;
|
|
152
|
+
}
|
|
153
|
+
function generationOutcome(status) {
|
|
154
|
+
if (status === 'completed')
|
|
155
|
+
return 'accepted';
|
|
156
|
+
if (status === 'failed')
|
|
157
|
+
return 'rejected';
|
|
158
|
+
return 'interrupted';
|
|
159
|
+
}
|
|
160
|
+
function createSessionAgentEvents(storageKey, stored, runs, path) {
|
|
161
|
+
const { sessionId } = stored.session;
|
|
162
|
+
const baseTimestamp = deterministicTimestamp(stored.session.createdAt, `${path}.session.createdAt`);
|
|
163
|
+
let sequence = 0;
|
|
164
|
+
const nextIdentity = () => {
|
|
165
|
+
sequence++;
|
|
166
|
+
const timestamp = baseTimestamp + sequence - 1;
|
|
167
|
+
if (!Number.isSafeInteger(timestamp)) {
|
|
168
|
+
throw new FlexHarnessStoreFormatError(`${path} contains too many events for its createdAt timestamp.`);
|
|
169
|
+
}
|
|
170
|
+
return { sequence, timestamp };
|
|
171
|
+
};
|
|
172
|
+
const converted = plugins.modelMessagesToAgentEvents(stored.modelHistory, {
|
|
173
|
+
identityFactory: (coordinates) => deterministicEventId(storageKey, sessionId, 'model-history', coordinates.messageIndex, coordinates.partIndex ?? null, coordinates.eventKind),
|
|
174
|
+
});
|
|
175
|
+
const events = converted.map((event) => ({
|
|
176
|
+
...event,
|
|
177
|
+
...nextIdentity(),
|
|
178
|
+
}));
|
|
179
|
+
for (const run of runs) {
|
|
180
|
+
const begun = plugins.createAgentEvent({
|
|
181
|
+
type: 'generation-begun',
|
|
182
|
+
id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'begun'),
|
|
183
|
+
...nextIdentity(),
|
|
184
|
+
generationId: run.runId,
|
|
185
|
+
claimTokenDigest: deterministicDigest(storageKey, sessionId, run.runId, 'claim-token'),
|
|
186
|
+
...(events.length > 0 ? { parentIds: [events[events.length - 1].id] } : {}),
|
|
187
|
+
});
|
|
188
|
+
const started = plugins.createAgentEvent({
|
|
189
|
+
type: 'generation-execution-started',
|
|
190
|
+
id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'execution-started'),
|
|
191
|
+
...nextIdentity(),
|
|
192
|
+
generationId: run.runId,
|
|
193
|
+
parentIds: [begun.id],
|
|
194
|
+
});
|
|
195
|
+
const completed = plugins.createAgentEvent({
|
|
196
|
+
type: 'generation-execution-completed',
|
|
197
|
+
id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'execution-completed'),
|
|
198
|
+
...nextIdentity(),
|
|
199
|
+
generationId: run.runId,
|
|
200
|
+
parentIds: [started.id],
|
|
201
|
+
});
|
|
202
|
+
const outcome = plugins.createAgentEvent({
|
|
203
|
+
type: 'generation-outcome',
|
|
204
|
+
id: deterministicEventId(storageKey, sessionId, 'run', run.runId, 'outcome'),
|
|
205
|
+
...nextIdentity(),
|
|
206
|
+
generationId: run.runId,
|
|
207
|
+
outcome: generationOutcome(run.status),
|
|
208
|
+
parentIds: [completed.id],
|
|
209
|
+
});
|
|
210
|
+
events.push(begun, started, completed, outcome);
|
|
211
|
+
}
|
|
212
|
+
const jsonEvents = JSON.parse(JSON.stringify(events));
|
|
213
|
+
try {
|
|
214
|
+
plugins.validateAgentEventSnapshotV2({
|
|
215
|
+
schemaVersion: 2,
|
|
216
|
+
sessionId,
|
|
217
|
+
revision: 1,
|
|
218
|
+
updatedAt: baseTimestamp,
|
|
219
|
+
events: jsonEvents,
|
|
220
|
+
}, sessionId);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
throw new FlexHarnessStoreFormatError(`${path}.modelHistory cannot be converted to valid canonical Agent events: ${error instanceof Error ? error.message : String(error)}`);
|
|
224
|
+
}
|
|
225
|
+
const transactions = plugins.getAgentGenerationTransactions(jsonEvents);
|
|
226
|
+
if (transactions.size !== runs.length) {
|
|
227
|
+
throw new FlexHarnessStoreFormatError(`${path}.messages do not produce unambiguous transactions.`);
|
|
228
|
+
}
|
|
229
|
+
for (const run of runs) {
|
|
230
|
+
if (transactions.get(run.runId)?.state !== generationOutcome(run.status)) {
|
|
231
|
+
throw new FlexHarnessStoreFormatError(`${path}.messages run "${run.runId}" produces an invalid transaction lifecycle.`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return jsonEvents;
|
|
235
|
+
}
|
|
236
|
+
function createMigrationPlan(storageKey, legacySnapshot) {
|
|
237
|
+
if (typeof storageKey !== 'string' || !storageKey.trim()) {
|
|
238
|
+
throw new FlexHarnessValidationError('storageKey must be a non-empty string.');
|
|
239
|
+
}
|
|
240
|
+
assertJsonSerializable(legacySnapshot, '$legacySnapshot');
|
|
241
|
+
const snapshot = requireRecord(legacySnapshot, '$legacySnapshot');
|
|
242
|
+
requireOnlyKeys(snapshot, ['schemaVersion', 'revision', 'sessions'], '$legacySnapshot');
|
|
243
|
+
if (snapshot.schemaVersion !== 1) {
|
|
244
|
+
throw new FlexHarnessStoreFormatError('Legacy snapshot schemaVersion must be 1.');
|
|
245
|
+
}
|
|
246
|
+
requireNonNegativeInteger(snapshot.revision, '$legacySnapshot.revision');
|
|
247
|
+
if (!Array.isArray(snapshot.sessions)) {
|
|
248
|
+
throw new FlexHarnessStoreFormatError('$legacySnapshot.sessions must be an array.');
|
|
249
|
+
}
|
|
250
|
+
const legacy = cloneSerializable(legacySnapshot);
|
|
251
|
+
const sessionIds = new Set();
|
|
252
|
+
const eventIds = new Set();
|
|
253
|
+
const sessions = legacy.sessions.map((stored, index) => {
|
|
254
|
+
const path = `$legacySnapshot.sessions[${index}]`;
|
|
255
|
+
const storedRecord = requireRecord(stored, path);
|
|
256
|
+
requireOnlyKeys(storedRecord, ['session', 'messages', 'modelHistory', 'rememberedPermissionKeys'], path);
|
|
257
|
+
const scopeSnapshot = {
|
|
258
|
+
schemaVersion: 1,
|
|
259
|
+
revision: 1,
|
|
260
|
+
sessions: [stored.session],
|
|
261
|
+
tombstones: [],
|
|
262
|
+
};
|
|
263
|
+
const projectionSnapshot = {
|
|
264
|
+
schemaVersion: 1,
|
|
265
|
+
revision: 1,
|
|
266
|
+
messages: stored.messages,
|
|
267
|
+
stagedTerminals: [],
|
|
268
|
+
};
|
|
269
|
+
const permissionSnapshot = {
|
|
270
|
+
schemaVersion: 1,
|
|
271
|
+
revision: 1,
|
|
272
|
+
rememberedPermissionKeys: stored.rememberedPermissionKeys,
|
|
273
|
+
};
|
|
274
|
+
assertFlexScopeSnapshot(scopeSnapshot);
|
|
275
|
+
assertFlexProjectionSnapshot(projectionSnapshot);
|
|
276
|
+
assertFlexPermissionSnapshot(permissionSnapshot);
|
|
277
|
+
repairLegacyInterruptedSession(stored, path);
|
|
278
|
+
assertFlexScopeSnapshot(scopeSnapshot);
|
|
279
|
+
assertFlexProjectionSnapshot(projectionSnapshot);
|
|
280
|
+
const { sessionId } = stored.session;
|
|
281
|
+
if (sessionIds.has(sessionId)) {
|
|
282
|
+
throw new FlexHarnessStoreFormatError(`$legacySnapshot contains duplicate session "${sessionId}".`);
|
|
283
|
+
}
|
|
284
|
+
sessionIds.add(sessionId);
|
|
285
|
+
const runs = groupLegacyRuns(stored.messages, sessionId, `${path}.messages`);
|
|
286
|
+
const agentEvents = createSessionAgentEvents(storageKey, stored, runs, path);
|
|
287
|
+
for (const event of agentEvents) {
|
|
288
|
+
if (eventIds.has(event.id)) {
|
|
289
|
+
throw new FlexHarnessStoreFormatError(`$legacySnapshot produces duplicate Agent event ID "${event.id}".`);
|
|
290
|
+
}
|
|
291
|
+
eventIds.add(event.id);
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
sessionId,
|
|
295
|
+
projectionSnapshot: cloneSerializable(projectionSnapshot),
|
|
296
|
+
permissionSnapshot: cloneSerializable(permissionSnapshot),
|
|
297
|
+
agentEvents,
|
|
298
|
+
};
|
|
299
|
+
});
|
|
300
|
+
const scopeSnapshot = {
|
|
301
|
+
schemaVersion: 1,
|
|
302
|
+
revision: 1,
|
|
303
|
+
sessions: legacy.sessions.map((stored) => cloneSerializable(stored.session)),
|
|
304
|
+
tombstones: [],
|
|
305
|
+
};
|
|
306
|
+
assertFlexScopeSnapshot(scopeSnapshot);
|
|
307
|
+
return { scopeSnapshot, sessions };
|
|
308
|
+
}
|
|
309
|
+
function assertCompatibleJobSnapshot(snapshot, sessionId) {
|
|
310
|
+
if (!snapshot)
|
|
311
|
+
return;
|
|
312
|
+
if (snapshot.schemaVersion !== 1
|
|
313
|
+
|| !Number.isSafeInteger(snapshot.revision)
|
|
314
|
+
|| snapshot.revision < 0
|
|
315
|
+
|| !Number.isSafeInteger(snapshot.updatedAt)
|
|
316
|
+
|| snapshot.updatedAt < 0
|
|
317
|
+
|| !Array.isArray(snapshot.jobs)
|
|
318
|
+
|| snapshot.jobs.length > 0) {
|
|
319
|
+
throw new FlexHarnessStoreFormatError(`Legacy migration destination jobs for session "${sessionId}" is not an empty job snapshot.`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
async function inspectDestinations(storageKey, plan, stores, ownership) {
|
|
323
|
+
const scope = await stores.scopes.load(storageKey);
|
|
324
|
+
const sessions = [];
|
|
325
|
+
for (const session of plan.sessions) {
|
|
326
|
+
const [projection, permission] = await Promise.all([
|
|
327
|
+
stores.projections.load(storageKey, session.sessionId),
|
|
328
|
+
stores.permissions.load(storageKey, session.sessionId),
|
|
329
|
+
]);
|
|
330
|
+
const eventStore = await stores.agentEvents.getStore(storageKey, session.sessionId);
|
|
331
|
+
ownership.agentEvents.add(session.sessionId);
|
|
332
|
+
const jobStore = await stores.jobs.getStore(storageKey, session.sessionId);
|
|
333
|
+
ownership.jobs.add(session.sessionId);
|
|
334
|
+
const [eventSnapshot, jobSnapshot] = await Promise.all([
|
|
335
|
+
eventStore.load(session.sessionId),
|
|
336
|
+
jobStore.load(),
|
|
337
|
+
]);
|
|
338
|
+
sessions.push({
|
|
339
|
+
plan: session,
|
|
340
|
+
projection,
|
|
341
|
+
permission,
|
|
342
|
+
eventStore,
|
|
343
|
+
eventSnapshot: eventSnapshot,
|
|
344
|
+
jobSnapshot,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (scope) {
|
|
348
|
+
assertSameContent(withoutRevision(scope), withoutRevision(plan.scopeSnapshot), 'scope snapshot');
|
|
349
|
+
}
|
|
350
|
+
for (const session of sessions) {
|
|
351
|
+
if (session.projection) {
|
|
352
|
+
assertSameContent(withoutRevision(session.projection), withoutRevision(session.plan.projectionSnapshot), `projection snapshot for session "${session.plan.sessionId}"`);
|
|
353
|
+
}
|
|
354
|
+
if (session.permission) {
|
|
355
|
+
assertSameContent(withoutRevision(session.permission), withoutRevision(session.plan.permissionSnapshot), `permission snapshot for session "${session.plan.sessionId}"`);
|
|
356
|
+
}
|
|
357
|
+
if (session.eventSnapshot) {
|
|
358
|
+
assertSameContent({
|
|
359
|
+
schemaVersion: session.eventSnapshot.schemaVersion,
|
|
360
|
+
sessionId: session.eventSnapshot.sessionId,
|
|
361
|
+
events: session.eventSnapshot.events,
|
|
362
|
+
}, {
|
|
363
|
+
schemaVersion: 2,
|
|
364
|
+
sessionId: session.plan.sessionId,
|
|
365
|
+
events: session.plan.agentEvents,
|
|
366
|
+
}, `Agent events for session "${session.plan.sessionId}"`);
|
|
367
|
+
}
|
|
368
|
+
assertCompatibleJobSnapshot(session.jobSnapshot, session.plan.sessionId);
|
|
369
|
+
}
|
|
370
|
+
return { scope, sessions };
|
|
371
|
+
}
|
|
372
|
+
async function releaseMigrationProviders(storageKey, stores, ownership) {
|
|
373
|
+
const releases = [];
|
|
374
|
+
if (stores.agentEvents.releaseSession) {
|
|
375
|
+
for (const sessionId of ownership.agentEvents) {
|
|
376
|
+
releases.push(Promise.resolve().then(() => stores.agentEvents.releaseSession(storageKey, sessionId)));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (stores.jobs.releaseSession) {
|
|
380
|
+
for (const sessionId of ownership.jobs) {
|
|
381
|
+
releases.push(Promise.resolve().then(() => stores.jobs.releaseSession(storageKey, sessionId)));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
const results = await Promise.allSettled(releases);
|
|
385
|
+
return results
|
|
386
|
+
.filter((result) => result.status === 'rejected')
|
|
387
|
+
.map((result) => result.reason);
|
|
388
|
+
}
|
|
389
|
+
/** Migrates one stopped, exclusively owned 2.x storage namespace into the 3.x stores. */
|
|
390
|
+
export async function migrateLegacyFlexHarnessSnapshot(storageKey, legacySnapshot, stores) {
|
|
391
|
+
const plan = createMigrationPlan(storageKey, legacySnapshot);
|
|
392
|
+
const ownership = {
|
|
393
|
+
agentEvents: new Set(),
|
|
394
|
+
jobs: new Set(),
|
|
395
|
+
};
|
|
396
|
+
let operationError;
|
|
397
|
+
try {
|
|
398
|
+
const destinations = await inspectDestinations(storageKey, plan, stores, ownership);
|
|
399
|
+
for (const destination of destinations.sessions) {
|
|
400
|
+
const session = destination.plan;
|
|
401
|
+
if (!destination.projection) {
|
|
402
|
+
await stores.projections.save(storageKey, session.sessionId, session.projectionSnapshot, 0);
|
|
403
|
+
}
|
|
404
|
+
if (!destination.permission) {
|
|
405
|
+
await stores.permissions.save(storageKey, session.sessionId, session.permissionSnapshot, 0);
|
|
406
|
+
}
|
|
407
|
+
if (!destination.eventSnapshot) {
|
|
408
|
+
await destination.eventStore.save(session.sessionId, session.agentEvents, 0);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (!destinations.scope) {
|
|
412
|
+
await stores.scopes.save(storageKey, plan.scopeSnapshot, 0);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
operationError = error;
|
|
417
|
+
}
|
|
418
|
+
const errors = await releaseMigrationProviders(storageKey, stores, ownership);
|
|
419
|
+
if (operationError !== undefined)
|
|
420
|
+
errors.unshift(operationError);
|
|
421
|
+
if (errors.length === 1)
|
|
422
|
+
throw errors[0];
|
|
423
|
+
if (errors.length > 1)
|
|
424
|
+
throw new AggregateError(errors, 'Legacy FlexHarness migration failed.');
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjNfbGVnYWN5ZmxleGhhcm5lc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vdjNfbGVnYWN5ZmxleGhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVcxRixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLGlCQUFpQixHQUNsQixNQUFNLHFCQUFxQixDQUFDO0FBb0Q3QixTQUFTLGFBQWEsQ0FBQyxLQUFjLEVBQUUsSUFBWTtJQUNqRCxJQUNFLENBQUMsS0FBSztXQUNILE9BQU8sS0FBSyxLQUFLLFFBQVE7V0FDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7V0FDcEIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO2VBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQzNDLENBQUM7UUFDRCxNQUFNLElBQUksMkJBQTJCLENBQUMsR0FBRyxJQUFJLDBCQUEwQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sS0FBZ0MsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBQThCLEVBQzlCLFdBQThCLEVBQzlCLElBQVk7SUFFWixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkYsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUks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
|
package/package.json
CHANGED
|
@@ -1,31 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modelprofile.com/flexharness",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
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.
|
|
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.2.0"
|
|
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": {
|