@kb-labs/qa-core 2.88.0 → 2.93.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.
@@ -287,21 +287,39 @@ var ID_MAP = {
287
287
  tests: "test"
288
288
  };
289
289
  function emptyResult() {
290
- return { passed: [], failed: [], skipped: [], errors: {} };
290
+ return { passed: [], failed: [], skipped: [], errors: {}, details: {} };
291
291
  }
292
- function runCommand(command, args, cwd, timeoutMs) {
292
+ function runCommand(command, args, cwd, timeoutMs, extraEnv) {
293
293
  try {
294
- const result = spawnSync(command, args, { cwd, timeout: timeoutMs, encoding: "utf-8", shell: false });
294
+ const env = extraEnv ? { ...process.env, ...extraEnv } : void 0;
295
+ const result = spawnSync(command, args, { cwd, timeout: timeoutMs, encoding: "utf-8", shell: false, env });
295
296
  const stdout = result.stdout ?? "";
296
297
  const stderr = result.stderr ?? "";
297
298
  const exitCode = result.status ?? 1;
298
299
  return { ok: exitCode === 0, stdout, stderr, exitCode };
299
300
  } catch (e) {
300
- return { ok: false, stdout: "", stderr: e.message ?? String(e), exitCode: 1 };
301
+ return { ok: false, stdout: "", stderr: e instanceof Error ? e.message : String(e), exitCode: 1 };
301
302
  }
302
303
  }
304
+ function parseTypedOutput(stdout) {
305
+ try {
306
+ const parsed = JSON.parse(stdout);
307
+ if (typeof parsed === "object" && parsed !== null && "ok" in parsed) {
308
+ return {
309
+ ok: parsed.ok === true,
310
+ items: Array.isArray(parsed.items) ? parsed.items : []
311
+ };
312
+ }
313
+ } catch {
314
+ }
315
+ return null;
316
+ }
303
317
  function evaluate(check, stdout, stderr, exitCode) {
304
318
  if ((check.parser ?? "exitcode") === "json") {
319
+ const typed = parseTypedOutput(stdout);
320
+ if (typed !== null) {
321
+ return typed.ok;
322
+ }
305
323
  try {
306
324
  const parsed = JSON.parse(stdout);
307
325
  return parsed.ok === true || parsed.success === true || parsed.status === "ok";
@@ -311,23 +329,54 @@ function evaluate(check, stdout, stderr, exitCode) {
311
329
  }
312
330
  return exitCode === 0;
313
331
  }
314
- function recordResult(bucket, key, passed, stdout, stderr, exitCode, canonicalId, onProgress, durationMs) {
332
+ function recordResult(bucket, key, passed, stdout, stderr, exitCode, check, canonicalId, onProgress, durationMs) {
315
333
  if (passed) {
316
334
  bucket.passed.push(key);
317
335
  onProgress?.(canonicalId, key, "pass", durationMs);
318
336
  } else {
319
337
  bucket.failed.push(key);
320
338
  bucket.errors[key] = stderr || stdout || `Exit code ${exitCode}`;
339
+ if ((check.parser ?? "exitcode") === "json") {
340
+ const typed = parseTypedOutput(stdout);
341
+ if (typed && typed.items.length > 0) {
342
+ bucket.details[key] = typed.items;
343
+ }
344
+ }
321
345
  onProgress?.(canonicalId, key, "fail", durationMs);
322
346
  }
323
347
  }
324
- function runInRepoRoot(check, canonicalId, resolvedArgs, rootDir, bucket, onProgress) {
348
+ function getDiffPackageDirs(rootDir, base, diffFilter) {
349
+ try {
350
+ const filter = diffFilter ? `--diff-filter=${diffFilter}` : "";
351
+ const args = ["diff", filter, `${base}...HEAD`, "--name-only"].filter(Boolean);
352
+ const output = execSync(`git ${args.join(" ")}`, { cwd: rootDir, encoding: "utf-8" }).trim();
353
+ if (!output) {
354
+ return /* @__PURE__ */ new Set();
355
+ }
356
+ return new Set(output.split("\n").map((f) => f.split("/")[0]).filter((s) => Boolean(s)));
357
+ } catch {
358
+ return /* @__PURE__ */ new Set();
359
+ }
360
+ }
361
+ function filterPackagesByDiff(packages, rootDir, diffFilter, base) {
362
+ const touchedDirs = getDiffPackageDirs(rootDir, base, diffFilter);
363
+ if (touchedDirs.size === 0) {
364
+ return [];
365
+ }
366
+ return packages.filter((pkg) => {
367
+ const relParts = pkg.relativePath.split("/");
368
+ return relParts.some((_, i) => touchedDirs.has(relParts.slice(0, i + 1).join("/")));
369
+ });
370
+ }
371
+ function runInRepoRoot(check, canonicalId, resolvedArgs, rootDir, bucket, onProgress, diffBase) {
325
372
  const startMs = Date.now();
326
- const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, rootDir, check.timeoutMs ?? 12e4);
327
- recordResult(bucket, rootDir, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);
373
+ const env = void 0;
374
+ const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, rootDir, check.timeoutMs ?? 12e4, env);
375
+ recordResult(bucket, rootDir, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);
328
376
  }
329
- function runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress) {
377
+ function runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress, diffBase) {
330
378
  const seen = /* @__PURE__ */ new Set();
379
+ const env = void 0;
331
380
  for (const pkg of packages) {
332
381
  if (seen.has(pkg.repo)) {
333
382
  continue;
@@ -338,8 +387,8 @@ function runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, buc
338
387
  continue;
339
388
  }
340
389
  const startMs = Date.now();
341
- const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, scopeDir, check.timeoutMs ?? 12e4);
342
- recordResult(bucket, pkg.repo, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);
390
+ const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, scopeDir, check.timeoutMs ?? 12e4, env);
391
+ recordResult(bucket, pkg.repo, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);
343
392
  }
344
393
  }
345
394
  function getPnpmScriptName(check) {
@@ -360,9 +409,10 @@ function hasNpmScript(pkgDir, scriptName) {
360
409
  return false;
361
410
  }
362
411
  }
363
- function runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress) {
412
+ function runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress, diffBase) {
364
413
  const sortedPackages = check.ordered ? sortByBuildLayers(packages) : packages;
365
414
  const scriptName = getPnpmScriptName(check);
415
+ const env = diffBase ? { KB_QA_BASE: diffBase } : void 0;
366
416
  for (const pkg of sortedPackages) {
367
417
  if (scriptName && !hasNpmScript(pkg.dir, scriptName)) {
368
418
  bucket.skipped.push(pkg.name);
@@ -370,11 +420,11 @@ function runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onPro
370
420
  continue;
371
421
  }
372
422
  const startMs = Date.now();
373
- const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, pkg.dir, check.timeoutMs ?? 12e4);
374
- recordResult(bucket, pkg.name, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);
423
+ const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, pkg.dir, check.timeoutMs ?? 12e4, env);
424
+ recordResult(bucket, pkg.name, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);
375
425
  }
376
426
  }
377
- function runCustomChecks(checks, packages, rootDir, onProgress) {
427
+ function runCustomChecks(checks, packages, rootDir, onProgress, diffBase) {
378
428
  const results = {};
379
429
  for (const check of checks) {
380
430
  const canonicalId = ID_MAP[check.id.toLowerCase()] ?? check.id;
@@ -391,9 +441,31 @@ function runCustomChecks(checks, packages, rootDir, onProgress) {
391
441
  runInRepoRoot(check, canonicalId, resolvedArgs, rootDir, bucket, onProgress);
392
442
  } else if (runIn === "scopePath") {
393
443
  runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress);
444
+ } else if (runIn === "diffOnly" || runIn === "newFiles") {
445
+ const base = "main";
446
+ const diffFilter = runIn === "newFiles" ? "A" : "";
447
+ const filteredPackages = filterPackagesByDiff(packages, rootDir, diffFilter, base);
448
+ if (filteredPackages.length === 0) {
449
+ bucket.skipped.push(...packages.map((p) => p.name));
450
+ for (const pkg of packages) {
451
+ onProgress?.(canonicalId, pkg.name, "skip");
452
+ }
453
+ } else {
454
+ const filteredNames = new Set(filteredPackages.map((p) => p.name));
455
+ for (const pkg of packages) {
456
+ if (!filteredNames.has(pkg.name)) {
457
+ bucket.skipped.push(pkg.name);
458
+ onProgress?.(canonicalId, pkg.name, "skip");
459
+ }
460
+ }
461
+ runPerPackage(check, canonicalId, resolvedArgs, filteredPackages, bucket, onProgress, base);
462
+ }
394
463
  } else {
395
464
  runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress);
396
465
  }
466
+ if (Object.keys(bucket.details).length > 0) {
467
+ results[canonicalId].details = bucket.details;
468
+ }
397
469
  }
398
470
  return results;
399
471
  }
@@ -501,8 +573,9 @@ function runBuildCheck(options) {
501
573
  } catch (err) {
502
574
  const durationMs = Date.now() - startMs;
503
575
  result.failed.push(pkg.name);
504
- const rawErr = (err.stderr || err.stdout || err.message || "").trim();
505
- result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Build failed (exit code ${err.status ?? 1})`;
576
+ const spawnErr = err;
577
+ const rawErr = (spawnErr.stderr || spawnErr.stdout || spawnErr.message || "").trim();
578
+ result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Build failed (exit code ${spawnErr.status ?? 1})`;
506
579
  onProgress?.(pkg.name, "fail", durationMs);
507
580
  }
508
581
  }
@@ -530,8 +603,9 @@ function runLintCheck(options) {
530
603
  onProgress?.(pkg.name, "pass", Date.now() - startMs);
531
604
  } catch (err) {
532
605
  result.failed.push(pkg.name);
533
- const rawErr = (err.stdout || err.stderr || err.message || "").trim();
534
- result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Lint failed (exit code ${err.status ?? 1})`;
606
+ const spawnErr = err;
607
+ const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || "").trim();
608
+ result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Lint failed (exit code ${spawnErr.status ?? 1})`;
535
609
  onProgress?.(pkg.name, "fail", Date.now() - startMs);
536
610
  }
537
611
  }
@@ -559,8 +633,9 @@ function runTypeCheck(options) {
559
633
  onProgress?.(pkg.name, "pass", Date.now() - startMs);
560
634
  } catch (err) {
561
635
  result.failed.push(pkg.name);
562
- const rawErr = (err.stdout || err.stderr || err.message || "").trim();
563
- result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Type check failed (exit code ${err.status ?? 1})`;
636
+ const spawnErr = err;
637
+ const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || "").trim();
638
+ result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Type check failed (exit code ${spawnErr.status ?? 1})`;
564
639
  onProgress?.(pkg.name, "fail", Date.now() - startMs);
565
640
  }
566
641
  }
