@deepthonk/core 0.1.0 → 0.1.2
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 +13 -7
- package/dist/bradleyTerry.js +11 -3
- package/dist/bradleyTerry.js.map +1 -1
- package/dist/budgetTracker.js +14 -0
- package/dist/budgetTracker.js.map +1 -1
- package/dist/lifecycle.d.ts +2 -0
- package/dist/lifecycle.js +15 -1
- package/dist/lifecycle.js.map +1 -1
- package/dist/resume.d.ts +51 -0
- package/dist/resume.js +355 -0
- package/dist/resume.js.map +1 -0
- package/dist/runner.d.ts +38 -2
- package/dist/runner.js +465 -50
- package/dist/runner.js.map +1 -1
- package/dist/schemas.d.ts +27 -0
- package/dist/schemas.js +15 -0
- package/dist/schemas.js.map +1 -1
- package/dist/services.d.ts +5 -1
- package/dist/services.js +15 -8
- package/dist/services.js.map +1 -1
- package/package.json +1 -1
package/dist/resume.js
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readFile, readdir, rename, unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { runArtifactFiles } from "./artifacts.js";
|
|
6
|
+
import { fitBradleyTerry } from "./bradleyTerry.js";
|
|
7
|
+
import { BudgetTracker } from "./budgetTracker.js";
|
|
8
|
+
import { ConfigError } from "./errors.js";
|
|
9
|
+
import { phaseCompletedEventSchema } from "./schemas.js";
|
|
10
|
+
export const pruneSentinelFile = ".prune-in-progress";
|
|
11
|
+
export async function readResumeTrace(runDir) {
|
|
12
|
+
const files = await readdir(runDir).catch(() => []);
|
|
13
|
+
const populations = new Map();
|
|
14
|
+
for (const file of files) {
|
|
15
|
+
const match = /^population-(\d+)\.json$/.exec(file);
|
|
16
|
+
if (!match)
|
|
17
|
+
continue;
|
|
18
|
+
populations.set(Number(match[1]), await readJson(runDir, file));
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
events: await readJsonl(runDir, runArtifactFiles.trace),
|
|
22
|
+
candidates: await readJsonl(runDir, runArtifactFiles.candidates),
|
|
23
|
+
comparisons: await readJsonl(runDir, runArtifactFiles.comparisons),
|
|
24
|
+
scores: await readJsonl(runDir, runArtifactFiles.scores),
|
|
25
|
+
populations,
|
|
26
|
+
usage: await readJsonl(runDir, runArtifactFiles.usage)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function resolveResumeRunId(config, status, events) {
|
|
30
|
+
if (typeof config.run_id === "string")
|
|
31
|
+
return config.run_id;
|
|
32
|
+
if (typeof config.runId === "string")
|
|
33
|
+
return config.runId;
|
|
34
|
+
if (typeof status?.run_id === "string")
|
|
35
|
+
return status.run_id;
|
|
36
|
+
for (const event of events) {
|
|
37
|
+
if (event.type === "run.started" && typeof event.run_id === "string")
|
|
38
|
+
return event.run_id;
|
|
39
|
+
}
|
|
40
|
+
return `run_resume_${Math.abs(config.seed)}`;
|
|
41
|
+
}
|
|
42
|
+
export function buildResumePlan(config, events) {
|
|
43
|
+
const completed = new Set();
|
|
44
|
+
for (const event of events) {
|
|
45
|
+
const parsed = phaseCompletedEventSchema.safeParse(event);
|
|
46
|
+
if (!parsed.success)
|
|
47
|
+
continue;
|
|
48
|
+
completed.add(phaseKey(parsed.data.phase, parsed.data.generation));
|
|
49
|
+
}
|
|
50
|
+
if (!completed.has("initial_generation")) {
|
|
51
|
+
return { completed, nextPhase: { phase: "initial_generation" } };
|
|
52
|
+
}
|
|
53
|
+
for (let gen = 1; gen <= config.profile.t; gen += 1) {
|
|
54
|
+
if (!completed.has(phaseKey("generation_judging", gen))) {
|
|
55
|
+
return { completed, nextPhase: { phase: "generation_judging", generation: gen } };
|
|
56
|
+
}
|
|
57
|
+
if (!completed.has(phaseKey("generation_mutation", gen))) {
|
|
58
|
+
return { completed, nextPhase: { phase: "generation_mutation", generation: gen } };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!completed.has("final_judging"))
|
|
62
|
+
return { completed, nextPhase: { phase: "final_judging", generation: "final" } };
|
|
63
|
+
if (!completed.has("finalizing"))
|
|
64
|
+
return { completed, nextPhase: { phase: "finalizing", generation: "final" } };
|
|
65
|
+
return { completed, nextPhase: { phase: "summary" } };
|
|
66
|
+
}
|
|
67
|
+
export function resumeConfigError(message, code, fix) {
|
|
68
|
+
throw new ConfigError(message, { code, retryable: false, fix });
|
|
69
|
+
}
|
|
70
|
+
export function toResumePlanStatus(runDir, runId, plan) {
|
|
71
|
+
const completedPhases = completedPhaseEntries(plan.completed);
|
|
72
|
+
const done = plan.nextPhase.phase === "summary";
|
|
73
|
+
return {
|
|
74
|
+
status: done ? "completed" : "resumable",
|
|
75
|
+
message: done
|
|
76
|
+
? "Trace has all phase completion markers."
|
|
77
|
+
: `Run can resume from ${plan.nextPhase.phase}${plan.nextPhase.generation !== undefined ? `:${plan.nextPhase.generation}` : ""}.`,
|
|
78
|
+
run_id: runId,
|
|
79
|
+
run_dir: runDir,
|
|
80
|
+
phase: plan.nextPhase.phase,
|
|
81
|
+
generation: plan.nextPhase.generation,
|
|
82
|
+
safe_to_continue: !done,
|
|
83
|
+
plan: {
|
|
84
|
+
next_phase: plan.nextPhase.phase,
|
|
85
|
+
generation: plan.nextPhase.generation,
|
|
86
|
+
completed_phases: completedPhases
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function pruneTraceToPlan(trace, plan) {
|
|
91
|
+
const candidates = trace.candidates.filter((candidate) => keepCandidate(candidate, plan.completed));
|
|
92
|
+
const comparisons = trace.comparisons.filter((comparison) => plan.completed.has(phaseKeyForComparison(comparison)));
|
|
93
|
+
const scores = trace.scores.filter((score) => plan.completed.has(phaseKeyForScore(score)));
|
|
94
|
+
const candidateIds = new Set(candidates.map((candidate) => candidate.id));
|
|
95
|
+
const comparisonIds = new Set(comparisons.map((comparison) => comparison.id));
|
|
96
|
+
return {
|
|
97
|
+
events: trace.events.filter((event) => keepEvent(event, plan.completed, candidateIds, comparisonIds)),
|
|
98
|
+
candidates,
|
|
99
|
+
comparisons,
|
|
100
|
+
scores,
|
|
101
|
+
populations: new Map([...trace.populations].filter(([generation]) => keepPopulationGeneration(generation, plan.completed))),
|
|
102
|
+
usage: trace.usage.filter((record) => {
|
|
103
|
+
const key = usagePhaseKey(record.phase);
|
|
104
|
+
return key !== undefined && plan.completed.has(key);
|
|
105
|
+
})
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function buildPopulationMap(config, populations, candidates, plan) {
|
|
109
|
+
const byId = new Set(candidates.filter((candidate) => candidate.status !== "discarded").map((candidate) => candidate.id));
|
|
110
|
+
const populationByGeneration = new Map();
|
|
111
|
+
for (const generation of requiredPopulationGenerations(config, plan.completed)) {
|
|
112
|
+
const population = populations.get(generation);
|
|
113
|
+
if (!population) {
|
|
114
|
+
resumeConfigError(`Resume trace is missing population-${generation}.json for a completed phase boundary.`, "resume.population_missing", "Restore the population snapshot or start a fresh run.");
|
|
115
|
+
}
|
|
116
|
+
if (population.length !== config.profile.n) {
|
|
117
|
+
resumeConfigError(`population-${generation}.json has ${population.length} candidates; expected ${config.profile.n}.`, "resume.population_invalid", "Inspect the run directory for a truncated or mixed trace.");
|
|
118
|
+
}
|
|
119
|
+
for (const candidate of population) {
|
|
120
|
+
if (!byId.has(candidate.id)) {
|
|
121
|
+
resumeConfigError(`population-${generation}.json references missing candidate ${candidate.id}.`, "resume.population_invalid", "Restore candidates.jsonl or start a fresh run.");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
populationByGeneration.set(generation, population);
|
|
125
|
+
}
|
|
126
|
+
return populationByGeneration;
|
|
127
|
+
}
|
|
128
|
+
export function groupComparisons(comparisons) {
|
|
129
|
+
const grouped = new Map();
|
|
130
|
+
for (const comparison of comparisons) {
|
|
131
|
+
const bucket = grouped.get(comparison.generation) ?? [];
|
|
132
|
+
bucket.push(comparison);
|
|
133
|
+
grouped.set(comparison.generation, bucket);
|
|
134
|
+
}
|
|
135
|
+
return grouped;
|
|
136
|
+
}
|
|
137
|
+
export function reconstructScores(config, populationByGeneration, comparisonsByGeneration, existingScores, plan) {
|
|
138
|
+
const scoresByGeneration = new Map();
|
|
139
|
+
for (let gen = 1; gen <= config.profile.t; gen += 1) {
|
|
140
|
+
if (!plan.completed.has(phaseKey("generation_judging", gen)))
|
|
141
|
+
continue;
|
|
142
|
+
const population = requirePopulation(populationByGeneration, gen - 1);
|
|
143
|
+
sanityCheckScores(existingScores, gen, population);
|
|
144
|
+
scoresByGeneration.set(gen, fitBradleyTerry(population, comparisonsByGeneration.get(gen) ?? [], config.profile.lambda, gen));
|
|
145
|
+
}
|
|
146
|
+
if (plan.completed.has("final_judging")) {
|
|
147
|
+
const population = requirePopulation(populationByGeneration, config.profile.t);
|
|
148
|
+
sanityCheckScores(existingScores, "final", population);
|
|
149
|
+
scoresByGeneration.set("final", fitBradleyTerry(population, comparisonsByGeneration.get("final") ?? [], config.profile.lambda, "final"));
|
|
150
|
+
}
|
|
151
|
+
return scoresByGeneration;
|
|
152
|
+
}
|
|
153
|
+
export function replayBudgetUsage(config, usage) {
|
|
154
|
+
const tracker = new BudgetTracker(config);
|
|
155
|
+
let hasUsd = false;
|
|
156
|
+
for (const record of usage) {
|
|
157
|
+
tracker.usage.calls += 1;
|
|
158
|
+
tracker.usage.inputTokens += record.input_tokens;
|
|
159
|
+
if (record.input_cache_hit_tokens !== undefined) {
|
|
160
|
+
tracker.usage.inputCacheHitTokens = (tracker.usage.inputCacheHitTokens ?? 0) + record.input_cache_hit_tokens;
|
|
161
|
+
}
|
|
162
|
+
if (record.input_cache_miss_tokens !== undefined) {
|
|
163
|
+
tracker.usage.inputCacheMissTokens = (tracker.usage.inputCacheMissTokens ?? 0) + record.input_cache_miss_tokens;
|
|
164
|
+
}
|
|
165
|
+
tracker.usage.outputTokens += record.output_tokens;
|
|
166
|
+
tracker.usage.totalTokens += record.total_tokens;
|
|
167
|
+
if (record.total_usd !== undefined) {
|
|
168
|
+
hasUsd = true;
|
|
169
|
+
tracker.usage.usd = (tracker.usage.usd ?? 0) + record.total_usd;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (!hasUsd)
|
|
173
|
+
delete tracker.usage.usd;
|
|
174
|
+
return tracker;
|
|
175
|
+
}
|
|
176
|
+
export async function persistPrunedTrace(runDir, pruned) {
|
|
177
|
+
const sentinelPath = join(runDir, pruneSentinelFile);
|
|
178
|
+
await writeFile(sentinelPath, `${JSON.stringify({ pid: process.pid, started_at: new Date().toISOString() })}\n`, "utf8");
|
|
179
|
+
const rewrites = [
|
|
180
|
+
[runArtifactFiles.trace, pruned.events],
|
|
181
|
+
[runArtifactFiles.candidates, pruned.candidates],
|
|
182
|
+
[runArtifactFiles.comparisons, pruned.comparisons],
|
|
183
|
+
[runArtifactFiles.scores, pruned.scores],
|
|
184
|
+
[runArtifactFiles.usage, pruned.usage]
|
|
185
|
+
];
|
|
186
|
+
for (const [fileName, rows] of rewrites) {
|
|
187
|
+
await writeJsonlAtomic(runDir, fileName, rows);
|
|
188
|
+
}
|
|
189
|
+
await unlink(sentinelPath);
|
|
190
|
+
}
|
|
191
|
+
export function assertNoPruneInProgress(runDir) {
|
|
192
|
+
if (!existsSync(join(runDir, pruneSentinelFile)))
|
|
193
|
+
return;
|
|
194
|
+
resumeConfigError("A previous trace prune did not finish; refusing to resume from a partially rewritten trace.", "resume.prune_in_progress", `Inspect ${join(runDir, pruneSentinelFile)} and the JSONL artifacts before retrying.`);
|
|
195
|
+
}
|
|
196
|
+
function phaseKey(phase, generation) {
|
|
197
|
+
if ((phase === "generation_judging" || phase === "generation_mutation") && generation !== undefined) {
|
|
198
|
+
return `${phase}:${generation}`;
|
|
199
|
+
}
|
|
200
|
+
return phase;
|
|
201
|
+
}
|
|
202
|
+
function completedPhaseEntries(completed) {
|
|
203
|
+
return [...completed]
|
|
204
|
+
.map(parsePhaseKey)
|
|
205
|
+
.filter((entry) => entry !== undefined)
|
|
206
|
+
.sort((left, right) => phaseOrder(left.phase) - phaseOrder(right.phase) || (left.generation ?? 0) - (right.generation ?? 0));
|
|
207
|
+
}
|
|
208
|
+
function parsePhaseKey(key) {
|
|
209
|
+
const match = /^(generation_judging|generation_mutation):(\d+)$/.exec(key);
|
|
210
|
+
if (match)
|
|
211
|
+
return { phase: match[1], generation: Number(match[2]) };
|
|
212
|
+
if (key === "initial_generation" ||
|
|
213
|
+
key === "generation_judging" ||
|
|
214
|
+
key === "generation_mutation" ||
|
|
215
|
+
key === "final_judging" ||
|
|
216
|
+
key === "finalizing") {
|
|
217
|
+
return { phase: key };
|
|
218
|
+
}
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
function phaseOrder(phase) {
|
|
222
|
+
switch (phase) {
|
|
223
|
+
case "initial_generation":
|
|
224
|
+
return 0;
|
|
225
|
+
case "generation_judging":
|
|
226
|
+
return 1;
|
|
227
|
+
case "generation_mutation":
|
|
228
|
+
return 2;
|
|
229
|
+
case "final_judging":
|
|
230
|
+
return 3;
|
|
231
|
+
case "finalizing":
|
|
232
|
+
return 4;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function keepCandidate(candidate, completed) {
|
|
236
|
+
if (candidate.status === "discarded")
|
|
237
|
+
return completed.has(phaseKey("generation_mutation", candidate.generation + 1));
|
|
238
|
+
if (candidate.generation === 0)
|
|
239
|
+
return completed.has("initial_generation");
|
|
240
|
+
return completed.has(phaseKey("generation_mutation", candidate.generation));
|
|
241
|
+
}
|
|
242
|
+
function keepPopulationGeneration(generation, completed) {
|
|
243
|
+
if (generation === 0)
|
|
244
|
+
return completed.has("initial_generation");
|
|
245
|
+
return completed.has(phaseKey("generation_mutation", generation));
|
|
246
|
+
}
|
|
247
|
+
function keepEvent(event, completed, candidateIds, comparisonIds) {
|
|
248
|
+
const type = event.type;
|
|
249
|
+
if (typeof type !== "string")
|
|
250
|
+
return true;
|
|
251
|
+
if (type.startsWith("candidate.")) {
|
|
252
|
+
const candidateId = event.candidate_id;
|
|
253
|
+
return typeof candidateId !== "string" || candidateIds.has(candidateId);
|
|
254
|
+
}
|
|
255
|
+
if (type.startsWith("comparison.")) {
|
|
256
|
+
const comparisonId = event.comparison_id;
|
|
257
|
+
return typeof comparisonId !== "string" || comparisonIds.has(comparisonId);
|
|
258
|
+
}
|
|
259
|
+
if (type === "phase.completed") {
|
|
260
|
+
const parsed = phaseCompletedEventSchema.safeParse(event);
|
|
261
|
+
return !parsed.success || completed.has(phaseKey(parsed.data.phase, parsed.data.generation));
|
|
262
|
+
}
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
function phaseKeyForComparison(comparison) {
|
|
266
|
+
return comparison.generation === "final" ? "final_judging" : phaseKey("generation_judging", comparison.generation);
|
|
267
|
+
}
|
|
268
|
+
function phaseKeyForScore(score) {
|
|
269
|
+
return score.generation === "final" ? "final_judging" : phaseKey("generation_judging", score.generation);
|
|
270
|
+
}
|
|
271
|
+
function usagePhaseKey(phase) {
|
|
272
|
+
if (phase === "gen0_initial")
|
|
273
|
+
return "initial_generation";
|
|
274
|
+
if (phase === "final_judge")
|
|
275
|
+
return "final_judging";
|
|
276
|
+
if (phase === "finalize")
|
|
277
|
+
return "finalizing";
|
|
278
|
+
const judge = /^gen(\d+)_judge$/.exec(phase);
|
|
279
|
+
if (judge)
|
|
280
|
+
return phaseKey("generation_judging", Number(judge[1]));
|
|
281
|
+
const mutate = /^gen(\d+)_mutate$/.exec(phase);
|
|
282
|
+
if (mutate)
|
|
283
|
+
return phaseKey("generation_mutation", Number(mutate[1]));
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
function requiredPopulationGenerations(config, completed) {
|
|
287
|
+
const generations = [];
|
|
288
|
+
if (completed.has("initial_generation"))
|
|
289
|
+
generations.push(0);
|
|
290
|
+
for (let gen = 1; gen <= config.profile.t; gen += 1) {
|
|
291
|
+
if (completed.has(phaseKey("generation_mutation", gen)))
|
|
292
|
+
generations.push(gen);
|
|
293
|
+
}
|
|
294
|
+
return generations;
|
|
295
|
+
}
|
|
296
|
+
function requirePopulation(populationByGeneration, generation) {
|
|
297
|
+
const population = populationByGeneration.get(generation);
|
|
298
|
+
if (!population) {
|
|
299
|
+
resumeConfigError(`Cannot reconstruct scores without population generation ${generation}.`, "resume.population_missing", "Restore the population snapshot or start a fresh run.");
|
|
300
|
+
}
|
|
301
|
+
return population;
|
|
302
|
+
}
|
|
303
|
+
function sanityCheckScores(existingScores, generation, population) {
|
|
304
|
+
const ids = new Set(population.map((candidate) => candidate.id));
|
|
305
|
+
for (const score of existingScores) {
|
|
306
|
+
if (score.generation !== generation)
|
|
307
|
+
continue;
|
|
308
|
+
if (!ids.has(score.candidateId)) {
|
|
309
|
+
resumeConfigError(`scores.jsonl for generation ${generation} references unknown candidate ${score.candidateId}.`, "resume.scores_invalid", "Inspect the run directory for a mixed or corrupted trace.");
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async function readJson(runDir, fileName) {
|
|
314
|
+
try {
|
|
315
|
+
return JSON.parse(await readFile(join(runDir, fileName), "utf8"));
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
resumeConfigError(`Could not read ${fileName}: ${error.message}`, "resume.trace_read_failed", "Inspect the run directory and file permissions.");
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
async function readJsonl(runDir, fileName) {
|
|
322
|
+
const path = join(runDir, fileName);
|
|
323
|
+
if (!existsSync(path))
|
|
324
|
+
return [];
|
|
325
|
+
const raw = await readFile(path, "utf8");
|
|
326
|
+
const lines = raw.split("\n").filter((line) => line.length > 0);
|
|
327
|
+
if (lines.length === 0)
|
|
328
|
+
return [];
|
|
329
|
+
const out = [];
|
|
330
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
331
|
+
try {
|
|
332
|
+
out.push(JSON.parse(lines[i]));
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
if (i === lines.length - 1) {
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
throw resumeConfigError(`Corrupted ${fileName} JSONL at line ${i + 1}: ${err.message}`, "resume.corrupted_trace", `Inspect ${path}; mid-file parse failures indicate non-recoverable trace corruption.`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return out;
|
|
342
|
+
}
|
|
343
|
+
async function writeJsonlAtomic(runDir, fileName, rows) {
|
|
344
|
+
const tempFile = join(runDir, `.${fileName}.${process.pid}.${randomUUID()}.tmp`);
|
|
345
|
+
const body = rows.length ? `${rows.map((row) => JSON.stringify(row)).join("\n")}\n` : "";
|
|
346
|
+
await writeFile(tempFile, body, "utf8");
|
|
347
|
+
try {
|
|
348
|
+
await rename(tempFile, join(runDir, fileName));
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
await unlink(tempFile).catch(() => undefined);
|
|
352
|
+
throw error;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../src/resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAoCtD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,QAAQ,CAAc,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,SAAS,CAA0B,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC;QAChF,UAAU,EAAE,MAAM,SAAS,CAAY,MAAM,EAAE,gBAAgB,CAAC,UAAU,CAAC;QAC3E,WAAW,EAAE,MAAM,SAAS,CAAa,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC;QAC9E,MAAM,EAAE,MAAM,SAAS,CAAU,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC;QACjE,WAAW;QACX,KAAK,EAAE,MAAM,SAAS,CAAc,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAuC,EACvC,MAA6B,EAC7B,MAAsC;IAEtC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAC5D,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC1D,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC5F,CAAC;IACD,OAAO,cAAc,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAsC;IACvF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,SAAS;QAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,CAAC;IACnE,CAAC;IACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IACtH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAChH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAY,EAAE,GAAY;IAC3E,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,KAAa,EAAE,IAAwB;IACxF,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC;IAChD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;QACxC,OAAO,EAAE,IAAI;YACX,CAAC,CAAC,yCAAyC;YAC3C,CAAC,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;QACnI,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;QAC3B,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;QACrC,gBAAgB,EAAE,CAAC,IAAI;QACvB,IAAI,EAAE;YACJ,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;YAChC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;YACrC,gBAAgB,EAAE,eAAe;SAClC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,IAAwB;IAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpG,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QACrG,UAAU;QACV,WAAW;QACX,MAAM;QACN,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3H,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,WAAqC,EACrC,UAAuB,EACvB,IAAwB;IAExB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1H,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9D,KAAK,MAAM,UAAU,IAAI,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/E,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,iBAAiB,CACf,sCAAsC,UAAU,uCAAuC,EACvF,2BAA2B,EAC3B,uDAAuD,CACxD,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC3C,iBAAiB,CACf,cAAc,UAAU,aAAa,UAAU,CAAC,MAAM,yBAAyB,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAClG,2BAA2B,EAC3B,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC5B,iBAAiB,CACf,cAAc,UAAU,sCAAsC,SAAS,CAAC,EAAE,GAAG,EAC7E,2BAA2B,EAC3B,gDAAgD,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,sBAAsB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAyB;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,sBAAgD,EAChD,uBAA4D,EAC5D,cAAyB,EACzB,IAAwB;IAExB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAClE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;YAAE,SAAS;QACvE,MAAM,UAAU,GAAG,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACtE,iBAAiB,CAAC,cAAc,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QACnD,kBAAkB,CAAC,GAAG,CACpB,GAAG,EACH,eAAe,CAAC,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAChG,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,iBAAiB,CAAC,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/E,iBAAiB,CAAC,cAAc,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACvD,kBAAkB,CAAC,GAAG,CACpB,OAAO,EACP,eAAe,CAAC,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CACxG,CAAC;IACJ,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,KAAoB;IACvE,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC;QACjD,IAAI,MAAM,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,sBAAsB,CAAC;QAC/G,CAAC;QACD,IAAI,MAAM,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAClH,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC;QACjD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;QAClE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAmB;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACrD,MAAM,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzH,MAAM,QAAQ,GAAwC;QACpD,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACvC,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;QAChD,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;QAClD,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;KACvC,CAAC;IACF,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACxC,MAAM,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAAE,OAAO;IACzD,iBAAiB,CACf,6FAA6F,EAC7F,0BAA0B,EAC1B,WAAW,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,2CAA2C,CACtF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgB,EAAE,UAAmB;IACrD,IAAI,CAAC,KAAK,KAAK,oBAAoB,IAAI,KAAK,KAAK,qBAAqB,CAAC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACpG,OAAO,GAAG,KAAK,IAAI,UAAU,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAsB;IACnD,OAAO,CAAC,GAAG,SAAS,CAAC;SAClB,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,KAAK,EAAsD,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC1F,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;AACjI,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,kDAAkD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,IAAI,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAc,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,IACE,GAAG,KAAK,oBAAoB;QAC5B,GAAG,KAAK,oBAAoB;QAC5B,GAAG,KAAK,qBAAqB;QAC7B,GAAG,KAAK,eAAe;QACvB,GAAG,KAAK,YAAY,EACpB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAClC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,oBAAoB;YACvB,OAAO,CAAC,CAAC;QACX,KAAK,oBAAoB;YACvB,OAAO,CAAC,CAAC;QACX,KAAK,qBAAqB;YACxB,OAAO,CAAC,CAAC;QACX,KAAK,eAAe;YAClB,OAAO,CAAC,CAAC;QACX,KAAK,YAAY;YACf,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAAoB,EAAE,SAAsB;IACjE,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;IACtH,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC3E,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB,EAAE,SAAsB;IAC1E,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACjE,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAChB,KAA8B,EAC9B,SAAsB,EACtB,YAAyB,EACzB,aAA0B;IAE1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,OAAO,OAAO,YAAY,KAAK,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAsB;IACnD,OAAO,UAAU,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,KAAK,cAAc;QAAE,OAAO,oBAAoB,CAAC;IAC1D,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,eAAe,CAAC;IACpD,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,YAAY,CAAC;IAC9C,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,KAAK;QAAE,OAAO,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAiB,EAAE,SAAsB;IAC9E,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,sBAAgD,EAAE,UAAkB;IAC7F,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,iBAAiB,CACf,2DAA2D,UAAU,GAAG,EACxE,2BAA2B,EAC3B,uDAAuD,CACxD,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CAAC,cAAyB,EAAE,UAA4B,EAAE,UAAuB;IACzG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU;YAAE,SAAS;QAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,iBAAiB,CACf,+BAA+B,UAAU,iCAAiC,KAAK,CAAC,WAAW,GAAG,EAC9F,uBAAuB,EACvB,2DAA2D,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAI,MAAc,EAAE,QAAgB;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAM,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAiB,CACf,kBAAkB,QAAQ,KAAM,KAAe,CAAC,OAAO,EAAE,EACzD,0BAA0B,EAC1B,iDAAiD,CAClD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAI,MAAc,EAAE,QAAgB;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,MAAM,iBAAiB,CACrB,aAAa,QAAQ,kBAAkB,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,EACzE,wBAAwB,EACxB,WAAW,IAAI,sEAAsE,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAgB,EAAE,IAAe;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -1,11 +1,47 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BudgetTracker } from "./budgetTracker.js";
|
|
2
|
+
import { type PhaseCursor } from "./resume.js";
|
|
3
|
+
import { type BtScore, type Candidate, type Comparison, type ModelDriver, type PhaseName, type RunConfig, type RunResult } from "./schemas.js";
|
|
2
4
|
export interface RunControl {
|
|
3
5
|
jobId?: string;
|
|
4
6
|
shouldCancel?: () => boolean | Promise<boolean>;
|
|
5
7
|
}
|
|
6
|
-
export
|
|
8
|
+
export interface ResumeDeepThonkOptions {
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
provider?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ResumePlan {
|
|
13
|
+
status: "completed" | "resumable";
|
|
14
|
+
message: string;
|
|
15
|
+
run_id?: string;
|
|
16
|
+
run_dir: string;
|
|
17
|
+
phase?: PhaseName | "summary";
|
|
18
|
+
generation?: number | "final";
|
|
19
|
+
safe_to_continue: boolean;
|
|
20
|
+
summary?: Record<string, unknown>;
|
|
21
|
+
plan?: {
|
|
22
|
+
next_phase: PhaseName | "summary";
|
|
23
|
+
generation?: number | "final";
|
|
24
|
+
completed_phases: Array<{
|
|
25
|
+
phase: PhaseName;
|
|
26
|
+
generation?: number;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
interface ResumeState {
|
|
31
|
+
runId: string;
|
|
32
|
+
startedAt: string;
|
|
33
|
+
completed: Set<string>;
|
|
34
|
+
populationByGeneration: Map<number, Candidate[]>;
|
|
35
|
+
comparisonsByGeneration: Map<number | "final", Comparison[]>;
|
|
36
|
+
scoresByGeneration: Map<number | "final", BtScore[]>;
|
|
37
|
+
tracker: BudgetTracker;
|
|
38
|
+
nextPhase: PhaseCursor;
|
|
39
|
+
}
|
|
40
|
+
export declare function runDeepThonk(configInput: RunConfig, driver: ModelDriver, control?: RunControl, resumeState?: ResumeState): Promise<RunResult>;
|
|
41
|
+
export declare function resumeDeepThonk(runDir: string, driver: ModelDriver, options?: ResumeDeepThonkOptions): Promise<RunResult | ResumePlan>;
|
|
7
42
|
export declare function rankPopulation(population: Candidate[], scores: BtScore[]): Candidate[];
|
|
8
43
|
export declare function topQuartile(ranked: Candidate[]): Candidate[];
|
|
9
44
|
export declare function bottomQuartile(ranked: Candidate[]): Set<string>;
|
|
10
45
|
export declare function copyElites(elites: Candidate[], generation: number): Candidate[];
|
|
11
46
|
export declare function keepPopulationSize(population: Candidate[], n: number): Candidate[];
|
|
47
|
+
export {};
|