@tuned-tensor/local 0.2.7 → 0.2.8

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +139 -0
  3. package/dist/artifacts.d.ts +92 -0
  4. package/dist/artifacts.js +591 -3
  5. package/dist/artifacts.js.map +1 -1
  6. package/dist/contracts.d.ts +5 -2
  7. package/dist/contracts.js +15 -10
  8. package/dist/contracts.js.map +1 -1
  9. package/dist/dataset.d.ts +3 -0
  10. package/dist/dataset.js +87 -5
  11. package/dist/dataset.js.map +1 -1
  12. package/dist/doctor.d.ts +13 -2
  13. package/dist/doctor.js +372 -49
  14. package/dist/doctor.js.map +1 -1
  15. package/dist/evaluation.d.ts +15 -0
  16. package/dist/evaluation.js +120 -16
  17. package/dist/evaluation.js.map +1 -1
  18. package/dist/huggingface-cache.d.ts +26 -0
  19. package/dist/huggingface-cache.js +68 -0
  20. package/dist/huggingface-cache.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +741 -75
  23. package/dist/index.js.map +1 -1
  24. package/dist/local-project.d.ts +11 -0
  25. package/dist/local-project.js +96 -3
  26. package/dist/local-project.js.map +1 -1
  27. package/dist/model-registry.d.ts +21 -0
  28. package/dist/model-registry.js +198 -0
  29. package/dist/model-registry.js.map +1 -1
  30. package/dist/model-server.d.ts +32 -0
  31. package/dist/model-server.js +158 -0
  32. package/dist/model-server.js.map +1 -0
  33. package/dist/orchestrator.d.ts +3 -0
  34. package/dist/orchestrator.js +1001 -142
  35. package/dist/orchestrator.js.map +1 -1
  36. package/dist/prefetch.d.ts +13 -0
  37. package/dist/prefetch.js +107 -19
  38. package/dist/prefetch.js.map +1 -1
  39. package/dist/process-runner.d.ts +7 -0
  40. package/dist/process-runner.js +171 -16
  41. package/dist/process-runner.js.map +1 -1
  42. package/dist/process-training.d.ts +5 -1
  43. package/dist/process-training.js +32 -16
  44. package/dist/process-training.js.map +1 -1
  45. package/dist/run-reporter.d.ts +2 -0
  46. package/dist/run-reporter.js +10 -0
  47. package/dist/run-reporter.js.map +1 -1
  48. package/dist/store.d.ts +16 -2
  49. package/dist/store.js +189 -24
  50. package/dist/store.js.map +1 -1
  51. package/docs/architecture.md +32 -0
  52. package/docs/local-workflow-remediation-2026-07-13.md +130 -0
  53. package/docs/local-workflow-ux-review-2026-07-13.md +458 -0
  54. package/package.json +3 -1
  55. package/training/local-runner/src/evaluate.py +80 -20
  56. package/training/local-runner/src/prefetch.py +107 -8
  57. package/training/local-runner/src/serve.py +329 -0
  58. package/training/local-runner/src/train.py +47 -22
  59. package/training/local-runner/src/train_dpo.py +41 -25
  60. package/training/local-runner/uv.lock +2401 -0