@@ -597,8 +672,9 @@ function runTestCheck(options) {
597
672
  onProgress?.(pkg.name, "pass", Date.now() - startMs);
598
673
  } catch (err) {
599
674
  result.failed.push(pkg.name);
600
- const rawErr = (err.stdout || err.stderr || err.message || "").trim();
601
- result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Test failed (exit code ${err.status ?? 1})`;
675
+ const spawnErr = err;
676
+ const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || "").trim();
677
+ result.errors[pkg.name] = rawErr.slice(0, 2e3) || `Test failed (exit code ${spawnErr.status ?? 1})`;
602
678
  onProgress?.(pkg.name, "fail", Date.now() - startMs);
603
679
  }
604
680
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/baseline/baseline-store.ts","../../src/runner/submodule-info.ts","../../src/runner/workspace.ts","../../src/runner/build-order.ts","../../src/runner/custom-check-runner.ts","../../src/runner/cache.ts","../../src/runner/build-runner.ts","../../src/runner/lint-runner.ts","../../src/runner/type-runner.ts","../../src/runner/test-runner.ts","../../src/runner/last-run-store.ts","../../src/runner/qa-orchestrator.ts","../../src/baseline/baseline-updater.ts","../../src/baseline/baseline-comparator.ts"],"names":["join","existsSync","readFileSync","PATHS","dirname","mkdirSync","writeFileSync","readdirSync","statSync","execSync"],"mappings":"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","file":"index.js","sourcesContent":["import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\nimport type { BaselineSnapshot } from '@kb-labs/qa-contracts';\n\n/**\n * Load baseline snapshot from disk.\n */\nexport function loadBaseline(rootDir: string): BaselineSnapshot | null {\n const path = join(rootDir, PATHS.BASELINE);\n if (!existsSync(path)) {return null;}\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Save baseline snapshot to disk.\n */\nexport function saveBaseline(rootDir: string, snapshot: BaselineSnapshot): void {\n const path = join(rootDir, PATHS.BASELINE);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(snapshot, null, 2));\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SubmoduleInfo } from '@kb-labs/qa-contracts';\n\n/**\n * Get git submodule info for a repo directory.\n * Returns null if the directory is not a git repo.\n */\nexport function getSubmoduleInfo(repoDir: string, repoName: string): SubmoduleInfo | null {\n const gitDir = join(repoDir, '.git');\n if (!existsSync(gitDir)) {return null;}\n\n try {\n const commit = execSync('git rev-parse --short HEAD', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const message = execSync('git log -1 --format=%s', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const statusOutput = execSync('git status --porcelain', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n return {\n name: repoName,\n commit,\n branch,\n dirty: statusOutput.length > 0,\n message,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Collect submodule info for all unique repos from a list of packages.\n * Caches by repo name to avoid redundant git calls.\n */\nexport function collectSubmoduleInfo(\n rootDir: string,\n repos: string[],\n): Record<string, SubmoduleInfo> {\n const result: Record<string, SubmoduleInfo> = {};\n\n for (const repo of repos) {\n const repoDir = join(rootDir, repo);\n const info = getSubmoduleInfo(repoDir, repo);\n if (info) {\n result[repo] = info;\n }\n }\n\n return result;\n}\n","import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { WorkspacePackage, PackageFilter, SubmoduleInfo } from '@kb-labs/qa-contracts';\nimport type { PackagesConfig } from '@kb-labs/qa-contracts';\nimport { getSubmoduleInfo } from './submodule-info.js';\n\nfunction hasWorkspace(dir: string): boolean {\n return existsSync(join(dir, 'pnpm-workspace.yaml'));\n}\n\nfunction isDir(p: string): boolean {\n return existsSync(p) && statSync(p).isDirectory();\n}\n\nfunction buildCandidatesFromConfig(rootDir: string, paths: string[]): string[] {\n const candidates: string[] = [];\n for (const pattern of paths) {\n const parts = pattern.split('/');\n if (parts.length === 2 && parts[1] === '*' && parts[0]) {\n const categoryDir = join(rootDir, parts[0]);\n if (!isDir(categoryDir)) { continue; }\n try {\n for (const sub of readdirSync(categoryDir)) {\n if (sub.startsWith('.') || sub === 'node_modules') { continue; }\n const subPath = join(categoryDir, sub);\n if (isDir(subPath) && hasWorkspace(subPath)) { candidates.push(subPath); }\n }\n } catch { /* skip unreadable dirs */ }\n } else {\n const exactPath = join(rootDir, pattern);\n if (isDir(exactPath) && hasWorkspace(exactPath)) { candidates.push(exactPath); }\n }\n }\n return candidates;\n}\n\nfunction buildCandidatesAutoScan(rootDir: string): string[] {\n const candidates: string[] = [];\n for (const entry of readdirSync(rootDir)) {\n if (entry.startsWith('.') || entry === 'node_modules' || entry === 'dist') { continue; }\n const entryPath = join(rootDir, entry);\n if (!isDir(entryPath)) { continue; }\n if (hasWorkspace(entryPath)) {\n candidates.push(entryPath);\n } else {\n try {\n for (const sub of readdirSync(entryPath)) {\n if (sub.startsWith('.') || sub === 'node_modules') { continue; }\n const subPath = join(entryPath, sub);\n if (isDir(subPath) && hasWorkspace(subPath)) { candidates.push(subPath); }\n }\n } catch { /* skip unreadable dirs */ }\n }\n }\n return candidates;\n}\n\nfunction scanSubDir(\n parentDir: string,\n entryPath: string,\n repoName: string,\n rootDir: string,\n submodule: SubmoduleInfo | undefined,\n packages: WorkspacePackage[],\n): void {\n if (!isDir(parentDir)) { return; }\n for (const pkgDir of readdirSync(parentDir)) {\n const pkgPath = join(parentDir, pkgDir);\n const pkgJsonPath = join(pkgPath, 'package.json');\n if (!existsSync(pkgJsonPath)) { continue; }\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n packages.push({\n name: pkgJson.name || pkgDir,\n dir: pkgPath,\n relativePath: relative(rootDir, pkgPath),\n repo: repoName,\n submodule,\n });\n } catch { /* skip invalid package.json */ }\n }\n}\n\n/**\n * Discover all workspace packages in the monorepo.\n *\n * If packagesConfig.paths is set, use those glob-expanded paths to find sub-monorepos.\n * Otherwise fall back to auto-scan (supports both flat and nested layouts).\n */\nexport function getWorkspacePackages(\n rootDir: string,\n filter?: PackageFilter,\n packagesConfig?: PackagesConfig,\n): WorkspacePackage[] {\n const packages: WorkspacePackage[] = [];\n const submoduleCache = new Map<string, SubmoduleInfo | null>();\n\n function getSubmoduleCached(entryPath: string, repoName: string): SubmoduleInfo | undefined {\n if (!submoduleCache.has(repoName)) {\n submoduleCache.set(repoName, getSubmoduleInfo(entryPath, repoName));\n }\n return submoduleCache.get(repoName) ?? undefined;\n }\n\n const candidates =\n packagesConfig?.paths && packagesConfig.paths.length > 0\n ? buildCandidatesFromConfig(rootDir, packagesConfig.paths)\n : buildCandidatesAutoScan(rootDir);\n\n for (const entryPath of candidates) {\n const repoName = relative(rootDir, entryPath);\n const submodule = getSubmoduleCached(entryPath, repoName);\n scanSubDir(join(entryPath, 'packages'), entryPath, repoName, rootDir, submodule, packages);\n scanSubDir(join(entryPath, 'apps'), entryPath, repoName, rootDir, submodule, packages);\n }\n\n let filtered = packages;\n if (packagesConfig?.include && packagesConfig.include.length > 0) {\n filtered = filtered.filter(pkg =>\n packagesConfig.include!.some(pattern => matchesPattern(pkg.name, pkg.repo, pattern))\n );\n }\n if (packagesConfig?.exclude && packagesConfig.exclude.length > 0) {\n filtered = filtered.filter(pkg =>\n !packagesConfig.exclude!.some(pattern => matchesPattern(pkg.name, pkg.repo, pattern))\n );\n }\n\n if (!filter) { return filtered; }\n\n return filtered.filter((pkg) => {\n if (filter.package && !pkg.name.includes(filter.package)) { return false; }\n if (filter.repo && pkg.repo !== filter.repo) { return false; }\n if (filter.scope) {\n const scope = filter.scope.startsWith('@') ? filter.scope : `@${filter.scope}`;\n if (!pkg.name.startsWith(scope)) { return false; }\n }\n return true;\n });\n}\n\n/**\n * Match a package against a pattern.\n * Supports: exact name, \"@kb-labs/core-*\" glob, \"kb-labs-cli/*\" repo prefix.\n */\nfunction matchesPattern(name: string, repo: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return repo === prefix || repo.startsWith(prefix + '/');\n }\n if (pattern.endsWith('*')) {\n return name.startsWith(pattern.slice(0, -1));\n }\n return name === pattern || repo === pattern;\n}\n","/**\n * Topological sort for workspace packages (Kahn's algorithm).\n * Computes build layers from package.json dependencies.\n * No external dependencies — standalone implementation.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { WorkspacePackage } from '@kb-labs/qa-contracts';\n\nexport interface BuildLayer {\n index: number;\n packages: WorkspacePackage[];\n}\n\n/**\n * Read workspace-internal dependencies from a package.json.\n * Returns only dependency names that exist in the workspace package set.\n */\nfunction readWorkspaceDeps(pkgDir: string, workspaceNames: Set<string>): string[] {\n try {\n const raw = readFileSync(join(pkgDir, 'package.json'), 'utf-8');\n const pkgJson = JSON.parse(raw);\n const allDeps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n return Object.keys(allDeps).filter(dep => workspaceNames.has(dep));\n } catch {\n return [];\n }\n}\n\n/**\n * Compute build layers via topological sort (Kahn's algorithm).\n *\n * Layer 0 = packages with no workspace dependencies (can build first).\n * Layer N = packages whose deps are all in layers 0..N-1.\n *\n * Circular dependencies are appended as the last layer with a warning.\n */\ninterface DepGraph {\n nameMap: Map<string, WorkspacePackage>;\n inDegree: Map<string, number>;\n dependents: Map<string, string[]>;\n}\n\nfunction buildDepGraph(packages: WorkspacePackage[]): DepGraph {\n const nameMap = new Map<string, WorkspacePackage>();\n const workspaceNames = new Set<string>();\n for (const pkg of packages) {\n nameMap.set(pkg.name, pkg);\n workspaceNames.add(pkg.name);\n }\n\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const pkg of packages) {\n inDegree.set(pkg.name, 0);\n dependents.set(pkg.name, []);\n }\n for (const pkg of packages) {\n const deps = readWorkspaceDeps(pkg.dir, workspaceNames);\n inDegree.set(pkg.name, deps.length);\n for (const dep of deps) {\n dependents.get(dep)!.push(pkg.name);\n }\n }\n return { nameMap, inDegree, dependents };\n}\n\nexport function computeBuildLayers(packages: WorkspacePackage[]): BuildLayer[] {\n if (packages.length === 0) { return []; }\n\n const { nameMap, inDegree, dependents } = buildDepGraph(packages);\n const layers: BuildLayer[] = [];\n const remaining = new Set(packages.map(p => p.name));\n\n while (remaining.size > 0) {\n const layerNames: string[] = [];\n for (const name of remaining) {\n if ((inDegree.get(name) ?? 0) === 0) { layerNames.push(name); }\n }\n\n if (layerNames.length === 0) {\n const circular = [...remaining].map(n => nameMap.get(n)!).filter(Boolean);\n layers.push({ index: layers.length, packages: circular });\n break;\n }\n\n layerNames.sort();\n layers.push({ index: layers.length, packages: layerNames.map(n => nameMap.get(n)!) });\n\n for (const name of layerNames) {\n remaining.delete(name);\n for (const dependent of (dependents.get(name) ?? [])) {\n inDegree.set(dependent, (inDegree.get(dependent) ?? 0) - 1);\n }\n }\n }\n\n return layers;\n}\n\n/**\n * Sort packages in dependency order (topological sort).\n * Packages with no deps come first, dependents come after their deps.\n */\nexport function sortByBuildLayers(packages: WorkspacePackage[]): WorkspacePackage[] {\n return computeBuildLayers(packages).flatMap(l => l.packages);\n}\n","import { spawnSync } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport type { QACheckConfig, QAResults, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ntype Bucket = { passed: string[]; failed: string[]; skipped: string[]; errors: Record<string, string> };\ntype ProgressFn = (checkId: string, pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n\nconst ID_MAP: Record<string, string> = {\n build: 'build', lint: 'lint',\n typecheck: 'typeCheck', 'type-check': 'typeCheck',\n test: 'test', tests: 'test',\n};\n\nfunction emptyResult(): Bucket {\n return { passed: [], failed: [], skipped: [], errors: {} };\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n timeoutMs: number,\n): { ok: boolean; stdout: string; stderr: string; exitCode: number } {\n try {\n const result = spawnSync(command, args, { cwd, timeout: timeoutMs, encoding: 'utf-8', shell: false });\n const stdout = result.stdout ?? '';\n const stderr = result.stderr ?? '';\n const exitCode = result.status ?? 1;\n return { ok: exitCode === 0, stdout, stderr, exitCode };\n } catch (e: any) {\n return { ok: false, stdout: '', stderr: e.message ?? String(e), exitCode: 1 };\n }\n}\n\nfunction evaluate(check: QACheckConfig, stdout: string, stderr: string, exitCode: number): boolean {\n if ((check.parser ?? 'exitcode') === 'json') {\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n return exitCode === 0;\n}\n\nfunction recordResult(\n bucket: Bucket, key: string, passed: boolean,\n stdout: string, stderr: string, exitCode: number,\n canonicalId: string, onProgress: ProgressFn | undefined, durationMs: number,\n): void {\n if (passed) {\n bucket.passed.push(key);\n onProgress?.(canonicalId, key, 'pass', durationMs);\n } else {\n bucket.failed.push(key);\n bucket.errors[key] = stderr || stdout || `Exit code ${exitCode}`;\n onProgress?.(canonicalId, key, 'fail', durationMs);\n }\n}\n\nfunction runInRepoRoot(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n): void {\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, rootDir, check.timeoutMs ?? 120_000);\n recordResult(bucket, rootDir, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);\n}\n\nfunction runInScopePath(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n packages: WorkspacePackage[], rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n): void {\n const seen = new Set<string>();\n for (const pkg of packages) {\n if (seen.has(pkg.repo)) { continue; }\n seen.add(pkg.repo);\n const scopeDir = resolve(rootDir, pkg.repo);\n if (!existsSync(scopeDir)) { continue; }\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, scopeDir, check.timeoutMs ?? 120_000);\n recordResult(bucket, pkg.repo, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nfunction getPnpmScriptName(check: QACheckConfig): string | undefined {\n if (check.command !== 'pnpm') { return undefined; }\n const args = check.args ?? [];\n if (args[0] === 'run' && args[1]) { return args[1]; }\n return undefined;\n}\n\nfunction hasNpmScript(pkgDir: string, scriptName: string): boolean {\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf-8'));\n return typeof pkgJson?.scripts?.[scriptName] === 'string';\n } catch {\n return false;\n }\n}\n\nfunction runPerPackage(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n packages: WorkspacePackage[], bucket: Bucket, onProgress: ProgressFn | undefined,\n): void {\n const sortedPackages = check.ordered ? sortByBuildLayers(packages) : packages;\n const scriptName = getPnpmScriptName(check);\n\n for (const pkg of sortedPackages) {\n if (scriptName && !hasNpmScript(pkg.dir, scriptName)) {\n bucket.skipped.push(pkg.name);\n onProgress?.(canonicalId, pkg.name, 'skip');\n continue;\n }\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, pkg.dir, check.timeoutMs ?? 120_000);\n recordResult(bucket, pkg.name, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nexport function runCustomChecks(\n checks: QACheckConfig[],\n packages: WorkspacePackage[],\n rootDir: string,\n onProgress?: ProgressFn,\n): QAResults {\n const results: QAResults = {};\n\n for (const check of checks) {\n const canonicalId = ID_MAP[check.id.toLowerCase()] ?? check.id;\n if (!results[canonicalId]) { results[canonicalId] = emptyResult(); }\n const bucket = results[canonicalId]!;\n\n const args = check.args ?? [];\n const resolvedArgs = args.map(arg =>\n (arg.match(/\\.(sh|js|ts|mjs|cjs)$/) && !arg.startsWith('/')) ? join(rootDir, arg) : arg\n );\n\n const runIn = check.runIn ?? 'perPackage';\n\n if (runIn === 'repoRoot') {\n runInRepoRoot(check, canonicalId, resolvedArgs, rootDir, bucket, onProgress);\n } else if (runIn === 'scopePath') {\n runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress);\n } else {\n runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress);\n }\n }\n\n return results;\n}\n","import { createHash } from 'node:crypto';\nimport { readFileSync, writeFileSync, existsSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\n\ninterface CacheEntry {\n hash: string;\n timestamp: string;\n}\n\nexport type PackageCache = Record<string, CacheEntry>;\n\n/**\n * Load package hash cache from disk.\n */\nexport function loadCache(rootDir: string): PackageCache {\n const cachePath = join(rootDir, PATHS.CACHE);\n if (!existsSync(cachePath)) {return {};}\n try {\n return JSON.parse(readFileSync(cachePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\n/**\n * Save package hash cache to disk.\n */\nexport function saveCache(rootDir: string, cache: PackageCache): void {\n const cachePath = join(rootDir, PATHS.CACHE);\n const dir = dirname(cachePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n}\n\n/**\n * Compute SHA256 hash for a package based on its source files and package.json.\n */\nexport function computePackageHash(pkgDir: string): string {\n const hash = createHash('sha256');\n\n // Hash package.json\n const pkgJsonPath = join(pkgDir, 'package.json');\n if (existsSync(pkgJsonPath)) {\n hash.update(readFileSync(pkgJsonPath));\n }\n\n // Hash all files in src/\n const srcDir = join(pkgDir, 'src');\n if (existsSync(srcDir)) {\n hashDirectory(srcDir, hash);\n }\n\n return hash.digest('hex');\n}\n\nfunction hashDirectory(dir: string, hash: ReturnType<typeof createHash>): void {\n const entries = readdirSync(dir).sort();\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n hashDirectory(fullPath, hash);\n } else if (stat.isFile()) {\n hash.update(fullPath);\n hash.update(readFileSync(fullPath));\n }\n }\n}\n\n/**\n * Check if a package has changed since last cached hash.\n */\nexport function hasPackageChanged(pkgDir: string, pkgName: string, cache: PackageCache): boolean {\n const currentHash = computePackageHash(pkgDir);\n const cached = cache[pkgName];\n if (!cached) {return true;}\n return cached.hash !== currentHash;\n}\n\n/**\n * Update cache entry for a package.\n */\nexport function updateCacheEntry(pkgDir: string, pkgName: string, cache: PackageCache): PackageCache {\n const hash = computePackageHash(pkgDir);\n return {\n ...cache,\n [pkgName]: { hash, timestamp: new Date().toISOString() },\n };\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, statSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ninterface BuildRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n noCache?: boolean;\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Check if a package needs rebuilding by comparing src/ mtime vs dist/ mtime.\n */\nfunction needsRebuild(pkgDir: string): boolean {\n const srcDir = join(pkgDir, 'src');\n const distDir = join(pkgDir, 'dist');\n\n if (!existsSync(distDir)) {return true;}\n if (!existsSync(srcDir)) {return false;}\n\n const srcMtime = getLatestMtime(srcDir);\n const distMtime = getLatestMtime(distDir);\n\n return srcMtime > distMtime;\n}\n\nfunction getLatestMtime(dir: string): number {\n let latest = 0;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n latest = Math.max(latest, getLatestMtime(fullPath));\n } else {\n latest = Math.max(latest, statSync(fullPath).mtimeMs);\n }\n }\n } catch {\n // ignore\n }\n return latest;\n}\n\n/**\n * Run build checks across all packages.\n * Uses incremental builds — only rebuilds packages where src/ is newer than dist/.\n * Builds in dependency order (topological sort) so DTS files are available for downstream packages.\n */\nexport function runBuildCheck(options: BuildRunnerOptions): CheckResult {\n const { packages, noCache, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n const sorted = sortByBuildLayers(packages);\n\n for (const pkg of sorted) {\n // Check if rebuild needed (incremental)\n if (!noCache && !needsRebuild(pkg.dir)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm run build', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const durationMs = Date.now() - startMs;\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', durationMs);\n } catch (err: any) {\n const durationMs = Date.now() - startMs;\n result.failed.push(pkg.name);\n const rawErr = (err.stderr || err.stdout || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Build failed (exit code ${err.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', durationMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface LintRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run ESLint check on all packages.\n */\nexport function runLintCheck(options: LintRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n const srcDir = join(pkg.dir, 'src');\n if (!existsSync(srcDir)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm exec eslint .', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 60000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: any) {\n result.failed.push(pkg.name);\n const rawErr = (err.stdout || err.stderr || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Lint failed (exit code ${err.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface TypeRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run TypeScript type checking on all packages.\n */\nexport function runTypeCheck(options: TypeRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n const tsconfigPath = join(pkg.dir, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm exec tsc --noEmit', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: any) {\n result.failed.push(pkg.name);\n const rawErr = (err.stdout || err.stderr || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Type check failed (exit code ${err.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface TestRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run Vitest tests on all packages.\n * Uses --passWithNoTests so packages without tests pass.\n */\nexport function runTestCheck(options: TestRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n // Check if package has test script\n let pkgJson: any;\n try {\n pkgJson = JSON.parse(\n readFileSync(join(pkg.dir, 'package.json'), 'utf-8')\n );\n } catch {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n if (!pkgJson.scripts?.test) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm run test', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: any) {\n result.failed.push(pkg.name);\n const rawErr = (err.stdout || err.stderr || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Test failed (exit code ${err.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\nimport type { QAResults, WorkspacePackage, SubmoduleInfo } from '@kb-labs/qa-contracts';\n\n/**\n * Stored last-run data: full results + package metadata.\n */\nexport interface LastRunData {\n timestamp: string;\n results: QAResults;\n packages: WorkspacePackage[];\n submodules?: Record<string, SubmoduleInfo>;\n}\n\n/**\n * Save full QA results to disk for the details endpoint.\n */\nexport function saveLastRun(\n rootDir: string,\n results: QAResults,\n packages: WorkspacePackage[],\n submodules?: Record<string, SubmoduleInfo>,\n): void {\n const filePath = join(rootDir, PATHS.LAST_RUN);\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const data: LastRunData = {\n timestamp: new Date().toISOString(),\n results,\n packages: packages.map((p) => ({\n name: p.name,\n dir: p.dir,\n relativePath: p.relativePath,\n repo: p.repo,\n submodule: p.submodule,\n })),\n submodules,\n };\n\n writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\n/**\n * Load last-run data from disk.\n */\nexport function loadLastRun(rootDir: string): LastRunData | null {\n const filePath = join(rootDir, PATHS.LAST_RUN);\n if (!existsSync(filePath)) {return null;}\n\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n","import type { QARunOptions, QAResults, QARunResult, SubmoduleInfo, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { getWorkspacePackages } from './workspace.js';\nimport { runCustomChecks } from './custom-check-runner.js';\nimport { loadCache, saveCache, updateCacheEntry } from './cache.js';\nimport { runBuildCheck } from './build-runner.js';\nimport { runLintCheck } from './lint-runner.js';\nimport { runTypeCheck } from './type-runner.js';\nimport { runTestCheck } from './test-runner.js';\nimport { saveLastRun } from './last-run-store.js';\n\nconst SKIP_ALIASES: Record<string, string> = {\n types: 'typecheck',\n 'type-check': 'typecheck',\n tests: 'test',\n};\n\nfunction runBuiltinChecks(\n options: QARunOptions,\n packages: WorkspacePackage[],\n skipSet: Set<string>,\n results: QAResults,\n): void {\n const { rootDir, noCache } = options;\n if (!skipSet.has('build')) {\n results.build = runBuildCheck({\n rootDir, packages, noCache,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('build', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('lint')) {\n results.lint = runLintCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('lint', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('typecheck')) {\n results.typeCheck = runTypeCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('typeCheck', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('test')) {\n results.test = runTestCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('test', pkg, status, durationMs),\n });\n }\n}\n\n/**\n * Run all QA checks in order: build → lint → typeCheck → test.\n * Respects skip flags and package filters.\n * If options.checks is provided, uses custom check runners instead of built-ins.\n */\nexport async function runQA(options: QARunOptions): Promise<QARunResult> {\n const { rootDir, noCache } = options;\n\n const skipSet = new Set(\n (options.skipChecks ?? []).map(s => SKIP_ALIASES[s.toLowerCase()] ?? s.toLowerCase()),\n );\n\n const filter = { package: options.package, repo: options.repo, scope: options.scope };\n const packages = getWorkspacePackages(rootDir, filter, options.packagesConfig);\n let cache = noCache ? {} : loadCache(rootDir);\n\n const results: QAResults = {};\n\n if (options.checks && options.checks.length > 0) {\n const activeChecks = skipSet.size > 0\n ? options.checks.filter(c => !skipSet.has(c.id.toLowerCase()))\n : options.checks;\n Object.assign(results, runCustomChecks(activeChecks, packages, rootDir,\n (checkId, pkg, status, durationMs) => { options.onProgress?.(checkId, pkg, status, durationMs); },\n ));\n } else {\n runBuiltinChecks(options, packages, skipSet, results);\n }\n\n if (!noCache) {\n for (const pkg of packages) {\n cache = updateCacheEntry(pkg.dir, pkg.name, cache);\n }\n saveCache(rootDir, cache);\n }\n\n const submodules: Record<string, SubmoduleInfo> = {};\n for (const pkg of packages) {\n if (pkg.submodule && !submodules[pkg.repo]) {\n submodules[pkg.repo] = pkg.submodule;\n }\n }\n saveLastRun(rootDir, results, packages, Object.keys(submodules).length > 0 ? submodules : undefined);\n\n return { results, packages };\n}\n","import { execSync } from 'node:child_process';\nimport type { BaselineSnapshot, QAResults } from '@kb-labs/qa-contracts';\nimport { runQA } from '../runner/qa-orchestrator.js';\nimport { saveBaseline } from './baseline-store.js';\n\nfunction getGitInfo(rootDir: string): { commit: string; branch: string } {\n try {\n const commit = execSync('git rev-parse --short HEAD', {\n cwd: rootDir,\n encoding: 'utf-8',\n }).trim();\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: rootDir,\n encoding: 'utf-8',\n }).trim();\n return { commit, branch };\n } catch {\n return { commit: 'unknown', branch: 'unknown' };\n }\n}\n\n/**\n * Create a baseline snapshot from QA results.\n */\nexport function createBaselineFromResults(\n results: QAResults,\n rootDir: string,\n): BaselineSnapshot {\n const git = getGitInfo(rootDir);\n const snapshot: BaselineSnapshot = {\n timestamp: new Date().toISOString(),\n git,\n results: {} as BaselineSnapshot['results'],\n };\n\n for (const ct of Object.keys(results)) {\n const r = results[ct]!;\n snapshot.results[ct] = {\n passed: r.passed.length,\n failed: r.failed.length,\n failedPackages: [...r.failed],\n };\n }\n\n return snapshot;\n}\n\n/**\n * Run full QA and capture baseline.\n */\nexport async function captureBaseline(rootDir: string): Promise<BaselineSnapshot> {\n const { results } = await runQA({ rootDir });\n const snapshot = createBaselineFromResults(results, rootDir);\n saveBaseline(rootDir, snapshot);\n return snapshot;\n}\n","import type { QAResults, BaselineSnapshot, BaselineDiff } from '@kb-labs/qa-contracts';\n\n/**\n * Compare current QA results with a baseline snapshot.\n * Returns per-check-type diff with newFailures, fixed, stillFailing, delta.\n */\nexport function compareWithBaseline(\n results: QAResults,\n baseline: BaselineSnapshot,\n): BaselineDiff {\n const diff = {} as BaselineDiff;\n\n const checkTypes = [...new Set([...Object.keys(results), ...Object.keys(baseline.results)])];\n\n for (const ct of checkTypes) {\n const current = new Set(results[ct]?.failed ?? []);\n const baselineFailed = new Set(baseline.results[ct]?.failedPackages ?? []);\n\n const newFailures = [...current].filter((p) => !baselineFailed.has(p));\n const fixed = [...baselineFailed].filter((p) => !current.has(p));\n const stillFailing = [...current].filter((p) => baselineFailed.has(p));\n\n diff[ct] = {\n newFailures,\n fixed,\n stillFailing,\n delta: current.size - baselineFailed.size,\n };\n }\n\n return diff;\n}\n"]}
1
+ {"version":3,"sources":["../../src/baseline/baseline-store.ts","../../src/runner/submodule-info.ts","../../src/runner/workspace.ts","../../src/runner/build-order.ts","../../src/runner/custom-check-runner.ts","../../src/runner/cache.ts","../../src/runner/build-runner.ts","../../src/runner/lint-runner.ts","../../src/runner/type-runner.ts","../../src/runner/test-runner.ts","../../src/runner/last-run-store.ts","../../src/runner/qa-orchestrator.ts","../../src/baseline/baseline-updater.ts","../../src/baseline/baseline-comparator.ts"],"names":["join","existsSync","readFileSync","execSync","PATHS","dirname","mkdirSync","writeFileSync","readdirSync","statSync"],"mappings":";;;;;;;AAQO,SAAS,aAAa,OAAA,EAA0C;AACrE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAA;AACzC,EAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AACpC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,YAAA,CAAa,SAAiB,QAAA,EAAkC;AAC9E,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,EAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpC;AACA,EAAA,aAAA,CAAc,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AACvD;ACnBO,SAAS,gBAAA,CAAiB,SAAiB,QAAA,EAAwC;AACxF,EAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AACnC,EAAA,IAAI,CAACC,UAAAA,CAAW,MAAM,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEtC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,SAAS,4BAAA,EAA8B;AAAA,MACpD,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,EAAE,IAAA,EAAK;AAER,IAAA,MAAM,MAAA,GAAS,SAAS,iCAAA,EAAmC;AAAA,MACzD,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,EAAE,IAAA,EAAK;AAER,IAAA,MAAM,OAAA,GAAU,SAAS,wBAAA,EAA0B;AAAA,MACjD,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,EAAE,IAAA,EAAK;AAER,IAAA,MAAM,YAAA,GAAe,SAAS,wBAAA,EAA0B;AAAA,MACtD,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,EAAE,IAAA,EAAK;AAER,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,aAAa,MAAA,GAAS,CAAA;AAAA,MAC7B;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9CA,SAAS,aAAa,GAAA,EAAsB;AAC1C,EAAA,OAAOA,UAAAA,CAAWD,IAAAA,CAAK,GAAA,EAAK,qBAAqB,CAAC,CAAA;AACpD;AAEA,SAAS,MAAM,CAAA,EAAoB;AACjC,EAAA,OAAOC,WAAW,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,EAAE,WAAA,EAAY;AAClD;AAEA,SAAS,yBAAA,CAA0B,SAAiB,KAAA,EAA2B;AAC7E,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACtD,MAAA,MAAM,WAAA,GAAcD,IAAAA,CAAK,OAAA,EAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1C,MAAA,IAAI,CAAC,KAAA,CAAM,WAAW,CAAA,EAAG;AAAE,QAAA;AAAA,MAAU;AACrC,MAAA,IAAI;AACF,QAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,WAAW,CAAA,EAAG;AAC1C,UAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,cAAA,EAAgB;AAAE,YAAA;AAAA,UAAU;AAC/D,UAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,WAAA,EAAa,GAAG,CAAA;AACrC,UAAA,IAAI,KAAA,CAAM,OAAO,CAAA,IAAK,YAAA,CAAa,OAAO,CAAA,EAAG;AAAE,YAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,UAAG;AAAA,QAC3E;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAA6B;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AACvC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AAAE,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAAG;AAAA,IACjF;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,wBAAwB,OAAA,EAA2B;AAC1D,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,KAAA,IAAS,WAAA,CAAY,OAAO,CAAA,EAAG;AACxC,IAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,KAAU,cAAA,IAAkB,UAAU,MAAA,EAAQ;AAAE,MAAA;AAAA,IAAU;AACvF,IAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,EAAG;AAAE,MAAA;AAAA,IAAU;AACnC,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AACxC,UAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,cAAA,EAAgB;AAAE,YAAA;AAAA,UAAU;AAC/D,UAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,SAAA,EAAW,GAAG,CAAA;AACnC,UAAA,IAAI,KAAA,CAAM,OAAO,CAAA,IAAK,YAAA,CAAa,OAAO,CAAA,EAAG;AAAE,YAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,UAAG;AAAA,QAC3E;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAA6B;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,WACP,SAAA,EACA,SAAA,EACA,QAAA,EACA,OAAA,EACA,WACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,EAAG;AAAE,IAAA;AAAA,EAAQ;AACjC,EAAA,KAAA,MAAW,MAAA,IAAU,WAAA,CAAY,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AACtC,IAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AAChD,IAAA,IAAI,CAACC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAAE,MAAA;AAAA,IAAU;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AAC7D,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,QACtB,GAAA,EAAK,OAAA;AAAA,QACL,YAAA,EAAc,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,QACvC,IAAA,EAAM,QAAA;AAAA,QACN;AAAA,OACD,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAAkC;AAAA,EAC5C;AACF;AAQO,SAAS,oBAAA,CACd,OAAA,EACA,MAAA,EACA,cAAA,EACoB;AACpB,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkC;AAE7D,EAAA,SAAS,kBAAA,CAAmB,WAAmB,QAAA,EAA6C;AAC1F,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjC,MAAA,cAAA,CAAe,GAAA,CAAI,QAAA,EAAU,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AAAA,EACzC;AAEA,EAAA,MAAM,UAAA,GACJ,cAAA,EAAgB,KAAA,IAAS,cAAA,CAAe,KAAA,CAAM,MAAA,GAAS,CAAA,GACnD,yBAAA,CAA0B,OAAA,EAAS,cAAA,CAAe,KAAK,CAAA,GACvD,wBAAwB,OAAO,CAAA;AAErC,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,SAAA,EAAW,QAAQ,CAAA;AACxD,IAAA,UAAA,CAAWF,IAAAA,CAAK,WAAW,UAAU,CAAA,EAAG,WAAW,QAAA,EAAU,OAAA,EAAS,WAAW,QAAQ,CAAA;AACzF,IAAA,UAAA,CAAWA,IAAAA,CAAK,WAAW,MAAM,CAAA,EAAG,WAAW,QAAA,EAAU,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,EACvF;AAEA,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,IAAI,cAAA,EAAgB,OAAA,IAAW,cAAA,CAAe,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChE,IAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,MAAO,CAAA,GAAA,KACzB,cAAA,CAAe,OAAA,CAAS,IAAA,CAAK,CAAA,OAAA,KAAW,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAO,CAAC;AAAA,KACrF;AAAA,EACF;AACA,EAAA,IAAI,cAAA,EAAgB,OAAA,IAAW,cAAA,CAAe,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChE,IAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,MAAO,CAAA,GAAA,KACzB,CAAC,cAAA,CAAe,OAAA,CAAS,IAAA,CAAK,CAAA,OAAA,KAAW,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAO,CAAC;AAAA,KACtF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,IAAA,OAAO,QAAA;AAAA,EAAU;AAEhC,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQ;AAC9B,IAAA,IAAI,MAAA,CAAO,WAAW,CAAC,GAAA,CAAI,KAAK,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAG;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAC1E,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,GAAA,CAAI,IAAA,KAAS,OAAO,IAAA,EAAM;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAC7D,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,GAAG,IAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAA;AAC5E,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAAE,QAAA,OAAO,KAAA;AAAA,MAAO;AAAA,IACnD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAMA,SAAS,cAAA,CAAe,IAAA,EAAc,IAAA,EAAc,OAAA,EAA0B;AAC5E,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,IAAA,OAAO,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,IAAA,OAAO,KAAK,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,IAAA,KAAS,WAAW,IAAA,KAAS,OAAA;AACtC;ACvIA,SAAS,iBAAA,CAAkB,QAAgB,cAAA,EAAuC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,MAAME,YAAAA,CAAaF,IAAAA,CAAK,MAAA,EAAQ,cAAc,GAAG,OAAO,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,MAAM,UAAU,EAAE,GAAG,QAAQ,YAAA,EAAc,GAAG,QAAQ,eAAA,EAAgB;AACtE,IAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,OAAO,CAAA,GAAA,KAAO,cAAA,CAAe,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACnE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAgBA,SAAS,cAAc,QAAA,EAAwC;AAC7D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA8B;AAClD,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AACzB,IAAA,cAAA,CAAe,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACxB,IAAA,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,GAAA,CAAI,GAAA,EAAK,cAAc,CAAA;AACtD,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,UAAA,EAAW;AACzC;AAEO,SAAS,mBAAmB,QAAA,EAA4C;AAC7E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAAE,IAAA,OAAO,EAAC;AAAA,EAAG;AAExC,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,UAAA,EAAW,GAAI,cAAc,QAAQ,CAAA;AAChE,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAEnD,EAAA,OAAO,SAAA,CAAU,OAAO,CAAA,EAAG;AACzB,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,OAAO,CAAA,EAAG;AAAE,QAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,MAAG;AAAA,IAChE;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAS,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA,CAAE,OAAO,OAAO,CAAA;AACxE,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAO,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAA,EAAK;AAChB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,QAAQ,QAAA,EAAU,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,GAAG,CAAA;AAEpF,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AACrB,MAAA,KAAA,MAAW,aAAc,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAI;AACpD,QAAA,QAAA,CAAS,IAAI,SAAA,EAAA,CAAY,QAAA,CAAS,IAAI,SAAS,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,kBAAkB,QAAA,EAAkD;AAClF,EAAA,OAAO,mBAAmB,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAC7D;;;AClGA,IAAM,MAAA,GAAiC;AAAA,EACrC,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EACtB,SAAA,EAAW,WAAA;AAAA,EAAa,YAAA,EAAc,WAAA;AAAA,EACtC,IAAA,EAAM,MAAA;AAAA,EAAQ,KAAA,EAAO;AACvB,CAAA;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,QAAQ,EAAC,EAAG,OAAA,EAAS,IAAI,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AACxE;AAEA,SAAS,UAAA,CACP,OAAA,EACA,IAAA,EACA,GAAA,EACA,WACA,QAAA,EACmE;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,WAAW,EAAE,GAAG,QAAQ,GAAA,EAAK,GAAG,UAAS,GAAI,KAAA,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,EAAE,GAAA,EAAK,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AACzG,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,EAAA;AAChC,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,EAAA;AAChC,IAAA,MAAM,QAAA,GAAW,OAAO,MAAA,IAAU,CAAA;AAClC,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,KAAa,CAAA,EAAG,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EACxD,SAAS,CAAA,EAAY;AACnB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAQ,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAG,UAAU,CAAA,EAAE;AAAA,EAClG;AACF;AAEA,SAAS,iBAAiB,MAAA,EAA4D;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,IAAQ,QAAQ,MAAA,EAAQ;AACnE,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAO,EAAA,KAAO,IAAA;AAAA,QAClB,KAAA,EAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA,CAAO,QAAQ;AAAC,OACvD;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,CAAS,KAAA,EAAsB,MAAA,EAAgB,MAAA,EAAgB,QAAA,EAA2B;AACjG,EAAA,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,UAAA,MAAgB,MAAA,EAAQ;AAC3C,IAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,IAAA,IAAI,UAAU,IAAA,EAAM;AAAE,MAAA,OAAO,KAAA,CAAM,EAAA;AAAA,IAAI;AAEvC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,MAAA,OAAO,OAAO,EAAA,KAAO,IAAA,IAAQ,OAAO,OAAA,KAAY,IAAA,IAAQ,OAAO,MAAA,KAAW,IAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,QAAA,KAAa,CAAA;AACtB;AAEA,SAAS,YAAA,CACP,MAAA,EAAgB,GAAA,EAAa,MAAA,EAC7B,MAAA,EAAgB,QAAgB,QAAA,EAChC,KAAA,EAAsB,WAAA,EACtB,UAAA,EAAoC,UAAA,EAC9B;AACN,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACtB,IAAA,UAAA,GAAa,WAAA,EAAa,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACtB,IAAA,MAAA,CAAO,OAAO,GAAG,CAAA,GAAI,MAAA,IAAU,MAAA,IAAU,aAAa,QAAQ,CAAA,CAAA;AAE9D,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,UAAA,MAAgB,MAAA,EAAQ;AAC3C,MAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA,CAAM,KAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,UAAA,GAAa,WAAA,EAAa,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnD;AACF;AAMA,SAAS,kBAAA,CAAmB,OAAA,EAAiB,IAAA,EAAc,UAAA,EAAiC;AAC1F,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,UAAA,GAAa,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAA,GAAK,EAAA;AAC5D,IAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAA,EAAW,aAAa,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC7E,IAAA,MAAM,MAAA,GAASG,QAAAA,CAAS,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,KAAK,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,EAAE,IAAA,EAAK;AAC3F,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,MAAA,2BAAW,GAAA,EAAI;AAAA,IAAG;AACjC,IAAA,OAAO,IAAI,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,EACpG,CAAA,CAAA,MAAQ;AACN,IAAA,2BAAW,GAAA,EAAI;AAAA,EACjB;AACF;AAEA,SAAS,oBAAA,CAAqB,QAAA,EAA8B,OAAA,EAAiB,UAAA,EAAoB,IAAA,EAAkC;AACjI,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAChE,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAAE,IAAA,OAAO,EAAC;AAAA,EAAG;AACzC,EAAA,OAAO,QAAA,CAAS,OAAO,CAAA,GAAA,KAAO;AAC5B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAE3C,IAAA,OAAO,SAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,YAAY,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA;AAAA,EACpF,CAAC,CAAA;AACH;AAEA,SAAS,cACP,KAAA,EAAsB,WAAA,EAAqB,cAC3C,OAAA,EAAiB,MAAA,EAAgB,YACjC,QAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,GAAA,GAA4C,MAAA;AAClD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO,GAAI,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,KAAA,CAAM,SAAA,IAAa,MAAS,GAAG,CAAA;AACrH,EAAA,YAAA,CAAa,QAAQ,OAAA,EAAS,QAAA,CAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,UAAU,KAAA,EAAO,WAAA,EAAa,YAAY,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AACzJ;AAEA,SAAS,cAAA,CACP,OAAsB,WAAA,EAAqB,YAAA,EAC3C,UAA8B,OAAA,EAAiB,MAAA,EAAgB,YAC/D,QAAA,EACM;AACN,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,GAAA,GAA4C,MAAA;AAClD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AAAE,MAAA;AAAA,IAAU;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA;AACjB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,CAACF,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAAE,MAAA;AAAA,IAAU;AACvC,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO,GAAI,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,YAAA,EAAc,QAAA,EAAU,KAAA,CAAM,SAAA,IAAa,MAAS,GAAG,CAAA;AACtH,IAAA,YAAA,CAAa,QAAQ,GAAA,CAAI,IAAA,EAAM,SAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,UAAU,KAAA,EAAO,WAAA,EAAa,YAAY,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,EAC1J;AACF;AAEA,SAAS,kBAAkB,KAAA,EAA0C;AACnE,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAQ;AAAE,IAAA,OAAO,MAAA;AAAA,EAAW;AAClD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAC5B,EAAA,IAAI,KAAK,CAAC,CAAA,KAAM,KAAA,IAAS,IAAA,CAAK,CAAC,CAAA,EAAG;AAAE,IAAA,OAAO,KAAK,CAAC,CAAA;AAAA,EAAG;AACpD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CAAa,QAAgB,UAAA,EAA6B;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAMC,YAAAA,CAAaF,KAAK,MAAA,EAAQ,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AAC9E,IAAA,OAAO,OAAO,OAAA,EAAS,OAAA,GAAU,UAAU,CAAA,KAAM,QAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,cACP,KAAA,EAAsB,WAAA,EAAqB,cAC3C,QAAA,EAA8B,MAAA,EAAgB,YAC9C,QAAA,EACM;AACN,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,GAAU,iBAAA,CAAkB,QAAQ,CAAA,GAAI,QAAA;AACrE,EAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,EAAE,UAAA,EAAY,UAAS,GAAI,MAAA;AAElD,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,IAAI,cAAc,CAAC,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA,EAAG;AACpD,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,UAAA,GAAa,WAAA,EAAa,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAC1C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,KAAW,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,YAAA,EAAc,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,SAAA,IAAa,MAAS,GAAG,CAAA;AACrH,IAAA,YAAA,CAAa,QAAQ,GAAA,CAAI,IAAA,EAAM,SAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,UAAU,KAAA,EAAO,WAAA,EAAa,YAAY,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,EAC1J;AACF;AAEO,SAAS,eAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACA,YACA,QAAA,EACW;AACX,EAAA,MAAM,UAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,cAAc,MAAA,CAAO,KAAA,CAAM,GAAG,WAAA,EAAa,KAAK,KAAA,CAAM,EAAA;AAC5D,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAE,MAAA,OAAA,CAAQ,WAAW,IAAI,WAAA,EAAY;AAAA,IAAG;AACnE,IAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA;AAElC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAC5B,IAAA,MAAM,eAAe,IAAA,CAAK,GAAA;AAAA,MAAI,CAAA,GAAA,KAC3B,GAAA,CAAI,KAAA,CAAM,uBAAuB,CAAA,IAAK,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAKA,IAAAA,CAAK,OAAA,EAAS,GAAG,CAAA,GAAI;AAAA,KACtF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,YAAA;AAE7B,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,aAAA,CAAc,OAAO,WAAA,EAAa,YAAA,EAAc,OAAA,EAAS,MAAA,EAAQ,UAAoB,CAAA;AAAA,IACvF,CAAA,MAAA,IAAW,UAAU,WAAA,EAAa;AAChC,MAAA,cAAA,CAAe,OAAO,WAAA,EAAa,YAAA,EAAc,UAAU,OAAA,EAAS,MAAA,EAAQ,UAAoB,CAAA;AAAA,IAClG,CAAA,MAAA,IAAW,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,UAAA,EAAY;AACvD,MAAA,MAAM,OAAmB,MAAA;AACzB,MAAA,MAAM,UAAA,GAAa,KAAA,KAAU,UAAA,GAAa,GAAA,GAAM,EAAA;AAChD,MAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,QAAA,EAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AACjF,MAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAEjC,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,GAAG,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAChD,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAAE,UAAA,UAAA,GAAa,WAAA,EAAa,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,QAAG;AAAA,MAC7E,CAAA,MAAO;AAEL,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAC/D,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AAChC,YAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,YAAA,UAAA,GAAa,WAAA,EAAa,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,UAC5C;AAAA,QACF;AACA,QAAA,aAAA,CAAc,OAAO,WAAA,EAAa,YAAA,EAAc,gBAAA,EAAkB,MAAA,EAAQ,YAAY,IAAI,CAAA;AAAA,MAC5F;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,KAAA,EAAO,WAAA,EAAa,YAAA,EAAc,QAAA,EAAU,QAAQ,UAAU,CAAA;AAAA,IAC9E;AAGA,IAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,WAAW,CAAA,CAAG,OAAA,GAAU,MAAA,CAAO,OAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AC/NO,SAAS,UAAU,OAAA,EAA+B;AACvD,EAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,OAAA,EAASI,KAAAA,CAAM,KAAK,CAAA;AAC3C,EAAA,IAAI,CAACH,UAAAA,CAAW,SAAS,CAAA,EAAG;AAAC,IAAA,OAAO,EAAC;AAAA,EAAE;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKO,SAAS,SAAA,CAAU,SAAiB,KAAA,EAA2B;AACpE,EAAA,MAAM,SAAA,GAAYF,IAAAA,CAAK,OAAA,EAASI,KAAAA,CAAM,KAAK,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAMC,QAAQ,SAAS,CAAA;AAC7B,EAAA,IAAI,CAACJ,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAAK,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACpC;AACA,EAAAC,cAAc,SAAA,EAAW,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AACzD;AAKO,SAAS,mBAAmB,MAAA,EAAwB;AACzD,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAGhC,EAAA,MAAM,WAAA,GAAcP,IAAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAC/C,EAAA,IAAIC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAOC,YAAAA,CAAa,WAAW,CAAC,CAAA;AAAA,EACvC;AAGA,EAAA,MAAM,MAAA,GAASF,IAAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACjC,EAAA,IAAIC,UAAAA,CAAW,MAAM,CAAA,EAAG;AACtB,IAAA,aAAA,CAAc,QAAQ,IAAI,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAC1B;AAEA,SAAS,aAAA,CAAc,KAAa,IAAA,EAA2C;AAC7E,EAAA,MAAM,OAAA,GAAUO,WAAAA,CAAY,GAAG,CAAA,CAAE,IAAA,EAAK;AACtC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAWR,IAAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAChC,IAAA,MAAM,IAAA,GAAOS,SAAS,QAAQ,CAAA;AAC9B,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,aAAA,CAAc,UAAU,IAAI,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,EAAO,EAAG;AACxB,MAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAOP,YAAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,IACpC;AAAA,EACF;AACF;AAeO,SAAS,gBAAA,CAAiB,MAAA,EAAgB,OAAA,EAAiB,KAAA,EAAmC;AACnG,EAAA,MAAM,IAAA,GAAO,mBAAmB,MAAM,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,CAAC,OAAO,GAAG,EAAE,IAAA,EAAM,4BAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAE,GACzD;AACF;AC3EA,SAAS,aAAa,MAAA,EAAyB;AAC7C,EAAA,MAAM,MAAA,GAASF,IAAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACjC,EAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AAEnC,EAAA,IAAI,CAACC,UAAAA,CAAW,OAAO,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AACvC,EAAA,IAAI,CAACA,UAAAA,CAAW,MAAM,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAEvC,EAAA,MAAM,QAAA,GAAW,eAAe,MAAM,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,eAAe,OAAO,CAAA;AAExC,EAAA,OAAO,QAAA,GAAW,SAAA;AACpB;AAEA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI;AACF,IAAA,MAAM,UAAUO,WAAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AACxD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWR,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACrC,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,cAAA,CAAe,QAAQ,CAAC,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQS,QAAAA,CAAS,QAAQ,EAAE,OAAO,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,UAAA,EAAW,GAAI,OAAA;AAC1C,EAAA,MAAM,MAAA,GAAsB,EAAE,MAAA,EAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAE9E,EAAA,MAAM,MAAA,GAAS,kBAAkB,QAAQ,CAAA;AAEzC,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AAExB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,UAAA,GAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI;AACF,MAAAN,SAAS,gBAAA,EAAkB;AAAA,QACzB,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,OAC/B,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAChC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,UAAA,GAAa,GAAA,CAAI,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAc;AACrB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAChC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,MAAM,MAAA,GAAA,CAAU,SAAS,MAAA,IAAU,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,IAAW,IAAI,IAAA,EAAK;AACnF,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,IAAK,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,CAAA,CAAA;AAClG,MAAA,UAAA,GAAa,GAAA,CAAI,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AC1EO,SAAS,aAAa,OAAA,EAAyC;AACpE,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,OAAA;AACjC,EAAA,MAAM,MAAA,GAAsB,EAAE,MAAA,EAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAE9E,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,MAAA,GAASH,IAAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAClC,IAAA,IAAI,CAACC,UAAAA,CAAW,MAAM,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,UAAA,GAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI;AACF,MAAAE,SAAS,oBAAA,EAAsB;AAAA,QAC7B,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,GAAA;AAAA,QACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,OAC/B,CAAA;AACD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,UAAA,GAAa,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,IACrD,SAAS,GAAA,EAAc;AACrB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,MAAM,MAAA,GAAA,CAAU,SAAS,MAAA,IAAU,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,IAAW,IAAI,IAAA,EAAK;AACnF,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,IAAK,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,CAAA,CAAA;AACjG,MAAA,UAAA,GAAa,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AChCO,SAAS,aAAa,OAAA,EAAyC;AACpE,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,OAAA;AACjC,EAAA,MAAM,MAAA,GAAsB,EAAE,MAAA,EAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAE9E,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,YAAA,GAAeH,IAAAA,CAAK,GAAA,CAAI,GAAA,EAAK,eAAe,CAAA;AAClD,IAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,UAAA,GAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI;AACF,MAAAE,SAAS,wBAAA,EAA0B;AAAA,QACjC,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,OAC/B,CAAA;AACD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,UAAA,GAAa,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,IACrD,SAAS,GAAA,EAAc;AACrB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,MAAM,MAAA,GAAA,CAAU,SAAS,MAAA,IAAU,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,IAAW,IAAI,IAAA,EAAK;AACnF,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,IAAK,CAAA,6BAAA,EAAgC,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,CAAA,CAAA;AACvG,MAAA,UAAA,GAAa,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AC/BO,SAAS,aAAa,OAAA,EAAyC;AACpE,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,OAAA;AACjC,EAAA,MAAM,MAAA,GAAsB,EAAE,MAAA,EAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAE9E,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAE1B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,CAAK,KAAA;AAAA,QACbD,aAAaF,IAAAA,CAAK,GAAA,CAAI,GAAA,EAAK,cAAc,GAAG,OAAO;AAAA,OACrD;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,UAAA,GAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAE,OAAA,CAAQ,OAAA,EAAiD,IAAA,EAAM;AACnE,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,UAAA,GAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI;AACF,MAAAG,SAAS,eAAA,EAAiB;AAAA,QACxB,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,OAC/B,CAAA;AACD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,UAAA,GAAa,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,IACrD,SAAS,GAAA,EAAc;AACrB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,MAAM,MAAA,GAAA,CAAU,SAAS,MAAA,IAAU,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,IAAW,IAAI,IAAA,EAAK;AACnF,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,IAAK,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,CAAA,CAAA;AACjG,MAAA,UAAA,GAAa,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,KAAQ,OAAO,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;ACxCO,SAAS,WAAA,CACd,OAAA,EACA,OAAA,EACA,QAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,OAAA,EAASI,KAAAA,CAAM,QAAQ,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAMC,QAAQ,QAAQ,CAAA;AAC5B,EAAA,IAAI,CAACJ,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAAK,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,OAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC7B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,cAAc,CAAA,CAAE,YAAA;AAAA,MAChB,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAW,CAAA,CAAE;AAAA,KACf,CAAE,CAAA;AAAA,IACF;AAAA,GACF;AAEA,EAAAC,cAAc,QAAA,EAAU,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACvD;;;AClCA,IAAM,YAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,WAAA;AAAA,EACP,YAAA,EAAc,WAAA;AAAA,EACd,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,gBAAA,CACP,OAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,OAAA;AAC7B,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzB,IAAA,OAAA,CAAQ,QAAQ,aAAA,CAAc;AAAA,MACnB,QAAA;AAAA,MAAU,OAAA;AAAA,MACnB,UAAA,EAAY,CAAC,GAAA,EAAK,MAAA,EAAQ,UAAA,KAAe,QAAQ,UAAA,GAAa,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,UAAU;AAAA,KAC/F,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,OAAO,YAAA,CAAa;AAAA,MACjB,QAAA;AAAA,MACT,UAAA,EAAY,CAAC,GAAA,EAAK,MAAA,EAAQ,UAAA,KAAe,QAAQ,UAAA,GAAa,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,UAAU;AAAA,KAC9F,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,YAAY,YAAA,CAAa;AAAA,MACtB,QAAA;AAAA,MACT,UAAA,EAAY,CAAC,GAAA,EAAK,MAAA,EAAQ,UAAA,KAAe,QAAQ,UAAA,GAAa,WAAA,EAAa,GAAA,EAAK,MAAA,EAAQ,UAAU;AAAA,KACnG,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,OAAO,YAAA,CAAa;AAAA,MACjB,QAAA;AAAA,MACT,UAAA,EAAY,CAAC,GAAA,EAAK,MAAA,EAAQ,UAAA,KAAe,QAAQ,UAAA,GAAa,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,UAAU;AAAA,KAC9F,CAAA;AAAA,EACH;AACF;AAOA,eAAsB,MAAM,OAAA,EAA6C;AACvE,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,OAAA;AAE7B,EAAA,MAAM,UAAU,IAAI,GAAA;AAAA,IAAA,CACjB,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG,GAAA,CAAI,CAAA,CAAA,KAAK,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,CAAA,CAAE,aAAa;AAAA,GACtF;AAEA,EAAA,MAAM,MAAA,GAAS,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AACpF,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,QAAQ,cAAc,CAAA;AAC7E,EAAA,IAAI,KAAA,GAAQ,OAAA,GAAU,EAAC,GAAI,UAAU,OAAO,CAAA;AAE5C,EAAA,MAAM,UAAqB,EAAC;AAE5B,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/C,IAAA,MAAM,eAAe,OAAA,CAAQ,IAAA,GAAO,CAAA,GAChC,OAAA,CAAQ,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,OAAA,CAAQ,IAAI,CAAA,CAAE,EAAA,CAAG,aAAa,CAAC,IAC3D,OAAA,CAAQ,MAAA;AACZ,IAAA,MAAA,CAAO,OAAO,OAAA,EAAS,eAAA;AAAA,MAAgB,YAAA;AAAA,MAAc,QAAA;AAAA,MAAU,OAAA;AAAA,MAC7D,CAAC,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,UAAA,KAAe;AAAE,QAAA,OAAA,CAAQ,UAAA,GAAa,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAA,MAAG;AAAA,KACjG,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,gBAAA,CAAiB,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,KAAA,GAAQ,gBAAA,CAAiB,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,IACnD;AACA,IAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,aAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,IAAI,SAAA,IAAa,CAAC,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1C,MAAA,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,SAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,WAAA,CAAY,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAS,CAAA;AAEnG,EAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAC7B;;;ACzFA,SAAS,WAAW,OAAA,EAAqD;AACvE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASJ,SAAS,4BAAA,EAA8B;AAAA,MACpD,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU;AAAA,KACX,EAAE,IAAA,EAAK;AACR,IAAA,MAAM,MAAA,GAASA,SAAS,iCAAA,EAAmC;AAAA,MACzD,GAAA,EAAK,OAAA;AAAA,MACL,QAAA,EAAU;AAAA,KACX,EAAE,IAAA,EAAK;AACR,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU;AAAA,EAChD;AACF;AAKO,SAAS,yBAAA,CACd,SACA,OAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,WAAW,OAAO,CAAA;AAC9B,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,GAAA;AAAA,IACA,SAAS;AAAC,GACZ;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,CAAA,GAAI,QAAQ,EAAE,CAAA;AACpB,IAAA,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,MACrB,MAAA,EAAQ,EAAE,MAAA,CAAO,MAAA;AAAA,MACjB,MAAA,EAAQ,EAAE,MAAA,CAAO,MAAA;AAAA,MACjB,cAAA,EAAgB,CAAC,GAAG,CAAA,CAAE,MAAM;AAAA,KAC9B;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,eAAsB,gBAAgB,OAAA,EAA4C;AAChF,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,KAAA,CAAM,EAAE,SAAS,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,OAAA,EAAS,OAAO,CAAA;AAC3D,EAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAC9B,EAAA,OAAO,QAAA;AACT;;;ACjDO,SAAS,mBAAA,CACd,SACA,QAAA,EACc;AACd,EAAA,MAAM,OAAO,EAAC;AAEd,EAAA,MAAM,aAAa,CAAC,uBAAO,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,SAAS,OAAO,CAAC,CAAC,CAAC,CAAA;AAE3F,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,EAAG,MAAA,IAAU,EAAE,CAAA;AACjD,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,EAAE,CAAA,EAAG,cAAA,IAAkB,EAAE,CAAA;AAEzE,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AACrE,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,cAAc,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAErE,IAAA,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA,MACT,WAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA,EAAO,OAAA,CAAQ,IAAA,GAAO,cAAA,CAAe;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT","file":"index.js","sourcesContent":["import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\nimport type { BaselineSnapshot } from '@kb-labs/qa-contracts';\n\n/**\n * Load baseline snapshot from disk.\n */\nexport function loadBaseline(rootDir: string): BaselineSnapshot | null {\n const path = join(rootDir, PATHS.BASELINE);\n if (!existsSync(path)) {return null;}\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Save baseline snapshot to disk.\n */\nexport function saveBaseline(rootDir: string, snapshot: BaselineSnapshot): void {\n const path = join(rootDir, PATHS.BASELINE);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(snapshot, null, 2));\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SubmoduleInfo } from '@kb-labs/qa-contracts';\n\n/**\n * Get git submodule info for a repo directory.\n * Returns null if the directory is not a git repo.\n */\nexport function getSubmoduleInfo(repoDir: string, repoName: string): SubmoduleInfo | null {\n const gitDir = join(repoDir, '.git');\n if (!existsSync(gitDir)) {return null;}\n\n try {\n const commit = execSync('git rev-parse --short HEAD', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const message = execSync('git log -1 --format=%s', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const statusOutput = execSync('git status --porcelain', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n return {\n name: repoName,\n commit,\n branch,\n dirty: statusOutput.length > 0,\n message,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Collect submodule info for all unique repos from a list of packages.\n * Caches by repo name to avoid redundant git calls.\n */\nexport function collectSubmoduleInfo(\n rootDir: string,\n repos: string[],\n): Record<string, SubmoduleInfo> {\n const result: Record<string, SubmoduleInfo> = {};\n\n for (const repo of repos) {\n const repoDir = join(rootDir, repo);\n const info = getSubmoduleInfo(repoDir, repo);\n if (info) {\n result[repo] = info;\n }\n }\n\n return result;\n}\n","import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { WorkspacePackage, PackageFilter, SubmoduleInfo } from '@kb-labs/qa-contracts';\nimport type { PackagesConfig } from '@kb-labs/qa-contracts';\nimport { getSubmoduleInfo } from './submodule-info.js';\n\nfunction hasWorkspace(dir: string): boolean {\n return existsSync(join(dir, 'pnpm-workspace.yaml'));\n}\n\nfunction isDir(p: string): boolean {\n return existsSync(p) && statSync(p).isDirectory();\n}\n\nfunction buildCandidatesFromConfig(rootDir: string, paths: string[]): string[] {\n const candidates: string[] = [];\n for (const pattern of paths) {\n const parts = pattern.split('/');\n if (parts.length === 2 && parts[1] === '*' && parts[0]) {\n const categoryDir = join(rootDir, parts[0]);\n if (!isDir(categoryDir)) { continue; }\n try {\n for (const sub of readdirSync(categoryDir)) {\n if (sub.startsWith('.') || sub === 'node_modules') { continue; }\n const subPath = join(categoryDir, sub);\n if (isDir(subPath) && hasWorkspace(subPath)) { candidates.push(subPath); }\n }\n } catch { /* skip unreadable dirs */ }\n } else {\n const exactPath = join(rootDir, pattern);\n if (isDir(exactPath) && hasWorkspace(exactPath)) { candidates.push(exactPath); }\n }\n }\n return candidates;\n}\n\nfunction buildCandidatesAutoScan(rootDir: string): string[] {\n const candidates: string[] = [];\n for (const entry of readdirSync(rootDir)) {\n if (entry.startsWith('.') || entry === 'node_modules' || entry === 'dist') { continue; }\n const entryPath = join(rootDir, entry);\n if (!isDir(entryPath)) { continue; }\n if (hasWorkspace(entryPath)) {\n candidates.push(entryPath);\n } else {\n try {\n for (const sub of readdirSync(entryPath)) {\n if (sub.startsWith('.') || sub === 'node_modules') { continue; }\n const subPath = join(entryPath, sub);\n if (isDir(subPath) && hasWorkspace(subPath)) { candidates.push(subPath); }\n }\n } catch { /* skip unreadable dirs */ }\n }\n }\n return candidates;\n}\n\nfunction scanSubDir(\n parentDir: string,\n entryPath: string,\n repoName: string,\n rootDir: string,\n submodule: SubmoduleInfo | undefined,\n packages: WorkspacePackage[],\n): void {\n if (!isDir(parentDir)) { return; }\n for (const pkgDir of readdirSync(parentDir)) {\n const pkgPath = join(parentDir, pkgDir);\n const pkgJsonPath = join(pkgPath, 'package.json');\n if (!existsSync(pkgJsonPath)) { continue; }\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n packages.push({\n name: pkgJson.name || pkgDir,\n dir: pkgPath,\n relativePath: relative(rootDir, pkgPath),\n repo: repoName,\n submodule,\n });\n } catch { /* skip invalid package.json */ }\n }\n}\n\n/**\n * Discover all workspace packages in the monorepo.\n *\n * If packagesConfig.paths is set, use those glob-expanded paths to find sub-monorepos.\n * Otherwise fall back to auto-scan (supports both flat and nested layouts).\n */\nexport function getWorkspacePackages(\n rootDir: string,\n filter?: PackageFilter,\n packagesConfig?: PackagesConfig,\n): WorkspacePackage[] {\n const packages: WorkspacePackage[] = [];\n const submoduleCache = new Map<string, SubmoduleInfo | null>();\n\n function getSubmoduleCached(entryPath: string, repoName: string): SubmoduleInfo | undefined {\n if (!submoduleCache.has(repoName)) {\n submoduleCache.set(repoName, getSubmoduleInfo(entryPath, repoName));\n }\n return submoduleCache.get(repoName) ?? undefined;\n }\n\n const candidates =\n packagesConfig?.paths && packagesConfig.paths.length > 0\n ? buildCandidatesFromConfig(rootDir, packagesConfig.paths)\n : buildCandidatesAutoScan(rootDir);\n\n for (const entryPath of candidates) {\n const repoName = relative(rootDir, entryPath);\n const submodule = getSubmoduleCached(entryPath, repoName);\n scanSubDir(join(entryPath, 'packages'), entryPath, repoName, rootDir, submodule, packages);\n scanSubDir(join(entryPath, 'apps'), entryPath, repoName, rootDir, submodule, packages);\n }\n\n let filtered = packages;\n if (packagesConfig?.include && packagesConfig.include.length > 0) {\n filtered = filtered.filter(pkg =>\n packagesConfig.include!.some(pattern => matchesPattern(pkg.name, pkg.repo, pattern))\n );\n }\n if (packagesConfig?.exclude && packagesConfig.exclude.length > 0) {\n filtered = filtered.filter(pkg =>\n !packagesConfig.exclude!.some(pattern => matchesPattern(pkg.name, pkg.repo, pattern))\n );\n }\n\n if (!filter) { return filtered; }\n\n return filtered.filter((pkg) => {\n if (filter.package && !pkg.name.includes(filter.package)) { return false; }\n if (filter.repo && pkg.repo !== filter.repo) { return false; }\n if (filter.scope) {\n const scope = filter.scope.startsWith('@') ? filter.scope : `@${filter.scope}`;\n if (!pkg.name.startsWith(scope)) { return false; }\n }\n return true;\n });\n}\n\n/**\n * Match a package against a pattern.\n * Supports: exact name, \"@kb-labs/core-*\" glob, \"kb-labs-cli/*\" repo prefix.\n */\nfunction matchesPattern(name: string, repo: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return repo === prefix || repo.startsWith(prefix + '/');\n }\n if (pattern.endsWith('*')) {\n return name.startsWith(pattern.slice(0, -1));\n }\n return name === pattern || repo === pattern;\n}\n","/**\n * Topological sort for workspace packages (Kahn's algorithm).\n * Computes build layers from package.json dependencies.\n * No external dependencies — standalone implementation.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { WorkspacePackage } from '@kb-labs/qa-contracts';\n\nexport interface BuildLayer {\n index: number;\n packages: WorkspacePackage[];\n}\n\n/**\n * Read workspace-internal dependencies from a package.json.\n * Returns only dependency names that exist in the workspace package set.\n */\nfunction readWorkspaceDeps(pkgDir: string, workspaceNames: Set<string>): string[] {\n try {\n const raw = readFileSync(join(pkgDir, 'package.json'), 'utf-8');\n const pkgJson = JSON.parse(raw);\n const allDeps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n return Object.keys(allDeps).filter(dep => workspaceNames.has(dep));\n } catch {\n return [];\n }\n}\n\n/**\n * Compute build layers via topological sort (Kahn's algorithm).\n *\n * Layer 0 = packages with no workspace dependencies (can build first).\n * Layer N = packages whose deps are all in layers 0..N-1.\n *\n * Circular dependencies are appended as the last layer with a warning.\n */\ninterface DepGraph {\n nameMap: Map<string, WorkspacePackage>;\n inDegree: Map<string, number>;\n dependents: Map<string, string[]>;\n}\n\nfunction buildDepGraph(packages: WorkspacePackage[]): DepGraph {\n const nameMap = new Map<string, WorkspacePackage>();\n const workspaceNames = new Set<string>();\n for (const pkg of packages) {\n nameMap.set(pkg.name, pkg);\n workspaceNames.add(pkg.name);\n }\n\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const pkg of packages) {\n inDegree.set(pkg.name, 0);\n dependents.set(pkg.name, []);\n }\n for (const pkg of packages) {\n const deps = readWorkspaceDeps(pkg.dir, workspaceNames);\n inDegree.set(pkg.name, deps.length);\n for (const dep of deps) {\n dependents.get(dep)!.push(pkg.name);\n }\n }\n return { nameMap, inDegree, dependents };\n}\n\nexport function computeBuildLayers(packages: WorkspacePackage[]): BuildLayer[] {\n if (packages.length === 0) { return []; }\n\n const { nameMap, inDegree, dependents } = buildDepGraph(packages);\n const layers: BuildLayer[] = [];\n const remaining = new Set(packages.map(p => p.name));\n\n while (remaining.size > 0) {\n const layerNames: string[] = [];\n for (const name of remaining) {\n if ((inDegree.get(name) ?? 0) === 0) { layerNames.push(name); }\n }\n\n if (layerNames.length === 0) {\n const circular = [...remaining].map(n => nameMap.get(n)!).filter(Boolean);\n layers.push({ index: layers.length, packages: circular });\n break;\n }\n\n layerNames.sort();\n layers.push({ index: layers.length, packages: layerNames.map(n => nameMap.get(n)!) });\n\n for (const name of layerNames) {\n remaining.delete(name);\n for (const dependent of (dependents.get(name) ?? [])) {\n inDegree.set(dependent, (inDegree.get(dependent) ?? 0) - 1);\n }\n }\n }\n\n return layers;\n}\n\n/**\n * Sort packages in dependency order (topological sort).\n * Packages with no deps come first, dependents come after their deps.\n */\nexport function sortByBuildLayers(packages: WorkspacePackage[]): WorkspacePackage[] {\n return computeBuildLayers(packages).flatMap(l => l.packages);\n}\n","import { spawnSync, execSync } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport type { QACheckConfig, QAResults, WorkspacePackage, CheckItem } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ntype Bucket = { passed: string[]; failed: string[]; skipped: string[]; errors: Record<string, string>; details: Record<string, CheckItem[]> };\ntype ProgressFn = (checkId: string, pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n\nconst ID_MAP: Record<string, string> = {\n build: 'build', lint: 'lint',\n typecheck: 'typeCheck', 'type-check': 'typeCheck',\n test: 'test', tests: 'test',\n};\n\nfunction emptyResult(): Bucket {\n return { passed: [], failed: [], skipped: [], errors: {}, details: {} };\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n timeoutMs: number,\n extraEnv?: Record<string, string>,\n): { ok: boolean; stdout: string; stderr: string; exitCode: number } {\n try {\n const env = extraEnv ? { ...process.env, ...extraEnv } : undefined;\n const result = spawnSync(command, args, { cwd, timeout: timeoutMs, encoding: 'utf-8', shell: false, env });\n const stdout = result.stdout ?? '';\n const stderr = result.stderr ?? '';\n const exitCode = result.status ?? 1;\n return { ok: exitCode === 0, stdout, stderr, exitCode };\n } catch (e: unknown) {\n return { ok: false, stdout: '', stderr: e instanceof Error ? e.message : String(e), exitCode: 1 };\n }\n}\n\nfunction parseTypedOutput(stdout: string): { ok: boolean; items: CheckItem[] } | null {\n try {\n const parsed = JSON.parse(stdout);\n if (typeof parsed === 'object' && parsed !== null && 'ok' in parsed) {\n return {\n ok: parsed.ok === true,\n items: Array.isArray(parsed.items) ? parsed.items : [],\n };\n }\n } catch {\n // not JSON\n }\n return null;\n}\n\nfunction evaluate(check: QACheckConfig, stdout: string, stderr: string, exitCode: number): boolean {\n if ((check.parser ?? 'exitcode') === 'json') {\n const typed = parseTypedOutput(stdout);\n if (typed !== null) { return typed.ok; }\n // fallback: legacy json format\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n return exitCode === 0;\n}\n\nfunction recordResult(\n bucket: Bucket, key: string, passed: boolean,\n stdout: string, stderr: string, exitCode: number,\n check: QACheckConfig, canonicalId: string,\n onProgress: ProgressFn | undefined, durationMs: number,\n): void {\n if (passed) {\n bucket.passed.push(key);\n onProgress?.(canonicalId, key, 'pass', durationMs);\n } else {\n bucket.failed.push(key);\n bucket.errors[key] = stderr || stdout || `Exit code ${exitCode}`;\n // Capture structured items for json parser\n if ((check.parser ?? 'exitcode') === 'json') {\n const typed = parseTypedOutput(stdout);\n if (typed && typed.items.length > 0) {\n bucket.details[key] = typed.items;\n }\n }\n onProgress?.(canonicalId, key, 'fail', durationMs);\n }\n}\n\n/**\n * Get the set of package relative paths touched by the current branch diff.\n * diffFilter: '' = all changed, 'A' = only added files.\n */\nfunction getDiffPackageDirs(rootDir: string, base: string, diffFilter: string): Set<string> {\n try {\n const filter = diffFilter ? `--diff-filter=${diffFilter}` : '';\n const args = ['diff', filter, `${base}...HEAD`, '--name-only'].filter(Boolean);\n const output = execSync(`git ${args.join(' ')}`, { cwd: rootDir, encoding: 'utf-8' }).trim();\n if (!output) { return new Set(); }\n return new Set(output.split('\\n').map(f => f.split('/')[0]).filter((s): s is string => Boolean(s)));\n } catch {\n return new Set();\n }\n}\n\nfunction filterPackagesByDiff(packages: WorkspacePackage[], rootDir: string, diffFilter: string, base: string): WorkspacePackage[] {\n const touchedDirs = getDiffPackageDirs(rootDir, base, diffFilter);\n if (touchedDirs.size === 0) { return []; }\n return packages.filter(pkg => {\n const relParts = pkg.relativePath.split('/');\n // Match if any path segment prefix matches touched top-level dirs\n return relParts.some((_, i) => touchedDirs.has(relParts.slice(0, i + 1).join('/')));\n });\n}\n\nfunction runInRepoRoot(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n diffBase?: string,\n): void {\n const startMs = Date.now();\n const env = diffBase ? { KB_QA_BASE: diffBase } : undefined;\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, rootDir, check.timeoutMs ?? 120_000, env);\n recordResult(bucket, rootDir, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);\n}\n\nfunction runInScopePath(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n packages: WorkspacePackage[], rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n diffBase?: string,\n): void {\n const seen = new Set<string>();\n const env = diffBase ? { KB_QA_BASE: diffBase } : undefined;\n for (const pkg of packages) {\n if (seen.has(pkg.repo)) { continue; }\n seen.add(pkg.repo);\n const scopeDir = resolve(rootDir, pkg.repo);\n if (!existsSync(scopeDir)) { continue; }\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, scopeDir, check.timeoutMs ?? 120_000, env);\n recordResult(bucket, pkg.repo, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nfunction getPnpmScriptName(check: QACheckConfig): string | undefined {\n if (check.command !== 'pnpm') { return undefined; }\n const args = check.args ?? [];\n if (args[0] === 'run' && args[1]) { return args[1]; }\n return undefined;\n}\n\nfunction hasNpmScript(pkgDir: string, scriptName: string): boolean {\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf-8'));\n return typeof pkgJson?.scripts?.[scriptName] === 'string';\n } catch {\n return false;\n }\n}\n\nfunction runPerPackage(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n packages: WorkspacePackage[], bucket: Bucket, onProgress: ProgressFn | undefined,\n diffBase?: string,\n): void {\n const sortedPackages = check.ordered ? sortByBuildLayers(packages) : packages;\n const scriptName = getPnpmScriptName(check);\n const env = diffBase ? { KB_QA_BASE: diffBase } : undefined;\n\n for (const pkg of sortedPackages) {\n if (scriptName && !hasNpmScript(pkg.dir, scriptName)) {\n bucket.skipped.push(pkg.name);\n onProgress?.(canonicalId, pkg.name, 'skip');\n continue;\n }\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, pkg.dir, check.timeoutMs ?? 120_000, env);\n recordResult(bucket, pkg.name, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nexport function runCustomChecks(\n checks: QACheckConfig[],\n packages: WorkspacePackage[],\n rootDir: string,\n onProgress?: ProgressFn,\n diffBase?: string,\n): QAResults {\n const results: QAResults = {};\n\n for (const check of checks) {\n const canonicalId = ID_MAP[check.id.toLowerCase()] ?? check.id;\n if (!results[canonicalId]) { results[canonicalId] = emptyResult(); }\n const bucket = results[canonicalId]! as Bucket;\n\n const args = check.args ?? [];\n const resolvedArgs = args.map(arg =>\n (arg.match(/\\.(sh|js|ts|mjs|cjs)$/) && !arg.startsWith('/')) ? join(rootDir, arg) : arg\n );\n\n const runIn = check.runIn ?? 'perPackage';\n\n if (runIn === 'repoRoot') {\n runInRepoRoot(check, canonicalId, resolvedArgs, rootDir, bucket, onProgress, diffBase);\n } else if (runIn === 'scopePath') {\n runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress, diffBase);\n } else if (runIn === 'diffOnly' || runIn === 'newFiles') {\n const base = diffBase ?? 'main';\n const diffFilter = runIn === 'newFiles' ? 'A' : '';\n const filteredPackages = filterPackagesByDiff(packages, rootDir, diffFilter, base);\n if (filteredPackages.length === 0) {\n // No affected packages — skip entirely, not a failure\n bucket.skipped.push(...packages.map(p => p.name));\n for (const pkg of packages) { onProgress?.(canonicalId, pkg.name, 'skip'); }\n } else {\n // Packages not touched by diff → skip them\n const filteredNames = new Set(filteredPackages.map(p => p.name));\n for (const pkg of packages) {\n if (!filteredNames.has(pkg.name)) {\n bucket.skipped.push(pkg.name);\n onProgress?.(canonicalId, pkg.name, 'skip');\n }\n }\n runPerPackage(check, canonicalId, resolvedArgs, filteredPackages, bucket, onProgress, base);\n }\n } else {\n runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress);\n }\n\n // Promote details to CheckResult if any items were captured\n if (Object.keys(bucket.details).length > 0) {\n results[canonicalId]!.details = bucket.details;\n }\n }\n\n return results;\n}\n","import { createHash } from 'node:crypto';\nimport { readFileSync, writeFileSync, existsSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\n\ninterface CacheEntry {\n hash: string;\n timestamp: string;\n}\n\nexport type PackageCache = Record<string, CacheEntry>;\n\n/**\n * Load package hash cache from disk.\n */\nexport function loadCache(rootDir: string): PackageCache {\n const cachePath = join(rootDir, PATHS.CACHE);\n if (!existsSync(cachePath)) {return {};}\n try {\n return JSON.parse(readFileSync(cachePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\n/**\n * Save package hash cache to disk.\n */\nexport function saveCache(rootDir: string, cache: PackageCache): void {\n const cachePath = join(rootDir, PATHS.CACHE);\n const dir = dirname(cachePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n}\n\n/**\n * Compute SHA256 hash for a package based on its source files and package.json.\n */\nexport function computePackageHash(pkgDir: string): string {\n const hash = createHash('sha256');\n\n // Hash package.json\n const pkgJsonPath = join(pkgDir, 'package.json');\n if (existsSync(pkgJsonPath)) {\n hash.update(readFileSync(pkgJsonPath));\n }\n\n // Hash all files in src/\n const srcDir = join(pkgDir, 'src');\n if (existsSync(srcDir)) {\n hashDirectory(srcDir, hash);\n }\n\n return hash.digest('hex');\n}\n\nfunction hashDirectory(dir: string, hash: ReturnType<typeof createHash>): void {\n const entries = readdirSync(dir).sort();\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n hashDirectory(fullPath, hash);\n } else if (stat.isFile()) {\n hash.update(fullPath);\n hash.update(readFileSync(fullPath));\n }\n }\n}\n\n/**\n * Check if a package has changed since last cached hash.\n */\nexport function hasPackageChanged(pkgDir: string, pkgName: string, cache: PackageCache): boolean {\n const currentHash = computePackageHash(pkgDir);\n const cached = cache[pkgName];\n if (!cached) {return true;}\n return cached.hash !== currentHash;\n}\n\n/**\n * Update cache entry for a package.\n */\nexport function updateCacheEntry(pkgDir: string, pkgName: string, cache: PackageCache): PackageCache {\n const hash = computePackageHash(pkgDir);\n return {\n ...cache,\n [pkgName]: { hash, timestamp: new Date().toISOString() },\n };\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, statSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ninterface BuildRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n noCache?: boolean;\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Check if a package needs rebuilding by comparing src/ mtime vs dist/ mtime.\n */\nfunction needsRebuild(pkgDir: string): boolean {\n const srcDir = join(pkgDir, 'src');\n const distDir = join(pkgDir, 'dist');\n\n if (!existsSync(distDir)) {return true;}\n if (!existsSync(srcDir)) {return false;}\n\n const srcMtime = getLatestMtime(srcDir);\n const distMtime = getLatestMtime(distDir);\n\n return srcMtime > distMtime;\n}\n\nfunction getLatestMtime(dir: string): number {\n let latest = 0;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n latest = Math.max(latest, getLatestMtime(fullPath));\n } else {\n latest = Math.max(latest, statSync(fullPath).mtimeMs);\n }\n }\n } catch {\n // ignore\n }\n return latest;\n}\n\n/**\n * Run build checks across all packages.\n * Uses incremental builds — only rebuilds packages where src/ is newer than dist/.\n * Builds in dependency order (topological sort) so DTS files are available for downstream packages.\n */\nexport function runBuildCheck(options: BuildRunnerOptions): CheckResult {\n const { packages, noCache, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n const sorted = sortByBuildLayers(packages);\n\n for (const pkg of sorted) {\n // Check if rebuild needed (incremental)\n if (!noCache && !needsRebuild(pkg.dir)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm run build', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const durationMs = Date.now() - startMs;\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', durationMs);\n } catch (err: unknown) {\n const durationMs = Date.now() - startMs;\n result.failed.push(pkg.name);\n const spawnErr = err as { stderr?: string; stdout?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stderr || spawnErr.stdout || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Build failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', durationMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface LintRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run ESLint check on all packages.\n */\nexport function runLintCheck(options: LintRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n const srcDir = join(pkg.dir, 'src');\n if (!existsSync(srcDir)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm exec eslint .', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 60000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: unknown) {\n result.failed.push(pkg.name);\n const spawnErr = err as { stdout?: string; stderr?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Lint failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface TypeRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run TypeScript type checking on all packages.\n */\nexport function runTypeCheck(options: TypeRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n const tsconfigPath = join(pkg.dir, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm exec tsc --noEmit', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: unknown) {\n result.failed.push(pkg.name);\n const spawnErr = err as { stdout?: string; stderr?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Type check failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface TestRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run Vitest tests on all packages.\n * Uses --passWithNoTests so packages without tests pass.\n */\nexport function runTestCheck(options: TestRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n // Check if package has test script\n let pkgJson: Record<string, unknown>;\n try {\n pkgJson = JSON.parse(\n readFileSync(join(pkg.dir, 'package.json'), 'utf-8')\n );\n } catch {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n if (!(pkgJson.scripts as Record<string, unknown> | undefined)?.test) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm run test', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: unknown) {\n result.failed.push(pkg.name);\n const spawnErr = err as { stdout?: string; stderr?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Test failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\nimport type { QAResults, WorkspacePackage, SubmoduleInfo } from '@kb-labs/qa-contracts';\n\n/**\n * Stored last-run data: full results + package metadata.\n */\nexport interface LastRunData {\n timestamp: string;\n results: QAResults;\n packages: WorkspacePackage[];\n submodules?: Record<string, SubmoduleInfo>;\n}\n\n/**\n * Save full QA results to disk for the details endpoint.\n */\nexport function saveLastRun(\n rootDir: string,\n results: QAResults,\n packages: WorkspacePackage[],\n submodules?: Record<string, SubmoduleInfo>,\n): void {\n const filePath = join(rootDir, PATHS.LAST_RUN);\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const data: LastRunData = {\n timestamp: new Date().toISOString(),\n results,\n packages: packages.map((p) => ({\n name: p.name,\n dir: p.dir,\n relativePath: p.relativePath,\n repo: p.repo,\n submodule: p.submodule,\n })),\n submodules,\n };\n\n writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\n/**\n * Load last-run data from disk.\n */\nexport function loadLastRun(rootDir: string): LastRunData | null {\n const filePath = join(rootDir, PATHS.LAST_RUN);\n if (!existsSync(filePath)) {return null;}\n\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n","import type { QARunOptions, QAResults, QARunResult, SubmoduleInfo, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { getWorkspacePackages } from './workspace.js';\nimport { runCustomChecks } from './custom-check-runner.js';\nimport { loadCache, saveCache, updateCacheEntry } from './cache.js';\nimport { runBuildCheck } from './build-runner.js';\nimport { runLintCheck } from './lint-runner.js';\nimport { runTypeCheck } from './type-runner.js';\nimport { runTestCheck } from './test-runner.js';\nimport { saveLastRun } from './last-run-store.js';\n\nconst SKIP_ALIASES: Record<string, string> = {\n types: 'typecheck',\n 'type-check': 'typecheck',\n tests: 'test',\n};\n\nfunction runBuiltinChecks(\n options: QARunOptions,\n packages: WorkspacePackage[],\n skipSet: Set<string>,\n results: QAResults,\n): void {\n const { rootDir, noCache } = options;\n if (!skipSet.has('build')) {\n results.build = runBuildCheck({\n rootDir, packages, noCache,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('build', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('lint')) {\n results.lint = runLintCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('lint', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('typecheck')) {\n results.typeCheck = runTypeCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('typeCheck', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('test')) {\n results.test = runTestCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('test', pkg, status, durationMs),\n });\n }\n}\n\n/**\n * Run all QA checks in order: build → lint → typeCheck → test.\n * Respects skip flags and package filters.\n * If options.checks is provided, uses custom check runners instead of built-ins.\n */\nexport async function runQA(options: QARunOptions): Promise<QARunResult> {\n const { rootDir, noCache } = options;\n\n const skipSet = new Set(\n (options.skipChecks ?? []).map(s => SKIP_ALIASES[s.toLowerCase()] ?? s.toLowerCase()),\n );\n\n const filter = { package: options.package, repo: options.repo, scope: options.scope };\n const packages = getWorkspacePackages(rootDir, filter, options.packagesConfig);\n let cache = noCache ? {} : loadCache(rootDir);\n\n const results: QAResults = {};\n\n if (options.checks && options.checks.length > 0) {\n const activeChecks = skipSet.size > 0\n ? options.checks.filter(c => !skipSet.has(c.id.toLowerCase()))\n : options.checks;\n Object.assign(results, runCustomChecks(activeChecks, packages, rootDir,\n (checkId, pkg, status, durationMs) => { options.onProgress?.(checkId, pkg, status, durationMs); },\n ));\n } else {\n runBuiltinChecks(options, packages, skipSet, results);\n }\n\n if (!noCache) {\n for (const pkg of packages) {\n cache = updateCacheEntry(pkg.dir, pkg.name, cache);\n }\n saveCache(rootDir, cache);\n }\n\n const submodules: Record<string, SubmoduleInfo> = {};\n for (const pkg of packages) {\n if (pkg.submodule && !submodules[pkg.repo]) {\n submodules[pkg.repo] = pkg.submodule;\n }\n }\n saveLastRun(rootDir, results, packages, Object.keys(submodules).length > 0 ? submodules : undefined);\n\n return { results, packages };\n}\n","import { execSync } from 'node:child_process';\nimport type { BaselineSnapshot, QAResults } from '@kb-labs/qa-contracts';\nimport { runQA } from '../runner/qa-orchestrator.js';\nimport { saveBaseline } from './baseline-store.js';\n\nfunction getGitInfo(rootDir: string): { commit: string; branch: string } {\n try {\n const commit = execSync('git rev-parse --short HEAD', {\n cwd: rootDir,\n encoding: 'utf-8',\n }).trim();\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: rootDir,\n encoding: 'utf-8',\n }).trim();\n return { commit, branch };\n } catch {\n return { commit: 'unknown', branch: 'unknown' };\n }\n}\n\n/**\n * Create a baseline snapshot from QA results.\n */\nexport function createBaselineFromResults(\n results: QAResults,\n rootDir: string,\n): BaselineSnapshot {\n const git = getGitInfo(rootDir);\n const snapshot: BaselineSnapshot = {\n timestamp: new Date().toISOString(),\n git,\n results: {} as BaselineSnapshot['results'],\n };\n\n for (const ct of Object.keys(results)) {\n const r = results[ct]!;\n snapshot.results[ct] = {\n passed: r.passed.length,\n failed: r.failed.length,\n failedPackages: [...r.failed],\n };\n }\n\n return snapshot;\n}\n\n/**\n * Run full QA and capture baseline.\n */\nexport async function captureBaseline(rootDir: string): Promise<BaselineSnapshot> {\n const { results } = await runQA({ rootDir });\n const snapshot = createBaselineFromResults(results, rootDir);\n saveBaseline(rootDir, snapshot);\n return snapshot;\n}\n","import type { QAResults, BaselineSnapshot, BaselineDiff } from '@kb-labs/qa-contracts';\n\n/**\n * Compare current QA results with a baseline snapshot.\n * Returns per-check-type diff with newFailures, fixed, stillFailing, delta.\n */\nexport function compareWithBaseline(\n results: QAResults,\n baseline: BaselineSnapshot,\n): BaselineDiff {\n const diff = {} as BaselineDiff;\n\n const checkTypes = [...new Set([...Object.keys(results), ...Object.keys(baseline.results)])];\n\n for (const ct of checkTypes) {\n const current = new Set(results[ct]?.failed ?? []);\n const baselineFailed = new Set(baseline.results[ct]?.failedPackages ?? []);\n\n const newFailures = [...current].filter((p) => !baselineFailed.has(p));\n const fixed = [...baselineFailed].filter((p) => !current.has(p));\n const stillFailing = [...current].filter((p) => baselineFailed.has(p));\n\n diff[ct] = {\n newFailures,\n fixed,\n stillFailing,\n delta: current.size - baselineFailed.size,\n };\n }\n\n return diff;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { HistoryEntry, QAResults, WorkspacePackage, EnrichedTrendResult, TrendResult, RegressionResult, PackageTimelineResponse } from '@kb-labs/qa-contracts';
1
+ import { HistoryEntry, QACheckConfig, QAResults, WorkspacePackage, EnrichedTrendResult, TrendResult, RegressionResult, PackageTimelineResponse } from '@kb-labs/qa-contracts';
2
2
 
3
3
  /**
4
4
  * Load history entries from disk.
@@ -11,11 +11,22 @@ declare function saveHistory(rootDir: string, entries: HistoryEntry[]): void;
11
11
  /**
12
12
  * Create a history entry from QA results.
13
13
  */
14
- declare function createHistoryEntry(results: QAResults, rootDir: string, packages?: WorkspacePackage[]): HistoryEntry;
14
+ declare function createHistoryEntry(results: QAResults, rootDir: string, packages?: WorkspacePackage[], runContext?: HistoryEntry['runContext']): HistoryEntry;
15
15
  /**
16
16
  * Append a history entry, keeping max HISTORY_MAX_ENTRIES.
17
+ * If checks config is provided, also writes to per-check trend store for checks with trending:true.
17
18
  */
18
- declare function appendEntry(rootDir: string, entry: HistoryEntry): void;
19
+ declare function appendEntry(rootDir: string, entry: HistoryEntry, checks?: QACheckConfig[]): void;
20
+
21
+ /**
22
+ * Load per-check trend history from disk.
23
+ */
24
+ declare function loadTrendHistory(rootDir: string, checkId: string): HistoryEntry[];
25
+ /**
26
+ * Append a history entry to the per-check trend store.
27
+ * Keeps max HISTORY_MAX_ENTRIES entries per check.
28
+ */
29
+ declare function appendTrendEntry(rootDir: string, checkId: string, entry: HistoryEntry): void;
19
30
 
20
31
  /**
21
32
  * Analyze trends over a window of history entries.
@@ -44,4 +55,4 @@ declare function detectRegressions(history: HistoryEntry[]): RegressionResult;
44
55
  */
45
56
  declare function getPackageTimeline(history: HistoryEntry[], packageName: string): PackageTimelineResponse;
46
57
 
47
- export { analyzeEnrichedTrends, analyzeTrends, appendEntry, createHistoryEntry, detectRegressions, getPackageTimeline, loadHistory, saveHistory };
58
+ export { analyzeEnrichedTrends, analyzeTrends, appendEntry, appendTrendEntry, createHistoryEntry, detectRegressions, getPackageTimeline, loadHistory, loadTrendHistory, saveHistory };