@cef-ai/eval 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -2
- package/dist/capture.d.ts +37 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +70 -0
- package/dist/capture.js.map +1 -0
- package/dist/conformance.d.ts +6 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +256 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract.d.ts +18 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +176 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +105 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +215 -0
- package/dist/layout.js.map +1 -0
- package/dist/pool.d.ts +13 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +34 -0
- package/dist/pool.js.map +1 -0
- package/dist/result.d.ts +11 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +72 -0
- package/dist/result.js.map +1 -0
- package/dist/run.d.ts +86 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +240 -0
- package/dist/run.js.map +1 -0
- package/dist/score.d.ts +102 -0
- package/dist/score.d.ts.map +1 -0
- package/dist/score.js +433 -0
- package/dist/score.js.map +1 -0
- package/dist/storage.d.ts +218 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +577 -0
- package/dist/storage.js.map +1 -0
- package/dist/summary.d.ts +105 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +219 -0
- package/dist/summary.js.map +1 -0
- package/dist/types.d.ts +265 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/vault-store.d.ts +46 -0
- package/dist/vault-store.d.ts.map +1 -0
- package/dist/vault-store.js +127 -0
- package/dist/vault-store.js.map +1 -0
- package/package.json +27 -3
package/dist/storage.js
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Datasets, cases, versions and experiments over an injected store.
|
|
3
|
+
*
|
|
4
|
+
* The library does no I/O of its own: the CLI and ROC pass `vaultObjectStore`
|
|
5
|
+
* over a vault scope's objects, tests `memoryStore()`. Everything is plain JSON
|
|
6
|
+
* at the keys in layout.ts.
|
|
7
|
+
*/
|
|
8
|
+
import { WORKFLOWS_PREFIX, archiveKey, archivedIdFromKey, archivedPrefix, assertCaseId, assertDatasetName, assertExperimentId, assertWorkflowId, attemptFromKey, attemptKey, attemptsPrefix, canonicalJson, caseDirPrefix, caseIdFromKey, caseRevKey, casesPrefix, datasetsPrefix, experimentMetaKey, experimentsPrefix, headerKey, highest, isDatasetName, isExperimentId, isWorkflowId, revFromKey, runFromKey, runKey, runsPrefix, sha256Hex, tombstoneKey, versionFromKey, versionKey, versionsPrefix, } from "./layout.js";
|
|
9
|
+
import { EvalContractError, parseCase, parseExperiment, parseHeader, parseRunRecord, parseVersionManifest, } from "./contract.js";
|
|
10
|
+
/** The immediate child prefixes of `prefix`, through `store.listPrefixes` when it has one. */
|
|
11
|
+
export async function childPrefixes(store, prefix) {
|
|
12
|
+
if (store.listPrefixes)
|
|
13
|
+
return store.listPrefixes(prefix);
|
|
14
|
+
return prefixesOf(await store.list(prefix), prefix);
|
|
15
|
+
}
|
|
16
|
+
function prefixesOf(keys, prefix) {
|
|
17
|
+
const out = new Set();
|
|
18
|
+
for (const key of keys) {
|
|
19
|
+
if (!key.startsWith(prefix))
|
|
20
|
+
continue;
|
|
21
|
+
const slash = key.indexOf("/", prefix.length);
|
|
22
|
+
if (slash > prefix.length)
|
|
23
|
+
out.add(key.slice(0, slash + 1));
|
|
24
|
+
}
|
|
25
|
+
return [...out].sort();
|
|
26
|
+
}
|
|
27
|
+
/** An in-memory store, for tests and dry runs. */
|
|
28
|
+
export function memoryStore(seed) {
|
|
29
|
+
const map = new Map(Object.entries(seed ?? {}));
|
|
30
|
+
return {
|
|
31
|
+
async list(prefix) {
|
|
32
|
+
return [...map.keys()].filter((k) => k.startsWith(prefix)).sort();
|
|
33
|
+
},
|
|
34
|
+
async get(key) {
|
|
35
|
+
return map.get(key) ?? null;
|
|
36
|
+
},
|
|
37
|
+
async put(key, body) {
|
|
38
|
+
map.set(key, body);
|
|
39
|
+
},
|
|
40
|
+
async putIfAbsent(key, body) {
|
|
41
|
+
if (map.has(key))
|
|
42
|
+
return false;
|
|
43
|
+
map.set(key, body);
|
|
44
|
+
return true;
|
|
45
|
+
},
|
|
46
|
+
async listPrefixes(prefix) {
|
|
47
|
+
return prefixesOf(map.keys(), prefix);
|
|
48
|
+
},
|
|
49
|
+
atomicity: "single-threaded",
|
|
50
|
+
dump() {
|
|
51
|
+
return Object.fromEntries([...map].sort(([a], [b]) => a.localeCompare(b)));
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const readJson = async (store, key) => {
|
|
56
|
+
const raw = await store.get(key);
|
|
57
|
+
return raw === null ? null : JSON.parse(raw);
|
|
58
|
+
};
|
|
59
|
+
const checkNames = (workflowId, dataset) => {
|
|
60
|
+
assertWorkflowId(workflowId);
|
|
61
|
+
assertDatasetName(dataset);
|
|
62
|
+
};
|
|
63
|
+
/** Create a dataset. Refuses a name the workflow already has (names are unique per workflow). */
|
|
64
|
+
export async function createDataset(store, input) {
|
|
65
|
+
checkNames(input.workflowId, input.dataset);
|
|
66
|
+
const header = parseHeader({ ...input, createdAt: input.createdAt ?? new Date().toISOString() });
|
|
67
|
+
if (!(await store.putIfAbsent(headerKey(header.workflowId, header.dataset), canonicalJson(header)))) {
|
|
68
|
+
throw new EvalContractError(`workflow "${header.workflowId}" already has a dataset "${header.dataset}"`);
|
|
69
|
+
}
|
|
70
|
+
return header;
|
|
71
|
+
}
|
|
72
|
+
export async function getHeader(store, workflowId, dataset) {
|
|
73
|
+
checkNames(workflowId, dataset);
|
|
74
|
+
const raw = await readJson(store, headerKey(workflowId, dataset));
|
|
75
|
+
return raw === null ? null : parseHeader(raw);
|
|
76
|
+
}
|
|
77
|
+
/** Read the header, or throw naming the dataset. */
|
|
78
|
+
export async function requireHeader(store, workflowId, dataset) {
|
|
79
|
+
const header = await getHeader(store, workflowId, dataset);
|
|
80
|
+
if (!header) {
|
|
81
|
+
throw new EvalContractError(`dataset "${dataset}" does not exist for workflow "${workflowId}" (no header.json)`);
|
|
82
|
+
}
|
|
83
|
+
return header;
|
|
84
|
+
}
|
|
85
|
+
/** Replace the header (description, limits, baselineId). Versions keep the snapshot they were cut with. */
|
|
86
|
+
export async function updateHeader(store, header) {
|
|
87
|
+
const parsed = parseHeader(header);
|
|
88
|
+
await requireHeader(store, parsed.workflowId, parsed.dataset);
|
|
89
|
+
await store.put(headerKey(parsed.workflowId, parsed.dataset), canonicalJson(parsed));
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
/** Make `expId` the dataset's baseline — the experiment others are compared to. `null` clears it. */
|
|
93
|
+
export async function setBaseline(store, workflowId, dataset, expId) {
|
|
94
|
+
if (expId !== null)
|
|
95
|
+
assertExperimentId(expId);
|
|
96
|
+
const { baselineId: _old, ...header } = await requireHeader(store, workflowId, dataset);
|
|
97
|
+
return updateHeader(store, { ...header, ...(expId ? { baselineId: expId } : {}) });
|
|
98
|
+
}
|
|
99
|
+
/** The workflows that have anything stored: one delimiter listing. */
|
|
100
|
+
export async function listWorkflows(store) {
|
|
101
|
+
return (await childPrefixes(store, WORKFLOWS_PREFIX))
|
|
102
|
+
.map((p) => p.slice(WORKFLOWS_PREFIX.length, -1))
|
|
103
|
+
.filter(isWorkflowId)
|
|
104
|
+
.sort();
|
|
105
|
+
}
|
|
106
|
+
/** A workflow's dataset names: one delimiter listing, not the whole tree. */
|
|
107
|
+
async function datasetNames(store, workflowId) {
|
|
108
|
+
const at = datasetsPrefix(workflowId);
|
|
109
|
+
return (await childPrefixes(store, at))
|
|
110
|
+
.map((p) => p.slice(at.length, -1))
|
|
111
|
+
.filter(isDatasetName)
|
|
112
|
+
.sort();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A workflow's datasets.
|
|
116
|
+
*
|
|
117
|
+
* Listed by part, never as one tree: cases, flags and versions are listed under
|
|
118
|
+
* their own prefixes. Experiments are a sibling of the datasets, so each one's
|
|
119
|
+
* meta is read once to see which dataset it ran.
|
|
120
|
+
*/
|
|
121
|
+
export async function listDatasets(store, workflowId) {
|
|
122
|
+
assertWorkflowId(workflowId);
|
|
123
|
+
const runs = new Map();
|
|
124
|
+
for (const exp of await listExperiments(store, workflowId))
|
|
125
|
+
runs.set(exp.dataset, (runs.get(exp.dataset) ?? 0) + 1);
|
|
126
|
+
const out = [];
|
|
127
|
+
for (const dataset of await datasetNames(store, workflowId)) {
|
|
128
|
+
const header = await getHeader(store, workflowId, dataset);
|
|
129
|
+
if (!header)
|
|
130
|
+
continue;
|
|
131
|
+
out.push({
|
|
132
|
+
dataset,
|
|
133
|
+
workflowId,
|
|
134
|
+
...(header.description !== undefined ? { description: header.description } : {}),
|
|
135
|
+
...(header.baselineId !== undefined ? { baselineId: header.baselineId } : {}),
|
|
136
|
+
cases: (await liveCaseIds(store, workflowId, dataset)).length,
|
|
137
|
+
latestVersion: await latestVersionNumber(store, workflowId, dataset),
|
|
138
|
+
experiments: runs.get(dataset) ?? 0,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
/** A marker body. Absent or `{on:false}` means off — so clearing never needs a delete. */
|
|
144
|
+
function parseFlag(raw) {
|
|
145
|
+
if (raw === null)
|
|
146
|
+
return { on: false };
|
|
147
|
+
try {
|
|
148
|
+
const o = JSON.parse(raw);
|
|
149
|
+
return {
|
|
150
|
+
on: o.on !== false,
|
|
151
|
+
...(typeof o.at === "string" ? { at: o.at } : {}),
|
|
152
|
+
...(Array.isArray(o.pinnedBy) ? { pinnedBy: o.pinnedBy.filter((n) => typeof n === "number") } : {}),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return { on: true };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function caseIdsIn(store, workflowId, dataset) {
|
|
160
|
+
checkNames(workflowId, dataset);
|
|
161
|
+
const all = [
|
|
162
|
+
...await store.list(casesPrefix(workflowId, dataset)),
|
|
163
|
+
...await store.list(archivedPrefix(workflowId, dataset)),
|
|
164
|
+
];
|
|
165
|
+
const ids = new Set();
|
|
166
|
+
const tombstoned = [];
|
|
167
|
+
const marked = [];
|
|
168
|
+
for (const key of all) {
|
|
169
|
+
const archivedId = archivedIdFromKey(workflowId, dataset, key);
|
|
170
|
+
if (archivedId) {
|
|
171
|
+
marked.push(archivedId);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const id = caseIdFromKey(workflowId, dataset, key);
|
|
175
|
+
if (!id)
|
|
176
|
+
continue;
|
|
177
|
+
if (key === tombstoneKey(workflowId, dataset, id))
|
|
178
|
+
tombstoned.push(id);
|
|
179
|
+
else if (revFromKey(workflowId, dataset, id, key) !== null)
|
|
180
|
+
ids.add(id);
|
|
181
|
+
}
|
|
182
|
+
const deleted = new Set();
|
|
183
|
+
for (const id of tombstoned)
|
|
184
|
+
if (parseFlag(await store.get(tombstoneKey(workflowId, dataset, id))).on)
|
|
185
|
+
deleted.add(id);
|
|
186
|
+
const archived = new Set();
|
|
187
|
+
for (const id of marked)
|
|
188
|
+
if (parseFlag(await store.get(archiveKey(workflowId, dataset, id))).on)
|
|
189
|
+
archived.add(id);
|
|
190
|
+
return { ids, deleted, archived };
|
|
191
|
+
}
|
|
192
|
+
async function liveCaseIds(store, workflowId, dataset) {
|
|
193
|
+
const { ids, deleted, archived } = await caseIdsIn(store, workflowId, dataset);
|
|
194
|
+
return [...ids].filter((id) => !deleted.has(id) && !archived.has(id)).sort();
|
|
195
|
+
}
|
|
196
|
+
/** Case ids in the working set. Archived ones only when asked; deleted ones never. */
|
|
197
|
+
export async function listCaseIds(store, workflowId, dataset, opts = {}) {
|
|
198
|
+
const { ids, deleted, archived } = await caseIdsIn(store, workflowId, dataset);
|
|
199
|
+
return [...ids].filter((id) => !deleted.has(id) && (opts.includeArchived || !archived.has(id))).sort();
|
|
200
|
+
}
|
|
201
|
+
export async function listArchivedCaseIds(store, workflowId, dataset) {
|
|
202
|
+
const { ids, deleted, archived } = await caseIdsIn(store, workflowId, dataset);
|
|
203
|
+
return [...ids].filter((id) => archived.has(id) && !deleted.has(id)).sort();
|
|
204
|
+
}
|
|
205
|
+
/** Case ids whose tombstone is on. Their revisions stay, and their ids stay taken. */
|
|
206
|
+
export async function listDeletedCaseIds(store, workflowId, dataset) {
|
|
207
|
+
const { ids, deleted } = await caseIdsIn(store, workflowId, dataset);
|
|
208
|
+
return [...ids].filter((id) => deleted.has(id)).sort();
|
|
209
|
+
}
|
|
210
|
+
export async function listCaseRevisions(store, workflowId, dataset, caseId) {
|
|
211
|
+
checkNames(workflowId, dataset);
|
|
212
|
+
const keys = await store.list(caseDirPrefix(workflowId, dataset, caseId));
|
|
213
|
+
return keys
|
|
214
|
+
.map((k) => revFromKey(workflowId, dataset, caseId, k))
|
|
215
|
+
.filter((r) => r !== null)
|
|
216
|
+
.sort((a, b) => a - b);
|
|
217
|
+
}
|
|
218
|
+
export async function getCaseRevision(store, workflowId, dataset, caseId, rev) {
|
|
219
|
+
checkNames(workflowId, dataset);
|
|
220
|
+
const raw = await readJson(store, caseRevKey(workflowId, dataset, caseId, rev));
|
|
221
|
+
return raw === null ? null : parseCase(raw);
|
|
222
|
+
}
|
|
223
|
+
/** The latest revision of a live (not deleted) case, with its number. */
|
|
224
|
+
export async function getCase(store, workflowId, dataset, caseId) {
|
|
225
|
+
checkNames(workflowId, dataset);
|
|
226
|
+
assertCaseId(caseId);
|
|
227
|
+
const keys = await store.list(caseDirPrefix(workflowId, dataset, caseId));
|
|
228
|
+
const tomb = tombstoneKey(workflowId, dataset, caseId);
|
|
229
|
+
if (keys.includes(tomb) && parseFlag(await store.get(tomb)).on)
|
|
230
|
+
return null;
|
|
231
|
+
const rev = highest(keys, (k) => revFromKey(workflowId, dataset, caseId, k));
|
|
232
|
+
if (rev === 0)
|
|
233
|
+
return null;
|
|
234
|
+
const c = await getCaseRevision(store, workflowId, dataset, caseId, rev);
|
|
235
|
+
return c ? { case: c, rev } : null;
|
|
236
|
+
}
|
|
237
|
+
async function refuseDeleted(store, workflowId, dataset, caseId) {
|
|
238
|
+
const flag = parseFlag(await store.get(tombstoneKey(workflowId, dataset, caseId)));
|
|
239
|
+
if (flag.on) {
|
|
240
|
+
throw new EvalContractError(`case "${caseId}" in "${dataset}" is deleted — undeleteCase puts it back; its id stays taken`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const REV_ATTEMPTS = 50;
|
|
244
|
+
/**
|
|
245
|
+
* Save a case: the first revision if it is new, the next one if its content
|
|
246
|
+
* changed, nothing if it is identical to the latest. This is what `cef eval
|
|
247
|
+
* push` and ROC's editor both call.
|
|
248
|
+
*
|
|
249
|
+
* SINGLE WRITER PER CASE for the "nothing if identical" promise. Revision
|
|
250
|
+
* numbers are safe under any concurrency (`putIfAbsent` gives each writer its
|
|
251
|
+
* own), but the identical-content check reads the latest revision before
|
|
252
|
+
* writing: two writers saving the SAME new content at once can both see the
|
|
253
|
+
* old latest and each write a revision, leaving two identical consecutive
|
|
254
|
+
* revisions. Nothing is lost — versions pin by sha256, and the next save of
|
|
255
|
+
* that content is a no-op — it is only a redundant revision. The same holds
|
|
256
|
+
* for `addCase`'s "refuses an id that exists".
|
|
257
|
+
*/
|
|
258
|
+
export async function saveCase(store, workflowId, dataset, c) {
|
|
259
|
+
await requireHeader(store, workflowId, dataset);
|
|
260
|
+
const parsed = parseCase(c);
|
|
261
|
+
await refuseDeleted(store, workflowId, dataset, parsed.id);
|
|
262
|
+
const body = canonicalJson(parsed);
|
|
263
|
+
const revs = await listCaseRevisions(store, workflowId, dataset, parsed.id);
|
|
264
|
+
const latest = revs[revs.length - 1];
|
|
265
|
+
if (latest !== undefined && (await store.get(caseRevKey(workflowId, dataset, parsed.id, latest))) === body) {
|
|
266
|
+
return { rev: latest, changed: false, created: false };
|
|
267
|
+
}
|
|
268
|
+
let next = (latest ?? 0) + 1;
|
|
269
|
+
for (let i = 0; i < REV_ATTEMPTS; i++, next++) {
|
|
270
|
+
if (await store.putIfAbsent(caseRevKey(workflowId, dataset, parsed.id, next), body)) {
|
|
271
|
+
return { rev: next, changed: true, created: latest === undefined };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
throw new EvalContractError(`case "${parsed.id}" in "${dataset}": ${REV_ATTEMPTS} consecutive revisions were taken by other writers`);
|
|
275
|
+
}
|
|
276
|
+
/** Add a new case; refuses an id that exists. */
|
|
277
|
+
export async function addCase(store, workflowId, dataset, c) {
|
|
278
|
+
const parsed = parseCase(c);
|
|
279
|
+
if ((await listCaseRevisions(store, workflowId, dataset, parsed.id)).length > 0) {
|
|
280
|
+
throw new EvalContractError(`case "${parsed.id}" already exists in "${dataset}" — edit it instead`);
|
|
281
|
+
}
|
|
282
|
+
const { rev } = await saveCase(store, workflowId, dataset, parsed);
|
|
283
|
+
return { rev };
|
|
284
|
+
}
|
|
285
|
+
/** Hide a case from new versions without touching its bytes; versions that pin it still load. */
|
|
286
|
+
export async function archiveCase(store, workflowId, dataset, caseId) {
|
|
287
|
+
if (!(await getCase(store, workflowId, dataset, caseId))) {
|
|
288
|
+
throw new EvalContractError(`case "${caseId}" not found in "${dataset}"`);
|
|
289
|
+
}
|
|
290
|
+
await store.put(archiveKey(workflowId, dataset, caseId), canonicalJson({ on: true, at: new Date().toISOString() }));
|
|
291
|
+
}
|
|
292
|
+
export async function unarchiveCase(store, workflowId, dataset, caseId) {
|
|
293
|
+
checkNames(workflowId, dataset);
|
|
294
|
+
assertCaseId(caseId);
|
|
295
|
+
await store.put(archiveKey(workflowId, dataset, caseId), canonicalJson({ on: false, at: new Date().toISOString() }));
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Delete a case from the working set. Its revisions stay — a version may pin
|
|
299
|
+
* them, and a write-once store has no business removing what a reproducibility
|
|
300
|
+
* record points at — and its id stays taken.
|
|
301
|
+
*/
|
|
302
|
+
export async function deleteCase(store, workflowId, dataset, caseId) {
|
|
303
|
+
if ((await listCaseRevisions(store, workflowId, dataset, caseId)).length === 0) {
|
|
304
|
+
throw new EvalContractError(`case "${caseId}" not found in "${dataset}"`);
|
|
305
|
+
}
|
|
306
|
+
const pinnedBy = await versionsPinning(store, workflowId, dataset, caseId);
|
|
307
|
+
await store.put(tombstoneKey(workflowId, dataset, caseId), canonicalJson({ on: true, at: new Date().toISOString(), pinnedBy }));
|
|
308
|
+
return { pinnedBy };
|
|
309
|
+
}
|
|
310
|
+
export async function undeleteCase(store, workflowId, dataset, caseId) {
|
|
311
|
+
if ((await listCaseRevisions(store, workflowId, dataset, caseId)).length === 0) {
|
|
312
|
+
throw new EvalContractError(`case "${caseId}" not found in "${dataset}"`);
|
|
313
|
+
}
|
|
314
|
+
await store.put(tombstoneKey(workflowId, dataset, caseId), canonicalJson({ on: false, at: new Date().toISOString() }));
|
|
315
|
+
}
|
|
316
|
+
/** The working set: every live case at its latest revision. */
|
|
317
|
+
export async function loadWorkingSet(store, workflowId, dataset) {
|
|
318
|
+
const header = await requireHeader(store, workflowId, dataset);
|
|
319
|
+
const cases = [];
|
|
320
|
+
for (const id of await listCaseIds(store, workflowId, dataset)) {
|
|
321
|
+
const got = await getCase(store, workflowId, dataset, id);
|
|
322
|
+
if (got)
|
|
323
|
+
cases.push(got);
|
|
324
|
+
}
|
|
325
|
+
return { header, cases };
|
|
326
|
+
}
|
|
327
|
+
/* ------------------------------------------------------------------------ */
|
|
328
|
+
/* Versions */
|
|
329
|
+
/* ------------------------------------------------------------------------ */
|
|
330
|
+
export async function listVersions(store, workflowId, dataset) {
|
|
331
|
+
checkNames(workflowId, dataset);
|
|
332
|
+
const keys = await store.list(versionsPrefix(workflowId, dataset));
|
|
333
|
+
const out = [];
|
|
334
|
+
for (const key of keys) {
|
|
335
|
+
const v = versionFromKey(workflowId, dataset, key);
|
|
336
|
+
if (v === null)
|
|
337
|
+
continue;
|
|
338
|
+
const raw = await readJson(store, key);
|
|
339
|
+
if (raw !== null)
|
|
340
|
+
out.push(parseVersionManifest(raw, dataset, v));
|
|
341
|
+
}
|
|
342
|
+
return out.sort((a, b) => a.version - b.version);
|
|
343
|
+
}
|
|
344
|
+
export async function latestVersionNumber(store, workflowId, dataset) {
|
|
345
|
+
checkNames(workflowId, dataset);
|
|
346
|
+
return highest(await store.list(versionsPrefix(workflowId, dataset)), (k) => versionFromKey(workflowId, dataset, k)) || null;
|
|
347
|
+
}
|
|
348
|
+
export async function getVersion(store, workflowId, dataset, version) {
|
|
349
|
+
checkNames(workflowId, dataset);
|
|
350
|
+
const raw = await readJson(store, versionKey(workflowId, dataset, version));
|
|
351
|
+
if (raw === null)
|
|
352
|
+
throw new EvalContractError(`dataset "${dataset}" has no version v${version}`);
|
|
353
|
+
return parseVersionManifest(raw, dataset, version);
|
|
354
|
+
}
|
|
355
|
+
async function versionsPinning(store, workflowId, dataset, caseId) {
|
|
356
|
+
return (await listVersions(store, workflowId, dataset))
|
|
357
|
+
.filter((m) => m.cases.some((c) => c.id === caseId))
|
|
358
|
+
.map((m) => m.version);
|
|
359
|
+
}
|
|
360
|
+
const CUT_ATTEMPTS = 5;
|
|
361
|
+
async function entriesOf(cases) {
|
|
362
|
+
const entries = [];
|
|
363
|
+
for (const { case: c, rev } of cases)
|
|
364
|
+
entries.push({ id: c.id, rev, sha256: await sha256Hex(canonicalJson(c)) });
|
|
365
|
+
return entries;
|
|
366
|
+
}
|
|
367
|
+
async function writeNextVersion(store, header, entries, opts) {
|
|
368
|
+
const { workflowId, dataset } = header;
|
|
369
|
+
const taken = [];
|
|
370
|
+
for (let attempt = 0; attempt < CUT_ATTEMPTS; attempt++) {
|
|
371
|
+
const next = ((await latestVersionNumber(store, workflowId, dataset)) ?? 0) + 1;
|
|
372
|
+
const manifest = {
|
|
373
|
+
version: next,
|
|
374
|
+
header,
|
|
375
|
+
cases: entries,
|
|
376
|
+
createdAt: (opts.now ?? new Date()).toISOString(),
|
|
377
|
+
...(opts.note ? { note: opts.note } : {}),
|
|
378
|
+
};
|
|
379
|
+
if (await store.putIfAbsent(versionKey(workflowId, dataset, next), canonicalJson(manifest)))
|
|
380
|
+
return manifest;
|
|
381
|
+
taken.push(next);
|
|
382
|
+
}
|
|
383
|
+
throw new EvalContractError(`dataset "${dataset}": v${taken.join(", v")} were each claimed by another writer while cutting — nothing was overwritten; retry`);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Freeze the working set as the next version: every live case pinned at its
|
|
387
|
+
* latest revision by sha256, with a snapshot of the header.
|
|
388
|
+
*/
|
|
389
|
+
export async function cutVersion(store, workflowId, dataset, opts = {}) {
|
|
390
|
+
const { header, cases } = await loadWorkingSet(store, workflowId, dataset);
|
|
391
|
+
if (cases.length === 0)
|
|
392
|
+
throw new EvalContractError(`dataset "${dataset}" has no live cases — nothing to version`);
|
|
393
|
+
return writeNextVersion(store, header, await entriesOf(cases), opts);
|
|
394
|
+
}
|
|
395
|
+
/** How the cases in `to` differ from those in `from`, by id and revision. Each list sorted. */
|
|
396
|
+
export function diffVersionEntries(from, to) {
|
|
397
|
+
const a = new Map(from.map((e) => [e.id, e.rev]));
|
|
398
|
+
const b = new Map(to.map((e) => [e.id, e.rev]));
|
|
399
|
+
const added = [...b.keys()].filter((id) => !a.has(id)).sort();
|
|
400
|
+
const removed = [...a.keys()].filter((id) => !b.has(id)).sort();
|
|
401
|
+
const edited = [...b.keys()].filter((id) => a.has(id) && a.get(id) !== b.get(id)).sort();
|
|
402
|
+
return { added, removed, edited };
|
|
403
|
+
}
|
|
404
|
+
const isEmptyDiff = (d) => !d.added.length && !d.removed.length && !d.edited.length;
|
|
405
|
+
/** The note an automatic cut carries. `versionHistory` tells auto from manual cuts by its prefix. */
|
|
406
|
+
export const autoVersionNote = (d) => `auto: ${d.added.length} added, ${d.edited.length} edited, ${d.removed.length} removed`;
|
|
407
|
+
/**
|
|
408
|
+
* The dataset version an experiment should run when none was chosen: the
|
|
409
|
+
* latest, if the working set (live cases at their latest revisions) is exactly
|
|
410
|
+
* what it pins; otherwise a new version, cut now with an `auto:` note.
|
|
411
|
+
*
|
|
412
|
+
* Revisions are write-once and numbered, so "same id at the same rev" is "same
|
|
413
|
+
* bytes" — no hashing is needed to decide.
|
|
414
|
+
*/
|
|
415
|
+
export async function ensureDatasetVersion(store, workflowId, dataset, opts = {}) {
|
|
416
|
+
const { header, cases } = await loadWorkingSet(store, workflowId, dataset);
|
|
417
|
+
if (cases.length === 0)
|
|
418
|
+
throw new EvalContractError(`dataset "${dataset}" has no live cases — nothing to run`);
|
|
419
|
+
const latest = await latestVersionNumber(store, workflowId, dataset);
|
|
420
|
+
const current = latest === null ? undefined : await getVersion(store, workflowId, dataset, latest);
|
|
421
|
+
const working = cases.map(({ case: c, rev }) => ({ id: c.id, rev }));
|
|
422
|
+
const diff = diffVersionEntries(current?.cases ?? [], working);
|
|
423
|
+
if (current && isEmptyDiff(diff))
|
|
424
|
+
return { version: current.version, created: false, diff, manifest: current };
|
|
425
|
+
const manifest = await writeNextVersion(store, header, await entriesOf(cases), {
|
|
426
|
+
note: autoVersionNote(diff),
|
|
427
|
+
...(opts.now ? { now: opts.now } : {}),
|
|
428
|
+
});
|
|
429
|
+
return { version: manifest.version, created: true, diff, manifest };
|
|
430
|
+
}
|
|
431
|
+
/** A dataset's versions, newest first, each with what changed and how many experiments ran it. */
|
|
432
|
+
export async function versionHistory(store, workflowId, dataset) {
|
|
433
|
+
const versions = await listVersions(store, workflowId, dataset);
|
|
434
|
+
const ran = new Map();
|
|
435
|
+
for (const e of await listExperiments(store, workflowId, { dataset })) {
|
|
436
|
+
ran.set(e.datasetVersion, (ran.get(e.datasetVersion) ?? 0) + 1);
|
|
437
|
+
}
|
|
438
|
+
return versions.map((m, i) => ({
|
|
439
|
+
version: m.version,
|
|
440
|
+
createdAt: m.createdAt,
|
|
441
|
+
...(m.note !== undefined ? { note: m.note } : {}),
|
|
442
|
+
auto: (m.note ?? "").startsWith("auto:"),
|
|
443
|
+
cases: m.cases.length,
|
|
444
|
+
diff: diffVersionEntries(versions[i - 1]?.cases ?? [], m.cases),
|
|
445
|
+
experiments: ran.get(m.version) ?? 0,
|
|
446
|
+
})).reverse();
|
|
447
|
+
}
|
|
448
|
+
/** A version's cases, each checked against the sha256 the version pinned. */
|
|
449
|
+
export async function loadVersion(store, workflowId, dataset, version) {
|
|
450
|
+
const manifest = await getVersion(store, workflowId, dataset, version);
|
|
451
|
+
const cases = [];
|
|
452
|
+
for (const entry of manifest.cases) {
|
|
453
|
+
const raw = await store.get(caseRevKey(workflowId, dataset, entry.id, entry.rev));
|
|
454
|
+
if (raw === null) {
|
|
455
|
+
throw new EvalContractError(`"${dataset}" v${version} pins case "${entry.id}"@r${entry.rev}, which is not in storage`);
|
|
456
|
+
}
|
|
457
|
+
/*
|
|
458
|
+
* The stored bytes are what the version pinned (saveCase writes the
|
|
459
|
+
* canonical JSON a cut hashes), so they are hashed as they are: a re-parse
|
|
460
|
+
* would make every old version "no longer reproduce" the day the parser
|
|
461
|
+
* drops or normalises a field. The re-derived hash is the fallback for a
|
|
462
|
+
* revision some other writer stored with keys this parser drops — a cut
|
|
463
|
+
* pins the parsed form of those.
|
|
464
|
+
*/
|
|
465
|
+
const c = parseCase(JSON.parse(raw));
|
|
466
|
+
const actual = await sha256Hex(raw);
|
|
467
|
+
if (actual !== entry.sha256 && (await sha256Hex(canonicalJson(c))) !== entry.sha256) {
|
|
468
|
+
throw new EvalContractError(`case "${entry.id}"@r${entry.rev} does not match the sha256 "${dataset}" v${version} pinned `
|
|
469
|
+
+ `(pinned ${entry.sha256.slice(0, 12)}, found ${actual.slice(0, 12)}) — this version no longer reproduces`);
|
|
470
|
+
}
|
|
471
|
+
cases.push({ case: c, rev: entry.rev });
|
|
472
|
+
}
|
|
473
|
+
return { manifest, cases };
|
|
474
|
+
}
|
|
475
|
+
/* ------------------------------------------------------------------------ */
|
|
476
|
+
/* Experiments */
|
|
477
|
+
/* ------------------------------------------------------------------------ */
|
|
478
|
+
/** Write an experiment's meta. Mutable: it moves running → done/cancelled/error. */
|
|
479
|
+
export async function putExperiment(store, exp) {
|
|
480
|
+
assertWorkflowId(exp.workflowId);
|
|
481
|
+
assertDatasetName(exp.dataset);
|
|
482
|
+
assertExperimentId(exp.id);
|
|
483
|
+
await store.put(experimentMetaKey(exp.workflowId, exp.id), canonicalJson(exp));
|
|
484
|
+
}
|
|
485
|
+
const ATTEMPT_CLAIMS = 50;
|
|
486
|
+
/**
|
|
487
|
+
* Claim the next attempt of an experiment: `putIfAbsent` on `attempts/a<n>.json`
|
|
488
|
+
* from just past the highest attempt on file (or `atLeast`, the meta's), n
|
|
489
|
+
* upward until this call wins one. Two resumers of one experiment therefore
|
|
490
|
+
* never hold the same attempt, and so never publish into the same run
|
|
491
|
+
* contexts — reading the meta's `attempt` and writing it back +1 would let both
|
|
492
|
+
* compute the same number.
|
|
493
|
+
*/
|
|
494
|
+
export async function claimAttempt(store, workflowId, expId, opts = {}) {
|
|
495
|
+
assertWorkflowId(workflowId);
|
|
496
|
+
assertExperimentId(expId);
|
|
497
|
+
const onFile = highest(await store.list(attemptsPrefix(workflowId, expId)), (k) => attemptFromKey(workflowId, expId, k));
|
|
498
|
+
let next = Math.max(onFile + 1, opts.atLeast ?? 1);
|
|
499
|
+
for (let i = 0; i < ATTEMPT_CLAIMS; i++, next++) {
|
|
500
|
+
const body = canonicalJson({ attempt: next, ...(opts.claimedAt ? { claimedAt: opts.claimedAt } : {}) });
|
|
501
|
+
if (await store.putIfAbsent(attemptKey(workflowId, expId, next), body))
|
|
502
|
+
return next;
|
|
503
|
+
}
|
|
504
|
+
throw new EvalContractError(`experiment "${expId}": ${ATTEMPT_CLAIMS} consecutive attempts were claimed by other resumers`);
|
|
505
|
+
}
|
|
506
|
+
export async function getExperiment(store, workflowId, expId) {
|
|
507
|
+
assertWorkflowId(workflowId);
|
|
508
|
+
assertExperimentId(expId);
|
|
509
|
+
const raw = await readJson(store, experimentMetaKey(workflowId, expId));
|
|
510
|
+
return raw === null ? null : parseExperiment(raw, `experiment "${expId}"`);
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* A workflow's experiments, oldest first (ids sort by creation time); only one
|
|
514
|
+
* dataset's when asked. One delimiter listing and one read per experiment —
|
|
515
|
+
* never a listing of their run records.
|
|
516
|
+
*/
|
|
517
|
+
export async function listExperiments(store, workflowId, opts = {}) {
|
|
518
|
+
assertWorkflowId(workflowId);
|
|
519
|
+
const at = experimentsPrefix(workflowId);
|
|
520
|
+
const out = [];
|
|
521
|
+
for (const prefix of await childPrefixes(store, at)) {
|
|
522
|
+
const id = prefix.slice(at.length, -1);
|
|
523
|
+
if (!isExperimentId(id))
|
|
524
|
+
continue;
|
|
525
|
+
const raw = await readJson(store, experimentMetaKey(workflowId, id));
|
|
526
|
+
if (raw === null)
|
|
527
|
+
continue;
|
|
528
|
+
const exp = parseExperiment(raw, `experiment "${id}"`);
|
|
529
|
+
if (opts.dataset === undefined || exp.dataset === opts.dataset)
|
|
530
|
+
out.push(exp);
|
|
531
|
+
}
|
|
532
|
+
return out.sort((a, b) => a.id.localeCompare(b.id));
|
|
533
|
+
}
|
|
534
|
+
/** Write one run record, once. False when it was already there (a resumed experiment). */
|
|
535
|
+
export async function putRunRecord(store, workflowId, expId, run) {
|
|
536
|
+
assertWorkflowId(workflowId);
|
|
537
|
+
return store.putIfAbsent(runKey(workflowId, expId, run.caseId, run.repeat), canonicalJson(run));
|
|
538
|
+
}
|
|
539
|
+
export async function getRunRecord(store, workflowId, expId, caseId, repeat) {
|
|
540
|
+
assertWorkflowId(workflowId);
|
|
541
|
+
const key = runKey(workflowId, expId, caseId, repeat);
|
|
542
|
+
const raw = await readJson(store, key);
|
|
543
|
+
return raw === null ? null : parseRunRecord(raw, key);
|
|
544
|
+
}
|
|
545
|
+
/** Every run record of an experiment, by case id then repeat. */
|
|
546
|
+
export async function listRunRecords(store, workflowId, expId) {
|
|
547
|
+
assertWorkflowId(workflowId);
|
|
548
|
+
const keys = await store.list(runsPrefix(workflowId, expId));
|
|
549
|
+
const out = [];
|
|
550
|
+
for (const key of keys) {
|
|
551
|
+
if (!runFromKey(workflowId, expId, key))
|
|
552
|
+
continue;
|
|
553
|
+
const raw = await readJson(store, key);
|
|
554
|
+
if (raw !== null)
|
|
555
|
+
out.push(parseRunRecord(raw, key));
|
|
556
|
+
}
|
|
557
|
+
return out.sort((a, b) => a.caseId.localeCompare(b.caseId) || a.repeat - b.repeat);
|
|
558
|
+
}
|
|
559
|
+
/** An experiment and its runs. */
|
|
560
|
+
export async function loadExperiment(store, workflowId, expId) {
|
|
561
|
+
const experiment = await getExperiment(store, workflowId, expId);
|
|
562
|
+
if (!experiment)
|
|
563
|
+
throw new EvalContractError(`experiment "${expId}" not found for workflow "${workflowId}"`);
|
|
564
|
+
return { experiment, runs: await listRunRecords(store, workflowId, expId) };
|
|
565
|
+
}
|
|
566
|
+
/** Find an experiment by id when the workflow is not known (the CLI's `compare`). */
|
|
567
|
+
export async function findExperiment(store, expId) {
|
|
568
|
+
assertExperimentId(expId);
|
|
569
|
+
// One read per workflow at the key the experiment would have — no tree listing.
|
|
570
|
+
for (const workflowId of await listWorkflows(store)) {
|
|
571
|
+
const found = await getExperiment(store, workflowId, expId);
|
|
572
|
+
if (found)
|
|
573
|
+
return found;
|
|
574
|
+
}
|
|
575
|
+
return null;
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|