package/dist/doctor.js CHANGED
@@ -1,42 +1,320 @@
1
+ import { constants } from "node:fs";
2
+ import { access, mkdir, statfs, unlink, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { delimiter, isAbsolute, join, resolve } from "node:path";
1
5
  import { spawn } from "node:child_process";
2
- async function runCommand(command, args, timeoutMs = 10_000) {
3
- return await new Promise((resolve) => {
4
- const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
6
+ import { withHuggingFaceCacheEnvironment } from "./huggingface-cache.js";
7
+ import { buildEntrypointCommand } from "./process-runner.js";
8
+ import { resolveTrainingModel } from "./model-registry.js";
9
+ import { defaultLocalHome } from "./store.js";
10
+ import { verifyLocalBaseModel } from "./prefetch.js";
11
+ async function runCommand(command, args, options = {}) {
12
+ const timeoutMs = options.timeoutMs ?? 10_000;
13
+ let interrupted;
14
+ const result = await new Promise((resolveResult) => {
15
+ let settled = false;
5
16
  let stdout = "";
6
17
  let stderr = "";
18
+ let stopError;
19
+ let forceKillTimer = null;
20
+ const child = spawn(command, args, {
21
+ cwd: options.cwd,
22
+ env: options.env ?? process.env,
23
+ stdio: ["ignore", "pipe", "pipe"],
24
+ detached: process.platform !== "win32",
25
+ });
26
+ const killProcessGroup = (signal) => {
27
+ if (child.pid && process.platform !== "win32") {
28
+ try {
29
+ process.kill(-child.pid, signal);
30
+ return;
31
+ }
32
+ catch {
33
+ // The child may have exited between the check and signal.
34
+ }
35
+ }
36
+ child.kill(signal);
37
+ };
38
+ const requestStop = (signal = "SIGTERM") => {
39
+ killProcessGroup(signal);
40
+ if (!forceKillTimer) {
41
+ forceKillTimer = setTimeout(() => killProcessGroup("SIGKILL"), 5_000);
42
+ forceKillTimer.unref();
43
+ }
44
+ };
45
+ const onSigint = () => {
46
+ interrupted = "interrupted by SIGINT";
47
+ stopError = interrupted;
48
+ requestStop("SIGINT");
49
+ };
50
+ const onSigterm = () => {
51
+ interrupted = "interrupted by SIGTERM";
52
+ stopError = interrupted;
53
+ requestStop("SIGTERM");
54
+ };
55
+ const finish = (result) => {
56
+ if (settled)
57
+ return;
58
+ settled = true;
59
+ clearTimeout(timer);
60
+ if (forceKillTimer)
61
+ clearTimeout(forceKillTimer);
62
+ process.off("SIGINT", onSigint);
63
+ process.off("SIGTERM", onSigterm);
64
+ resolveResult(result);
65
+ };
7
66
  const timer = setTimeout(() => {
8
- child.kill("SIGTERM");
9
- resolve({ code: null, stdout, stderr, error: `timed out after ${timeoutMs}ms` });
67
+ stopError = `timed out after ${timeoutMs}ms`;
68
+ requestStop();
10
69
  }, timeoutMs);
70
+ timer.unref();
71
+ process.once("SIGINT", onSigint);
72
+ process.once("SIGTERM", onSigterm);
11
73
  child.stdout.setEncoding("utf8");
12
74
  child.stderr.setEncoding("utf8");
13
75
  child.stdout.on("data", (chunk) => { stdout += chunk; });
14
76
  child.stderr.on("data", (chunk) => { stderr += chunk; });
15
77
  child.on("error", (error) => {
16
- clearTimeout(timer);
17
- resolve({ code: null, stdout, stderr, error: error.message });
78
+ finish({ code: null, stdout, stderr, error: error.message });
18
79
  });
19
80
  child.on("close", (code) => {
20
- clearTimeout(timer);
21
- resolve({ code, stdout, stderr });
81
+ finish({ code: stopError ? null : code, stdout, stderr, error: stopError });
22
82
  });
23
83
  });
84
+ if (interrupted)
85
+ throw new Error(interrupted);
86
+ return result;
24
87
  }
25
88
  function firstLine(value) {
26
89
  return value.trim().split(/\r?\n/)[0] ?? "";
27
90
  }
28
- export async function runDoctor(config) {
91
+ function commandText(command, args) {
92
+ return [command, ...args].map((part) => /\s/.test(part) ? JSON.stringify(part) : part).join(" ");
93
+ }
94
+ async function executableCheck(command, options = {}) {
95
+ const env = { ...process.env, ...options.env };
96
+ const cwd = options.cwd ? resolve(options.cwd) : process.cwd();
97
+ const candidates = isAbsolute(command) || command.includes("/")
98
+ ? [isAbsolute(command) ? command : resolve(cwd, command)]
99
+ : (env.PATH ?? "").split(delimiter).filter(Boolean).map((directory) => join(isAbsolute(directory) ? directory : resolve(cwd, directory), command));
100
+ for (const candidate of candidates) {
101
+ try {
102
+ await access(candidate, constants.X_OK);
103
+ return { name: `executable:${command}`, ok: true, message: candidate };
104
+ }
105
+ catch {
106
+ // Continue searching PATH.
107
+ }
108
+ }
109
+ return {
110
+ name: `executable:${command}`,
111
+ ok: false,
112
+ message: `${command} is not executable or was not found on PATH`,
113
+ };
114
+ }
115
+ async function writableDirectoryCheck(name, path) {
116
+ const resolvedPath = resolve(path);
117
+ const probePath = join(resolvedPath, `.tt-local-write-probe-${process.pid}-${Date.now()}`);
118
+ try {
119
+ await mkdir(resolvedPath, { recursive: true });
120
+ await access(resolvedPath, constants.R_OK | constants.W_OK);
121
+ await writeFile(probePath, "ok\n", { flag: "wx" });
122
+ await unlink(probePath);
123
+ const fs = await statfs(resolvedPath);
124
+ const freeBytes = Number(fs.bavail) * Number(fs.bsize);
125
+ return {
126
+ name,
127
+ ok: true,
128
+ message: `${resolvedPath} is writable (${Math.round(freeBytes / (1024 ** 3) * 10) / 10} GiB available)`,
129
+ details: { path: resolvedPath, free_bytes: freeBytes },
130
+ };
131
+ }
132
+ catch (error) {
133
+ await unlink(probePath).catch(() => undefined);
134
+ return {
135
+ name,
136
+ ok: false,
137
+ message: `${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`,
138
+ details: { path: resolvedPath },
139
+ };
140
+ }
141
+ }
142
+ function pythonProbeSource(device) {
143
+ return [
144
+ "import json",
145
+ "import torch, transformers, peft, huggingface_hub",
146
+ `requested = ${JSON.stringify(device)}`,
147
+ "assert requested != 'cuda' or torch.cuda.is_available(), 'CUDA was requested but torch.cuda.is_available() is false'",
148
+ "assert requested != 'mps' or (hasattr(torch.backends, 'mps') and torch.backends.mps.is_available()), 'MPS was requested but is unavailable'",
149
+ "print(json.dumps({'python_ok': True, 'torch': torch.__version__, 'transformers': transformers.__version__, 'cuda_available': torch.cuda.is_available(), 'cuda_device': torch.cuda.get_device_name(0) if torch.cuda.is_available() else None}))",
150
+ ].join("; ");
151
+ }
152
+ function pythonProbePlan(args) {
153
+ const entrypoint = buildEntrypointCommand({
154
+ ...args.entrypoint,
155
+ backend: "uv",
156
+ module: undefined,
157
+ script: "-c",
158
+ args: [],
159
+ }, {
160
+ extraArgs: [pythonProbeSource(args.device)],
161
+ });
162
+ const env = withHuggingFaceCacheEnvironment({
163
+ ...process.env,
164
+ ...args.env,
165
+ }, args.modelCache);
166
+ return {
167
+ name: args.name,
168
+ command: entrypoint.command,
169
+ args: entrypoint.commandArgs,
170
+ cwd: args.cwd,
171
+ env,
172
+ };
173
+ }
174
+ /** Build the exact uv environments that a configured run will use. */
175
+ export function buildDoctorPythonPlans(config) {
176
+ if (config.dryRun)
177
+ return [];
178
+ const plans = [];
179
+ if (config.training.backend === "uv") {
180
+ plans.push(pythonProbePlan({
181
+ name: "training-python",
182
+ entrypoint: config.training,
183
+ cwd: config.training.cwd,
184
+ env: config.training.env,
185
+ device: config.evaluation.inference.device,
186
+ modelCache: config.paths.modelCache,
187
+ }));
188
+ }
189
+ if (config.evaluation.inference.provider === "transformers") {
190
+ plans.push(pythonProbePlan({
191
+ name: "evaluation-python",
192
+ entrypoint: config.evaluation.inference,
193
+ cwd: config.evaluation.inference.cwd,
194
+ env: config.evaluation.inference.env,
195
+ device: config.evaluation.inference.device,
196
+ modelCache: config.paths.modelCache,
197
+ }));
198
+ }
199
+ return plans;
200
+ }
201
+ function configuredCommandChecks(config) {
202
+ const checks = [];
203
+ if (config.training.backend === "command" && !config.dryRun) {
204
+ checks.push({
205
+ name: "training-command",
206
+ command: config.training.command?.[0],
207
+ cwd: config.training.cwd,
208
+ env: config.training.env,
209
+ });
210
+ }
211
+ const inference = config.evaluation.inference;
212
+ if ((inference.provider === "command" || inference.provider === "batch_command") && !config.dryRun) {
213
+ checks.push({
214
+ name: "evaluation-command",
215
+ command: inference.command?.[0],
216
+ cwd: inference.cwd,
217
+ env: inference.env,
218
+ });
219
+ }
220
+ return checks;
221
+ }
222
+ function placeholderSpecCheck(request) {
223
+ const placeholder = request.spec_snapshot.examples.some((example) => /replace this with/i.test(example.input) || /replace this with/i.test(example.output)) || /describe the behavior this local model should learn/i.test(request.spec_snapshot.system_prompt);
224
+ return {
225
+ name: "spec-content",
226
+ ok: !placeholder,
227
+ message: placeholder
228
+ ? "The spec still contains generated placeholder content; edit it before training."
229
+ : `${request.spec_snapshot.examples.length} spec example(s); base model ${request.spec_snapshot.base_model}`,
230
+ };
231
+ }
232
+ function gatedModelTokenCheck(request) {
233
+ let model;
234
+ try {
235
+ model = resolveTrainingModel(request.spec_snapshot.base_model);
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ if (!model.requiresHfToken)
241
+ return null;
242
+ const available = Boolean(process.env.HF_TOKEN?.trim());
243
+ return {
244
+ name: "hugging-face-token",
245
+ ok: available,
246
+ message: available
247
+ ? `HF_TOKEN is configured for gated model ${model.id}.`
248
+ : `${model.id} is gated and requires a non-empty HF_TOKEN.`,
249
+ };
250
+ }
251
+ function judgeCheck(config) {
252
+ if (config.evaluation.scoring.mode !== "llm_judge")
253
+ return null;
254
+ if (config.evaluation.scoring.fallback === "exact_match" && !config.llm) {
255
+ return {
256
+ name: "llm-judge",
257
+ ok: true,
258
+ message: "LLM judge is not configured; explicit exact_match fallback will be used.",
259
+ };
260
+ }
261
+ if (!config.llm) {
262
+ return {
263
+ name: "llm-judge",
264
+ ok: false,
265
+ message: "evaluation.scoring.mode=llm_judge requires an llm configuration, or explicitly set fallback=exact_match.",
266
+ };
267
+ }
268
+ const available = Boolean(process.env[config.llm.apiKeyEnv]);
269
+ return {
270
+ name: "llm-judge",
271
+ ok: available || config.evaluation.scoring.fallback === "exact_match",
272
+ message: available
273
+ ? `${config.llm.model} credentials found in ${config.llm.apiKeyEnv}`
274
+ : `${config.llm.apiKeyEnv} is not set${config.evaluation.scoring.fallback === "exact_match" ? "; explicit exact_match fallback will be used" : ""}`,
275
+ };
276
+ }
277
+ async function localBaseModelCheck(path) {
278
+ const resolvedPath = resolve(path);
279
+ try {
280
+ const verified = await verifyLocalBaseModel(resolvedPath);
281
+ return {
282
+ name: "local-base-model",
283
+ ok: true,
284
+ message: `${resolvedPath} is a valid local Hugging Face snapshot directory.`,
285
+ details: { path: resolvedPath, file_count: verified.fileCount, size_bytes: verified.sizeBytes },
286
+ };
287
+ }
288
+ catch (error) {
289
+ return {
290
+ name: "local-base-model",
291
+ ok: false,
292
+ message: error instanceof Error ? error.message : String(error),
293
+ details: { path: resolvedPath },
294
+ };
295
+ }
296
+ }
297
+ export async function runDoctor(config, request) {
29
298
  const checks = [];
30
- const needsUv = config.training.backend !== "command"
31
- || config.evaluation.inference.provider === "transformers";
32
299
  const nodeVersion = process.versions.node;
33
300
  const nodeMajor = Number(nodeVersion.split(".")[0]);
34
- checks.push({
35
- name: "node",
36
- ok: nodeMajor >= 22,
37
- message: `Node ${nodeVersion}`,
38
- });
39
- if (needsUv) {
301
+ checks.push({ name: "node", ok: nodeMajor >= 22, message: `Node ${nodeVersion}` });
302
+ checks.push(await writableDirectoryCheck("artifact-root", config.artifactRoot));
303
+ checks.push(await writableDirectoryCheck("store-root", config.storeRoot ?? defaultLocalHome()));
304
+ checks.push(await writableDirectoryCheck("model-cache", config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), ".cache", "huggingface")));
305
+ if (config.paths.baseModel)
306
+ checks.push(await localBaseModelCheck(config.paths.baseModel));
307
+ if (request) {
308
+ checks.push(placeholderSpecCheck(request));
309
+ const gatedToken = gatedModelTokenCheck(request);
310
+ if (gatedToken)
311
+ checks.push(gatedToken);
312
+ }
313
+ const judge = judgeCheck(config);
314
+ if (judge)
315
+ checks.push(judge);
316
+ const pythonPlans = buildDoctorPythonPlans(config);
317
+ if (pythonPlans.length > 0) {
40
318
  const uvVersion = await runCommand("uv", ["--version"]);
41
319
  checks.push({
42
320
  name: "uv",
@@ -45,46 +323,91 @@ export async function runDoctor(config) {
45
323
  ? firstLine(uvVersion.stdout)
46
324
  : uvVersion.error ?? (firstLine(uvVersion.stderr) || "uv is not available"),
47
325
  });
48
- const pythonVersion = await runCommand("uv", ["run", "python", "--version"]);
326
+ if (uvVersion.code === 0) {
327
+ const uniquePlans = new Map();
328
+ for (const plan of pythonPlans) {
329
+ const key = JSON.stringify([plan.command, plan.args, plan.cwd, plan.env]);
330
+ if (!uniquePlans.has(key))
331
+ uniquePlans.set(key, plan);
332
+ }
333
+ for (const plan of uniquePlans.values()) {
334
+ const result = await runCommand(plan.command, plan.args, {
335
+ cwd: plan.cwd,
336
+ env: plan.env,
337
+ timeoutMs: 1_800_000,
338
+ });
339
+ checks.push({
340
+ name: plan.name,
341
+ ok: result.code === 0,
342
+ message: result.code === 0
343
+ ? firstLine(result.stdout)
344
+ : result.error ?? (firstLine(result.stderr) || `${plan.command} exited ${result.code}`),
345
+ details: { command: commandText(plan.command, plan.args), cwd: plan.cwd ?? process.cwd() },
346
+ });
347
+ }
348
+ }
349
+ }
350
+ else {
351
+ checks.push({
352
+ name: "python-runtime",
353
+ ok: true,
354
+ message: config.dryRun
355
+ ? "Python dependency checks skipped because dryRun is enabled."
356
+ : "The configured command/none backends do not require the bundled Python runtime.",
357
+ });
358
+ }
359
+ for (const entry of configuredCommandChecks(config)) {
360
+ if (!entry.command) {
361
+ checks.push({ name: entry.name, ok: false, message: `${entry.name} has no command configured` });
362
+ }
363
+ else {
364
+ const check = await executableCheck(entry.command, { cwd: entry.cwd, env: entry.env });
365
+ checks.push({ ...check, name: entry.name });
366
+ }
367
+ }
368
+ const device = config.evaluation.inference.device;
369
+ if (!config.dryRun && (device === "cuda" || device === "auto")) {
370
+ const nvidiaSmi = await runCommand("nvidia-smi", []);
49
371
  checks.push({
50
- name: "uv-python",
51
- ok: pythonVersion.code === 0,
52
- message: pythonVersion.code === 0
53
- ? firstLine(pythonVersion.stdout || pythonVersion.stderr)
54
- : pythonVersion.error ?? (firstLine(pythonVersion.stderr) || "uv could not run Python"),
372
+ name: "nvidia-smi",
373
+ ok: device === "auto" || nvidiaSmi.code === 0,
374
+ message: nvidiaSmi.code === 0
375
+ ? firstLine(nvidiaSmi.stdout)
376
+ : device === "auto"
377
+ ? "nvidia-smi is unavailable; device=auto may use MPS or CPU."
378
+ : nvidiaSmi.error ?? (firstLine(nvidiaSmi.stderr) || "nvidia-smi not available"),
55
379
  });
56
380
  }
57
381
  else {
58
382
  checks.push({
59
- name: "uv",
383
+ name: "nvidia-smi",
60
384
  ok: true,
61
- message: "uv is not required by the configured command entrypoints",
385
+ message: config.dryRun
386
+ ? "GPU checks skipped because dryRun is enabled."
387
+ : `nvidia-smi is not required for device=${device}.`,
62
388
  });
63
389
  }
64
- const nvidiaSmi = await runCommand("nvidia-smi", []);
65
- checks.push({
66
- name: "nvidia-smi",
67
- ok: nvidiaSmi.code === 0,
68
- message: nvidiaSmi.code === 0
69
- ? firstLine(nvidiaSmi.stdout)
70
- : nvidiaSmi.error ?? (firstLine(nvidiaSmi.stderr) || "nvidia-smi not available"),
71
- });
390
+ const trainingCommand = config.training.backend === "command"
391
+ ? config.training.command
392
+ : buildEntrypointCommand(config.training, {
393
+ defaultScript: request?.training_method === "dpo"
394
+ ? "training/local-runner/src/train_dpo.py"
395
+ : "training/local-runner/src/train.py",
396
+ }).displayCommand;
72
397
  checks.push({
73
- name: "training-entrypoint",
74
- ok: config.training.backend === "command"
75
- ? Boolean(config.training.command || config.dryRun)
76
- : true,
77
- message: config.training.backend === "command" && config.training.command
78
- ? `will run command ${config.training.command.join(" ")}`
79
- : config.training.backend === "command" && config.dryRun
80
- ? "No training command configured; dryRun is enabled"
81
- : config.training.backend === "command"
82
- ? "No training command configured"
83
- : config.training.module
84
- ? `uv will run module ${config.training.module}`
85
- : config.training.script
86
- ? `uv will run script ${config.training.script}`
87
- : "uv will run the bundled script selected by training_method",
398
+ name: "effective-plan",
399
+ ok: true,
400
+ message: "Resolved the configured training and evaluation plan.",
401
+ details: {
402
+ training_command: trainingCommand ?? null,
403
+ evaluation_provider: config.evaluation.inference.provider,
404
+ evaluation_device: device,
405
+ artifact_root: resolve(config.artifactRoot),
406
+ store_root: resolve(config.storeRoot ?? defaultLocalHome()),
407
+ model_cache: resolve(config.paths.modelCache ?? process.env.HF_HOME ?? join(homedir(), ".cache", "huggingface")),
408
+ base_model: request?.spec_snapshot.base_model ?? null,
409
+ scoring_mode: config.evaluation.scoring.mode,
410
+ },
88
411
  });
89
412
  return checks;
90
413
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAsBrD,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,IAAc,EAAE,UAA0B,EAAE;IACrF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,IAAI,WAA+B,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,aAAa,EAAE,EAAE;QAChE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,SAA6B,CAAC;QAClC,IAAI,cAAc,GAA0B,IAAI,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACvC,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAAE,EAAE;YAClD,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC9C,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oBACjC,OAAO;gBACT,CAAC;gBAAC,MAAM,CAAC;oBACP,0DAA0D;gBAC5D,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,SAAyB,SAAS,EAAE,EAAE;YACzD,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;gBACtE,cAAc,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,WAAW,GAAG,uBAAuB,CAAC;YACtC,SAAS,GAAG,WAAW,CAAC;YACxB,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,WAAW,GAAG,wBAAwB,CAAC;YACvC,SAAS,GAAG,WAAW,CAAC;YACxB,WAAW,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAE,EAAE;YACvC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,cAAc;gBAAE,YAAY,CAAC,cAAc,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,SAAS,GAAG,mBAAmB,SAAS,IAAI,CAAC;YAC7C,WAAW,EAAE,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAI,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,IAAc;IAClD,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnG,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,UAAqD,EAAE;IAEvD,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7D,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAClE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAC3E,CAAC;IACN,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,cAAc,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,cAAc,OAAO,EAAE;QAC7B,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,GAAG,OAAO,6CAA6C;KACjE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,yBAAyB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO;YACL,IAAI;YACJ,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,GAAG,YAAY,iBAAiB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,iBAAiB;YACvG,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE;SACvD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO;YACL,IAAI;YACJ,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,GAAG,YAAY,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACrF,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;SAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAUD,SAAS,iBAAiB,CAAC,MAA8D;IACvF,OAAO;QACL,aAAa;QACb,mDAAmD;QACnD,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;QACvC,sHAAsH;QACtH,6IAA6I;QAC7I,gPAAgP;KACjP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAOxB;IACC,MAAM,UAAU,GAAG,sBAAsB,CAAC;QACxC,GAAG,IAAI,CAAC,UAAU;QAClB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,EAAE;KACT,EAAE;QACD,SAAS,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC5C,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,+BAA+B,CAAC;QAC1C,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,IAAI,CAAC,GAAG;KACZ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,IAAI,EAAE,UAAU,CAAC,WAAW;QAC5B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;YACzB,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,MAAM,CAAC,QAAQ;YAC3B,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;YACxB,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;YACxB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM;YAC1C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;YACzB,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS;YACvC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG;YACpC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG;YACpC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM;YAC1C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAyB;IAMxD,MAAM,MAAM,GAAqF,EAAE,CAAC;IACpG,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;YACxB,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;SACzB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;IAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,KAAK,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnG,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,GAAG,EAAE,SAAS,CAAC,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA2B;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAClE,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CACtF,IAAI,sDAAsD,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACtG,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,CAAC,WAAW;QAChB,OAAO,EAAE,WAAW;YAClB,CAAC,CAAC,iFAAiF;YACnF,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,gCAAgC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE;KAC/G,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA2B;IACvD,IAAI,KAA8C,CAAC;IACnD,IAAI,CAAC;QACH,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,SAAS;YAChB,CAAC,CAAC,0CAA0C,KAAK,CAAC,EAAE,GAAG;YACvD,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,8CAA8C;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAyB;IAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,KAAK,aAAa,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACxE,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,0EAA0E;SACpF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,0GAA0G;SACpH,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,KAAK,aAAa;QACrE,OAAO,EAAE,SAAS;YAChB,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,yBAAyB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE;YACpE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,cAAc,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,EAAE,EAAE;KACtJ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,GAAG,YAAY,oDAAoD;YAC5E,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE;SAChG,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/D,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;SAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAyB,EAAE,OAA4B;IACrF,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,WAAW,EAAE,EAAE,CAAC,CAAC;IAEnF,MAAM,CAAC,IAAI,CAAC,MAAM,sBAAsB,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,MAAM,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,CAAC,MAAM,sBAAsB,CACtC,aAAa,EACb,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAC3F,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAE3F,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC;YACxB,OAAO,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC;gBAC3B,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC7B,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC;SAC9E,CAAC,CAAC;QAEH,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;YACvD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;oBACvD,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,EAAE,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;oBACrB,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;wBACxB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;wBAC1B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC;oBACzF,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE;iBAC3F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,MAAM,CAAC,MAAM;gBACpB,CAAC,CAAC,6DAA6D;gBAC/D,CAAC,CAAC,iFAAiF;SACtF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,4BAA4B,EAAE,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACvF,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;YAC7C,OAAO,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC;gBAC3B,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC7B,CAAC,CAAC,MAAM,KAAK,MAAM;oBACjB,CAAC,CAAC,4DAA4D;oBAC9D,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,0BAA0B,CAAC;SACrF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,MAAM,CAAC,MAAM;gBACpB,CAAC,CAAC,+CAA+C;gBACjD,CAAC,CAAC,yCAAyC,MAAM,GAAG;SACvD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS;QAC3D,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;QACzB,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,EAAE;YACtC,aAAa,EAAE,OAAO,EAAE,eAAe,KAAK,KAAK;gBAC/C,CAAC,CAAC,wCAAwC;gBAC1C,CAAC,CAAC,oCAAoC;SACzC,CAAC,CAAC,cAAc,CAAC;IACtB,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,gBAAgB;QACtB,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,uDAAuD;QAChE,OAAO,EAAE;YACP,gBAAgB,EAAE,eAAe,IAAI,IAAI;YACzC,mBAAmB,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ;YACzD,iBAAiB,EAAE,MAAM;YACzB,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;YAC3C,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC;YAC3D,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YAChH,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC,UAAU,IAAI,IAAI;YACrD,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI;SAC7C;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -45,6 +45,16 @@ export declare function buildJudgeMessages(args: {
45
45
  role: "system" | "user";
46
46
  content: string;
47
47
  }>;
48
+ export interface EvaluationJudgeAvailability {
49
+ available: boolean;
50
+ reason?: string;
51
+ }
52
+ export declare function evaluationJudgeAvailability(config: LocalRunnerConfig): EvaluationJudgeAvailability;
53
+ /**
54
+ * Fail before model inference when judge scoring cannot run. Exact-match
55
+ * fallback is allowed only when the user opted into it explicitly in config.
56
+ */
57
+ export declare function assertEvaluationScoringReady(config: LocalRunnerConfig, scoringMode?: "exact_match" | "llm_judge" | "json_fields"): EvaluationJudgeAvailability;
48
58
  export type RegressionCategory = "factual" | "omission" | "style" | "fallback" | "other";
49
59
  /**
50
60
  * Coarse category for a judge reasoning string so comparison reports can
@@ -64,6 +74,8 @@ export declare function classifyJudgeReasoning(reasoning: string | null, scoredB
64
74
  */
65
75
  export declare function baselineCacheKey(args: {
66
76
  modelId: string;
77
+ baseModelRevision?: string;
78
+ sourceFingerprint?: string;
67
79
  system: string;
68
80
  examples: BehaviorSpecExample[];
69
81
  config: LocalRunnerConfig;
@@ -73,6 +85,8 @@ export declare function evaluateExamples(args: {
73
85
  kind: "baseline" | "candidate";
74
86
  modelId: string;
75
87
  baseModelId?: string;
88
+ baseModelRevision?: string;
89
+ sourceFingerprint?: string;
76
90
  adapterPath?: string;
77
91
  examples: BehaviorSpecExample[];
78
92
  system: string;
@@ -82,6 +96,7 @@ export declare function evaluateExamples(args: {
82
96
  maxExamples?: number;
83
97
  evalSplit?: EvalSplit;
84
98
  sampleSeed?: number;
99
+ shouldCancel?: () => boolean | Promise<boolean>;
85
100
  }): Promise<EvalReport>;
86
101
  export declare function rescoreEvalReport(args: {
87
102
  report: EvalReport;