@deepthonk/core 0.1.5 → 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 +21 -9
- package/dist/artifacts.js +20 -1
- package/dist/artifacts.js.map +1 -1
- package/dist/bradleyTerry.d.ts +1 -0
- package/dist/bradleyTerry.js +27 -2
- package/dist/bradleyTerry.js.map +1 -1
- package/dist/checkpointStore.d.ts +56 -0
- package/dist/checkpointStore.js +351 -0
- package/dist/checkpointStore.js.map +1 -0
- package/dist/critique.d.ts +3 -1
- package/dist/critique.js +24 -9
- package/dist/critique.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +1 -0
- package/dist/phaseRunner.d.ts +6 -1
- package/dist/phaseRunner.js +53 -19
- package/dist/phaseRunner.js.map +1 -1
- package/dist/resume.d.ts +6 -1
- package/dist/resume.js +56 -24
- package/dist/resume.js.map +1 -1
- package/dist/runner.d.ts +1 -0
- package/dist/runner.js +705 -276
- package/dist/runner.js.map +1 -1
- package/dist/schemas.d.ts +95 -0
- package/dist/schemas.js +43 -3
- package/dist/schemas.js.map +1 -1
- package/dist/services.d.ts +8 -0
- package/dist/services.js +77 -12
- package/dist/services.js.map +1 -1
- package/dist/traceStore.d.ts +27 -1
- package/dist/traceStore.js +143 -9
- package/dist/traceStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { ConfigError } from "./errors.js";
|
|
5
|
+
import { runLimitedPhase } from "./phaseRunner.js";
|
|
6
|
+
export const traceSchemaVersion = 2;
|
|
7
|
+
export async function runCheckpointedPhase(options) {
|
|
8
|
+
assertUniqueWorkIds(options.jobs);
|
|
9
|
+
const manifest = await ensurePhaseManifest(options.runDir, options.phaseKey, options.jobs);
|
|
10
|
+
const results = new Array(options.jobs.length);
|
|
11
|
+
const missing = [];
|
|
12
|
+
const reused = [];
|
|
13
|
+
for (let index = 0; index < options.jobs.length; index += 1) {
|
|
14
|
+
const job = options.jobs[index];
|
|
15
|
+
const inputHash = manifest.work[index].input_hash;
|
|
16
|
+
const checkpoint = await readValidCheckpoint(options.runDir, options.phaseKey, job.id, inputHash, options.validateOutput);
|
|
17
|
+
if (!checkpoint) {
|
|
18
|
+
missing.push({ index, job, inputHash });
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
results[index] = checkpoint.output;
|
|
22
|
+
reused.push({ job, checkpoint });
|
|
23
|
+
}
|
|
24
|
+
if (options.onResult && reused.length > 0) {
|
|
25
|
+
function* reusedCallbacks() {
|
|
26
|
+
for (const item of reused) {
|
|
27
|
+
yield async () => {
|
|
28
|
+
await options.onResult(item.checkpoint.output, {
|
|
29
|
+
workId: item.job.id,
|
|
30
|
+
reused: true,
|
|
31
|
+
receiptUsage: item.checkpoint.usage
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Receipt replay is local I/O, not provider work. Give it a separate bounded
|
|
37
|
+
// fan-out so TraceStore can coalesce append-ready rows even when model
|
|
38
|
+
// concurrency is deliberately one.
|
|
39
|
+
await runLimitedPhase(reusedCallbacks(), Math.min(32, reused.length), { signal: options.signal });
|
|
40
|
+
}
|
|
41
|
+
function* pendingJobs() {
|
|
42
|
+
for (const pending of missing) {
|
|
43
|
+
yield async (signal) => {
|
|
44
|
+
const output = await pending.job.run(signal);
|
|
45
|
+
if (options.validateOutput && !options.validateOutput(output)) {
|
|
46
|
+
throw new ConfigError(`Checkpoint job ${pending.job.id} produced an invalid output.`, {
|
|
47
|
+
code: "trace.checkpoint_output_invalid",
|
|
48
|
+
retryable: false
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const usage = pending.job.receiptUsage?.();
|
|
52
|
+
await writeCheckpoint(options.runDir, options.phaseKey, pending.job.id, pending.inputHash, output, usage);
|
|
53
|
+
await options.onResult?.(output, { workId: pending.job.id, reused: false, receiptUsage: usage });
|
|
54
|
+
return { index: pending.index, output };
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const completed = await runLimitedPhase(pendingJobs(), options.concurrency, { signal: options.signal });
|
|
59
|
+
for (const item of completed)
|
|
60
|
+
results[item.index] = item.output;
|
|
61
|
+
if (results.some((value) => value === undefined)) {
|
|
62
|
+
throw new ConfigError(`Phase ${options.phaseKey} did not produce every checkpointed result.`, {
|
|
63
|
+
code: "trace.checkpoint_incomplete",
|
|
64
|
+
retryable: true
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return results;
|
|
68
|
+
}
|
|
69
|
+
export async function writePhaseCommit(runDir, phaseKey, artifacts) {
|
|
70
|
+
await readJsonStrictOptional(commitPath(runDir, phaseKey));
|
|
71
|
+
const manifest = await readPhaseManifest(runDir, phaseKey);
|
|
72
|
+
if (!manifest)
|
|
73
|
+
throw traceIntegrityError(`Missing manifest for phase ${phaseKey}.`);
|
|
74
|
+
validateManifest(manifest, phaseKey);
|
|
75
|
+
const checkpointHashes = {};
|
|
76
|
+
for (const work of manifest.work) {
|
|
77
|
+
const checkpoint = await readValidCheckpoint(runDir, phaseKey, work.work_id, work.input_hash);
|
|
78
|
+
if (!checkpoint)
|
|
79
|
+
throw traceIntegrityError(`Missing or invalid checkpoint ${work.work_id} for phase ${phaseKey}.`);
|
|
80
|
+
checkpointHashes[work.work_id] = checkpointBindingHash(checkpoint);
|
|
81
|
+
}
|
|
82
|
+
const commit = {
|
|
83
|
+
schema_version: 2,
|
|
84
|
+
phase_key: phaseKey,
|
|
85
|
+
manifest_hash: manifest.manifest_hash,
|
|
86
|
+
checkpoint_hashes: checkpointHashes,
|
|
87
|
+
artifact_hashes: Object.fromEntries(Object.entries(artifacts).map(([name, value]) => [name, hashValue(value)])),
|
|
88
|
+
committed_at: new Date().toISOString()
|
|
89
|
+
};
|
|
90
|
+
await writeJsonAtomic(commitPath(runDir, phaseKey), commit);
|
|
91
|
+
return commit;
|
|
92
|
+
}
|
|
93
|
+
export async function validatePhaseCommit(runDir, phaseKey, artifacts) {
|
|
94
|
+
const commit = await readJsonStrictOptional(commitPath(runDir, phaseKey));
|
|
95
|
+
if (!commit || commit.schema_version !== 2 || commit.phase_key !== phaseKey) {
|
|
96
|
+
throw traceIntegrityError(`Missing or invalid phase commit for ${phaseKey}.`);
|
|
97
|
+
}
|
|
98
|
+
const manifest = await readPhaseManifest(runDir, phaseKey);
|
|
99
|
+
if (!manifest)
|
|
100
|
+
throw traceIntegrityError(`Missing manifest for committed phase ${phaseKey}.`);
|
|
101
|
+
validateManifest(manifest, phaseKey);
|
|
102
|
+
if (commit.manifest_hash !== manifest.manifest_hash) {
|
|
103
|
+
throw traceIntegrityError(`Manifest hash changed for committed phase ${phaseKey}.`);
|
|
104
|
+
}
|
|
105
|
+
const expectedCheckpointHashes = {};
|
|
106
|
+
for (const work of manifest.work) {
|
|
107
|
+
const checkpoint = await readValidCheckpoint(runDir, phaseKey, work.work_id, work.input_hash);
|
|
108
|
+
if (!checkpoint)
|
|
109
|
+
throw traceIntegrityError(`Checkpoint ${work.work_id} is invalid for committed phase ${phaseKey}.`);
|
|
110
|
+
expectedCheckpointHashes[work.work_id] = checkpointBindingHash(checkpoint);
|
|
111
|
+
}
|
|
112
|
+
if (stableJson(commit.checkpoint_hashes) !== stableJson(expectedCheckpointHashes)) {
|
|
113
|
+
throw traceIntegrityError(`Checkpoint bindings changed for committed phase ${phaseKey}.`);
|
|
114
|
+
}
|
|
115
|
+
if (artifacts) {
|
|
116
|
+
const expectedArtifacts = Object.fromEntries(Object.entries(artifacts).map(([name, value]) => [name, hashValue(value)]));
|
|
117
|
+
if (stableJson(commit.artifact_hashes) !== stableJson(expectedArtifacts)) {
|
|
118
|
+
throw traceIntegrityError(`Artifact bindings changed for committed phase ${phaseKey}.`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return commit;
|
|
122
|
+
}
|
|
123
|
+
export async function validatePhaseCommitIfPresent(runDir, phaseKey, artifacts) {
|
|
124
|
+
const commit = await readJsonStrictOptional(commitPath(runDir, phaseKey));
|
|
125
|
+
if (!commit)
|
|
126
|
+
return undefined;
|
|
127
|
+
return validatePhaseCommit(runDir, phaseKey, artifacts);
|
|
128
|
+
}
|
|
129
|
+
export async function readValidatedPhaseReceiptUsage(runDir, phaseKey) {
|
|
130
|
+
const manifest = await readPhaseManifest(runDir, phaseKey);
|
|
131
|
+
if (!manifest)
|
|
132
|
+
return [];
|
|
133
|
+
validateManifest(manifest, phaseKey);
|
|
134
|
+
const usage = [];
|
|
135
|
+
for (const work of manifest.work) {
|
|
136
|
+
const checkpoint = await readValidCheckpoint(runDir, phaseKey, work.work_id, work.input_hash);
|
|
137
|
+
if (!checkpoint)
|
|
138
|
+
continue;
|
|
139
|
+
if (Array.isArray(checkpoint.usage))
|
|
140
|
+
usage.push(...checkpoint.usage);
|
|
141
|
+
}
|
|
142
|
+
return usage;
|
|
143
|
+
}
|
|
144
|
+
export function hashValue(value) {
|
|
145
|
+
return `sha256:${createHash("sha256").update(stableJson(value)).digest("hex")}`;
|
|
146
|
+
}
|
|
147
|
+
export function stableJson(value) {
|
|
148
|
+
if (Array.isArray(value))
|
|
149
|
+
return `[${value.map(stableJson).join(",")}]`;
|
|
150
|
+
if (value && typeof value === "object") {
|
|
151
|
+
const entries = Object.entries(value)
|
|
152
|
+
.filter(([, inner]) => inner !== undefined)
|
|
153
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
154
|
+
.map(([key, inner]) => `${JSON.stringify(key)}:${stableJson(inner)}`);
|
|
155
|
+
return `{${entries.join(",")}}`;
|
|
156
|
+
}
|
|
157
|
+
return JSON.stringify(value) ?? "null";
|
|
158
|
+
}
|
|
159
|
+
async function ensurePhaseManifest(runDir, phaseKey, jobs) {
|
|
160
|
+
const work = jobs.map((job) => ({ work_id: job.id, input_hash: hashValue(job.input) }));
|
|
161
|
+
const manifestHash = hashValue({ schema_version: 2, phase_key: phaseKey, work });
|
|
162
|
+
const existing = await readPhaseManifest(runDir, phaseKey);
|
|
163
|
+
if (existing) {
|
|
164
|
+
validateManifest(existing, phaseKey);
|
|
165
|
+
if (existing.manifest_hash !== manifestHash || stableJson(existing.work) !== stableJson(work)) {
|
|
166
|
+
throw traceIntegrityError(`Manifest inputs changed for phase ${phaseKey}.`);
|
|
167
|
+
}
|
|
168
|
+
return existing;
|
|
169
|
+
}
|
|
170
|
+
const manifest = {
|
|
171
|
+
schema_version: 2,
|
|
172
|
+
phase_key: phaseKey,
|
|
173
|
+
manifest_hash: manifestHash,
|
|
174
|
+
work,
|
|
175
|
+
created_at: new Date().toISOString()
|
|
176
|
+
};
|
|
177
|
+
await writeJsonAtomic(manifestPath(runDir, phaseKey), manifest);
|
|
178
|
+
return manifest;
|
|
179
|
+
}
|
|
180
|
+
async function readPhaseManifest(runDir, phaseKey) {
|
|
181
|
+
return readJsonStrictOptional(manifestPath(runDir, phaseKey));
|
|
182
|
+
}
|
|
183
|
+
function validateManifest(manifest, phaseKey) {
|
|
184
|
+
const workValid = Array.isArray(manifest.work) &&
|
|
185
|
+
new Set(manifest.work.map((item) => item.work_id)).size === manifest.work.length &&
|
|
186
|
+
manifest.work.every((item) => item &&
|
|
187
|
+
typeof item.work_id === "string" &&
|
|
188
|
+
item.work_id.length > 0 &&
|
|
189
|
+
typeof item.input_hash === "string" &&
|
|
190
|
+
/^sha256:[0-9a-f]{64}$/.test(item.input_hash));
|
|
191
|
+
const expectedHash = hashValue({ schema_version: 2, phase_key: phaseKey, work: manifest.work });
|
|
192
|
+
if (manifest.schema_version !== 2 ||
|
|
193
|
+
manifest.phase_key !== phaseKey ||
|
|
194
|
+
manifest.manifest_hash !== expectedHash ||
|
|
195
|
+
!workValid) {
|
|
196
|
+
throw traceIntegrityError(`Manifest is invalid for phase ${phaseKey}.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function readValidCheckpoint(runDir, phaseKey, workId, inputHash, validateOutput) {
|
|
200
|
+
const checkpoint = await readJson(checkpointPath(runDir, phaseKey, workId));
|
|
201
|
+
if (!checkpoint)
|
|
202
|
+
return undefined;
|
|
203
|
+
if (checkpoint.schema_version !== 2 ||
|
|
204
|
+
checkpoint.phase_key !== phaseKey ||
|
|
205
|
+
checkpoint.work_id !== workId ||
|
|
206
|
+
checkpoint.input_hash !== inputHash ||
|
|
207
|
+
checkpoint.output_hash !== hashValue(checkpoint.output) ||
|
|
208
|
+
checkpoint.usage_hash !== hashValue(checkpoint.usage ?? null) ||
|
|
209
|
+
!/^sha256:[0-9a-f]{64}$/.test(checkpoint.output_hash) ||
|
|
210
|
+
!/^sha256:[0-9a-f]{64}$/.test(checkpoint.usage_hash) ||
|
|
211
|
+
!/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(checkpoint.attempt_id) ||
|
|
212
|
+
typeof checkpoint.completed_at !== "string" ||
|
|
213
|
+
!Number.isFinite(Date.parse(checkpoint.completed_at)) ||
|
|
214
|
+
new Date(checkpoint.completed_at).toISOString() !== checkpoint.completed_at ||
|
|
215
|
+
(validateOutput && !validateOutput(checkpoint.output))) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
if (!(await promptReferencesValid(runDir, checkpoint.output)))
|
|
219
|
+
return undefined;
|
|
220
|
+
return checkpoint;
|
|
221
|
+
}
|
|
222
|
+
async function promptReferencesValid(runDir, value) {
|
|
223
|
+
const references = [];
|
|
224
|
+
collectPromptReferences(value, references);
|
|
225
|
+
for (const reference of references) {
|
|
226
|
+
if (!/^sha256:[0-9a-f]{64}$/.test(reference.sha256))
|
|
227
|
+
return false;
|
|
228
|
+
const path = `artifacts/prompts/${reference.sha256.slice("sha256:".length)}.json`;
|
|
229
|
+
if (reference.path !== path)
|
|
230
|
+
return false;
|
|
231
|
+
try {
|
|
232
|
+
const raw = await readFile(join(runDir, path), "utf8");
|
|
233
|
+
const digest = `sha256:${createHash("sha256").update(raw).digest("hex")}`;
|
|
234
|
+
if (digest !== reference.sha256)
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
function collectPromptReferences(value, out) {
|
|
244
|
+
if (Array.isArray(value)) {
|
|
245
|
+
for (const item of value)
|
|
246
|
+
collectPromptReferences(item, out);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (!value || typeof value !== "object")
|
|
250
|
+
return;
|
|
251
|
+
const record = value;
|
|
252
|
+
const promptRef = record.promptRef;
|
|
253
|
+
if (promptRef && typeof promptRef === "object" && !Array.isArray(promptRef)) {
|
|
254
|
+
const reference = promptRef;
|
|
255
|
+
if (typeof reference.sha256 === "string" && typeof reference.path === "string") {
|
|
256
|
+
out.push({ sha256: reference.sha256, path: reference.path });
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
out.push({ sha256: "invalid", path: "invalid" });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
for (const [key, inner] of Object.entries(record)) {
|
|
263
|
+
if (key !== "promptRef")
|
|
264
|
+
collectPromptReferences(inner, out);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async function writeCheckpoint(runDir, phaseKey, workId, inputHash, output, usage) {
|
|
268
|
+
const checkpoint = {
|
|
269
|
+
schema_version: 2,
|
|
270
|
+
phase_key: phaseKey,
|
|
271
|
+
work_id: workId,
|
|
272
|
+
input_hash: inputHash,
|
|
273
|
+
output_hash: hashValue(output),
|
|
274
|
+
output,
|
|
275
|
+
usage,
|
|
276
|
+
usage_hash: hashValue(usage ?? null),
|
|
277
|
+
attempt_id: randomUUID(),
|
|
278
|
+
completed_at: new Date().toISOString()
|
|
279
|
+
};
|
|
280
|
+
await writeJsonAtomic(checkpointPath(runDir, phaseKey, workId), checkpoint);
|
|
281
|
+
}
|
|
282
|
+
function checkpointBindingHash(checkpoint) {
|
|
283
|
+
return hashValue({
|
|
284
|
+
schema_version: checkpoint.schema_version,
|
|
285
|
+
phase_key: checkpoint.phase_key,
|
|
286
|
+
work_id: checkpoint.work_id,
|
|
287
|
+
input_hash: checkpoint.input_hash,
|
|
288
|
+
output_hash: checkpoint.output_hash,
|
|
289
|
+
usage_hash: checkpoint.usage_hash,
|
|
290
|
+
attempt_id: checkpoint.attempt_id,
|
|
291
|
+
completed_at: checkpoint.completed_at
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
function assertUniqueWorkIds(jobs) {
|
|
295
|
+
const ids = new Set();
|
|
296
|
+
for (const job of jobs) {
|
|
297
|
+
if (!job.id || ids.has(job.id)) {
|
|
298
|
+
throw new ConfigError(`Checkpoint work IDs must be non-empty and unique; received ${job.id || "empty ID"}.`, {
|
|
299
|
+
code: "trace.work_id_invalid",
|
|
300
|
+
retryable: false
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
ids.add(job.id);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function manifestPath(runDir, phaseKey) {
|
|
307
|
+
return join(runDir, "manifests", `${phaseFileKey(phaseKey)}.json`);
|
|
308
|
+
}
|
|
309
|
+
function commitPath(runDir, phaseKey) {
|
|
310
|
+
return join(runDir, "commits", `${phaseFileKey(phaseKey)}.json`);
|
|
311
|
+
}
|
|
312
|
+
function checkpointPath(runDir, phaseKey, workId) {
|
|
313
|
+
return join(runDir, "checkpoints", phaseFileKey(phaseKey), `${hashValue(workId).slice("sha256:".length)}.json`);
|
|
314
|
+
}
|
|
315
|
+
function phaseFileKey(phaseKey) {
|
|
316
|
+
return encodeURIComponent(phaseKey).replaceAll("%", "_");
|
|
317
|
+
}
|
|
318
|
+
async function readJson(path) {
|
|
319
|
+
try {
|
|
320
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (error.code === "ENOENT")
|
|
324
|
+
return undefined;
|
|
325
|
+
return undefined;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
async function readJsonStrictOptional(path) {
|
|
329
|
+
try {
|
|
330
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
if (error.code === "ENOENT")
|
|
334
|
+
return undefined;
|
|
335
|
+
throw traceIntegrityError(`Could not parse ${path}: ${error.message}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
async function writeJsonAtomic(path, value) {
|
|
339
|
+
await mkdir(dirname(path), { recursive: true });
|
|
340
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
341
|
+
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
342
|
+
await rename(temporary, path);
|
|
343
|
+
}
|
|
344
|
+
function traceIntegrityError(message) {
|
|
345
|
+
return new ConfigError(message, {
|
|
346
|
+
code: "resume.trace_v2_integrity",
|
|
347
|
+
retryable: false,
|
|
348
|
+
fix: "Restore the matching manifest/checkpoint/commit files, or start a fresh run."
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=checkpointStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointStore.js","sourceRoot":"","sources":["../src/checkpointStore.ts"],"names":[],"mappings":"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"}
|
package/dist/critique.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
import type { Candidate, Comparison } from "./schemas.js";
|
|
2
|
-
export declare function aggregateCritiques(candidates: Candidate[], comparisons: Comparison[]
|
|
2
|
+
export declare function aggregateCritiques(candidates: Candidate[], comparisons: Comparison[], options?: {
|
|
3
|
+
aggregateChars?: number;
|
|
4
|
+
}): Map<string, string>;
|
package/dist/critique.js
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
export function aggregateCritiques(candidates, comparisons) {
|
|
1
|
+
export function aggregateCritiques(candidates, comparisons, options = {}) {
|
|
2
|
+
const aggregateChars = options.aggregateChars ?? 16_000;
|
|
2
3
|
const chunks = new Map(candidates.map((candidate) => [
|
|
3
4
|
candidate.id,
|
|
4
5
|
{
|
|
5
6
|
wins: [],
|
|
6
7
|
ties: [],
|
|
7
|
-
losses: []
|
|
8
|
+
losses: [],
|
|
9
|
+
seen: new Set()
|
|
8
10
|
}
|
|
9
11
|
]));
|
|
10
12
|
for (const comparison of comparisons) {
|
|
11
13
|
const aBucket = bucketFor("A", comparison.winner);
|
|
12
14
|
const bBucket = bucketFor("B", comparison.winner);
|
|
13
|
-
chunks.get(comparison.presentedAOriginalId)
|
|
14
|
-
chunks.get(comparison.presentedBOriginalId)
|
|
15
|
+
addCritique(chunks.get(comparison.presentedAOriginalId), aBucket, selfRelative(comparison.critiqueForA, "A"));
|
|
16
|
+
addCritique(chunks.get(comparison.presentedBOriginalId), bBucket, selfRelative(comparison.critiqueForB, "B"));
|
|
15
17
|
}
|
|
16
|
-
return new Map([...chunks.entries()].map(([id, critiques]) =>
|
|
17
|
-
|
|
18
|
-
[...critiques.wins, ...critiques.ties, ...critiques.losses].filter(Boolean).length > 0
|
|
18
|
+
return new Map([...chunks.entries()].map(([id, critiques]) => {
|
|
19
|
+
const value = [...critiques.wins, ...critiques.ties, ...critiques.losses].filter(Boolean).length > 0
|
|
19
20
|
? [
|
|
20
21
|
formatSection("Feedback from comparisons this solution won", critiques.wins),
|
|
21
22
|
formatSection("Feedback from comparisons this solution tied", critiques.ties),
|
|
@@ -23,8 +24,22 @@ export function aggregateCritiques(candidates, comparisons) {
|
|
|
23
24
|
]
|
|
24
25
|
.filter(Boolean)
|
|
25
26
|
.join("\n\n")
|
|
26
|
-
: "No specific critique was produced. Improve correctness, completeness, and clarity."
|
|
27
|
-
|
|
27
|
+
: "No specific critique was produced. Improve correctness, completeness, and clarity.";
|
|
28
|
+
return [id, truncateCritique(value, aggregateChars)];
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
function addCritique(chunks, bucket, critique) {
|
|
32
|
+
const normalized = critique.trim();
|
|
33
|
+
if (!chunks || !normalized || chunks.seen.has(normalized))
|
|
34
|
+
return;
|
|
35
|
+
chunks.seen.add(normalized);
|
|
36
|
+
chunks[bucket].push(normalized);
|
|
37
|
+
}
|
|
38
|
+
function truncateCritique(value, maxChars) {
|
|
39
|
+
if (value.length <= maxChars)
|
|
40
|
+
return value;
|
|
41
|
+
const marker = "\n\n[Critique truncated.]";
|
|
42
|
+
return `${value.slice(0, Math.max(0, maxChars - marker.length))}${marker}`.slice(0, maxChars);
|
|
28
43
|
}
|
|
29
44
|
function bucketFor(side, winner) {
|
|
30
45
|
if (winner === "tie")
|
package/dist/critique.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"critique.js","sourceRoot":"","sources":["../src/critique.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,
|
|
1
|
+
{"version":3,"file":"critique.js","sourceRoot":"","sources":["../src/critique.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./bradleyTerry.js";
|
|
|
2
2
|
export * from "./artifacts.js";
|
|
3
3
|
export * from "./budget.js";
|
|
4
4
|
export * from "./budgetTracker.js";
|
|
5
|
+
export * from "./checkpointStore.js";
|
|
5
6
|
export * from "./critique.js";
|
|
6
7
|
export * from "./errors.js";
|
|
7
8
|
export * from "./json.js";
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./bradleyTerry.js";
|
|
|
2
2
|
export * from "./artifacts.js";
|
|
3
3
|
export * from "./budget.js";
|
|
4
4
|
export * from "./budgetTracker.js";
|
|
5
|
+
export * from "./checkpointStore.js";
|
|
5
6
|
export * from "./critique.js";
|
|
6
7
|
export * from "./errors.js";
|
|
7
8
|
export * from "./json.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACrF,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACrF,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
package/dist/lifecycle.d.ts
CHANGED
package/dist/phaseRunner.d.ts
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type PhaseJob<T> = (signal: AbortSignal) => Promise<T>;
|
|
2
|
+
export interface RunLimitedPhaseOptions {
|
|
3
|
+
signal?: AbortSignal;
|
|
4
|
+
}
|
|
5
|
+
export declare const maxPhaseConcurrency = 1024;
|
|
6
|
+
export declare function runLimitedPhase<T>(jobs: Iterable<PhaseJob<T>>, concurrency: number, options?: RunLimitedPhaseOptions): Promise<T[]>;
|
package/dist/phaseRunner.js
CHANGED
|
@@ -1,26 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
export async function runLimitedPhase(jobs, concurrency) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export const maxPhaseConcurrency = 1_024;
|
|
2
|
+
export async function runLimitedPhase(jobs, concurrency, options = {}) {
|
|
3
|
+
if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > maxPhaseConcurrency) {
|
|
4
|
+
throw new RangeError(`Phase concurrency must be a positive integer no greater than ${maxPhaseConcurrency}, got ${concurrency}.`);
|
|
5
|
+
}
|
|
6
|
+
const iterator = jobs[Symbol.iterator]();
|
|
7
|
+
const results = [];
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
let nextIndex = 0;
|
|
6
10
|
let firstError;
|
|
7
|
-
|
|
8
|
-
if (firstError
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const abort = () => {
|
|
12
|
+
if (firstError === undefined)
|
|
13
|
+
firstError = abortReason(options.signal);
|
|
14
|
+
if (!controller.signal.aborted)
|
|
15
|
+
controller.abort(firstError);
|
|
16
|
+
};
|
|
17
|
+
if (options.signal?.aborted)
|
|
18
|
+
abort();
|
|
19
|
+
else
|
|
20
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
21
|
+
const worker = async () => {
|
|
22
|
+
while (firstError === undefined) {
|
|
23
|
+
const next = iterator.next();
|
|
24
|
+
if (next.done)
|
|
25
|
+
return;
|
|
26
|
+
const index = nextIndex;
|
|
27
|
+
nextIndex += 1;
|
|
28
|
+
try {
|
|
29
|
+
results[index] = await next.value(controller.signal);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (firstError === undefined) {
|
|
33
|
+
firstError = error;
|
|
34
|
+
if (!controller.signal.aborted)
|
|
35
|
+
controller.abort(error);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
13
39
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
await Promise.all(Array.from({ length: concurrency }, () => worker()));
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
options.signal?.removeEventListener("abort", abort);
|
|
46
|
+
if (firstError !== undefined)
|
|
47
|
+
iterator.return?.();
|
|
48
|
+
}
|
|
19
49
|
if (firstError !== undefined)
|
|
20
50
|
throw firstError;
|
|
21
|
-
if (completed.some((value) => !value)) {
|
|
22
|
-
throw new Error("Phase completed without producing every result.");
|
|
23
|
-
}
|
|
24
51
|
return results;
|
|
25
52
|
}
|
|
53
|
+
function abortReason(signal) {
|
|
54
|
+
if (signal?.reason !== undefined)
|
|
55
|
+
return signal.reason;
|
|
56
|
+
const error = new Error("Phase aborted.");
|
|
57
|
+
error.name = "AbortError";
|
|
58
|
+
return error;
|
|
59
|
+
}
|
|
26
60
|
//# sourceMappingURL=phaseRunner.js.map
|
package/dist/phaseRunner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phaseRunner.js","sourceRoot":"","sources":["../src/phaseRunner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"phaseRunner.js","sourceRoot":"","sources":["../src/phaseRunner.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAA2B,EAC3B,WAAmB,EACnB,UAAkC,EAAE;IAEpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,mBAAmB,EAAE,CAAC;QAC3F,MAAM,IAAI,UAAU,CAClB,gEAAgE,mBAAmB,SAAS,WAAW,GAAG,CAC3G,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzC,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAmB,CAAC;IACxB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,UAAU,KAAK,SAAS;YAAE,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;QAAE,KAAK,EAAE,CAAC;;QAChC,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YACtB,MAAM,KAAK,GAAG,SAAS,CAAC;YACxB,SAAS,IAAI,CAAC,CAAC;YACf,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,UAAU,GAAG,KAAK,CAAC;oBACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;wBAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,UAAU,KAAK,SAAS;YAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,UAAU,CAAC;IAC/C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,MAA+B;IAClD,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/resume.d.ts
CHANGED
|
@@ -44,10 +44,15 @@ export declare function resumeConfigError(message: string, code: string, fix?: s
|
|
|
44
44
|
export declare function assertNoLegacyRedactedBudget(config: Record<string, unknown>): void;
|
|
45
45
|
export declare function repairLegacyBudgetConfig(runDir: string, replacements: Record<string, number>): Promise<string[]>;
|
|
46
46
|
export declare function toResumePlanStatus(runDir: string, runId: string, plan: InternalResumePlan): ResumePlanStatus;
|
|
47
|
-
export declare function pruneTraceToPlan(trace: ResumeTrace, plan: InternalResumePlan
|
|
47
|
+
export declare function pruneTraceToPlan(trace: ResumeTrace, plan: InternalResumePlan, options?: {
|
|
48
|
+
dropUsageIds?: ReadonlySet<string>;
|
|
49
|
+
}): ResumeTrace;
|
|
48
50
|
export declare function buildPopulationMap(config: RunConfig, populations: Map<number, Candidate[]>, candidates: Candidate[], plan: InternalResumePlan): Map<number, Candidate[]>;
|
|
49
51
|
export declare function groupComparisons(comparisons: Comparison[]): Map<number | "final", Comparison[]>;
|
|
50
52
|
export declare function reconstructScores(config: RunConfig, populationByGeneration: Map<number, Candidate[]>, comparisonsByGeneration: Map<number | "final", Comparison[]>, existingScores: BtScore[], plan: InternalResumePlan, runId?: string): Map<number | "final", BtScore[]>;
|
|
51
53
|
export declare function replayBudgetUsage(config: RunConfig, usage: UsageRecord[]): BudgetTracker;
|
|
54
|
+
export declare function applyUsageRecords(tracker: BudgetTracker, usage: UsageRecord[]): void;
|
|
55
|
+
export declare function validateUsageRecords(usage: UsageRecord[]): void;
|
|
56
|
+
export declare function validatedReceiptUsageIds(usage: unknown[]): Set<string>;
|
|
52
57
|
export declare function persistPrunedTrace(runDir: string, pruned: ResumeTrace): Promise<void>;
|
|
53
58
|
export declare function assertNoPruneInProgress(runDir: string): void;
|