@kynver-app/runtime 0.1.122 → 0.1.128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/chat/chat-claim-loop.d.ts +11 -0
  2. package/dist/chat/command-allowlist.d.ts +8 -0
  3. package/dist/chat/command-executor.d.ts +13 -0
  4. package/dist/cli.js +54 -17773
  5. package/dist/cron/cron-cli-bin.d.ts +7 -0
  6. package/dist/cron/cron-readiness.d.ts +35 -0
  7. package/dist/disk-gate.d.ts +7 -0
  8. package/dist/index.js +71 -19272
  9. package/dist/mesh-liveness/mesh-cron-lease-store.d.ts +9 -0
  10. package/dist/server/cleanup.js +16 -4054
  11. package/dist/server/default-repo.js +1 -458
  12. package/dist/server/harness-notice.js +15 -287
  13. package/dist/server/heavy-verification.js +1 -223
  14. package/dist/server/landing.js +1 -44
  15. package/dist/server/memory-cost-enforce.js +2 -480
  16. package/dist/server/memory-cost.js +2 -184
  17. package/dist/server/monitor.js +8 -1805
  18. package/dist/server/orchestration.js +1 -444
  19. package/dist/server/pr-evidence.js +1 -163
  20. package/dist/server/repo-search.js +1 -224
  21. package/dist/server/worker-policy.js +1 -432
  22. package/dist/worker-persona-catalog.js +1 -138
  23. package/package.json +3 -2
  24. package/dist/cli.js.map +0 -7
  25. package/dist/index.js.map +0 -7
  26. package/dist/server/cleanup.js.map +0 -7
  27. package/dist/server/default-repo.js.map +0 -7
  28. package/dist/server/harness-notice.js.map +0 -7
  29. package/dist/server/heavy-verification.js.map +0 -7
  30. package/dist/server/landing.js.map +0 -7
  31. package/dist/server/memory-cost-enforce.js.map +0 -7
  32. package/dist/server/memory-cost.js.map +0 -7
  33. package/dist/server/monitor.js.map +0 -7
  34. package/dist/server/orchestration.js.map +0 -7
  35. package/dist/server/pr-evidence.js.map +0 -7
  36. package/dist/server/repo-search.js.map +0 -7
  37. package/dist/server/worker-policy.js.map +0 -7
  38. package/dist/worker-persona-catalog.js.map +0 -7
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/util.ts", "../src/worker-env.ts", "../src/git.ts", "../src/path-values.ts", "../src/default-repo-discovery.ts", "../src/box-identity.ts", "../src/bounded-build/meminfo.ts", "../src/wsl-host.ts", "../src/disk-gate.ts", "../src/paths.ts", "../src/run-store.ts", "../src/run-worker-index.ts", "../src/heartbeat-final-result.ts", "../src/heartbeat.ts", "../src/repo-search.ts", "../src/shell-command-outcome.ts", "../src/stream.ts", "../src/exit-classify.ts", "../src/exited-salvage.ts", "../src/landing-gate.ts", "../src/worker-final-result-embed.ts", "../src/landing-contract-gate.ts", "../src/status.ts", "../src/harness-worker-active.ts", "../src/resource-gate.ts", "../src/worker-cap-source.ts", "../src/device-login.ts", "../src/config.ts", "../src/package-version.ts", "../src/memory-cost-package-version-guard.ts", "../src/installed-package-versions.ts", "../src/memory-cost-package-version-guard-enforce.ts", "../src/dispatch.ts", "../src/callback-headers.ts", "../src/callbacks.ts", "../src/worker-persona-catalog.ts", "../src/dispatch-lane-normalization.ts", "../src/model-routing-task-enrich.ts", "../src/model-routing.ts", "../src/worker-provider-policy.ts", "../src/orchestration-providers/capabilities.ts", "../src/orchestration-providers/codex-oauth-binding.ts", "../src/orchestration-providers/oauth-binding-utils.ts", "../src/orchestration-providers/hermes-openai-codex-binding.ts", "../src/orchestration-providers/codex-orchestration-adapter.ts", "../src/orchestration-providers/cost-router.ts", "../src/orchestration-providers/claude-oauth-binding.ts", "../src/orchestration-providers/cursor-oauth-binding.ts", "../src/orchestration-providers/hermes-cli-adapter.ts", "../src/orchestration-providers/inventory.ts", "../src/orchestration-providers/routing.ts", "../src/providers/claude.ts", "../src/providers/model-preflight.ts", "../src/providers/codex.ts", "../src/providers/hermes-codex.ts", "../src/retry-limits.ts", "../src/lease-renewal.ts", "../src/harness-lease-owner.ts", "../src/runner-identity.ts", "../src/box-resource-snapshot-shared.ts", "../src/supervisor.ts", "../src/harness-repair-target.ts", "../src/prompt.ts", "../src/providers/registry.ts", "../src/providers/cursor.ts", "../src/providers/cursor-windows.ts", "../src/auto-complete.ts", "../src/completion-ack.ts", "../src/completion-replay.ts", "../src/worker-ops.ts", "../src/completion-response.ts", "../src/harness-expert-review.ts", "../src/pr-handoff/pr-handoff-assess.ts", "../src/pr-handoff/pr-handoff-gh.ts", "../src/github-repo.ts", "../src/pr-handoff/pr-handoff.ts", "../src/material-worktree-changes.ts", "../src/disposable-artifacts.ts", "../src/worktree-completion-handoff.ts", "../src/worker-lifecycle.ts", "../src/validate.ts", "../src/repair-target-worktree.ts", "../src/active-harness-workers.ts", "../src/plan-persist/body-hash.ts", "../src/plan-persist/agentos-api.ts", "../src/plan-persist/errors.ts", "../src/plan-persist/idempotency.ts", "../src/plan-persist/paths.ts", "../src/plan-persist/outbox-store.ts", "../src/plan-persist/readback.ts", "../src/plan-persist/persist.ts", "../src/plan-persist/drain.ts", "../src/plan-persist/handoff.ts", "../src/dispatch-claim-release.ts", "../src/landing/land-pr.ts", "../src/landing/cli-auth.ts", "../src/landing/land-pr-completion-post.ts", "../src/verify-live/verify-live-prompt.ts", "../src/index.ts", "../src/box-resource-snapshot.ts", "../src/fortress-engagement-gate.ts", "../src/providers/openai-codex-resilience.ts", "../src/orchestration-providers/audit.ts", "../src/orchestration-enforcement/types.ts", "../src/orchestration-enforcement/config.ts", "../src/orchestration-enforcement/idempotency.ts", "../src/orchestration-enforcement/evaluator.ts", "../src/redact.ts", "../src/db-credential-env-paths.ts", "../src/db-credential-resolver.ts", "../src/db-url-hint.ts", "../src/worktree.ts", "../src/run-list.ts", "../src/stale-reconcile.ts", "../src/finalize.ts", "../src/worker-metadata-reconcile.ts", "../src/worker-metadata-paths.ts", "../src/run-metadata-retention.ts", "../src/default-repo.ts", "../src/local-pr-attention-reconcile.ts", "../src/run-resolve.ts", "../src/sweep.ts", "../src/harness-storage-snapshot.ts", "../src/cleanup-dir-size.ts", "../src/cleanup.ts", "../src/cleanup-guards.ts", "../src/cleanup-index-status.ts", "../src/cleanup-build-cache-paths.ts", "../src/cleanup-guards-helpers.ts", "../src/cleanup-worktree-salvage.ts", "../src/cleanup-run-liveness.ts", "../src/cleanup-worker-harness-live.ts", "../src/cleanup-completion-blocker.ts", "../src/cleanup-salvage-evidence.ts", "../src/cleanup-types.ts", "../src/cleanup-evidence.ts", "../src/cleanup-run-directory.ts", "../src/cleanup-active-worktrees.ts", "../src/cleanup-execute.ts", "../src/cleanup-remove-path.ts", "../src/cleanup-path-ownership.ts", "../src/cleanup-privileged-remove.ts", "../src/cleanup-harness-path-validate.ts", "../src/cleanup-scan.ts", "../src/cleanup-dependency-scan.ts", "../src/cleanup-duplicate-worktrees.ts", "../src/cleanup-worktree-index.ts", "../src/cleanup-retention-config.ts", "../src/cleanup-orphan-safety.ts", "../src/cleanup-harness-roots.ts", "../src/cleanup-disk-pressure.ts", "../src/cleanup-progress.ts", "../src/cleanup-git-rev-cache.ts", "../src/cleanup-git-probe.ts", "../src/cleanup-git-status-cache.ts", "../src/cleanup-run-terminal-cache.ts", "../src/cleanup-summary.ts", "../src/cli.ts", "../src/bootstrap.ts", "../src/start.ts", "../src/daemon.ts", "../src/daemon-box-identity.ts", "../src/daemon-heartbeat.ts", "../src/daemon-platform-guard.ts", "../src/cron/cron-env.ts", "../src/cron/cron-fire.ts", "../src/cron/cron-lock.ts", "../src/cron/cron-match.ts", "../src/cron/cron-store.ts", "../src/cron/cron-tick-state.ts", "../src/cron/cron-tick.ts", "../src/pipeline-tick.ts", "../src/pipeline-dispatch.ts", "../src/pipeline-exact-targets.ts", "../src/pipeline-max-starts.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/provider-evidence/exec.ts", "../src/provider-evidence/types.ts", "../src/provider-evidence/recipes-github.ts", "../src/provider-evidence/recipes-vercel.ts", "../src/provider-evidence/registry.ts", "../src/provider-evidence/collect.ts", "../src/provider-evidence/wanted-store.ts", "../src/chat/chat-claim-loop.ts", "../src/chat/anthropic-credentials.ts", "../src/chat/anthropic-stream.ts", "../src/chat/delta-batcher.ts", "../src/daemon-keeper.ts", "../src/discard-disposable.ts", "../src/plan-progress.ts", "../src/bounded-build/constants.ts", "../src/bounded-build/index.ts", "../src/bounded-build/node-options.ts", "../src/bounded-build/systemd-wrap.ts", "../src/bounded-build/admission.ts", "../src/bounded-build/exec.ts", "../src/heavy-verification/slot.ts", "../src/heavy-verification/paths.ts", "../src/heavy-verification/gate.ts", "../src/harness-worktree-build-guard.ts", "../src/harness-verify.ts", "../src/harness-verify-cli.ts", "../src/plan-persist-cli.ts", "../src/cleanup-cli.ts", "../src/harness-notice/harness-notice.parse.ts", "../src/harness-notice/harness-notice.auto-complete.ts", "../src/harness-notice/harness-notice.monitor-tick.ts", "../src/harness-notice/harness-notice.worker-complete.ts", "../src/harness-notice/harness-notice.worker-status.ts", "../src/harness-notice/harness-notice.tool-response.ts", "../src/monitor/monitor.service.ts", "../src/monitor/monitor.classify.ts", "../src/monitor/monitor.store.ts", "../src/monitor/monitor.terminal.ts", "../src/monitor/monitor.task-lease.ts", "../src/monitor/monitor-loop.ts", "../src/monitor/monitor-spawn.ts", "../src/monitor/monitor-cli.ts", "../src/post-restart-unblock.ts", "../src/default-repo-cli.ts", "../src/doctor/runtime-takeover.ts", "../src/doctor/runtime-takeover.probes.ts", "../src/doctor/runtime-takeover-scheduler.ts", "../src/doctor/runtime-takeover-cli.ts", "../src/command-center-contract-cli.ts", "../src/scheduler-cutover-cli.ts", "../src/scheduler-cutover.ts", "../src/cron/cron-status.ts", "../src/cron/cron-tick-cli.ts", "../src/cron/cron-install-cli.ts", "../src/cron/cron-install.ts", "../src/cron/cron-id.ts", "../src/cron/cron-install-plan.ts", "../src/cron/cron-env-file.ts", "../src/cron/cron-install-api.ts", "../src/cron/cron-install-secrets.ts", "../src/cron/cron-install-systemd.ts", "../src/cron/cron-install-verify.ts", "../src/lane/landing-maintainer-tick.ts", "../src/lane/lane-spec.ts", "../src/lane/landing-maintainer-local.ts", "../src/lane/lane-tick-cli.ts", "../src/vercel/vercel-api.ts", "../src/vercel/vercel-url.ts", "../src/vercel/vercel-github-status.ts", "../src/vercel/vercel-evidence.ts"],
4
- "sourcesContent": ["import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nexport function fail(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\n/** Avoid flashing a visible console on Windows when spawning worker/sidecar children. */\r\nexport function hiddenSpawnOptions<T extends Record<string, unknown>>(opts: T): T {\r\n if (process.platform !== \"win32\") return opts;\r\n return { windowsHide: true, ...opts };\r\n}\r\n\r\nexport function required(value: string | undefined, name: string): string {\r\n if (!value) fail(`missing ${name}`);\r\n return value;\r\n}\r\n\r\nexport function safeJson(line: string): unknown {\r\n try {\r\n return JSON.parse(line);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readJson<T>(file: string, fallback?: T): T {\r\n try {\r\n return JSON.parse(readFileSync(file, \"utf8\")) as T;\r\n } catch (error) {\r\n if (arguments.length > 1) return fallback as T;\r\n fail(`failed to read ${file}: ${(error as Error).message}`);\r\n }\r\n}\r\n\r\nexport function writeJson(file: string, value: unknown): void {\r\n mkdirSync(path.dirname(file), { recursive: true });\r\n writeFileSync(file, `${JSON.stringify(value, null, 2)}\\n`);\r\n}\r\n\r\nexport function safeSlug(value: string | undefined): string {\r\n return (\r\n String(value || \"\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9._-]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\") || \"worker\"\r\n );\r\n}\r\n\r\nexport function timestampSlug(name: string): string {\r\n return safeSlug(`${new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"Z\")}-${name}`);\r\n}\r\n\r\nexport function splitCsv(value: string | undefined): string[] {\r\n return value ? String(value).split(\",\").map((item) => item.trim()).filter(Boolean) : [];\r\n}\r\n\r\nexport function trimTrailingSlash(url: string): string {\r\n return String(url).replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport function oneLine(value: string): string {\r\n return String(value || \"\")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\nexport function fileSize(file: string): number {\r\n try {\r\n return statSync(file).size;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nexport function fileMtime(file: string): string | null {\r\n try {\r\n return statSync(file).mtime.toISOString();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function tailFile(file: string, lines: number): string {\r\n if (!existsSync(file)) return \"\";\r\n const data = readFileSync(file, \"utf8\");\r\n return data.split(\"\\n\").slice(-lines).join(\"\\n\");\r\n}\r\n\r\nexport function readMaybeFile(file: string | undefined): string {\r\n return file ? readFileSync(path.resolve(file), \"utf8\") : \"\";\r\n}\r\n\r\nexport function listRunIds(runsDir: string): string[] {\r\n if (!existsSync(runsDir)) return [];\r\n return readdirSync(runsDir, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory())\r\n .map((entry) => entry.name);\r\n}\r\n\r\nexport function sleepMs(ms: number): void {\r\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\r\n}\r\n\r\n/** Non-blocking sleep for async loops (daemon backoff, interruptible shutdown). */\r\nexport function sleepMsAsync(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function isPidAlive(pid: number | undefined): boolean {\r\n if (!pid) return false;\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function killWorkerProcess(pid: number, signal: NodeJS.Signals): void {\r\n try {\r\n process.kill(-pid, signal);\r\n } catch {\r\n process.kill(pid, signal);\r\n }\r\n}\r\n\r\nexport function latestIso(values: Array<string | null | undefined>): string | null {\r\n let best: string | null = null;\r\n let bestMs = -Infinity;\r\n for (const value of values) {\r\n if (!value) continue;\r\n const ms = Date.parse(value);\r\n if (Number.isFinite(ms) && ms > bestMs) {\r\n bestMs = ms;\r\n best = value;\r\n }\r\n }\r\n return best;\r\n}\r\n\r\nexport function secsAgo(ms: number): number {\r\n return Math.max(0, Math.round((Date.now() - ms) / 1000));\r\n}\r\n", "/**\r\n * Worker spawn env scrub \u2014 harness workers must not inherit host deployment secrets.\r\n */\r\n\r\n/** Exact env keys that must never reach a worker child process. */\r\nexport const FORBIDDEN_WORKER_ENV_KEYS = [\r\n \"ANTHROPIC_API_KEY\",\r\n \"ANALYST_API_KEY\",\r\n \"RECRUITER_API_KEY\",\r\n \"AUTH_SECRET\",\r\n \"NEXTAUTH_SECRET\",\r\n \"DATABASE_URL\",\r\n \"PRODUCTION_DATABASE_URL\",\r\n \"KYNVER_PRODUCTION_DATABASE_URL\",\r\n \"REDIS_URL\",\r\n \"GOOGLE_CLIENT_SECRET\",\r\n \"GITHUB_CLIENT_SECRET\",\r\n \"KYNVER_API_KEY\",\r\n \"KYNVER_SERVICE_SECRET\",\r\n \"KYNVER_RUNTIME_SECRET\",\r\n \"KYNVER_CRON_SECRET\",\r\n \"OPENCLAW_CRON_SECRET\",\r\n \"QSTASH_TOKEN\",\r\n \"QSTASH_CURRENT_SIGNING_KEY\",\r\n \"QSTASH_NEXT_SIGNING_KEY\",\r\n \"TOOL_SECRETS_KEK\",\r\n \"TOOL_EXECUTOR_DISPATCH_SECRET\",\r\n \"CLOUDFLARE_API_TOKEN\",\r\n \"STRIPE_SECRET_KEY\",\r\n \"STRIPE_WEBHOOK_SECRET\",\r\n \"STRIPE_IDENTITY_WEBHOOK_SECRET\",\r\n \"VOYAGE_API_KEY\",\r\n \"PERPLEXITY_API_KEY\",\r\n \"FRED_API_KEY\",\r\n \"FMP_API_KEY\",\r\n \"CURSOR_API_KEY\",\r\n] as const;\r\n\r\nconst FORBIDDEN_KEY_SET = new Set<string>(FORBIDDEN_WORKER_ENV_KEYS);\r\n\r\n/** Keys matching these suffixes are stripped (case-sensitive). */\r\nconst FORBIDDEN_SUFFIXES = [\"_SECRET\", \"_API_KEY\"] as const;\r\n\r\nexport function isForbiddenWorkerEnvKey(key: string): boolean {\r\n if (FORBIDDEN_KEY_SET.has(key)) return true;\r\n return FORBIDDEN_SUFFIXES.some((suffix) => key.endsWith(suffix));\r\n}\r\n\r\nexport function listForbiddenWorkerEnvKeys(env: NodeJS.ProcessEnv): string[] {\r\n return Object.keys(env).filter(isForbiddenWorkerEnvKey).sort();\r\n}\r\n\r\nexport function scrubWorkerEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n const next = { ...env };\r\n for (const key of Object.keys(next)) {\r\n if (isForbiddenWorkerEnvKey(key)) delete next[key];\r\n }\r\n return next;\r\n}\r\n\r\nexport interface WorkerEnvAudit {\r\n forbiddenPresent: string[];\r\n safe: boolean;\r\n}\r\n\r\nexport function auditWorkerEnv(env: NodeJS.ProcessEnv): WorkerEnvAudit {\r\n const forbiddenPresent = listForbiddenWorkerEnvKeys(env);\r\n return { forbiddenPresent, safe: forbiddenPresent.length === 0 };\r\n}\r\n\r\n/** @deprecated Use {@link scrubWorkerEnv} \u2014 kept for existing imports from git.ts */\r\nexport function scrubClaudeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n return scrubWorkerEnv(env);\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { fail, hiddenSpawnOptions } from \"./util.js\";\r\n\r\nexport interface GitOptions {\r\n allowFailure?: boolean;\r\n throwError?: boolean;\r\n}\r\n\r\nexport function git(cwd: string, args: string[], options: GitOptions = {}): string {\r\n const res = spawnSync(\r\n \"git\",\r\n args,\r\n hiddenSpawnOptions({ cwd, encoding: \"utf8\" as const }),\r\n );\r\n if (res.status !== 0 && !options.allowFailure) {\r\n const message = `git ${args.join(\" \")} failed: ${res.stderr || res.stdout}`;\r\n if (options.throwError) throw new Error(message);\r\n fail(message);\r\n }\r\n return res.stdout || \"\";\r\n}\r\n\r\nexport function ensureGitRepo(repo: string): void {\r\n git(repo, [\"rev-parse\", \"--show-toplevel\"]);\r\n}\r\n\r\nexport function gitStatusShort(worktreePath: string): string[] {\r\n return git(worktreePath, [\"status\", \"--short\"], { allowFailure: true })\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nexport interface GitCaptureResult {\r\n status: number | null;\r\n stdout: string;\r\n stderr: string;\r\n error: string | null;\r\n}\r\n\r\nexport function gitCapture(cwd: string, args: string[]): GitCaptureResult {\r\n try {\r\n const res = spawnSync(\r\n \"git\",\r\n args,\r\n hiddenSpawnOptions({ cwd, encoding: \"utf8\" as const }),\r\n );\r\n return {\r\n status: res.status,\r\n stdout: res.stdout || \"\",\r\n stderr: res.stderr || \"\",\r\n error: res.error ? res.error.message : null,\r\n };\r\n } catch (error) {\r\n return {\r\n status: null,\r\n stdout: \"\",\r\n stderr: \"\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function gitIsAncestor(\r\n cwd: string,\r\n ancestor: string,\r\n descendant: string,\r\n): { isAncestor: boolean | null; error: string | null } {\r\n const res = gitCapture(cwd, [\"merge-base\", \"--is-ancestor\", ancestor, descendant]);\r\n if (res.status === 0) return { isAncestor: true, error: null };\r\n if (res.status === 1) return { isAncestor: false, error: null };\r\n return { isAncestor: null, error: res.error || res.stderr || res.stdout || `git exited ${res.status}` };\r\n}\r\n\r\nexport type GitAncestryRelation = \"synced\" | \"merged\" | \"ahead\" | \"diverged\" | \"unknown\";\r\n\r\nexport interface GitAncestry {\r\n checked: boolean;\r\n base: string;\r\n head: string | null;\r\n baseHead: string | null;\r\n baseIsAncestorOfHead: boolean | null;\r\n headIsAncestorOfBase: boolean | null;\r\n relation: GitAncestryRelation;\r\n error?: string;\r\n}\r\n\r\nexport interface GitAncestryOptions {\r\n /** Branch or ref name (e.g. origin/main). Used when baseCommit is unset. */\r\n base?: string;\r\n /** Pinned SHA the worktree was created from \u2014 preferred over a moving branch ref. */\r\n baseCommit?: string;\r\n}\r\n\r\nexport function computeGitAncestry(worktreePath: string, baseOrOptions: string | GitAncestryOptions = \"origin/main\"): GitAncestry {\r\n const options: GitAncestryOptions =\r\n typeof baseOrOptions === \"string\" ? { base: baseOrOptions } : baseOrOptions;\r\n const baseLabel = options.baseCommit?.trim() || options.base?.trim() || \"origin/main\";\r\n const pinnedBaseCommit = options.baseCommit?.trim() || null;\r\n\r\n if (!worktreePath) {\r\n return unknownAncestry(baseLabel, \"missing worktree path\");\r\n }\r\n\r\n const head = gitCapture(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) {\r\n return unknownAncestry(baseLabel, head.error || head.stderr || head.stdout || \"failed to resolve HEAD\");\r\n }\r\n\r\n let baseSha: string;\r\n if (pinnedBaseCommit) {\r\n baseSha = pinnedBaseCommit;\r\n } else {\r\n const baseHead = gitCapture(worktreePath, [\"rev-parse\", baseLabel]);\r\n if (baseHead.status !== 0) {\r\n return unknownAncestry(\r\n baseLabel,\r\n baseHead.error || baseHead.stderr || baseHead.stdout || `failed to resolve ${baseLabel}`,\r\n head.stdout.trim(),\r\n );\r\n }\r\n baseSha = baseHead.stdout.trim();\r\n }\r\n\r\n const headSha = head.stdout.trim();\r\n if (headSha === baseSha) {\r\n return {\r\n checked: true,\r\n base: baseLabel,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: true,\r\n headIsAncestorOfBase: true,\r\n relation: \"synced\",\r\n };\r\n }\r\n\r\n const baseIsAncestorOfHead = gitIsAncestor(worktreePath, baseSha, headSha);\r\n const headIsAncestorOfBase = gitIsAncestor(worktreePath, headSha, baseSha);\r\n const error = baseIsAncestorOfHead.error || headIsAncestorOfBase.error || undefined;\r\n if (baseIsAncestorOfHead.isAncestor == null || headIsAncestorOfBase.isAncestor == null) {\r\n return {\r\n checked: false,\r\n base: baseLabel,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: baseIsAncestorOfHead.isAncestor,\r\n headIsAncestorOfBase: headIsAncestorOfBase.isAncestor,\r\n relation: \"unknown\",\r\n ...(error ? { error } : {}),\r\n };\r\n }\r\n\r\n const relation: GitAncestryRelation = baseIsAncestorOfHead.isAncestor\r\n ? \"ahead\"\r\n : headIsAncestorOfBase.isAncestor\r\n ? \"merged\"\r\n : \"diverged\";\r\n\r\n return {\r\n checked: true,\r\n base: baseLabel,\r\n head: headSha,\r\n baseHead: baseSha,\r\n baseIsAncestorOfHead: baseIsAncestorOfHead.isAncestor,\r\n headIsAncestorOfBase: headIsAncestorOfBase.isAncestor,\r\n relation,\r\n ...(error ? { error } : {}),\r\n };\r\n}\r\n\r\nfunction unknownAncestry(base: string, error: string, head: string | null = null): GitAncestry {\r\n return {\r\n checked: false,\r\n base,\r\n head,\r\n baseHead: null,\r\n baseIsAncestorOfHead: null,\r\n headIsAncestorOfBase: null,\r\n relation: \"unknown\",\r\n error,\r\n };\r\n}\r\n\r\nexport { scrubClaudeEnv, scrubWorkerEnv } from \"./worker-env.js\";\r\n", "import { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nexport function expandHomePath(value: string): string {\r\n if (value === \"~\") return homedir();\r\n if (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) {\r\n return path.join(homedir(), value.slice(2));\r\n }\r\n return value;\r\n}\r\n\r\nexport function resolveUserPath(value: string): string {\r\n return path.resolve(expandHomePath(value));\r\n}\r\n\r\nexport function redactHomePath(value: string): string {\r\n const expanded = expandHomePath(value);\r\n const resolved = path.resolve(expanded);\r\n const home = path.resolve(homedir());\r\n\r\n if (resolved === home) return \"~\";\r\n if (resolved.startsWith(`${home}${path.sep}`)) {\r\n return `~/${path.relative(home, resolved).split(path.sep).join(\"/\")}`;\r\n }\r\n\r\n const posix = resolved.replace(/\\\\/g, \"/\");\r\n const redacted = posix\r\n .replace(/^\\/home\\/[^/]+(?=\\/|$)/, \"~\")\r\n .replace(/^\\/Users\\/[^/]+(?=\\/|$)/, \"~\")\r\n // Windows resolves Unix-style `/home/...` paths to `C:\\home\\...`.\r\n .replace(/^[A-Za-z]:\\/home\\/[^/]+(?=\\/|$)/i, \"~\")\r\n .replace(/^[A-Za-z]:\\/Users\\/[^/]+(?=\\/|$)/i, \"~\");\r\n return redacted;\r\n}\r\n\r\n/** User-facing path strings (doctor JSON, setup output). */\r\nexport function displayUserPath(value: string): string {\r\n return redactHomePath(value);\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { gitCapture } from \"./git.js\";\r\nimport { resolveUserPath } from \"./path-values.js\";\r\n\r\nexport type DefaultRepoDiscoverySource =\r\n | \"cwd_git\"\r\n | \"runtime_checkout\"\r\n | \"well_known_path\";\r\n\r\nexport interface DiscoveredDefaultRepo {\r\n repo: string;\r\n source: DefaultRepoDiscoverySource;\r\n}\r\n\r\nconst WELL_KNOWN_REPO_DIRS = [\r\n \"Kynver\",\r\n \"repos/Kynver\",\r\n \"repos/kynver-source-main\",\r\n \"code/Kynver\",\r\n \"projects/Kynver\",\r\n] as const;\r\n\r\nfunction readPackageName(repoRoot: string): string | null {\r\n const pkgPath = path.join(repoRoot, \"package.json\");\r\n if (!existsSync(pkgPath)) return null;\r\n try {\r\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as { name?: string };\r\n return typeof pkg.name === \"string\" ? pkg.name.trim() : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function isKynverMonorepoRoot(repoRoot: string): boolean {\r\n return readPackageName(repoRoot) === \"kynver\";\r\n}\r\n\r\nexport function gitRepoRoot(startDir: string): string | null {\r\n const resolvedStart = path.resolve(startDir);\r\n if (!existsSync(resolvedStart)) return null;\r\n const probe = gitCapture(resolvedStart, [\"rev-parse\", \"--show-toplevel\"]);\r\n if (probe.status !== 0) return null;\r\n const root = probe.stdout.trim();\r\n return root.length ? path.resolve(root) : null;\r\n}\r\n\r\nfunction resolveRuntimePackageRoot(moduleUrl: string = import.meta.url): string | null {\r\n let dir = path.dirname(fileURLToPath(moduleUrl));\r\n for (let depth = 0; depth < 8; depth += 1) {\r\n const pkgPath = path.join(dir, \"package.json\");\r\n if (existsSync(pkgPath)) {\r\n try {\r\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as { name?: string };\r\n if (pkg.name === \"@kynver-app/runtime\") return dir;\r\n } catch {\r\n // continue walking\r\n }\r\n }\r\n const parent = path.dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n return null;\r\n}\r\n\r\nfunction pushCandidate(\r\n seen: Set<string>,\r\n out: DiscoveredDefaultRepo[],\r\n repo: string | null,\r\n source: DefaultRepoDiscoverySource,\r\n): void {\r\n if (!repo) return;\r\n const resolved = path.resolve(repo);\r\n if (seen.has(resolved)) return;\r\n if (!isKynverMonorepoRoot(resolved)) return;\r\n seen.add(resolved);\r\n out.push({ repo: resolved, source });\r\n}\r\n\r\nexport function discoverDefaultRepoCandidates(opts?: {\r\n cwd?: string;\r\n runtimeModuleUrl?: string;\r\n}): DiscoveredDefaultRepo[] {\r\n const cwd = opts?.cwd ?? process.cwd();\r\n const seen = new Set<string>();\r\n const candidates: DiscoveredDefaultRepo[] = [];\r\n\r\n pushCandidate(seen, candidates, gitRepoRoot(cwd), \"cwd_git\");\r\n\r\n const runtimePkgRoot = resolveRuntimePackageRoot(opts?.runtimeModuleUrl ?? import.meta.url);\r\n if (runtimePkgRoot) {\r\n pushCandidate(seen, candidates, gitRepoRoot(runtimePkgRoot), \"runtime_checkout\");\r\n }\r\n\r\n const home = homedir();\r\n for (const rel of WELL_KNOWN_REPO_DIRS) {\r\n pushCandidate(seen, candidates, resolveUserPath(path.join(home, rel)), \"well_known_path\");\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\nexport function discoverDefaultRepo(opts?: {\r\n cwd?: string;\r\n runtimeModuleUrl?: string;\r\n}): DiscoveredDefaultRepo | null {\r\n return discoverDefaultRepoCandidates(opts)[0] ?? null;\r\n}\r\n", "import type { KynverUserConfig } from \"./config.js\";\r\n\r\nexport type WorkerPoolBoxKind = \"ghost\" | \"forge\";\r\n\r\nexport type BoxKindSource = \"config\" | \"env\" | \"default\";\r\n\r\nexport interface ResolvedBoxIdentity {\r\n boxKind: WorkerPoolBoxKind;\r\n source: BoxKindSource;\r\n /** True when identity would have been inferred from KYNVER_AGENT_OS_SLUG without an explicit box kind. */\r\n slugInferenceBlocked: boolean;\r\n warnings: string[];\r\n}\r\n\r\n/** Normalize host/box labels to ghost | forge for worker-pool attribution. */\r\nexport function normalizeWorkerPoolBoxKind(raw: string | null | undefined): WorkerPoolBoxKind {\r\n const kind = (raw ?? \"\").trim().toLowerCase();\r\n if (kind === \"ghost\" || kind === \"forge\") return kind;\r\n if (kind.includes(\"forge\")) return \"forge\";\r\n if (kind.includes(\"ghost\") || kind.includes(\"openclaw\")) return \"ghost\";\r\n return \"forge\";\r\n}\r\n\r\nfunction trimEnv(env: NodeJS.ProcessEnv, key: string): string | null {\r\n const value = env[key]?.trim();\r\n return value || null;\r\n}\r\n\r\n/**\r\n * Resolve physical box identity for capacity snapshots and daemon policy.\r\n * Never maps AgentOS workspace slug alone to box kind \u2014 Forge installs must set\r\n * `boxKind` in ~/.kynver/config.json or `KYNVER_BOX_KIND`.\r\n */\r\nexport function resolveBoxIdentity(\r\n env: NodeJS.ProcessEnv = process.env,\r\n config: Pick<KynverUserConfig, \"boxKind\"> = {},\r\n): ResolvedBoxIdentity {\r\n const warnings: string[] = [];\r\n const configKind = config.boxKind?.trim();\r\n if (configKind) {\r\n return {\r\n boxKind: normalizeWorkerPoolBoxKind(configKind),\r\n source: \"config\",\r\n slugInferenceBlocked: false,\r\n warnings,\r\n };\r\n }\r\n\r\n const envKind = trimEnv(env, \"KYNVER_BOX_KIND\");\r\n if (envKind) {\r\n return {\r\n boxKind: normalizeWorkerPoolBoxKind(envKind),\r\n source: \"env\",\r\n slugInferenceBlocked: false,\r\n warnings,\r\n };\r\n }\r\n\r\n const agentOsSlug = trimEnv(env, \"KYNVER_AGENT_OS_SLUG\");\r\n if (agentOsSlug) {\r\n warnings.push(\r\n `KYNVER_AGENT_OS_SLUG=${agentOsSlug} is a workspace slug, not box identity \u2014 set boxKind via \\`kynver setup --box-kind forge|ghost\\` or KYNVER_BOX_KIND (defaulting box kind to forge)`,\r\n );\r\n }\r\n\r\n return {\r\n boxKind: \"forge\",\r\n source: \"default\",\r\n slugInferenceBlocked: Boolean(agentOsSlug),\r\n warnings,\r\n };\r\n}\r\n\r\nexport function resolveBoxKindFromConfig(\r\n config: Pick<KynverUserConfig, \"boxKind\"> = {},\r\n env: NodeJS.ProcessEnv = process.env,\r\n): WorkerPoolBoxKind {\r\n return resolveBoxIdentity(env, config).boxKind;\r\n}\r\n", "import { readFileSync } from \"node:fs\";\r\nimport os from \"node:os\";\r\n\r\n/**\r\n * Truly-usable memory. On Linux, prefer /proc/meminfo MemAvailable; fall back to\r\n * os.freemem() elsewhere (same semantics as resource-gate).\r\n */\r\nexport function readMemAvailableBytes(meminfoText?: string): number {\r\n if (meminfoText !== undefined) {\r\n const match = meminfoText.match(/^MemAvailable:\\s+(\\d+)\\s*kB/m);\r\n if (match) return Number(match[1]) * 1024;\r\n return os.freemem();\r\n }\r\n if (process.platform === \"linux\") {\r\n try {\r\n const meminfo = readFileSync(\"/proc/meminfo\", \"utf8\");\r\n const match = meminfo.match(/^MemAvailable:\\s+(\\d+)\\s*kB/m);\r\n if (match) return Number(match[1]) * 1024;\r\n } catch {\r\n // fall through\r\n }\r\n }\r\n return os.freemem();\r\n}\r\n", "import { existsSync, readFileSync, statfsSync } from \"node:fs\";\r\n\r\n/**\r\n * WSL host disk probe.\r\n *\r\n * Under WSL, the runtime VHDX (mounted at `/`) grows dynamically into the\r\n * Windows host C: drive. When Windows C: fills up, the VHDX cannot expand:\r\n * writes return SIGBUS, workers exit 135, and the Vmmem VM degrades while\r\n * the Linux-side `statfs /` still reports plenty of free space inside the\r\n * VHDX. This module gives the harness a cheap signal for that pressure so\r\n * it can block dispatch *before* a large npm install/build pushes Windows\r\n * C: into the ground.\r\n */\r\n\r\n/** Default warn threshold for the Windows host disk (25 GiB free). */\r\nexport const DEFAULT_WSL_HOST_WARN_FREE_BYTES = 25 * 1024 * 1024 * 1024;\r\n/** Default critical threshold for the Windows host disk (12 GiB free). Below\r\n * this, large rebuilds have been observed to trigger SIGBUS / exit 135 on\r\n * WSL when the VHDX cannot grow further. */\r\nexport const DEFAULT_WSL_HOST_CRITICAL_FREE_BYTES = 12 * 1024 * 1024 * 1024;\r\n/** Default Windows host mount point under WSL. Overridable via env or option. */\r\nexport const DEFAULT_WSL_HOST_MOUNT = \"/mnt/c\";\r\n\r\nexport interface WslHostDiskShape {\r\n ok: boolean;\r\n /** Mount point that was probed. */\r\n path: string;\r\n freeBytes: number;\r\n totalBytes: number;\r\n usedPercent: number;\r\n warnBelowBytes: number;\r\n criticalBelowBytes: number;\r\n /** Human-readable explanation when the host disk is under pressure. */\r\n reason: string | null;\r\n /** True when the probe itself failed (mount missing, statfs error). */\r\n probeError: string | null;\r\n}\r\n\r\n/**\r\n * Cheap WSL detection. Reads `/proc/sys/kernel/osrelease` (kernel string\r\n * contains \"microsoft\" / \"WSL2\" on Microsoft's WSL kernel) and falls back\r\n * to `/proc/version`. Both reads are one-shot and gated by `existsSync`,\r\n * so non-Linux hosts return false without throwing.\r\n */\r\nexport function isWslHost(): boolean {\r\n if (process.platform !== \"linux\") return false;\r\n for (const probe of [\"/proc/sys/kernel/osrelease\", \"/proc/version\"]) {\r\n try {\r\n if (!existsSync(probe)) continue;\r\n const text = readFileSync(probe, \"utf8\");\r\n if (/microsoft|wsl/i.test(text)) return true;\r\n } catch {\r\n // ignore \u2014 try the next probe path\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport interface ObserveWslHostDiskOptions {\r\n /** Override the Windows host mount path (e.g. `/mnt/d`). Falls back to\r\n * `KYNVER_WSL_HOST_MOUNT` env, then `/mnt/c`. */\r\n wslHostMount?: string;\r\n wslHostFreeWarnBytes?: number;\r\n wslHostFreeCriticalBytes?: number;\r\n /** Override WSL detection for tests / cross-platform CI:\r\n * `true` \u2192 treat host as WSL; `false` \u2192 treat host as non-WSL;\r\n * `undefined` \u2192 autodetect via `isWslHost()`. */\r\n forceWsl?: boolean;\r\n /** Test seam \u2014 swap in a fake statfs. */\r\n statfs?: (path: string) => { bavail: bigint | number; blocks: bigint | number; bsize: bigint | number };\r\n}\r\n\r\n/**\r\n * Probe the Windows host disk under WSL. Returns `null` when this host is\r\n * not WSL (so callers can treat the field as optional in the gate output).\r\n * When WSL but the mount is unreachable, returns a `probeError` row with\r\n * `ok = false` rather than throwing \u2014 the gate must still block dispatch\r\n * because we can't prove the host disk is healthy.\r\n */\r\nexport function observeWslHostDisk(\r\n options: ObserveWslHostDiskOptions = {},\r\n): WslHostDiskShape | null {\r\n const wsl = options.forceWsl === undefined ? isWslHost() : options.forceWsl;\r\n if (!wsl) return null;\r\n\r\n const path =\r\n options.wslHostMount?.trim() ||\r\n process.env.KYNVER_WSL_HOST_MOUNT?.trim() ||\r\n DEFAULT_WSL_HOST_MOUNT;\r\n const warnBelowBytes = options.wslHostFreeWarnBytes ?? DEFAULT_WSL_HOST_WARN_FREE_BYTES;\r\n const criticalBelowBytes =\r\n options.wslHostFreeCriticalBytes ?? DEFAULT_WSL_HOST_CRITICAL_FREE_BYTES;\r\n\r\n const statfs = options.statfs ?? statfsSync;\r\n let stats: { bavail: bigint | number; blocks: bigint | number; bsize: bigint | number };\r\n try {\r\n stats = statfs(path);\r\n } catch (error) {\r\n return {\r\n ok: false,\r\n path,\r\n freeBytes: 0,\r\n totalBytes: 0,\r\n usedPercent: 100,\r\n warnBelowBytes,\r\n criticalBelowBytes,\r\n reason: `Windows host disk probe failed at ${path}: ${(error as Error).message}`,\r\n probeError: (error as Error).message,\r\n };\r\n }\r\n\r\n const freeBytes = Number(stats.bavail) * Number(stats.bsize);\r\n const totalBytes = Number(stats.blocks) * Number(stats.bsize);\r\n const usedPercent = totalBytes > 0 ? ((totalBytes - freeBytes) / totalBytes) * 100 : 100;\r\n const lowFree = freeBytes < warnBelowBytes;\r\n const criticalFree = freeBytes < criticalBelowBytes;\r\n const ok = !lowFree && !criticalFree;\r\n\r\n const freeGiB = (freeBytes / (1024 * 1024 * 1024)).toFixed(1);\r\n let reason: string | null = null;\r\n if (!ok) {\r\n const tag = criticalFree ? \"critical\" : \"warning\";\r\n reason =\r\n `Windows host disk ${path} at ${tag}: ${freeGiB} GiB free ` +\r\n `(<${(criticalFree ? criticalBelowBytes : warnBelowBytes) / 1024 / 1024 / 1024} GiB); ` +\r\n `WSL VHDX cannot grow safely. ${summarizeWslRecoverySteps()}`;\r\n }\r\n\r\n return {\r\n ok,\r\n path,\r\n freeBytes,\r\n totalBytes,\r\n usedPercent,\r\n warnBelowBytes,\r\n criticalBelowBytes,\r\n reason,\r\n probeError: null,\r\n };\r\n}\r\n\r\n/**\r\n * Short operator recovery hint embedded in gate reasons so AgentOS evidence\r\n * surfaces actionable steps without a doc lookup. Keep terse \u2014 full runbook\r\n * lives at `docs/runbooks/wsl-disk-pressure.md`.\r\n */\r\nexport function summarizeWslRecoverySteps(): string {\r\n return (\r\n \"Recovery: \" +\r\n \"1) free Windows C: (empty Recycle Bin / Storage Sense / clear %TEMP%); \" +\r\n \"2) shut down WSL (`wsl --shutdown`) then compact the VHDX (`Optimize-VHD` or `diskpart compact vdisk`); \" +\r\n \"3) clear local node_modules / .next / harness worktrees before restarting workers. \" +\r\n \"Full runbook: docs/runbooks/wsl-disk-pressure.md.\"\r\n );\r\n}\r\n", "import { statfsSync } from \"node:fs\";\r\nimport type { DispatchNextDiskGateShape } from \"./callbacks.js\";\r\nimport {\r\n observeWslHostDisk,\r\n type ObserveWslHostDiskOptions,\r\n type WslHostDiskShape,\r\n} from \"./wsl-host.js\";\r\n\r\nconst DEFAULT_WARN_FREE_BYTES = 30 * 1024 * 1024 * 1024;\r\nconst DEFAULT_CRITICAL_FREE_BYTES = 15 * 1024 * 1024 * 1024;\r\nconst DEFAULT_MAX_USED_PERCENT = 80;\r\nconst DEFAULT_HARD_MAX_USED_PERCENT = 90;\r\n\r\nexport interface ObserveDiskGateInput {\r\n diskPath?: string;\r\n diskFreeWarnBytes?: number;\r\n diskFreeCriticalBytes?: number;\r\n diskMaxUsedPercent?: number;\r\n diskHardMaxUsedPercent?: number;\r\n /** Opt-out for the WSL host disk probe \u2014 leave `false`/undefined by\r\n * default so we always check `/mnt/c` under WSL. */\r\n skipWslHostCheck?: boolean;\r\n wslHost?: ObserveWslHostDiskOptions;\r\n}\r\n\r\nexport function observeRunnerDiskGate(input: ObserveDiskGateInput = {}): DispatchNextDiskGateShape {\r\n const path = input.diskPath?.trim() || \"/\";\r\n const warnBelowBytes = input.diskFreeWarnBytes ?? DEFAULT_WARN_FREE_BYTES;\r\n const criticalBelowBytes = input.diskFreeCriticalBytes ?? DEFAULT_CRITICAL_FREE_BYTES;\r\n const maxUsedPercent = input.diskMaxUsedPercent ?? DEFAULT_MAX_USED_PERCENT;\r\n const hardMaxUsedPercent = input.diskHardMaxUsedPercent ?? DEFAULT_HARD_MAX_USED_PERCENT;\r\n\r\n const stats = statfsSync(path);\r\n const freeBytes = Number(stats.bavail) * Number(stats.bsize);\r\n const totalBytes = Number(stats.blocks) * Number(stats.bsize);\r\n const usedPercent = totalBytes > 0 ? ((totalBytes - freeBytes) / totalBytes) * 100 : 100;\r\n const lowFree = freeBytes < warnBelowBytes;\r\n const criticalFree = freeBytes < criticalBelowBytes;\r\n const highUse = usedPercent > maxUsedPercent;\r\n const hardHighUse = usedPercent > hardMaxUsedPercent;\r\n const localOk = !lowFree && !criticalFree && !highUse && !hardHighUse;\r\n\r\n // WSL guard: the VHDX (mounted at `/`) grows into Windows C:; a healthy\r\n // local statfs is meaningless if the host disk is about to refuse writes.\r\n const wslHost: WslHostDiskShape | null = input.skipWslHostCheck\r\n ? null\r\n : observeWslHostDisk(input.wslHost);\r\n\r\n const ok = localOk && (wslHost ? wslHost.ok : true);\r\n\r\n let reason: string | null = null;\r\n if (!ok) {\r\n reason = [\r\n criticalFree ? `free space below critical ${criticalBelowBytes} bytes` : null,\r\n lowFree ? `free space below warning ${warnBelowBytes} bytes` : null,\r\n hardHighUse ? `used percent above hard cap ${hardMaxUsedPercent}%` : null,\r\n highUse ? `used percent above cap ${maxUsedPercent}%` : null,\r\n wslHost && !wslHost.ok ? wslHost.reason : null,\r\n ]\r\n .filter(Boolean)\r\n .join(\"; \");\r\n }\r\n\r\n return {\r\n ok,\r\n path,\r\n freeBytes,\r\n totalBytes,\r\n usedPercent,\r\n warnBelowBytes,\r\n criticalBelowBytes,\r\n maxUsedPercent,\r\n hardMaxUsedPercent,\r\n reason,\r\n wslHost,\r\n };\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport { resolveUserPath } from \"./path-values.js\";\r\nimport { safeSlug } from \"./util.js\";\r\n\r\nconst LEGACY_ROOT = path.join(homedir(), \".openclaw\", \"harness\");\r\n\r\nconst HARNESS_LAYOUT_DIR_NAMES = new Set([\"runs\", \"worktrees\"]);\r\n\r\n/**\r\n * Canonical harness root: the directory that contains `runs/` and `worktrees/`.\r\n * Strips mistaken trailing layout segments (e.g. env set to `.../harness/runs`).\r\n * Server mirror: agent-os.harness-root.ts\r\n */\r\nexport function normalizeHarnessRoot(root: string): string {\r\n let resolved = path.resolve(resolveUserPath(root.trim()));\r\n while (HARNESS_LAYOUT_DIR_NAMES.has(path.basename(resolved))) {\r\n resolved = path.dirname(resolved);\r\n }\r\n return resolved;\r\n}\r\n\r\n/** Canonical harness root for CLI/workers. */\r\nexport function resolveHarnessRoot(): string {\r\n const env = process.env.KYNVER_HARNESS_ROOT || process.env.OPUS_HARNESS_ROOT;\r\n if (env) return normalizeHarnessRoot(env);\r\n const configured = loadUserConfig().harnessRoot?.trim();\r\n if (configured) return normalizeHarnessRoot(configured);\r\n const kynverRoot = path.join(homedir(), \".kynver\", \"harness\");\r\n if (existsSync(kynverRoot)) return kynverRoot;\r\n if (existsSync(LEGACY_ROOT)) return LEGACY_ROOT;\r\n return kynverRoot;\r\n}\r\n\r\nexport function harnessRunsDir(harnessRoot: string): string {\r\n return path.join(normalizeHarnessRoot(harnessRoot), \"runs\");\r\n}\r\n\r\nexport function harnessWorktreesDir(harnessRoot: string): string {\r\n return path.join(normalizeHarnessRoot(harnessRoot), \"worktrees\");\r\n}\r\n\r\nexport function getHarnessPaths() {\r\n const harnessRoot = resolveHarnessRoot();\r\n return {\r\n harnessRoot,\r\n runsDir: harnessRunsDir(harnessRoot),\r\n worktreesDir: harnessWorktreesDir(harnessRoot),\r\n };\r\n}\r\n\r\nexport function runDir(runsDir: string, id: string): string {\r\n return path.join(runsDir, safeSlug(id));\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths, harnessRunsDir, runDir as runDirPath } from \"./paths.js\";\r\nimport { readJson, safeSlug, writeJson } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface HarnessRunRecord {\r\n id: string;\r\n name: string;\r\n repo: string;\r\n base: string;\r\n baseCommit: string;\r\n status: string;\r\n createdAt: string;\r\n workers: Record<string, { workerDir: string; statusPath: string }>;\r\n}\r\n\r\nexport function getPaths() {\r\n return getHarnessPaths();\r\n}\r\n\r\nexport function loadRun(id: string): HarnessRunRecord {\r\n const { runsDir } = getPaths();\r\n return readJson<HarnessRunRecord>(path.join(runDirPath(runsDir, safeSlug(id)), \"run.json\"));\r\n}\r\n\r\n/**\r\n * Load every run record on disk. Used for global, cross-run accounting (the\r\n * resource gate must see workers from ALL runs, and stale-run finalization\r\n * iterates the whole set). Unreadable/partial run dirs are skipped.\r\n */\r\nexport function listRunRecords(): HarnessRunRecord[] {\r\n const { runsDir } = getPaths();\r\n return listRunRecordsAt(runsDir);\r\n}\r\n\r\nexport function listRunRecordsForHarnessRoot(harnessRoot: string): HarnessRunRecord[] {\r\n return listRunRecordsAt(harnessRunsDir(harnessRoot));\r\n}\r\n\r\nfunction isRunDirectoryEntry(runDirPath: string): boolean {\r\n try {\r\n return statSync(runDirPath).isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction listRunRecordsAt(runsDir: string): HarnessRunRecord[] {\r\n if (!existsSync(runsDir)) return [];\r\n const runs: HarnessRunRecord[] = [];\r\n for (const entry of readdirSync(runsDir, { withFileTypes: true })) {\r\n if (entry.name === \"runs\") continue;\r\n const runDir = path.join(runsDir, entry.name);\r\n if (!isRunDirectoryEntry(runDir)) continue;\r\n const run = readJson<HarnessRunRecord | undefined>(\r\n path.join(runDir, \"run.json\"),\r\n undefined,\r\n );\r\n if (run?.id) runs.push(run);\r\n }\r\n return runs;\r\n}\r\n\r\nexport function loadWorker(runId: string, name: string): HarnessWorkerRecord {\r\n const { runsDir } = getPaths();\r\n return readJson<HarnessWorkerRecord>(\r\n path.join(runDirPath(runsDir, safeSlug(runId)), \"workers\", safeSlug(name), \"worker.json\"),\r\n );\r\n}\r\n\r\nexport function saveRun(run: HarnessRunRecord): void {\r\n const { runsDir } = getPaths();\r\n writeJson(path.join(runDirPath(runsDir, run.id), \"run.json\"), run);\r\n}\r\n\r\nexport function saveWorker(runId: string, worker: HarnessWorkerRecord): void {\r\n const { runsDir } = getPaths();\r\n writeJson(path.join(runDirPath(runsDir, runId), \"workers\", worker.name, \"worker.json\"), worker);\r\n}\r\n\r\nexport function runDirectory(id: string): string {\r\n const { harnessRoot } = getPaths();\r\n return runDirectoryAt(harnessRoot, id);\r\n}\r\n\r\nexport function runDirectoryAt(harnessRoot: string, id: string): string {\r\n return runDirPath(harnessRunsDir(harnessRoot), safeSlug(id));\r\n}\r\n", "import { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { safeSlug } from \"./util.js\";\r\n\r\n/**\r\n * Union of `run.json` worker keys and on-disk worker dirs for one run.\r\n *\r\n * Watchdog replenishment can spawn workers whose `worker.json` exists before\r\n * `run.json` is updated (or when concurrent spawns lose a last-write-wins race).\r\n * Finalization, capacity gates, and operator rollups must not treat those\r\n * live workers as absent.\r\n */\r\nexport function listRunWorkerNames(run: HarnessRunRecord): string[] {\r\n const names = new Set<string>();\r\n for (const name of Object.keys(run.workers || {})) {\r\n names.add(safeSlug(name));\r\n }\r\n const workersDir = path.join(runDirectory(run.id), \"workers\");\r\n if (!existsSync(workersDir)) return [...names];\r\n for (const entry of readdirSync(workersDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue;\r\n names.add(safeSlug(entry.name));\r\n }\r\n return [...names];\r\n}\r\n", "// Resolve structured harness finalResult from a terminal heartbeat line.\r\n\r\nfunction tryParseJsonObject(text: string): Record<string, unknown> | null {\r\n const trimmed = text.trim();\r\n if (!trimmed.startsWith(\"{\")) return null;\r\n try {\r\n const parsed: unknown = JSON.parse(trimmed);\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n return parsed as Record<string, unknown>;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n return null;\r\n}\r\n\r\nfunction embeddedRecordFromProse(text: string): Record<string, unknown> | null {\r\n const trimmed = text.trim();\r\n if (!trimmed) return null;\r\n const direct = tryParseJsonObject(trimmed);\r\n if (direct) return direct;\r\n\r\n const candidates: Record<string, unknown>[] = [];\r\n const fenceRe = /```(?:json)?\\s*([\\s\\S]*?)```/gi;\r\n let fenceMatch: RegExpExecArray | null;\r\n while ((fenceMatch = fenceRe.exec(trimmed)) !== null) {\r\n const fromFence = tryParseJsonObject(fenceMatch[1] ?? \"\");\r\n if (fromFence) candidates.push(fromFence);\r\n }\r\n\r\n const firstBrace = trimmed.indexOf(\"{\");\r\n const lastBrace = trimmed.lastIndexOf(\"}\");\r\n if (firstBrace >= 0 && lastBrace > firstBrace) {\r\n const slice = tryParseJsonObject(trimmed.slice(firstBrace, lastBrace + 1));\r\n if (slice) candidates.push(slice);\r\n }\r\n\r\n return candidates.length > 0 ? candidates[candidates.length - 1]! : null;\r\n}\r\n\r\n/**\r\n * Prefer an explicit heartbeat `finalResult`, else structured JSON embedded in\r\n * `summary`, else the summary string (legacy contract).\r\n */\r\nexport function terminalFinalResultFromHeartbeatRow(\r\n row: Record<string, unknown>,\r\n): unknown {\r\n const explicit = row.finalResult ?? row.final_result;\r\n if (explicit !== undefined && explicit !== null) {\r\n if (typeof explicit === \"string\") {\r\n const embedded = embeddedRecordFromProse(explicit);\r\n return embedded ?? (explicit.trim() || null);\r\n }\r\n return explicit;\r\n }\r\n\r\n const summary = typeof row.summary === \"string\" ? row.summary.trim() : \"\";\r\n if (!summary) return null;\r\n\r\n const embedded = embeddedRecordFromProse(summary);\r\n if (embedded) return embedded;\r\n\r\n return summary;\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { terminalFinalResultFromHeartbeatRow } from \"./heartbeat-final-result.js\";\r\nimport { safeJson } from \"./util.js\";\r\nimport type { RuntimeBoxResourceSnapshot, RuntimeBoxResourceSnapshotPrEvidence } from \"./box-resource-snapshot.js\";\r\n\r\nexport interface ParsedHeartbeat {\r\n heartbeatCount: number;\r\n lastHeartbeatAt: string | null;\r\n lastHeartbeatPhase: string | null;\r\n lastHeartbeatSummary: string | null;\r\n /** Structured finalResult from the terminal `phase: complete` heartbeat line. */\r\n terminalFinalResult: unknown;\r\n heartbeatBlocker: string | null;\r\n timestampAnomalies: ParsedHeartbeatTimestampAnomaly[];\r\n lastBoxResourceSnapshot: RuntimeBoxResourceSnapshot | null;\r\n lastPrEvidence: RuntimeBoxResourceSnapshotPrEvidence[];\r\n}\r\n\r\nexport interface ParsedHeartbeatTimestampAnomaly {\r\n kind: \"future_heartbeat_timestamp\";\r\n observedAt: string;\r\n clampedTo: string;\r\n}\r\n\r\nconst HEARTBEAT_FUTURE_SKEW_MS = 60_000;\r\n\r\n/** Worker contract: append `phase: \"complete\"` when productively finished. */\r\nexport function isTerminalHeartbeatPhase(phase: string | null | undefined): boolean {\r\n return phase === \"complete\";\r\n}\r\n\r\n/**\r\n * When stdout has no stream-json `result` yet (common for Cursor workers mid-exit),\r\n * treat the worker's completion heartbeat as a synthetic final result so lifecycle\r\n * sync, completion replay, and resource gates advance.\r\n */\r\nexport function terminalFinalResultFromHeartbeat(heartbeat: ParsedHeartbeat): unknown {\r\n if (!isTerminalHeartbeatPhase(heartbeat.lastHeartbeatPhase)) return null;\r\n if (heartbeat.terminalFinalResult !== undefined && heartbeat.terminalFinalResult !== null) {\r\n return heartbeat.terminalFinalResult;\r\n }\r\n const summary = heartbeat.lastHeartbeatSummary?.trim();\r\n return summary || \"completed\";\r\n}\r\n\r\nexport function parseHeartbeat(file: string): ParsedHeartbeat {\r\n const result: ParsedHeartbeat = {\r\n heartbeatCount: 0,\r\n lastHeartbeatAt: null,\r\n lastHeartbeatPhase: null,\r\n lastHeartbeatSummary: null,\r\n terminalFinalResult: null,\r\n heartbeatBlocker: null,\r\n timestampAnomalies: [],\r\n lastBoxResourceSnapshot: null,\r\n lastPrEvidence: [],\r\n };\r\n if (!existsSync(file)) return result;\r\n const maxFutureMs = Date.now() + HEARTBEAT_FUTURE_SKEW_MS;\r\n const clampedTo = new Date(maxFutureMs).toISOString();\r\n const lines = readFileSync(file, \"utf8\").split(\"\\n\").filter(Boolean);\r\n for (const line of lines) {\r\n const entry = safeJson(line);\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\r\n const row = entry as Record<string, unknown>;\r\n result.heartbeatCount++;\r\n if (row.ts) {\r\n const ts = String(row.ts);\r\n const tsMs = Date.parse(ts);\r\n if (Number.isFinite(tsMs) && tsMs > maxFutureMs) {\r\n result.timestampAnomalies.push({\r\n kind: \"future_heartbeat_timestamp\",\r\n observedAt: ts,\r\n clampedTo,\r\n });\r\n } else {\r\n result.lastHeartbeatAt = ts;\r\n }\r\n }\r\n if (row.phase !== undefined && row.phase !== null) result.lastHeartbeatPhase = String(row.phase);\r\n if (row.summary !== undefined && row.summary !== null) result.lastHeartbeatSummary = String(row.summary);\r\n if (isTerminalHeartbeatPhase(result.lastHeartbeatPhase)) {\r\n result.terminalFinalResult = terminalFinalResultFromHeartbeatRow(row);\r\n }\r\n result.heartbeatBlocker = row.blocker ? String(row.blocker) : null;\r\n if (row.boxResourceSnapshot && typeof row.boxResourceSnapshot === \"object\" && !Array.isArray(row.boxResourceSnapshot)) {\r\n result.lastBoxResourceSnapshot = row.boxResourceSnapshot as RuntimeBoxResourceSnapshot;\r\n }\r\n if (Array.isArray(row.prEvidence)) {\r\n result.lastPrEvidence = row.prEvidence.filter(\r\n (entry): entry is RuntimeBoxResourceSnapshotPrEvidence =>\r\n !!entry &&\r\n typeof entry === \"object\" &&\r\n typeof (entry as RuntimeBoxResourceSnapshotPrEvidence).prUrl === \"string\",\r\n );\r\n }\r\n }\r\n return result;\r\n}\r\n", "/**\r\n * Normalize and classify repo text-search commands for harness operators and chat agents.\r\n *\r\n * Codex/OpenClaw often emit `search \"pattern\" in <scope>` meta that maps poorly to ripgrep\r\n * (e.g. `in !node_modules` instead of `-g '!node_modules/**'`, or `in package.json` as a path).\r\n */\r\n\r\nconst RG_BINARIES = new Set([\"rg\", \"ripgrep\", \"grep\"]);\r\nconst RG_OPTS_WITH_VALUE = new Set([\r\n \"-e\",\r\n \"--regexp\",\r\n \"-f\",\r\n \"--file\",\r\n \"-m\",\r\n \"--max-count\",\r\n \"-A\",\r\n \"--after-context\",\r\n \"-B\",\r\n \"--before-context\",\r\n \"-C\",\r\n \"--context\",\r\n \"-g\",\r\n \"--glob\",\r\n \"--iglob\",\r\n]);\r\n\r\nexport type RepoSearchKind =\r\n | \"not_repo_search\"\r\n | \"bad_scope\"\r\n | \"rg_exclude_syntax\"\r\n | \"no_matches\";\r\n\r\nexport interface RepoSearchContext {\r\n kind: RepoSearchKind;\r\n pattern?: string;\r\n target?: string;\r\n}\r\n\r\nfunction binaryName(token: string | undefined): string | null {\r\n if (!token) return null;\r\n const base = token.split(\"/\").pop() ?? token;\r\n return base.replace(/\\.exe$/i, \"\").toLowerCase();\r\n}\r\n\r\nfunction splitShellWords(input: string): string[] {\r\n if (!input) return [];\r\n const words: string[] = [];\r\n let current = \"\";\r\n let quote: string | undefined;\r\n let escaped = false;\r\n for (const char of input) {\r\n if (escaped) {\r\n current += char;\r\n escaped = false;\r\n continue;\r\n }\r\n if (char === \"\\\\\") {\r\n escaped = true;\r\n continue;\r\n }\r\n if (quote) {\r\n if (char === quote) quote = undefined;\r\n else current += char;\r\n continue;\r\n }\r\n if (char === '\"' || char === \"'\") {\r\n quote = char;\r\n continue;\r\n }\r\n if (/\\s/.test(char)) {\r\n if (current) {\r\n words.push(current);\r\n current = \"\";\r\n }\r\n continue;\r\n }\r\n current += char;\r\n }\r\n if (current) words.push(current);\r\n return words;\r\n}\r\n\r\nfunction isRgArgv(argv: string[]): boolean {\r\n const bin = binaryName(argv[0]);\r\n return Boolean(bin && RG_BINARIES.has(bin));\r\n}\r\n\r\nexport function isSingleFileSearchTarget(target: string | undefined): boolean {\r\n if (!target || target.includes(\"/\") || target.includes(\"*\")) return false;\r\n return /\\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(target);\r\n}\r\n\r\n/** `!node_modules` as a path is invalid \u2014 ripgrep needs `-g '!node_modules/**'`. */\r\nexport function isRgExcludeScopeTarget(target: string | undefined): boolean {\r\n if (!target) return false;\r\n const t = target.trim();\r\n return t.startsWith(\"!\") && !t.includes(\"/\") && !t.endsWith(\"/**\");\r\n}\r\n\r\nfunction fixRgGlobToken(token: string): string {\r\n if (!token.startsWith(\"--glob=\")) return token;\r\n const value = token.slice(\"--glob=\".length);\r\n if (value.startsWith(\"!\") && !value.includes(\"/\") && !value.endsWith(\"/**\")) {\r\n return `--glob=${value}/**`;\r\n }\r\n return token;\r\n}\r\n\r\nfunction collectRgPositional(argv: string[]): string[] {\r\n const positional: string[] = [];\r\n for (let i = 1; i < argv.length; i += 1) {\r\n const token = argv[i];\r\n if (!token) continue;\r\n if (token === \"--\") {\r\n positional.push(...argv.slice(i + 1));\r\n break;\r\n }\r\n if (token.startsWith(\"-\")) {\r\n if (token.includes(\"=\")) continue;\r\n if (RG_OPTS_WITH_VALUE.has(token)) i += 1;\r\n continue;\r\n }\r\n positional.push(token);\r\n }\r\n return positional;\r\n}\r\n\r\nexport function normalizeRgArgv(argv: string[]): { argv: string[]; changed: boolean } {\r\n let changed = false;\r\n const out = argv.map((token) => {\r\n const fixed = fixRgGlobToken(token);\r\n if (fixed !== token) changed = true;\r\n return fixed;\r\n });\r\n const positional = collectRgPositional(out);\r\n if (positional.length === 2) {\r\n const [pattern, target] = positional;\r\n if (isSingleFileSearchTarget(target)) {\r\n return { argv: [out[0] ?? \"rg\", \"-g\", target, pattern, \".\"], changed: true };\r\n }\r\n }\r\n return { argv: out, changed };\r\n}\r\n\r\nexport function normalizeRepoSearchCommand(command: string): { command: string; changed: boolean } {\r\n const trimmed = command.trim();\r\n if (!trimmed) return { command: trimmed, changed: false };\r\n const joiner = trimmed.includes(\"&&\") ? \" && \" : trimmed.includes(\"||\") ? \" || \" : \"; \";\r\n const stages = trimmed.split(/\\s*(?:&&|\\|\\||;)\\s*/u);\r\n let changed = false;\r\n const normalizedStages = stages.map((stage) => {\r\n const argv = splitShellWords(stage.trim());\r\n if (!argv.length || !isRgArgv(argv)) return stage;\r\n const normalized = normalizeRgArgv(argv);\r\n if (normalized.changed) {\r\n changed = true;\r\n return normalized.argv.join(\" \");\r\n }\r\n return stage;\r\n });\r\n if (!changed) return { command: trimmed, changed: false };\r\n return { command: normalizedStages.join(joiner), changed: true };\r\n}\r\n\r\nexport function extractSearchMeta(meta: string): { pattern?: string; target?: string } {\r\n if (!meta) return {};\r\n const pipelineMatch = meta.match(/search\\s+\"(.+)\"\\s+in\\s+([^()]+?)(?:\\s*\\(|$)/iu);\r\n if (pipelineMatch) {\r\n return { pattern: pipelineMatch[1], target: pipelineMatch[2]?.trim() };\r\n }\r\n const match = meta.match(/^search\\s+\"(.+)\"\\s+in\\s+(.+)$/iu);\r\n if (!match) return {};\r\n return { pattern: match[1], target: match[2]?.trim() };\r\n}\r\n\r\nexport function classifyRepoSearchMeta(meta: string): RepoSearchContext {\r\n const { pattern, target } = extractSearchMeta(meta);\r\n if (!pattern) return { kind: \"not_repo_search\" };\r\n if (isRgExcludeScopeTarget(target)) {\r\n return { kind: \"rg_exclude_syntax\", pattern, target };\r\n }\r\n if (isSingleFileSearchTarget(target)) {\r\n return { kind: \"bad_scope\", pattern, target };\r\n }\r\n return { kind: \"not_repo_search\", pattern, target };\r\n}\r\n\r\nexport function metaToNormalizedRgCommand(meta: string): { command: string; changed: boolean } | null {\r\n const { pattern, target } = extractSearchMeta(meta);\r\n if (!pattern) return null;\r\n if (isRgExcludeScopeTarget(target)) {\r\n const glob = `${target!.trim()}/**`;\r\n return {\r\n command: `rg \"${pattern}\" -g '${glob}' .`,\r\n changed: true,\r\n };\r\n }\r\n if (target && isSingleFileSearchTarget(target)) {\r\n return {\r\n command: `rg -g ${target} \"${pattern}\" .`,\r\n changed: true,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nexport function formatRepoSearchGuidance(ctx: RepoSearchContext): string | null {\r\n if (\r\n ctx.kind === \"bad_scope\" &&\r\n ctx.pattern?.includes(\"agent-os-land-pr\") &&\r\n ctx.target === \"package.json\"\r\n ) {\r\n return (\r\n \"Search package.json with a glob from the repo root: \" +\r\n \"`rg -g package.json agent-os-land-pr .` \u2014 or run `node scripts/agent-os-land-pr.mjs <pr-url>` directly.\"\r\n );\r\n }\r\n if (ctx.kind === \"bad_scope\" && ctx.pattern && ctx.target) {\r\n return `Use \\`rg -g '${ctx.target}' ${ctx.pattern} .\\` from the repo root instead of treating ${ctx.target} as a folder.`;\r\n }\r\n if (ctx.kind === \"rg_exclude_syntax\" && ctx.pattern) {\r\n const glob = ctx.target ? `${ctx.target.trim()}/**` : \"!node_modules/**\";\r\n return (\r\n `Repo search scope \\`${ctx.target ?? \"!node_modules\"}\\` is not a valid ripgrep path. ` +\r\n `Use \\`rg \"${ctx.pattern}\" -g '${glob}' .\\` from the repo root (exclude globs need a \\`/**\\` suffix).`\r\n );\r\n }\r\n if (ctx.kind === \"no_matches\" && ctx.pattern) {\r\n return `No matches for \"${ctx.pattern}\". Try a broader pattern, drop overly short tokens, or search from the repo root with \\`rg \"${ctx.pattern}\" .\\`.`;\r\n }\r\n return null;\r\n}\r\n\r\n/** Extract `search \"\u2026\" in \u2026` from a tool-failure line or command string. */\r\nexport function extractSearchMetaFromToolLine(line: string): string | null {\r\n const match = line.match(/search\\s+\"(.+)\"\\s+in\\s+([^()]+?)(?:\\s*\\(agent\\)|\\s*failed|$)/iu);\r\n if (!match) return null;\r\n return `search \"${match[1]}\" in ${match[2]?.trim()}`;\r\n}\r\n\r\nexport function diagnoseRepoSearchFailure(input: {\r\n meta?: string;\r\n command?: string;\r\n exitCode?: number;\r\n}): string | null {\r\n const meta =\r\n input.meta?.trim() ||\r\n (input.command ? extractSearchMetaFromToolLine(input.command) : null) ||\r\n null;\r\n if (meta) {\r\n const ctx = classifyRepoSearchMeta(meta);\r\n const guidance = formatRepoSearchGuidance(ctx);\r\n if (guidance) return guidance;\r\n const normalized = metaToNormalizedRgCommand(meta);\r\n if (normalized?.changed) {\r\n return `Repo search used an invalid scope. Retry with: \\`${normalized.command}\\`.`;\r\n }\r\n }\r\n if (input.command && /\\b(rg|ripgrep)\\b/i.test(input.command)) {\r\n const normalized = normalizeRepoSearchCommand(input.command);\r\n if (normalized.changed) {\r\n return `Ripgrep scope may be invalid. Retry with: \\`${normalized.command}\\`.`;\r\n }\r\n if (input.exitCode === 1) {\r\n return \"Ripgrep returned no matches (exit 1). Try a broader pattern or search from the repo root.\";\r\n }\r\n }\r\n return null;\r\n}\r\n", "// Classify harness shell tool results for operator-facing streams (tail, status, Telegram).\r\n//\r\n// npm audit exits 1 when advisories exist \u2014 that is a successful run with findings,\r\n// not a command execution failure. ripgrep exits 1 when there are no matches \u2014 also\r\n// not a command execution failure. Reserve \"command failed\" for ENOLOCK, network\r\n// errors, invalid JSON, and other tool failures.\r\n\r\nimport { diagnoseRepoSearchFailure, normalizeRepoSearchCommand } from \"./repo-search.js\";\r\n\r\nexport type ShellCommandOutcomeKind =\r\n | \"success\"\r\n | \"audit_findings\"\r\n | \"search_no_matches\"\r\n | \"command_failure\";\r\n\r\nexport interface NpmAuditSummary {\r\n total: number;\r\n critical: number;\r\n high: number;\r\n moderate: number;\r\n low: number;\r\n info: number;\r\n}\r\n\r\nexport interface ShellCommandOutcome {\r\n kind: ShellCommandOutcomeKind;\r\n exitCode: number;\r\n /** Short operator-facing line (no raw JSON blob). */\r\n summary: string;\r\n /** Present when kind === audit_findings and JSON parsed. */\r\n audit?: NpmAuditSummary;\r\n /** When JSON was expected but invalid. */\r\n parseError?: string;\r\n}\r\n\r\nconst NPM_AUDIT_RE = /\\bnpm\\s+audit\\b/i;\r\nconst RG_CMD_RE = /\\b(rg|ripgrep)\\b/i;\r\nconst RG_REAL_ERROR_RE = /\\b(error|invalid|unknown|panic|not found)\\b/i;\r\n\r\nfunction tidy(text: string, max = 200): string {\r\n const one = text.replace(/\\s+/g, \" \").trim();\r\n return one.length > max ? `${one.slice(0, max - 1)}\u2026` : one;\r\n}\r\n\r\nfunction extractJsonObject(text: string): unknown | null {\r\n const trimmed = text.trim();\r\n if (!trimmed) return null;\r\n if (trimmed.startsWith(\"{\")) {\r\n try {\r\n return JSON.parse(trimmed);\r\n } catch {\r\n /* fall through \u2014 scan for embedded object */\r\n }\r\n }\r\n const start = trimmed.indexOf(\"{\");\r\n const end = trimmed.lastIndexOf(\"}\");\r\n if (start >= 0 && end > start) {\r\n try {\r\n return JSON.parse(trimmed.slice(start, end + 1));\r\n } catch {\r\n return null;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nexport function summarizeNpmAuditReport(report: Record<string, unknown>): NpmAuditSummary | null {\r\n const meta = report.metadata;\r\n if (!isRecord(meta)) return null;\r\n const vuln = meta.vulnerabilities;\r\n if (!isRecord(vuln)) return null;\r\n const num = (key: string) => (typeof vuln[key] === \"number\" ? vuln[key] : 0);\r\n const summary: NpmAuditSummary = {\r\n info: num(\"info\"),\r\n low: num(\"low\"),\r\n moderate: num(\"moderate\"),\r\n high: num(\"high\"),\r\n critical: num(\"critical\"),\r\n total: num(\"total\"),\r\n };\r\n if (\r\n typeof vuln.total !== \"number\" &&\r\n !summary.critical &&\r\n !summary.high &&\r\n !summary.moderate &&\r\n !summary.low &&\r\n !summary.info\r\n ) {\r\n return null;\r\n }\r\n return summary;\r\n}\r\n\r\nfunction formatAuditSummaryLine(audit: NpmAuditSummary): string {\r\n const parts: string[] = [];\r\n if (audit.critical) parts.push(`${audit.critical} critical`);\r\n if (audit.high) parts.push(`${audit.high} high`);\r\n if (audit.moderate) parts.push(`${audit.moderate} moderate`);\r\n if (audit.low) parts.push(`${audit.low} low`);\r\n if (audit.info) parts.push(`${audit.info} info`);\r\n const breakdown = parts.length ? parts.join(\", \") : \"see report\";\r\n return `npm audit: ${audit.total} vulnerabilit${audit.total === 1 ? \"y\" : \"ies\"} (${breakdown}) \u2014 remediation required`;\r\n}\r\n\r\nfunction npmAuditFailureReason(report: Record<string, unknown>, stderr: string): string {\r\n const err = report.error;\r\n if (isRecord(err)) {\r\n const summary = typeof err.summary === \"string\" ? err.summary.trim() : \"\";\r\n const code = typeof err.code === \"string\" ? err.code.trim() : \"\";\r\n if (summary) return code ? `${code}: ${summary}` : summary;\r\n if (code) return code;\r\n }\r\n const detail = typeof report.message === \"string\" ? report.message.trim() : \"\";\r\n if (detail) return detail;\r\n const errTail = stderr.trim();\r\n if (errTail) return tidy(errTail.split(\"\\n\").find(Boolean) ?? errTail, 160);\r\n return \"npm audit failed\";\r\n}\r\n\r\nexport function classifyNpmAuditOutcome(input: {\r\n exitCode: number;\r\n stdout: string;\r\n stderr: string;\r\n}): ShellCommandOutcome {\r\n const combined = `${input.stdout}\\n${input.stderr}`.trim();\r\n const parsed = extractJsonObject(combined);\r\n\r\n if (!parsed || !isRecord(parsed)) {\r\n const tail = tidy(combined || `exit ${input.exitCode}`, 180);\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: input.exitCode,\r\n summary: `npm audit failed (invalid or missing JSON): ${tail}`,\r\n parseError: \"invalid_json\",\r\n };\r\n }\r\n\r\n if (isRecord(parsed.error)) {\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: input.exitCode,\r\n summary: `npm audit command failed: ${npmAuditFailureReason(parsed, input.stderr)}`,\r\n };\r\n }\r\n\r\n const audit = summarizeNpmAuditReport(parsed);\r\n if (!audit) {\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: input.exitCode,\r\n summary: \"npm audit failed: JSON response missing vulnerability metadata\",\r\n parseError: \"missing_metadata\",\r\n };\r\n }\r\n\r\n if (input.exitCode === 0 && audit.total === 0) {\r\n return {\r\n kind: \"success\",\r\n exitCode: 0,\r\n summary: \"npm audit: no vulnerabilities reported\",\r\n audit,\r\n };\r\n }\r\n\r\n return {\r\n kind: \"audit_findings\",\r\n exitCode: input.exitCode,\r\n summary: formatAuditSummaryLine(audit),\r\n audit,\r\n };\r\n}\r\n\r\nfunction isNpmAuditCommand(command: string): boolean {\r\n return NPM_AUDIT_RE.test(command);\r\n}\r\n\r\nfunction isRgCommand(command: string): boolean {\r\n return RG_CMD_RE.test(command);\r\n}\r\n\r\nfunction classifyRgOutcome(input: {\r\n command: string;\r\n exitCode: number;\r\n stdout: string;\r\n stderr: string;\r\n interleaved: string;\r\n}): ShellCommandOutcome {\r\n const diagnosis = diagnoseRepoSearchFailure({\r\n command: input.command,\r\n exitCode: input.exitCode,\r\n });\r\n\r\n if (input.exitCode === 0) {\r\n return {\r\n kind: \"success\",\r\n exitCode: 0,\r\n summary: \"ripgrep finished (exit 0)\",\r\n };\r\n }\r\n\r\n if (input.exitCode === 1) {\r\n const errText = (input.stderr || input.interleaved).trim();\r\n if (errText && RG_REAL_ERROR_RE.test(errText)) {\r\n const tail = tidy(errText, 160);\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: 1,\r\n summary: diagnosis ?? `ripgrep failed (exit 1): ${tail}`,\r\n };\r\n }\r\n const normalized = normalizeRepoSearchCommand(input.command);\r\n const retry =\r\n normalized.changed && !diagnosis ? ` Retry with: \\`${normalized.command}\\`.` : \"\";\r\n return {\r\n kind: \"search_no_matches\",\r\n exitCode: 1,\r\n summary:\r\n diagnosis ??\r\n `ripgrep: no matches (exit 1).${retry} Try a broader pattern or search from the repo root.`,\r\n };\r\n }\r\n\r\n const tail = tidy(input.interleaved || input.stdout || input.stderr || `exit ${input.exitCode}`, 180);\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: input.exitCode,\r\n summary: diagnosis ?? `ripgrep failed (exit ${input.exitCode}): ${tail}`,\r\n };\r\n}\r\n\r\nexport function classifyShellCommandOutcome(input: {\r\n command: string;\r\n exitCode: number;\r\n stdout?: string;\r\n stderr?: string;\r\n interleavedOutput?: string;\r\n}): ShellCommandOutcome {\r\n const stdout = input.stdout ?? \"\";\r\n const stderr = input.stderr ?? \"\";\r\n const interleaved = input.interleavedOutput ?? \"\";\r\n\r\n if (isNpmAuditCommand(input.command)) {\r\n const body = stdout.trim() || interleaved.trim() || stderr.trim();\r\n return classifyNpmAuditOutcome({\r\n exitCode: input.exitCode,\r\n stdout: body,\r\n stderr,\r\n });\r\n }\r\n\r\n if (isRgCommand(input.command)) {\r\n return classifyRgOutcome({\r\n command: input.command,\r\n exitCode: input.exitCode,\r\n stdout,\r\n stderr,\r\n interleaved,\r\n });\r\n }\r\n\r\n const searchDiagnosis = diagnoseRepoSearchFailure({\r\n command: input.command,\r\n exitCode: input.exitCode,\r\n });\r\n if (searchDiagnosis && input.exitCode !== 0) {\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: input.exitCode,\r\n summary: searchDiagnosis,\r\n };\r\n }\r\n\r\n if (input.exitCode === 0) {\r\n return {\r\n kind: \"success\",\r\n exitCode: 0,\r\n summary: `command succeeded (exit 0)`,\r\n };\r\n }\r\n\r\n const tail = tidy(interleaved || stdout || stderr || `exit ${input.exitCode}`, 180);\r\n return {\r\n kind: \"command_failure\",\r\n exitCode: input.exitCode,\r\n summary: `command failed (exit ${input.exitCode}): ${tail}`,\r\n };\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport {\r\n classifyShellCommandOutcome,\r\n type ShellCommandOutcome,\r\n} from \"./shell-command-outcome.js\";\r\nimport { oneLine, safeJson } from \"./util.js\";\r\n\r\nexport interface ParsedStream {\r\n firstEventAt: string | null;\r\n lastEventAt: string | null;\r\n currentTool: string | null;\r\n finalResult: unknown;\r\n error: string | null;\r\n /** Most recent non-success shell outcome for operator error streams. */\r\n lastShellOutcome: ShellCommandOutcome | null;\r\n}\r\n\r\nfunction eventTimestampIso(event: Record<string, unknown>): string | undefined {\r\n const tsMs = event.timestamp_ms as number | undefined;\r\n return (event.timestamp || event.ts || (tsMs ? new Date(tsMs).toISOString() : undefined)) as\r\n | string\r\n | undefined;\r\n}\r\n\r\n/** Cursor `stream-json` encodes tools as `{ grepToolCall: \u2026 }` keys on `tool_call`. */\r\nfunction cursorToolNameFromCall(toolCall: Record<string, unknown> | undefined): string | null {\r\n if (!toolCall) return null;\r\n for (const key of Object.keys(toolCall)) {\r\n if (key.endsWith(\"ToolCall\")) {\r\n const stem = key.slice(0, -\"ToolCall\".length);\r\n return stem.length ? stem : key;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction recordStreamResult(result: ParsedStream, event: Record<string, unknown>): void {\r\n result.finalResult = event.result || event.subtype || event.terminal_reason || \"completed\";\r\n if (event.is_error) {\r\n result.error = String(event.result || event.api_error_status || \"stream result error\");\r\n }\r\n}\r\n\r\nfunction shellPayloadFromCursorEvent(\r\n event: Record<string, unknown>,\r\n): { command: string; exitCode: number; stdout: string; stderr: string; interleaved: string } | null {\r\n if (event.type !== \"tool_call\" || event.subtype !== \"completed\") return null;\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : null;\r\n const shell = toolCall?.shellToolCall;\r\n if (!shell || typeof shell !== \"object\" || Array.isArray(shell)) return null;\r\n const shellObj = shell as Record<string, unknown>;\r\n const args = shellObj.args;\r\n const command =\r\n args && typeof args === \"object\" && !Array.isArray(args) && typeof (args as Record<string, unknown>).command === \"string\"\r\n ? String((args as Record<string, unknown>).command)\r\n : \"\";\r\n const result = shellObj.result;\r\n if (!result || typeof result !== \"object\" || Array.isArray(result)) return null;\r\n const body = (result as Record<string, unknown>).success ?? (result as Record<string, unknown>).failure;\r\n if (!body || typeof body !== \"object\" || Array.isArray(body)) return null;\r\n const row = body as Record<string, unknown>;\r\n const exitCode = typeof row.exitCode === \"number\" ? row.exitCode : 0;\r\n return {\r\n command,\r\n exitCode,\r\n stdout: typeof row.stdout === \"string\" ? row.stdout : \"\",\r\n stderr: typeof row.stderr === \"string\" ? row.stderr : \"\",\r\n interleaved: typeof row.interleavedOutput === \"string\" ? row.interleavedOutput : \"\",\r\n };\r\n}\r\n\r\nfunction applyShellOutcome(parsed: ParsedStream, outcome: ShellCommandOutcome): void {\r\n if (outcome.kind === \"success\" || outcome.kind === \"search_no_matches\") return;\r\n parsed.lastShellOutcome = outcome;\r\n}\r\n\r\n/**\r\n * Parse harness worker stdout (`stream-json` from Claude Code or Cursor Agent).\r\n * Cursor emits `tool_call` events and may only write `type: \"result\"` after exit;\r\n * completion heartbeats are merged in `computeWorkerStatus`.\r\n */\r\nexport function parseHarnessStream(file: string): ParsedStream {\r\n const result: ParsedStream = {\r\n firstEventAt: null,\r\n lastEventAt: null,\r\n currentTool: null,\r\n finalResult: null,\r\n error: null,\r\n lastShellOutcome: null,\r\n };\r\n if (!existsSync(file)) return result;\r\n const lines = readFileSync(file, \"utf8\").split(\"\\n\").filter(Boolean);\r\n for (const line of lines) {\r\n const event = safeJson(line) as Record<string, unknown> | null;\r\n if (!event) continue;\r\n const ts = eventTimestampIso(event);\r\n if (ts) {\r\n result.firstEventAt ||= ts;\r\n result.lastEventAt = ts;\r\n }\r\n if (\r\n event.type === \"stream_event\" &&\r\n event.event &&\r\n typeof event.event === \"object\" &&\r\n (event.event as Record<string, unknown>).type === \"content_block_start\"\r\n ) {\r\n const block = (event.event as Record<string, unknown>).content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") result.currentTool = String(block.name || \"tool\");\r\n }\r\n if (event.type === \"assistant\" && event.message && typeof event.message === \"object\") {\r\n const content = (event.message as Record<string, unknown>).content;\r\n if (Array.isArray(content)) {\r\n const tool = content.find((item) => item?.type === \"tool_use\") as Record<string, unknown> | undefined;\r\n if (tool) result.currentTool = String(tool.name || result.currentTool);\r\n }\r\n }\r\n if (event.type === \"tool_call\" && event.subtype === \"started\") {\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : undefined;\r\n const name = cursorToolNameFromCall(toolCall);\r\n if (name) result.currentTool = name;\r\n }\r\n const shell = shellPayloadFromCursorEvent(event);\r\n if (shell) {\r\n applyShellOutcome(\r\n result,\r\n classifyShellCommandOutcome({\r\n command: shell.command,\r\n exitCode: shell.exitCode,\r\n stdout: shell.stdout,\r\n stderr: shell.stderr,\r\n interleavedOutput: shell.interleaved,\r\n }),\r\n );\r\n }\r\n if (event.type === \"result\") {\r\n recordStreamResult(result, event);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** @deprecated Use {@link parseHarnessStream} \u2014 kept for existing imports. */\r\nexport function parseClaudeStream(file: string): ParsedStream {\r\n return parseHarnessStream(file);\r\n}\r\n\r\nexport function summarizeShellToolCallEvent(event: Record<string, unknown>): string | undefined {\r\n const shell = shellPayloadFromCursorEvent(event);\r\n if (!shell) return undefined;\r\n const outcome = classifyShellCommandOutcome({\r\n command: shell.command,\r\n exitCode: shell.exitCode,\r\n stdout: shell.stdout,\r\n stderr: shell.stderr,\r\n interleavedOutput: shell.interleaved,\r\n });\r\n const cmd = oneLine(shell.command).slice(0, 120);\r\n if (outcome.kind === \"audit_findings\") {\r\n return `[audit:findings] ${outcome.summary}${cmd ? ` \u00B7 ${cmd}` : \"\"}`;\r\n }\r\n if (outcome.kind === \"search_no_matches\") {\r\n return `[search:no_matches] ${outcome.summary}${cmd ? ` \u00B7 ${cmd}` : \"\"}`;\r\n }\r\n if (outcome.kind === \"command_failure\") {\r\n return `[command:failed] ${outcome.summary}${cmd ? ` \u00B7 ${cmd}` : \"\"}`;\r\n }\r\n return `[command:ok] exit 0${cmd ? ` \u00B7 ${cmd}` : \"\"}`;\r\n}\r\n\r\nexport function summarizeEvent(event: Record<string, unknown>): string | undefined {\r\n if (event.type === \"system\" && event.subtype) {\r\n return `[system:${event.subtype}] ${String(event.status || event.cwd || \"\")}`.trim();\r\n }\r\n if (event.type === \"stream_event\" && event.event && typeof event.event === \"object\") {\r\n const type = (event.event as Record<string, unknown>).type;\r\n if (type === \"content_block_start\") {\r\n const block = (event.event as Record<string, unknown>).content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") return `[tool:start] ${block.name}`;\r\n }\r\n if (type === \"content_block_delta\") {\r\n const delta = (event.event as Record<string, unknown>).delta as Record<string, unknown> | undefined;\r\n if (delta?.partial_json) return `[tool:input] ${delta.partial_json}`;\r\n }\r\n if (type === \"message_stop\") return \"[message:stop]\";\r\n return type ? `[stream:${type}]` : undefined;\r\n }\r\n if (event.type === \"assistant\" && event.message && typeof event.message === \"object\") {\r\n const content = (event.message as Record<string, unknown>).content;\r\n if (Array.isArray(content)) {\r\n const text = content.find((item) => item?.type === \"text\") as Record<string, unknown> | undefined;\r\n if (text) return `[assistant] ${oneLine(String(text.text || \"\"))}`;\r\n const tool = content.find((item) => item?.type === \"tool_use\") as Record<string, unknown> | undefined;\r\n if (tool) return `[tool] ${tool.name} ${JSON.stringify(tool.input || {})}`;\r\n }\r\n }\r\n if (event.type === \"user\" && event.tool_use_result) {\r\n const result = event.tool_use_result as Record<string, unknown>;\r\n return `[tool:result] stdout=${JSON.stringify(result.stdout || \"\")} stderr=${JSON.stringify(result.stderr || \"\")}`;\r\n }\r\n if (event.type === \"tool_call\") {\r\n const subtype = String(event.subtype || \"\");\r\n const shellSummary =\r\n subtype === \"completed\" ? summarizeShellToolCallEvent(event) : undefined;\r\n if (shellSummary) return shellSummary;\r\n const toolCall =\r\n event.tool_call && typeof event.tool_call === \"object\" && !Array.isArray(event.tool_call)\r\n ? (event.tool_call as Record<string, unknown>)\r\n : undefined;\r\n const name = cursorToolNameFromCall(toolCall) ?? \"tool\";\r\n return `[tool:${subtype}] ${name}`;\r\n }\r\n if (event.type === \"result\") {\r\n return `[result] ${event.subtype || \"\"} ${oneLine(String(event.result || \"\"))}`.trim();\r\n }\r\n return undefined;\r\n}\r\n", "// Exit normalization for workers that died without a stream-json final result.\r\n//\r\n// When a worker process exits before recording a `result` event, the status path\r\n// used to surface a single generic \"process exited without a final result\"\r\n// needs_attention \u2014 indistinguishable whether the agent crashed mid-task or the\r\n// provider CLI rejected the model/args at startup. That made model/provider\r\n// misconfigurations look like silent stalls the watchdog had to triage by hand.\r\n//\r\n// `classifyExitFailure` inspects the worker's stderr/error tail and, when it\r\n// matches a known startup/config failure (model rejection, missing CLI, auth),\r\n// returns a structured `blocked` classification with a precise reason. The\r\n// status path promotes that to `attention.state = \"blocked\"` \u2014 a real board\r\n// attention state that flows through the harness completion ingest unchanged \u2014\r\n// instead of the catch-all needs_attention.\r\n\r\nexport interface ExitClassification {\r\n /** True when the failure is a structural blocker an operator must fix. */\r\n blocked: boolean;\r\n /** Precise, human-readable reason for the blocker. */\r\n reason: string;\r\n}\r\n\r\ninterface FailurePattern {\r\n test: RegExp;\r\n label: string;\r\n}\r\n\r\n// Ordered most-specific first. Each entry maps a recognizable stderr signature to\r\n// a short blocker label; the matched error tail is appended for context.\r\nconst FAILURE_PATTERNS: FailurePattern[] = [\r\n {\r\n test: /\\b(?:invalid|unknown|unsupported|unrecognized)\\b[^.\\n]*\\bmodel\\b/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /\\bmodel\\b[^.\\n]*\\b(?:not\\s+(?:found|supported|available|recognized|valid)|is\\s+not\\s+valid|does\\s+not\\s+exist)/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /\\b(?:did you mean|available models|choose (?:a|one of)|supported models)\\b/i,\r\n label: \"provider rejected the requested model\",\r\n },\r\n {\r\n test: /model preflight failed/i,\r\n label: \"model/provider preflight failed\",\r\n },\r\n {\r\n test: /\\b(?:command not found|ENOENT|is the .*CLI on PATH|executable not found|no such file or directory)\\b/i,\r\n label: \"provider CLI is missing or not on PATH\",\r\n },\r\n {\r\n test: /\\bfailed to spawn\\b/i,\r\n label: \"provider failed to spawn the worker process\",\r\n },\r\n {\r\n test: /\\b(?:not logged in|unauthorized|authentication (?:failed|required)|invalid api key|missing api key|401)\\b/i,\r\n label: \"provider authentication failed\",\r\n },\r\n];\r\n\r\n/** Collapse whitespace and clip a noisy error tail to a single readable line. */\r\nfunction tidy(errorText: string, max = 240): string {\r\n const oneLine = errorText.replace(/\\s+/g, \" \").trim();\r\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}\u2026` : oneLine;\r\n}\r\n\r\n/**\r\n * Classify a dead worker's error/stderr output. Returns a structured blocker when\r\n * the text matches a known startup/config failure, or null when it does not (the\r\n * caller should fall back to the generic needs_attention path).\r\n */\r\nexport function classifyExitFailure(\r\n errorText: string | null | undefined,\r\n): ExitClassification | null {\r\n const text = (errorText ?? \"\").trim();\r\n if (!text) return null;\r\n for (const pattern of FAILURE_PATTERNS) {\r\n if (pattern.test.test(text)) {\r\n return { blocked: true, reason: `${pattern.label}: ${tidy(text)}` };\r\n }\r\n }\r\n return null;\r\n}\r\n", "// Workers that die without a stream-json `result` event but leave salvageable work\r\n// behind (uncommitted changes and/or commits ahead of the run base). Distinct from\r\n// a generic \"process exited without a final result\" stall \u2014 operators need a\r\n// review-needed signal and a follow-up salvage/landing lane (PR #285 class).\r\n\r\nimport type { GitAncestry } from \"./git.js\";\r\n\r\nexport type ExitedSalvageKind = \"none\" | \"uncommitted\" | \"committed_ahead\" | \"both\";\r\n\r\nexport interface ExitedSalvageAssessment {\r\n kind: ExitedSalvageKind;\r\n /** True when the worktree has reviewable uncommitted and/or committed-ahead work. */\r\n salvageable: boolean;\r\n uncommittedCount: number;\r\n headCommit: string | null;\r\n /** Board / attention reason \u2014 stable prefix for downstream parsers. */\r\n attentionReason: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction committedHeadFromAncestry(ancestry: GitAncestry | null | undefined): string | null {\r\n if (!ancestry?.checked) return null;\r\n if (ancestry.headIsAncestorOfBase !== false) return null;\r\n return trimOrNull(ancestry.head);\r\n}\r\n\r\nfunction buildAttentionReason(\r\n kind: ExitedSalvageKind,\r\n uncommittedCount: number,\r\n headCommit: string | null,\r\n): string {\r\n const parts: string[] = [\"exited_with_changes_salvage\"];\r\n if (kind === \"uncommitted\" || kind === \"both\") {\r\n parts.push(\r\n `${uncommittedCount} uncommitted change${uncommittedCount === 1 ? \"\" : \"s\"} with no final result`,\r\n );\r\n }\r\n if ((kind === \"committed_ahead\" || kind === \"both\") && headCommit) {\r\n const sha = headCommit.length > 12 ? headCommit.slice(0, 12) : headCommit;\r\n parts.push(`commit ${sha} ahead of base with no final result`);\r\n }\r\n parts.push(\"review worktree \u2014 commit, open a PR, or run a salvage worker before discarding\");\r\n return parts.join(\": \");\r\n}\r\n\r\n/**\r\n * Classify a dead worker with no `finalResult`. Returns null when the worker is\r\n * still alive or already recorded a final result.\r\n */\r\nexport function assessExitedWorkerSalvage(input: {\r\n alive: boolean;\r\n finalResult: unknown;\r\n changedFiles?: string[];\r\n gitAncestry?: GitAncestry | null;\r\n headCommit?: string | null;\r\n}): ExitedSalvageAssessment | null {\r\n if (input.alive || hasFinalResult(input.finalResult)) return null;\r\n\r\n const uncommittedCount = (input.changedFiles ?? []).filter((line) => line.trim()).length;\r\n const headCommit = trimOrNull(input.headCommit) ?? committedHeadFromAncestry(input.gitAncestry);\r\n const hasUncommitted = uncommittedCount > 0;\r\n const hasCommittedAhead = Boolean(headCommit);\r\n\r\n if (!hasUncommitted && !hasCommittedAhead) {\r\n return {\r\n kind: \"none\",\r\n salvageable: false,\r\n uncommittedCount: 0,\r\n headCommit: null,\r\n attentionReason: \"process exited without a final result\",\r\n };\r\n }\r\n\r\n const kind: ExitedSalvageKind =\r\n hasUncommitted && hasCommittedAhead ? \"both\" : hasUncommitted ? \"uncommitted\" : \"committed_ahead\";\r\n\r\n return {\r\n kind,\r\n salvageable: true,\r\n uncommittedCount,\r\n headCommit,\r\n attentionReason: buildAttentionReason(kind, uncommittedCount, headCommit),\r\n };\r\n}\r\n", "import type { GitAncestry } from \"./git.js\";\r\n\r\nexport type WorkerLandingBlockReason = \"dirty_worktree_no_pr\";\r\n\r\nexport interface WorkerLandingSnapshot {\r\n finalResult: unknown;\r\n changedFiles: string[];\r\n headCommit?: string | null;\r\n prUrl?: string | null;\r\n artifactBundlePath?: string | null;\r\n patchPath?: string | null;\r\n gitAncestry?: GitAncestry | null;\r\n}\r\n\r\nexport interface WorkerLandingVerdict {\r\n /** When true, do not treat the worker as cleanly landed/done. */\r\n blocked: boolean;\r\n reason?: WorkerLandingBlockReason;\r\n /** Human-readable attention reason for boards and completion payloads. */\r\n detail?: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction hasCommittedLandingRef(snapshot: WorkerLandingSnapshot): boolean {\r\n if (trimOrNull(snapshot.headCommit)) return true;\r\n if (trimOrNull(snapshot.prUrl)) return true;\r\n if (trimOrNull(snapshot.artifactBundlePath)) return true;\r\n if (trimOrNull(snapshot.patchPath)) return true;\r\n const ancestry = snapshot.gitAncestry;\r\n if (ancestry?.checked && ancestry.headIsAncestorOfBase === false && trimOrNull(ancestry.head)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Hard landing gate: a recorded final result is not sufficient when the worker\r\n * left uncommitted code and has no commit/PR/patch/bundle landing path.\r\n */\r\nexport function assessWorkerLanding(snapshot: WorkerLandingSnapshot): WorkerLandingVerdict {\r\n if (!hasFinalResult(snapshot.finalResult)) return { blocked: false };\r\n if (snapshot.changedFiles.length === 0) return { blocked: false };\r\n if (!hasCommittedLandingRef(snapshot)) {\r\n return {\r\n blocked: true,\r\n reason: \"dirty_worktree_no_pr\",\r\n detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s) with no commit or PR; commit, open a PR, or discard before landing`,\r\n };\r\n }\r\n return {\r\n blocked: true,\r\n detail: `Worktree has ${snapshot.changedFiles.length} uncommitted change(s); commit or discard before landing`,\r\n };\r\n}\r\n\r\nexport function landingAttentionReason(verdict: WorkerLandingVerdict): string | undefined {\r\n if (!verdict.blocked) return undefined;\r\n return verdict.detail ?? verdict.reason ?? \"dirty_worktree_no_pr\";\r\n}\r\n", "// Extract structured harness finalResult JSON embedded in markdown prose.\r\n\r\nfunction tryParseJsonObject(text: string): Record<string, unknown> | null {\r\n const trimmed = text.trim();\r\n if (!trimmed.startsWith(\"{\")) return null;\r\n try {\r\n const parsed: unknown = JSON.parse(trimmed);\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n return parsed as Record<string, unknown>;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n return null;\r\n}\r\n\r\nfunction reconciliationEntryCount(record: Record<string, unknown>): number {\r\n const raw =\r\n record.targetPrReconciliation ??\r\n record.target_pr_reconciliation ??\r\n record.targetPrs ??\r\n record.target_prs;\r\n return Array.isArray(raw) ? raw.length : 0;\r\n}\r\n\r\nexport function extractEmbeddedWorkerFinalResultRecord(\r\n value: string,\r\n): Record<string, unknown> | null {\r\n const trimmed = value.trim();\r\n if (!trimmed) return null;\r\n\r\n const direct = tryParseJsonObject(trimmed);\r\n if (direct) return direct;\r\n\r\n const candidates: Record<string, unknown>[] = [];\r\n\r\n const fenceRe = /```(?:json)?\\s*([\\s\\S]*?)```/gi;\r\n let fenceMatch: RegExpExecArray | null;\r\n while ((fenceMatch = fenceRe.exec(trimmed)) !== null) {\r\n const fromFence = tryParseJsonObject(fenceMatch[1] ?? \"\");\r\n if (fromFence) candidates.push(fromFence);\r\n }\r\n\r\n const firstBrace = trimmed.indexOf(\"{\");\r\n const lastBrace = trimmed.lastIndexOf(\"}\");\r\n if (firstBrace >= 0 && lastBrace > firstBrace) {\r\n const slice = tryParseJsonObject(trimmed.slice(firstBrace, lastBrace + 1));\r\n if (slice) candidates.push(slice);\r\n }\r\n\r\n if (candidates.length === 0) return null;\r\n\r\n let best = candidates[candidates.length - 1]!;\r\n let bestScore = reconciliationEntryCount(best);\r\n for (const candidate of candidates) {\r\n const score = reconciliationEntryCount(candidate);\r\n if (score > bestScore) {\r\n best = candidate;\r\n bestScore = score;\r\n }\r\n }\r\n return best;\r\n}\r\n", "// Runtime mirror of server landing-contract gate (Dalton landing-only / target PRs).\r\n\r\nimport { extractEmbeddedWorkerFinalResultRecord } from \"./worker-final-result-embed.js\";\r\nimport type { WorkerLandingSnapshot } from \"./landing-gate.js\";\r\n\r\nexport type TargetPrOutcome = \"merged\" | \"skipped\" | \"blocked\";\r\n\r\nexport interface TargetPrReconciliation {\r\n prUrl: string;\r\n outcome: TargetPrOutcome;\r\n mergeCommit?: string | null;\r\n reason?: string | null;\r\n}\r\n\r\nexport interface WorkerLandingContract {\r\n landingOnly: boolean;\r\n targetPrUrls: string[];\r\n targetPrUrl?: string | null;\r\n repairEnforceOriginalPr?: boolean;\r\n requiresTargetPrReconciliation?: boolean;\r\n}\r\n\r\nexport type WorkerLandingContractBlockReason =\r\n | \"unrelated_implementation_pr\"\r\n | \"missing_target_pr_reconciliation\"\r\n | \"incomplete_target_pr_landing\"\r\n | \"duplicate_repair_pr\"\r\n | \"missing_repair_target_reconciliation\";\r\n\r\nexport interface WorkerLandingContractVerdict {\r\n blocked: boolean;\r\n reason?: WorkerLandingContractBlockReason;\r\n detail?: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction normalizePrUrl(url: string): string | null {\r\n const m = url\r\n .trim()\r\n .match(/github\\.com\\/([^/]+\\/[^/]+)\\/(?:pull|pulls)\\/(\\d+)/i);\r\n if (!m) return trimOrNull(url);\r\n return `https://github.com/${m[1]}/pull/${m[2]}`;\r\n}\r\n\r\nfunction prUrlSetKey(url: string): string {\r\n const m = url\r\n .trim()\r\n .match(/github\\.com\\/([^/]+\\/[^/]+)\\/(?:pull|pulls)\\/(\\d+)/i);\r\n if (!m) return url.trim().toLowerCase();\r\n return `${m[1].toLowerCase()}/pull/${m[2]}`;\r\n}\r\n\r\nfunction parseReconciliation(finalResult: unknown): TargetPrReconciliation[] {\r\n let record: Record<string, unknown> | null = null;\r\n if (typeof finalResult === \"string\") {\r\n const embedded = extractEmbeddedWorkerFinalResultRecord(finalResult);\r\n if (embedded) record = embedded;\r\n } else if (finalResult && typeof finalResult === \"object\" && !Array.isArray(finalResult)) {\r\n record = finalResult as Record<string, unknown>;\r\n }\r\n if (!record) return [];\r\n const raw = record.targetPrReconciliation ?? record.target_pr_reconciliation;\r\n if (!Array.isArray(raw)) return [];\r\n const out: TargetPrReconciliation[] = [];\r\n for (const item of raw) {\r\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\r\n const row = item as Record<string, unknown>;\r\n const prUrl = normalizePrUrl(String(row.prUrl ?? row.pr_url ?? \"\"));\r\n const outcome = trimOrNull(row.outcome);\r\n if (!prUrl || (outcome !== \"merged\" && outcome !== \"skipped\" && outcome !== \"blocked\")) continue;\r\n out.push({\r\n prUrl,\r\n outcome,\r\n mergeCommit: trimOrNull(row.mergeCommit ?? row.merge_commit),\r\n reason: trimOrNull(row.reason),\r\n });\r\n }\r\n return out;\r\n}\r\n\r\n/** Snapshot / structured prUrl only \u2014 not laneExpertise.prUrls citation evidence. */\r\nfunction workerAttachedPrUrls(snapshot: WorkerLandingSnapshot, finalResult: unknown): string[] {\r\n const urls: string[] = [];\r\n const fromSnapshot = normalizePrUrl(trimOrNull(snapshot.prUrl) ?? \"\");\r\n if (fromSnapshot) urls.push(fromSnapshot);\r\n if (finalResult && typeof finalResult === \"object\" && !Array.isArray(finalResult)) {\r\n const record = finalResult as Record<string, unknown>;\r\n const pr = normalizePrUrl(String(record.prUrl ?? record.pr_url ?? \"\"));\r\n if (pr) urls.push(pr);\r\n }\r\n return [...new Set(urls)];\r\n}\r\n\r\nexport function assessWorkerLandingContract(input: {\r\n contract: WorkerLandingContract;\r\n snapshot: WorkerLandingSnapshot;\r\n finalResult?: unknown;\r\n}): WorkerLandingContractVerdict {\r\n const { contract, snapshot } = input;\r\n const finalResult = input.finalResult ?? snapshot.finalResult;\r\n\r\n if (\r\n !contract.landingOnly &&\r\n contract.targetPrUrls.length === 0 &&\r\n !contract.repairEnforceOriginalPr\r\n ) {\r\n return { blocked: false };\r\n }\r\n if (!hasFinalResult(finalResult)) {\r\n const requiresEarly =\r\n contract.requiresTargetPrReconciliation ??\r\n (contract.landingOnly ||\r\n Boolean(contract.repairEnforceOriginalPr) ||\r\n contract.targetPrUrls.length > 0);\r\n if (requiresEarly && contract.targetPrUrls.length > 0) {\r\n return {\r\n blocked: true,\r\n reason: \"missing_target_pr_reconciliation\",\r\n detail: `Final result required to reconcile target PR(s): ${contract.targetPrUrls.join(\", \")}`,\r\n };\r\n }\r\n return { blocked: false };\r\n }\r\n\r\n const requiresTargetPrReconciliation =\r\n contract.requiresTargetPrReconciliation ??\r\n (contract.landingOnly ||\r\n Boolean(contract.repairEnforceOriginalPr) ||\r\n contract.targetPrUrls.length > 0);\r\n\r\n if (!requiresTargetPrReconciliation && !contract.repairEnforceOriginalPr) {\r\n return { blocked: false };\r\n }\r\n\r\n const repairTarget = contract.repairEnforceOriginalPr\r\n ? normalizePrUrl(trimOrNull(contract.targetPrUrl) ?? \"\") ??\r\n (contract.targetPrUrls.length === 1\r\n ? normalizePrUrl(contract.targetPrUrls[0]!)\r\n : null)\r\n : null;\r\n if (repairTarget) {\r\n const workerPrs = workerAttachedPrUrls(snapshot, finalResult);\r\n const supersedes =\r\n finalResult &&\r\n typeof finalResult === \"object\" &&\r\n !Array.isArray(finalResult) &&\r\n (finalResult as Record<string, unknown>).supersedesOriginalTargetPr === true;\r\n if (!supersedes) {\r\n for (const pr of workerPrs) {\r\n if (pr !== repairTarget) {\r\n return {\r\n blocked: true,\r\n reason: \"duplicate_repair_pr\",\r\n detail: `Repair worker opened or attached PR ${pr} instead of canonical target ${repairTarget}`,\r\n };\r\n }\r\n }\r\n }\r\n const reconciliation = parseReconciliation(finalResult);\r\n const entry = reconciliation.find((r) => r.prUrl === repairTarget);\r\n if (\r\n !entry ||\r\n (entry.outcome !== \"merged\" &&\r\n !(entry.reason?.trim() && (entry.outcome === \"skipped\" || entry.outcome === \"blocked\")))\r\n ) {\r\n return {\r\n blocked: true,\r\n reason: \"missing_repair_target_reconciliation\",\r\n detail: `Repair worker must reconcile target PR ${repairTarget}`,\r\n };\r\n }\r\n }\r\n\r\n const reconciliation = parseReconciliation(finalResult);\r\n const byUrl = new Map(\r\n reconciliation.map((r) => [prUrlSetKey(r.prUrl), r] as const),\r\n );\r\n const targetSet = new Set(\r\n contract.targetPrUrls.map((u) => prUrlSetKey(normalizePrUrl(u) ?? u)).filter(Boolean),\r\n );\r\n const attachedPrs = workerAttachedPrUrls(snapshot, finalResult);\r\n\r\n if (contract.landingOnly) {\r\n for (const pr of attachedPrs) {\r\n if (targetSet.size > 0 && !targetSet.has(prUrlSetKey(pr))) {\r\n return {\r\n blocked: true,\r\n reason: \"unrelated_implementation_pr\",\r\n detail: `Landing-only worker attached unrelated PR ${pr}`,\r\n };\r\n }\r\n if (targetSet.size === 0) {\r\n return {\r\n blocked: true,\r\n reason: \"unrelated_implementation_pr\",\r\n detail: \"Landing-only worker must not open new implementation PRs\",\r\n };\r\n }\r\n }\r\n }\r\n\r\n if (contract.targetPrUrls.length === 0) return { blocked: false };\r\n\r\n const missing: string[] = [];\r\n for (const target of contract.targetPrUrls) {\r\n const key = prUrlSetKey(normalizePrUrl(target) ?? target);\r\n const entry = byUrl.get(key);\r\n if (!entry) {\r\n missing.push(key);\r\n continue;\r\n }\r\n if (entry.outcome !== \"merged\" && !entry.reason?.trim()) {\r\n missing.push(key);\r\n }\r\n }\r\n\r\n if (missing.length > 0) {\r\n return {\r\n blocked: true,\r\n reason: missing.every((u) => byUrl.has(u))\r\n ? \"incomplete_target_pr_landing\"\r\n : \"missing_target_pr_reconciliation\",\r\n detail: `Target PR reconciliation incomplete: ${missing.join(\", \")}`,\r\n };\r\n }\r\n\r\n return { blocked: false };\r\n}\r\n\r\nexport function landingContractAttentionReason(\r\n verdict: WorkerLandingContractVerdict,\r\n): string | undefined {\r\n if (!verdict.blocked) return undefined;\r\n return verdict.detail ?? verdict.reason;\r\n}\r\n", "import { parseHeartbeat, terminalFinalResultFromHeartbeat } from \"./heartbeat.js\";\r\nimport { parseHarnessStream } from \"./stream.js\";\r\nimport { classifyExitFailure } from \"./exit-classify.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { computeGitAncestry, type GitAncestry, gitStatusShort } from \"./git.js\";\r\nimport { assessWorkerLanding, landingAttentionReason } from \"./landing-gate.js\";\r\nimport {\r\n assessWorkerLandingContract,\r\n landingContractAttentionReason,\r\n type WorkerLandingContract,\r\n type TargetPrReconciliation,\r\n} from \"./landing-contract-gate.js\";\r\nimport { extractEmbeddedWorkerFinalResultRecord } from \"./worker-final-result-embed.js\";\r\nimport {\r\n fileMtime,\r\n fileSize,\r\n isPidAlive,\r\n latestIso,\r\n secsAgo,\r\n tailFile,\r\n} from \"./util.js\";\r\n\r\nexport const NO_START_MS = 180_000;\r\nexport const STALE_MS = 600_000;\r\n\r\nexport interface WorkerAttention {\r\n state: \"done\" | \"needs_attention\" | \"blocked\" | \"stale\" | \"ok\";\r\n reason: string;\r\n}\r\n\r\n/** Snapshot of Lane A policy injection at worker spawn (from dispatch-next). */\r\nexport interface InstructionPolicyEvidenceSnapshot {\r\n fingerprint?: string;\r\n ruleSlugs?: string[];\r\n globalRuleCount?: number;\r\n personaRuleCount?: number;\r\n explicitKindCount?: number;\r\n invariantCount?: number;\r\n markdownChars?: number;\r\n injectedAt?: string;\r\n}\r\n\r\n/** Snapshot of task-anchored context envelope injection at worker spawn. */\r\nexport interface ContextEnvelopeEvidenceSnapshot {\r\n anchorTaskId?: string;\r\n envelopeGeneratedAt?: string;\r\n injectedAt?: string;\r\n hasPersonaBlock?: boolean;\r\n personaSlug?: string | null;\r\n operatingRuleCount?: number;\r\n memoryHitCount?: number;\r\n markdownChars?: number;\r\n source?: \"dispatch_injection\" | \"tool_call\";\r\n}\r\n\r\n/** Snapshot of anchored persona context-envelope injection at worker spawn. */\r\nexport interface PersonaContextEvidenceSnapshot {\r\n expectedPersonaSlug?: string;\r\n injectedPersonaSlug?: string;\r\n displayName?: string;\r\n operatingRuleCount?: number;\r\n anchorTaskId?: string;\r\n envelopeGeneratedAt?: string;\r\n injectedAt?: string;\r\n markdownChars?: number;\r\n}\r\n\r\n/** Dispatch-time retrieval probe replayed on harness completion. */\r\nexport interface HarnessMemoryQualityCaptureSnapshot {\r\n memoryQuery: string;\r\n hitCount: number;\r\n miss: boolean;\r\n capturedAt: string;\r\n retrievalEvidence?: Record<string, unknown> | null;\r\n /** P7 privacy-safe prompt block (trace summary + live-verification nudges). */\r\n promptMarkdown?: string | null;\r\n}\r\n\r\nexport interface HarnessWorkerRecord {\r\n name: string;\r\n runId: string;\r\n status: string;\r\n pid?: number;\r\n model?: string;\r\n branch: string;\r\n worktreePath: string;\r\n workerDir: string;\r\n stdoutPath: string;\r\n stderrPath: string;\r\n heartbeatPath: string;\r\n ownedPaths?: string[];\r\n agentOsId?: string;\r\n taskId?: string;\r\n planId?: string;\r\n /** Lane A policy fingerprint when dispatch injected operating rules. */\r\n instructionPolicyFingerprint?: string;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot;\r\n memoryQualityCapture?: HarnessMemoryQualityCaptureSnapshot;\r\n personaSlug?: string;\r\n personaEvidence?: PersonaContextEvidenceSnapshot;\r\n contextEnvelopeEvidence?: ContextEnvelopeEvidenceSnapshot;\r\n leaseOwner?: string;\r\n /** Fencing token from claim \u2014 sent on renew/completion when set. */\r\n leaseToken?: string;\r\n dispatched?: boolean;\r\n startedAt?: string;\r\n /** Routing audit \u2014 which rule selected model/provider (dispatch inference). */\r\n routingRule?: string;\r\n requestedModel?: string;\r\n /** Orchestration provider/model/auth-source/cost audit (no OAuth secrets). */\r\n orchestrationAudit?: import(\"./orchestration-providers/types.js\").OrchestrationRoutingAudit;\r\n /** Board task metadata for landing/PR-handoff gates (set at dispatch). */\r\n executorRef?: string;\r\n parentTaskId?: string;\r\n taskTitle?: string;\r\n taskPrUrl?: string;\r\n /** Canonical target PR for repair workers (must not spawn duplicate PRs). */\r\n repairTargetPrUrl?: string;\r\n repairTargetBranch?: string;\r\n /** Set when stale-reconcile patches a dead/stale worker record. */\r\n reconciledAt?: string;\r\n reconcileReason?: string;\r\n /** Last heartbeat blocker text successfully synced to plan-progress-sync (dedupe). */\r\n lastSyncedHeartbeatBlocker?: string;\r\n /**\r\n * Set when the most recent AgentOS completion replay for this finished worker\r\n * was rejected (e.g. a revoked / expired / cross-workspace runner token) or\r\n * otherwise failed. While set, the worker is NOT treated as cleanly done:\r\n * `finalizeStaleRuns` keeps the run non-terminal and the board surfaces it.\r\n * Cleared once the completion is acknowledged (2xx). Local-only \u2014 never sent\r\n * to the server as part of the worker's intrinsic status.\r\n */\r\n completionBlocker?: string;\r\n /** ISO timestamp when `/harness/completion` returned 2xx for this worker. */\r\n completionReportedAt?: string;\r\n /** Snapshot from the acknowledged completion POST \u2014 local-only. */\r\n completionSnapshot?: { finalResult?: unknown; prUrl?: string | null; summary?: string | null };\r\n /** Audit tag for how `completionReportedAt` was set (`tryCompleteWorker`, `board-task-*`). */\r\n completionAckSource?: string;\r\n /** Local mirror of the last completion POST outcome. */\r\n completionOutcome?: \"acknowledged\" | \"rejected\";\r\n /** Truncated JSON body from the last acknowledged completion response. */\r\n completionResponse?: unknown;\r\n /**\r\n * Direct/local worker with no board linkage \u2014 must not be mistaken for an\r\n * AgentTask-backed harness worker in completion or dispatch paths.\r\n */\r\n localOnly?: boolean;\r\n /** Sidecar PID when detached; used for observability only. */\r\n completionSidecarPid?: number;\r\n completionSidecarSpawnFailedAt?: string;\r\n /** One-off helper paths removed before completion (`kynver worker discard-disposable`). */\r\n disposableArtifactsRemoved?: string[];\r\n /** Physical pool label frozen at spawn for orchestration usage attribution. */\r\n boxKind?: string;\r\n boxId?: string;\r\n /** Runner/daemon identity frozen at spawn (KYNVER_RUNTIME_ID). */\r\n runtimeId?: string;\r\n}\r\n\r\nexport interface RawHarnessWorkerStatus {\r\n runId: string;\r\n worker: string;\r\n pid?: number;\r\n alive: boolean;\r\n status: string;\r\n attention: WorkerAttention;\r\n branch: string;\r\n worktreePath: string;\r\n ownedPaths?: string[];\r\n stdoutBytes: number;\r\n stderrBytes: number;\r\n heartbeatBytes: number;\r\n firstEventAt: string | null;\r\n lastEventAt: string | null;\r\n lastActivityAt: string | null;\r\n currentTool: string | null;\r\n heartbeatCount: number;\r\n lastHeartbeatAt: string | null;\r\n lastHeartbeatPhase: string | null;\r\n lastHeartbeatSummary: string | null;\r\n heartbeatBlocker: string | null;\r\n /** Parser-detected timestamp anomalies (e.g., future heartbeat ts). */\r\n timestampAnomalies?: Array<{\r\n kind: \"future_heartbeat_timestamp\";\r\n observedAt: string;\r\n clampedTo: string;\r\n }>;\r\n finalResult: unknown;\r\n error?: string;\r\n changedFiles: string[];\r\n gitAncestry: GitAncestry;\r\n /** Set by PR-ready handoff before completion is posted. */\r\n prUrl?: string;\r\n headCommit?: string;\r\n /** Paths removed via `kynver worker discard-disposable` before completion POST. */\r\n disposableArtifactsRemoved?: string[];\r\n /** Fencing token from claim \u2014 echoed on completion when set. */\r\n leaseToken?: string;\r\n /** Lane A policy fields echoed on completion status for mirror recovery. */\r\n instructionPolicyFingerprint?: string | null;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot | null;\r\n /** Model the worker was launched with \u2014 echoed from worker.json for usage tracking. */\r\n model?: string | null;\r\n /** Orchestration provider key (codex | cursor | claude) \u2014 echoed from worker.json. */\r\n provider?: string | null;\r\n /** Physical pool label \u2014 ghost | forge (runtime \u2265 0.1.115). */\r\n boxKind?: string | null;\r\n boxId?: string | null;\r\n /** Runner/daemon identity echoed from worker.json. */\r\n runtimeId?: string | null;\r\n personaSlug?: string | null;\r\n /** True when dispatch-next spawned the worker on a daemon tick. */\r\n dispatched?: boolean | null;\r\n localOnly?: boolean | null;\r\n}\r\n\r\nexport interface WorkerStatusOptions {\r\n /** Branch ref for ancestry when baseCommit is not set. */\r\n base?: string;\r\n /** Pinned SHA from run creation \u2014 preferred for ancestry vs a moving branch tip. */\r\n baseCommit?: string;\r\n}\r\n\r\nexport function computeAttention(input: {\r\n alive: boolean;\r\n finalResult: unknown;\r\n firstEventAt: string | null;\r\n stdoutBytes: number;\r\n stderrBytes?: number;\r\n heartbeatBytes: number;\r\n lastActivityAt: string | null;\r\n heartbeatBlocker: string | null;\r\n startedAt?: string;\r\n /** stderr tail / parsed error for a worker that died without a final result. */\r\n error?: string | null;\r\n changedFiles?: string[];\r\n gitAncestry?: GitAncestry | null;\r\n completionBlocker?: string | null;\r\n landingContract?: WorkerLandingContract | null;\r\n prUrl?: string | null;\r\n localOnly?: boolean;\r\n taskId?: string | null;\r\n agentOsId?: string | null;\r\n reconcileReason?: string | null;\r\n}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.completionBlocker && !isSkippedTerminalCompletionBlocker(input.completionBlocker)) {\r\n return { state: \"blocked\", reason: input.completionBlocker };\r\n }\r\n if (input.finalResult) {\r\n if (input.localOnly && hasMergedTargetPrReconciliation(input.finalResult)) {\r\n return { state: \"done\", reason: \"local-only worker superseded by merged PR\" };\r\n }\r\n const landingSnapshot = {\r\n finalResult: input.finalResult,\r\n changedFiles: input.changedFiles ?? [],\r\n gitAncestry: input.gitAncestry ?? null,\r\n prUrl: input.prUrl ?? null,\r\n };\r\n const landing = assessWorkerLanding(landingSnapshot);\r\n if (landing.blocked) {\r\n const detail = landingAttentionReason(landing);\r\n return {\r\n state: \"needs_attention\",\r\n reason: landing.reason\r\n ? `landing blocked (${landing.reason}): ${detail}`\r\n : `landing blocked: ${detail}`,\r\n };\r\n }\r\n if (input.landingContract) {\r\n const contractVerdict = assessWorkerLandingContract({\r\n contract: input.landingContract,\r\n snapshot: landingSnapshot,\r\n finalResult: input.finalResult,\r\n });\r\n const contractDetail = landingContractAttentionReason(contractVerdict);\r\n if (contractDetail) {\r\n return {\r\n state: \"needs_attention\",\r\n reason: contractVerdict.reason\r\n ? `landing contract (${contractVerdict.reason}): ${contractDetail}`\r\n : `landing contract: ${contractDetail}`,\r\n };\r\n }\r\n }\r\n return { state: \"done\", reason: \"final result recorded\" };\r\n }\r\n if (!input.alive) {\r\n if (isAbandonedEmptyWorker(input)) {\r\n return { state: \"done\", reason: \"empty abandoned worker record\" };\r\n }\r\n // A worker that exited without a final result is not always a silent stall:\r\n // a recognizable startup/config failure (model/provider rejection, missing\r\n // CLI, auth) is a structural blocker, not a generic needs_attention.\r\n const classified = classifyExitFailure(input.error);\r\n if (classified) return { state: \"blocked\", reason: classified.reason };\r\n const salvage = assessExitedWorkerSalvage({\r\n alive: false,\r\n finalResult: null,\r\n changedFiles: input.changedFiles,\r\n gitAncestry: input.gitAncestry,\r\n });\r\n if (salvage?.salvageable) {\r\n const tail = input.error?.trim();\r\n return {\r\n state: \"needs_attention\",\r\n reason: tail ? `${salvage.attentionReason} (${tail})` : salvage.attentionReason,\r\n };\r\n }\r\n const tail = input.error?.trim();\r\n return {\r\n state: \"needs_attention\",\r\n reason: tail\r\n ? `process exited without a final result: ${tail}`\r\n : salvage?.attentionReason ?? \"process exited without a final result\",\r\n };\r\n }\r\n if (input.heartbeatBlocker) {\r\n return { state: \"blocked\", reason: `worker heartbeat reported blocker: ${input.heartbeatBlocker}` };\r\n }\r\n const startMs = input.startedAt ? Date.parse(input.startedAt) : NaN;\r\n if (\r\n !input.firstEventAt &&\r\n input.stdoutBytes === 0 &&\r\n input.heartbeatBytes === 0 &&\r\n Number.isFinite(startMs) &&\r\n now - startMs > NO_START_MS\r\n ) {\r\n return { state: \"needs_attention\", reason: `no first stream event ${secsAgo(startMs)}s after start` };\r\n }\r\n const actMs = input.lastActivityAt ? Date.parse(input.lastActivityAt) : NaN;\r\n if (Number.isFinite(actMs) && now - actMs > STALE_MS) {\r\n return { state: \"stale\", reason: `no log/event/heartbeat activity for ${secsAgo(actMs)}s` };\r\n }\r\n return { state: \"ok\", reason: \"recent activity\" };\r\n}\r\n\r\nfunction isSkippedTerminalCompletionBlocker(reason: string | null | undefined): boolean {\r\n const text = reason?.trim();\r\n if (!text) return false;\r\n return /completion acknowledged but board not advanced/i.test(text) && /task already terminal/i.test(text);\r\n}\r\n\r\nfunction isAbandonedEmptyWorker(input: {\r\n finalResult: unknown;\r\n stdoutBytes: number;\r\n stderrBytes?: number;\r\n heartbeatBytes: number;\r\n changedFiles?: string[];\r\n error?: string | null;\r\n taskId?: string | null;\r\n agentOsId?: string | null;\r\n reconcileReason?: string | null;\r\n}): boolean {\r\n if (input.finalResult) return false;\r\n if (input.taskId || input.agentOsId) return false;\r\n if (input.stdoutBytes > 0 || (input.stderrBytes ?? 0) > 0 || input.heartbeatBytes > 0) return false;\r\n if (input.error?.trim()) return false;\r\n if ((input.changedFiles ?? []).some((line) => line.trim())) return false;\r\n return /empty worker dir|marked abandoned/i.test(input.reconcileReason ?? \"\");\r\n}\r\n\r\nfunction hasMergedTargetPrReconciliation(value: unknown): boolean {\r\n let record: Record<string, unknown> | null = null;\r\n if (typeof value === \"string\") record = extractEmbeddedWorkerFinalResultRecord(value);\r\n else if (value && typeof value === \"object\" && !Array.isArray(value)) record = value as Record<string, unknown>;\r\n if (!record) return false;\r\n const raw = record.targetPrReconciliation ?? record.target_pr_reconciliation;\r\n if (!Array.isArray(raw)) return false;\r\n return raw.some((item): item is TargetPrReconciliation => {\r\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return false;\r\n return String((item as Record<string, unknown>).outcome ?? \"\").trim() === \"merged\";\r\n });\r\n}\r\n\r\nfunction resolveFinalResult(\r\n worker: HarnessWorkerRecord,\r\n parsedFinalResult: unknown,\r\n heartbeat: ReturnType<typeof parseHeartbeat>,\r\n): unknown {\r\n const ackSnapshot = worker.completionSnapshot?.finalResult;\r\n if (worker.completionAckSource === \"local-pr-merged-reconcile\" && ackSnapshot !== undefined && ackSnapshot !== null) {\r\n return ackSnapshot;\r\n }\r\n if (parsedFinalResult) return parsedFinalResult;\r\n if (ackSnapshot !== undefined && ackSnapshot !== null) return ackSnapshot;\r\n return terminalFinalResultFromHeartbeat(heartbeat);\r\n}\r\n\r\nexport function computeWorkerStatus(worker: HarnessWorkerRecord, options: WorkerStatusOptions = {}): RawHarnessWorkerStatus {\r\n const parsed = parseHarnessStream(worker.stdoutPath);\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n const completionAcknowledged =\r\n typeof worker.completionReportedAt === \"string\" && worker.completionReportedAt.trim().length > 0;\r\n const finalResult = resolveFinalResult(worker, parsed.finalResult, heartbeat);\r\n const alive = completionAcknowledged ? false : isPidAlive(worker.pid);\r\n const stdoutBytes = fileSize(worker.stdoutPath);\r\n const stderrBytes = fileSize(worker.stderrPath);\r\n const heartbeatBytes = fileSize(worker.heartbeatPath);\r\n const changedFiles = gitStatusShort(worker.worktreePath);\r\n const gitAncestry = computeGitAncestry(worker.worktreePath, {\r\n base: options.base,\r\n baseCommit: options.baseCommit,\r\n });\r\n const lastActivityAt = latestIso([\r\n parsed.lastEventAt,\r\n heartbeat.lastHeartbeatAt,\r\n fileMtime(worker.stdoutPath),\r\n fileMtime(worker.stderrPath),\r\n fileMtime(worker.heartbeatPath),\r\n ]);\r\n // The error surfaced when a worker died without a final result: the parsed\r\n // stream error, else the stderr tail. Computed before attention so a startup/\r\n // config failure can be classified as a structured blocker.\r\n const error =\r\n parsed.error ||\r\n (!alive && !finalResult ? tailFile(worker.stderrPath, 10).trim() || undefined : undefined);\r\n const completionBlocker =\r\n typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim()\r\n ? worker.completionBlocker.trim()\r\n : null;\r\n const effectiveCompletionBlocker = isSkippedTerminalCompletionBlocker(completionBlocker)\r\n ? null\r\n : completionBlocker;\r\n const landingContract: WorkerLandingContract | null = worker.repairTargetPrUrl\r\n ? {\r\n landingOnly: false,\r\n targetPrUrls: [worker.repairTargetPrUrl],\r\n targetPrUrl: worker.repairTargetPrUrl,\r\n repairEnforceOriginalPr: true,\r\n }\r\n : null;\r\n\r\n const attention = computeAttention({\r\n alive,\r\n finalResult,\r\n firstEventAt: parsed.firstEventAt,\r\n stdoutBytes,\r\n stderrBytes,\r\n heartbeatBytes,\r\n lastActivityAt,\r\n heartbeatBlocker: heartbeat.heartbeatBlocker,\r\n startedAt: worker.startedAt,\r\n error,\r\n changedFiles,\r\n gitAncestry,\r\n completionBlocker: effectiveCompletionBlocker,\r\n landingContract,\r\n prUrl: worker.repairTargetPrUrl ?? worker.taskPrUrl ?? null,\r\n localOnly: worker.localOnly === true,\r\n taskId: worker.taskId ?? null,\r\n agentOsId: worker.agentOsId ?? null,\r\n reconcileReason: worker.reconcileReason ?? null,\r\n });\r\n const workerStatusLabel =\r\n effectiveCompletionBlocker || attention.state === \"blocked\"\r\n ? \"blocked\"\r\n : completionAcknowledged || attention.state === \"done\"\r\n ? \"done\"\r\n : finalResult\r\n ? \"exited\"\r\n : alive\r\n ? \"running\"\r\n : \"exited\";\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n alive,\r\n status: workerStatusLabel,\r\n attention,\r\n branch: worker.branch,\r\n worktreePath: worker.worktreePath,\r\n ownedPaths: worker.ownedPaths,\r\n stdoutBytes,\r\n stderrBytes,\r\n heartbeatBytes,\r\n firstEventAt: parsed.firstEventAt,\r\n lastEventAt: parsed.lastEventAt,\r\n lastActivityAt,\r\n currentTool: completionAcknowledged ? null : parsed.currentTool,\r\n heartbeatCount: heartbeat.heartbeatCount,\r\n lastHeartbeatAt: heartbeat.lastHeartbeatAt,\r\n lastHeartbeatPhase: heartbeat.lastHeartbeatPhase,\r\n lastHeartbeatSummary: heartbeat.lastHeartbeatSummary,\r\n heartbeatBlocker: heartbeat.heartbeatBlocker,\r\n timestampAnomalies: heartbeat.timestampAnomalies,\r\n finalResult,\r\n error,\r\n changedFiles,\r\n gitAncestry,\r\n instructionPolicyFingerprint: worker.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: worker.instructionPolicyEvidence ?? null,\r\n model: worker.model ?? worker.orchestrationAudit?.model ?? null,\r\n provider: worker.orchestrationAudit?.provider ?? null,\r\n boxKind: worker.boxKind ?? null,\r\n boxId: worker.boxId ?? null,\r\n runtimeId: worker.runtimeId ?? null,\r\n personaSlug: worker.personaSlug ?? null,\r\n dispatched: worker.dispatched ?? null,\r\n localOnly: worker.localOnly ?? null,\r\n };\r\n}\r\n\r\nexport function isFinishedWorkerStatus(status: RawHarnessWorkerStatus): boolean {\r\n if (status.finalResult) return true;\r\n if (status.alive === false) return true;\r\n if (status.status === \"exited\" || status.status === \"done\") return true;\r\n return false;\r\n}\r\n\r\n/** True when a worker recorded a final result but failed the landing gate. */\r\nexport function isLandingBlockedWorkerStatus(status: RawHarnessWorkerStatus): boolean {\r\n if (!status.finalResult) return false;\r\n return status.attention.state === \"needs_attention\" || status.attention.state === \"blocked\";\r\n}\r\n\r\nexport function deriveRunStatus(fallback: string, workers: Array<{ attention?: string; status?: string }>): string {\r\n if (workers.length === 0) return fallback;\r\n if (workers.some((w) => w.attention === \"needs_attention\" || w.attention === \"stale\" || w.attention === \"blocked\")) {\r\n return \"needs_attention\";\r\n }\r\n if (workers.every((w) => w.status === \"done\")) return \"done\";\r\n if (workers.some((w) => w.status === \"running\")) return \"running\";\r\n return fallback;\r\n}\r\n", "import { readFileSync } from \"node:fs\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\n\r\nfunction pidCommandLine(pid: number | undefined): string | null {\r\n if (!pid || process.platform !== \"linux\") return null;\r\n try {\r\n return readFileSync(`/proc/${pid}/cmdline`, \"utf8\").replace(/\\0/g, \" \");\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * PID existence is not enough on long-running hosts: Linux can reuse an old\r\n * worker PID for an unrelated process, which makes stale worker.json records\r\n * look alive and can falsely saturate the global worker gate.\r\n */\r\nexport function workerProcessMatchesRecord(worker: HarnessWorkerRecord): boolean {\r\n if (!worker.pid || process.platform !== \"linux\") return true;\r\n const cmdline = pidCommandLine(worker.pid);\r\n if (!cmdline) return false;\r\n const probes = [worker.worktreePath, worker.workerDir, worker.heartbeatPath].filter(\r\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\r\n );\r\n return probes.some((probe) => cmdline.includes(probe));\r\n}\r\n\r\n/**\r\n * Whether a worker still occupies a machine-wide harness capacity slot.\r\n * Ignores completion-acknowledged workers even when the recorded PID was reused.\r\n */\r\nexport function isActiveHarnessWorker(worker: HarnessWorkerRecord): boolean {\r\n if (typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim()) {\r\n return false;\r\n }\r\n const status = computeWorkerStatus(worker);\r\n if (status.alive && !workerProcessMatchesRecord(worker)) return false;\r\n return status.alive && !status.finalResult && status.attention.state !== \"done\";\r\n}\r\n", "import os from \"node:os\";\r\nimport { readMemAvailableBytes } from \"./bounded-build/meminfo.js\";\r\nimport path from \"node:path\";\r\nimport { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { resolveBoxKindFromConfig } from \"./box-identity.js\";\r\nimport type { WorkerCapSource } from \"./worker-cap-source.js\";\r\nimport { resolveWorkerCap } from \"./worker-cap-source.js\";\r\nimport type { DispatchNextDiskGateShape } from \"./callbacks.js\";\r\nimport { observeRunnerDiskGate } from \"./disk-gate.js\";\r\nimport { listRunRecords, loadRun, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { listRunWorkerNames } from \"./run-worker-index.js\";\r\nimport { isActiveHarnessWorker, workerProcessMatchesRecord } from \"./harness-worker-active.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport { workerProcessMatchesRecord };\r\n\r\n/** Default RAM budget per worker (~500 MiB, dogfood measured). Internal \u2014 not a setup knob. */\r\nexport const DEFAULT_PER_WORKER_MEM_BYTES = 500 * 1024 * 1024;\r\n\r\n/** Keep headroom for OS / IDE. Internal \u2014 not a setup knob. */\r\nexport const DEFAULT_MEM_RESERVE_BYTES = 4 * 1024 * 1024 * 1024;\r\n\r\n/** Fraction of total RAM used when auto-sizing worker cap. Internal. */\r\nexport const DEFAULT_MEM_UTILIZATION = 0.85;\r\n\r\n/** Auto cap when the user has not set maxConcurrentWorkers (safety on huge hosts). */\r\nexport const AUTO_MAX_WORKERS_CEILING = 64;\r\n\r\nexport interface RunnerResourceGateShape {\r\n ok: boolean;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n memReserveBytes: number;\r\n perWorkerMemBytes: number;\r\n configuredMaxWorkers: number | null;\r\n /** Where the effective worker cap was resolved (workspace override, env, config, or auto). */\r\n workerCapSource: WorkerCapSource;\r\n /** Physical pool for this host (`forge` | `ghost`). */\r\n boxKind: string;\r\n autoCap: number;\r\n capacityWorkers: number;\r\n maxConcurrentWorkers: number;\r\n activeWorkers: number;\r\n slotsAvailable: number;\r\n reason: string | null;\r\n /** Present unless `KYNVER_RESOURCE_GATE_SKIP_DISK=1`. */\r\n diskGate?: DispatchNextDiskGateShape;\r\n}\r\n\r\nexport interface ObserveResourceGateInput {\r\n runId: string;\r\n config?: KynverUserConfig;\r\n /** Command Center / workspace override \u2014 wins over local config when set. */\r\n configuredMaxWorkersOverride?: number | null;\r\n /** Override active worker count (tests). */\r\n activeWorkers?: number;\r\n totalMemBytes?: number;\r\n freeMemBytes?: number;\r\n diskPath?: string;\r\n skipDiskGate?: boolean;\r\n}\r\n\r\nfunction positiveInt(value: unknown, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nfunction resolveResourceConfig(\r\n config: KynverUserConfig = loadUserConfig(),\r\n configuredMaxWorkersOverride?: number | null,\r\n totalMemBytes?: number,\r\n) {\r\n const perWorkerMemBytes = positiveInt(config.perWorkerMemBytes, DEFAULT_PER_WORKER_MEM_BYTES);\r\n const memReserveBytes = positiveInt(config.memReserveBytes, DEFAULT_MEM_RESERVE_BYTES);\r\n const memUtilization = Math.min(\r\n 1,\r\n Math.max(0.1, Number(config.memUtilization) > 0 ? Number(config.memUtilization) : DEFAULT_MEM_UTILIZATION),\r\n );\r\n const cap = resolveWorkerCap({\r\n config,\r\n configuredMaxWorkersOverride,\r\n totalMemBytes: totalMemBytes ?? os.totalmem(),\r\n });\r\n return {\r\n perWorkerMemBytes,\r\n memReserveBytes,\r\n memUtilization,\r\n configuredMaxWorkers: cap.configuredMaxWorkers,\r\n autoCap: cap.autoCap,\r\n workerCapSource: cap.workerCapSource,\r\n };\r\n}\r\n\r\n/** How many workers this host could run from RAM alone (before a user cap). */\r\nexport function computeAutoMaxWorkers(\r\n totalMemBytes: number,\r\n opts: { perWorkerMemBytes?: number; memReserveBytes?: number; memUtilization?: number } = {},\r\n): number {\r\n const perWorkerMemBytes = opts.perWorkerMemBytes ?? DEFAULT_PER_WORKER_MEM_BYTES;\r\n const memReserveBytes = opts.memReserveBytes ?? DEFAULT_MEM_RESERVE_BYTES;\r\n const memUtilization = opts.memUtilization ?? DEFAULT_MEM_UTILIZATION;\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * memUtilization) - memReserveBytes);\r\n const raw = Math.max(1, Math.floor(budgetBytes / perWorkerMemBytes));\r\n return Math.min(raw, AUTO_MAX_WORKERS_CEILING);\r\n}\r\n\r\nfunction readAvailableMemBytes(): number {\r\n return readMemAvailableBytes();\r\n}\r\n\r\n/** Count alive, still-executing workers in a single run record. */\r\nfunction countActiveWorkersForRun(run: HarnessRunRecord): number {\r\n let active = 0;\r\n for (const name of listRunWorkerNames(run)) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker || !isActiveHarnessWorker(worker)) continue;\r\n active++;\r\n }\r\n return active;\r\n}\r\n\r\n/** Count active workers in ONE run (kept for callers/tests scoped to a run). */\r\nexport function countActiveWorkers(runId: string): number {\r\n return countActiveWorkersForRun(loadRun(runId));\r\n}\r\n\r\n/**\r\n * Count active workers across EVERY run on disk. The harness creates a new run\r\n * per task, so a per-run count let concurrent runs each believe the machine was\r\n * idle \u2014 the configured cap was never a real global ceiling (the \"spawns 4 or\r\n * infinity, never N\" bug). This machine-wide count is what the gate must use.\r\n */\r\nexport function countActiveWorkersGlobal(): number {\r\n let active = 0;\r\n for (const run of listRunRecords()) active += countActiveWorkersForRun(run);\r\n return active;\r\n}\r\n\r\n/**\r\n * Compute how many workers this host can run and how many dispatch slots remain.\r\n * Uses total RAM for steady-state capacity and free RAM as a hard safety gate.\r\n */\r\nexport function observeRunnerResourceGate(input: ObserveResourceGateInput): RunnerResourceGateShape {\r\n const config = input.config ?? loadUserConfig();\r\n const totalMemBytes = input.totalMemBytes ?? os.totalmem();\r\n const { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers, autoCap: resolvedAutoCap, workerCapSource } =\r\n resolveResourceConfig(config, input.configuredMaxWorkersOverride, totalMemBytes);\r\n const boxKind = resolveBoxKindFromConfig(config);\r\n const freeMemBytes = input.freeMemBytes ?? readAvailableMemBytes();\r\n // Active count is GLOBAL across all runs (see countActiveWorkersGlobal), so the\r\n // cap is a true machine-wide ceiling rather than per-run.\r\n const activeWorkers = input.activeWorkers ?? countActiveWorkersGlobal();\r\n\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * memUtilization) - memReserveBytes);\r\n const capacityFromTotal = Math.max(0, Math.floor(budgetBytes / perWorkerMemBytes));\r\n const capacityFromFree = Math.max(0, Math.floor(Math.max(0, freeMemBytes - memReserveBytes) / perWorkerMemBytes));\r\n\r\n const autoCap = resolvedAutoCap;\r\n const targetCap = configuredMaxWorkers ?? autoCap;\r\n const maxConcurrentWorkers = Math.max(0, Math.min(targetCap, capacityFromTotal));\r\n const slotsByCapacity = Math.max(0, maxConcurrentWorkers - activeWorkers);\r\n // capacityFromFree is ADDITIONAL headroom: free/available RAM already excludes\r\n // memory held by running workers, so we must NOT subtract activeWorkers again.\r\n // Doing so (the old `capacityFromFree - activeWorkers`) double-counted active\r\n // workers and collapsed dispatch to a handful of slots under load.\r\n const slotsByFreeMem = capacityFromFree;\r\n let slotsAvailable = Math.min(slotsByCapacity, slotsByFreeMem);\r\n\r\n const skipDisk = input.skipDiskGate || process.env.KYNVER_RESOURCE_GATE_SKIP_DISK === \"1\";\r\n const diskGate = skipDisk\r\n ? undefined\r\n : observeRunnerDiskGate({\r\n diskPath:\r\n input.diskPath?.trim() ||\r\n process.env.KYNVER_DISK_GUARD_PATH?.trim() ||\r\n \"/\",\r\n });\r\n if (diskGate && !diskGate.ok) slotsAvailable = 0;\r\n\r\n let reason: string | null = null;\r\n if (slotsAvailable <= 0) {\r\n if (diskGate && !diskGate.ok) {\r\n reason = diskGate.reason ?? \"disk gate blocked worker admission\";\r\n } else if (activeWorkers >= maxConcurrentWorkers) {\r\n reason = `at worker limit (${activeWorkers}/${maxConcurrentWorkers} running)`;\r\n } else if (capacityFromFree <= 0) {\r\n reason = \"insufficient free memory \u2014 waiting for workers to finish\";\r\n } else {\r\n reason = \"no worker slots available\";\r\n }\r\n }\r\n\r\n return {\r\n ok: slotsAvailable > 0,\r\n totalMemBytes,\r\n freeMemBytes,\r\n memReserveBytes,\r\n perWorkerMemBytes,\r\n configuredMaxWorkers,\r\n workerCapSource,\r\n boxKind,\r\n autoCap,\r\n capacityWorkers: capacityFromTotal,\r\n maxConcurrentWorkers,\r\n activeWorkers,\r\n slotsAvailable,\r\n reason,\r\n ...(diskGate ? { diskGate } : {}),\r\n };\r\n}\r\n", "import type { KynverUserConfig } from \"./config.js\";\r\nimport {\r\n AUTO_MAX_WORKERS_CEILING,\r\n computeAutoMaxWorkers,\r\n DEFAULT_MEM_RESERVE_BYTES,\r\n DEFAULT_MEM_UTILIZATION,\r\n DEFAULT_PER_WORKER_MEM_BYTES,\r\n} from \"./resource-gate.js\";\r\n\r\nexport type WorkerCapSource = \"workspace_override\" | \"env\" | \"config\" | \"auto\";\r\n\r\nexport interface ResolvedWorkerCap {\r\n configuredMaxWorkers: number | null;\r\n autoCap: number;\r\n workerCapSource: WorkerCapSource;\r\n}\r\n\r\nfunction positiveInt(value: unknown, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nexport function resolveWorkerCap(\r\n input: {\r\n config?: KynverUserConfig;\r\n configuredMaxWorkersOverride?: number | null;\r\n totalMemBytes: number;\r\n env?: NodeJS.ProcessEnv;\r\n },\r\n): ResolvedWorkerCap {\r\n const config = input.config ?? {};\r\n const env = input.env ?? process.env;\r\n const perWorkerMemBytes = positiveInt(config.perWorkerMemBytes, DEFAULT_PER_WORKER_MEM_BYTES);\r\n const memReserveBytes = positiveInt(config.memReserveBytes, DEFAULT_MEM_RESERVE_BYTES);\r\n const memUtilization = Math.min(\r\n 1,\r\n Math.max(0.1, Number(config.memUtilization) > 0 ? Number(config.memUtilization) : DEFAULT_MEM_UTILIZATION),\r\n );\r\n const autoCap = computeAutoMaxWorkers(input.totalMemBytes, {\r\n perWorkerMemBytes,\r\n memReserveBytes,\r\n memUtilization,\r\n });\r\n\r\n if (input.configuredMaxWorkersOverride !== undefined && input.configuredMaxWorkersOverride !== null) {\r\n return {\r\n configuredMaxWorkers: positiveInt(input.configuredMaxWorkersOverride, autoCap),\r\n autoCap,\r\n workerCapSource: \"workspace_override\",\r\n };\r\n }\r\n\r\n if (config.maxConcurrentWorkers !== undefined && config.maxConcurrentWorkers !== null) {\r\n const configured = positiveInt(config.maxConcurrentWorkers, 0) || null;\r\n if (configured) {\r\n return {\r\n configuredMaxWorkers: Math.min(configured, AUTO_MAX_WORKERS_CEILING),\r\n autoCap,\r\n workerCapSource: \"config\",\r\n };\r\n }\r\n }\r\n\r\n const envIntentional =\r\n env.KYNVER_MAX_WORKERS_INTENTIONAL === \"1\" || env.KYNVER_MAX_WORKERS_INTENTIONAL === \"true\";\r\n const envCap = envIntentional && env.KYNVER_MAX_WORKERS ? positiveInt(env.KYNVER_MAX_WORKERS, 0) || null : null;\r\n if (envCap) {\r\n return {\r\n configuredMaxWorkers: Math.min(envCap, AUTO_MAX_WORKERS_CEILING),\r\n autoCap,\r\n workerCapSource: \"env\",\r\n };\r\n }\r\n\r\n return {\r\n configuredMaxWorkers: null,\r\n autoCap,\r\n workerCapSource: \"auto\",\r\n };\r\n}\r\n\r\nexport interface SetupWorkerCapRecommendation {\r\n totalMemBytes: number;\r\n autoCap: number;\r\n recommendedMaxWorkers: number;\r\n diskPath: string;\r\n diskGateOk: boolean;\r\n diskFreeBytes: number | null;\r\n}\r\n\r\n/** RAM/disk-aware default for `kynver setup` when the operator omits --max-workers. */\r\nexport function recommendSetupWorkerCap(\r\n input: {\r\n totalMemBytes?: number;\r\n diskPath?: string;\r\n diskGateOk?: boolean;\r\n diskFreeBytes?: number | null;\r\n config?: KynverUserConfig;\r\n } = {},\r\n): SetupWorkerCapRecommendation {\r\n const totalMemBytes = input.totalMemBytes ?? 0;\r\n const autoCap = computeAutoMaxWorkers(totalMemBytes, {\r\n perWorkerMemBytes: positiveInt(input.config?.perWorkerMemBytes, DEFAULT_PER_WORKER_MEM_BYTES),\r\n memReserveBytes: positiveInt(input.config?.memReserveBytes, DEFAULT_MEM_RESERVE_BYTES),\r\n memUtilization:\r\n input.config?.memUtilization && Number(input.config.memUtilization) > 0\r\n ? Number(input.config.memUtilization)\r\n : DEFAULT_MEM_UTILIZATION,\r\n });\r\n const diskGateOk = input.diskGateOk ?? true;\r\n const recommendedMaxWorkers = diskGateOk ? autoCap : Math.max(1, Math.min(autoCap, 4));\r\n return {\r\n totalMemBytes,\r\n autoCap,\r\n recommendedMaxWorkers,\r\n diskPath: input.diskPath ?? \"/\",\r\n diskGateOk,\r\n diskFreeBytes: input.diskFreeBytes ?? null,\r\n };\r\n}\r\n", "// `kynver login` device flow \u2014 \"authorize this machine\" without pasting a key.\r\n//\r\n// Calls the Kynver device-authorization endpoints: POST /api/auth/device/code\r\n// to get a short user code + verification URL, prints them, then polls\r\n// POST /api/auth/device/token until a human approves in the browser. On\r\n// approval the minted API key is saved to ~/.kynver/credentials. Server side:\r\n// src/modules/auth/device-authorization + app/api/auth/device/*.\r\n\r\nimport os from \"node:os\";\r\nimport { loadUserConfig, saveApiKey } from \"./config.js\";\r\nimport { trimTrailingSlash } from \"./util.js\";\r\n\r\nfunction resolveDeviceBaseUrl(args: Record<string, string | boolean>): string | undefined {\r\n const raw =\r\n (typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : undefined) ||\r\n (typeof args.baseUrl === \"string\" ? args.baseUrl : undefined) ||\r\n process.env.KYNVER_API_URL ||\r\n loadUserConfig().apiBaseUrl;\r\n return raw ? trimTrailingSlash(String(raw)) : undefined;\r\n}\r\n\r\nasync function sleep(ms: number): Promise<void> {\r\n await new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\ninterface DeviceCodeResponse {\r\n device_code: string;\r\n user_code: string;\r\n verification_uri: string;\r\n verification_uri_complete?: string;\r\n expires_in: number;\r\n interval: number;\r\n}\r\n\r\n/**\r\n * Run the device-authorization login flow. Returns `{ ok, apiKey }`. Prints\r\n * progress to the console. Does not exit the process (the caller decides).\r\n */\r\nexport async function runDeviceLogin(\r\n args: Record<string, string | boolean>,\r\n): Promise<{ ok: boolean; apiKey?: string }> {\r\n const base = resolveDeviceBaseUrl(args);\r\n if (!base) {\r\n console.error(\r\n \"kynver login (device flow) requires a Kynver URL \u2014 pass --api-base-url https://your-kynver-site, set KYNVER_API_URL, or run `kynver setup` first.\",\r\n );\r\n return { ok: false };\r\n }\r\n\r\n const clientName = `${os.hostname()} (${os.platform()})`;\r\n let start: DeviceCodeResponse;\r\n try {\r\n const res = await fetch(`${base}/api/auth/device/code`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ clientName }),\r\n });\r\n if (!res.ok) {\r\n console.error(`Could not start device authorization (${res.status}).`);\r\n return { ok: false };\r\n }\r\n start = (await res.json()) as DeviceCodeResponse;\r\n } catch (err) {\r\n console.error(`Could not reach ${base}: ${(err as Error).message}`);\r\n return { ok: false };\r\n }\r\n\r\n const verifyUrl = start.verification_uri_complete || start.verification_uri;\r\n console.log(\"\");\r\n console.log(\" Authorize this machine:\");\r\n console.log(` 1. Open: ${verifyUrl}`);\r\n console.log(` 2. Confirm the code: ${start.user_code}`);\r\n console.log(\"\");\r\n console.log(\" Waiting for approval\u2026\");\r\n\r\n const deadline = Date.now() + start.expires_in * 1000;\r\n let intervalMs = Math.max(1, start.interval) * 1000;\r\n\r\n while (Date.now() < deadline) {\r\n await sleep(intervalMs);\r\n let body: { status?: string; api_key?: string; interval?: number };\r\n try {\r\n const res = await fetch(`${base}/api/auth/device/token`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ device_code: start.device_code }),\r\n });\r\n body = (await res.json().catch(() => ({}))) as typeof body;\r\n } catch {\r\n continue; // transient \u2014 keep polling until the deadline\r\n }\r\n\r\n switch (body.status) {\r\n case \"approved\":\r\n if (body.api_key) {\r\n saveApiKey(body.api_key);\r\n console.log(\" Approved \u2014 this machine is now linked to your Kynver account.\");\r\n return { ok: true, apiKey: body.api_key };\r\n }\r\n return { ok: false };\r\n case \"slow_down\":\r\n intervalMs += 2000;\r\n break;\r\n case \"authorization_pending\":\r\n if (typeof body.interval === \"number\") intervalMs = Math.max(intervalMs, body.interval * 1000);\r\n break;\r\n case \"access_denied\":\r\n console.error(\" Request was denied in the browser.\");\r\n return { ok: false };\r\n case \"expired_token\":\r\n console.error(\" The code expired before it was approved. Run `kynver login` again.\");\r\n return { ok: false };\r\n default:\r\n // unknown/invalid \u2014 keep trying until the deadline\r\n break;\r\n }\r\n }\r\n\r\n console.error(\" Timed out waiting for approval. Run `kynver login` again.\");\r\n return { ok: false };\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir, totalmem } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { discoverDefaultRepo } from \"./default-repo-discovery.js\";\r\nimport { displayUserPath, redactHomePath } from \"./path-values.js\";\r\nimport { trimTrailingSlash } from \"./util.js\";\r\nimport { normalizeWorkerPoolBoxKind, resolveBoxIdentity } from \"./box-identity.js\";\r\nimport { recommendSetupWorkerCap } from \"./worker-cap-source.js\";\r\nimport { observeRunnerDiskGate } from \"./disk-gate.js\";\r\nimport os from \"node:os\";\r\n\r\nexport interface KynverUserConfig {\r\n apiBaseUrl?: string;\r\n agentOsSlug?: string;\r\n agentOsId?: string;\r\n defaultRepo?: string;\r\n workerProvider?: string;\r\n /** Default Claude model when dispatch does not infer or pass `--model`. */\r\n defaultModel?: string;\r\n harnessRoot?: string;\r\n /**\r\n * Operator attestation that the hosted Kynver deployment uses this scheduler provider\r\n * (set on user runners after Vercel env cutover \u2014 scheduling is deployment-owned).\r\n */\r\n deploymentSchedulerProvider?: \"qstash\" | \"kynver-cron\" | \"openclaw-cron\";\r\n /** Default harness run for `kynver daemon` / systemd user unit (set by `kynver cron install`). */\r\n defaultDaemonRunId?: string;\r\n /** Physical box pool for capacity snapshots (`forge` | `ghost`). Set via `kynver setup --box-kind`. */\r\n boxKind?: \"ghost\" | \"forge\";\r\n /**\r\n * Opt-in: delegated chat turns may use the Claude Code CLI's stored OAuth\r\n * token on this machine (M5.4). Set via `kynver start --chat-oauth` or\r\n * `kynver setup --chat-oauth`; the token itself never leaves the box.\r\n */\r\n chatUseClaudeOauth?: boolean;\r\n /** Max concurrent workers on this machine. Omit to auto-size from RAM. */\r\n maxConcurrentWorkers?: number;\r\n /** Where maxConcurrentWorkers came from. */\r\n maxConcurrentWorkersSource?: \"setup-auto\" | \"setup-flag\" | \"operator\";\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n perWorkerMemBytes?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n memReserveBytes?: number;\r\n /** @internal Advanced tuning \u2014 not required for setup. */\r\n memUtilization?: number;\r\n}\r\n\r\nconst CONFIG_DIR = path.join(homedir(), \".kynver\");\r\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\r\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, \"credentials\");\r\n\r\ninterface KynverCredentialsFile {\r\n apiKey?: string;\r\n /** Scoped `krc1.*` runner token for AgentOS by-id callbacks. */\r\n runnerToken?: string;\r\n runnerTokenAgentOsId?: string;\r\n}\r\n\r\nexport function loadUserConfig(): KynverUserConfig {\r\n if (!existsSync(CONFIG_FILE)) return {};\r\n try {\r\n return JSON.parse(readFileSync(CONFIG_FILE, \"utf8\")) as KynverUserConfig;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nexport function saveUserConfig(config: KynverUserConfig): void {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n writeFileSync(CONFIG_FILE, `${JSON.stringify(normalizeConfigPaths(config), null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\n/** Persist path fields with `~` instead of absolute home directories. */\r\nexport function normalizeConfigPaths(config: KynverUserConfig): KynverUserConfig {\r\n return {\r\n ...config,\r\n ...(config.harnessRoot?.trim() ? { harnessRoot: redactHomePath(config.harnessRoot.trim()) } : {}),\r\n ...(config.defaultRepo?.trim() ? { defaultRepo: redactHomePath(config.defaultRepo.trim()) } : {}),\r\n };\r\n}\r\n\r\n/** Values for setup output (never emit `/home/<user>/\u2026`). */\r\nexport function presentUserConfig(config: KynverUserConfig): KynverUserConfig {\r\n return normalizeConfigPaths(config);\r\n}\r\n\r\nfunction inferSetupFields(\r\n existing: KynverUserConfig,\r\n args: Record<string, string | boolean>,\r\n): Partial<KynverUserConfig> {\r\n const creds = loadCredentialsFile();\r\n const apiBaseUrl =\r\n (typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : undefined) ||\r\n existing.apiBaseUrl?.trim() ||\r\n process.env.KYNVER_API_URL?.trim() ||\r\n process.env.KYNVER_CRON_FIRE_BASE_URL?.trim() ||\r\n process.env.OPENCLAW_CRON_FIRE_BASE_URL?.trim();\r\n const agentOsId =\r\n (typeof args.agentOsId === \"string\" ? args.agentOsId : undefined) ||\r\n existing.agentOsId?.trim() ||\r\n process.env.KYNVER_AGENT_OS_ID?.trim() ||\r\n (creds.runnerToken?.trim().startsWith(\"krc1.\") ? creds.runnerTokenAgentOsId?.trim() : undefined);\r\n const explicitRepo =\r\n typeof args.repo === \"string\"\r\n ? args.repo\r\n : args.discoverRepo === true || args.discoverRepo === \"true\"\r\n ? discoverDefaultRepo()?.repo\r\n : undefined;\r\n const defaultRepo =\r\n explicitRepo ||\r\n existing.defaultRepo?.trim() ||\r\n process.env.KYNVER_DEFAULT_REPO?.trim() ||\r\n process.env.KYNVER_HARNESS_REPO?.trim() ||\r\n discoverDefaultRepo()?.repo;\r\n const harnessRoot =\r\n (typeof args.harnessRoot === \"string\" ? args.harnessRoot : undefined) ||\r\n existing.harnessRoot?.trim() ||\r\n process.env.KYNVER_HARNESS_ROOT?.trim() ||\r\n process.env.OPUS_HARNESS_ROOT?.trim();\r\n\r\n return {\r\n ...(apiBaseUrl ? { apiBaseUrl: trimTrailingSlash(apiBaseUrl) } : {}),\r\n ...(agentOsId ? { agentOsId } : {}),\r\n ...(defaultRepo ? { defaultRepo } : {}),\r\n ...(harnessRoot ? { harnessRoot } : {}),\r\n ...(typeof args.agentOsSlug === \"string\"\r\n ? { agentOsSlug: args.agentOsSlug }\r\n : existing.agentOsSlug\r\n ? { agentOsSlug: existing.agentOsSlug }\r\n : {}),\r\n };\r\n}\r\n\r\nconst SETUP_PER_WORKER_MEM_BYTES = 500 * 1024 * 1024;\r\nconst SETUP_MEM_RESERVE_BYTES = 4 * 1024 * 1024 * 1024;\r\nconst SETUP_MEM_UTILIZATION = 0.85;\r\nconst SETUP_AUTO_MAX_WORKERS_CEILING = 64;\r\n\r\nfunction normalizeBoxKind(raw: unknown): \"ghost\" | \"forge\" | undefined {\r\n const kind = String(raw ?? \"\").trim().toLowerCase();\r\n if (!kind) return undefined;\r\n if (kind === \"ghost\" || kind.includes(\"ghost\") || kind.includes(\"openclaw\")) return \"ghost\";\r\n if (kind === \"forge\" || kind.includes(\"forge\")) return \"forge\";\r\n return undefined;\r\n}\r\n\r\nexport function computeSetupAutoMaxWorkers(totalMemBytes: number): number {\r\n const budgetBytes = Math.max(0, Math.floor(totalMemBytes * SETUP_MEM_UTILIZATION) - SETUP_MEM_RESERVE_BYTES);\r\n const raw = Math.max(1, Math.floor(budgetBytes / SETUP_PER_WORKER_MEM_BYTES));\r\n return Math.min(raw, SETUP_AUTO_MAX_WORKERS_CEILING);\r\n}\r\n\r\nexport function resolveSetupWorkerConfig(\r\n existing: KynverUserConfig,\r\n args: Record<string, string | boolean>,\r\n totalMemBytes = totalmem(),\r\n): Pick<KynverUserConfig, \"maxConcurrentWorkers\" | \"maxConcurrentWorkersSource\" | \"boxKind\"> {\r\n const maxWorkersRaw =\r\n typeof args.maxWorkers === \"string\"\r\n ? args.maxWorkers\r\n : typeof args.maxConcurrentWorkers === \"string\"\r\n ? args.maxConcurrentWorkers\r\n : undefined;\r\n const explicitBoxKindArg =\r\n typeof args.boxKind === \"string\"\r\n ? args.boxKind\r\n : typeof args[\"box-kind\"] === \"string\"\r\n ? String(args[\"box-kind\"])\r\n : undefined;\r\n const boxKind = resolveBoxIdentity(process.env, {\r\n ...existing,\r\n ...(explicitBoxKindArg ? { boxKind: normalizeWorkerPoolBoxKind(explicitBoxKindArg) } : {}),\r\n }).boxKind;\r\n const diskGate = observeRunnerDiskGate({\r\n diskPath: typeof args.diskPath === \"string\" ? args.diskPath : \"/\",\r\n });\r\n const capRecommendation = recommendSetupWorkerCap({\r\n totalMemBytes,\r\n diskPath: diskGate.path,\r\n diskGateOk: diskGate.ok,\r\n diskFreeBytes: diskGate.freeBytes,\r\n config: existing,\r\n });\r\n if (maxWorkersRaw) {\r\n return {\r\n maxConcurrentWorkers: Math.max(1, Math.floor(Number(maxWorkersRaw))),\r\n maxConcurrentWorkersSource: \"setup-flag\",\r\n boxKind,\r\n };\r\n }\r\n if (existing.maxConcurrentWorkers !== undefined && existing.maxConcurrentWorkers !== null) {\r\n return {\r\n maxConcurrentWorkers: Math.max(1, Math.floor(Number(existing.maxConcurrentWorkers))),\r\n maxConcurrentWorkersSource: existing.maxConcurrentWorkersSource ?? \"operator\",\r\n boxKind,\r\n };\r\n }\r\n return {\r\n maxConcurrentWorkers: capRecommendation.recommendedMaxWorkers,\r\n maxConcurrentWorkersSource: \"setup-auto\",\r\n boxKind,\r\n };\r\n}\r\n\r\nfunction loadCredentialsFile(): KynverCredentialsFile {\r\n if (!existsSync(CREDENTIALS_FILE)) return {};\r\n try {\r\n return JSON.parse(readFileSync(CREDENTIALS_FILE, \"utf8\")) as KynverCredentialsFile;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction saveCredentialsFile(parsed: KynverCredentialsFile): void {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n writeFileSync(CREDENTIALS_FILE, `${JSON.stringify(parsed, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nexport function loadApiKey(): string | undefined {\r\n if (process.env.KYNVER_API_KEY) return process.env.KYNVER_API_KEY;\r\n return loadCredentialsFile().apiKey;\r\n}\r\n\r\nexport function saveApiKey(apiKey: string): void {\r\n saveCredentialsFile({ ...loadCredentialsFile(), apiKey });\r\n}\r\n\r\nexport function loadRunnerToken(agentOsId?: string): string | undefined {\r\n const envToken = process.env.KYNVER_RUNNER_TOKEN?.trim();\r\n if (envToken) return envToken;\r\n\r\n const creds = loadCredentialsFile();\r\n if (!creds.runnerToken) return undefined;\r\n if (agentOsId && creds.runnerTokenAgentOsId && creds.runnerTokenAgentOsId !== agentOsId) {\r\n return undefined;\r\n }\r\n return creds.runnerToken;\r\n}\r\n\r\nexport function saveRunnerToken(agentOsId: string, token: string): void {\r\n saveCredentialsFile({\r\n ...loadCredentialsFile(),\r\n runnerToken: token,\r\n runnerTokenAgentOsId: agentOsId,\r\n });\r\n}\r\n\r\nexport function resolveBaseUrl(argsBaseUrl?: string): string {\r\n const baseUrl = resolveConfiguredBaseUrl(argsBaseUrl);\r\n if (!baseUrl) failConfig(\"requires --base-url, KYNVER_API_URL, KYNVER_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl\");\r\n return baseUrl;\r\n}\r\n\r\nfunction resolveConfiguredBaseUrl(argsBaseUrl?: string): string | undefined {\r\n const baseUrl =\r\n argsBaseUrl ||\r\n process.env.KYNVER_API_URL ||\r\n process.env.KYNVER_CRON_FIRE_BASE_URL ||\r\n process.env.OPENCLAW_CRON_FIRE_BASE_URL ||\r\n loadUserConfig().apiBaseUrl;\r\n return baseUrl ? trimTrailingSlash(String(baseUrl)) : undefined;\r\n}\r\n\r\nfunction resolveConfiguredCallbackSecret(argsSecret?: string, agentOsId?: string): string | undefined {\r\n const scoped =\r\n argsSecret ||\r\n loadRunnerToken(agentOsId) ||\r\n (agentOsId ? undefined : loadRunnerToken(loadUserConfig().agentOsId));\r\n if (scoped) return String(scoped);\r\n\r\n const globalSecret =\r\n process.env.KYNVER_RUNTIME_SECRET ||\r\n process.env.KYNVER_CRON_SECRET ||\r\n process.env.OPENCLAW_CRON_SECRET;\r\n if (globalSecret) {\r\n console.warn(\r\n \"[kynver] using deployment-level callback secret; run `kynver runner credential --agent-os-id <id>` for a scoped token\",\r\n );\r\n return String(globalSecret);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function resolveCallbackSecret(argsSecret?: string, agentOsId?: string): string {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return configured;\r\n\r\n failConfig(\r\n \"requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, KYNVER_API_KEY with an API base URL to mint one, or (legacy) KYNVER_RUNTIME_SECRET / KYNVER_CRON_SECRET / OPENCLAW_CRON_SECRET\",\r\n );\r\n}\r\n\r\n/**\r\n * Non-exiting sibling of `resolveCallbackSecretWithMint` for long-lived\r\n * callers (the supervised daemon): a missing/unmintable runner credential\r\n * must surface as a value, never `process.exit` \u2014 exiting inside the daemon\r\n * child turns the keeper into a silent crash loop (\"service active, runtime\r\n * dead\") and takes the chat claim loop down with it.\r\n */\r\nexport async function tryResolveCallbackSecretWithMint(\r\n argsSecret?: string,\r\n agentOsId?: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<{ ok: true; secret: string } | { ok: false; reason: string }> {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return { ok: true, secret: configured };\r\n\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (apiKey && agentOsId && baseUrl) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n saveRunnerToken(agentOsId, token);\r\n return { ok: true, secret: token };\r\n } catch (error) {\r\n return { ok: false, reason: `runner credential mint failed: ${(error as Error).message}` };\r\n }\r\n }\r\n\r\n return {\r\n ok: false,\r\n reason:\r\n \"no runner credential: requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, or KYNVER_API_KEY + API base URL to mint one\",\r\n };\r\n}\r\n\r\nexport async function resolveCallbackSecretWithMint(\r\n argsSecret?: string,\r\n agentOsId?: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string> {\r\n const result = await tryResolveCallbackSecretWithMint(argsSecret, agentOsId, opts);\r\n if (result.ok) return result.secret;\r\n failConfig(result.reason);\r\n}\r\n\r\n/**\r\n * Force-mint a fresh scoped runner token for `agentOsId`, bypassing any cached\r\n * or env token. Recovery path for a callback that 401s because the configured\r\n * token is revoked, expired, or scoped to a *different* workspace (the\r\n * self-linked repair case). Requires an API key + base URL to mint; returns\r\n * `null` when a fresh token cannot be obtained, so the caller degrades to a\r\n * structural blocker instead of papering the worker over as done.\r\n */\r\nexport async function refreshRunnerToken(\r\n agentOsId: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string | null> {\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (!apiKey || !agentOsId || !baseUrl) return null;\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n saveRunnerToken(agentOsId, token);\r\n return token;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function refreshRunnerTokenForAuthFailure(\r\n rejectedSecret: string,\r\n agentOsId: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<{ ok: true; token: string } | { ok: false; reason: string }> {\r\n const apiKey = loadApiKey();\r\n const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);\r\n if (!apiKey) return { ok: false, reason: \"KYNVER_API_KEY is required to refresh a rejected runner token\" };\r\n if (!agentOsId) return { ok: false, reason: \"agentOsId is required to refresh a rejected runner token\" };\r\n if (!baseUrl) return { ok: false, reason: \"KYNVER_API_URL or --base-url is required to refresh a rejected runner token\" };\r\n\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });\r\n if (token && token !== rejectedSecret) {\r\n saveRunnerToken(agentOsId, token);\r\n return { ok: true, token };\r\n }\r\n return { ok: false, reason: \"runner credential refresh returned the rejected token\" };\r\n } catch (error) {\r\n return { ok: false, reason: (error as Error).message };\r\n }\r\n}\r\n\r\nexport async function fetchRunnerCredential(\r\n agentOsId: string,\r\n opts?: { baseUrl?: string; apiKey?: string },\r\n): Promise<string> {\r\n const apiKey = opts?.apiKey || loadApiKey();\r\n if (!apiKey) throw new Error(\"API key required \u2014 run `kynver login` first\");\r\n\r\n const base = resolveBaseUrl(opts?.baseUrl);\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runner-credentials`;\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${apiKey}`,\r\n },\r\n body: JSON.stringify({}),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: { token?: string; error?: string } | null = null;\r\n try {\r\n parsed = JSON.parse(text) as { token?: string; error?: string };\r\n } catch {\r\n parsed = null;\r\n }\r\n if (!res.ok || !parsed?.token) {\r\n throw new Error(\r\n `runner credential mint failed (${res.status}): ${parsed?.error ?? text.slice(0, 200)}`,\r\n );\r\n }\r\n return parsed.token;\r\n}\r\n\r\nexport async function mintRunnerCredential(args: Record<string, string | boolean>): Promise<void> {\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : loadUserConfig().agentOsId) || \"\";\r\n if (!agentOsId) failConfig(\"runner credential requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, {\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n });\r\n saveRunnerToken(agentOsId, token);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n agentOsId,\r\n credentialsPath: displayUserPath(CREDENTIALS_FILE),\r\n tokenPrefix: `${token.slice(0, 12)}\u2026`,\r\n note: \"Scoped runner token saved; callbacks use X-Kynver-Runner-Token.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (err) {\r\n console.error(err instanceof Error ? err.message : String(err));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction failConfig(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport function parseArgs(argv: string[]): Record<string, string | boolean> {\r\n const args: Record<string, string | boolean> = {};\r\n for (let i = 0; i < argv.length; i++) {\r\n const item = argv[i];\r\n if (!item.startsWith(\"--\")) continue;\r\n const key = item.slice(2).replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n const next = argv[i + 1];\r\n if (!next || next.startsWith(\"--\")) args[key] = true;\r\n else {\r\n args[key] = next;\r\n i++;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\nexport async function runSetup(args: Record<string, string | boolean>): Promise<void> {\r\n const existing = loadUserConfig();\r\n const diskGate = observeRunnerDiskGate({\r\n diskPath: typeof args.diskPath === \"string\" ? args.diskPath : \"/\",\r\n });\r\n const capRecommendation = recommendSetupWorkerCap({\r\n totalMemBytes: os.totalmem(),\r\n diskPath: diskGate.path,\r\n diskGateOk: diskGate.ok,\r\n diskFreeBytes: diskGate.freeBytes,\r\n config: existing,\r\n });\r\n const workerConfig = resolveSetupWorkerConfig(existing, args);\r\n const config: KynverUserConfig = normalizeConfigPaths({\r\n ...existing,\r\n ...inferSetupFields(existing, args),\r\n ...workerConfig,\r\n workerProvider:\r\n typeof args.provider === \"string\"\r\n ? args.provider\r\n : existing.workerProvider || \"cursor\",\r\n // M5.4 chat-turn delegation: `--chat-oauth` persists consent to use the\r\n // Claude Code CLI's local OAuth token for delegated chat turns.\r\n ...(args.chatOauth === true ? { chatUseClaudeOauth: true } : {}),\r\n });\r\n saveUserConfig(config);\r\n const boxIdentity = resolveBoxIdentity(process.env, config);\r\n\r\n let runnerCredentialNote: string | undefined;\r\n const apiKey = loadApiKey();\r\n const agentOsId = config.agentOsId;\r\n if (apiKey && agentOsId) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, {\r\n baseUrl: typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : config.apiBaseUrl,\r\n apiKey,\r\n });\r\n saveRunnerToken(agentOsId, token);\r\n runnerCredentialNote = \"Scoped runner token minted and saved to ~/.kynver/credentials.\";\r\n } catch {\r\n runnerCredentialNote =\r\n \"Runner token not minted (server offline or master secret unset). Run `kynver runner credential` after deploy.\";\r\n }\r\n }\r\n\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n configPath: displayUserPath(CONFIG_FILE),\r\n config: presentUserConfig(config),\r\n boxKind: config.boxKind,\r\n boxKindSource: boxIdentity.source,\r\n workerCapRecommendation: capRecommendation,\r\n ...(boxIdentity.warnings.length ? { boxIdentityWarnings: boxIdentity.warnings } : {}),\r\n note:\r\n runnerCredentialNote ??\r\n \"boxKind and maxConcurrentWorkers persisted; override with --box-kind and --max-workers. Run `kynver login` + `kynver runner credential` for scoped callbacks.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n\r\nexport async function runLogin(args: Record<string, string | boolean>): Promise<void> {\r\n const apiKey = typeof args.apiKey === \"string\" ? args.apiKey : process.env.KYNVER_API_KEY;\r\n if (apiKey) {\r\n saveApiKey(apiKey);\r\n console.log(JSON.stringify({ ok: true, credentialsPath: displayUserPath(CREDENTIALS_FILE) }, null, 2));\r\n return;\r\n }\r\n // No key provided \u2014 run the browser \"authorize this machine\" device flow.\r\n const { runDeviceLogin } = await import(\"./device-login.js\");\r\n const result = await runDeviceLogin(args);\r\n if (!result.ok) process.exit(1);\r\n console.log(JSON.stringify({ ok: true, credentialsPath: displayUserPath(CREDENTIALS_FILE) }, null, 2));\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { dirname, join } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nfunction resolvePackageRoot(moduleUrl: string): string {\r\n let dir = dirname(fileURLToPath(moduleUrl));\r\n for (let depth = 0; depth < 6; depth += 1) {\r\n if (existsSync(join(dir, \"package.json\"))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n throw new Error(`package.json not found above ${dirname(fileURLToPath(moduleUrl))}`);\r\n}\r\n\r\nexport function readOwnPackageVersion(moduleUrl: string = import.meta.url): string {\r\n const pkgPath = join(resolvePackageRoot(moduleUrl), \"package.json\");\r\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as { version?: string };\r\n if (typeof pkg.version !== \"string\" || !pkg.version.trim()) {\r\n throw new Error(`Missing package.json version at ${pkgPath}`);\r\n }\r\n return pkg.version;\r\n}\r\n\r\nexport const PACKAGE_VERSION = readOwnPackageVersion();\r\n\r\nexport function wantsCliVersion(argv: string[]): boolean {\r\n return argv.some((arg) => arg === \"--version\" || arg === \"-v\");\r\n}\r\n\r\nexport function printCliVersionAndExit(version: string, binName?: string): never {\r\n console.log(binName ? `${binName} ${version}` : version);\r\n process.exit(0);\r\n}\r\n\r\nexport function handleCliVersionFlag(\r\n argv: string[],\r\n moduleUrl: string = import.meta.url,\r\n binName?: string,\r\n): boolean {\r\n if (!wantsCliVersion(argv)) return false;\r\n printCliVersionAndExit(readOwnPackageVersion(moduleUrl), binName);\r\n return true;\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { discoverDefaultRepo } from \"./default-repo-discovery.js\";\r\n\r\n/** Minimum versions that ship MARM memory cost controls (PR #1159). */\r\nexport const MEMORY_COST_PACKAGE_MIN_VERSIONS = {\r\n \"@kynver-app/runtime\": \"0.1.83\",\r\n \"@kynver-app/openclaw-agent-os\": \"0.1.43\",\r\n \"@kynver-app/mcp-agent-os\": \"0.3.34\",\r\n} as const;\r\n\r\nexport type MemoryCostManagedPackageName = keyof typeof MEMORY_COST_PACKAGE_MIN_VERSIONS;\r\n\r\nexport const MEMORY_COST_MANAGED_PACKAGES = Object.keys(\r\n MEMORY_COST_PACKAGE_MIN_VERSIONS,\r\n) as MemoryCostManagedPackageName[];\r\n\r\nexport type MemoryCostVersionSource = \"self\" | \"installed\" | \"repo\" | \"unknown\";\r\n\r\nexport interface MemoryCostPackageVersionCandidate {\r\n version: string;\r\n source: MemoryCostVersionSource;\r\n path?: string;\r\n}\r\n\r\nexport interface MemoryCostPackageGuardRow {\r\n packageName: MemoryCostManagedPackageName;\r\n displayName: string;\r\n minimumVersion: string;\r\n effectiveVersion: string | null;\r\n effectiveSource: MemoryCostVersionSource;\r\n ok: boolean;\r\n summary: string;\r\n remediation: string[];\r\n}\r\n\r\nexport interface MemoryCostPackageGuardResult {\r\n ok: boolean;\r\n summary: string;\r\n packages: MemoryCostPackageGuardRow[];\r\n}\r\n\r\nconst DISPLAY_NAMES: Record<MemoryCostManagedPackageName, string> = {\r\n \"@kynver-app/runtime\": \"Kynver runtime\",\r\n \"@kynver-app/openclaw-agent-os\": \"OpenClaw AgentOS plugin\",\r\n \"@kynver-app/mcp-agent-os\": \"AgentOS MCP server\",\r\n};\r\n\r\nconst REPO_PACKAGE_JSON_RELATIVE: Record<MemoryCostManagedPackageName, string> = {\r\n \"@kynver-app/runtime\": \"packages/kynver-runtime/package.json\",\r\n \"@kynver-app/openclaw-agent-os\": \"packages/kynver-openclaw-agent-os/package.json\",\r\n \"@kynver-app/mcp-agent-os\": \"packages/kynver-mcp-agent-os/package.json\",\r\n};\r\n\r\n/** Parse `major.minor.patch`; pre-release/build suffixes are ignored. */\r\nexport function parseSemverParts(version: string): [number, number, number] | null {\r\n const core = version.trim().split(\"-\")[0]?.split(\"+\")[0];\r\n if (!core) return null;\r\n const parts = core.split(\".\");\r\n if (parts.length < 1 || parts.length > 3) return null;\r\n const nums = parts.map((p) => Number.parseInt(p, 10));\r\n if (nums.some((n) => !Number.isFinite(n) || n < 0)) return null;\r\n while (nums.length < 3) nums.push(0);\r\n return [nums[0]!, nums[1]!, nums[2]!];\r\n}\r\n\r\n/** Returns 1 if a > b, -1 if a < b, 0 if equal or either unparsable. */\r\nexport function compareSemver(a: string, b: string): number {\r\n const pa = parseSemverParts(a);\r\n const pb = parseSemverParts(b);\r\n if (!pa || !pb) return 0;\r\n for (let i = 0; i < 3; i += 1) {\r\n if (pa[i]! > pb[i]!) return 1;\r\n if (pa[i]! < pb[i]!) return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport function semverAtLeast(version: string, minimum: string): boolean {\r\n return compareSemver(version, minimum) >= 0;\r\n}\r\n\r\nfunction maxSemver(versions: readonly string[]): string | null {\r\n let best: string | null = null;\r\n for (const version of versions) {\r\n if (!best || compareSemver(version, best) > 0) best = version;\r\n }\r\n return best;\r\n}\r\n\r\nfunction readPackageJsonVersion(packageJsonPath: string): string | null {\r\n try {\r\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: unknown };\r\n return typeof parsed.version === \"string\" && parsed.version.trim() ? parsed.version.trim() : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction resolveRepoRoot(cwd: string, explicitRepoRoot?: string): string | null {\r\n const candidates = [explicitRepoRoot, process.env.KYNVER_REPO, cwd].filter(\r\n (value): value is string => Boolean(value?.trim()),\r\n );\r\n for (const candidate of candidates) {\r\n const resolved = path.resolve(candidate);\r\n if (\r\n existsSync(path.join(resolved, \"packages/kynver-runtime/package.json\")) &&\r\n existsSync(path.join(resolved, \"package.json\"))\r\n ) {\r\n return resolved;\r\n }\r\n }\r\n const discovered = discoverDefaultRepo({ cwd });\r\n return discovered?.repo ?? null;\r\n}\r\n\r\nexport function probeRepoPackageVersions(input: {\r\n cwd?: string;\r\n repoRoot?: string;\r\n} = {}): Partial<Record<MemoryCostManagedPackageName, MemoryCostPackageVersionCandidate>> {\r\n const cwd = input.cwd ?? process.cwd();\r\n const repoRoot = resolveRepoRoot(cwd, input.repoRoot);\r\n if (!repoRoot) return {};\r\n\r\n const out: Partial<Record<MemoryCostManagedPackageName, MemoryCostPackageVersionCandidate>> = {};\r\n for (const packageName of MEMORY_COST_MANAGED_PACKAGES) {\r\n const packageJsonPath = path.join(repoRoot, REPO_PACKAGE_JSON_RELATIVE[packageName]);\r\n const version = readPackageJsonVersion(packageJsonPath);\r\n if (!version) continue;\r\n out[packageName] = { version, source: \"repo\", path: packageJsonPath };\r\n }\r\n return out;\r\n}\r\n\r\nfunction repoSourceCommands(packageName: MemoryCostManagedPackageName): string[] {\r\n if (packageName === \"@kynver-app/runtime\") {\r\n return [\"npm run kynver:build\", \"npm run kynver\"];\r\n }\r\n return [`npm run build -w ${packageName}`];\r\n}\r\n\r\nfunction buildRemediation(input: {\r\n packageName: MemoryCostManagedPackageName;\r\n minimumVersion: string;\r\n effectiveVersion: string | null;\r\n effectiveSource: MemoryCostVersionSource;\r\n repoVersion: string | null;\r\n}): string[] {\r\n const { packageName, minimumVersion, effectiveVersion, effectiveSource, repoVersion } = input;\r\n const lines: string[] = [];\r\n if (repoVersion && semverAtLeast(repoVersion, minimumVersion)) {\r\n lines.push(\r\n `Use the monorepo checkout (${repoVersion}) instead of a stale npm install: ${repoSourceCommands(packageName).join(\"; \")}.`,\r\n );\r\n lines.push(\"Do not publish npm packages or wait on an operator release.\");\r\n return lines;\r\n }\r\n if (effectiveVersion) {\r\n lines.push(\r\n `Upgrade ${packageName} from ${effectiveVersion} to >= ${minimumVersion} (npm install -g ${packageName}@latest or align OpenClaw npm prefix).`,\r\n );\r\n } else {\r\n lines.push(`Install ${packageName} >= ${minimumVersion} before running memory-heavy AgentOS paths.`);\r\n }\r\n if (packageName === \"@kynver-app/runtime\") {\r\n lines.push(\"Repo-source alternative: npm run kynver:build && npm run kynver\");\r\n }\r\n if (effectiveSource === \"installed\" && repoVersion) {\r\n lines.push(`Repo checkout reports ${repoVersion}; rebuild/link repo source if you develop from the monorepo.`);\r\n }\r\n return lines;\r\n}\r\n\r\nfunction pickEffectiveCandidate(\r\n candidates: MemoryCostPackageVersionCandidate[],\r\n): { version: string | null; source: MemoryCostVersionSource } {\r\n if (candidates.length === 0) return { version: null, source: \"unknown\" };\r\n const best = maxSemver(candidates.map((candidate) => candidate.version));\r\n if (!best) return { version: null, source: \"unknown\" };\r\n const winner = candidates.find((candidate) => candidate.version === best) ?? candidates[0]!;\r\n return { version: winner.version, source: winner.source };\r\n}\r\n\r\nexport function evaluateMemoryCostPackageVersionGuard(input: {\r\n installed?: Partial<Record<MemoryCostManagedPackageName, string | MemoryCostPackageVersionCandidate>>;\r\n repo?: Partial<Record<MemoryCostManagedPackageName, string | MemoryCostPackageVersionCandidate>>;\r\n self?: Partial<Record<MemoryCostManagedPackageName, string | MemoryCostPackageVersionCandidate>>;\r\n} = {}): MemoryCostPackageGuardResult {\r\n const normalize = (\r\n value: string | MemoryCostPackageVersionCandidate | undefined,\r\n fallbackSource: MemoryCostVersionSource,\r\n ): MemoryCostPackageVersionCandidate | null => {\r\n if (!value) return null;\r\n if (typeof value === \"string\") return { version: value, source: fallbackSource };\r\n return value;\r\n };\r\n\r\n const packages = MEMORY_COST_MANAGED_PACKAGES.map((packageName): MemoryCostPackageGuardRow => {\r\n const minimumVersion = MEMORY_COST_PACKAGE_MIN_VERSIONS[packageName];\r\n const candidates: MemoryCostPackageVersionCandidate[] = [];\r\n const installed = normalize(input.installed?.[packageName], \"installed\");\r\n const repo = normalize(input.repo?.[packageName], \"repo\");\r\n const self = normalize(input.self?.[packageName], \"self\");\r\n if (installed) candidates.push(installed);\r\n if (repo) candidates.push(repo);\r\n if (self) candidates.push(self);\r\n\r\n const { version: effectiveVersion, source: effectiveSource } = pickEffectiveCandidate(candidates);\r\n const repoVersion = repo?.version ?? null;\r\n const ok = effectiveVersion ? semverAtLeast(effectiveVersion, minimumVersion) : false;\r\n const remediation = ok\r\n ? []\r\n : buildRemediation({\r\n packageName,\r\n minimumVersion,\r\n effectiveVersion,\r\n effectiveSource,\r\n repoVersion,\r\n });\r\n\r\n const summary = ok\r\n ? `${DISPLAY_NAMES[packageName]} ${effectiveVersion} meets memory-cost minimum ${minimumVersion} (${effectiveSource}).`\r\n : `${DISPLAY_NAMES[packageName]} is below memory-cost minimum ${minimumVersion}` +\r\n (effectiveVersion ? ` (effective ${effectiveVersion} via ${effectiveSource})` : \" (no version detected)\") +\r\n \".\";\r\n\r\n return {\r\n packageName,\r\n displayName: DISPLAY_NAMES[packageName],\r\n minimumVersion,\r\n effectiveVersion,\r\n effectiveSource,\r\n ok,\r\n summary,\r\n remediation,\r\n };\r\n });\r\n\r\n const violations = packages.filter((row) => !row.ok);\r\n const ok = violations.length === 0;\r\n const summary = ok\r\n ? \"All managed AgentOS packages meet memory-cost minimum versions.\"\r\n : `Memory-cost package guard blocked ${violations.length} stale package(s): ${violations\r\n .map((row) => `${row.packageName} < ${row.minimumVersion}`)\r\n .join(\"; \")}.`;\r\n\r\n return { ok, summary, packages };\r\n}\r\n\r\nexport class MemoryCostPackageVersionGuardError extends Error {\r\n readonly result: MemoryCostPackageGuardResult;\r\n\r\n constructor(result: MemoryCostPackageGuardResult) {\r\n const lines = [\r\n result.summary,\r\n ...result.packages\r\n .filter((row) => !row.ok)\r\n .flatMap((row) => [`- ${row.summary}`, ...row.remediation.map((line) => ` \u2192 ${line}`)]),\r\n ];\r\n super(lines.join(\"\\n\"));\r\n this.name = \"MemoryCostPackageVersionGuardError\";\r\n this.result = result;\r\n }\r\n}\r\n\r\nexport function assertMemoryCostPackageVersionGuard(\r\n input: Parameters<typeof evaluateMemoryCostPackageVersionGuard>[0] = {},\r\n): MemoryCostPackageGuardResult {\r\n const result = evaluateMemoryCostPackageVersionGuard(input);\r\n if (!result.ok) throw new MemoryCostPackageVersionGuardError(result);\r\n return result;\r\n}\r\n\r\nexport function formatMemoryCostPackageGuardError(result: MemoryCostPackageGuardResult): string {\r\n return new MemoryCostPackageVersionGuardError(result).message;\r\n}\r\n", "import { readFile } from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { compareSemver } from \"./memory-cost-package-version-guard.js\";\r\n\r\nconst MANAGED_PACKAGES = [\r\n \"@kynver-app/runtime\",\r\n \"@kynver-app/openclaw-agent-os\",\r\n \"@kynver-app/mcp-agent-os\",\r\n] as const;\r\n\r\nexport type InstalledPackageVersionMap = Record<\r\n string,\r\n {\r\n version: string;\r\n observedAt: string;\r\n path: string;\r\n }\r\n>;\r\n\r\nfunction trim(value: string | undefined): string | null {\r\n const out = value?.trim();\r\n return out ? out : null;\r\n}\r\n\r\nfunction unique(values: Array<string | null | undefined>): string[] {\r\n return [...new Set(values.filter((value): value is string => Boolean(value)))];\r\n}\r\n\r\nfunction moduleRoots(): string[] {\r\n const home = homedir();\r\n const openClawPrefix =\r\n trim(process.env.KYNVER_OPENCLAW_NPM_ROOT) ??\r\n trim(process.env.OPENCLAW_NPM_ROOT) ??\r\n path.join(home, \".openclaw\", \"npm\");\r\n const npmGlobalRoot =\r\n trim(process.env.KYNVER_NPM_GLOBAL_ROOT) ??\r\n trim(process.env.KYNVER_NPM_GLOBAL_MODULES_ROOT) ??\r\n (trim(process.env.NPM_CONFIG_PREFIX)\r\n ? path.join(trim(process.env.NPM_CONFIG_PREFIX)!, \"lib\", \"node_modules\")\r\n : path.join(home, \".npm-global\", \"lib\", \"node_modules\"));\r\n\r\n return unique([\r\n path.join(openClawPrefix, \"lib\", \"node_modules\"),\r\n path.join(openClawPrefix, \"node_modules\"),\r\n npmGlobalRoot.endsWith(\"node_modules\") ? npmGlobalRoot : path.join(npmGlobalRoot, \"lib\", \"node_modules\"),\r\n ]);\r\n}\r\n\r\nasync function readVersion(packageJsonPath: string): Promise<string | null> {\r\n try {\r\n const parsed = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as { version?: unknown };\r\n return typeof parsed.version === \"string\" && parsed.version.trim() ? parsed.version.trim() : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Candidate install paths for one managed package across OpenClaw + global npm roots. */\r\nexport function installedPackageJsonCandidates(packageName: string): string[] {\r\n const roots = moduleRoots();\r\n const seen = new Set<string>();\r\n const out: string[] = [];\r\n for (const root of roots) {\r\n const candidate = path.join(root, packageName, \"package.json\");\r\n if (seen.has(candidate)) continue;\r\n seen.add(candidate);\r\n out.push(candidate);\r\n }\r\n return out;\r\n}\r\n\r\nexport async function collectInstalledPackageVersions(\r\n observedAt: string = new Date().toISOString(),\r\n): Promise<InstalledPackageVersionMap> {\r\n const out: InstalledPackageVersionMap = {};\r\n for (const packageName of MANAGED_PACKAGES) {\r\n let best: { version: string; path: string } | null = null;\r\n for (const packageJsonPath of installedPackageJsonCandidates(packageName)) {\r\n const version = await readVersion(packageJsonPath);\r\n if (!version) continue;\r\n if (!best || compareSemver(version, best.version) > 0) {\r\n best = { version, path: packageJsonPath };\r\n }\r\n }\r\n if (best) {\r\n out[packageName] = { version: best.version, observedAt, path: best.path };\r\n }\r\n }\r\n return out;\r\n}\r\n", "import { collectInstalledPackageVersions } from \"./installed-package-versions.js\";\r\nimport {\r\n assertMemoryCostPackageVersionGuard,\r\n evaluateMemoryCostPackageVersionGuard,\r\n probeRepoPackageVersions,\r\n type MemoryCostManagedPackageName,\r\n type MemoryCostPackageGuardResult,\r\n} from \"./memory-cost-package-version-guard.js\";\r\nimport { PACKAGE_VERSION } from \"./package-version.js\";\r\n\r\nfunction installedVersionMap(\r\n observed: Awaited<ReturnType<typeof collectInstalledPackageVersions>>,\r\n): Partial<Record<MemoryCostManagedPackageName, { version: string; source: \"installed\"; path: string }>> {\r\n const out: Partial<\r\n Record<MemoryCostManagedPackageName, { version: string; source: \"installed\"; path: string }>\r\n > = {};\r\n for (const [packageName, row] of Object.entries(observed)) {\r\n if (!row?.version) continue;\r\n out[packageName as MemoryCostManagedPackageName] = {\r\n version: row.version,\r\n source: \"installed\",\r\n path: row.path,\r\n };\r\n }\r\n return out;\r\n}\r\n\r\nexport async function buildMemoryCostPackageGuardInput(input: {\r\n cwd?: string;\r\n repoRoot?: string;\r\n selfPackageName?: MemoryCostManagedPackageName;\r\n selfVersion?: string;\r\n} = {}): Promise<Parameters<typeof evaluateMemoryCostPackageVersionGuard>[0]> {\r\n const [installed, repo] = await Promise.all([\r\n collectInstalledPackageVersions(),\r\n Promise.resolve(probeRepoPackageVersions({ cwd: input.cwd, repoRoot: input.repoRoot })),\r\n ]);\r\n\r\n const self: Partial<Record<MemoryCostManagedPackageName, { version: string; source: \"self\" }>> = {};\r\n const runtimeSelfVersion =\r\n input.selfPackageName === \"@kynver-app/runtime\" && input.selfVersion\r\n ? input.selfVersion\r\n : PACKAGE_VERSION;\r\n self[\"@kynver-app/runtime\"] = { version: runtimeSelfVersion, source: \"self\" };\r\n if (\r\n input.selfPackageName &&\r\n input.selfVersion &&\r\n input.selfPackageName !== \"@kynver-app/runtime\"\r\n ) {\r\n self[input.selfPackageName] = { version: input.selfVersion, source: \"self\" };\r\n }\r\n\r\n return {\r\n installed: installedVersionMap(installed),\r\n repo,\r\n self,\r\n };\r\n}\r\n\r\nexport async function evaluateMemoryCostPackageGuardAtStartup(\r\n input: Parameters<typeof buildMemoryCostPackageGuardInput>[0] = {},\r\n): Promise<MemoryCostPackageGuardResult> {\r\n const guardInput = await buildMemoryCostPackageGuardInput(input);\r\n return evaluateMemoryCostPackageVersionGuard(guardInput);\r\n}\r\n\r\nexport async function enforceMemoryCostPackageGuardAtStartup(\r\n input: Parameters<typeof buildMemoryCostPackageGuardInput>[0] = {},\r\n): Promise<MemoryCostPackageGuardResult> {\r\n const guardInput = await buildMemoryCostPackageGuardInput(input);\r\n return assertMemoryCostPackageVersionGuard(guardInput);\r\n}\r\n\r\nexport function shouldEnforceMemoryCostPackageGuardCli(scope?: string, action?: string): boolean {\r\n if (!scope) return false;\r\n if (scope === \"daemon\") return true;\r\n // `start` is the consumer wrapper that ends in the daemon \u2014 same guard.\r\n if (scope === \"start\") return true;\r\n if (scope === \"worker\") return true;\r\n if (scope === \"monitor\") return true;\r\n if (scope === \"run\" && (action === \"dispatch\" || action === \"sweep\" || action === \"reconcile\" || action === \"unblock\")) {\r\n return true;\r\n }\r\n if (scope === \"cron\" && action === \"tick\") return true;\r\n return false;\r\n}\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { resolveDispatchNextLaneFilter } from \"./dispatch-lane-normalization.js\";\r\nimport { observeRunnerDiskGate } from \"./disk-gate.js\";\r\nimport { observeRunnerResourceGate } from \"./resource-gate.js\";\r\nimport { loadRun } from \"./run-store.js\";\r\nimport { runDirectory } from \"./run-store.js\";\r\nimport { enrichTaskForModelRouting } from \"./model-routing-task-enrich.js\";\r\nimport { resolveWorkerLaunch } from \"./model-routing.js\";\r\nimport { readHarnessRetryLimits } from \"./retry-limits.js\";\r\nimport { hasLiveWorkerForTask } from \"./lease-renewal.js\";\r\nimport { spawnWorkerProcess } from \"./supervisor.js\";\r\nimport { collectRunActiveHarnessWorkers } from \"./active-harness-workers.js\";\r\nimport { buildRunBoard } from \"./worker-ops.js\";\r\nimport { required, safeSlug } from \"./util.js\";\r\nimport {\r\n extractPlanOutboxFromTask,\r\n formatPlanOutboxHandoffBlock,\r\n loadOutboxById,\r\n} from \"./plan-persist/index.js\";\r\nimport { resolveHarnessRepairTargetFromTask } from \"./harness-repair-target.js\";\r\nimport { formatHarnessLeaseOwner } from \"./harness-lease-owner.js\";\r\nimport { resolveRunnerPresencePayload } from \"./runner-identity.js\";\r\nimport { releaseDispatchClaimAfterSpawnFailure } from \"./dispatch-claim-release.js\";\r\nimport { executeLandPrMerge, repoFromPrUrl } from \"./landing/land-pr.js\";\r\nimport { postLandPrHarnessCompletion } from \"./landing/land-pr-completion-post.js\";\r\nimport { formatVerifyLiveCompletionContract } from \"./verify-live/verify-live-prompt.js\";\r\nimport type {\r\n ContextEnvelopeEvidenceSnapshot,\r\n HarnessMemoryQualityCaptureSnapshot,\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n PersonaContextEvidenceSnapshot,\r\n} from \"./status.js\";\r\n\r\nexport const DEFAULT_DISPATCH_LEASE_MS = 60 * 60 * 1000;\r\n\r\ninterface DispatchAdmissionExhaustionShape {\r\n capacityIdle?: boolean;\r\n summary?: string;\r\n skipReasonCounts?: Partial<Record<string, number>>;\r\n overAttemptIdleRecovery?: {\r\n attempted?: boolean;\r\n minted?: number;\r\n started?: number;\r\n } | null;\r\n}\r\n\r\ninterface OverAttemptIdleRecoveryShape {\r\n attempted?: boolean;\r\n minted?: number;\r\n started?: number;\r\n}\r\n\r\ninterface DispatchSkipDrainShape {\r\n scanned?: number;\r\n advanced?: number;\r\n blocked?: number;\r\n skipped?: number;\r\n landingSweepAdvanced?: number;\r\n staleBookkeepingClosed?: number;\r\n adaptersRouted?: number;\r\n}\r\n\r\nfunction readAdmissionExhaustion(\r\n result: Record<string, unknown>,\r\n): DispatchAdmissionExhaustionShape | null {\r\n const raw = result.admissionExhaustion;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n return raw as DispatchAdmissionExhaustionShape;\r\n}\r\n\r\nfunction readDispatchSkipDrain(result: Record<string, unknown>): DispatchSkipDrainShape | null {\r\n const raw = result.dispatchSkipDrain;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n return raw as DispatchSkipDrainShape;\r\n}\r\n\r\nexport interface HarnessWorkerDispatchContext {\r\n instructionPolicyMarkdown: string | null;\r\n instructionPolicyFingerprint: string | null;\r\n instructionPolicyEvidence: InstructionPolicyEvidenceSnapshot | null;\r\n memoryQualityCapture: HarnessMemoryQualityCaptureSnapshot | null;\r\n memoryQualityPromptMarkdown: string | null;\r\n personaMarkdown: string | null;\r\n personaSlug: string | null;\r\n personaEvidence: PersonaContextEvidenceSnapshot | null;\r\n personaInjectionReady: boolean;\r\n contextEnvelopeMarkdown: string | null;\r\n contextEnvelopeEvidence: ContextEnvelopeEvidenceSnapshot | null;\r\n contextEnvelopeReady: boolean;\r\n}\r\n\r\nexport function readHarnessWorkerContext(\r\n decision: Record<string, unknown>,\r\n): HarnessWorkerDispatchContext | null {\r\n const raw = decision.harnessWorkerContext;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const ctx = raw as Record<string, unknown>;\r\n const markdown =\r\n typeof ctx.instructionPolicyMarkdown === \"string\" ? ctx.instructionPolicyMarkdown : null;\r\n const fingerprint =\r\n typeof ctx.instructionPolicyFingerprint === \"string\"\r\n ? ctx.instructionPolicyFingerprint\r\n : null;\r\n const evidence =\r\n ctx.instructionPolicyEvidence && typeof ctx.instructionPolicyEvidence === \"object\"\r\n ? (ctx.instructionPolicyEvidence as InstructionPolicyEvidenceSnapshot)\r\n : null;\r\n const personaMarkdown =\r\n typeof ctx.personaMarkdown === \"string\" ? ctx.personaMarkdown : null;\r\n const personaSlug =\r\n typeof ctx.personaEvidence === \"object\" &&\r\n ctx.personaEvidence &&\r\n typeof (ctx.personaEvidence as PersonaContextEvidenceSnapshot).injectedPersonaSlug === \"string\"\r\n ? (ctx.personaEvidence as PersonaContextEvidenceSnapshot).injectedPersonaSlug!\r\n : null;\r\n const personaEvidence =\r\n ctx.personaEvidence && typeof ctx.personaEvidence === \"object\"\r\n ? (ctx.personaEvidence as PersonaContextEvidenceSnapshot)\r\n : null;\r\n const personaInjectionReady = ctx.personaInjectionReady === true;\r\n const contextEnvelopeMarkdown =\r\n typeof ctx.contextEnvelopeMarkdown === \"string\" ? ctx.contextEnvelopeMarkdown : null;\r\n const contextEnvelopeEvidence =\r\n ctx.contextEnvelopeEvidence && typeof ctx.contextEnvelopeEvidence === \"object\"\r\n ? (ctx.contextEnvelopeEvidence as ContextEnvelopeEvidenceSnapshot)\r\n : null;\r\n const contextEnvelopeReady = ctx.contextEnvelopeReady === true;\r\n const memoryQualityCapture =\r\n ctx.memoryQualityCapture && typeof ctx.memoryQualityCapture === \"object\"\r\n ? (ctx.memoryQualityCapture as HarnessMemoryQualityCaptureSnapshot)\r\n : null;\r\n const memoryQualityPromptMarkdown =\r\n typeof ctx.memoryQualityPromptMarkdown === \"string\"\r\n ? ctx.memoryQualityPromptMarkdown\r\n : typeof memoryQualityCapture?.promptMarkdown === \"string\"\r\n ? memoryQualityCapture.promptMarkdown\r\n : null;\r\n return {\r\n instructionPolicyMarkdown: markdown,\r\n instructionPolicyFingerprint: fingerprint,\r\n instructionPolicyEvidence: evidence,\r\n memoryQualityCapture,\r\n memoryQualityPromptMarkdown,\r\n personaMarkdown,\r\n personaSlug,\r\n personaEvidence,\r\n personaInjectionReady,\r\n contextEnvelopeMarkdown,\r\n contextEnvelopeEvidence,\r\n contextEnvelopeReady,\r\n };\r\n}\r\n\r\nfunction normalizePersonaSlug(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim().toLowerCase();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nexport function buildDispatchTaskText(task: Record<string, unknown>, agentOsId: string): string {\r\n const lines = [\r\n `[AgentOS task ${task.id}] ${task.title}`,\r\n \"\",\r\n task.description ? String(task.description) : \"(no description on the board task)\",\r\n \"\",\r\n `Board linkage: agentOsId=${agentOsId}, taskId=${task.id}, attempt=${task.attempt}, executor=${task.executor}${\r\n task.executorRef ? `, executorRef=${task.executorRef}` : \"\"\r\n }.`,\r\n \"This worker was dispatched from the AgentOS board. The harness reports your completion back to the board when you finish.\",\r\n ];\r\n\r\n if (task.executor === \"verify_live\") {\r\n lines.push(\"\", formatVerifyLiveCompletionContract());\r\n }\r\n\r\n const outboxRef = extractPlanOutboxFromTask(task);\r\n if (outboxRef?.outboxId) {\r\n const item = loadOutboxById(outboxRef.outboxId);\r\n if (item) {\r\n lines.push(\"\", formatPlanOutboxHandoffBlock(item));\r\n } else {\r\n lines.push(\r\n \"\",\r\n `## Plan persistence risk`,\r\n \"\",\r\n `Unconfirmed AgentOS plan write (outboxId=${outboxRef.outboxId}).`,\r\n );\r\n }\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction requestedTargetTaskIds(args: Record<string, string | boolean>): Set<string> {\r\n const out = new Set<string>();\r\n if (args.targetTaskId) {\r\n out.add(String(args.targetTaskId));\r\n return out;\r\n }\r\n if (args.targetTaskIds) {\r\n for (const value of String(args.targetTaskIds).split(\",\")) {\r\n const trimmed = value.trim();\r\n if (trimmed) out.add(trimmed);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nexport async function dispatchRun(args: Record<string, string | boolean>): Promise<Record<string, unknown> | void> {\r\n const pipeline = args.pipeline === true || args.pipeline === \"true\";\r\n try {\r\n const run = loadRun(String(required(String(args.run || \"\"), \"--run\")));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const dryRun = !execute;\r\n const runnerPresence = resolveRunnerPresencePayload({ runId: run.id });\r\n const leaseOwner = formatHarnessLeaseOwner(run.id, runnerPresence.runnerId);\r\n\r\n const runnerDiskGate = args.diskPath\r\n ? observeRunnerDiskGate({ diskPath: String(args.diskPath) })\r\n : observeRunnerDiskGate({ diskPath: run.repo });\r\n const runnerResourceGate = observeRunnerResourceGate({ runId: run.id });\r\n const exactTargetIds = requestedTargetTaskIds(args);\r\n const exactTargetMode = exactTargetIds.size > 0;\r\n const requestedStarts = Number(args.maxStarts) > 0 ? Math.floor(Number(args.maxStarts)) : 1;\r\n const effectiveRequestedStarts = exactTargetMode ? Math.min(requestedStarts, exactTargetIds.size) : requestedStarts;\r\n const cappedStarts = dryRun\r\n ? effectiveRequestedStarts\r\n : Math.min(effectiveRequestedStarts, runnerResourceGate.slotsAvailable);\r\n\r\n if (!dryRun && cappedStarts <= 0) {\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: false,\r\n skipped: true,\r\n reason: runnerResourceGate.reason ?? \"no resource slots\",\r\n resourceGate: runnerResourceGate,\r\n };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n return;\r\n }\r\n\r\n const activeHarnessWorkers = collectRunActiveHarnessWorkers(run.id);\r\n\r\n // When --reconcile-stale-blockers is set, trigger server-side board reconciliation\r\n // before dispatch. This auto-clears stale runner-callback blockers left over from a\r\n // daemon restart (post-package-reload or crash), so the subsequent dispatch-next\r\n // finds tasks that would otherwise stay permanently blocked.\r\n if (args.reconcileStaleBlockers === true || args.reconcileStaleBlockers === \"true\") {\r\n const laneHygieneUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/lane-hygiene`;\r\n try {\r\n await postJsonWithCredentialRefresh(\r\n laneHygieneUrl,\r\n secret,\r\n { agentOsId, dryRun: false, includeBoardReconcile: true },\r\n { agentOsId, baseUrl: base },\r\n );\r\n } catch (err) {\r\n console.error(`[dispatch] reconcile-stale-blockers lane-hygiene call failed: ${(err as Error).message}`);\r\n }\r\n }\r\n\r\n const dispatchUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/dispatch-next`;\r\n const buildBody = (maxStarts: number): Record<string, unknown> => ({\r\n agentOsId,\r\n dryRun,\r\n maxStarts,\r\n leaseOwner,\r\n leaseDurationMs:\r\n Number(args.leaseMs) > 0 ? Math.floor(Number(args.leaseMs)) : DEFAULT_DISPATCH_LEASE_MS,\r\n runnerDiskGate,\r\n runnerResourceGate,\r\n activeHarnessWorkers,\r\n runnerPresence,\r\n harnessBoardSnapshot: buildRunBoard(run.id),\r\n ...(args.lane ? { lane: resolveDispatchNextLaneFilter(String(args.lane)) } : {}),\r\n ...(args.executor ? { executor: String(args.executor) } : {}),\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n ...(args.targetTaskId ? { targetTaskId: String(args.targetTaskId) } : {}),\r\n ...(!args.targetTaskId && args.targetTaskIds\r\n ? {\r\n targetTaskIds: String(args.targetTaskIds)\r\n .split(\",\")\r\n .map((s) => s.trim())\r\n .filter(Boolean),\r\n }\r\n : {}),\r\n });\r\n\r\n const requestDispatch = async (maxStarts: number) => {\r\n const dispatch =\r\n (await postJsonWithCredentialRefresh(dispatchUrl, secret, buildBody(maxStarts), {\r\n agentOsId,\r\n baseUrl: base,\r\n })) ?? { ok: false, status: 0, response: null };\r\n const responseBody = dispatch.response as { ok?: boolean; result?: Record<string, unknown> } | null;\r\n return { dispatch, result: responseBody?.result };\r\n };\r\n\r\n const first = await requestDispatch(exactTargetMode || dryRun ? cappedStarts : 1);\r\n if (!first.dispatch.ok || !first.result) {\r\n const failure = {\r\n runId: run.id,\r\n agentOsId,\r\n action: \"dispatch\",\r\n httpStatus: first.dispatch.status,\r\n response: first.dispatch.response,\r\n authRefreshed: first.dispatch.refreshedAuth === true,\r\n authRefreshFailure: first.dispatch.authRefreshFailure,\r\n };\r\n if (pipeline) return { ok: false, ...failure };\r\n console.log(JSON.stringify(failure, null, 2));\r\n process.exit(1);\r\n }\r\n\r\n const result = first.result;\r\n if (dryRun) {\r\n const admissionExhaustion = readAdmissionExhaustion(result);\r\n const dispatchSkipDrain = readDispatchSkipDrain(result);\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: true,\r\n wouldStart: (result.started as Array<{ task: Record<string, unknown>; reason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n title: d.task.title,\r\n reason: d.reason,\r\n })),\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string; reason: string }>).map(\r\n (d) => ({ taskId: d.task.id, skipReason: d.skipReason, reason: d.reason }),\r\n ),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n inspected: result.inspected,\r\n pagesScanned: result.pagesScanned ?? null,\r\n candidatesExhausted: result.candidatesExhausted ?? null,\r\n capacityIdle: admissionExhaustion?.capacityIdle === true,\r\n admissionExhaustion,\r\n dispatchSkipDrain,\r\n };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n return;\r\n }\r\n\r\n const retryLimits = readHarnessRetryLimits();\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n const skipped: Array<{\r\n task: Record<string, unknown>;\r\n skipReason: string;\r\n reason?: string;\r\n }> = [];\r\n let inspected = Number(result.inspected) || 0;\r\n\r\n async function abortClaimedSpawn(\r\n task: Record<string, unknown>,\r\n error: string,\r\n extra?: Record<string, unknown>,\r\n ): Promise<boolean> {\r\n const release = await releaseDispatchClaimAfterSpawnFailure({\r\n baseUrl: base,\r\n secret,\r\n agentOsId,\r\n taskId: String(task.id),\r\n leaseOwner,\r\n failureDetail: error,\r\n });\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error,\r\n released: release.released,\r\n releaseResponse: release.releaseResponse,\r\n ...extra,\r\n });\r\n return false;\r\n }\r\n\r\n function isLandPrDecision(decision: Record<string, unknown>): boolean {\r\n if (decision.landPrDispatch === true) return true;\r\n const task = decision.task as Record<string, unknown> | undefined;\r\n return task?.executor === \"land_pr\";\r\n }\r\n\r\n async function runLandPrClaimed(decision: Record<string, unknown>): Promise<boolean> {\r\n const task = decision.task as Record<string, unknown>;\r\n const taskId = String(task.id);\r\n // Same exact-target guard as spawnClaimed \u2014 and more critical here: a\r\n // merge to main is irreversible, so an operator dispatch targeting one\r\n // task must never land a different claimed land_pr row.\r\n if (exactTargetMode && !exactTargetIds.has(taskId)) {\r\n return abortClaimedSpawn(\r\n task,\r\n \"exact_target_mismatch: dispatch-next returned a different task than requested\",\r\n {\r\n requestedTargetTaskIds: [...exactTargetIds],\r\n },\r\n );\r\n }\r\n const prUrl = task.prUrl ? String(task.prUrl) : \"\";\r\n if (!prUrl) {\r\n return abortClaimedSpawn(task, \"land_pr task missing prUrl\");\r\n }\r\n try {\r\n const report = await executeLandPrMerge({\r\n prUrl,\r\n repo: repoFromPrUrl(prUrl),\r\n cwd: run.repo,\r\n });\r\n const post = await postLandPrHarnessCompletion({\r\n baseUrl: base,\r\n secret,\r\n agentOsId,\r\n runId: run.id,\r\n task,\r\n report,\r\n });\r\n if (!post.ok) {\r\n // One outcome per task: the abort path records the failure (a re-claim\r\n // on an already-merged PR is safe \u2014 landing handles merged state).\r\n return abortClaimedSpawn(\r\n task,\r\n `land_pr completion POST failed (HTTP ${post.status})`,\r\n { landPr: true, outcome: report.outcome },\r\n );\r\n }\r\n outcomes.push({\r\n taskId,\r\n started: true,\r\n landPr: true,\r\n outcome: report.outcome,\r\n completionStatus: post.status,\r\n });\r\n return true;\r\n } catch (error) {\r\n return abortClaimedSpawn(task, (error as Error).message);\r\n }\r\n }\r\n\r\n async function releaseDuplicateLocalClaim(task: Record<string, unknown>): Promise<boolean> {\r\n const error = \"duplicate_dispatch_prevented: live local worker already owns this task\";\r\n const release = await releaseDispatchClaimAfterSpawnFailure({\r\n baseUrl: base,\r\n secret,\r\n agentOsId,\r\n taskId: String(task.id),\r\n leaseOwner,\r\n failureDetail: error,\r\n });\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error,\r\n alreadyRunning: true,\r\n nonFatal: true,\r\n released: release.released,\r\n releaseResponse: release.releaseResponse,\r\n });\r\n return false;\r\n }\r\n\r\n async function spawnClaimed(decision: Record<string, unknown>): Promise<boolean> {\r\n const task = decision.task as Record<string, unknown>;\r\n const harnessContext = readHarnessWorkerContext(decision);\r\n const taskId = String(task.id);\r\n if (exactTargetMode && !exactTargetIds.has(taskId)) {\r\n return abortClaimedSpawn(\r\n task,\r\n \"exact_target_mismatch: dispatch-next returned a different task than requested\",\r\n {\r\n requestedTargetTaskIds: [...exactTargetIds],\r\n },\r\n );\r\n }\r\n const expectedPersona = normalizePersonaSlug(task.personaSlug);\r\n if (expectedPersona && (!harnessContext?.personaInjectionReady || !harnessContext.personaMarkdown)) {\r\n return abortClaimedSpawn(\r\n task,\r\n `persona_injection_required: missing anchored context-envelope persona block for \"${expectedPersona}\"`,\r\n );\r\n }\r\n if (hasLiveWorkerForTask(run.id, taskId)) {\r\n return releaseDuplicateLocalClaim(task);\r\n }\r\n const attempt = Number(task.attempt) || 1;\r\n if (attempt > retryLimits.maxTaskAttempts) {\r\n return abortClaimedSpawn(\r\n task,\r\n `task attempt ${attempt} exceeds KYNVER_MAX_TASK_ATTEMPTS (${retryLimits.maxTaskAttempts})`,\r\n );\r\n }\r\n const name = safeSlug(`t-${task.id}-a${task.attempt}`);\r\n const routing = resolveWorkerLaunch({\r\n explicitModel: args.model ? String(args.model) : undefined,\r\n explicitProvider: args.provider ? String(args.provider) : undefined,\r\n explicitProviderIsOperatorOverride: Boolean(args.provider),\r\n task: enrichTaskForModelRouting(task),\r\n });\r\n try {\r\n const planId = task.planId ? String(task.planId) : undefined;\r\n const repairTarget = resolveHarnessRepairTargetFromTask({\r\n title: task.title ? String(task.title) : undefined,\r\n description: task.description ? String(task.description) : null,\r\n executorRef: task.executorRef ? String(task.executorRef) : null,\r\n prUrl: task.prUrl ? String(task.prUrl) : null,\r\n branch: task.branch ? String(task.branch) : null,\r\n });\r\n const worker = spawnWorkerProcess(run, {\r\n name,\r\n task: buildDispatchTaskText(task, agentOsId),\r\n ownedPaths: args.owned ? String(args.owned).split(\",\").map((s) => s.trim()).filter(Boolean) : [],\r\n model: routing.model,\r\n provider: routing.provider,\r\n routingRule: routing.rule,\r\n requestedModel: routing.requestedModel,\r\n agentOsId,\r\n taskId: String(task.id),\r\n planId,\r\n branch: repairTarget?.targetPrBranch ?? undefined,\r\n executorRef: task.executorRef ? String(task.executorRef) : undefined,\r\n parentTaskId: task.parentTaskId ? String(task.parentTaskId) : undefined,\r\n taskTitle: task.title ? String(task.title) : undefined,\r\n taskPrUrl: repairTarget?.targetPrUrl ?? (task.prUrl ? String(task.prUrl) : undefined),\r\n repairTargetPrUrl: repairTarget?.targetPrUrl,\r\n repairTargetBranch: repairTarget?.targetPrBranch ?? undefined,\r\n instructionPolicyMarkdown: harnessContext?.instructionPolicyMarkdown ?? null,\r\n instructionPolicyFingerprint: harnessContext?.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: harnessContext?.instructionPolicyEvidence ?? null,\r\n memoryQualityCapture: harnessContext?.memoryQualityCapture ?? null,\r\n memoryQualityPromptMarkdown: harnessContext?.memoryQualityPromptMarkdown ?? null,\r\n personaMarkdown: harnessContext?.personaMarkdown ?? null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaEvidence: harnessContext?.personaEvidence ?? null,\r\n contextEnvelopeMarkdown: harnessContext?.contextEnvelopeMarkdown ?? null,\r\n contextEnvelopeEvidence: harnessContext?.contextEnvelopeEvidence ?? null,\r\n leaseOwner,\r\n leaseToken: task.leaseToken ? String(task.leaseToken) : undefined,\r\n dispatched: true,\r\n });\r\n outcomes.push({\r\n taskId: task.id,\r\n started: true,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n branch: worker.branch,\r\n model: worker.model,\r\n provider: routing.provider,\r\n routingRule: routing.rule,\r\n instructionPolicyFingerprint: harnessContext?.instructionPolicyFingerprint ?? null,\r\n instructionPolicyRuleCount: Array.isArray(harnessContext?.instructionPolicyEvidence?.ruleSlugs)\r\n ? (harnessContext.instructionPolicyEvidence.ruleSlugs as string[]).length\r\n : null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaOperatingRuleCount: harnessContext?.personaEvidence?.operatingRuleCount ?? null,\r\n });\r\n if (harnessContext?.instructionPolicyFingerprint) {\r\n console.error(\r\n `[dispatch] task ${taskId}: Lane A instruction policy injected fingerprint=${harnessContext.instructionPolicyFingerprint}`,\r\n );\r\n }\r\n if (harnessContext?.personaSlug) {\r\n console.error(\r\n `[dispatch] task ${taskId}: persona context injected slug=${harnessContext.personaSlug}`,\r\n );\r\n }\r\n if (harnessContext?.contextEnvelopeReady) {\r\n console.error(\r\n `[dispatch] task ${taskId}: context envelope injected anchor=${harnessContext.contextEnvelopeEvidence?.anchorTaskId ?? taskId}`,\r\n );\r\n }\r\n return true;\r\n } catch (error) {\r\n return abortClaimedSpawn(task, (error as Error).message);\r\n }\r\n }\r\n\r\n // One failed start must NOT end the tick: the server orders candidates\r\n // priority-desc/age-asc, so a single wedged row (conflicting land_pr,\r\n // duplicate claim, spawn hiccup) at the head of the queue used to abort\r\n // dispatch for the whole tick \u2014 0/8 workers with a full board of clean\r\n // work behind it. Failures are recorded per task; the loop keeps consuming\r\n // slots, bounded by cappedStarts (every attempt pushes an outcome). The\r\n // attempted-set guard stops intra-tick claim/release ping-pong on a row\r\n // the server keeps re-offering.\r\n const failedStartTaskIds = new Set<string>();\r\n async function admitClaimedDecision(decision: Record<string, unknown>): Promise<boolean> {\r\n const task = decision.task as Record<string, unknown>;\r\n const taskId = String(task.id);\r\n // Failure-only guard: a re-offered SUCCESSFUL start is the duplicate-claim\r\n // case and must reach hasLiveWorkerForTask (nonFatal release) \u2014 only a row\r\n // that already failed this tick short-circuits here.\r\n if (failedStartTaskIds.has(taskId)) {\r\n return abortClaimedSpawn(\r\n task,\r\n \"dispatch_retry_loop_prevented: task already failed to start this tick\",\r\n );\r\n }\r\n const admitted = isLandPrDecision(decision)\r\n ? await runLandPrClaimed(decision)\r\n : await spawnClaimed(decision);\r\n if (!admitted) failedStartTaskIds.add(taskId);\r\n return admitted;\r\n }\r\n\r\n for (const decision of result.started as Array<Record<string, unknown>>) {\r\n await admitClaimedDecision(decision);\r\n }\r\n skipped.push(\r\n ...((result.skipped as Array<{\r\n task: Record<string, unknown>;\r\n skipReason: string;\r\n reason?: string;\r\n }>) ?? []),\r\n );\r\n\r\n if (exactTargetMode) {\r\n for (const skipDecision of skipped) {\r\n const taskId = String(skipDecision.task.id);\r\n if (!exactTargetIds.has(taskId)) continue;\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: `exact_target_not_started:${skipDecision.skipReason}`,\r\n skipReason: skipDecision.skipReason,\r\n detail: skipDecision.reason ?? null,\r\n requestedTargetTaskIds: [...exactTargetIds],\r\n });\r\n }\r\n }\r\n\r\n // Dispatch-next claims tasks before this local process creates worker\r\n // processes. Claiming a batch can strand many board rows as `running` if\r\n // local spawn hangs or the dispatcher is killed mid-loop. Admit one task,\r\n // spawn/release it, then ask for the next slot. Failed starts consume an\r\n // attempt (outcomes.length) but never stop the loop \u2014 the released row\r\n // gets a server-side scheduledFor backoff, so the next request reaches\r\n // fresh candidates instead of the same wedged head-of-queue row.\r\n while (!exactTargetMode && outcomes.length < cappedStarts) {\r\n const next = await requestDispatch(1);\r\n if (!next.dispatch.ok || !next.result) {\r\n outcomes.push({\r\n started: false,\r\n error: \"dispatch_next request failed during top-up\",\r\n httpStatus: next.dispatch.status,\r\n response: next.dispatch.response,\r\n });\r\n break;\r\n }\r\n inspected += Number(next.result.inspected) || 0;\r\n skipped.push(...((next.result.skipped as Array<{ task: Record<string, unknown>; skipReason: string }>) ?? []));\r\n const started = (next.result.started as Array<Record<string, unknown>>) ?? [];\r\n if (started.length === 0) break;\r\n for (const decision of started) {\r\n if (outcomes.length >= cappedStarts) break;\r\n await admitClaimedDecision(decision);\r\n }\r\n }\r\n\r\n const startedCount = outcomes.filter((o) => o.started).length;\r\n const admissionExhaustion = readAdmissionExhaustion(result);\r\n const dispatchSkipDrain = readDispatchSkipDrain(result);\r\n const capacityIdle =\r\n startedCount === 0 &&\r\n (admissionExhaustion?.capacityIdle === true ||\r\n Number((result.resourceGate as { slotsAvailable?: number })?.slotsAvailable) > 0);\r\n\r\n if (capacityIdle && admissionExhaustion?.summary) {\r\n const retryCeiling =\r\n admissionExhaustion.skipReasonCounts?.retry_ceiling_exceeded ?? 0;\r\n const recovery =\r\n (result.overAttemptIdleRecovery as OverAttemptIdleRecoveryShape | undefined) ??\r\n admissionExhaustion.overAttemptIdleRecovery;\r\n const recoveryNote =\r\n recovery?.attempted === true\r\n ? `; over_attempt_recovery minted=${recovery.minted ?? 0} started=${recovery.started ?? 0}`\r\n : retryCeiling > 0\r\n ? \"; over_attempt_recovery not attempted\"\r\n : \"\";\r\n const drainNote = dispatchSkipDrain\r\n ? `; dispatch_skip_drain scanned=${dispatchSkipDrain.scanned ?? 0} advanced=${dispatchSkipDrain.advanced ?? 0}`\r\n : \"\";\r\n console.error(\r\n `[dispatch] ${admissionExhaustion.summary}${retryCeiling > 0 ? `; retry_ceiling_exceeded=${retryCeiling}` : \"\"}${recoveryNote}${drainNote}`,\r\n );\r\n }\r\n\r\n const summary = {\r\n runId: run.id,\r\n agentOsId,\r\n dryRun: false,\r\n leaseOwner,\r\n startedCount,\r\n capacityIdle,\r\n admissionExhaustion,\r\n dispatchSkipDrain,\r\n outcomes,\r\n skipped: skipped.map((d) => ({\r\n taskId: d.task.id,\r\n skipReason: d.skipReason,\r\n })),\r\n inspected,\r\n pagesScanned: result.pagesScanned ?? null,\r\n candidatesExhausted: result.candidatesExhausted ?? null,\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n };\r\n const fatalOutcome = (outcome: Record<string, unknown>) => !outcome.started && outcome.nonFatal !== true;\r\n if (pipeline) {\r\n return { ok: !outcomes.some(fatalOutcome), ...summary };\r\n }\r\n console.log(JSON.stringify(summary, null, 2));\r\n if (outcomes.some(fatalOutcome)) process.exit(1);\r\n } catch (error) {\r\n if (pipeline) return { ok: false, error: (error as Error).message };\r\n console.error(`run dispatch failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { runDirectory };\r\n", "/** Build callback auth headers for AgentOS by-id harness routes. */\r\nexport function buildHarnessCallbackHeaders(secret: string): Record<string, string> {\r\n const trimmed = String(secret).trim();\r\n if (trimmed.startsWith(\"krc1.\")) {\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Kynver-Runner-Token\": trimmed,\r\n };\r\n }\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n // Canonical header. We keep sending the legacy `X-OpenClaw-Cron-Secret`\r\n // (and `X-Kynver-Runtime-Secret`) so an un-upgraded Kynver server that\r\n // only reads the old header still authenticates this runner during the\r\n // rename compat window.\r\n \"X-Kynver-Cron-Secret\": trimmed,\r\n \"X-OpenClaw-Cron-Secret\": trimmed,\r\n \"X-Kynver-Runtime-Secret\": trimmed,\r\n };\r\n}\r\n", "import { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport { refreshRunnerTokenForAuthFailure } from \"./config.js\";\r\n\r\n/** WSL host disk snapshot \u2014 present only when the runner is under WSL.\r\n * The field is optional/nullable so older runners (no probe) and non-WSL\r\n * runners both serialize as `wslHost: null` for the dispatch-next server. */\r\nexport interface DispatchNextWslHostShape {\r\n ok: boolean;\r\n path: string;\r\n freeBytes: number;\r\n totalBytes: number;\r\n usedPercent: number;\r\n warnBelowBytes: number;\r\n criticalBelowBytes: number;\r\n reason: string | null;\r\n probeError: string | null;\r\n}\r\n\r\nexport interface DispatchNextDiskGateShape {\r\n ok: boolean;\r\n path: string;\r\n freeBytes: number;\r\n totalBytes: number;\r\n usedPercent: number;\r\n warnBelowBytes: number;\r\n criticalBelowBytes: number;\r\n maxUsedPercent: number;\r\n hardMaxUsedPercent: number;\r\n reason: string | null;\r\n /** Windows host disk under WSL (`/mnt/c` by default). `null` on non-WSL\r\n * hosts and when the probe was opted out via `skipWslHostCheck`. */\r\n wslHost?: DispatchNextWslHostShape | null;\r\n}\r\n\r\nexport interface DispatchNextResourceGateShape {\r\n ok: boolean;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n memReserveBytes: number;\r\n perWorkerMemBytes: number;\r\n configuredMaxWorkers: number | null;\r\n capacityWorkers: number;\r\n maxConcurrentWorkers: number;\r\n activeWorkers: number;\r\n slotsAvailable: number;\r\n reason: string | null;\r\n}\r\n\r\nexport interface PostJsonResult {\r\n ok: boolean;\r\n status: number;\r\n response: unknown;\r\n refreshedAuth?: boolean;\r\n authRefreshFailure?: string;\r\n}\r\n\r\nfunction callbackTimeoutMs(): number {\r\n const parsed = Number(process.env.KYNVER_CALLBACK_TIMEOUT_MS);\r\n if (Number.isFinite(parsed) && parsed > 0) return Math.floor(parsed);\r\n return 30_000;\r\n}\r\n\r\nasync function withTimeout<T>(fn: (signal: AbortSignal) => Promise<T>): Promise<T> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), callbackTimeoutMs());\r\n try {\r\n return await fn(controller.signal);\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nfunction callbackFetchError(error: unknown): PostJsonResult {\r\n return {\r\n ok: false,\r\n status: 0,\r\n response: {\r\n error: error instanceof Error ? error.message : String(error),\r\n timeoutMs: callbackTimeoutMs(),\r\n },\r\n };\r\n}\r\n\r\nexport async function postJson(url: string, secret: string, body: unknown): Promise<PostJsonResult> {\r\n let res: Response;\r\n try {\r\n res = await withTimeout((signal) =>\r\n fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n signal,\r\n }),\r\n );\r\n } catch (error) {\r\n return callbackFetchError(error);\r\n }\r\n let response: unknown = null;\r\n try {\r\n response = await res.json();\r\n } catch {\r\n response = null;\r\n }\r\n return { ok: res.ok, status: res.status, response };\r\n}\r\n\r\nexport async function postJsonWithCredentialRefresh(\r\n url: string,\r\n secret: string,\r\n body: unknown,\r\n opts: { agentOsId: string; baseUrl?: string },\r\n): Promise<PostJsonResult> {\r\n const first = await postJson(url, secret, body);\r\n if (first.ok || first.status !== 401) return first;\r\n\r\n const refreshed = await refreshRunnerTokenForAuthFailure(secret, opts.agentOsId, { baseUrl: opts.baseUrl });\r\n if (!refreshed.ok) return { ...first, authRefreshFailure: refreshed.reason };\r\n\r\n const retry = await postJson(url, refreshed.token, body);\r\n return { ...retry, refreshedAuth: true };\r\n}\r\n\r\nexport async function getJson(url: string, secret: string): Promise<PostJsonResult> {\r\n let res: Response;\r\n try {\r\n res = await withTimeout((signal) =>\r\n fetch(url, {\r\n method: \"GET\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n signal,\r\n }),\r\n );\r\n } catch (error) {\r\n return callbackFetchError(error);\r\n }\r\n let response: unknown = null;\r\n try {\r\n response = await res.json();\r\n } catch {\r\n response = null;\r\n }\r\n return { ok: res.ok, status: res.status, response };\r\n}\r\n", "// Canonical Command Center worker persona catalog \u2014 single source of truth for\r\n// harness dispatch lanes, default plan role lanes, and persona slug validation.\r\n// AgentOS re-exports this module; do not duplicate lane maps elsewhere.\r\n\r\nexport const WORKER_PERSONA_DISPATCH_LANES = [\r\n \"implementation\",\r\n \"review\",\r\n \"landing\",\r\n] as const;\r\n\r\nexport type WorkerPersonaDispatchLane = (typeof WORKER_PERSONA_DISPATCH_LANES)[number];\r\n\r\nexport const WORKER_PERSONA_DEFAULT_ROLE_LANES = [\r\n \"plan_author\",\r\n \"implementer\",\r\n \"report_reviewer\",\r\n \"deep_reviewer\",\r\n \"runtime_verifier\",\r\n \"system\",\r\n] as const;\r\n\r\nexport type WorkerPersonaDefaultRoleLane = (typeof WORKER_PERSONA_DEFAULT_ROLE_LANES)[number];\r\n\r\nexport interface WorkerPersonaCatalogEntry {\r\n slug: string;\r\n displayName: string;\r\n description: string;\r\n /** Harness dispatch lane reserved for this persona (null = orchestration / no dispatch). */\r\n dispatchLane: WorkerPersonaDispatchLane | null;\r\n /** Default plan progress role when enriching harness tasks. */\r\n defaultRoleLane: WorkerPersonaDefaultRoleLane;\r\n}\r\n\r\nexport const WORKER_PERSONA_CATALOG: readonly WorkerPersonaCatalogEntry[] = [\r\n {\r\n slug: \"ghost\",\r\n displayName: \"Ghost\",\r\n description: \"Orchestration \u2014 coordinates lanes, handoffs, and operator decisions.\",\r\n dispatchLane: null,\r\n defaultRoleLane: \"system\",\r\n },\r\n {\r\n slug: \"astra\",\r\n displayName: \"Astra\",\r\n description: \"Planning \u2014 plan authoring, milestones, and operational flow design.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"plan_author\",\r\n },\r\n {\r\n slug: \"rhea\",\r\n displayName: \"Rhea\",\r\n description: \"Runtime / control-plane implementation \u2014 harness, dispatch, and AgentOS plumbing.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n {\r\n slug: \"mnemo\",\r\n displayName: \"Mnemo\",\r\n description: \"Memory-quality implementation \u2014 MARM lanes, retrieval hygiene, and consolidation.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n {\r\n slug: \"sentinel\",\r\n displayName: \"Sentinel\",\r\n description: \"Security / privacy implementation and security verification gates.\",\r\n dispatchLane: \"review\",\r\n defaultRoleLane: \"deep_reviewer\",\r\n },\r\n {\r\n slug: \"pixel\",\r\n displayName: \"Pixel\",\r\n description: \"Frontend \u2014 Command Center UI, dashboards, and client surfaces.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n {\r\n slug: \"schema\",\r\n displayName: \"Schema\",\r\n description: \"Data / migrations \u2014 Prisma schema, seeds, and persistence contracts.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n {\r\n slug: \"atlas\",\r\n displayName: \"Atlas\",\r\n description: \"Infra / reliability \u2014 deploy pipelines, observability, and runtime health.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"runtime_verifier\",\r\n },\r\n {\r\n slug: \"bridge\",\r\n displayName: \"Bridge\",\r\n description: \"Integrations / MCP \u2014 tool manifests, OpenClaw bridges, and cross-service wiring.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n {\r\n slug: \"catalyst\",\r\n displayName: \"Catalyst\",\r\n description: \"Product / domain \u2014 business rules, domain packs, and feature semantics.\",\r\n dispatchLane: \"implementation\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n {\r\n slug: \"lorentz\",\r\n displayName: \"Lorentz\",\r\n description:\r\n \"Deep/adversarial review lane expert for risk, correctness, and safety gates. Run adversarial review and validation gating.\",\r\n dispatchLane: \"review\",\r\n defaultRoleLane: \"report_reviewer\",\r\n },\r\n {\r\n slug: \"dalton\",\r\n displayName: \"Dalton\",\r\n description:\r\n \"Landing-only \u2014 merge-ready handoff and final verification evidence; no implementation ownership.\",\r\n dispatchLane: \"landing\",\r\n defaultRoleLane: \"implementer\",\r\n },\r\n] as const;\r\n\r\nexport type WorkerPersonaCatalogSlug = (typeof WORKER_PERSONA_CATALOG)[number][\"slug\"];\r\n\r\nconst BY_SLUG = new Map(WORKER_PERSONA_CATALOG.map((entry) => [entry.slug, entry]));\r\n\r\nexport function getWorkerPersonaCatalogEntry(\r\n slug: string | null | undefined,\r\n): WorkerPersonaCatalogEntry | null {\r\n if (!slug) return null;\r\n const key = slug.trim().toLowerCase();\r\n return BY_SLUG.get(key) ?? null;\r\n}\r\n\r\n/** Dispatch lane reserved for a persona; null when orchestration-only or unknown. */\r\nexport function getPersonaDispatchLane(\r\n slug: string | null | undefined,\r\n): WorkerPersonaDispatchLane | null {\r\n return getWorkerPersonaCatalogEntry(slug)?.dispatchLane ?? null;\r\n}\r\n\r\nexport function getPersonaDefaultRoleLane(\r\n slug: string | null | undefined,\r\n): WorkerPersonaDefaultRoleLane | null {\r\n return getWorkerPersonaCatalogEntry(slug)?.defaultRoleLane ?? null;\r\n}\r\n\r\nexport function isKnownWorkerPersonaSlug(slug: string | null | undefined): boolean {\r\n if (!slug) return false;\r\n return BY_SLUG.has(slug.trim().toLowerCase());\r\n}\r\n\r\n/** Personas whose harness dispatch lane is `review` (derived \u2014 do not hardcode slugs). */\r\nexport function workerPersonaReviewSlugs(): readonly WorkerPersonaCatalogSlug[] {\r\n return WORKER_PERSONA_CATALOG.filter((entry) => entry.dispatchLane === \"review\").map(\r\n (entry) => entry.slug,\r\n );\r\n}\r\n\r\n/** Personas whose harness dispatch lane is `landing` (derived \u2014 do not hardcode slugs). */\r\nexport function workerPersonaLandingSlugs(): readonly WorkerPersonaCatalogSlug[] {\r\n return WORKER_PERSONA_CATALOG.filter((entry) => entry.dispatchLane === \"landing\").map(\r\n (entry) => entry.slug,\r\n );\r\n}\r\n", "/** Runtime mirror of server dispatch lane normalization (keep in sync). */\r\n\r\nimport {\r\n getPersonaDefaultRoleLane,\r\n getPersonaDispatchLane,\r\n} from \"./worker-persona-catalog.js\";\r\n\r\nexport type DispatchNextLane = \"implementation\" | \"review\" | \"landing\" | \"any\";\r\n\r\nexport type DispatchLaneTaskHints = {\r\n title?: string | null;\r\n executorRef?: string | null;\r\n personaSlug?: string | null;\r\n status?: string | null;\r\n roleLane?: string | null;\r\n};\r\n\r\nfunction trimLower(value: string | null | undefined): string {\r\n return (value ?? \"\").trim().toLowerCase();\r\n}\r\n\r\nfunction combinedText(task: DispatchLaneTaskHints): string {\r\n return `${trimLower(task.executorRef)} ${trimLower(task.title)}`;\r\n}\r\n\r\nfunction hasLandingSignals(task: DispatchLaneTaskHints): boolean {\r\n const combined = combinedText(task);\r\n const title = trimLower(task.title);\r\n return (\r\n combined.includes(\"landing\") ||\r\n title.startsWith(\"land:\") ||\r\n title.startsWith(\"land \") ||\r\n combined.includes(\" merge execution\") ||\r\n combined.includes(\"landing reconcile\")\r\n );\r\n}\r\n\r\nfunction hasImplementationSignals(task: DispatchLaneTaskHints): boolean {\r\n const combined = combinedText(task);\r\n const title = trimLower(task.title);\r\n return (\r\n combined.includes(\"implement\") ||\r\n title.startsWith(\"fix \") ||\r\n combined.includes(\" repair\") ||\r\n combined.includes(\"harness-lane:\")\r\n );\r\n}\r\n\r\nfunction hasReviewSignals(task: DispatchLaneTaskHints): boolean {\r\n const combined = combinedText(task);\r\n return (\r\n combined.includes(\"review\") ||\r\n combined.includes(\"completion report\") ||\r\n /^review[\\s:]/i.test(task.title ?? \"\")\r\n );\r\n}\r\n\r\nexport function roleLaneToDispatchLane(\r\n roleLane: string | null | undefined,\r\n): DispatchNextLane | null {\r\n switch (trimLower(roleLane)) {\r\n case \"implementer\":\r\n case \"repair_implementer\":\r\n case \"plan_author\":\r\n case \"runtime_verifier\":\r\n return \"implementation\";\r\n case \"plan_reviewer\":\r\n case \"report_reviewer\":\r\n case \"deep_reviewer\":\r\n return \"review\";\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nexport function normalizeDispatchNextLaneFilter(\r\n raw: string | null | undefined,\r\n): DispatchNextLane | undefined {\r\n const key = trimLower(raw);\r\n if (!key) return undefined;\r\n if (key === \"implementation\" || key === \"review\" || key === \"landing\" || key === \"any\") {\r\n return key;\r\n }\r\n const mapped = roleLaneToDispatchLane(key);\r\n if (mapped) return mapped;\r\n if (key === \"implement\" || key === \"repair\" || key === \"coding\") return \"implementation\";\r\n if (key === \"land\" || key === \"merge\") return \"landing\";\r\n return undefined;\r\n}\r\n\r\nexport function inferRoleLaneFromTaskHints(task: DispatchLaneTaskHints): string | null {\r\n const explicit = trimLower(task.roleLane);\r\n if (explicit) return explicit;\r\n\r\n const ref = trimLower(task.executorRef);\r\n const title = trimLower(task.title);\r\n const persona = trimLower(task.personaSlug);\r\n const combined = combinedText(task);\r\n\r\n if (combined.includes(\"deep review\") || combined.includes(\"security review\")) {\r\n return \"deep_reviewer\";\r\n }\r\n if (combined.includes(\"plan author\") || title.includes(\"strategy plan\")) {\r\n return \"plan_author\";\r\n }\r\n if (combined.includes(\"plan review\")) return \"plan_reviewer\";\r\n if (combined.includes(\"report review\") || combined.includes(\"completion report\")) {\r\n return \"report_reviewer\";\r\n }\r\n if (task.status === \"failed\") return \"repair_implementer\";\r\n if (combined.includes(\"repair\") || title.startsWith(\"fix \") || ref.includes(\"repair\")) {\r\n return \"repair_implementer\";\r\n }\r\n if (hasImplementationSignals(task)) return \"implementer\";\r\n\r\n if (persona && persona !== \"dalton\") {\r\n const personaDefault = getPersonaDefaultRoleLane(persona);\r\n if (personaDefault) return personaDefault;\r\n }\r\n\r\n if (hasReviewSignals(task)) return \"report_reviewer\";\r\n\r\n return null;\r\n}\r\n\r\nexport function inferTaskDispatchLane(task: DispatchLaneTaskHints): DispatchNextLane {\r\n if (hasLandingSignals(task)) return \"landing\";\r\n\r\n const persona = trimLower(task.personaSlug);\r\n if (persona === \"dalton\") {\r\n if (hasImplementationSignals(task) && !hasLandingSignals(task)) {\r\n return \"implementation\";\r\n }\r\n return \"landing\";\r\n }\r\n\r\n const roleLane = inferRoleLaneFromTaskHints(task);\r\n const fromRoleLane = roleLane ? roleLaneToDispatchLane(roleLane) : null;\r\n if (fromRoleLane) return fromRoleLane;\r\n\r\n const personaLane = getPersonaDispatchLane(persona);\r\n if (personaLane) return personaLane;\r\n\r\n if (hasReviewSignals(task)) return \"review\";\r\n\r\n return \"implementation\";\r\n}\r\n\r\nexport function resolveDispatchNextLaneFilter(\r\n raw: string | null | undefined,\r\n): DispatchNextLane {\r\n return normalizeDispatchNextLaneFilter(raw) ?? \"any\";\r\n}\r\n", "/** Enrich dispatch task metadata with `roleLane` when the board row omits it. */\r\n\r\nimport { getPersonaDefaultRoleLane } from \"./worker-persona-catalog.js\";\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nfunction normalize(value: string): string {\r\n return value.toLowerCase();\r\n}\r\n\r\n/**\r\n * Best-effort plan role lane from persona, title, and executorRef.\r\n * Returns undefined when nothing confident matches.\r\n */\r\nexport function inferRoleLaneFromTask(task: Record<string, unknown>): string | undefined {\r\n const existing = taskString(task, \"roleLane\");\r\n if (existing) return existing;\r\n\r\n const ref = normalize(taskString(task, \"executorRef\"));\r\n const title = normalize(taskString(task, \"title\"));\r\n const persona = normalize(taskString(task, \"personaSlug\"));\r\n const combined = `${ref} ${title}`;\r\n\r\n if (combined.includes(\"deep review\") || combined.includes(\"security review\") || ref.includes(\"deep-reviewer\")) {\r\n return \"deep_reviewer\";\r\n }\r\n if (combined.includes(\"plan author\") || combined.includes(\"plan-author\") || title.includes(\"strategy plan\")) {\r\n return \"plan_author\";\r\n }\r\n if (combined.includes(\"plan review\") || ref.includes(\"plan-reviewer\")) {\r\n return \"plan_reviewer\";\r\n }\r\n if (combined.includes(\"report review\") || combined.includes(\"completion report\")) {\r\n return \"report_reviewer\";\r\n }\r\n if (combined.includes(\"repair\") || title.startsWith(\"fix \") || ref.includes(\"repair\")) {\r\n return \"repair_implementer\";\r\n }\r\n if (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\r\n ref.includes(\"composer\") ||\r\n title.includes(\"implement\") ||\r\n title.includes(\"land:\")\r\n ) {\r\n return \"implementer\";\r\n }\r\n\r\n const personaDefaultRoleLane = getPersonaDefaultRoleLane(persona);\r\n if (personaDefaultRoleLane) {\r\n if (persona === \"lorentz\" && (combined.includes(\"deep\") || combined.includes(\"security\"))) {\r\n return \"deep_reviewer\";\r\n }\r\n return personaDefaultRoleLane;\r\n }\r\n\r\n if (combined.includes(\"review\")) return \"report_reviewer\";\r\n\r\n return undefined;\r\n}\r\n\r\n/** Attach inferred `roleLane` so `inferModelRoutingFromTask` can use plan-lane rules. */\r\nexport function enrichTaskForModelRouting(task: Record<string, unknown>): Record<string, unknown> {\r\n const roleLane = inferRoleLaneFromTask(task);\r\n if (!roleLane) return task;\r\n return { ...task, roleLane };\r\n}\r\n", "import { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { resolveOrchestrationRouting } from \"./orchestration-providers/routing.js\";\r\nimport type { OrchestrationRoutingAudit } from \"./orchestration-providers/types.js\";\r\nimport { CLAUDE_DEFAULT_MODEL } from \"./providers/claude.js\";\r\nimport { CODEX_DEFAULT_MODEL } from \"./providers/codex.js\";\r\nimport { enforceCursorWorkerProvider, isClaudeFamilyProvider, taskAllowsClaudeWorker } from \"./worker-provider-policy.js\";\r\n\r\n/** Conservative default \u2014 Sonnet for ordinary harness work (not Opus). */\r\nexport const GLOBAL_DEFAULT_MODEL = \"claude-sonnet-4-6\";\r\nexport const CURSOR_DEFAULT_MODEL = \"composer-2.5\";\r\n\r\nexport interface ModelRoutingDecision {\r\n /** Model id passed to the provider CLI (undefined \u2192 provider default). */\r\n model?: string;\r\n /** Worker provider key (`claude` | `cursor` | `codex`). */\r\n provider: string;\r\n /** Audit trail for Command Center / worker.json. */\r\n rule: string;\r\n /** Original task/board model request when inferred from metadata. */\r\n requestedModel?: string;\r\n /** Provider/auth/cost audit for orchestration routing (no secrets). */\r\n orchestrationAudit?: OrchestrationRoutingAudit;\r\n}\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nfunction normalizeRef(ref: string): string {\r\n return ref.toLowerCase();\r\n}\r\n\r\n/** Resolve global default: config \u2192 env \u2192 Sonnet. */\r\nexport function resolveGlobalDefaultModel(config: KynverUserConfig = loadUserConfig()): string {\r\n const fromConfig = config.defaultModel?.trim();\r\n if (fromConfig) return fromConfig;\r\n const fromEnv = process.env.KYNVER_DEFAULT_MODEL?.trim();\r\n if (fromEnv) return fromEnv;\r\n return GLOBAL_DEFAULT_MODEL;\r\n}\r\n\r\nfunction inferProviderFromModel(model: string | undefined): string {\r\n const m = (model ?? \"\").toLowerCase();\r\n if (!m) return \"cursor\";\r\n if (\r\n m.includes(\"composer\") ||\r\n m.includes(\"cursor\") ||\r\n m.includes(\"codex\") ||\r\n m.startsWith(\"gpt-\") ||\r\n m.startsWith(\"gpt5\")\r\n ) {\r\n return \"cursor\";\r\n }\r\n if (/^claude[-_]/i.test(m) || /^(?:opus|sonnet|haiku)\\b/i.test(m)) {\r\n return \"claude\";\r\n }\r\n return \"cursor\";\r\n}\r\n\r\nfunction normalizeProviderAliasModel(model: string, explicitProvider: string | undefined): ModelRoutingDecision | null {\r\n const alias = model.trim().toLowerCase();\r\n const provider = explicitProvider?.trim();\r\n if (alias === \"cursor\") {\r\n return {\r\n model: CURSOR_DEFAULT_MODEL,\r\n provider: \"cursor\",\r\n rule:\r\n provider && provider !== \"cursor\"\r\n ? \"explicit:model_provider_alias_overrode_provider\"\r\n : \"explicit:model_provider_alias\",\r\n requestedModel: model,\r\n };\r\n }\r\n if (alias === \"claude\" || alias === \"anthropic\") {\r\n return {\r\n model: CLAUDE_DEFAULT_MODEL,\r\n provider: \"claude\",\r\n rule:\r\n provider && provider !== \"claude\"\r\n ? \"explicit:model_provider_alias_overrode_provider\"\r\n : \"explicit:model_provider_alias\",\r\n requestedModel: model,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction isOpusLane(ref: string, title: string): boolean {\r\n if (ref.includes(\"deep\") && ref.includes(\"review\")) return true;\r\n if (ref.includes(\"security\")) return true;\r\n if (ref.includes(\"plan_author\") || ref.includes(\"plan-author\")) return true;\r\n if (title.includes(\"deep review\") || title.includes(\"security review\")) return true;\r\n if (ref.includes(\"plan\") && !ref.includes(\"review\") && (ref.includes(\"author\") || ref.includes(\"strategy\"))) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Infer model + provider from AgentOS task metadata when the dispatcher did not\r\n * pass an explicit `--model`. Explicit CLI/model args always win.\r\n */\r\nexport function inferModelRoutingFromTask(task: Record<string, unknown>): ModelRoutingDecision {\r\n const ref = normalizeRef(taskString(task, \"executorRef\"));\r\n const title = taskString(task, \"title\").toLowerCase();\r\n const priority = taskString(task, \"priority\") || \"normal\";\r\n const roleLane = normalizeRef(taskString(task, \"roleLane\"));\r\n\r\n // Coding lanes \u2192 Cursor (cheaper than Opus for implementation).\r\n if (ref.includes(\"provider:codex\") || ref.startsWith(\"codex:\")) {\r\n return { provider: \"codex\", model: CODEX_DEFAULT_MODEL, rule: \"lane:codex_orchestration\" };\r\n }\r\n if (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"composer\") ||\r\n ref.includes(\"copilot\") ||\r\n roleLane === \"implementer\" ||\r\n roleLane === \"repair_implementer\"\r\n ) {\r\n return { provider: \"cursor\", rule: \"lane:implementation\" };\r\n }\r\n if (ref.includes(\"codex\")) {\r\n return { provider: \"codex\", model: CODEX_DEFAULT_MODEL, rule: \"lane:codex_orchestration\" };\r\n }\r\n\r\n // Landing / merge hygiene \u2192 Cursor (Dalton/Lorentz lanes).\r\n if (ref.includes(\"landing\") || title.startsWith(\"land:\") || title.includes(\" merge\")) {\r\n return { provider: \"cursor\", rule: \"lane:landing\" };\r\n }\r\n\r\n // Reviews \u2014 Cursor unless the task carries an explicit Claude operator override.\r\n if (ref.includes(\"review\") || /^review[\\s:]/.test(title) || roleLane.includes(\"review\")) {\r\n if (isOpusLane(ref, title) || roleLane === \"deep_reviewer\") {\r\n return { provider: \"cursor\", rule: \"lane:deep_review\" };\r\n }\r\n return { provider: \"cursor\", rule: \"lane:review\" };\r\n }\r\n\r\n // Planning / strategy \u2192 Cursor by default (Claude only with operator override).\r\n if (isOpusLane(ref, title) || roleLane === \"plan_author\") {\r\n return { provider: \"cursor\", rule: \"lane:planning\" };\r\n }\r\n\r\n if (priority === \"critical\") {\r\n return { provider: \"cursor\", rule: \"priority:critical\" };\r\n }\r\n if (priority === \"high\") {\r\n return { provider: \"cursor\", rule: \"priority:high\" };\r\n }\r\n if (priority === \"low\") {\r\n return { provider: \"cursor\", rule: \"priority:low\" };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\r\n model,\r\n provider: inferProviderFromModel(model),\r\n rule: \"default:global\",\r\n };\r\n}\r\n\r\n/** Resolve launch parameters: explicit CLI wins, then task inference, then global default. */\r\nexport function resolveWorkerLaunch(input: {\r\n explicitModel?: string;\r\n explicitProvider?: string;\r\n /** When true, `--provider claude` is honored without a task-level override. */\r\n explicitProviderIsOperatorOverride?: boolean;\r\n task?: Record<string, unknown>;\r\n}): ModelRoutingDecision {\r\n let decision: ModelRoutingDecision;\r\n\r\n if (input.explicitModel?.trim()) {\r\n const model = input.explicitModel.trim();\r\n const providerAlias = normalizeProviderAliasModel(model, input.explicitProvider);\r\n if (providerAlias) {\r\n decision = providerAlias;\r\n } else {\r\n decision = {\r\n model,\r\n provider: input.explicitProvider?.trim() || inferProviderFromModel(model),\r\n rule: \"explicit:cli\",\r\n requestedModel: model,\r\n };\r\n }\r\n } else if (input.task && Object.keys(input.task).length > 0) {\r\n const inferred = inferModelRoutingFromTask(input.task);\r\n decision = {\r\n ...inferred,\r\n requestedModel: inferred.model,\r\n };\r\n } else {\r\n const model = resolveGlobalDefaultModel();\r\n decision = {\r\n model,\r\n provider: input.explicitProvider?.trim() || inferProviderFromModel(model),\r\n rule: \"default:global\",\r\n requestedModel: model,\r\n };\r\n }\r\n\r\n const afterCursorPolicy = enforceCursorWorkerProvider({\r\n routing: decision,\r\n task: input.task,\r\n explicitProvider: input.explicitProvider,\r\n explicitProviderIsOperatorOverride: input.explicitProviderIsOperatorOverride,\r\n });\r\n\r\n if (!input.task || Object.keys(input.task).length === 0) {\r\n return afterCursorPolicy;\r\n }\r\n\r\n // Explicit provider aliases (\"cursor\", \"claude\") are operator-level directives \u2014\r\n // the caller chose the provider by name, so orchestration routing must not\r\n // override the resolved model/provider/rule back to a different path.\r\n if (\r\n afterCursorPolicy.rule === \"explicit:model_provider_alias\" ||\r\n afterCursorPolicy.rule === \"explicit:model_provider_alias_overrode_provider\" ||\r\n afterCursorPolicy.rule === \"explicit:cli\"\r\n ) {\r\n return afterCursorPolicy;\r\n }\r\n\r\n if (\r\n isClaudeFamilyProvider(afterCursorPolicy.provider) &&\r\n (input.explicitProviderIsOperatorOverride || taskAllowsClaudeWorker(input.task))\r\n ) {\r\n return afterCursorPolicy;\r\n }\r\n\r\n const orchestration = resolveOrchestrationRouting({\r\n task: input.task,\r\n explicitProvider: input.explicitProvider ?? afterCursorPolicy.provider,\r\n explicitModel: afterCursorPolicy.model,\r\n });\r\n\r\n return {\r\n provider: orchestration.provider,\r\n model:\r\n orchestration.provider === \"codex\"\r\n ? orchestration.model ?? afterCursorPolicy.model ?? CODEX_DEFAULT_MODEL\r\n : afterCursorPolicy.model,\r\n rule: orchestration.rule,\r\n requestedModel: afterCursorPolicy.requestedModel,\r\n orchestrationAudit: orchestration.audit,\r\n };\r\n}\r\n\r\n/** Fallback chain tail after provider start \u2014 never hard-code Opus here. */\r\nexport function resolveModelFallback(\r\n startedModel: string | undefined,\r\n launchModel: string | undefined,\r\n providerDefault: string | undefined,\r\n): string {\r\n return startedModel || launchModel || providerDefault || resolveGlobalDefaultModel() || CLAUDE_DEFAULT_MODEL;\r\n}\r\n", "import { CURSOR_DEFAULT_MODEL } from \"./model-routing.js\";\r\nimport type { ModelRoutingDecision } from \"./model-routing.js\";\r\n\r\n/** Default harness worker CLI provider unless an operator override allows Claude. */\r\nexport const DEFAULT_WORKER_PROVIDER = \"cursor\";\r\n\r\nconst CLAUDE_FAMILY = new Set([\"claude\", \"opus\", \"anthropic\"]);\r\n\r\nconst TASK_OVERRIDE_MARKERS = [\r\n /\\[worker-provider:\\s*claude\\]/i,\r\n /\\[use-claude-worker\\]/i,\r\n /\\[operator-worker-provider:\\s*claude\\]/i,\r\n];\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nexport function isClaudeFamilyProvider(provider: string | null | undefined): boolean {\r\n if (!provider?.trim()) return false;\r\n const normalized = provider.trim().toLowerCase();\r\n if (CLAUDE_FAMILY.has(normalized)) return true;\r\n return normalized.includes(\"claude\") || normalized.includes(\"opus\");\r\n}\r\n\r\n/**\r\n * True when the board row explicitly opts into a Claude/Opus worker\r\n * (operator override on the task).\r\n */\r\nexport function taskAllowsClaudeWorker(task: Record<string, unknown> | null | undefined): boolean {\r\n if (!task) return false;\r\n\r\n const override = task.workerProviderOverride;\r\n if (typeof override === \"string\" && isClaudeFamilyProvider(override)) return true;\r\n\r\n const ref = taskString(task, \"executorRef\").toLowerCase();\r\n if (ref === \"provider:claude\" || ref.startsWith(\"provider:claude:\")) return true;\r\n if (ref.includes(\"claude-worker-override\") || ref.includes(\"operator-claude\")) return true;\r\n\r\n const description = taskString(task, \"description\");\r\n if (TASK_OVERRIDE_MARKERS.some((re) => re.test(description))) return true;\r\n\r\n const title = taskString(task, \"title\");\r\n if (/\\[use-claude-worker\\]/i.test(title)) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport interface EnforceCursorWorkerProviderInput {\r\n routing: ModelRoutingDecision;\r\n task?: Record<string, unknown> | null;\r\n /** Per-invocation `--provider` from the harness CLI. */\r\n explicitProvider?: string | null;\r\n /** When true, `--provider claude` is treated as an operator run override. */\r\n explicitProviderIsOperatorOverride?: boolean;\r\n}\r\n\r\nfunction coerceCursorModel(model: string | undefined, ruleSuffix: string): ModelRoutingDecision {\r\n const coerced: ModelRoutingDecision = {\r\n provider: DEFAULT_WORKER_PROVIDER,\r\n model: CURSOR_DEFAULT_MODEL,\r\n rule: `policy:cursor_default${ruleSuffix}`,\r\n requestedModel: model,\r\n };\r\n return coerced;\r\n}\r\n\r\n/**\r\n * Rewrites Claude/Opus routing to Cursor unless the task or an explicit operator\r\n * run override allows Claude workers.\r\n */\r\nexport function enforceCursorWorkerProvider(\r\n input: EnforceCursorWorkerProviderInput,\r\n): ModelRoutingDecision {\r\n const { routing, task } = input;\r\n const explicit = input.explicitProvider?.trim().toLowerCase();\r\n\r\n if (input.explicitProviderIsOperatorOverride && isClaudeFamilyProvider(explicit)) {\r\n return {\r\n ...routing,\r\n provider: \"claude\",\r\n rule: routing.rule.startsWith(\"explicit:\") ? routing.rule : \"explicit:operator_provider\",\r\n };\r\n }\r\n\r\n if (taskAllowsClaudeWorker(task)) {\r\n return routing;\r\n }\r\n\r\n if (routing.rule === \"explicit:cli\" && isClaudeFamilyProvider(routing.provider)) {\r\n return routing;\r\n }\r\n\r\n if (!isClaudeFamilyProvider(routing.provider)) {\r\n return routing;\r\n }\r\n\r\n const suffix =\r\n routing.rule && routing.rule !== \"default:global\" ? `:${routing.rule.replace(/:/g, \"_\")}` : \"\";\r\n return coerceCursorModel(routing.model, suffix);\r\n}\r\n\r\n/** Normalize config/registry defaults \u2014 legacy `claude` configs map to Cursor unless overridden. */\r\nexport function resolveConfiguredWorkerProvider(\r\n configured: string | null | undefined,\r\n fallback: string = DEFAULT_WORKER_PROVIDER,\r\n): string {\r\n const trimmed = configured?.trim();\r\n if (!trimmed) return fallback;\r\n if (isClaudeFamilyProvider(trimmed)) return DEFAULT_WORKER_PROVIDER;\r\n if (trimmed === \"codex\") return \"codex\";\r\n return trimmed;\r\n}\r\n\r\n/** Plan / Command Center executor lists \u2014 Cursor wins when both families appear. */\r\nexport function preferCursorExecutor(executors: string[]): string[] {\r\n const unique = [...new Set(executors.map((e) => e.trim().toLowerCase()).filter(Boolean))];\r\n if (unique.includes(DEFAULT_WORKER_PROVIDER)) {\r\n return [...new Set(unique.map((e) => (isClaudeFamilyProvider(e) ? DEFAULT_WORKER_PROVIDER : e)))];\r\n }\r\n if (unique.every((e) => isClaudeFamilyProvider(e))) {\r\n return [DEFAULT_WORKER_PROVIDER];\r\n }\r\n return unique;\r\n}\r\n", "import type { OrchestrationProviderCapability, OrchestrationProviderId } from \"./types.js\";\r\n\r\nconst CAPABILITIES: Record<OrchestrationProviderId, OrchestrationProviderCapability> = {\r\n codex: {\r\n id: \"codex\",\r\n displayName: \"Codex (BYO OAuth / Hermes openai-codex)\",\r\n costTier: \"low\",\r\n authSources: [\"oauth_local\", \"api_key_env\", \"subscription_hermes\"],\r\n supportsLowRiskOrchestration: true,\r\n supportsPrivilegedPlatformActions: false,\r\n },\r\n cursor: {\r\n id: \"cursor\",\r\n displayName: \"Cursor / Composer\",\r\n costTier: \"medium\",\r\n authSources: [\"oauth_local\", \"api_key_env\"],\r\n supportsLowRiskOrchestration: true,\r\n supportsPrivilegedPlatformActions: true,\r\n },\r\n claude: {\r\n id: \"claude\",\r\n displayName: \"Claude Code\",\r\n costTier: \"high\",\r\n authSources: [\"oauth_local\"],\r\n supportsLowRiskOrchestration: true,\r\n supportsPrivilegedPlatformActions: true,\r\n },\r\n};\r\n\r\nexport function getOrchestrationProviderCapability(\r\n id: OrchestrationProviderId,\r\n): OrchestrationProviderCapability {\r\n return CAPABILITIES[id];\r\n}\r\n\r\nexport function listOrchestrationProviderCapabilities(): OrchestrationProviderCapability[] {\r\n return Object.values(CAPABILITIES);\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\nimport {\r\n envKeyFingerprint,\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nconst DEFAULT_CODEX_BIN = \"codex\";\r\n\r\nfunction authStoreCandidates(): string[] {\r\n const home = homedir();\r\n return [\r\n path.join(home, \".codex\", \"auth.json\"),\r\n path.join(home, \".config\", \"codex\", \"auth.json\"),\r\n ];\r\n}\r\n\r\n/**\r\n * Probe BYO Codex OAuth on the local runner. Never reads or returns raw OAuth tokens.\r\n */\r\nexport function probeCodexOAuthBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): OrchestrationProviderBindingStatus {\r\n const bin = resolveCliBin(DEFAULT_CODEX_BIN, [\"KYNVER_CODEX_BIN\", \"CODEX_BIN\"]);\r\n\r\n if (process.env.CODEX_API_KEY?.trim()) {\r\n return {\r\n providerId: \"codex\",\r\n ready: true,\r\n authSource: \"api_key_env\",\r\n sessionFingerprint: envKeyFingerprint(\"CODEX_API_KEY\"),\r\n checkedAt: nowIso,\r\n note: \"CODEX_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)\",\r\n };\r\n }\r\n\r\n const authPath = authStoreCandidates().find((p) => existsSync(p));\r\n const login = probeCliCommand(bin, [\"login\", \"status\"], {\r\n okNote: \"codex login status: authenticated\",\r\n failPrefix: \"codex login status\",\r\n });\r\n const ready = Boolean(authPath) && login.ok;\r\n\r\n return {\r\n providerId: \"codex\",\r\n ready,\r\n authSource: \"oauth_local\",\r\n sessionFingerprint: authPath ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Local Codex OAuth session bound on runner\"\r\n : [login.note, authPath ? undefined : \"no ~/.codex/auth.json\"].filter(Boolean).join(\"; \"),\r\n };\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\nimport { statSync } from \"node:fs\";\r\nimport { spawnSync } from \"node:child_process\";\r\n\r\n/** Fingerprint from file metadata only \u2014 never reads token payload. */\r\nexport function fingerprintAuthStore(filePath: string): string | undefined {\r\n try {\r\n const st = statSync(filePath);\r\n const material = `${filePath}|${st.size}|${st.mtimeMs}`;\r\n return createHash(\"sha256\").update(material).digest(\"hex\").slice(0, 16);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function envKeyFingerprint(envKey: string): string {\r\n return createHash(\"sha256\").update(`env:${envKey}`).digest(\"hex\").slice(0, 16);\r\n}\r\n\r\nexport function resolveCliBin(\r\n defaultBin: string,\r\n envKeys: string[],\r\n): string {\r\n for (const key of envKeys) {\r\n const value = process.env[key]?.trim();\r\n if (value) return value;\r\n }\r\n return defaultBin;\r\n}\r\n\r\nexport function probeCliCommand(\r\n bin: string,\r\n args: string[],\r\n options: {\r\n timeoutMs?: number;\r\n okNote?: string;\r\n failPrefix?: string;\r\n } = {},\r\n): { ok: boolean; note?: string } {\r\n const timeoutMs = options.timeoutMs ?? 8_000;\r\n try {\r\n const result = spawnSync(bin, args, {\r\n encoding: \"utf8\",\r\n timeout: timeoutMs,\r\n env: { ...process.env, CI: \"1\", NO_COLOR: \"1\" },\r\n });\r\n if (result.status === 0) {\r\n return { ok: true, note: options.okNote ?? `${bin} ${args.join(\" \")}: ok` };\r\n }\r\n const stderr = (result.stderr || result.stdout || \"\").trim();\r\n const prefix = options.failPrefix ?? `${bin} ${args.join(\" \")} failed`;\r\n return {\r\n ok: false,\r\n note: stderr ? `${prefix}: ${stderr.slice(0, 200)}` : prefix,\r\n };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n note: err instanceof Error ? err.message : `${bin} probe failed`,\r\n };\r\n }\r\n}\r\n\r\n/** Exit-code-only probe \u2014 stdout/stderr are discarded to avoid leaking auth payloads. */\r\nexport function probeCliExitCodeOnly(\r\n bin: string,\r\n args: string[],\r\n options: { timeoutMs?: number; okNote?: string; failNote?: string } = {},\r\n): { ok: boolean; note?: string } {\r\n const timeoutMs = options.timeoutMs ?? 8_000;\r\n try {\r\n const result = spawnSync(bin, args, {\r\n stdio: \"ignore\",\r\n timeout: timeoutMs,\r\n env: { ...process.env, CI: \"1\", NO_COLOR: \"1\" },\r\n });\r\n if (result.status === 0) {\r\n return { ok: true, note: options.okNote ?? `${bin} authenticated` };\r\n }\r\n return { ok: false, note: options.failNote ?? `${bin} not authenticated` };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n note: err instanceof Error ? err.message : `${bin} auth probe failed`,\r\n };\r\n }\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationAuthSource } from \"./types.js\";\r\nimport {\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n probeCliExitCodeOnly,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nexport type HermesOpenAiCodexPath = \"hermes_openai_codex\";\r\n\r\nexport interface HermesOpenAiCodexBindingStatus {\r\n path: HermesOpenAiCodexPath;\r\n ready: boolean;\r\n authSource: OrchestrationAuthSource;\r\n sessionFingerprint?: string;\r\n checkedAt: string;\r\n note?: string;\r\n}\r\n\r\nfunction hermesAuthStorePath(): string {\r\n const configured = process.env.HERMES_HOME?.trim();\r\n const home = configured ? path.resolve(configured) : path.join(homedir(), \".hermes\");\r\n return path.join(home, \"auth.json\");\r\n}\r\n\r\n/**\r\n * Probe Hermes-managed OpenAI Codex subscription (ChatGPT backend-api/codex).\r\n * Uses exit-code-only `hermes auth status` \u2014 never reads auth.json token payloads.\r\n */\r\nexport function probeHermesOpenAiCodexBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): HermesOpenAiCodexBindingStatus {\r\n const bin = resolveCliBin(\"hermes\", [\"KYNVER_HERMES_BIN\", \"HERMES_BIN\"]);\r\n const cli = probeCliCommand(bin, [\"--version\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const authPath = hermesAuthStorePath();\r\n const authStorePresent = existsSync(authPath);\r\n const auth = probeCliExitCodeOnly(bin, [\"auth\", \"status\", \"openai-codex\"], {\r\n okNote: \"hermes openai-codex: logged in\",\r\n failNote: \"hermes openai-codex: not logged in\",\r\n });\r\n const ready = cli.ok && auth.ok;\r\n const authSource: OrchestrationAuthSource = ready ? \"subscription_hermes\" : \"none\";\r\n\r\n return {\r\n path: \"hermes_openai_codex\",\r\n ready,\r\n authSource,\r\n sessionFingerprint: authStorePresent ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)\"\r\n : [cli.note, auth.note, authStorePresent ? undefined : \"no ~/.hermes/auth.json\"]\r\n .filter(Boolean)\r\n .join(\"; \"),\r\n };\r\n}\r\n", "import { probeCodexOAuthBinding } from \"./codex-oauth-binding.js\";\r\nimport {\r\n probeHermesOpenAiCodexBinding,\r\n type HermesOpenAiCodexBindingStatus,\r\n} from \"./hermes-openai-codex-binding.js\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\n\r\n/** How low-cost Codex orchestration authenticates on this host. */\r\nexport type CodexOrchestrationPath = \"codex_cli\" | \"hermes_openai_codex\" | \"none\";\r\n\r\nexport interface CodexOrchestrationAdapterStatus extends OrchestrationProviderBindingStatus {\r\n path: CodexOrchestrationPath;\r\n hermesOpenAiCodex?: HermesOpenAiCodexBindingStatus;\r\n}\r\n\r\n/**\r\n * Resolve the best local Codex/OpenAI orchestration path: standalone `codex` CLI first,\r\n * then Hermes-managed `openai-codex` subscription when the CLI is absent or unbound.\r\n */\r\nexport function resolveCodexOrchestrationAdapter(\r\n nowIso: string = new Date().toISOString(),\r\n): CodexOrchestrationAdapterStatus {\r\n const cliBinding = probeCodexOAuthBinding(nowIso);\r\n if (cliBinding.ready) {\r\n return { ...cliBinding, path: \"codex_cli\" };\r\n }\r\n\r\n const hermes = probeHermesOpenAiCodexBinding(nowIso);\r\n if (hermes.ready) {\r\n return {\r\n providerId: \"codex\",\r\n ready: true,\r\n authSource: hermes.authSource,\r\n sessionFingerprint: hermes.sessionFingerprint,\r\n checkedAt: hermes.checkedAt,\r\n note: hermes.note,\r\n path: \"hermes_openai_codex\",\r\n hermesOpenAiCodex: hermes,\r\n };\r\n }\r\n\r\n return {\r\n providerId: \"codex\",\r\n ready: false,\r\n authSource: \"none\",\r\n checkedAt: nowIso,\r\n path: \"none\",\r\n hermesOpenAiCodex: hermes,\r\n note: [cliBinding.note, hermes.note].filter(Boolean).join(\"; \") || \"Codex CLI and Hermes openai-codex unavailable\",\r\n };\r\n}\r\n", "import { getOrchestrationProviderCapability, listOrchestrationProviderCapabilities } from \"./capabilities.js\";\r\nimport type { OrchestrationProviderInventory } from \"./inventory.js\";\r\nimport type {\r\n OrchestrationAuthSource,\r\n OrchestrationCostTier,\r\n OrchestrationProviderBindingStatus,\r\n OrchestrationProviderId,\r\n OrchestrationRiskClass,\r\n} from \"./types.js\";\r\n\r\nconst COST_TIER_ORDER: OrchestrationCostTier[] = [\"low\", \"medium\", \"high\"];\r\n\r\nconst AUTH_SOURCE_RANK: Record<OrchestrationAuthSource, number> = {\r\n oauth_local: 0,\r\n subscription_hermes: 0,\r\n runner_token: 1,\r\n api_key_env: 2,\r\n none: 3,\r\n};\r\n\r\nexport function providerCapableForRisk(\r\n providerId: OrchestrationProviderId,\r\n riskClass: OrchestrationRiskClass,\r\n): boolean {\r\n const cap = getOrchestrationProviderCapability(providerId);\r\n if (riskClass === \"privileged\") return cap.supportsPrivilegedPlatformActions;\r\n if (riskClass === \"low\") return cap.supportsLowRiskOrchestration;\r\n return true;\r\n}\r\n\r\nexport function compareProviderCandidates(\r\n a: { providerId: OrchestrationProviderId; binding: OrchestrationProviderBindingStatus },\r\n b: { providerId: OrchestrationProviderId; binding: OrchestrationProviderBindingStatus },\r\n): number {\r\n const capA = getOrchestrationProviderCapability(a.providerId);\r\n const capB = getOrchestrationProviderCapability(b.providerId);\r\n const tierDiff =\r\n COST_TIER_ORDER.indexOf(capA.costTier) - COST_TIER_ORDER.indexOf(capB.costTier);\r\n if (tierDiff !== 0) return tierDiff;\r\n const authDiff =\r\n AUTH_SOURCE_RANK[a.binding.authSource] - AUTH_SOURCE_RANK[b.binding.authSource];\r\n if (authDiff !== 0) return authDiff;\r\n return a.providerId.localeCompare(b.providerId);\r\n}\r\n\r\nexport interface CheapestCapableSelection {\r\n providerId: OrchestrationProviderId;\r\n binding: OrchestrationProviderBindingStatus;\r\n escalatedFrom?: OrchestrationProviderId;\r\n escalatedReason?: string;\r\n}\r\n\r\n/**\r\n * Pick the lowest-cost ready provider that can run the given risk class.\r\n * Sorts by cost tier, then prefers local OAuth CLI over metered API-key paths.\r\n */\r\nexport function selectCheapestCapableProvider(input: {\r\n inventory: OrchestrationProviderInventory;\r\n riskClass: OrchestrationRiskClass;\r\n}): CheapestCapableSelection | null {\r\n const candidates = listOrchestrationProviderCapabilities()\r\n .map((cap) => ({\r\n providerId: cap.id,\r\n binding: input.inventory.bindings[cap.id],\r\n }))\r\n .filter(\r\n (c) => c.binding.ready && providerCapableForRisk(c.providerId, input.riskClass),\r\n );\r\n\r\n if (candidates.length === 0) return null;\r\n\r\n const sorted = [...candidates].sort(compareProviderCandidates);\r\n const chosen = sorted[0]!;\r\n const lowTierProviderId: OrchestrationProviderId = \"codex\";\r\n\r\n if (chosen.providerId === lowTierProviderId) {\r\n return { providerId: chosen.providerId, binding: chosen.binding };\r\n }\r\n\r\n const lowBinding = input.inventory.bindings[lowTierProviderId];\r\n let escalatedReason: string | undefined;\r\n if (!providerCapableForRisk(lowTierProviderId, input.riskClass)) {\r\n escalatedReason = `${input.riskClass} orchestration requires privileged-capable provider`;\r\n } else if (!lowBinding.ready) {\r\n escalatedReason = lowBinding.note ?? `${lowTierProviderId} not bound`;\r\n }\r\n\r\n return {\r\n providerId: chosen.providerId,\r\n binding: chosen.binding,\r\n escalatedFrom: lowTierProviderId,\r\n escalatedReason,\r\n };\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\nimport {\r\n envKeyFingerprint,\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n probeCliExitCodeOnly,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nconst DEFAULT_CLAUDE_BIN = \"claude\";\r\n\r\nfunction claudeAuthStoreCandidates(): string[] {\r\n const home = homedir();\r\n return [path.join(home, \".claude\", \".credentials.json\")];\r\n}\r\n\r\n/**\r\n * Probe Claude Code OAuth on the local runner. Never reads or returns raw OAuth tokens.\r\n * ANTHROPIC_API_KEY is reported separately as api_key_env (cloud credits path).\r\n */\r\nexport function probeClaudeOAuthBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): OrchestrationProviderBindingStatus {\r\n const bin = resolveCliBin(DEFAULT_CLAUDE_BIN, [\"KYNVER_CLAUDE_BIN\", \"CLAUDE_BIN\"]);\r\n\r\n if (process.env.ANTHROPIC_API_KEY?.trim()) {\r\n return {\r\n providerId: \"claude\",\r\n ready: true,\r\n authSource: \"api_key_env\",\r\n sessionFingerprint: envKeyFingerprint(\"ANTHROPIC_API_KEY\"),\r\n checkedAt: nowIso,\r\n note: \"ANTHROPIC_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)\",\r\n };\r\n }\r\n\r\n const cli = probeCliCommand(bin, [\"--version\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const authPath = claudeAuthStoreCandidates().find((p) => existsSync(p));\r\n const login = probeCliExitCodeOnly(bin, [\"auth\", \"status\"], {\r\n okNote: \"claude auth status: authenticated\",\r\n failNote: \"claude auth status: not authenticated\",\r\n });\r\n const ready = cli.ok && (login.ok || Boolean(authPath));\r\n\r\n return {\r\n providerId: \"claude\",\r\n ready,\r\n authSource: \"oauth_local\",\r\n sessionFingerprint: authPath ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Local Claude Code OAuth session bound on runner\"\r\n : [cli.note, login.note, authPath ? undefined : \"no ~/.claude/.credentials.json\"]\r\n .filter(Boolean)\r\n .join(\"; \"),\r\n };\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\nimport {\r\n envKeyFingerprint,\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nconst DEFAULT_AGENT_BIN = \"agent\";\r\n\r\nfunction cursorAuthStoreCandidates(): string[] {\r\n const home = homedir();\r\n return [path.join(home, \".config\", \"cursor\", \"auth.json\")];\r\n}\r\n\r\n/**\r\n * Probe Cursor/Composer OAuth on the local runner. Never reads or returns raw OAuth tokens.\r\n */\r\nexport function probeCursorOAuthBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): OrchestrationProviderBindingStatus {\r\n const bin = resolveCliBin(DEFAULT_AGENT_BIN, [\r\n \"KYNVER_CURSOR_AGENT_BIN\",\r\n \"CURSOR_AGENT_BIN\",\r\n ]);\r\n\r\n if (process.env.CURSOR_API_KEY?.trim()) {\r\n return {\r\n providerId: \"cursor\",\r\n ready: true,\r\n authSource: \"api_key_env\",\r\n sessionFingerprint: envKeyFingerprint(\"CURSOR_API_KEY\"),\r\n checkedAt: nowIso,\r\n note: \"CURSOR_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)\",\r\n };\r\n }\r\n\r\n const cli = probeCliCommand(bin, [\"-v\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const authPath = cursorAuthStoreCandidates().find((p) => existsSync(p));\r\n const ready = Boolean(authPath) && cli.ok;\r\n\r\n return {\r\n providerId: \"cursor\",\r\n ready,\r\n authSource: \"oauth_local\",\r\n sessionFingerprint: authPath ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Local Cursor/Composer OAuth session bound on runner\"\r\n : [cli.note, authPath ? undefined : \"no ~/.config/cursor/auth.json\"].filter(Boolean).join(\"; \"),\r\n };\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationAuthSource } from \"./types.js\";\r\nimport {\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nexport interface HermesCliAdapterStatus {\r\n adapterId: \"hermes\";\r\n cliAvailable: boolean;\r\n profileBound: boolean;\r\n authSource: OrchestrationAuthSource;\r\n sessionFingerprint?: string;\r\n checkedAt: string;\r\n note?: string;\r\n}\r\n\r\nconst PROFILE_ENV_KEYS = [\r\n \"OPENAI_API_KEY\",\r\n \"ANTHROPIC_API_KEY\",\r\n \"KYNVER_API_KEY\",\r\n \"KYNVER_BASE_URL\",\r\n] as const;\r\n\r\nfunction hermesProfileEnvPath(): string {\r\n const configured = process.env.HERMES_HOME?.trim();\r\n const home = configured ? path.resolve(configured) : path.join(homedir(), \".hermes\");\r\n return path.join(home, \".env\");\r\n}\r\n\r\n/** Presence-only scan \u2014 records key names configured, never values. */\r\nfunction profileEnvKeyPresence(envPath: string): string[] {\r\n try {\r\n const text = readFileSync(envPath, \"utf8\");\r\n const present: string[] = [];\r\n for (const key of PROFILE_ENV_KEYS) {\r\n const re = new RegExp(`^${key}=`, \"m\");\r\n if (re.test(text)) present.push(key);\r\n }\r\n return present;\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Best-effort Hermes Forge CLI adapter probe. Cloud/API keys in ~/.hermes/.env are\r\n * reported as api_key_env \u2014 distinct from harness worker BYO OAuth inventory.\r\n */\r\nexport function probeHermesCliAdapter(\r\n nowIso: string = new Date().toISOString(),\r\n): HermesCliAdapterStatus {\r\n const bin = resolveCliBin(\"hermes\", [\"KYNVER_HERMES_BIN\", \"HERMES_BIN\"]);\r\n const cli = probeCliCommand(bin, [\"--version\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const profilePath = hermesProfileEnvPath();\r\n const profileBound = existsSync(profilePath);\r\n const envKeys = profileBound ? profileEnvKeyPresence(profilePath) : [];\r\n const hasApiKeys = envKeys.some((k) => k.endsWith(\"_API_KEY\"));\r\n const authSource: OrchestrationAuthSource = hasApiKeys ? \"api_key_env\" : profileBound ? \"oauth_local\" : \"none\";\r\n const ready = cli.ok && profileBound;\r\n\r\n return {\r\n adapterId: \"hermes\",\r\n cliAvailable: cli.ok,\r\n profileBound,\r\n authSource,\r\n sessionFingerprint: profileBound ? fingerprintAuthStore(profilePath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? `Hermes profile bound (${envKeys.length ? `keys: ${envKeys.join(\", \")}` : \"no API keys detected\"})`\r\n : [cli.note, profileBound ? undefined : \"no ~/.hermes/.env\"].filter(Boolean).join(\"; \"),\r\n };\r\n}\r\n", "import { probeClaudeOAuthBinding } from \"./claude-oauth-binding.js\";\r\nimport { probeCodexOAuthBinding } from \"./codex-oauth-binding.js\";\r\nimport {\r\n resolveCodexOrchestrationAdapter,\r\n type CodexOrchestrationPath,\r\n} from \"./codex-orchestration-adapter.js\";\r\nimport { probeCursorOAuthBinding } from \"./cursor-oauth-binding.js\";\r\nimport { probeHermesCliAdapter, type HermesCliAdapterStatus } from \"./hermes-cli-adapter.js\";\r\nimport {\r\n probeHermesOpenAiCodexBinding,\r\n type HermesOpenAiCodexBindingStatus,\r\n} from \"./hermes-openai-codex-binding.js\";\r\nimport type { OrchestrationProviderBindingStatus, OrchestrationProviderId } from \"./types.js\";\r\n\r\nexport interface OrchestrationCloudApiCredits {\r\n /** ANTHROPIC_API_KEY configured on host (cloud billing \u2014 not BYO OAuth). */\r\n anthropicApiKey: boolean;\r\n /** OPENAI_API_KEY configured on host (cloud billing \u2014 distinct from Codex OAuth). */\r\n openaiApiKey: boolean;\r\n /** CODEX_API_KEY configured on host (OpenAI Codex cloud path). */\r\n codexApiKey: boolean;\r\n}\r\n\r\nexport interface OrchestrationProviderInventory {\r\n generatedAt: string;\r\n bindings: Record<OrchestrationProviderId, OrchestrationProviderBindingStatus>;\r\n /** API-key cloud paths \u2014 separate from local OAuth CLI sessions. */\r\n cloudApiCredits: OrchestrationCloudApiCredits;\r\n hermes: HermesCliAdapterStatus;\r\n hermesOpenAiCodex: HermesOpenAiCodexBindingStatus;\r\n codexAdapterPath: CodexOrchestrationPath;\r\n readyCount: number;\r\n}\r\n\r\nexport interface BuildOrchestrationProviderInventoryOptions {\r\n nowIso?: () => string;\r\n}\r\n\r\n/**\r\n * Probe all harness orchestration CLI providers on this host.\r\n * Never reads or returns raw OAuth tokens or API key values.\r\n */\r\nexport function buildOrchestrationProviderInventory(\r\n options: BuildOrchestrationProviderInventoryOptions = {},\r\n): OrchestrationProviderInventory {\r\n const generatedAt = options.nowIso?.() ?? new Date().toISOString();\r\n const codexAdapter = resolveCodexOrchestrationAdapter(generatedAt);\r\n const bindings = {\r\n codex: codexAdapter,\r\n cursor: probeCursorOAuthBinding(generatedAt),\r\n claude: probeClaudeOAuthBinding(generatedAt),\r\n } satisfies Record<OrchestrationProviderId, OrchestrationProviderBindingStatus>;\r\n\r\n const readyCount = Object.values(bindings).filter((b) => b.ready).length;\r\n\r\n return {\r\n generatedAt,\r\n bindings,\r\n cloudApiCredits: {\r\n anthropicApiKey: Boolean(process.env.ANTHROPIC_API_KEY?.trim()),\r\n openaiApiKey: Boolean(process.env.OPENAI_API_KEY?.trim()),\r\n codexApiKey: Boolean(process.env.CODEX_API_KEY?.trim()),\r\n },\r\n hermes: probeHermesCliAdapter(generatedAt),\r\n hermesOpenAiCodex: probeHermesOpenAiCodexBinding(generatedAt),\r\n codexAdapterPath: codexAdapter.path,\r\n readyCount,\r\n };\r\n}\r\n\r\nexport function probeOrchestrationProviderBinding(\r\n providerId: OrchestrationProviderId,\r\n nowIso?: string,\r\n): OrchestrationProviderBindingStatus {\r\n switch (providerId) {\r\n case \"codex\":\r\n return resolveCodexOrchestrationAdapter(nowIso);\r\n case \"cursor\":\r\n return probeCursorOAuthBinding(nowIso);\r\n case \"claude\":\r\n return probeClaudeOAuthBinding(nowIso);\r\n }\r\n}\r\n", "import { DEFAULT_WORKER_PROVIDER } from \"../worker-provider-policy.js\";\r\nimport { getOrchestrationProviderCapability } from \"./capabilities.js\";\r\nimport { resolveCodexOrchestrationAdapter } from \"./codex-orchestration-adapter.js\";\r\nimport { selectCheapestCapableProvider } from \"./cost-router.js\";\r\nimport { buildOrchestrationProviderInventory } from \"./inventory.js\";\r\nimport type { OrchestrationProviderInventory } from \"./inventory.js\";\r\nimport type {\r\n OrchestrationProviderBindingStatus,\r\n OrchestrationProviderId,\r\n OrchestrationRiskClass,\r\n OrchestrationRoutingAudit,\r\n OrchestrationRoutingDecision,\r\n} from \"./types.js\";\r\n\r\nconst PRIVILEGED_MARKERS = [\r\n /\\bprivileged\\b/i,\r\n /\\bproduction\\s+db\\b/i,\r\n /\\bdb:push\\b/i,\r\n /\\bmigration\\b/i,\r\n /\\bdeploy\\b/i,\r\n /\\bsecrets?\\b/i,\r\n /\\bstripe\\b/i,\r\n /\\[require-approval\\]/i,\r\n /\\[operator-only\\]/i,\r\n];\r\n\r\nconst LOW_RISK_MARKERS = [\r\n /\\borchestration\\b/i,\r\n /\\bplan[- ]?progress\\b/i,\r\n /\\bstatus\\s+sync\\b/i,\r\n /\\bheartbeat\\b/i,\r\n /\\bboard[- ]?drain\\b/i,\r\n /\\bmaintenance\\b/i,\r\n /\\[orchestration:\\s*low-risk\\]/i,\r\n];\r\n\r\nfunction taskString(task: Record<string, unknown>, key: string): string {\r\n const v = task[key];\r\n return typeof v === \"string\" ? v.trim() : \"\";\r\n}\r\n\r\nexport function classifyOrchestrationRisk(task: Record<string, unknown>): OrchestrationRiskClass {\r\n const ref = taskString(task, \"executorRef\").toLowerCase();\r\n const title = taskString(task, \"title\").toLowerCase();\r\n const description = taskString(task, \"description\").toLowerCase();\r\n const blob = `${ref}\\n${title}\\n${description}`;\r\n\r\n if (PRIVILEGED_MARKERS.some((re) => re.test(blob))) return \"privileged\";\r\n if (ref.includes(\"provider:claude\") || ref.includes(\"deep_review\") || ref.includes(\"security\")) {\r\n return \"elevated\";\r\n }\r\n if (\r\n ref.includes(\"landing\") ||\r\n ref.includes(\"review\") ||\r\n title.startsWith(\"land:\") ||\r\n ref.includes(\"implementer\") ||\r\n ref.includes(\"repair\") ||\r\n title.includes(\"implement\")\r\n ) {\r\n return \"elevated\";\r\n }\r\n if (LOW_RISK_MARKERS.some((re) => re.test(blob))) {\r\n return \"low\";\r\n }\r\n return \"elevated\";\r\n}\r\n\r\nfunction buildAudit(input: {\r\n provider: OrchestrationProviderId;\r\n model?: string;\r\n authSource: OrchestrationRoutingAudit[\"authSource\"];\r\n riskClass: OrchestrationRiskClass;\r\n routingRule: string;\r\n escalatedFrom?: OrchestrationProviderId;\r\n escalatedReason?: string;\r\n}): OrchestrationRoutingAudit {\r\n const cap = getOrchestrationProviderCapability(input.provider);\r\n const costRationale =\r\n input.escalatedFrom && input.escalatedReason\r\n ? `Escalated from ${input.escalatedFrom} (${input.escalatedReason}); using ${cap.displayName} (${cap.costTier} tier)`\r\n : `${cap.displayName} selected for ${input.riskClass} orchestration (${cap.costTier} tier, auth=${input.authSource})`;\r\n\r\n return {\r\n provider: input.provider,\r\n model: input.model,\r\n authSource: input.authSource,\r\n costTier: cap.costTier,\r\n riskClass: input.riskClass,\r\n costRationale,\r\n routingRule: input.routingRule,\r\n escalatedFrom: input.escalatedFrom,\r\n escalatedReason: input.escalatedReason,\r\n };\r\n}\r\n\r\nfunction resolveInventory(input: {\r\n inventory?: OrchestrationProviderInventory | null;\r\n codexBinding?: OrchestrationProviderBindingStatus | null;\r\n}): OrchestrationProviderInventory {\r\n const inventory = input.inventory ?? buildOrchestrationProviderInventory();\r\n if (!input.codexBinding) return inventory;\r\n return {\r\n ...inventory,\r\n bindings: { ...inventory.bindings, codex: input.codexBinding },\r\n };\r\n}\r\n\r\nfunction decisionForProvider(input: {\r\n providerId: OrchestrationProviderId;\r\n binding: OrchestrationProviderBindingStatus;\r\n riskClass: OrchestrationRiskClass;\r\n routingRule: string;\r\n model?: string;\r\n escalatedFrom?: OrchestrationProviderId;\r\n escalatedReason?: string;\r\n}): OrchestrationRoutingDecision {\r\n const audit = buildAudit({\r\n provider: input.providerId,\r\n model: input.model,\r\n authSource: input.binding.authSource,\r\n riskClass: input.riskClass,\r\n routingRule: input.routingRule,\r\n escalatedFrom: input.escalatedFrom,\r\n escalatedReason: input.escalatedReason,\r\n });\r\n return {\r\n provider: input.providerId,\r\n model: input.model,\r\n rule: audit.routingRule,\r\n audit,\r\n };\r\n}\r\n\r\nexport interface ResolveOrchestrationRoutingInput {\r\n task?: Record<string, unknown> | null;\r\n explicitProvider?: string | null;\r\n explicitModel?: string | null;\r\n codexBinding?: OrchestrationProviderBindingStatus | null;\r\n inventory?: OrchestrationProviderInventory | null;\r\n preferLowCost?: boolean;\r\n}\r\n\r\n/**\r\n * Cost-aware harness orchestration routing: cheapest capable provider first,\r\n * preferring local OAuth CLI sessions over metered API-key paths; escalate when needed.\r\n */\r\nexport function resolveOrchestrationRouting(\r\n input: ResolveOrchestrationRoutingInput,\r\n): OrchestrationRoutingDecision {\r\n const task = input.task ?? {};\r\n const risk = classifyOrchestrationRisk(task);\r\n const inventory = resolveInventory({\r\n inventory: input.inventory,\r\n // When callers pass a pre-built inventory (tests, CC snapshots), do not probe live\r\n // Hermes/Codex bindings \u2014 that would overwrite mocked oauth_local with subscription_hermes.\r\n codexBinding:\r\n input.codexBinding ?? (input.inventory ? null : resolveCodexOrchestrationAdapter()),\r\n });\r\n const explicit = input.preferLowCost === false ? null : input.explicitProvider?.trim().toLowerCase();\r\n const explicitModel = input.explicitModel?.trim() || undefined;\r\n const fallbackProvider = DEFAULT_WORKER_PROVIDER as OrchestrationProviderId;\r\n\r\n if (explicit === \"codex\" || explicit === \"provider:codex\") {\r\n const binding = inventory.bindings.codex;\r\n if (!binding.ready) {\r\n const selection = selectCheapestCapableProvider({ inventory, riskClass: risk });\r\n if (selection) {\r\n return decisionForProvider({\r\n providerId: selection.providerId,\r\n binding: selection.binding,\r\n riskClass: risk,\r\n routingRule: \"orchestration:explicit_codex_unavailable_cost_aware\",\r\n model: explicitModel,\r\n escalatedFrom: \"codex\",\r\n escalatedReason: binding.note ?? \"codex oauth not bound\",\r\n });\r\n }\r\n return decisionForProvider({\r\n providerId: fallbackProvider,\r\n binding: inventory.bindings[fallbackProvider],\r\n riskClass: risk,\r\n routingRule: \"orchestration:codex_unavailable_escalate_cursor\",\r\n model: explicitModel,\r\n escalatedFrom: \"codex\",\r\n escalatedReason: binding.note ?? \"codex oauth not bound\",\r\n });\r\n }\r\n return decisionForProvider({\r\n providerId: \"codex\",\r\n binding,\r\n riskClass: risk,\r\n routingRule: \"orchestration:explicit_codex\",\r\n model: explicitModel,\r\n });\r\n }\r\n\r\n if (explicit === \"cursor\" || explicit === \"provider:cursor\") {\r\n const binding = inventory.bindings.cursor;\r\n if (binding.ready) {\r\n return decisionForProvider({\r\n providerId: \"cursor\",\r\n binding,\r\n riskClass: risk,\r\n routingRule: \"orchestration:explicit_cursor\",\r\n model: explicitModel,\r\n });\r\n }\r\n }\r\n\r\n if (explicit === \"claude\" || explicit === \"provider:claude\") {\r\n const binding = inventory.bindings.claude;\r\n if (binding.ready) {\r\n return decisionForProvider({\r\n providerId: \"claude\",\r\n binding,\r\n riskClass: risk,\r\n routingRule: \"orchestration:explicit_claude\",\r\n model: explicitModel,\r\n });\r\n }\r\n }\r\n\r\n const selection = selectCheapestCapableProvider({ inventory, riskClass: risk });\r\n if (selection) {\r\n return decisionForProvider({\r\n providerId: selection.providerId,\r\n binding: selection.binding,\r\n riskClass: risk,\r\n routingRule: `orchestration:cost_aware_${selection.providerId}`,\r\n model: explicitModel,\r\n escalatedFrom: selection.escalatedFrom,\r\n escalatedReason: selection.escalatedReason,\r\n });\r\n }\r\n\r\n const codexBinding = inventory.bindings.codex;\r\n return decisionForProvider({\r\n providerId: fallbackProvider,\r\n binding: inventory.bindings[fallbackProvider],\r\n riskClass: risk,\r\n routingRule: codexBinding.ready\r\n ? \"orchestration:inventory_empty_default_cursor\"\r\n : \"orchestration:codex_unavailable_default_cursor\",\r\n model: explicitModel,\r\n ...(codexBinding.ready\r\n ? {}\r\n : { escalatedFrom: \"codex\", escalatedReason: codexBinding.note ?? \"codex oauth not bound\" }),\r\n });\r\n}\r\n", "import { closeSync, openSync } from \"node:fs\";\r\nimport { spawn, type StdioOptions } from \"node:child_process\";\r\nimport { scrubWorkerEnv } from \"../worker-env.js\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { preflightClaudeModel } from \"./model-preflight.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\n/** Provider default when no explicit model is passed \u2014 Sonnet, not Opus. */\r\nexport const CLAUDE_DEFAULT_MODEL = \"claude-sonnet-4-6\";\r\n\r\nexport const claudeProvider: WorkerProvider = {\r\n name: \"claude\",\r\n defaultModel: CLAUDE_DEFAULT_MODEL,\r\n preflightModel(model) {\r\n return preflightClaudeModel(model, CLAUDE_DEFAULT_MODEL);\r\n },\r\n start(opts) {\r\n // Defence in depth: the supervisor already preflights, but normalize here too\r\n // so the direct `worker start` path never hands the CLI a suffixed model.\r\n const preflight = preflightClaudeModel(opts.model, CLAUDE_DEFAULT_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`claude provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.model;\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const stdio: StdioOptions = [\"ignore\", stdoutFd, stderrFd];\r\n const child = spawn(\r\n \"claude\",\r\n [\r\n \"--model\",\r\n model,\r\n \"-p\",\r\n \"--verbose\",\r\n \"--permission-mode\",\r\n \"bypassPermissions\",\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--include-partial-messages\",\r\n opts.prompt,\r\n ],\r\n hiddenSpawnOptions({\r\n cwd: opts.worktreePath,\r\n detached: true,\r\n stdio,\r\n env: scrubWorkerEnv(process.env),\r\n }),\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\"failed to spawn claude worker process (is the `claude` CLI on PATH?)\");\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "// Provider model preflight + normalization.\r\n//\r\n// Agent CLIs (Cursor's `agent`, the Kynver Harness, the AgentOS board) expose\r\n// model identifiers with a reasoning-effort suffix \u2014 e.g. `claude-opus-4-7-thinking-high`.\r\n// The underlying `claude` CLI only accepts the *base* model id (`claude-opus-4-7`)\r\n// and exits immediately when handed the suffixed form, with no stream-json `result`\r\n// event. That left workers in a silent \"exited without a final result\" state.\r\n//\r\n// This module makes the requested model safe before spawn:\r\n// - normalize a known reasoning-effort suffix to the base model the CLI accepts;\r\n// - reject a *clearly foreign* provider model (e.g. an OpenAI/Gemini/Cursor model\r\n// handed to the `claude` provider) as a structured preflight failure instead of\r\n// spawning a doomed process.\r\n//\r\n// It is intentionally conservative: anything that looks like a plausible model for\r\n// the provider passes through untouched and the CLI remains the final judge (the\r\n// status-path exit classifier catches a late CLI rejection \u2014 see ../exit-classify.ts).\r\n\r\nexport interface ModelPreflightResult {\r\n /** False when the model/provider combination is structurally invalid. */\r\n ok: boolean;\r\n /** The model to launch with (normalized). Meaningful only when `ok`. */\r\n model: string;\r\n /** True when the requested model was rewritten to a different launch model. */\r\n normalized: boolean;\r\n /** The originally requested model, present only when it differs from `model`. */\r\n requested?: string;\r\n /** Human-readable note: the normalization explanation, or the rejection reason. */\r\n note?: string;\r\n}\r\n\r\n/**\r\n * Trailing reasoning-effort suffix that agent CLIs append to a base model id.\r\n * Matches `-thinking`, `-thinking-high|medium|low|minimal|max|none`, and the bare\r\n * effort tokens `-high|medium|low|minimal`. No base Kynver model id ends in any of\r\n * these tokens, so stripping a trailing match is safe.\r\n */\r\nconst REASONING_SUFFIX_RE =\r\n /-(?:thinking(?:-(?:high|medium|low|minimal|max|none))?|high|medium|low|minimal)$/i;\r\n\r\n/** Strip a single trailing reasoning-effort suffix from a model id. */\r\nexport function stripReasoningSuffix(model: string): string {\r\n return model.replace(REASONING_SUFFIX_RE, \"\");\r\n}\r\n\r\n/** Recognizable \"this is some other vendor's model\" prefixes. */\r\nconst FOREIGN_MODEL_RE = /^(?:gpt-|gpt5|o1|o3|o4|gemini-|grok-|composer|deepseek|llama|mistral|qwen|command-)/i;\r\n\r\n/** A model id that plausibly belongs to the Anthropic/Claude family. */\r\nfunction looksLikeClaudeModel(model: string): boolean {\r\n return /^claude[-_]/i.test(model) || /^(?:opus|sonnet|haiku)\\b/i.test(model);\r\n}\r\n\r\n/** Board/CLI aliases that are not valid Cursor agent model ids (fail after spawn). */\r\nconst CURSOR_MODEL_ALIASES = new Set([\"cursor\"]);\r\n\r\n/**\r\n * Normalize provider=cursor requests that pass model=cursor (or similar aliases)\r\n * to a real Cursor CLI model. `auto` is the supported default when the board\r\n * does not pin a specific composer id.\r\n */\r\nexport function normalizeCursorModelAlias(model: string): string | null {\r\n const key = model.trim().toLowerCase();\r\n if (CURSOR_MODEL_ALIASES.has(key)) return \"auto\";\r\n return null;\r\n}\r\n\r\n/**\r\n * Preflight a model for the `claude` provider. Normalizes reasoning-effort\r\n * suffixes; rejects models that clearly belong to another provider.\r\n */\r\nexport function preflightClaudeModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n\r\n const stripped = stripReasoningSuffix(requested).trim();\r\n const launch = stripped || defaultModel;\r\n\r\n if (FOREIGN_MODEL_RE.test(launch) || (!looksLikeClaudeModel(launch) && launch !== defaultModel)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is not a Claude model \u2014 the \"claude\" provider drives the ` +\r\n `Claude CLI, which only accepts claude-* model ids (got \"${launch}\"). ` +\r\n `Pick a Claude model or switch the worker provider.`,\r\n };\r\n }\r\n\r\n if (launch !== requested) {\r\n return {\r\n ok: true,\r\n model: launch,\r\n normalized: true,\r\n requested,\r\n note: `normalized model \"${requested}\" \u2192 \"${launch}\" (the Claude CLI rejects reasoning-effort suffixes)`,\r\n };\r\n }\r\n return { ok: true, model: launch, normalized: false };\r\n}\r\n\r\n/**\r\n * Preflight a model for the `cursor` provider. The Cursor agent owns its own\r\n * reasoning levels, so suffixed ids pass through; we only flag a Claude-family\r\n * model that was clearly meant for the `claude` provider.\r\n */\r\n/** Preflight for `codex` provider \u2014 accepts OpenAI/Codex model ids; rejects Claude-family ids. */\r\nexport function preflightCodexModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n if (looksLikeClaudeModel(requested)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is a Claude model but the worker provider is \"codex\". ` +\r\n `Switch the provider or pick a Codex/OpenAI model.`,\r\n };\r\n }\r\n return { ok: true, model: requested, normalized: false };\r\n}\r\n\r\nexport function preflightCursorModel(\r\n model: string | undefined,\r\n defaultModel: string,\r\n): ModelPreflightResult {\r\n const requested = (model ?? \"\").trim();\r\n if (!requested) {\r\n return { ok: true, model: defaultModel, normalized: false };\r\n }\r\n const aliasLaunch = normalizeCursorModelAlias(requested);\r\n if (aliasLaunch) {\r\n return {\r\n ok: true,\r\n model: aliasLaunch,\r\n normalized: true,\r\n requested,\r\n note:\r\n `normalized model \"${requested}\" \u2192 \"${aliasLaunch}\" ` +\r\n `(Cursor provider alias \u2014 use \"auto\" or a composer id, not \"cursor\")`,\r\n };\r\n }\r\n if (looksLikeClaudeModel(requested)) {\r\n return {\r\n ok: false,\r\n model: requested,\r\n normalized: false,\r\n requested,\r\n note:\r\n `model \"${requested}\" is a Claude model but the worker provider is \"cursor\". ` +\r\n `Switch the provider to \"claude\" or pick a Cursor model.`,\r\n };\r\n }\r\n return { ok: true, model: requested, normalized: false };\r\n}\r\n", "import { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport { spawn, type StdioOptions } from \"node:child_process\";\r\nimport { scrubWorkerEnv } from \"../worker-env.js\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { resolveCodexOrchestrationAdapter } from \"../orchestration-providers/codex-orchestration-adapter.js\";\r\nimport { preflightCodexModel } from \"./model-preflight.js\";\r\nimport { hermesCodexProvider } from \"./hermes-codex.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\n/**\r\n * Default Codex model for harness orchestration.\r\n * Override with `--model` flag or `KYNVER_CODEX_DEFAULT_MODEL` env var.\r\n * Cheaper alternatives: `o4-mini`, `gpt-4o-mini`.\r\n */\r\nexport function resolveCodexDefaultModel(): string {\r\n return process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim() || \"gpt-5.4\";\r\n}\r\n\r\nexport const CODEX_DEFAULT_MODEL = resolveCodexDefaultModel();\r\n\r\nfunction resolveCodexBin(): string {\r\n return (\r\n process.env.KYNVER_CODEX_BIN?.trim() ||\r\n process.env.CODEX_BIN?.trim() ||\r\n \"codex\"\r\n );\r\n}\r\n\r\nfunction codexWorkerEnv(): NodeJS.ProcessEnv {\r\n return scrubWorkerEnv({\r\n ...process.env,\r\n CI: \"1\",\r\n NO_COLOR: \"1\",\r\n });\r\n}\r\n\r\n/**\r\n * Build argv for `codex exec` headless orchestration.\r\n * Uses read-only sandbox + no approval prompts for low-risk harness slices.\r\n */\r\nexport function buildCodexExecArgv(model: string, prompt: string): string[] {\r\n return [\r\n \"exec\",\r\n \"--sandbox\",\r\n \"read-only\",\r\n \"--ask-for-approval\",\r\n \"never\",\r\n \"--model\",\r\n model,\r\n prompt,\r\n ];\r\n}\r\n\r\n/** When `script` exists, wrap codex to avoid detached-stdio silent exits (Codex CLI #19945). */\r\nfunction spawnCodexProcess(\r\n bin: string,\r\n args: string[],\r\n opts: Parameters<typeof spawn>[2],\r\n): ReturnType<typeof spawn> {\r\n const useScript = process.platform !== \"win32\" && existsSync(\"/usr/bin/script\");\r\n if (!useScript) {\r\n return spawn(bin, args, opts);\r\n }\r\n const quoted = [bin, ...args].map((a) => `'${a.replace(/'/g, `'\\\\''`)}'`).join(\" \");\r\n return spawn(\"script\", [\"-qfc\", quoted, \"/dev/null\"], opts);\r\n}\r\n\r\nexport const codexProvider: WorkerProvider = {\r\n name: \"codex\",\r\n defaultModel: CODEX_DEFAULT_MODEL,\r\n preflightModel(model) {\r\n return preflightCodexModel(model, CODEX_DEFAULT_MODEL);\r\n },\r\n start(opts) {\r\n const adapter = resolveCodexOrchestrationAdapter();\r\n if (adapter.path === \"hermes_openai_codex\") {\r\n return hermesCodexProvider.start(opts);\r\n }\r\n\r\n const preflight = preflightCodexModel(opts.model, CODEX_DEFAULT_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`codex provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.model;\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const stdio: StdioOptions = [\"ignore\", stdoutFd, stderrFd];\r\n const bin = resolveCodexBin();\r\n const args = buildCodexExecArgv(model, opts.prompt);\r\n const child = spawnCodexProcess(\r\n bin,\r\n args,\r\n hiddenSpawnOptions({\r\n cwd: opts.worktreePath,\r\n detached: true,\r\n shell: false,\r\n stdio,\r\n env: codexWorkerEnv(),\r\n }),\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\r\n `failed to spawn Codex worker (is \\`${bin}\\` on PATH? run \\`codex login\\` or set CODEX_API_KEY)`,\r\n );\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "import { closeSync, openSync } from \"node:fs\";\r\nimport { spawn, type StdioOptions } from \"node:child_process\";\r\nimport { scrubWorkerEnv } from \"../worker-env.js\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { resolveCliBin } from \"../orchestration-providers/oauth-binding-utils.js\";\r\nimport { preflightCodexModel } from \"./model-preflight.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\nimport { CODEX_DEFAULT_MODEL } from \"./codex.js\";\r\n\r\n/**\r\n * Default model when routing through Hermes openai-codex subscription.\r\n * Inherits `KYNVER_CODEX_DEFAULT_MODEL` override so both codex paths use the same cheaper model.\r\n */\r\nexport const HERMES_OPENAI_CODEX_DEFAULT_MODEL =\r\n process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim() || \"gpt-5.4\";\r\n\r\nfunction hermesWorkerEnv(): NodeJS.ProcessEnv {\r\n return scrubWorkerEnv({\r\n ...process.env,\r\n CI: \"1\",\r\n NO_COLOR: \"1\",\r\n HERMES_ACCEPT_HOOKS: process.env.HERMES_ACCEPT_HOOKS ?? \"1\",\r\n });\r\n}\r\n\r\n/**\r\n * Non-interactive Hermes chat argv for openai-codex subscription orchestration.\r\n * `-Q` suppresses banners; `--accept-hooks` avoids TTY approval prompts.\r\n */\r\nexport function buildHermesOpenAiCodexChatArgv(model: string, prompt: string): string[] {\r\n const maxTurns = process.env.KYNVER_HERMES_CODEX_MAX_TURNS?.trim() || \"40\";\r\n return [\r\n \"chat\",\r\n \"-q\",\r\n prompt,\r\n \"--provider\",\r\n \"openai-codex\",\r\n \"-m\",\r\n model,\r\n \"-Q\",\r\n \"--accept-hooks\",\r\n \"--max-turns\",\r\n maxTurns,\r\n \"--toolsets\",\r\n \"hermes-cli\",\r\n ];\r\n}\r\n\r\nexport const hermesCodexProvider: WorkerProvider = {\r\n name: \"hermes-codex\",\r\n defaultModel: HERMES_OPENAI_CODEX_DEFAULT_MODEL,\r\n preflightModel(model) {\r\n return preflightCodexModel(model, HERMES_OPENAI_CODEX_DEFAULT_MODEL);\r\n },\r\n start(opts) {\r\n const preflight = preflightCodexModel(opts.model, HERMES_OPENAI_CODEX_DEFAULT_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`hermes-codex provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.model;\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const stdio: StdioOptions = [\"ignore\", stdoutFd, stderrFd];\r\n const bin = resolveCliBin(\"hermes\", [\"KYNVER_HERMES_BIN\", \"HERMES_BIN\"]);\r\n const args = buildHermesOpenAiCodexChatArgv(model, opts.prompt);\r\n const child = spawn(\r\n bin,\r\n args,\r\n hiddenSpawnOptions({\r\n cwd: opts.worktreePath,\r\n detached: true,\r\n shell: false,\r\n stdio,\r\n env: hermesWorkerEnv(),\r\n }),\r\n );\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n\r\n if (!child.pid) {\r\n throw new Error(\r\n `failed to spawn Hermes openai-codex worker (is \\`${bin}\\` on PATH? run \\`hermes auth status openai-codex\\`)`,\r\n );\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "/** Local dispatch retry/cooldown limits. */\r\n\r\nfunction positiveInt(value: string | undefined, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nexport interface HarnessRetryLimits {\r\n /** Advisory max task attempts surfaced to operator/dispatch (default 4, matches AgentOS). */\r\n maxTaskAttempts: number;\r\n /** Minimum ms between dispatch starts for the same run (default 5s). */\r\n dispatchCooldownMs: number;\r\n}\r\n\r\nexport function readHarnessRetryLimits(): HarnessRetryLimits {\r\n return {\r\n maxTaskAttempts: positiveInt(process.env.KYNVER_MAX_TASK_ATTEMPTS, 4),\r\n dispatchCooldownMs: positiveInt(process.env.KYNVER_DISPATCH_COOLDOWN_MS, 5_000),\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, readJson, safeSlug } from \"./util.js\";\r\nimport { DEFAULT_DISPATCH_LEASE_MS } from \"./dispatch.js\";\r\nimport { resolveHarnessLeaseOwnerForRenewal } from \"./harness-lease-owner.js\";\r\nimport { resolveRunnerPresencePayload } from \"./runner-identity.js\";\r\n\r\nexport interface RenewActiveLeasesResult {\r\n renewed: string[];\r\n failed: Array<{ worker: string; reason: string }>;\r\n skipped: string[];\r\n}\r\n\r\nfunction workerRecord(runId: string, name: string): HarnessWorkerRecord | undefined {\r\n return readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(runId), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n}\r\n\r\n/**\r\n * Renew leases for board-linked workers whose process is still alive.\r\n * Prevents dispatch/reaper from reclaiming a task while a local worker runs.\r\n */\r\nexport async function renewActiveTaskLeases(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<RenewActiveLeasesResult> {\r\n const run = loadRun(runId);\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!agentOsId) {\r\n return { renewed: [], failed: [], skipped: [] };\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n { baseUrl: base },\r\n );\r\n const leaseDurationMs =\r\n Number(args.leaseMs) > 0 ? Math.floor(Number(args.leaseMs)) : DEFAULT_DISPATCH_LEASE_MS;\r\n const runnerId = resolveRunnerPresencePayload({ runId }).runnerId;\r\n\r\n const renewed: string[] = [];\r\n const failed: Array<{ worker: string; reason: string }> = [];\r\n const skipped: string[] = [];\r\n\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker?.taskId || !worker.agentOsId) {\r\n skipped.push(name);\r\n continue;\r\n }\r\n if (!isPidAlive(worker.pid)) {\r\n skipped.push(name);\r\n continue;\r\n }\r\n const status = computeWorkerStatus(worker);\r\n if (status.status === \"done\") {\r\n skipped.push(name);\r\n continue;\r\n }\r\n\r\n const leaseOwner = resolveHarnessLeaseOwnerForRenewal({\r\n runId,\r\n workerLeaseOwner: worker.leaseOwner ?? null,\r\n runnerId,\r\n });\r\n\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(worker.taskId)}/renew-lease`;\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n {\r\n leaseOwner,\r\n leaseDurationMs,\r\n ...(worker.leaseToken ? { leaseToken: worker.leaseToken } : {}),\r\n },\r\n { agentOsId, baseUrl: base },\r\n );\r\n if (res.ok) {\r\n renewed.push(name);\r\n continue;\r\n }\r\n const reason =\r\n res.response && typeof res.response === \"object\" && \"reason\" in res.response\r\n ? String((res.response as { reason?: unknown }).reason ?? `http ${res.status}`)\r\n : `http ${res.status}`;\r\n failed.push({ worker: name, reason });\r\n }\r\n\r\n return { renewed, failed, skipped };\r\n}\r\n\r\n/** True when this run already has a live worker bound to the same board task. */\r\nexport function hasLiveWorkerForTask(runId: string, taskId: string): boolean {\r\n const run = loadRun(runId);\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker || worker.taskId !== taskId) continue;\r\n if (!isPidAlive(worker.pid)) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.status === \"done\") continue;\r\n return true;\r\n }\r\n return false;\r\n}\r\n", "const HARNESS_LEASE_PREFIX = \"kynver-harness:\";\r\nconst RUNNER_MARKER = \"@runner:\";\r\n\r\nfunction trimOrNull(value: string | null | undefined): string | null {\r\n if (!value?.trim()) return null;\r\n return value.trim();\r\n}\r\n\r\n/** Run id embedded in a harness lease owner (`kynver-harness:<runId>` or `@runner:` suffix). */\r\nexport function parseHarnessLeaseRunId(leaseOwner: string | null | undefined): string | null {\r\n const owner = trimOrNull(leaseOwner);\r\n if (!owner?.startsWith(HARNESS_LEASE_PREFIX)) return null;\r\n const body = owner.slice(HARNESS_LEASE_PREFIX.length);\r\n const atRunner = body.indexOf(RUNNER_MARKER);\r\n if (atRunner >= 0) return body.slice(0, atRunner).trim() || null;\r\n return body.trim() || null;\r\n}\r\n\r\nexport function parseHarnessLeaseRunnerId(leaseOwner: string | null | undefined): string | null {\r\n const owner = trimOrNull(leaseOwner);\r\n if (!owner) return null;\r\n const idx = owner.indexOf(RUNNER_MARKER);\r\n if (idx < 0) return null;\r\n return owner.slice(idx + RUNNER_MARKER.length).trim() || null;\r\n}\r\n\r\n/** Stamp runner id into harness lease owner for cross-runner attribution. */\r\nexport function formatHarnessLeaseOwner(runId: string, runnerId: string): string {\r\n const run = runId.trim();\r\n const runner = runnerId.trim();\r\n return `${HARNESS_LEASE_PREFIX}${run}${RUNNER_MARKER}${runner}`;\r\n}\r\n\r\n/** True when `leaseOwner` belongs to the harness run identified by `runId`. */\r\nexport function harnessLeaseOwnerMatchesRun(\r\n leaseOwner: string | null | undefined,\r\n runId: string,\r\n): boolean {\r\n const expectedRun = trimOrNull(runId);\r\n if (!expectedRun) return false;\r\n return parseHarnessLeaseRunId(leaseOwner) === expectedRun;\r\n}\r\n\r\n/** Lease owner sent on renew/release \u2014 must match the row exactly. */\r\nexport function resolveHarnessLeaseOwnerForRenewal(input: {\r\n runId: string;\r\n workerLeaseOwner?: string | null;\r\n runnerId: string;\r\n}): string {\r\n const stored = trimOrNull(input.workerLeaseOwner);\r\n if (stored && harnessLeaseOwnerMatchesRun(stored, input.runId)) {\r\n return stored;\r\n }\r\n return formatHarnessLeaseOwner(input.runId, input.runnerId);\r\n}\r\n", "import os from \"node:os\";\r\nimport { normalizeWorkerPoolBoxKind } from \"./box-resource-snapshot-shared.js\";\r\n\r\nfunction trimOrNull(value: string | undefined): string | null {\r\n if (!value?.trim()) return null;\r\n return value.trim();\r\n}\r\n\r\nexport interface RunnerPresencePayload {\r\n runnerId: string;\r\n hostname: string | null;\r\n profile: string | null;\r\n harnessRepo: string | null;\r\n runId?: string | null;\r\n}\r\n\r\n/** True when this host belongs to the Ghost orchestrator pool (not Hermes Forge). */\r\nexport function isGhostPoolHost(env: NodeJS.ProcessEnv = process.env): boolean {\r\n const boxKind = normalizeWorkerPoolBoxKind(env.KYNVER_BOX_KIND ?? env.KYNVER_AGENT_OS_SLUG ?? \"\");\r\n if (boxKind === \"ghost\") return true;\r\n if (boxKind === \"forge\") return false;\r\n const runnerId = (env.KYNVER_RUNTIME_ID ?? env.OPENCLAW_RUNTIME_ID ?? \"\").trim().toLowerCase();\r\n if (runnerId.includes(\"forge\")) return false;\r\n if (runnerId.includes(\"ghost\") || runnerId.includes(\"openclaw\")) return true;\r\n return true;\r\n}\r\n\r\n/** Stable runner identity for multi-box AgentOS coordination. */\r\nexport function resolveRunnerPresencePayload(input: {\r\n runId?: string | null;\r\n env?: NodeJS.ProcessEnv;\r\n} = {}): RunnerPresencePayload {\r\n const env = input.env ?? process.env;\r\n const runnerId =\r\n trimOrNull(env.KYNVER_RUNTIME_ID) ??\r\n trimOrNull(env.OPENCLAW_RUNTIME_ID) ??\r\n trimOrNull(env.HOSTNAME) ??\r\n os.hostname();\r\n\r\n return {\r\n runnerId,\r\n hostname: trimOrNull(env.HOSTNAME) ?? os.hostname(),\r\n profile:\r\n trimOrNull(env.KYNVER_RUNNER_PROFILE) ?? trimOrNull(env.OPENCLAW_RUNNER_PROFILE),\r\n harnessRepo: trimOrNull(env.KYNVER_HARNESS_REPO) ?? trimOrNull(env.KYNVER_DEFAULT_REPO),\r\n runId: input.runId ?? null,\r\n };\r\n}\r\n", "import os from \"node:os\";\r\nimport { resolveBoxIdentity } from \"./box-identity.js\";\r\n\r\nexport { normalizeWorkerPoolBoxKind, resolveBoxIdentity } from \"./box-identity.js\";\r\n\r\n/** @deprecated Prefer resolveBoxIdentity \u2014 kept for callers that only need the kind string. */\r\nexport function resolveBoxKindFromEnv(env: NodeJS.ProcessEnv = process.env): string {\r\n return resolveBoxIdentity(env).boxKind;\r\n}\r\n\r\nexport function defaultBoxId(boxKind: string, hostLabel?: string | null): string {\r\n const host = (hostLabel ?? os.hostname()).trim().toLowerCase().replace(/\\s+/g, \"-\") || \"unknown-host\";\r\n return `${boxKind}:${host}`;\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { loadRun, runDirectory, saveRun, saveWorker } from \"./run-store.js\";\r\nimport { buildPrompt } from \"./prompt.js\";\r\nimport { readMaybeFile, safeSlug } from \"./util.js\";\r\nimport { resolveModelFallback, resolveWorkerLaunch } from \"./model-routing.js\";\r\nimport { DEFAULT_WORKER_PROVIDER } from \"./worker-provider-policy.js\";\r\nimport { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type {\r\n ContextEnvelopeEvidenceSnapshot,\r\n HarnessMemoryQualityCaptureSnapshot,\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n PersonaContextEvidenceSnapshot,\r\n} from \"./status.js\";\r\nimport { autoCompleteWorker, spawnCompletionSidecar } from \"./auto-complete.js\";\r\nimport { addWorktreeForRepairBranch } from \"./repair-target-worktree.js\";\r\nimport { resolveBoxIdentity } from \"./box-identity.js\";\r\nimport { defaultBoxId } from \"./box-resource-snapshot-shared.js\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport { resolveRunnerPresencePayload } from \"./runner-identity.js\";\r\n\r\nexport interface SpawnWorkerOptions {\r\n name: string;\r\n task: string;\r\n ownedPaths?: string[];\r\n model?: string;\r\n branch?: string;\r\n agentOsId?: string;\r\n taskId?: string;\r\n planId?: string;\r\n instructionPolicyMarkdown?: string | null;\r\n instructionPolicyFingerprint?: string | null;\r\n instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot | null;\r\n memoryQualityCapture?: HarnessMemoryQualityCaptureSnapshot | null;\r\n memoryQualityPromptMarkdown?: string | null;\r\n personaMarkdown?: string | null;\r\n personaSlug?: string | null;\r\n personaEvidence?: PersonaContextEvidenceSnapshot | null;\r\n contextEnvelopeMarkdown?: string | null;\r\n contextEnvelopeEvidence?: ContextEnvelopeEvidenceSnapshot | null;\r\n leaseOwner?: string;\r\n leaseToken?: string;\r\n dispatched?: boolean;\r\n provider?: string;\r\n routingRule?: string;\r\n requestedModel?: string;\r\n executorRef?: string;\r\n parentTaskId?: string;\r\n taskTitle?: string;\r\n taskPrUrl?: string;\r\n repairTargetPrUrl?: string;\r\n repairTargetBranch?: string;\r\n}\r\n\r\nexport function spawnWorkerProcess(run: HarnessRunRecord, opts: SpawnWorkerOptions): HarnessWorkerRecord {\r\n // Guard against missing/sentinel names. A missing --name used to reach here as\r\n // the literal string \"undefined\" (String(undefined)) \u2014 truthy, so the old\r\n // `if (!opts.name)` check passed and every unnamed worker collided on the key\r\n // \"undefined\", corrupting run.workers and the active-worker count.\r\n const rawName = typeof opts.name === \"string\" ? opts.name.trim() : \"\";\r\n if (!rawName || rawName === \"undefined\" || rawName === \"null\") {\r\n throw new Error(`worker name is required and must be a real identifier (got: ${JSON.stringify(opts.name)})`);\r\n }\r\n const name = safeSlug(rawName);\r\n if (run.workers?.[name]) throw new Error(`worker already exists in run ${run.id}: ${name}`);\r\n if (!opts.task) throw new Error(`missing task text for worker ${name}`);\r\n\r\n // Resolve the provider and preflight the model *before* any git/worktree work so\r\n // an invalid model/provider combination fails fast (no orphan worktree) and an\r\n // agent-CLI reasoning suffix (e.g. claude-opus-4-7-thinking-high) is normalized\r\n // to a model the CLI accepts instead of silently dying with no final result.\r\n const routing =\r\n opts.routingRule || opts.requestedModel\r\n ? {\r\n provider: opts.provider || DEFAULT_WORKER_PROVIDER,\r\n model: opts.model,\r\n rule: opts.routingRule || \"explicit:spawn\",\r\n requestedModel: opts.requestedModel ?? opts.model,\r\n }\r\n : resolveWorkerLaunch({\r\n explicitModel: opts.model,\r\n explicitProvider: opts.provider,\r\n explicitProviderIsOperatorOverride: Boolean(opts.provider?.trim()),\r\n });\r\n const provider = resolveWorkerProvider(routing.provider);\r\n let launchModel = routing.model;\r\n if (provider.preflightModel) {\r\n const preflight = provider.preflightModel(opts.model);\r\n if (!preflight.ok) {\r\n throw new Error(\r\n `model preflight failed for provider \"${provider.name}\": ${preflight.note ?? \"invalid model/provider combination\"}`,\r\n );\r\n }\r\n if (preflight.normalized) {\r\n console.error(`[supervisor] ${name}: ${preflight.note}`);\r\n }\r\n launchModel = preflight.model;\r\n }\r\n\r\n const { worktreesDir } = getPaths();\r\n const workerDir = path.join(runDirectory(run.id), \"workers\", name);\r\n mkdirSync(workerDir, { recursive: true });\r\n const worktreePath = path.join(worktreesDir, run.id, name);\r\n const repairBranch = opts.repairTargetBranch?.trim() || undefined;\r\n const branch = repairBranch || opts.branch || `agent/${run.id}/${name}`;\r\n if (existsSync(worktreePath)) throw new Error(`worktree path already exists: ${worktreePath}`);\r\n\r\n git(run.repo, [\"fetch\", \"origin\", \"--prune\"], { allowFailure: true });\r\n if (repairBranch) {\r\n addWorktreeForRepairBranch(run.repo, worktreePath, repairBranch);\r\n } else {\r\n git(run.repo, [\"worktree\", \"add\", \"-b\", branch, worktreePath, run.baseCommit], { throwError: true });\r\n }\r\n\r\n const stdoutPath = path.join(workerDir, \"stdout.jsonl\");\r\n const stderrPath = path.join(workerDir, \"stderr.log\");\r\n const heartbeatPath = path.join(workerDir, \"heartbeat.jsonl\");\r\n const prompt = buildPrompt({\r\n task: opts.task,\r\n ownedPaths: opts.ownedPaths || [],\r\n worktreePath,\r\n heartbeatPath,\r\n planId: opts.planId,\r\n taskId: opts.taskId,\r\n instructionPolicyMarkdown: opts.instructionPolicyMarkdown,\r\n memoryQualityMarkdown:\r\n opts.memoryQualityPromptMarkdown ??\r\n opts.memoryQualityCapture?.promptMarkdown ??\r\n null,\r\n personaMarkdown: opts.personaMarkdown,\r\n contextEnvelopeMarkdown: opts.contextEnvelopeMarkdown,\r\n model: launchModel,\r\n repairTargetPrUrl: opts.repairTargetPrUrl,\r\n repairTargetBranch: opts.repairTargetBranch ?? (repairBranch || undefined),\r\n });\r\n\r\n const prevHarnessTaskId = process.env.KYNVER_HARNESS_TASK_ID;\r\n const prevHarnessAgentOsId = process.env.KYNVER_HARNESS_AGENT_OS_ID;\r\n if (opts.taskId) process.env.KYNVER_HARNESS_TASK_ID = String(opts.taskId);\r\n if (opts.agentOsId) process.env.KYNVER_HARNESS_AGENT_OS_ID = String(opts.agentOsId);\r\n\r\n let started;\r\n try {\r\n started = provider.start({\r\n name,\r\n task: opts.task,\r\n ownedPaths: opts.ownedPaths,\r\n model: launchModel,\r\n branch,\r\n worktreePath,\r\n workerDir,\r\n stdoutPath,\r\n stderrPath,\r\n heartbeatPath,\r\n prompt,\r\n });\r\n } catch (error) {\r\n git(run.repo, [\"worktree\", \"remove\", \"--force\", worktreePath], { allowFailure: true });\r\n git(run.repo, [\"branch\", \"-D\", branch], { allowFailure: true });\r\n throw error;\r\n } finally {\r\n if (prevHarnessTaskId === undefined) delete process.env.KYNVER_HARNESS_TASK_ID;\r\n else process.env.KYNVER_HARNESS_TASK_ID = prevHarnessTaskId;\r\n if (prevHarnessAgentOsId === undefined) delete process.env.KYNVER_HARNESS_AGENT_OS_ID;\r\n else process.env.KYNVER_HARNESS_AGENT_OS_ID = prevHarnessAgentOsId;\r\n }\r\n\r\n const model = resolveModelFallback(started.model, launchModel, provider.defaultModel);\r\n const config = loadUserConfig();\r\n const boxIdentity = resolveBoxIdentity(process.env, config);\r\n const runtimeId = resolveRunnerPresencePayload().runnerId;\r\n const boxId = defaultBoxId(boxIdentity.boxKind);\r\n const worker: HarnessWorkerRecord = {\r\n name,\r\n runId: run.id,\r\n status: \"running\",\r\n pid: started.pid,\r\n model,\r\n branch,\r\n worktreePath,\r\n workerDir,\r\n stdoutPath,\r\n stderrPath,\r\n heartbeatPath,\r\n ownedPaths: opts.ownedPaths,\r\n ...(opts.agentOsId ? { agentOsId: String(opts.agentOsId) } : {}),\r\n ...(opts.taskId ? { taskId: String(opts.taskId) } : {}),\r\n ...(opts.planId ? { planId: String(opts.planId) } : {}),\r\n ...(opts.instructionPolicyFingerprint\r\n ? { instructionPolicyFingerprint: String(opts.instructionPolicyFingerprint) }\r\n : {}),\r\n ...(opts.instructionPolicyEvidence ? { instructionPolicyEvidence: opts.instructionPolicyEvidence } : {}),\r\n ...(opts.memoryQualityCapture ? { memoryQualityCapture: opts.memoryQualityCapture } : {}),\r\n ...(opts.personaSlug ? { personaSlug: String(opts.personaSlug) } : {}),\r\n ...(opts.personaEvidence ? { personaEvidence: opts.personaEvidence } : {}),\r\n ...(opts.contextEnvelopeEvidence ? { contextEnvelopeEvidence: opts.contextEnvelopeEvidence } : {}),\r\n ...(opts.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\r\n ...(opts.leaseToken ? { leaseToken: String(opts.leaseToken) } : {}),\r\n ...(opts.dispatched ? { dispatched: true } : {}),\r\n ...(!opts.agentOsId || !opts.taskId ? { localOnly: true } : {}),\r\n routingRule: routing.rule,\r\n ...(routing.requestedModel ? { requestedModel: routing.requestedModel } : {}),\r\n ...(routing.orchestrationAudit ? { orchestrationAudit: routing.orchestrationAudit } : {}),\r\n ...(opts.executorRef ? { executorRef: String(opts.executorRef) } : {}),\r\n ...(opts.parentTaskId ? { parentTaskId: String(opts.parentTaskId) } : {}),\r\n ...(opts.taskTitle ? { taskTitle: String(opts.taskTitle) } : {}),\r\n ...(opts.taskPrUrl ? { taskPrUrl: String(opts.taskPrUrl) } : {}),\r\n ...(opts.repairTargetPrUrl ? { repairTargetPrUrl: String(opts.repairTargetPrUrl) } : {}),\r\n ...(opts.repairTargetBranch ? { repairTargetBranch: String(opts.repairTargetBranch) } : {}),\r\n boxKind: boxIdentity.boxKind,\r\n boxId,\r\n runtimeId,\r\n startedAt: new Date().toISOString(),\r\n };\r\n\r\n saveWorker(run.id, worker);\r\n run.workers = { ...(run.workers || {}), [name]: { workerDir, statusPath: path.join(workerDir, \"worker.json\") } };\r\n run.status = \"running\";\r\n saveRun(run);\r\n\r\n // For a board-linked worker (named `kynver worker start` clean retry OR\r\n // dispatch-spawn), detach a per-worker completion sidecar so the linked\r\n // AgentTask still advances even when no per-run `kynver daemon` is running.\r\n // Pre-fix evidence: run 20260525t094246z-retry-dalton-post-merge-review-clean\r\n // produced a finalResult but task 2a63e02f\u2026 stayed `running` because nothing\r\n // POSTed `/harness/completion`. Best-effort: a failed sidecar spawn must not\r\n // crash a successful worker spawn \u2014 the daemon/watchdog can still replay.\r\n if (worker.agentOsId && worker.taskId) {\r\n let sidecarSpawned: ReturnType<typeof spawnCompletionSidecar> | undefined;\r\n try {\r\n sidecarSpawned = spawnCompletionSidecar({\r\n runId: run.id,\r\n workerName: name,\r\n workerDir,\r\n agentOsId: worker.agentOsId,\r\n });\r\n } catch (error) {\r\n // Sidecar spawn threw (e.g., permissions, file system error). Record the\r\n // failure as a completionBlocker so the worker routes to \"blocked\" instead\r\n // of leaving the task stuck in \"running\" when the worker exits.\r\n const reason = `completion sidecar failed to spawn: ${(error as Error).message}`;\r\n worker.completionBlocker = reason;\r\n saveWorker(run.id, worker);\r\n }\r\n // spawnCompletionSidecar can also return undefined on failure without throwing\r\n // (CLI path missing, log-file open failure, spawn failure). Surface this too.\r\n if (!sidecarSpawned) {\r\n const reason = \"completion sidecar failed to spawn (CLI not found or spawn error)\";\r\n worker.completionBlocker = reason;\r\n worker.completionSidecarSpawnFailedAt = new Date().toISOString();\r\n saveWorker(run.id, worker);\r\n } else if (sidecarSpawned.pid) {\r\n worker.completionSidecarPid = sidecarSpawned.pid;\r\n saveWorker(run.id, worker);\r\n }\r\n }\r\n return worker;\r\n}\r\n\r\nexport async function startWorker(args: Record<string, string | boolean>): Promise<void> {\r\n const run = loadRun(String(args.run));\r\n const name = typeof args.name === \"string\" ? args.name.trim() : \"\";\r\n if (!name) {\r\n console.error(\"worker start failed: --name is required\");\r\n process.exit(1);\r\n }\r\n const task = args.task ? String(args.task) : readMaybeFile(args.taskFile ? String(args.taskFile) : undefined);\r\n if (!task) {\r\n console.error(\"missing --task or --task-file\");\r\n process.exit(1);\r\n }\r\n const boardLinked = Boolean(args.agentOsId && args.taskId);\r\n const explicitLocalOnly = args.localOnly === true || args.localOnly === \"true\";\r\n if (!boardLinked && !explicitLocalOnly && (args.agentOsId || args.taskId)) {\r\n console.error(\r\n \"worker start: board-linked workers require both --agent-os-id and --task-id (or pass --local-only for direct runs)\",\r\n );\r\n process.exit(1);\r\n }\r\n const wait = args.wait === true || args.wait === \"true\";\r\n let worker: HarnessWorkerRecord | undefined;\r\n try {\r\n worker = spawnWorkerProcess(run, {\r\n name,\r\n task,\r\n ownedPaths: args.owned ? String(args.owned).split(\",\").map((s) => s.trim()).filter(Boolean) : [],\r\n model: args.model ? String(args.model) : undefined,\r\n branch: args.branch ? String(args.branch) : undefined,\r\n agentOsId: args.agentOsId ? String(args.agentOsId) : undefined,\r\n taskId: args.taskId ? String(args.taskId) : undefined,\r\n provider: args.provider ? String(args.provider) : undefined,\r\n });\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId: run.id,\r\n worker: worker.name,\r\n pid: worker.pid,\r\n branch: worker.branch,\r\n worktreePath: worker.worktreePath,\r\n workerDir: worker.workerDir,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (error) {\r\n console.error(`worker start failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n\r\n if (!wait || !worker) return;\r\n\r\n // Block until the worker finishes and post completion to the AgentOS board.\r\n // The detached sidecar (spawned by spawnWorkerProcess) is still a fallback in\r\n // case this process is killed before the worker finishes. Both posting the same\r\n // completion is safe \u2014 tryCompleteWorker is idempotent on the backend.\r\n const outcome = await autoCompleteWorker({\r\n run: String(args.run),\r\n name: worker.name,\r\n ...(worker.agentOsId ? { agentOsId: worker.agentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: String(args.baseUrl) } : {}),\r\n ...(args.secret ? { secret: String(args.secret) } : {}),\r\n });\r\n console.error(JSON.stringify({ event: \"start_wait_outcome\", ...outcome }));\r\n if (outcome.outcome === \"timed_out\") {\r\n process.exitCode = 1;\r\n }\r\n}\r\n", "// Runtime mirror \u2014 repair workers must update the original target PR branch.\r\n\r\nconst HARNESS_CONTRACT_RE = /<!--\\s*harness-contract:\\s*(\\{[\\s\\S]*?\\})\\s*-->/i;\r\nconst FIX_EXECUTOR_REF_PREFIX = \"next-action-fix:\";\r\n\r\nexport interface HarnessRepairTarget {\r\n targetPrUrl: string;\r\n targetPrBranch: string | null;\r\n}\r\n\r\nexport interface HarnessRepairTargetContract {\r\n repairEnforceOriginalPr: boolean;\r\n targetPrUrl: string | null;\r\n targetPrBranch: string | null;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\nexport function normalizePrUrl(url: string): string | null {\r\n const m = url\r\n .trim()\r\n .match(/github\\.com\\/([^/]+\\/[^/]+)\\/(?:pull|pulls)\\/(\\d+)/i);\r\n if (!m) return trimOrNull(url);\r\n return `https://github.com/${m[1]}/pull/${m[2]}`;\r\n}\r\n\r\nexport function isHarnessRepairTask(task: {\r\n title?: string;\r\n executorRef?: string | null;\r\n}): boolean {\r\n const title = (task.title ?? \"\").trim().toLowerCase();\r\n if (title.startsWith(\"fix:\") || title.startsWith(\"repair:\")) return true;\r\n const ref = (task.executorRef ?? \"\").toLowerCase();\r\n if (ref.startsWith(FIX_EXECUTOR_REF_PREFIX)) return true;\r\n if (ref.includes(\"repair\") || ref.includes(\"unblock\")) return true;\r\n return false;\r\n}\r\n\r\nexport function parseRepairTargetContractFromDescription(\r\n description: string | null | undefined,\r\n): HarnessRepairTargetContract {\r\n const empty: HarnessRepairTargetContract = {\r\n repairEnforceOriginalPr: false,\r\n targetPrUrl: null,\r\n targetPrBranch: null,\r\n };\r\n if (!description) return empty;\r\n const m = description.match(HARNESS_CONTRACT_RE);\r\n if (!m?.[1]) return empty;\r\n try {\r\n const parsed = JSON.parse(m[1]) as Record<string, unknown>;\r\n const url = trimOrNull(\r\n String(parsed.targetPrUrl ?? parsed.target_pr_url ?? \"\"),\r\n );\r\n const branch = trimOrNull(\r\n String(parsed.targetPrBranch ?? parsed.target_pr_branch ?? \"\"),\r\n );\r\n const enforce =\r\n parsed.repairEnforceOriginalPr === true ||\r\n parsed.repair_enforce_original_pr === true;\r\n return {\r\n repairEnforceOriginalPr: enforce || Boolean(url),\r\n targetPrUrl: url ? normalizePrUrl(url) : null,\r\n targetPrBranch: branch,\r\n };\r\n } catch {\r\n return empty;\r\n }\r\n}\r\n\r\nexport function resolveHarnessRepairTargetFromTask(task: {\r\n title?: string;\r\n description?: string | null;\r\n executorRef?: string | null;\r\n prUrl?: string | null;\r\n branch?: string | null;\r\n}): HarnessRepairTarget | null {\r\n if (!isHarnessRepairTask(task)) return null;\r\n const block = parseRepairTargetContractFromDescription(task.description);\r\n const taskPr = task.prUrl ? normalizePrUrl(task.prUrl) : null;\r\n const targetPrUrl = block.targetPrUrl ?? taskPr;\r\n if (!targetPrUrl) return null;\r\n return {\r\n targetPrUrl,\r\n targetPrBranch: block.targetPrBranch ?? trimOrNull(task.branch),\r\n };\r\n}\r\n\r\nexport function repairTargetPromptLines(target: HarnessRepairTarget): string[] {\r\n return [\r\n \"Repair target PR policy:\",\r\n `- Work on the existing target PR branch \u2014 do not open a duplicate repair PR by default.`,\r\n `- Canonical target PR: ${target.targetPrUrl}`,\r\n ...(target.targetPrBranch\r\n ? [`- Canonical target branch: \\`${target.targetPrBranch}\\` (checkout is already on this branch).`]\r\n : []),\r\n `- Reconcile ${target.targetPrUrl} in structured finalResult.targetPrReconciliation.`,\r\n `- Only supersede the original when the branch is inaccessible: set supersedesOriginalTargetPr: true with reason and close/comment on the original PR.`,\r\n ];\r\n}\r\n", "import { repairTargetPromptLines } from \"./harness-repair-target.js\";\r\n\r\nexport function buildPrompt(input: {\r\n task: string;\r\n ownedPaths: string[];\r\n worktreePath: string;\r\n heartbeatPath: string;\r\n planId?: string;\r\n taskId?: string;\r\n /** Lane A operating rules from dispatch-next `harnessWorkerContext`. */\r\n instructionPolicyMarkdown?: string | null;\r\n /** Anchored task context-envelope persona block (required when task has personaSlug). */\r\n personaMarkdown?: string | null;\r\n /** Compact task context envelope (non-persona tasks or supplemental). */\r\n contextEnvelopeMarkdown?: string | null;\r\n /** P7 memory-quality trace summary + live-verification nudges (privacy-safe). */\r\n memoryQualityMarkdown?: string | null;\r\n /** When set, Haiku/compact models get a shorter harness instruction block. */\r\n model?: string;\r\n repairTargetPrUrl?: string;\r\n repairTargetBranch?: string;\r\n}): string {\r\n const ownership = input.ownedPaths.length\r\n ? `Owned paths: ${input.ownedPaths.join(\", \")}. Do not edit outside these paths without stopping and reporting why.`\r\n : \"Owned paths: unrestricted for this worker, but keep edits tightly scoped.\";\r\n const compact = Boolean(input.model?.toLowerCase().includes(\"haiku\"));\r\n const progressLines = compact\r\n ? [\r\n \"Plan progress: when planId is set, use `kynver plan progress` for in_progress|running|partial|blocked. Use `in_progress` for agent-loop current focus; use `running` only when an executor holds a lease. Row `done` is MCP/session only.\",\r\n input.planId ? `Active planId: ${input.planId}` : \"No planId on this worker.\",\r\n ]\r\n : [\r\n \"Structured plan progress (required when planId is set):\",\r\n \"- Harness checkpoints only: `kynver plan progress --plan <planId> --row <rowKey> --role implementer --status in_progress|running|partial|blocked` (the by-id harness route rejects `done` and confirm events). Prefer `in_progress` at turn start for current focus; daemon sets `running` on dispatch.\",\r\n \"- When a slice is finished, emit `partial` with evidence (`--evidence pr:<url>`, `--evidence path:<file>`, or `--evidence command:<cmd>`). Do not propose or confirm row `done` from the worker CLI.\",\r\n \"- Propose/confirm row `done` is MCP/session only: chat agents use `agent_os_plan_progress_event_append` on the slug route (implementer proposes with `proposed: true`; report_reviewer/deep_reviewer confirm with `proposed: false`).\",\r\n \"- When blocked on operator/Ghost/runtime review, create a linked review task (MCP `agent_os_plan_review_task_create` or API) and pass `--review-task <taskId>`.\",\r\n \"- Before the completion report: mark completion-report rows partial with evidence; do not skip report review.\",\r\n \"- After implementation: wait for report_reviewer then deep_reviewer confirmation (via MCP/session agents) before follow-up rows close.\",\r\n input.planId\r\n ? `Active planId: ${input.planId}${input.taskId ? ` \u00B7 taskId: ${input.taskId}` : \"\"}`\r\n : \"No planId on this worker \u2014 still emit progress when you touch plan-scoped work.\",\r\n ];\r\n const mergeGateLines = compact\r\n ? [\r\n \"Merge-gate cost control: do not use Vercel previews/builds for PR verification. Run `node scripts/agent-os-pr-merge-gate.mjs --pr <url> --agent-os-id <id>` (or `verify-pr-local.mjs --from-pr` + POST pr-merge-gate/refresh) before any GitHub Actions run; request merge-gate only via refresh then POST pr-merge-gate/request-run (one Actions run per PR head unless human approves extra). Per-PR Vercel preview builds are off by default \u2014 production deploy runs via release batch after merge.\",\r\n ]\r\n : [\r\n \"GitHub Actions merge-gate cost control (Kynver/Hermes PRs):\",\r\n \"- Prefer local cached package verification (`node scripts/verify-pr-local.mjs --emit-json`) before GitHub Actions. Do not use Vercel previews/builds as PR evidence.\",\r\n \"- Do not push empty commits to re-trigger CI. One budgeted merge-gate Actions run per PR candidate (head SHA) unless a human approves extra.\",\r\n \"- Record evidence: POST `/api/agent-os/by-id/<agentOsId>/pr-merge-gate/refresh` with prUrl + local payloads.\",\r\n \"- Request the final Actions run only when local verification is green: POST `.../pr-merge-gate/request-run` (applies `merge-gate` label).\",\r\n \"- Empty failed Actions jobs (no runner/steps/logs) are infra/quota \u2014 do not enter repair loops; escalate to operator.\",\r\n \"- After merge, landed PRs accumulate into a release batch; run batch verification then manual Vercel production deploy from Command Center (release train). PR landing completes with: verification complete, awaiting release batch/deploy.\",\r\n ];\r\n const planArtifactLines = compact\r\n ? [\r\n \"Plan artifacts: when authoring/revising docs/superpowers/plans/, open a GitHub PR early and iterate from that PR branch; do not leave the canonical plan only in the harness worktree.\",\r\n ]\r\n : [\r\n \"Plan persistence: use AgentOS API/MCP first; on approval/auth/network/server/interruption failures run `kynver plan persist` (queues under ~/.kynver/state/plan-outbox) then `kynver plan outbox drain` when connectivity returns. Never treat /tmp-only files as persisted plans.\",\r\n \"PR-first plan artifacts (when authoring or revising docs/superpowers/plans/):\",\r\n \"- Before substantial plan drafting: create a feature branch, open a GitHub PR (draft OK), commit and push the plan file \u2014 do not leave the canonical plan only in this harness worktree.\",\r\n \"- Iterate review on that PR branch; link prUrl on the AgentOS task and plan progress evidence (`--evidence pr:<url>`).\",\r\n \"- See docs/superpowers/plans/2026-05-25-pr-first-plan-artifact-preservation.md for the full checklist.\",\r\n ];\r\n return [\r\n \"You are running under the Kynver AgentOS runtime.\",\r\n \"Immediately state your plan before editing.\",\r\n ownership,\r\n `Worktree: ${input.worktreePath}`,\r\n `Progress heartbeat file: ${input.heartbeatPath}`,\r\n \"After each major step, append one JSON line to the heartbeat file with fields: ts, phase, summary, changedFiles, blocker.\",\r\n \"Final response must include files changed, verification commands, and unresolved risks.\",\r\n \"Structured final result (recommended): record completion as JSON with summary, laneExpertise { whatChanged, why, files, prUrls, verification, risks, blockers, lessonsLearned, laneGuidance }, and targetPrReconciliation [{ prUrl, outcome: merged|skipped|blocked, mergeCommit?, reason? }] for every target PR on landing-only tasks. Persona-attributed tasks: put repeatable lane lessons in lessonsLearned/laneGuidance (with evidence); substantive rows auto-persist as persona-scoped Lane A rules \u2014 global cross-lane policy stays in owner memory, not worker lessons.\",\r\n \"Completion handoff (required): before you stop, ensure the harness records a final result \u2014 summarize outcome in your last message and append a heartbeat line with phase `complete`. If you leave uncommitted changes or committed work without a PR, the orchestrator blocks completion until a GitHub PR exists (or you discard/commit cleanly). One-off helper scripts must be removed (`kynver worker discard-disposable --path <file>`) or committed before completion \u2014 maintenance/board-drain workers are not exempt. Exiting with only dirty files and no PR routes to salvage review, not production review.\",\r\n \"PR-ready handoff: for substantial implementation work, commit, push, and open a GitHub PR (draft OK) on your branch before finishing \u2014 or rely on the harness to run `gh pr create` at completion when `gh` is authenticated.\",\r\n \"Expert review / production-review workers (Dalton/Lorentz, plan-review-task, scheduledJob reviewer children): do NOT open new implementation PRs \u2014 review the parent task's existing PR and record reviewVerdict in finalResult; landing-contract targetPrReconciliation does not apply.\",\r\n \"Worker resource guard: do not run full monorepo verification (`npm run typecheck`, `npm run build`, or equivalent) from this worker lane unless an operator explicitly requests it. Use targeted checks for touched paths and rely on CI/operator lanes for heavy gates. When heavy verification is required, route through `node scripts/verify-pr-local.mjs` or `kynver harness verify` \u2014 they acquire the global heavy-verification lease so parallel workers do not launch simultaneous typechecks.\",\r\n \"npm publish boundary: do not run `npm publish`, do not republish `@kynver-app/*` packages, and do not block on an operator to publish. When you need newer runtime code than npm, use this repo checkout (`npm run kynver:build`, `npm run kynver`) and record evidence: packages/kynver-runtime/package.json version + git ref in your completion report.\",\r\n \"If verification fails (including OOM), append a heartbeat line immediately with the last command, failure reason, dirty-file status, commit/PR handoff state, and next action so recovery does not require log spelunking.\",\r\n \"Landing-wrapper cleanup on a git ref: use `node scripts/agent-os-land-pr-cleanup-verify.mjs --ref origin/main` (JSON, exit 0). Do not use `git show <ref>:scripts/agent-os-land-pr.mjs | rg \u2026` \u2014 ripgrep exit 1 when markers are absent is reported as a failed command in Telegram/status tooling.\",\r\n \"\",\r\n ...progressLines,\r\n \"\",\r\n ...mergeGateLines,\r\n \"\",\r\n ...planArtifactLines,\r\n \"\",\r\n ...(input.contextEnvelopeMarkdown?.trim()\r\n ? [input.contextEnvelopeMarkdown.trim(), \"\"]\r\n : []),\r\n ...(input.personaMarkdown?.trim()\r\n ? [input.personaMarkdown.trim(), \"\"]\r\n : []),\r\n ...(input.instructionPolicyMarkdown?.trim()\r\n ? [\"Operating rules (Lane A \u2014 from AgentOS memory policy):\", input.instructionPolicyMarkdown.trim(), \"\"]\r\n : []),\r\n ...(input.memoryQualityMarkdown?.trim()\r\n ? [input.memoryQualityMarkdown.trim(), \"\"]\r\n : []),\r\n ...(input.repairTargetPrUrl\r\n ? [\r\n ...repairTargetPromptLines({\r\n targetPrUrl: input.repairTargetPrUrl,\r\n targetPrBranch: input.repairTargetBranch ?? null,\r\n }),\r\n \"\",\r\n ]\r\n : []),\r\n \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { loadUserConfig } from \"../config.js\";\r\nimport { resolveConfiguredWorkerProvider } from \"../worker-provider-policy.js\";\r\nimport { claudeProvider } from \"./claude.js\";\r\nimport { codexProvider } from \"./codex.js\";\r\nimport { cursorProvider } from \"./cursor.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\nconst BUILTIN: Record<string, WorkerProvider> = {\r\n claude: claudeProvider,\r\n codex: codexProvider,\r\n cursor: cursorProvider,\r\n};\r\n\r\nlet overrideProvider: WorkerProvider | null = null;\r\n\r\n/** Test hook \u2014 inject a stub provider without spawning Claude. */\r\nexport function setWorkerProviderForTests(provider: WorkerProvider | null): void {\r\n overrideProvider = provider;\r\n}\r\n\r\nexport function resolveWorkerProvider(name?: string): WorkerProvider {\r\n if (overrideProvider) return overrideProvider;\r\n const explicit = name?.trim();\r\n if (explicit) {\r\n const provider = BUILTIN[explicit];\r\n if (!provider) {\r\n throw new Error(`unknown worker provider \"${explicit}\" \u2014 supported: ${Object.keys(BUILTIN).join(\", \")}`);\r\n }\r\n return provider;\r\n }\r\n const configured = resolveConfiguredWorkerProvider(loadUserConfig().workerProvider);\r\n const provider = BUILTIN[configured];\r\n if (!provider) {\r\n throw new Error(`unknown worker provider \"${configured}\" \u2014 supported: ${Object.keys(BUILTIN).join(\", \")}`);\r\n }\r\n return provider;\r\n}\r\n", "import { closeSync, existsSync, mkdirSync, openSync, statSync, unlinkSync } from \"node:fs\";\r\nimport { spawn, type ChildProcess, type StdioOptions } from \"node:child_process\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { scrubWorkerEnv } from \"../worker-env.js\";\r\nimport { preflightCursorModel } from \"./model-preflight.js\";\r\nimport { resolveWindowsCursorBundled } from \"./cursor-windows.js\";\r\nimport type { WorkerProvider } from \"./types.js\";\r\n\r\nconst DEFAULT_CURSOR_MODEL = \"composer-2.5\";\r\nconst DEFAULT_CURSOR_START_LOCK_HOLD_MS = 15_000;\r\nconst DEFAULT_CURSOR_START_LOCK_TIMEOUT_MS = 60_000;\r\nconst DEFAULT_CURSOR_START_LOCK_STALE_MS = 30_000;\r\n\r\nexport interface CursorSpawnTarget {\r\n executable: string;\r\n prefixArgs: string[];\r\n shell: boolean;\r\n detached: boolean;\r\n bundledVersionDir?: string;\r\n}\r\n\r\nfunction bundledSpawnTarget(nodeExe: string, indexJs: string, versionDir?: string): CursorSpawnTarget {\r\n return {\r\n executable: nodeExe,\r\n prefixArgs: [indexJs],\r\n shell: false,\r\n detached: true,\r\n bundledVersionDir: versionDir,\r\n };\r\n}\r\n\r\n/** Resolve a headless Windows spawn target (node.exe + index.js), never agent.cmd via shell. */\r\nexport function resolveCursorSpawn(agentBin: string): CursorSpawnTarget {\r\n if (process.platform === \"win32\") {\r\n const isCursorWrapper = /\\.(cmd|bat)$/i.test(agentBin);\r\n const isBundledNode =\r\n /node\\.exe$/i.test(agentBin) && existsSync(path.join(path.dirname(agentBin), \"index.js\"));\r\n const isDefaultShim = agentBin === \"agent\";\r\n\r\n if (isCursorWrapper || isBundledNode || isDefaultShim) {\r\n const bundled = isCursorWrapper\r\n ? resolveWindowsCursorBundled(path.dirname(agentBin))\r\n : isBundledNode\r\n ? {\r\n nodeExe: agentBin,\r\n indexJs: path.join(path.dirname(agentBin), \"index.js\"),\r\n versionDir: path.dirname(agentBin),\r\n }\r\n : resolveWindowsCursorBundled();\r\n\r\n if (bundled) {\r\n return bundledSpawnTarget(bundled.nodeExe, bundled.indexJs, bundled.versionDir);\r\n }\r\n\r\n throw new Error(\r\n \"Cursor Agent on Windows has no headless bundled node.exe under %LOCALAPPDATA%\\\\cursor-agent\\\\versions\\\\\u2026. \" +\r\n \"Run `agent login` / update Cursor Agent CLI, use `--provider claude`, or set KYNVER_CURSOR_AGENT_ROOT to the cursor-agent folder.\",\r\n );\r\n }\r\n }\r\n\r\n return { executable: agentBin, prefixArgs: [], shell: false, detached: true };\r\n}\r\n\r\nfunction resolveAgentBin(): string {\r\n const configured =\r\n process.env.KYNVER_CURSOR_AGENT_BIN?.trim() ||\r\n process.env.CURSOR_AGENT_BIN?.trim();\r\n if (configured) return configured;\r\n\r\n if (process.platform === \"win32\") {\r\n const bundled = resolveWindowsCursorBundled(\r\n process.env.KYNVER_CURSOR_AGENT_ROOT?.trim() || undefined,\r\n );\r\n if (bundled) return bundled.nodeExe;\r\n\r\n const localAgent = path.join(process.env.LOCALAPPDATA || \"\", \"cursor-agent\", \"agent.cmd\");\r\n if (existsSync(localAgent)) return localAgent;\r\n }\r\n\r\n return \"agent\";\r\n}\r\n\r\nfunction cursorWorkerEnv(agentBin: string, spawnTarget: CursorSpawnTarget): NodeJS.ProcessEnv {\r\n return scrubWorkerEnv({\r\n ...process.env,\r\n CI: \"1\",\r\n NO_COLOR: \"1\",\r\n ...(spawnTarget.bundledVersionDir\r\n ? { CURSOR_INVOKED_AS: path.basename(agentBin) || \"agent.cmd\" }\r\n : {}),\r\n });\r\n}\r\n\r\nfunction sleepSync(ms: number): void {\r\n if (ms <= 0) return;\r\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\r\n}\r\n\r\nfunction positiveIntEnv(name: string, fallback: number): number {\r\n const raw = process.env[name];\r\n if (!raw) return fallback;\r\n const parsed = Number(raw);\r\n return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : fallback;\r\n}\r\n\r\nfunction cursorStartLockPath(): string {\r\n const root = process.env.KYNVER_CURSOR_START_LOCK_DIR?.trim() || path.join(os.homedir(), \".kynver\", \"locks\");\r\n mkdirSync(root, { recursive: true });\r\n return path.join(root, \"cursor-agent-start.lock\");\r\n}\r\n\r\nfunction acquireCursorStartLock(): () => void {\r\n if (process.env.KYNVER_CURSOR_START_LOCK === \"0\") return () => {};\r\n\r\n const lockPath = cursorStartLockPath();\r\n const timeoutMs = positiveIntEnv(\"KYNVER_CURSOR_START_LOCK_TIMEOUT_MS\", DEFAULT_CURSOR_START_LOCK_TIMEOUT_MS);\r\n const staleMs = positiveIntEnv(\"KYNVER_CURSOR_START_LOCK_STALE_MS\", DEFAULT_CURSOR_START_LOCK_STALE_MS);\r\n const started = Date.now();\r\n\r\n while (true) {\r\n try {\r\n const fd = openSync(lockPath, \"wx\");\r\n closeSync(fd);\r\n return () => {\r\n try {\r\n unlinkSync(lockPath);\r\n } catch {\r\n // Best effort: a later start will reap a stale lock.\r\n }\r\n };\r\n } catch (error) {\r\n const code = (error as NodeJS.ErrnoException).code;\r\n if (code !== \"EEXIST\") throw error;\r\n\r\n try {\r\n const ageMs = Date.now() - statSync(lockPath).mtimeMs;\r\n if (ageMs > staleMs) {\r\n unlinkSync(lockPath);\r\n continue;\r\n }\r\n } catch {\r\n continue;\r\n }\r\n\r\n if (Date.now() - started > timeoutMs) {\r\n throw new Error(`timed out waiting for Cursor agent start lock: ${lockPath}`);\r\n }\r\n sleepSync(250);\r\n }\r\n }\r\n}\r\n\r\nexport const cursorProvider: WorkerProvider = {\r\n name: \"cursor\",\r\n defaultModel: DEFAULT_CURSOR_MODEL,\r\n preflightModel(model) {\r\n return preflightCursorModel(model, DEFAULT_CURSOR_MODEL);\r\n },\r\n start(opts) {\r\n const preflight = preflightCursorModel(opts.model, DEFAULT_CURSOR_MODEL);\r\n if (!preflight.ok) {\r\n throw new Error(`cursor provider model preflight failed: ${preflight.note}`);\r\n }\r\n const model = preflight.model;\r\n const stdoutFd = openSync(opts.stdoutPath, \"a\");\r\n const stderrFd = openSync(opts.stderrPath, \"a\");\r\n const stdio: StdioOptions = [\"ignore\", stdoutFd, stderrFd];\r\n const agentBin = resolveAgentBin();\r\n const spawnTarget = resolveCursorSpawn(agentBin);\r\n const releaseStartLock = acquireCursorStartLock();\r\n let child: ChildProcess;\r\n try {\r\n child = spawn(\r\n spawnTarget.executable,\r\n [\r\n ...spawnTarget.prefixArgs,\r\n \"-p\",\r\n \"--force\",\r\n \"--trust\",\r\n \"--workspace\",\r\n opts.worktreePath,\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--stream-partial-output\",\r\n \"--model\",\r\n model,\r\n opts.prompt,\r\n ],\r\n hiddenSpawnOptions({\r\n cwd: opts.worktreePath,\r\n detached: spawnTarget.detached,\r\n shell: spawnTarget.shell,\r\n stdio,\r\n env: cursorWorkerEnv(agentBin, spawnTarget),\r\n }),\r\n );\r\n sleepSync(positiveIntEnv(\"KYNVER_CURSOR_START_LOCK_HOLD_MS\", DEFAULT_CURSOR_START_LOCK_HOLD_MS));\r\n } finally {\r\n releaseStartLock();\r\n closeSync(stdoutFd);\r\n closeSync(stderrFd);\r\n }\r\n\r\n if (!child.pid) {\r\n throw new Error(\r\n `failed to spawn Cursor agent worker (is \\`${agentBin}\\` on PATH? run \\`agent login\\` or set CURSOR_API_KEY)`,\r\n );\r\n }\r\n child.unref();\r\n return { pid: child.pid, model };\r\n },\r\n};\r\n", "import { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/** Match Cursor's agent.ps1 version folders: YYYY.MM.DD-commit */\r\nconst CURSOR_VERSION_DIR = /^\\d{4}\\.\\d{1,2}\\.\\d{1,2}-[a-f0-9]+$/i;\r\n\r\nexport function parseCursorVersionSortKey(versionName: string): number | null {\r\n const datePart = versionName.split(\"-\")[0];\r\n const parts = datePart.split(\".\");\r\n if (parts.length !== 3) return null;\r\n const [year, month, day] = parts;\r\n if (!year || !month || !day) return null;\r\n return Number(`${year}${month.padStart(2, \"0\")}${day.padStart(2, \"0\")}`);\r\n}\r\n\r\nexport function pickLatestCursorVersionDir(agentRoot: string): string | null {\r\n const versionsRoot = path.join(agentRoot, \"versions\");\r\n if (!existsSync(versionsRoot)) return null;\r\n\r\n let bestDir: string | null = null;\r\n let bestKey = -1;\r\n\r\n for (const entry of readdirSync(versionsRoot, { withFileTypes: true })) {\r\n if (!entry.isDirectory() || !CURSOR_VERSION_DIR.test(entry.name)) continue;\r\n const key = parseCursorVersionSortKey(entry.name);\r\n if (key == null || key <= bestKey) continue;\r\n bestKey = key;\r\n bestDir = path.join(versionsRoot, entry.name);\r\n }\r\n\r\n return bestDir;\r\n}\r\n\r\nexport function resolveWindowsCursorBundled(agentRoot?: string): {\r\n nodeExe: string;\r\n indexJs: string;\r\n versionDir: string;\r\n} | null {\r\n const root =\r\n agentRoot?.trim() ||\r\n path.join(process.env.LOCALAPPDATA || \"\", \"cursor-agent\");\r\n\r\n const directNode = path.join(root, \"node.exe\");\r\n const directIndex = path.join(root, \"index.js\");\r\n if (existsSync(directNode) && existsSync(directIndex)) {\r\n return { nodeExe: directNode, indexJs: directIndex, versionDir: root };\r\n }\r\n\r\n const versionDir = pickLatestCursorVersionDir(root);\r\n if (!versionDir) return null;\r\n\r\n const nodeExe = path.join(versionDir, \"node.exe\");\r\n const indexJs = path.join(versionDir, \"index.js\");\r\n if (!existsSync(nodeExe) || !existsSync(indexJs)) return null;\r\n\r\n return { nodeExe, indexJs, versionDir };\r\n}\r\n", "// packages/kynver-runtime/src/auto-complete.ts\r\n//\r\n// Per-worker completion sidecar (the missing link for \"clean retry / named\r\n// worker / finalResult attribution\"). The `kynver worker start` path spawns a\r\n// worker process detached + unref'd, so the parent invocation returns\r\n// immediately. With no per-run `kynver daemon` running, nothing then notices\r\n// the worker's finalResult and POSTs `/api/agent-os/.../harness/completion`,\r\n// leaving the linked AgentTask stuck in `running` indefinitely (live evidence:\r\n// run 20260525t094246z-retry-dalton-post-merge-review-clean / task\r\n// 2a63e02f-ea56-4652-b260-8410b5a0c666).\r\n//\r\n// `worker auto-complete` is a tiny long-lived sidecar that polls until the\r\n// worker is finished (finalResult OR pid dead) and then runs `tryCompleteWorker`\r\n// \u2014 exactly what `runPipelineTick \u2192 completeFinishedWorkers` does, but scoped to\r\n// a single worker. `worker start` detaches one of these per board-linked worker.\r\n//\r\n// Kept small on purpose: no Prisma, no daemon shape, no global state. The\r\n// existing `tryCompleteWorker` already handles auth refresh, structural-blocker\r\n// persistence, and the dispatched-vs-direct distinction.\r\n\r\nimport { spawn } from \"node:child_process\";\r\nimport { existsSync, openSync, closeSync } from \"node:fs\";\r\nimport { hiddenSpawnOptions } from \"./util.js\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { hasTerminalCompletionAck } from \"./completion-replay.js\";\r\nimport { loadWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport { tryCompleteWorker } from \"./worker-ops.js\";\r\nimport { isPidAlive, sleepMs } from \"./util.js\";\r\nimport { resolveWorkerTargetArgs } from \"./validate.js\";\r\n\r\n/**\r\n * Defaults tuned for \"good enough for a one-off worker that may run for tens of\r\n * minutes\": ~5s between polls, ~6h cap on total wait time. The 6h cap is a\r\n * defence-in-depth tripwire \u2014 a wedged worker should be reaped by the harness\r\n * watchdog long before we hit it.\r\n */\r\nconst DEFAULT_POLL_MS = 5_000;\r\nconst DEFAULT_MAX_TOTAL_MS = 6 * 60 * 60 * 1000;\r\n/**\r\n * Retry budget for transient (non-2xx, non-401/403) completion failures after\r\n * the worker has finished. We do not loop forever \u2014 `tryCompleteWorker` already\r\n * persists a `completionBlocker` so the run stays non-terminal; a human/daemon\r\n * sweep will replay it.\r\n */\r\nconst DEFAULT_COMPLETE_ATTEMPTS = 3;\r\nconst DEFAULT_COMPLETE_BACKOFF_MS = 5_000;\r\n\r\nexport interface AutoCompleteArgs {\r\n run: string;\r\n name: string;\r\n agentOsId?: string;\r\n pollMs?: number;\r\n maxTotalMs?: number;\r\n completeAttempts?: number;\r\n completeBackoffMs?: number;\r\n baseUrl?: string;\r\n secret?: string;\r\n}\r\n\r\nexport interface AutoCompleteOutcome {\r\n worker: string;\r\n runId: string;\r\n /** \"completed\" \u2192 finished + completion call returned ok. \"blocked\" \u2192 finished + completion replay refused (structural blocker set). \"timed_out\" \u2192 never finished within the cap. */\r\n outcome: \"completed\" | \"blocked\" | \"timed_out\" | \"missing_link\";\r\n httpStatus?: number;\r\n attempts: number;\r\n reason?: string;\r\n}\r\n\r\nfunction readArgs(raw: Record<string, string | boolean>): AutoCompleteArgs {\r\n const { runId, workerName } = resolveWorkerTargetArgs(raw);\r\n return {\r\n run: runId,\r\n name: workerName,\r\n agentOsId: raw.agentOsId ? String(raw.agentOsId) : undefined,\r\n pollMs: Number(raw.pollMs) > 0 ? Math.floor(Number(raw.pollMs)) : undefined,\r\n maxTotalMs: Number(raw.maxTotalMs) > 0 ? Math.floor(Number(raw.maxTotalMs)) : undefined,\r\n completeAttempts:\r\n Number(raw.completeAttempts) > 0 ? Math.floor(Number(raw.completeAttempts)) : undefined,\r\n completeBackoffMs:\r\n Number(raw.completeBackoffMs) > 0 ? Math.floor(Number(raw.completeBackoffMs)) : undefined,\r\n baseUrl: raw.baseUrl ? String(raw.baseUrl) : undefined,\r\n secret: raw.secret ? String(raw.secret) : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Sidecar body: poll the worker until it finishes, then POST completion (with a\r\n * small retry budget). Pure logic \u2014 the CLI just adapts `--`-args in/out.\r\n */\r\nexport async function autoCompleteWorker(\r\n raw: Record<string, string | boolean>,\r\n): Promise<AutoCompleteOutcome> {\r\n const args = readArgs(raw);\r\n const pollMs = args.pollMs ?? DEFAULT_POLL_MS;\r\n const maxTotalMs = args.maxTotalMs ?? DEFAULT_MAX_TOTAL_MS;\r\n const completeAttempts = args.completeAttempts ?? DEFAULT_COMPLETE_ATTEMPTS;\r\n const completeBackoffMs = args.completeBackoffMs ?? DEFAULT_COMPLETE_BACKOFF_MS;\r\n\r\n let worker = loadWorker(args.run, args.name);\r\n if (!worker.agentOsId || !worker.taskId) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"missing_link\",\r\n attempts: 0,\r\n reason: \"worker has no agentOsId/taskId \u2014 nothing to attribute completion to\",\r\n };\r\n }\r\n\r\n if (hasTerminalCompletionAck(worker)) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"completed\",\r\n httpStatus: 200,\r\n attempts: 0,\r\n reason: \"completion-already-acknowledged\",\r\n };\r\n }\r\n\r\n // Wait for the worker to finish (finalResult OR dead pid). Bail at the\r\n // overall cap; the calling daemon/watchdog will reap a stuck worker.\r\n const startMs = Date.now();\r\n // We do not sleep before the first poll \u2014 a worker that already finished by\r\n // the time the sidecar starts (e.g. very fast workers, or restarts) is picked\r\n // up immediately.\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n worker = loadWorker(args.run, args.name);\r\n if (hasTerminalCompletionAck(worker)) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"completed\",\r\n httpStatus: 200,\r\n attempts: 0,\r\n reason: \"completion-already-acknowledged\",\r\n };\r\n }\r\n const status = computeWorkerStatus(worker);\r\n if (isFinishedWorkerStatus(status)) break;\r\n // Defence in depth: if the pid is gone even though `isFinishedWorkerStatus`\r\n // hasn't latched yet (rare race on the heartbeat clock), do not spin.\r\n if (!isPidAlive(worker.pid)) break;\r\n if (Date.now() - startMs > maxTotalMs) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"timed_out\",\r\n attempts: 0,\r\n reason: `worker did not finish within ${maxTotalMs}ms`,\r\n };\r\n }\r\n sleepMs(pollMs);\r\n }\r\n\r\n // Worker is finished. Drive completion through the existing reporter so we\r\n // inherit auth refresh, blocker persistence, and the dispatched-vs-direct\r\n // gate handling for free.\r\n let lastHttpStatus: number | undefined;\r\n let lastReason: string | undefined;\r\n for (let attempt = 1; attempt <= completeAttempts; attempt++) {\r\n const result = await tryCompleteWorker({\r\n run: args.run,\r\n name: args.name,\r\n ...(args.agentOsId ? { agentOsId: args.agentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: args.baseUrl } : {}),\r\n ...(args.secret ? { secret: args.secret } : {}),\r\n });\r\n lastHttpStatus = result.httpStatus;\r\n if (result.ok) {\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"completed\",\r\n httpStatus: result.httpStatus,\r\n attempts: attempt,\r\n };\r\n }\r\n // Sticky failures: auth rejection (401/403) is structural \u2014 the\r\n // refresh-and-retry has already been attempted inside `tryCompleteWorker`,\r\n // so doing it again with the same body will not help. The blocker is\r\n // already persisted; surface it and stop.\r\n // Other non-2xx (e.g. 5xx, transient network) are eligible to retry within\r\n // the budget.\r\n const authRejected = result.httpStatus === 401 || result.httpStatus === 403;\r\n if (authRejected) {\r\n lastReason = typeof result.reason === \"string\" ? result.reason : \"completion replay refused\";\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"blocked\",\r\n httpStatus: result.httpStatus,\r\n attempts: attempt,\r\n reason: lastReason,\r\n };\r\n }\r\n lastReason = typeof result.reason === \"string\" ? result.reason : \"transient failure\";\r\n if (attempt < completeAttempts) sleepMs(completeBackoffMs);\r\n }\r\n\r\n return {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n outcome: \"blocked\",\r\n httpStatus: lastHttpStatus,\r\n attempts: completeAttempts,\r\n reason: lastReason ?? \"completion failed after retries\",\r\n };\r\n}\r\n\r\n/** CLI entry: write outcome JSON to stdout. Exit code 0 on completed/blocked (both record state); 1 on missing_link / timed_out. */\r\nexport async function autoCompleteWorkerCli(raw: Record<string, string | boolean>): Promise<void> {\r\n try {\r\n const outcome = await autoCompleteWorker(raw);\r\n console.log(JSON.stringify(outcome, null, 2));\r\n if (outcome.outcome === \"missing_link\" || outcome.outcome === \"timed_out\") {\r\n process.exit(1);\r\n }\r\n // Detached sidecars must not linger after completion \u2014 an open handle or\r\n // hung callback can otherwise spin at 100% CPU for hours after the worker\r\n // finished and completion was acknowledged.\r\n process.exit(0);\r\n } catch (error) {\r\n console.error(`worker auto-complete failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport interface SpawnSidecarOptions {\r\n runId: string;\r\n workerName: string;\r\n workerDir: string;\r\n /** Override the CLI script the sidecar invokes. Tests inject this. */\r\n cliPath?: string;\r\n /** Override the node executable. Tests inject this. */\r\n nodeExecutable?: string;\r\n /**\r\n * Carry the agentOsId on the command line so the sidecar still resolves\r\n * its callback target even if `worker.json` is rewritten/relocated.\r\n */\r\n agentOsId?: string;\r\n /**\r\n * Pass-through for callers that want a non-default base URL/secret (e.g.\r\n * tests or operator overrides). Production reads them from env.\r\n */\r\n baseUrl?: string;\r\n secret?: string;\r\n}\r\n\r\nexport interface SpawnedSidecar {\r\n pid?: number;\r\n logPath: string;\r\n cliPath: string;\r\n}\r\n\r\nfunction resolveDefaultCliPath(): string {\r\n // dist/auto-complete.js sits next to dist/cli.js after the build; in the\r\n // source tree, the same file layout holds under packages/kynver-runtime/dist.\r\n return path.join(fileURLToPath(new URL(\".\", import.meta.url)), \"cli.js\");\r\n}\r\n\r\n/**\r\n * Detach a per-worker completion sidecar that owns the worker's\r\n * finalResult \u2192 AgentTask attribution. Returns the spawned pid (or undefined if\r\n * `dryRun`). Failures here MUST NOT crash `worker start`: the worker is already\r\n * running; missing the sidecar just means a daemon/watchdog has to replay\r\n * completion later.\r\n */\r\nexport function spawnCompletionSidecar(opts: SpawnSidecarOptions): SpawnedSidecar | undefined {\r\n const cliPath = opts.cliPath ?? resolveDefaultCliPath();\r\n if (!existsSync(cliPath)) return undefined;\r\n const logPath = path.join(opts.workerDir, \"auto-complete.log\");\r\n let logFd: number | undefined;\r\n try {\r\n logFd = openSync(logPath, \"a\");\r\n } catch {\r\n logFd = undefined;\r\n }\r\n const stdio: (\"ignore\" | number)[] = [\r\n \"ignore\",\r\n logFd ?? \"ignore\",\r\n logFd ?? \"ignore\",\r\n ];\r\n const nodeExecutable = opts.nodeExecutable ?? process.execPath;\r\n const args = [\r\n cliPath,\r\n \"worker\",\r\n \"auto-complete\",\r\n \"--run\",\r\n opts.runId,\r\n \"--name\",\r\n opts.workerName,\r\n ];\r\n if (opts.agentOsId) args.push(\"--agent-os-id\", opts.agentOsId);\r\n if (opts.baseUrl) args.push(\"--base-url\", opts.baseUrl);\r\n if (opts.secret) args.push(\"--secret\", opts.secret);\r\n try {\r\n const child = spawn(\r\n nodeExecutable,\r\n args,\r\n hiddenSpawnOptions({\r\n detached: true,\r\n stdio,\r\n env: process.env,\r\n }),\r\n );\r\n if (logFd !== undefined) closeSync(logFd);\r\n child.unref();\r\n return { pid: child.pid, logPath, cliPath };\r\n } catch {\r\n if (logFd !== undefined) {\r\n try {\r\n closeSync(logFd);\r\n } catch {\r\n // best effort\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n", "import type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { saveWorker } from \"./run-store.js\";\r\n\r\nexport type CompletionOutcome = \"acknowledged\" | \"skipped_already_acked\" | \"structural_blocker\";\r\n\r\nexport interface CompletionAckFields {\r\n completionReportedAt: string;\r\n completionOutcome: \"acknowledged\" | \"rejected\";\r\n completionResponse?: unknown;\r\n}\r\n\r\nexport function hasCompletionAck(worker: HarnessWorkerRecord): boolean {\r\n return Boolean(worker.completionReportedAt?.trim());\r\n}\r\n\r\n/** True when AgentOS acknowledged completion and the board advanced (or was already terminal). */\r\nexport function hasSuccessfulCompletionAck(worker: HarnessWorkerRecord): boolean {\r\n if (!hasCompletionAck(worker)) return false;\r\n if (worker.completionOutcome === \"rejected\") return false;\r\n if (typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim()) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Finished workers with a prior completion POST that did not advance the board\r\n * (rejected route, structural blocker) must be eligible for replay so fresher\r\n * `finalResult` evidence can reach AgentOS.\r\n */\r\nexport function needsCompletionReplay(worker: HarnessWorkerRecord): boolean {\r\n if (!hasCompletionAck(worker)) return false;\r\n return !hasSuccessfulCompletionAck(worker);\r\n}\r\n\r\nexport function persistCompletionAck(\r\n worker: HarnessWorkerRecord,\r\n runId: string,\r\n fields: CompletionAckFields,\r\n): void {\r\n worker.completionReportedAt = fields.completionReportedAt;\r\n worker.completionOutcome = fields.completionOutcome;\r\n if (fields.completionResponse !== undefined) {\r\n worker.completionResponse = fields.completionResponse;\r\n }\r\n saveWorker(runId, worker);\r\n}\r\n\r\nexport function clearCompletionAck(worker: HarnessWorkerRecord, runId: string): void {\r\n delete worker.completionReportedAt;\r\n delete worker.completionOutcome;\r\n delete worker.completionResponse;\r\n saveWorker(runId, worker);\r\n}\r\n", "import type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { hasCompletionAck } from \"./completion-ack.js\";\r\n\r\nfunction trimBlocker(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\n/**\r\n * A finished worker whose completion POST was recorded but did not advance the\r\n * linked AgentTask (structural blocker or rejected outcome) must be eligible for\r\n * idempotent completion replay on later pipeline ticks \u2014 not skipped as \"already\r\n * acknowledged\".\r\n */\r\nexport function shouldReplayHarnessCompletion(worker: HarnessWorkerRecord): boolean {\r\n if (trimBlocker(worker.completionBlocker)) return true;\r\n if (worker.completionOutcome === \"rejected\") return true;\r\n return false;\r\n}\r\n\r\n/** Terminal ack with no structural reason to replay completion to AgentOS. */\r\nexport function hasTerminalCompletionAck(worker: HarnessWorkerRecord): boolean {\r\n return hasCompletionAck(worker) && !shouldReplayHarnessCompletion(worker);\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint, refreshRunnerToken } from \"./config.js\";\r\nimport { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport {\r\n completionPostSucceeded,\r\n summarizeHarnessCompletionResponse,\r\n} from \"./completion-response.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, loadWorker, runDirectory, saveWorker, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { ensurePrReadyHandoff } from \"./pr-handoff/index.js\";\r\nimport { computeWorkerStatus, deriveRunStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport type {\r\n HarnessWorkerRecord,\r\n InstructionPolicyEvidenceSnapshot,\r\n RawHarnessWorkerStatus,\r\n} from \"./status.js\";\r\nimport { summarizeEvent } from \"./stream.js\";\r\nimport { assessWorktreeCompletionHandoff } from \"./worktree-completion-handoff.js\";\r\nimport {\r\n persistCompletionAck,\r\n type CompletionAckFields,\r\n} from \"./completion-ack.js\";\r\nimport { hasTerminalCompletionAck, shouldReplayHarnessCompletion } from \"./completion-replay.js\";\r\nimport { persistCompletionAcknowledged } from \"./worker-lifecycle.js\";\r\nimport {\r\n isPidAlive,\r\n killWorkerProcess,\r\n readJson,\r\n safeJson,\r\n safeSlug,\r\n sleepMs,\r\n tailFile,\r\n writeJson,\r\n} from \"./util.js\";\r\nimport { resolveRunTargetArg, resolveWorkerTargetArgs } from \"./validate.js\";\r\n\r\ninterface CompletionPost {\r\n ok: boolean;\r\n status: number;\r\n parsed: unknown;\r\n}\r\n\r\nasync function postCompletion(url: string, secret: string, body: unknown): Promise<CompletionPost> {\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n let parsed: unknown = null;\r\n try {\r\n parsed = await res.json();\r\n } catch {\r\n parsed = null;\r\n }\r\n return { ok: res.ok, status: res.status, parsed };\r\n}\r\n\r\nfunction completionErrorText(parsed: unknown): string | undefined {\r\n if (parsed && typeof parsed === \"object\") {\r\n const err = (parsed as Record<string, unknown>).error;\r\n if (typeof err === \"string\" && err.trim()) return err.trim();\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction asString(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction deriveLifecycleStage(input: {\r\n finished: boolean;\r\n completionBlocker?: string;\r\n completionOutcome?: string | null;\r\n completionReportedAt?: string | null;\r\n}): string {\r\n if (input.completionBlocker) return `blocked:${input.completionBlocker}`;\r\n if (input.completionOutcome) return input.completionOutcome;\r\n if (input.completionReportedAt) return \"completion_acknowledged\";\r\n if (input.finished) return \"worker_finished\";\r\n return \"in_progress\";\r\n}\r\n\r\nfunction deriveNextAction(input: {\r\n completionBlocker?: string;\r\n completionOutcome?: string | null;\r\n completionReportedAt?: string | null;\r\n finished: boolean;\r\n}): string | null {\r\n if (input.completionBlocker) {\r\n return \"Resolve completion blocker, then rerun `kynver worker complete`.\";\r\n }\r\n if (input.completionOutcome === \"review_scheduled\" || input.completionOutcome === \"review_already_scheduled\") {\r\n return \"Await review lane and landing decision in Command Center.\";\r\n }\r\n if (input.completionOutcome === \"needs_attention\") {\r\n return \"Inspect blocker/attention reason in Command Center and dispatch a repair task.\";\r\n }\r\n if (input.finished && !input.completionReportedAt) {\r\n return \"Post completion acknowledgement to AgentOS (`kynver worker complete`).\";\r\n }\r\n return null;\r\n}\r\n\r\nfunction isSkippedTerminalCompletionBlocker(reason: string | undefined): boolean {\r\n const text = reason?.trim();\r\n if (!text) return false;\r\n return /completion acknowledged but board not advanced/i.test(text) && /task already terminal/i.test(text);\r\n}\r\n\r\nfunction deriveHandoffState(input: {\r\n changedFiles: string[];\r\n headCommit?: string;\r\n prUrl?: string;\r\n}): \"pr_handoff\" | \"commit_handoff\" | \"dirty_worktree\" | \"none\" {\r\n if (input.prUrl) return \"pr_handoff\";\r\n if (input.headCommit) return \"commit_handoff\";\r\n if (input.changedFiles.length > 0) return \"dirty_worktree\";\r\n return \"none\";\r\n}\r\n\r\n/**\r\n * Persist (or clear) the worker's structural completion blocker. Only writes\r\n * when the value actually changes, so the happy path never churns worker.json.\r\n */\r\nfunction persistCompletionBlocker(worker: HarnessWorkerRecord, reason: string | undefined): void {\r\n const current = worker.completionBlocker;\r\n if ((current ?? undefined) === (reason ?? undefined)) return;\r\n if (reason) worker.completionBlocker = reason;\r\n else delete worker.completionBlocker;\r\n saveWorker(worker.runId, worker);\r\n}\r\n\r\n/** Drop a prior structural blocker before re-posting completion with fresher evidence. */\r\nfunction clearCompletionBlockerForReplay(worker: HarnessWorkerRecord): void {\r\n if (!worker.completionBlocker) return;\r\n delete worker.completionBlocker;\r\n saveWorker(worker.runId, worker);\r\n}\r\n\r\nfunction workerStatusOptions(run: HarnessRunRecord | null) {\r\n return run ? { base: run.base, baseCommit: run.baseCommit } : {};\r\n}\r\n\r\nfunction applyPrHandoffToStatus(\r\n status: RawHarnessWorkerStatus,\r\n handoff: { prUrl?: string; headCommit?: string },\r\n): RawHarnessWorkerStatus {\r\n return {\r\n ...status,\r\n ...(handoff.prUrl ? { prUrl: handoff.prUrl } : {}),\r\n ...(handoff.headCommit ? { headCommit: handoff.headCommit } : {}),\r\n };\r\n}\r\n\r\nexport async function tryCompleteWorker(\r\n args: Record<string, string | boolean>,\r\n): Promise<{\r\n ok: boolean;\r\n skipped?: boolean;\r\n reason?: string;\r\n nextAction?: string;\r\n httpStatus?: number;\r\n response?: unknown;\r\n completionBlocked?: boolean;\r\n prHandoff?: { prUrl?: string; created?: boolean };\r\n}> {\r\n const { runId, workerName } = resolveWorkerTargetArgs(args);\r\n const worker = loadWorker(runId, workerName);\r\n const run = loadRun(worker.runId);\r\n let status = computeWorkerStatus(worker, workerStatusOptions(run));\r\n const agentOsId = (args.agentOsId ? String(args.agentOsId) : worker.agentOsId) || \"\";\r\n const taskId = (args.taskId ? String(args.taskId) : worker.taskId) || null;\r\n if (!isFinishedWorkerStatus(status)) {\r\n return { ok: true, skipped: true, reason: \"worker-not-finished\" };\r\n }\r\n\r\n if (worker.localOnly) {\r\n return { ok: true, skipped: true, reason: \"local-only-worker\" };\r\n }\r\n\r\n if (!agentOsId) {\r\n return { ok: false, reason: \"missing agentOsId\" };\r\n }\r\n\r\n const forceReplay = args.force === true || args.force === \"true\";\r\n if (!forceReplay && hasTerminalCompletionAck(worker)) {\r\n return {\r\n ok: true,\r\n skipped: true,\r\n reason: \"completion-already-acknowledged\",\r\n httpStatus: 200,\r\n };\r\n }\r\n if (!forceReplay && shouldReplayHarnessCompletion(worker)) {\r\n clearCompletionBlockerForReplay(worker);\r\n }\r\n\r\n const skipPrHandoff = args.skipPrHandoff === true || args.skipPrHandoff === \"true\";\r\n if (!skipPrHandoff && worker.dispatched && taskId) {\r\n const handoff = ensurePrReadyHandoff({ worker, run, status });\r\n if (!handoff.ok) {\r\n persistCompletionBlocker(worker, handoff.reason);\r\n return {\r\n ok: false,\r\n reason: handoff.reason,\r\n nextAction: handoff.nextAction,\r\n completionBlocked: true,\r\n };\r\n }\r\n if (handoff.prUrl || handoff.headCommit) {\r\n status = computeWorkerStatus(worker, workerStatusOptions(run));\r\n status = applyPrHandoffToStatus(status, handoff);\r\n }\r\n }\r\n\r\n const headCommit =\r\n status.gitAncestry.headIsAncestorOfBase === false && status.gitAncestry.head\r\n ? status.gitAncestry.head\r\n : status.headCommit;\r\n // Worktree-state enforcement only applies to dispatched workers: non-dispatched\r\n // (directly-started) workers are not subject to the PR-landing gate and their\r\n // dirty trees are surfaced as \"landing blocked\" (needs_attention) rather than\r\n // a structural completionBlocker that would permanently stall the run. Run the\r\n // PR-ready handoff first so dirty but reviewable task work can be committed,\r\n // pushed, and attached to a PR automatically instead of parking the run in\r\n // needs_attention.\r\n if (worker.dispatched) {\r\n const handoff = assessWorktreeCompletionHandoff({\r\n changedFiles: status.changedFiles,\r\n finalResult: status.finalResult,\r\n prUrl: status.prUrl,\r\n headCommit,\r\n disposableArtifactsRemoved: worker.disposableArtifactsRemoved,\r\n });\r\n if (!handoff.allowed) {\r\n const reason = handoff.detail ?? `worktree completion blocked (${handoff.state})`;\r\n persistCompletionBlocker(worker, reason);\r\n return {\r\n ok: false,\r\n reason,\r\n nextAction:\r\n \"Clean the worktree (commit, open a PR, or `kynver worker discard-disposable --path <file>`), then rerun `kynver worker complete`.\",\r\n completionBlocked: true,\r\n };\r\n }\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const explicitSecret = args.secret ? String(args.secret) : undefined;\r\n let secret = await resolveCallbackSecretWithMint(explicitSecret, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/completion`;\r\n const statusPayload: RawHarnessWorkerStatus & Record<string, unknown> = { ...status };\r\n if (worker.disposableArtifactsRemoved?.length) {\r\n statusPayload.disposableArtifactsRemoved = worker.disposableArtifactsRemoved;\r\n }\r\n const body = {\r\n source: \"kynver-harness\",\r\n agentOsId,\r\n runId: worker.runId,\r\n workerName: worker.name,\r\n taskId,\r\n leaseToken: worker.leaseToken ?? null,\r\n startedAt: worker.startedAt,\r\n finishedAt: status.lastActivityAt || new Date().toISOString(),\r\n status: worker.leaseToken\r\n ? { ...statusPayload, leaseToken: worker.leaseToken }\r\n : statusPayload,\r\n workerInjection: {\r\n instructionPolicyFingerprint: worker.instructionPolicyFingerprint ?? null,\r\n instructionPolicyEvidence: worker.instructionPolicyEvidence ?? null,\r\n memoryQualityCapture: worker.memoryQualityCapture ?? null,\r\n policyAt:\r\n worker.instructionPolicyEvidence &&\r\n typeof worker.instructionPolicyEvidence === \"object\" &&\r\n \"policyAt\" in worker.instructionPolicyEvidence &&\r\n typeof (worker.instructionPolicyEvidence as { policyAt?: unknown }).policyAt === \"string\"\r\n ? (worker.instructionPolicyEvidence as { policyAt: string }).policyAt\r\n : null,\r\n personaSlug: worker.personaSlug ?? null,\r\n personaEvidence: worker.personaEvidence ?? null,\r\n contextEnvelopeEvidence: worker.contextEnvelopeEvidence ?? null,\r\n },\r\n };\r\n\r\n let result = await postCompletion(url, secret, body);\r\n\r\n // A scoped runner token can be revoked, expired, or scoped to a DIFFERENT\r\n // workspace (the self-linked repair case) \u2014 the completion route then 401s\r\n // with \"Invalid, revoked, or cross-workspace runner token\". A finished\r\n // finalResult worker whose completion is rejected must NOT be papered over as\r\n // done. First try to recover and ADVANCE: force-mint a fresh token scoped to\r\n // the correct agentOsId and retry once. (Skipped when the caller passed an\r\n // explicit --secret; respect their choice.)\r\n if ((result.status === 401 || result.status === 403) && !explicitSecret) {\r\n const refreshed = await refreshRunnerToken(agentOsId, { baseUrl: base });\r\n if (refreshed && refreshed !== secret) {\r\n secret = refreshed;\r\n result = await postCompletion(url, secret, body);\r\n }\r\n }\r\n\r\n if (result.ok) {\r\n const summary = summarizeHarnessCompletionResponse(result.parsed);\r\n if (!completionPostSucceeded(summary)) {\r\n const detail =\r\n summary.detail ??\r\n (summary.routeOutcome\r\n ? `harness completion returned ${summary.routeOutcome}`\r\n : \"harness completion did not advance the linked task\");\r\n const reason = `completion acknowledged but board not advanced: ${detail}`;\r\n persistCompletionBlocker(worker, reason);\r\n const ack: CompletionAckFields = {\r\n completionReportedAt: new Date().toISOString(),\r\n completionOutcome: \"rejected\",\r\n completionResponse: result.parsed,\r\n };\r\n persistCompletionAck(worker, worker.runId, ack);\r\n return {\r\n ok: false,\r\n httpStatus: result.status,\r\n response: result.parsed,\r\n reason,\r\n completionBlocked: true,\r\n };\r\n }\r\n // Completion acknowledged and the board advanced \u2014 clear any prior structural blocker.\r\n persistCompletionBlocker(worker, undefined);\r\n const routeOutcome = summary.routeOutcome ?? \"acknowledged\";\r\n const ack: CompletionAckFields = {\r\n completionReportedAt: new Date().toISOString(),\r\n completionOutcome: \"acknowledged\",\r\n completionResponse: result.parsed,\r\n };\r\n persistCompletionAck(worker, worker.runId, ack);\r\n persistCompletionAcknowledged(worker, status, { source: \"harness-completion\" });\r\n const prUrl = status.prUrl;\r\n return {\r\n ok: true,\r\n httpStatus: result.status,\r\n response: result.parsed,\r\n reason: routeOutcome,\r\n ...(prUrl ? { prHandoff: { prUrl } } : {}),\r\n };\r\n }\r\n\r\n // Still not acknowledged. Record a structural blocker so finalize keeps the\r\n // run non-terminal and the board surfaces it (rather than reporting done\r\n // while the linked AgentTask stays queued).\r\n const authRejected = result.status === 401 || result.status === 403;\r\n const detail = completionErrorText(result.parsed) ?? (authRejected ? \"runner token unauthorized\" : \"non-2xx response\");\r\n const reason = authRejected\r\n ? `completion replay rejected (${result.status}): ${detail}`\r\n : `completion replay failed (${result.status}): ${detail}`;\r\n persistCompletionBlocker(worker, reason);\r\n return { ok: false, httpStatus: result.status, response: result.parsed, completionBlocked: true };\r\n}\r\n\r\nexport async function completeWorker(args: Record<string, string | boolean>): Promise<void> {\r\n try {\r\n const { runId, workerName } = resolveWorkerTargetArgs(args);\r\n const worker = loadWorker(runId, workerName);\r\n const run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, workerStatusOptions(run));\r\n const agentOsId = (args.agentOsId ? String(args.agentOsId) : worker.agentOsId) || \"\";\r\n const taskId = (args.taskId ? String(args.taskId) : worker.taskId) || null;\r\n if (!isFinishedWorkerStatus(status)) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n status: \"skipped\",\r\n reason: \"worker-not-finished\",\r\n workerStatus: status.status,\r\n alive: status.alive,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return;\r\n }\r\n if (worker.localOnly) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n status: \"skipped\",\r\n reason: \"local-only-worker\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return;\r\n }\r\n if (!agentOsId) {\r\n console.error(\"worker complete requires --agent-os-id (or an agentOsId persisted at worker start)\");\r\n process.exit(1);\r\n }\r\n\r\n const result = await tryCompleteWorker(args);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n worker: worker.name,\r\n runId: worker.runId,\r\n ...(result.skipped ? { status: \"skipped\" } : {}),\r\n ...(result.reason ? { reason: result.reason } : {}),\r\n ...(result.nextAction ? { nextAction: result.nextAction } : {}),\r\n ...(result.completionBlocked ? { completionBlocked: result.completionBlocked } : {}),\r\n agentOsId,\r\n taskId,\r\n httpStatus: result.httpStatus,\r\n response: result.response,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n if (!result.ok) process.exit(1);\r\n } catch (error) {\r\n console.error(`worker complete failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function workerStatus(args: Record<string, string | boolean>): void {\r\n const { runId, workerName } = resolveWorkerTargetArgs(args);\r\n const worker = loadWorker(runId, workerName);\r\n const run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, workerStatusOptions(run));\r\n writeJson(path.join(worker.workerDir, \"last-status.json\"), status);\r\n console.log(JSON.stringify(status, null, 2));\r\n}\r\n\r\nfunction buildWorkerListDrilldownCommands(runId: string): Record<string, string> {\r\n return {\r\n full: `kynver worker list --run ${runId} --full`,\r\n blocked: `kynver worker list --run ${runId} --blocked`,\r\n running: `kynver worker list --run ${runId} --running`,\r\n task: `kynver worker list --run ${runId} --task <task-id>`,\r\n worker: `kynver worker list --run ${runId} --worker <worker>`,\r\n runFull: `kynver run status --run ${runId} --full`,\r\n workerFull: `kynver worker status --run ${runId} --name <worker>`,\r\n workerTail: `kynver worker tail --run ${runId} --name <worker> --lines 80`,\r\n };\r\n}\r\n\r\nfunction asOptionalArg(value: string | boolean | undefined): string | undefined {\r\n if (typeof value !== \"string\") return undefined;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : undefined;\r\n}\r\n\r\nfunction activeWorkerFilters(args: Record<string, string | boolean>): Record<string, string | boolean> {\r\n const filters: Record<string, string | boolean> = {};\r\n if (args.blocked === true || args.blocked === \"true\") filters.blocked = true;\r\n if (args.running === true || args.running === \"true\") filters.running = true;\r\n const task = asOptionalArg(args.task ?? args.taskId);\r\n if (task) filters.task = task;\r\n const worker = asOptionalArg(args.worker ?? args.name);\r\n if (worker) filters.worker = worker;\r\n const status = asOptionalArg(args.status);\r\n if (status) filters.status = status;\r\n return filters;\r\n}\r\n\r\nfunction workerMatchesFilters(worker: RunBoardWorker, filters: Record<string, string | boolean>): boolean {\r\n if (filters.blocked) {\r\n const attention = typeof worker.attention === \"string\" ? worker.attention : \"\";\r\n const status = typeof worker.status === \"string\" ? worker.status : \"\";\r\n if (!(attention === \"blocked\" || attention === \"needs_attention\" || attention === \"stale\" || status === \"blocked\")) {\r\n return false;\r\n }\r\n }\r\n if (filters.running) {\r\n if (!(worker.status === \"running\" && worker.attention !== \"blocked\" && worker.attention !== \"needs_attention\")) {\r\n return false;\r\n }\r\n }\r\n if (typeof filters.task === \"string\" && worker.taskId !== filters.task) return false;\r\n if (typeof filters.worker === \"string\" && worker.worker !== filters.worker) return false;\r\n if (typeof filters.status === \"string\" && worker.status !== filters.status) return false;\r\n return true;\r\n}\r\n\r\nfunction applyWorkerFilters(board: RunBoard, args: Record<string, string | boolean>): RunBoard {\r\n const filters = activeWorkerFilters(args);\r\n if (Object.keys(filters).length === 0) return board;\r\n const workers = board.workers.filter((worker) => workerMatchesFilters(worker, filters));\r\n const filtered: RunBoard = {\r\n ...board,\r\n workerCount: workers.length,\r\n needsAttention: workers\r\n .filter((w) => w.attention && w.attention !== \"ok\" && w.attention !== \"done\")\r\n .map((w) => w.worker),\r\n workers,\r\n activeFilters: filters,\r\n };\r\n if (board.summary) {\r\n filtered.summary = {\r\n statusCounts: countBy(workers, \"status\"),\r\n attentionCounts: countBy(workers, \"attention\"),\r\n lifecycleCounts: countBy(workers, \"lifecycleStage\"),\r\n };\r\n }\r\n if (board.controller) filtered.controller = buildControllerSummary(workers);\r\n return filtered;\r\n}\r\n\r\nexport function workerList(args: Record<string, string | boolean>): void {\r\n const runId = resolveRunTargetArg(args);\r\n const explicitFull = args.full === true || args.full === \"true\";\r\n const board = applyWorkerFilters(explicitFull ? buildRunBoard(runId) : buildCompactRunBoard(runId), args);\r\n const outputWorkers = board.workers;\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId: board.runId,\r\n status: board.status,\r\n projection: explicitFull ? \"full\" : \"compact\",\r\n workerCount: board.workerCount,\r\n ...(board.activeFilters ? { activeFilters: board.activeFilters } : {}),\r\n ...(!explicitFull\r\n ? {\r\n resultContract: {\r\n projection: \"compact\",\r\n rawWorkerPayloadsOmitted: true,\r\n deepDetailAvailableVia: [\"--full\", \"worker status\", \"worker tail\", \"run status --full\"],\r\n },\r\n drilldownCommands: buildWorkerListDrilldownCommands(runId),\r\n }\r\n : {}),\r\n needsAttention: board.needsAttention,\r\n ...(\"summary\" in board ? { summary: board.summary } : {}),\r\n ...(\"controller\" in board ? { controller: board.controller } : {}),\r\n workers: outputWorkers,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n\r\ntype RunBoardWorker = Record<string, unknown> & {\r\n worker: string;\r\n status?: string;\r\n attention?: string;\r\n lifecycleStage?: string | null;\r\n lastActivityAt?: string | null;\r\n};\r\n\r\ninterface RunBoard {\r\n runId: string;\r\n name: string;\r\n status: string;\r\n repo: string;\r\n workerCount: number;\r\n needsAttention: string[];\r\n workers: RunBoardWorker[];\r\n projection?: \"compact\" | \"full\";\r\n activeFilters?: Record<string, string | boolean>;\r\n resultContract?: Record<string, unknown>;\r\n drilldownCommands?: Record<string, string>;\r\n summary?: Record<string, unknown>;\r\n controller?: Record<string, unknown>;\r\n}\r\n\r\nfunction buildWorkerBoardEntry(input: {\r\n run: HarnessRunRecord;\r\n workerName: string;\r\n worker: Record<string, unknown>;\r\n}): RunBoardWorker {\r\n const { run, workerName, worker } = input;\r\n const status = computeWorkerStatus(worker as never, {\r\n base: run.base,\r\n baseCommit: run.baseCommit,\r\n });\r\n const headCommit =\r\n status.gitAncestry.headIsAncestorOfBase === false && status.gitAncestry.head\r\n ? status.gitAncestry.head\r\n : undefined;\r\n const exitedSalvage = assessExitedWorkerSalvage({\r\n alive: status.alive,\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n headCommit,\r\n });\r\n // A finished worker whose completion replay was rejected (e.g. revoked /\r\n // cross-workspace runner token) is not done \u2014 surface it as blocked on the\r\n // board even though the worker has a finalResult, so local status does not\r\n // read \"done\" while the linked AgentTask is still stuck.\r\n const rawBlocker = worker.completionBlocker;\r\n const rawCompletionBlocker = typeof rawBlocker === \"string\" && rawBlocker ? rawBlocker : undefined;\r\n const completionBlocker = isSkippedTerminalCompletionBlocker(rawCompletionBlocker)\r\n ? undefined\r\n : rawCompletionBlocker;\r\n const boardStatus = completionBlocker ? \"blocked\" : status.status;\r\n const boardAttention = completionBlocker ? \"blocked\" : status.attention.state;\r\n const completionResponse = asRecord(worker.completionResponse);\r\n const completionTask = asRecord(completionResponse?.task);\r\n const completionOutcome = asString(completionResponse?.outcome);\r\n const completionRouteStatus = asString(completionResponse?.status);\r\n const completionWarnings = Array.isArray(completionResponse?.warnings)\r\n ? completionResponse.warnings.filter((w): w is string => typeof w === \"string\" && w.trim().length > 0)\r\n : [];\r\n const prUrl = asString(completionTask?.prUrl) ?? asString(completionResponse?.prUrl);\r\n const completionReportedAt = asString(worker.completionReportedAt);\r\n const lifecycleStage = deriveLifecycleStage({\r\n finished: isFinishedWorkerStatus(status),\r\n completionBlocker,\r\n completionOutcome,\r\n completionReportedAt,\r\n });\r\n const nextAction = deriveNextAction({\r\n completionBlocker,\r\n completionOutcome,\r\n completionReportedAt,\r\n finished: isFinishedWorkerStatus(status),\r\n });\r\n const handoffState = deriveHandoffState({\r\n changedFiles: status.changedFiles,\r\n headCommit,\r\n prUrl: prUrl ?? undefined,\r\n });\r\n return {\r\n worker: status.worker,\r\n status: boardStatus,\r\n attention: boardAttention,\r\n attentionReason: completionBlocker ?? status.attention.reason,\r\n landingBlocked: status.finalResult\r\n ? boardAttention === \"needs_attention\" || boardAttention === \"blocked\"\r\n : false,\r\n exitedWithoutFinalResult: !status.finalResult && !status.alive,\r\n salvageState: exitedSalvage?.salvageable ? \"review_needed\" : \"none\",\r\n salvageReason: exitedSalvage?.salvageable ? exitedSalvage.attentionReason : undefined,\r\n pid: status.pid,\r\n alive: status.alive,\r\n currentTool: status.currentTool,\r\n lastActivityAt: status.lastActivityAt,\r\n lastHeartbeatPhase: status.lastHeartbeatPhase,\r\n lastHeartbeatSummary: status.lastHeartbeatSummary,\r\n heartbeatBlocker: status.heartbeatBlocker,\r\n changedFileCount: status.changedFiles.length,\r\n changedFiles: status.changedFiles,\r\n branch: status.branch,\r\n taskId: worker.taskId ?? null,\r\n planId: worker.planId ?? null,\r\n instructionPolicyFingerprint:\r\n typeof worker.instructionPolicyFingerprint === \"string\"\r\n ? worker.instructionPolicyFingerprint\r\n : null,\r\n instructionPolicyRuleCount: (() => {\r\n const raw = worker.instructionPolicyEvidence;\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const slugs = (raw as InstructionPolicyEvidenceSnapshot).ruleSlugs;\r\n return Array.isArray(slugs) ? slugs.length : null;\r\n })(),\r\n leaseOwner: worker.leaseOwner ?? null,\r\n model: typeof worker.model === \"string\" ? worker.model : undefined,\r\n routingRule: typeof worker.routingRule === \"string\" ? worker.routingRule : undefined,\r\n requestedModel: typeof worker.requestedModel === \"string\" ? worker.requestedModel : undefined,\r\n headCommit,\r\n prUrl,\r\n handoffState,\r\n gitAncestry: status.gitAncestry,\r\n finalResult: status.finalResult,\r\n lifecycleStage,\r\n completionReportedAt,\r\n completionOutcome: worker.completionOutcome ?? null,\r\n completionRouteStatus,\r\n completionRouteOutcome: completionOutcome,\r\n completionWarnings,\r\n completionBlocker: completionBlocker ?? null,\r\n checkpoint: {\r\n phase: status.lastHeartbeatPhase,\r\n summary: status.lastHeartbeatSummary,\r\n blocker: status.heartbeatBlocker,\r\n },\r\n lastCommandHint: status.currentTool ?? status.lastHeartbeatSummary,\r\n failureReason: completionBlocker ?? status.error ?? null,\r\n nextAction,\r\n ancestry: status.gitAncestry.relation,\r\n ancestryChecked: status.gitAncestry.checked,\r\n };\r\n}\r\n\r\nfunction isMetadataTerminalDone(worker: Record<string, unknown>): boolean {\r\n const status = typeof worker.status === \"string\" ? worker.status : \"\";\r\n const rawCompletionBlocker =\r\n typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim().length > 0\r\n ? worker.completionBlocker\r\n : undefined;\r\n const completionBlocker = rawCompletionBlocker && !isSkippedTerminalCompletionBlocker(rawCompletionBlocker);\r\n if (completionBlocker) return false;\r\n if (typeof worker.completionReportedAt === \"string\" && worker.completionReportedAt.trim()) return true;\r\n if (worker.completionOutcome === \"acknowledged\") return true;\r\n return status === \"done\";\r\n}\r\n\r\nfunction buildCompactDoneEntry(workerName: string, worker: Record<string, unknown>): RunBoardWorker {\r\n return {\r\n worker: workerName,\r\n status: \"done\",\r\n attention: \"done\",\r\n attentionReason: \"metadata terminal worker; full status skipped in compact snapshot\",\r\n alive: false,\r\n pid: typeof worker.pid === \"number\" ? worker.pid : undefined,\r\n branch: typeof worker.branch === \"string\" ? worker.branch : undefined,\r\n taskId: worker.taskId ?? null,\r\n planId: worker.planId ?? null,\r\n model: typeof worker.model === \"string\" ? worker.model : undefined,\r\n routingRule: typeof worker.routingRule === \"string\" ? worker.routingRule : undefined,\r\n requestedModel: typeof worker.requestedModel === \"string\" ? worker.requestedModel : undefined,\r\n lifecycleStage: worker.completionReportedAt ? \"completion_acknowledged\" : \"worker_finished\",\r\n completionReportedAt: typeof worker.completionReportedAt === \"string\" ? worker.completionReportedAt : null,\r\n completionOutcome: worker.completionOutcome ?? null,\r\n localOnly: worker.localOnly === true,\r\n compactStatus: true,\r\n };\r\n}\r\n\r\nfunction countBy(workers: RunBoardWorker[], key: string): Record<string, number> {\r\n const counts: Record<string, number> = {};\r\n for (const worker of workers) {\r\n const raw = worker[key];\r\n const value = typeof raw === \"string\" && raw.trim() ? raw : \"unknown\";\r\n counts[value] = (counts[value] ?? 0) + 1;\r\n }\r\n return counts;\r\n}\r\n\r\nfunction isKnownProviderStartupBlocker(worker: RunBoardWorker): boolean {\r\n if (worker.attention !== \"blocked\") return false;\r\n const reason = typeof worker.attentionReason === \"string\" ? worker.attentionReason : \"\";\r\n return (\r\n reason.includes(\"cli-config.json.tmp\") ||\r\n reason.includes(\"Invalid authentication credentials\") ||\r\n reason.includes(\"provider CLI is missing or not on PATH\") ||\r\n reason.includes(\"unknown command:\")\r\n );\r\n}\r\n\r\nfunction buildControllerSummary(workers: RunBoardWorker[]): Record<string, unknown> {\r\n const systemHealthBlockers = workers.filter(isKnownProviderStartupBlocker);\r\n const actionable = workers.filter((worker) => {\r\n if (isKnownProviderStartupBlocker(worker)) return false;\r\n const attention = worker.attention;\r\n return attention === \"needs_attention\" || attention === \"blocked\" || attention === \"stale\" || worker.status === \"running\";\r\n });\r\n return {\r\n actionableCount: actionable.length,\r\n runningCount: workers.filter((worker) => worker.status === \"running\").length,\r\n blockedCount: workers.filter((worker) => worker.attention === \"blocked\").length,\r\n staleCount: workers.filter((worker) => worker.attention === \"stale\").length,\r\n needsAttentionCount: workers.filter((worker) => worker.attention === \"needs_attention\").length,\r\n doneCount: workers.filter((worker) => worker.status === \"done\").length,\r\n systemHealthBlockerCount: systemHealthBlockers.length,\r\n systemHealthBlockers: systemHealthBlockers.slice(0, 10).map((worker) => ({\r\n worker: worker.worker,\r\n status: worker.status,\r\n attention: worker.attention,\r\n attentionReason: worker.attentionReason,\r\n model: worker.model,\r\n routingRule: worker.routingRule,\r\n lastActivityAt: worker.lastActivityAt,\r\n })),\r\n actionableWorkers: actionable.slice(0, 25).map((worker) => ({\r\n worker: worker.worker,\r\n status: worker.status,\r\n attention: worker.attention,\r\n attentionReason: worker.attentionReason,\r\n taskId: worker.taskId,\r\n planId: worker.planId,\r\n model: worker.model,\r\n routingRule: worker.routingRule,\r\n lastActivityAt: worker.lastActivityAt,\r\n nextAction: worker.nextAction,\r\n })),\r\n };\r\n}\r\n\r\nfunction buildBoard(run: HarnessRunRecord, workers: RunBoardWorker[], compact: boolean): RunBoard {\r\n const board: RunBoard = {\r\n runId: run.id,\r\n name: run.name,\r\n status: deriveRunStatus(run.status, workers),\r\n repo: run.repo,\r\n workerCount: workers.length,\r\n needsAttention: workers.filter((w) => w.attention && w.attention !== \"ok\" && w.attention !== \"done\").map((w) => w.worker),\r\n workers,\r\n };\r\n if (compact) {\r\n board.summary = {\r\n statusCounts: countBy(workers, \"status\"),\r\n attentionCounts: countBy(workers, \"attention\"),\r\n lifecycleCounts: countBy(workers, \"lifecycleStage\"),\r\n };\r\n board.controller = buildControllerSummary(workers);\r\n }\r\n return board;\r\n}\r\n\r\nfunction isTerminalDoneBoardWorker(worker: RunBoardWorker): boolean {\r\n return worker.status === \"done\" && worker.attention === \"done\";\r\n}\r\n\r\nexport function buildRunBoard(runId: string): RunBoard {\r\n const run = loadRun(runId);\r\n const names = Object.keys(run.workers || {});\r\n const workers = names.map((name) => {\r\n const worker = readJson<Record<string, unknown>>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) {\r\n return { worker: name, status: \"missing\", attention: \"needs_attention\", attentionReason: \"worker.json not found\" };\r\n }\r\n return buildWorkerBoardEntry({ run, workerName: name, worker });\r\n });\r\n const board = buildBoard(run, workers, false);\r\n writeJson(path.join(runDirectory(run.id), \"last-board.json\"), board);\r\n return board;\r\n}\r\n\r\nexport function buildCompactRunBoard(runId: string): RunBoard {\r\n const run = loadRun(runId);\r\n const names = Object.keys(run.workers || {});\r\n const allWorkers = names.map((name) => {\r\n const worker = readJson<Record<string, unknown>>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) {\r\n return { worker: name, status: \"missing\", attention: \"needs_attention\", attentionReason: \"worker.json not found\" };\r\n }\r\n if (isMetadataTerminalDone(worker)) return buildCompactDoneEntry(name, worker);\r\n return buildWorkerBoardEntry({ run, workerName: name, worker });\r\n });\r\n const workers = allWorkers.filter((worker) => !isTerminalDoneBoardWorker(worker));\r\n const board = buildBoard(run, workers, true);\r\n board.status = deriveRunStatus(run.status, allWorkers);\r\n board.summary = {\r\n ...(board.summary ?? {}),\r\n totalWorkerCount: allWorkers.length,\r\n shownWorkerCount: workers.length,\r\n omittedTerminalDoneWorkerCount: allWorkers.length - workers.length,\r\n allStatusCounts: countBy(allWorkers, \"status\"),\r\n allAttentionCounts: countBy(allWorkers, \"attention\"),\r\n };\r\n writeJson(path.join(runDirectory(run.id), \"last-board-compact.json\"), board);\r\n return board;\r\n}\r\n\r\nexport async function publishHarnessBoardSnapshot(\r\n args: Record<string, string | boolean>,\r\n source: string,\r\n): Promise<Record<string, unknown> | null> {\r\n const runId = String(args.run || \"\");\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!runId || !agentOsId) return null;\r\n const board = buildRunBoard(runId);\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, {\r\n baseUrl: base,\r\n });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/snapshot`;\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { agentOsId, runId, source, snapshot: board },\r\n { agentOsId, baseUrl: base },\r\n );\r\n return {\r\n ok: res.ok,\r\n httpStatus: res.status,\r\n response: res.response,\r\n authRefreshed: res.refreshedAuth,\r\n authRefreshFailure: res.authRefreshFailure,\r\n };\r\n}\r\n\r\nfunction buildRunStatusDrilldownCommands(runId: string): Record<string, string> {\r\n return {\r\n full: `kynver run status --run ${runId} --full`,\r\n blocked: `kynver status --run ${runId} --blocked`,\r\n running: `kynver status --run ${runId} --running`,\r\n task: `kynver status --run ${runId} --task <task-id>`,\r\n worker: `kynver status --run ${runId} --worker <worker>`,\r\n workersFull: `kynver worker list --run ${runId} --full`,\r\n workerFull: `kynver worker status --run ${runId} --name <worker>`,\r\n workerTail: `kynver worker tail --run ${runId} --name <worker> --lines 80`,\r\n monitorTick: `kynver monitor status --run ${runId} --tick`,\r\n };\r\n}\r\n\r\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const runId = resolveRunTargetArg(args);\r\n const explicitFull = args.full === true || args.full === \"true\";\r\n const board = applyWorkerFilters(explicitFull ? buildRunBoard(runId) : buildCompactRunBoard(runId), args);\r\n board.projection = explicitFull ? \"full\" : \"compact\";\r\n if (!explicitFull) {\r\n board.resultContract = {\r\n projection: \"compact\",\r\n rawWorkerPayloadsOmitted: true,\r\n omittedWorkerFields: [\"finalResult\", \"changedFiles\", \"gitAncestry\", \"completionResponse\", \"stdout/stderr tails\"],\r\n deepDetailAvailableVia: [\"--full\", \"worker status\", \"worker tail\", \"monitor status --tick\"],\r\n };\r\n board.drilldownCommands = buildRunStatusDrilldownCommands(runId);\r\n }\r\n console.log(JSON.stringify(board, null, 2));\r\n}\r\n\r\nexport function tailWorker(args: Record<string, string | boolean>): void {\r\n const { runId, workerName } = resolveWorkerTargetArgs(args);\r\n const worker = loadWorker(runId, workerName);\r\n const raw = tailFile(worker.stdoutPath, Number(args.lines || 40));\r\n if (args.raw === true || args.raw === \"true\") {\r\n process.stdout.write(raw);\r\n return;\r\n }\r\n for (const line of raw.split(\"\\n\").filter(Boolean)) {\r\n const event = safeJson(line) as Record<string, unknown> | null;\r\n const summary = event ? summarizeEvent(event) : line;\r\n if (summary) console.log(summary);\r\n }\r\n}\r\n\r\nexport function stopWorker(args: Record<string, string | boolean>): void {\r\n const { runId, workerName } = resolveWorkerTargetArgs(args);\r\n const worker = loadWorker(runId, workerName);\r\n if (!isPidAlive(worker.pid)) {\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"not_running\" }, null, 2));\r\n return;\r\n }\r\n killWorkerProcess(worker.pid!, \"SIGTERM\");\r\n sleepMs(1500);\r\n if (isPidAlive(worker.pid)) {\r\n killWorkerProcess(worker.pid!, \"SIGKILL\");\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"sigkill_sent\" }, null, 2));\r\n return;\r\n }\r\n console.log(JSON.stringify({ worker: worker.name, pid: worker.pid, status: \"stopped\" }, null, 2));\r\n}\r\n", "/** Parsed outcome from POST /harness/completion (AgentOS handleHarnessWorkerCompletion). */\r\nexport type HarnessCompletionRouteOutcome =\r\n | \"review_scheduled\"\r\n | \"review_already_scheduled\"\r\n | \"needs_attention\"\r\n | \"mirror_only\"\r\n | \"task_not_found\"\r\n | \"task_not_harness\"\r\n | \"skipped_terminal_task\"\r\n | \"closed\"\r\n | \"dispatched\"\r\n | \"dispatch_already_done\"\r\n | \"blocked\"\r\n | \"reviewer_no_parent\"\r\n | \"landing_no_parent\";\r\n\r\nexport interface HarnessCompletionResponseSummary {\r\n routeOutcome: HarnessCompletionRouteOutcome | null;\r\n /** True when the board task should have moved into review (or already was). */\r\n taskAdvanced: boolean;\r\n detail: string | null;\r\n}\r\n\r\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction asString(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nconst ADVANCED_OUTCOMES = new Set<HarnessCompletionRouteOutcome>([\r\n \"review_scheduled\",\r\n \"review_already_scheduled\",\r\n \"skipped_terminal_task\",\r\n \"closed\",\r\n \"dispatched\",\r\n \"dispatch_already_done\",\r\n]);\r\n\r\n/**\r\n * Classify a 2xx harness completion response. HTTP success alone is not enough:\r\n * `needs_attention` (policy gate, dirty tree, missing artifact) still leaves the\r\n * linked AgentTask blocked while the worker sidecar would otherwise report done.\r\n */\r\nexport function summarizeHarnessCompletionResponse(\r\n parsed: unknown,\r\n): HarnessCompletionResponseSummary {\r\n const record = asRecord(parsed);\r\n if (!record) {\r\n return { routeOutcome: null, taskAdvanced: false, detail: null };\r\n }\r\n const outcome = asString(record.outcome) as HarnessCompletionRouteOutcome | null;\r\n const detail = asString(record.detail) ?? asString(record.error);\r\n const task = asRecord(record.task);\r\n const closedTask = asRecord(record.closedTask);\r\n const taskStatus = task ? asString(task.status) : null;\r\n const closedTaskStatus = closedTask ? asString(closedTask.status) : null;\r\n const taskAdvanced =\r\n (outcome !== null && ADVANCED_OUTCOMES.has(outcome)) ||\r\n taskStatus === \"awaiting_review\" ||\r\n taskStatus === \"done\" ||\r\n closedTaskStatus === \"done\";\r\n return {\r\n routeOutcome: outcome,\r\n taskAdvanced,\r\n detail,\r\n };\r\n}\r\n\r\nexport function completionPostSucceeded(summary: HarnessCompletionResponseSummary): boolean {\r\n return summary.taskAdvanced;\r\n}\r\n", "// Runtime mirror of server expert-review task detection (landing-contract exempt).\r\n\r\nconst EXPERT_LANE_REVIEW_REF = \"expert-lane-pr-review:\";\r\nconst PLAN_REVIEW_EXECUTOR_REF = \"plan-review-task\";\r\nconst SCHEDULED_JOB_EXECUTOR_REF = \"scheduledjob:\";\r\n\r\nfunction normalizePersonaSlug(value: string | null | undefined): string | null {\r\n if (!value) return null;\r\n const t = value.trim().toLowerCase();\r\n return t.length ? t : null;\r\n}\r\n\r\nexport interface HarnessExpertReviewTaskShape {\r\n title?: string;\r\n personaSlug?: string | null;\r\n parentTaskId?: string | null;\r\n executorRef?: string | null;\r\n}\r\n\r\n/** Expert review workers must not inherit landing-only PR gates or open new PRs. */\r\nexport function isHarnessExpertReviewWorker(\r\n worker: HarnessExpertReviewTaskShape,\r\n): boolean {\r\n const ref = (worker.executorRef ?? \"\").toLowerCase();\r\n if (ref.startsWith(EXPERT_LANE_REVIEW_REF)) return true;\r\n if (ref === PLAN_REVIEW_EXECUTOR_REF || ref.startsWith(\"daemon-review:\")) return true;\r\n if (ref.startsWith(SCHEDULED_JOB_EXECUTOR_REF) && worker.parentTaskId) {\r\n const persona = normalizePersonaSlug(worker.personaSlug);\r\n if (persona === \"lorentz\" || persona === \"dalton\") return true;\r\n }\r\n const title = (worker.title ?? \"\").toLowerCase();\r\n if (title.includes(\"expert pr review\")) return true;\r\n if (\r\n worker.parentTaskId &&\r\n (title.startsWith(\"review:\") ||\r\n title.includes(\"review required\") ||\r\n title.includes(\"runtime review\"))\r\n ) {\r\n const persona = normalizePersonaSlug(worker.personaSlug);\r\n if (persona === \"lorentz\" || persona === \"dalton\") return true;\r\n }\r\n return false;\r\n}\r\n", "import type { GitAncestry } from \"../git.js\";\r\nimport type { PrHandoffExec } from \"./pr-handoff-gh.js\";\r\nimport type { PrHandoffRequirement, PrHandoffSnapshot } from \"./pr-handoff.types.js\";\r\nimport { isHarnessExpertReviewWorker } from \"../harness-expert-review.js\";\r\nimport { workerPersonaReviewSlugs } from \"../worker-persona-catalog.js\";\r\n\r\nconst REVIEW_LANE_RULE = /^(lane:)?(review|deep_review|planning|landing)(:|$)/i;\r\n\r\n/** Personas that produce review verdicts / artifacts, not implementation PRs. */\r\nconst REVIEW_PERSONA_SLUGS = new Set(workerPersonaReviewSlugs());\r\n\r\nconst NO_PR_COMMITS_BETWEEN_RE = /no commits between/i;\r\n\r\nexport function isGhNoCommitsBetweenError(detail: string | null | undefined): boolean {\r\n return Boolean(detail && NO_PR_COMMITS_BETWEEN_RE.test(detail));\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const trimmed = value.trim();\r\n return trimmed.length ? trimmed : null;\r\n}\r\n\r\nfunction committedHead(ancestry: GitAncestry | null | undefined): string | null {\r\n if (!ancestry?.checked) return null;\r\n if (ancestry.headIsAncestorOfBase !== false) return null;\r\n return trimOrNull(ancestry.head);\r\n}\r\n\r\n/** Best-effort PR URL from free text (completion summary / final result). */\r\nexport function extractPrUrlFromText(value: unknown): string | null {\r\n if (value === undefined || value === null) return null;\r\n const text =\r\n typeof value === \"string\"\r\n ? value\r\n : typeof value === \"object\" && value !== null && \"summary\" in value\r\n ? String((value as { summary?: unknown }).summary ?? \"\")\r\n : JSON.stringify(value);\r\n const m = text.match(\r\n /https?:\\/\\/[^\\s)>\"]+\\/(?:pull|pulls|merge_requests|pull-requests)\\/\\d+/i,\r\n );\r\n return m ? trimOrNull(m[0]) : null;\r\n}\r\n\r\nexport function countCommitsAheadOfBase(\r\n worktreePath: string,\r\n baseRef: string,\r\n exec: PrHandoffExec,\r\n): number | null {\r\n const base = baseRef.trim();\r\n if (!base) return null;\r\n const count = exec.git(worktreePath, [\"rev-list\", \"--count\", `${base}..HEAD`]);\r\n if (count.status !== 0) return null;\r\n const n = Number.parseInt(count.stdout.trim(), 10);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nfunction isReviewArtifactWorker(\r\n worker: { personaSlug?: string | null; routingRule?: string | null },\r\n snapshot: Pick<PrHandoffSnapshot, \"changedFiles\">,\r\n): boolean {\r\n if (snapshot.changedFiles.length > 0) return false;\r\n const persona = trimOrNull(worker.personaSlug)?.toLowerCase();\r\n if (persona && REVIEW_PERSONA_SLUGS.has(persona)) return true;\r\n const rule = trimOrNull(worker.routingRule) ?? \"\";\r\n if (rule && REVIEW_LANE_RULE.test(rule)) return true;\r\n return false;\r\n}\r\n\r\nfunction hasWorkProduct(\r\n snapshot: Pick<PrHandoffSnapshot, \"changedFiles\" | \"headCommit\" | \"gitAncestry\">,\r\n options?: { baseRef?: string | null; exec?: PrHandoffExec; worktreePath?: string },\r\n): boolean {\r\n if (snapshot.changedFiles.length > 0) return true;\r\n const baseRef = trimOrNull(options?.baseRef);\r\n if (baseRef && options?.exec && options.worktreePath) {\r\n const ahead = countCommitsAheadOfBase(options.worktreePath, baseRef, options.exec);\r\n if (ahead === 0) return false;\r\n if (ahead !== null && ahead > 0) return true;\r\n }\r\n if (trimOrNull(snapshot.headCommit)) return true;\r\n if (committedHead(snapshot.gitAncestry)) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Board-dispatched implementation workers with code changes must land with a PR\r\n * URL before AgentOS completion is posted.\r\n */\r\nexport function assessPrHandoffRequirement(input: {\r\n dispatched?: boolean;\r\n routingRule?: string | null;\r\n personaSlug?: string | null;\r\n prUrl?: string | null;\r\n patchPath?: string | null;\r\n artifactBundlePath?: string | null;\r\n baseRef?: string | null;\r\n exec?: PrHandoffExec;\r\n worker?: { personaSlug?: string | null; routingRule?: string | null };\r\n snapshot: PrHandoffSnapshot;\r\n /** Board task metadata persisted on worker.json at dispatch. */\r\n taskTitle?: string | null;\r\n executorRef?: string | null;\r\n parentTaskId?: string | null;\r\n /** Target PR on the board task row (review workers inherit parent prUrl). */\r\n taskPrUrl?: string | null;\r\n /** Repair worker canonical target \u2014 never auto-open a new PR. */\r\n repairTargetPrUrl?: string | null;\r\n}): PrHandoffRequirement {\r\n if (!input.dispatched) {\r\n return { required: false, reason: \"not_dispatched\" };\r\n }\r\n\r\n if (\r\n isHarnessExpertReviewWorker({\r\n title: input.taskTitle ?? undefined,\r\n personaSlug: input.personaSlug,\r\n parentTaskId: input.parentTaskId,\r\n executorRef: input.executorRef,\r\n })\r\n ) {\r\n return { required: false, reason: \"expert_review_task\" };\r\n }\r\n\r\n const rule = trimOrNull(input.routingRule) ?? \"\";\r\n if (rule && REVIEW_LANE_RULE.test(rule)) {\r\n return { required: false, reason: \"review_lane\" };\r\n }\r\n\r\n const workerCtx = input.worker ?? {\r\n personaSlug: input.personaSlug,\r\n routingRule: input.routingRule,\r\n };\r\n if (isReviewArtifactWorker(workerCtx, input.snapshot)) {\r\n return { required: false, reason: \"review_artifact\" };\r\n }\r\n\r\n if (trimOrNull(input.patchPath) || trimOrNull(input.artifactBundlePath)) {\r\n return { required: false, reason: \"patch_or_bundle\" };\r\n }\r\n\r\n const repairTarget = trimOrNull(input.repairTargetPrUrl);\r\n if (repairTarget) {\r\n return { required: false, reason: \"repair_target_pr\" };\r\n }\r\n\r\n const prUrl =\r\n trimOrNull(input.prUrl) ??\r\n trimOrNull(input.taskPrUrl) ??\r\n trimOrNull(input.snapshot.prUrl);\r\n if (prUrl) {\r\n return { required: false, reason: \"already_has_pr\" };\r\n }\r\n\r\n const workProductOpts =\r\n input.exec && input.baseRef\r\n ? {\r\n baseRef: input.baseRef,\r\n exec: input.exec,\r\n worktreePath: input.snapshot.worktreePath,\r\n }\r\n : undefined;\r\n\r\n if (!hasWorkProduct(input.snapshot, workProductOpts)) {\r\n return { required: false, reason: \"no_work_product\" };\r\n }\r\n\r\n return { required: true, snapshot: input.snapshot };\r\n}\r\n\r\nexport function buildPrHandoffSnapshotFromStatus(\r\n status: {\r\n changedFiles: string[];\r\n branch: string;\r\n worktreePath: string;\r\n gitAncestry: GitAncestry;\r\n finalResult: unknown;\r\n },\r\n extras?: { prUrl?: string | null; headCommit?: string | null },\r\n): PrHandoffSnapshot {\r\n return {\r\n changedFiles: status.changedFiles,\r\n branch: status.branch,\r\n worktreePath: status.worktreePath,\r\n gitAncestry: status.gitAncestry,\r\n finalResult: status.finalResult,\r\n headCommit: trimOrNull(extras?.headCommit) ?? committedHead(status.gitAncestry),\r\n prUrl: trimOrNull(extras?.prUrl) ?? null,\r\n };\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { parseGithubOwnerRepo } from \"../github-repo.js\";\r\nimport { gitCapture } from \"../git.js\";\r\n\r\nexport interface CommandCapture {\r\n status: number | null;\r\n stdout: string;\r\n stderr: string;\r\n error: string | null;\r\n}\r\n\r\nexport interface PrHandoffExec {\r\n git: (cwd: string, args: string[]) => CommandCapture;\r\n gh: (cwd: string, args: string[]) => CommandCapture;\r\n}\r\n\r\nfunction capture(bin: string, cwd: string, args: string[]): CommandCapture {\r\n try {\r\n const res = spawnSync(bin, args, { cwd, encoding: \"utf8\" });\r\n return {\r\n status: res.status,\r\n stdout: (res.stdout || \"\").trim(),\r\n stderr: (res.stderr || \"\").trim(),\r\n error: res.error ? res.error.message : null,\r\n };\r\n } catch (error) {\r\n return {\r\n status: null,\r\n stdout: \"\",\r\n stderr: \"\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport const defaultPrHandoffExec: PrHandoffExec = {\r\n git: (cwd, args) => gitCapture(cwd, args),\r\n gh: (cwd, args) => capture(\"gh\", cwd, args),\r\n};\r\n\r\nfunction firstLine(text: string): string {\r\n return text.split(\"\\n\").map((l) => l.trim()).find(Boolean) ?? \"\";\r\n}\r\n\r\nexport function resolveGithubRepo(worktreePath: string, exec: PrHandoffExec): string | null {\r\n const remote = exec.git(worktreePath, [\"remote\", \"get-url\", \"origin\"]);\r\n if (remote.status !== 0) return null;\r\n return parseGithubOwnerRepo(remote.stdout);\r\n}\r\n\r\nexport function resolveHeadCommit(worktreePath: string, exec: PrHandoffExec): string | null {\r\n const head = exec.git(worktreePath, [\"rev-parse\", \"HEAD\"]);\r\n if (head.status !== 0) return null;\r\n return head.stdout.trim() || null;\r\n}\r\n\r\n/** Look up an open PR for this head branch. */\r\nexport function findOpenPrUrl(\r\n worktreePath: string,\r\n repo: string,\r\n branch: string,\r\n exec: PrHandoffExec,\r\n): string | null {\r\n const listed = exec.gh(worktreePath, [\r\n \"pr\",\r\n \"list\",\r\n \"--repo\",\r\n repo,\r\n \"--head\",\r\n branch,\r\n \"--state\",\r\n \"open\",\r\n \"--json\",\r\n \"url\",\r\n \"--limit\",\r\n \"1\",\r\n ]);\r\n if (listed.status !== 0) return null;\r\n try {\r\n const rows = JSON.parse(listed.stdout) as Array<{ url?: string }>;\r\n const url = rows[0]?.url?.trim();\r\n return url || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport interface CommitAndPushResult {\r\n ok: boolean;\r\n committed: boolean;\r\n pushed: boolean;\r\n headCommit?: string;\r\n detail?: string;\r\n}\r\n\r\nexport function commitAndPushBranch(input: {\r\n worktreePath: string;\r\n branch: string;\r\n commitMessage: string;\r\n hasDirtyFiles: boolean;\r\n exec: PrHandoffExec;\r\n}): CommitAndPushResult {\r\n const { worktreePath, branch, commitMessage, hasDirtyFiles, exec } = input;\r\n\r\n if (hasDirtyFiles) {\r\n const add = exec.git(worktreePath, [\"add\", \"-A\"]);\r\n if (add.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: false,\r\n pushed: false,\r\n detail: add.stderr || add.stdout || add.error || \"git add failed\",\r\n };\r\n }\r\n const commit = exec.git(worktreePath, [\"commit\", \"-m\", commitMessage]);\r\n if (commit.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: false,\r\n pushed: false,\r\n detail: commit.stderr || commit.stdout || commit.error || \"git commit failed\",\r\n };\r\n }\r\n }\r\n\r\n const push = exec.git(worktreePath, [\"push\", \"-u\", \"origin\", branch]);\r\n if (push.status !== 0) {\r\n return {\r\n ok: false,\r\n committed: hasDirtyFiles,\r\n pushed: false,\r\n detail: push.stderr || push.stdout || push.error || \"git push failed\",\r\n };\r\n }\r\n\r\n const headCommit = resolveHeadCommit(worktreePath, exec) ?? undefined;\r\n return {\r\n ok: true,\r\n committed: hasDirtyFiles,\r\n pushed: true,\r\n headCommit,\r\n };\r\n}\r\n\r\nexport interface CreatePrResult {\r\n ok: boolean;\r\n prUrl?: string;\r\n created?: boolean;\r\n detail?: string;\r\n}\r\n\r\nexport function createGithubPr(input: {\r\n worktreePath: string;\r\n repo: string;\r\n branch: string;\r\n base: string;\r\n title: string;\r\n body: string;\r\n exec: PrHandoffExec;\r\n}): CreatePrResult {\r\n const existing = findOpenPrUrl(input.worktreePath, input.repo, input.branch, input.exec);\r\n if (existing) {\r\n return { ok: true, prUrl: existing, created: false };\r\n }\r\n\r\n const created = input.exec.gh(input.worktreePath, [\r\n \"pr\",\r\n \"create\",\r\n \"--repo\",\r\n input.repo,\r\n \"--base\",\r\n input.base,\r\n \"--head\",\r\n input.branch,\r\n \"--title\",\r\n input.title,\r\n \"--body\",\r\n input.body,\r\n \"--draft\",\r\n ]);\r\n if (created.status !== 0) {\r\n return {\r\n ok: false,\r\n detail: created.stderr || created.stdout || created.error || \"gh pr create failed\",\r\n };\r\n }\r\n\r\n const url =\r\n extractPrUrlFromGhOutput(created.stdout) ??\r\n findOpenPrUrl(input.worktreePath, input.repo, input.branch, input.exec);\r\n if (!url) {\r\n return { ok: false, detail: \"gh pr create succeeded but no PR URL was parsed\" };\r\n }\r\n return { ok: true, prUrl: url, created: true };\r\n}\r\n\r\nfunction extractPrUrlFromGhOutput(stdout: string): string | null {\r\n const line = firstLine(stdout);\r\n const m = line.match(/https?:\\/\\/[^\\s]+\\/pull\\/\\d+/i);\r\n return m ? m[0] : null;\r\n}\r\n", "/**\r\n * Parse `owner/repo` from a git remote URL (HTTPS or git@github.com:\u2026).\r\n * Uses URL pathname parsing so repo names are not truncated at dots (e.g. Kynver).\r\n */\r\nexport function parseGithubOwnerRepo(remoteUrl: string): string | null {\r\n const trimmed = remoteUrl.trim();\r\n if (!trimmed) return null;\r\n\r\n const ssh = trimmed.match(/^git@github\\.com:([^/]+\\/[^/\\s]+?)(?:\\.git)?$/i);\r\n if (ssh) return normalizeOwnerRepo(ssh[1]);\r\n\r\n const scp = trimmed.match(/^ssh:\\/\\/git@github\\.com\\/([^/]+\\/[^/\\s]+?)(?:\\.git)?$/i);\r\n if (scp) return normalizeOwnerRepo(scp[1]);\r\n\r\n try {\r\n const url = new URL(trimmed.includes(\"://\") ? trimmed : `https://${trimmed}`);\r\n if (url.hostname.toLowerCase() !== \"github.com\") return null;\r\n const parts = url.pathname.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\r\n if (parts.length < 2) return null;\r\n const [owner, repo] = parts;\r\n if (!owner || !repo) return null;\r\n return `${owner}/${repo.replace(/\\.git$/i, \"\")}`;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction normalizeOwnerRepo(value: string): string | null {\r\n const parts = value.split(\"/\").filter(Boolean);\r\n if (parts.length < 2) return null;\r\n const owner = parts[0];\r\n const repo = parts[1].replace(/\\.git$/i, \"\");\r\n return owner && repo ? `${owner}/${repo}` : null;\r\n}\r\n", "import {\r\n assessPrHandoffRequirement,\r\n buildPrHandoffSnapshotFromStatus,\r\n extractPrUrlFromText,\r\n isGhNoCommitsBetweenError,\r\n} from \"./pr-handoff-assess.js\";\r\nimport {\r\n commitAndPushBranch,\r\n createGithubPr,\r\n defaultPrHandoffExec,\r\n findOpenPrUrl,\r\n resolveGithubRepo,\r\n resolveHeadCommit,\r\n type PrHandoffExec,\r\n} from \"./pr-handoff-gh.js\";\r\nimport type { EnsurePrHandoffInput, EnsurePrHandoffResult } from \"./pr-handoff.types.js\";\r\n\r\nfunction ghAvailable(exec: PrHandoffExec): boolean {\r\n const probe = exec.gh(process.cwd(), [\"--version\"]);\r\n return probe.status === 0;\r\n}\r\n\r\nfunction defaultPrTitle(workerName: string, runId: string): string {\r\n return `AgentOS harness: ${workerName} (${runId})`;\r\n}\r\n\r\nfunction defaultPrBody(taskId: string | undefined, workerName: string, runId: string): string {\r\n return [\r\n \"Automated PR-ready handoff from the Kynver harness runtime.\",\r\n \"\",\r\n taskId ? `AgentOS task: \\`${taskId}\\`` : \"\",\r\n `Harness worker: \\`${workerName}\\` \u00B7 run \\`${runId}\\``,\r\n \"\",\r\n \"Opened by orchestrator completion enforcement so production review receives a reviewable artifact.\",\r\n ]\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n}\r\n\r\nfunction commitDirtyToExistingPr(input: {\r\n snapshot: ReturnType<typeof buildPrHandoffSnapshotFromStatus>;\r\n prUrl: string;\r\n commitMessage: string;\r\n exec: PrHandoffExec;\r\n}): EnsurePrHandoffResult {\r\n if (input.snapshot.changedFiles.length === 0) {\r\n return {\r\n ok: true,\r\n prUrl: input.prUrl,\r\n headCommit:\r\n input.snapshot.headCommit ??\r\n resolveHeadCommit(input.snapshot.worktreePath, input.exec) ??\r\n undefined,\r\n };\r\n }\r\n\r\n const pushResult = commitAndPushBranch({\r\n worktreePath: input.snapshot.worktreePath,\r\n branch: input.snapshot.branch,\r\n commitMessage: input.commitMessage,\r\n hasDirtyFiles: true,\r\n exec: input.exec,\r\n });\r\n if (!pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git commit/push failed\"}`,\r\n nextAction:\r\n \"Commit and push the dirty worker changes to the existing PR branch, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n return {\r\n ok: true,\r\n prUrl: input.prUrl,\r\n headCommit: pushResult.headCommit ?? input.snapshot.headCommit ?? undefined,\r\n committed: pushResult.committed,\r\n pushed: pushResult.pushed,\r\n };\r\n}\r\n\r\n/**\r\n * Ensure a board-dispatched implementation worker has a GitHub PR before completion\r\n * is posted to AgentOS. Commits dirty trees, pushes the branch, and runs\r\n * `gh pr create` when needed.\r\n */\r\nexport function ensurePrReadyHandoff(\r\n input: EnsurePrHandoffInput,\r\n exec: PrHandoffExec = defaultPrHandoffExec,\r\n): EnsurePrHandoffResult {\r\n const prUrlHint =\r\n input.prUrlHint ?? extractPrUrlFromText(input.status.finalResult) ?? null;\r\n\r\n const snapshot = buildPrHandoffSnapshotFromStatus(input.status, {\r\n prUrl: prUrlHint,\r\n headCommit: null,\r\n });\r\n\r\n const baseRef = input.run.baseCommit?.trim() || input.run.base?.trim() || \"origin/main\";\r\n const requirement = assessPrHandoffRequirement({\r\n dispatched: input.worker.dispatched,\r\n routingRule: input.worker.routingRule,\r\n personaSlug: input.worker.personaSlug,\r\n prUrl: prUrlHint,\r\n taskTitle: input.worker.taskTitle,\r\n executorRef: input.worker.executorRef,\r\n parentTaskId: input.worker.parentTaskId,\r\n taskPrUrl: input.worker.taskPrUrl,\r\n repairTargetPrUrl: input.worker.repairTargetPrUrl,\r\n baseRef,\r\n exec,\r\n worker: input.worker,\r\n snapshot,\r\n });\r\n\r\n if (!requirement.required) {\r\n if (prUrlHint) {\r\n return commitDirtyToExistingPr({\r\n snapshot,\r\n prUrl: prUrlHint,\r\n commitMessage: `chore(harness): update PR handoff for ${input.worker.name}`,\r\n exec,\r\n });\r\n }\r\n return { ok: true };\r\n }\r\n\r\n if (prUrlHint) {\r\n return commitDirtyToExistingPr({\r\n snapshot,\r\n prUrl: prUrlHint,\r\n commitMessage: `chore(harness): update PR handoff for ${input.worker.name}`,\r\n exec,\r\n });\r\n }\r\n\r\n if (!ghAvailable(exec)) {\r\n const dirty = snapshot.changedFiles.length;\r\n const detail = dirty\r\n ? `${dirty} uncommitted change(s) with no PR URL`\r\n : \"committed branch with no PR URL\";\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${detail}`,\r\n nextAction:\r\n \"Install and authenticate GitHub CLI (`gh auth login`), then commit, push, and run `gh pr create` (or rerun `kynver worker complete` after the PR exists).\",\r\n };\r\n }\r\n\r\n const repo = resolveGithubRepo(snapshot.worktreePath, exec);\r\n if (!repo) {\r\n return {\r\n ok: false,\r\n reason: \"PR-ready handoff blocked: could not resolve github.com origin for the worktree\",\r\n nextAction:\r\n \"Ensure `origin` points at GitHub, push the branch, open a PR, and rerun `kynver worker complete`.\",\r\n };\r\n }\r\n\r\n const repairTarget = input.worker.repairTargetPrUrl?.trim();\r\n if (repairTarget) {\r\n let committed = false;\r\n let pushed = false;\r\n let headCommit =\r\n snapshot.headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined;\r\n\r\n if (snapshot.changedFiles.length > 0) {\r\n const pushResult = commitAndPushBranch({\r\n worktreePath: snapshot.worktreePath,\r\n branch: snapshot.branch,\r\n commitMessage: `fix(harness): repair target PR ${repairTarget}`,\r\n hasDirtyFiles: true,\r\n exec,\r\n });\r\n if (!pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git commit/push failed\"}`,\r\n nextAction: \"Commit and push to the target PR branch, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n committed = pushResult.committed;\r\n pushed = pushResult.pushed;\r\n headCommit = pushResult.headCommit ?? headCommit;\r\n } else {\r\n const pushOnly = exec.git(snapshot.worktreePath, [\"push\", \"-u\", \"origin\", snapshot.branch]);\r\n if (pushOnly.status !== 0 && !/already up to date/i.test(pushOnly.stderr || pushOnly.stdout)) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushOnly.stderr || pushOnly.stdout || \"git push failed\"}`,\r\n nextAction: \"Push the target branch to origin, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n pushed = pushOnly.status === 0;\r\n }\r\n\r\n return {\r\n ok: true,\r\n prUrl: repairTarget,\r\n headCommit,\r\n committed,\r\n pushed,\r\n };\r\n }\r\n\r\n const existing = findOpenPrUrl(snapshot.worktreePath, repo, snapshot.branch, exec);\r\n if (existing) {\r\n return commitDirtyToExistingPr({\r\n snapshot,\r\n prUrl: existing,\r\n commitMessage: `chore(harness): update PR handoff for ${input.worker.name}`,\r\n exec,\r\n });\r\n }\r\n\r\n const hasDirty = snapshot.changedFiles.length > 0;\r\n\r\n let committed = false;\r\n let pushed = false;\r\n let headCommit = snapshot.headCommit ?? undefined;\r\n\r\n const pushResult = commitAndPushBranch({\r\n worktreePath: snapshot.worktreePath,\r\n branch: snapshot.branch,\r\n commitMessage: `chore(harness): PR-ready handoff for ${input.worker.name}`,\r\n hasDirtyFiles: hasDirty,\r\n exec,\r\n });\r\n if (hasDirty && !pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git commit/push failed\"}`,\r\n nextAction:\r\n \"Commit and push the branch, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n if (!hasDirty) {\r\n const pushOnly = exec.git(snapshot.worktreePath, [\"push\", \"-u\", \"origin\", snapshot.branch]);\r\n if (pushOnly.status !== 0 && !/already up to date/i.test(pushOnly.stderr || pushOnly.stdout)) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushOnly.stderr || pushOnly.stdout || pushOnly.error || \"git push failed\"}`,\r\n nextAction:\r\n \"Push the branch to origin, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n pushed = pushOnly.status === 0;\r\n } else {\r\n committed = pushResult.committed;\r\n pushed = pushResult.pushed;\r\n if (!pushResult.ok) {\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${pushResult.detail ?? \"git push failed\"}`,\r\n nextAction:\r\n \"Fix git auth or merge conflicts, push the branch, run `gh pr create`, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n }\r\n headCommit =\r\n pushResult.headCommit ?? headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined;\r\n\r\n const base = input.run.base?.trim() || \"main\";\r\n const pr = createGithubPr({\r\n worktreePath: snapshot.worktreePath,\r\n repo,\r\n branch: snapshot.branch,\r\n base: base.replace(/^origin\\//, \"\"),\r\n title: defaultPrTitle(input.worker.name, input.worker.runId),\r\n body: defaultPrBody(input.worker.taskId, input.worker.name, input.worker.runId),\r\n exec,\r\n });\r\n\r\n if (!pr.ok || !pr.prUrl) {\r\n if (isGhNoCommitsBetweenError(pr.detail)) {\r\n return {\r\n ok: true,\r\n headCommit: headCommit ?? undefined,\r\n committed,\r\n pushed,\r\n };\r\n }\r\n const dirty = snapshot.changedFiles.length;\r\n const detail = dirty\r\n ? `${dirty} uncommitted change(s) and no PR URL after handoff attempt`\r\n : \"no PR URL after handoff attempt\";\r\n return {\r\n ok: false,\r\n reason: `PR-ready handoff blocked: ${detail}${pr.detail ? ` (${pr.detail})` : \"\"}`,\r\n nextAction:\r\n \"Run `gh pr create` on the worker branch (or fix `gh` auth), attach the PR URL to the task, then rerun `kynver worker complete`.\",\r\n };\r\n }\r\n\r\n return {\r\n ok: true,\r\n prUrl: pr.prUrl,\r\n headCommit: headCommit ?? undefined,\r\n committed,\r\n pushed,\r\n created: pr.created,\r\n };\r\n}\r\n", "// Server mirror: lib/agent-os/harness-worktree-completion/material-worktree-changes.ts\r\n\r\nexport function materialWorktreeChanges(changedFiles: string[]): string[] {\r\n return changedFiles.filter((line) => {\r\n const trimmed = line.trim();\r\n const pathPart = trimmed.startsWith(\"??\")\r\n ? trimmed.slice(2).trim()\r\n : trimmed.length > 3\r\n ? trimmed.slice(3).trim()\r\n : trimmed;\r\n return pathPart !== \"node_modules\" && !pathPart.startsWith(\"node_modules/\");\r\n });\r\n}\r\n\r\nexport function pathFromGitStatusLine(line: string): string {\r\n const trimmed = line.trim();\r\n if (trimmed.startsWith(\"??\")) return trimmed.slice(2).trim();\r\n if (trimmed.length > 3 && /^[ MADRCU?!]{2} /.test(trimmed.slice(0, 3))) {\r\n return trimmed.slice(3).trim();\r\n }\r\n return trimmed;\r\n}\r\n", "// Server mirror: lib/agent-os/harness-worktree-completion/disposable-artifacts.ts\r\n\r\nimport { materialWorktreeChanges, pathFromGitStatusLine } from \"./material-worktree-changes.js\";\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\nfunction stringList(value: unknown): string[] {\r\n if (!Array.isArray(value)) return [];\r\n return value\r\n .map((item) => (typeof item === \"string\" ? item.trim() : \"\"))\r\n .filter(Boolean);\r\n}\r\n\r\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nexport function extractDisposableArtifactsRemoved(finalResult: unknown): string[] {\r\n const record = asRecord(finalResult);\r\n if (!record) return [];\r\n const nested = asRecord(record.worktreeHandoff);\r\n const fromNested = stringList(nested?.disposableArtifactsRemoved);\r\n if (fromNested.length) return fromNested;\r\n return stringList(record.disposableArtifactsRemoved);\r\n}\r\n\r\nfunction normalizeRelativePath(value: string): string {\r\n return value.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport function dirtyPathsCoveredByDisposableRemoval(\r\n changedFiles: string[],\r\n removed: readonly string[],\r\n): boolean {\r\n const material = materialWorktreeChanges(changedFiles);\r\n if (material.length === 0) return true;\r\n if (removed.length === 0) return false;\r\n const removedSet = new Set(removed.map((p) => normalizeRelativePath(p)));\r\n return material.every((line) => {\r\n const path = normalizeRelativePath(pathFromGitStatusLine(line));\r\n return removedSet.has(path);\r\n });\r\n}\r\n", "// Server mirror: lib/agent-os/harness-worktree-completion/worktree-completion-handoff.ts\r\n\r\nimport {\r\n dirtyPathsCoveredByDisposableRemoval,\r\n extractDisposableArtifactsRemoved,\r\n} from \"./disposable-artifacts.js\";\r\nimport { materialWorktreeChanges } from \"./material-worktree-changes.js\";\r\n\r\nexport type WorktreeCompletionHandoffState =\r\n | \"clean\"\r\n | \"pr_handoff\"\r\n | \"commit_handoff\"\r\n | \"dirty_worktree\"\r\n | \"dirty_worktree_no_pr\";\r\n\r\nexport interface WorktreeCompletionHandoffInput {\r\n changedFiles?: unknown;\r\n finalResult?: unknown;\r\n prUrl?: string | null;\r\n headCommit?: string | null;\r\n artifactBundlePath?: string | null;\r\n patchPath?: string | null;\r\n disposableArtifactsRemoved?: string[] | null;\r\n}\r\n\r\nexport interface WorktreeCompletionHandoffVerdict {\r\n allowed: boolean;\r\n state: WorktreeCompletionHandoffState;\r\n materialDirtyCount: number;\r\n detail?: string;\r\n}\r\n\r\nfunction trimOrNull(value: unknown): string | null {\r\n if (typeof value !== \"string\") return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\nfunction stringList(value: unknown): string[] {\r\n if (!Array.isArray(value)) return [];\r\n return value\r\n .map((item) => (typeof item === \"string\" ? item.trim() : \"\"))\r\n .filter(Boolean);\r\n}\r\n\r\nfunction hasFinalResult(value: unknown): boolean {\r\n if (value === undefined || value === null) return false;\r\n if (typeof value === \"string\") return value.trim().length > 0;\r\n if (typeof value === \"boolean\") return value;\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\r\n return true;\r\n}\r\n\r\nfunction hasCommittedLandingRef(input: WorktreeCompletionHandoffInput): boolean {\r\n if (trimOrNull(input.headCommit)) return true;\r\n if (trimOrNull(input.prUrl)) return true;\r\n if (trimOrNull(input.artifactBundlePath)) return true;\r\n if (trimOrNull(input.patchPath)) return true;\r\n return false;\r\n}\r\n\r\nfunction mergedDisposableRemoved(input: WorktreeCompletionHandoffInput): string[] {\r\n const fromWorker = stringList(input.disposableArtifactsRemoved);\r\n const fromResult = extractDisposableArtifactsRemoved(input.finalResult);\r\n return [...new Set([...fromWorker, ...fromResult])];\r\n}\r\n\r\nexport function assessWorktreeCompletionHandoff(\r\n input: WorktreeCompletionHandoffInput,\r\n): WorktreeCompletionHandoffVerdict {\r\n const rawDirty = stringList(input.changedFiles);\r\n const materialDirty = materialWorktreeChanges(rawDirty);\r\n const removed = mergedDisposableRemoved(input);\r\n const effectivelyClean =\r\n materialDirty.length === 0 ||\r\n dirtyPathsCoveredByDisposableRemoval(rawDirty, removed);\r\n\r\n if (trimOrNull(input.prUrl)) {\r\n if (!effectivelyClean) {\r\n return {\r\n allowed: false,\r\n state: \"dirty_worktree\",\r\n materialDirtyCount: materialDirty.length,\r\n detail: `Worktree has ${materialDirty.length} uncommitted change(s) with a PR attached; commit or discard before completing`,\r\n };\r\n }\r\n return { allowed: true, state: \"pr_handoff\", materialDirtyCount: 0 };\r\n }\r\n\r\n if (trimOrNull(input.headCommit)) {\r\n if (!effectivelyClean) {\r\n return {\r\n allowed: false,\r\n state: \"dirty_worktree\",\r\n materialDirtyCount: materialDirty.length,\r\n detail: `Worktree has ${materialDirty.length} uncommitted change(s) on top of a commit; commit or discard before completing`,\r\n };\r\n }\r\n return { allowed: true, state: \"commit_handoff\", materialDirtyCount: 0 };\r\n }\r\n\r\n if (trimOrNull(input.artifactBundlePath) || trimOrNull(input.patchPath)) {\r\n if (!effectivelyClean) {\r\n return {\r\n allowed: false,\r\n state: \"dirty_worktree\",\r\n materialDirtyCount: materialDirty.length,\r\n detail: `Worktree has ${materialDirty.length} uncommitted change(s) with a patch/bundle handoff; clean the tree before completing`,\r\n };\r\n }\r\n return { allowed: true, state: \"commit_handoff\", materialDirtyCount: 0 };\r\n }\r\n\r\n if (effectivelyClean) {\r\n return { allowed: true, state: \"clean\", materialDirtyCount: 0 };\r\n }\r\n\r\n if (hasFinalResult(input.finalResult)) {\r\n return {\r\n allowed: false,\r\n state: \"dirty_worktree_no_pr\",\r\n materialDirtyCount: materialDirty.length,\r\n detail: `Worktree has ${materialDirty.length} uncommitted change(s) with no commit or PR; commit, open a PR, discard, or remove one-off files via \\`kynver worker discard-disposable\\` before completing`,\r\n };\r\n }\r\n\r\n return {\r\n allowed: false,\r\n state: \"dirty_worktree\",\r\n materialDirtyCount: materialDirty.length,\r\n detail: `Worktree has ${materialDirty.length} uncommitted change(s) with no final result`,\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { loadRun, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport type { HarnessWorkerRecord, RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\n/** Board task statuses that mean the harness worker's execution slice is over. */\r\nconst TASK_LEFT_RUNNING = new Set([\r\n \"awaiting_review\",\r\n \"blocked\",\r\n \"done\",\r\n \"needs_input\",\r\n \"waiting\",\r\n \"scheduled\",\r\n \"ready\",\r\n \"cancelled\",\r\n \"failed\",\r\n]);\r\n\r\nexport interface CompletionSnapshot {\r\n finalResult?: unknown;\r\n prUrl?: string | null;\r\n summary?: string | null;\r\n}\r\n\r\nexport function isCompletionAcknowledged(worker: HarnessWorkerRecord): boolean {\r\n return Boolean(\r\n typeof worker.completionReportedAt === \"string\" && worker.completionReportedAt.trim(),\r\n );\r\n}\r\n\r\nfunction summaryFromFinalResult(finalResult: unknown): string | null {\r\n if (typeof finalResult === \"string\") {\r\n const trimmed = finalResult.trim();\r\n return trimmed.length ? trimmed : null;\r\n }\r\n if (finalResult && typeof finalResult === \"object\" && !Array.isArray(finalResult)) {\r\n const record = finalResult as Record<string, unknown>;\r\n const summary = record.summary ?? record.finalSummary ?? record.message;\r\n if (typeof summary === \"string\" && summary.trim()) return summary.trim();\r\n try {\r\n return JSON.stringify(finalResult);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function completionSnapshotFromStatus(\r\n status: RawHarnessWorkerStatus,\r\n): CompletionSnapshot {\r\n const resolved = status.finalResult ?? null;\r\n const summary =\r\n typeof status.lastHeartbeatSummary === \"string\"\r\n ? status.lastHeartbeatSummary\r\n : summaryFromFinalResult(resolved);\r\n return {\r\n finalResult: resolved ?? summary ?? \"completed\",\r\n summary,\r\n };\r\n}\r\n\r\n/**\r\n * Persist local terminal lifecycle after AgentOS acknowledges harness completion.\r\n * Prevents a later PID reuse or still-running wrapper from re-reporting the worker\r\n * as `running` once the board task has advanced.\r\n */\r\nexport function persistCompletionAcknowledged(\r\n worker: HarnessWorkerRecord,\r\n status: RawHarnessWorkerStatus,\r\n opts?: { source?: string },\r\n): void {\r\n if (\r\n isCompletionAcknowledged(worker) &&\r\n worker.status === \"done\" &&\r\n worker.completionSnapshot != null\r\n ) {\r\n return;\r\n }\r\n const at = new Date().toISOString();\r\n const snapshot = completionSnapshotFromStatus(status);\r\n const source = opts?.source?.trim();\r\n worker.completionReportedAt = at;\r\n worker.completionSnapshot = snapshot;\r\n worker.status = \"done\";\r\n if (source) worker.completionAckSource = source;\r\n saveWorker(worker.runId, worker);\r\n}\r\n\r\ninterface OperatorTickTaskRow {\r\n kind?: string;\r\n id?: string;\r\n taskStatus?: string | null;\r\n}\r\n\r\nfunction taskStatusByIdFromOperatorTick(operatorTick: unknown): Map<string, string> {\r\n const map = new Map<string, string>();\r\n const body = operatorTick as { response?: { tick?: { filteredItems?: OperatorTickTaskRow[] } } };\r\n const items = body.response?.tick?.filteredItems;\r\n if (!Array.isArray(items)) return map;\r\n for (const item of items) {\r\n if (item.kind !== \"task\" || typeof item.id !== \"string\") continue;\r\n const status = typeof item.taskStatus === \"string\" ? item.taskStatus.trim() : \"\";\r\n if (status) map.set(item.id, status);\r\n }\r\n return map;\r\n}\r\n\r\n/**\r\n * When the board task has left `running` but the local worker still looks live\r\n * (common after server-side completion reconcile), mirror the terminal lifecycle\r\n * on disk so harness status matches AgentOS.\r\n */\r\nexport function syncCompletionAcknowledgedFromOperatorTick(\r\n runId: string,\r\n operatorTick: unknown,\r\n): Array<{ worker: string; taskId: string; taskStatus: string }> {\r\n const taskStatusById = taskStatusByIdFromOperatorTick(operatorTick);\r\n if (taskStatusById.size === 0) return [];\r\n\r\n const run = loadRun(runId);\r\n const synced: Array<{ worker: string; taskId: string; taskStatus: string }> = [];\r\n\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.taskId || isCompletionAcknowledged(worker)) continue;\r\n\r\n const taskStatus = taskStatusById.get(worker.taskId);\r\n if (!taskStatus || taskStatus === \"running\" || !TASK_LEFT_RUNNING.has(taskStatus)) {\r\n continue;\r\n }\r\n\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n persistCompletionAcknowledged(worker, status, {\r\n source: `board-task-${taskStatus}`,\r\n });\r\n synced.push({ worker: name, taskId: worker.taskId, taskStatus });\r\n }\r\n\r\n return synced;\r\n}\r\n\r\n/** Reload helper for callers that already hold a worker name. */\r\nexport function acknowledgeWorkerIfBoardTaskAdvanced(\r\n runId: string,\r\n workerName: string,\r\n operatorTick: unknown,\r\n): boolean {\r\n const synced = syncCompletionAcknowledgedFromOperatorTick(runId, operatorTick);\r\n return synced.some((row) => row.worker === workerName);\r\n}\r\n", "import path from \"node:path\";\r\nimport { fail } from \"./util.js\";\r\n\r\nconst RUN_ID_RE = /^[a-z0-9][a-z0-9._-]{0,127}$/i;\r\nconst WORKER_NAME_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/i;\r\n\r\nconst WORKER_TARGET_SENTINELS = new Set([\"undefined\", \"null\"]);\r\n\r\nconst WORKER_STATUS_USAGE =\r\n \"usage: kynver worker <action> --run RUN_ID --name WORKER_NAME\";\r\n\r\nexport function validateRunId(runId: string): string {\r\n const trimmed = runId.trim();\r\n if (!RUN_ID_RE.test(trimmed)) throw new Error(`invalid run id: ${runId}`);\r\n return trimmed;\r\n}\r\n\r\nexport function validateWorkerName(name: string): string {\r\n const trimmed = name.trim();\r\n if (!WORKER_NAME_RE.test(trimmed)) throw new Error(`invalid worker name: ${name}`);\r\n return trimmed;\r\n}\r\n\r\nfunction rawArg(value: string | boolean | undefined): string {\r\n return typeof value === \"string\" ? value.trim() : \"\";\r\n}\r\n\r\n/**\r\n * Require `--run` and `--name` before touching the filesystem. Missing flags used\r\n * to become `String(undefined)` \u2192 paths under `runs/undefined/workers/undefined`.\r\n */\r\nexport function resolveWorkerTargetArgs(args: Record<string, string | boolean>): {\r\n runId: string;\r\n workerName: string;\r\n} {\r\n const rawRun = rawArg(args.run);\r\n const rawName = rawArg(args.name);\r\n\r\n if (!rawRun || WORKER_TARGET_SENTINELS.has(rawRun)) {\r\n fail(`missing --run RUN_ID (${WORKER_STATUS_USAGE})`);\r\n }\r\n if (!rawName || WORKER_TARGET_SENTINELS.has(rawName)) {\r\n fail(`missing --name WORKER_NAME (${WORKER_STATUS_USAGE})`);\r\n }\r\n\r\n return {\r\n runId: validateRunId(rawRun),\r\n workerName: validateWorkerName(rawName),\r\n };\r\n}\r\n\r\n/** Require `--run` before loading run.json or building a run board. */\r\nexport function resolveRunTargetArg(args: Record<string, string | boolean>): string {\r\n const rawRun = rawArg(args.run);\r\n if (!rawRun || WORKER_TARGET_SENTINELS.has(rawRun)) {\r\n fail(\"missing --run RUN_ID (usage: kynver run status --run RUN_ID)\");\r\n }\r\n return validateRunId(rawRun);\r\n}\r\n\r\nexport function validateRepo(repo: string): string {\r\n const resolved = path.resolve(repo);\r\n if (resolved.includes(\"..\")) throw new Error(\"repo path must not contain .. segments\");\r\n return resolved;\r\n}\r\n\r\nexport function validateOwnedPaths(repoRoot: string, ownedPaths: string[]): string[] {\r\n return ownedPaths.map((owned) => {\r\n const resolved = path.resolve(repoRoot, owned);\r\n const rel = path.relative(repoRoot, resolved);\r\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) {\r\n throw new Error(`owned path escapes repo: ${owned}`);\r\n }\r\n return resolved;\r\n });\r\n}\r\n\r\nexport function validateTailLines(lines: number): number {\r\n if (!Number.isFinite(lines) || lines <= 0 || lines > 500) return 40;\r\n return Math.floor(lines);\r\n}\r\n", "import { git, gitCapture } from \"./git.js\";\r\n\r\n/**\r\n * Add a worktree checked out at an existing remote branch (repair-target checkout).\r\n */\r\nexport function addWorktreeForRepairBranch(\r\n repo: string,\r\n worktreePath: string,\r\n branch: string,\r\n): void {\r\n git(repo, [\"fetch\", \"origin\", branch, \"--prune\"], { allowFailure: true });\r\n const remoteRef = `origin/${branch}`;\r\n const added = gitCapture(repo, [\"worktree\", \"add\", \"-B\", branch, worktreePath, remoteRef]);\r\n if (added.status === 0) return;\r\n\r\n const fallback = gitCapture(repo, [\"worktree\", \"add\", \"-b\", branch, worktreePath, \"HEAD\"]);\r\n if (fallback.status !== 0) {\r\n const detail =\r\n added.stderr ||\r\n added.stdout ||\r\n fallback.stderr ||\r\n fallback.stdout ||\r\n \"git worktree add failed for repair target branch\";\r\n throw new Error(detail);\r\n }\r\n}\r\n", "import path from \"node:path\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { isActiveHarnessWorker } from \"./harness-worker-active.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface ActiveHarnessWorkerRef {\r\n runId: string;\r\n workerName: string;\r\n taskId: string;\r\n pid?: number;\r\n writeSetPrefixes?: string[];\r\n ownedPaths?: string[];\r\n allowConcurrentHotspot?: boolean;\r\n}\r\n\r\nfunction workerWriteSetFields(worker: HarnessWorkerRecord): Pick<\r\n ActiveHarnessWorkerRef,\r\n \"writeSetPrefixes\" | \"ownedPaths\" | \"allowConcurrentHotspot\"\r\n> {\r\n const ownedPaths = Array.isArray(worker.ownedPaths)\r\n ? worker.ownedPaths.filter((p): p is string => typeof p === \"string\")\r\n : [];\r\n const writeSetPrefixes = Array.isArray(\r\n (worker as HarnessWorkerRecord & { writeSetPrefixes?: unknown }).writeSetPrefixes,\r\n )\r\n ? (\r\n (worker as HarnessWorkerRecord & { writeSetPrefixes?: string[] }).writeSetPrefixes ?? []\r\n ).filter((p): p is string => typeof p === \"string\")\r\n : [];\r\n return {\r\n ...(ownedPaths.length ? { ownedPaths } : {}),\r\n ...(writeSetPrefixes.length ? { writeSetPrefixes } : {}),\r\n ...((worker as HarnessWorkerRecord & { allowConcurrentHotspot?: boolean }).allowConcurrentHotspot\r\n ? { allowConcurrentHotspot: true }\r\n : {}),\r\n };\r\n}\r\n\r\n/** Live harness workers in one run \u2014 matches dispatch-next occupancy reporting. */\r\nexport function collectRunActiveHarnessWorkers(runId: string): ActiveHarnessWorkerRef[] {\r\n const run = loadRun(runId);\r\n const out: ActiveHarnessWorkerRef[] = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.taskId || !isActiveHarnessWorker(worker)) continue;\r\n out.push({\r\n runId: run.id,\r\n workerName: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n ...workerWriteSetFields(worker),\r\n });\r\n }\r\n return out;\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\n\r\n/** Stable hash for readback verification (normalized trailing whitespace). */\r\nexport function hashPlanBody(body: string): string {\r\n const normalized = body.replace(/\\r\\n/g, \"\\n\").trimEnd();\r\n return createHash(\"sha256\").update(normalized, \"utf8\").digest(\"hex\");\r\n}\r\n\r\nexport function hashSummary(summary: string | null | undefined): string | null {\r\n if (summary == null) return null;\r\n const trimmed = summary.trim();\r\n if (!trimmed) return null;\r\n return createHash(\"sha256\").update(trimmed, \"utf8\").digest(\"hex\");\r\n}\r\n", "import { loadApiKey, resolveBaseUrl } from \"../config.js\";\r\nimport { classifyFetchFailure, classifyHttpFailure, PlanPersistError } from \"./errors.js\";\r\nimport type { PersistPlanInput, PlanPersistSourceRefs } from \"./types.js\";\r\n\r\nexport interface AgentOsPlanGetPayload {\r\n plan: {\r\n id: string;\r\n title: string;\r\n summary: string | null;\r\n currentVersionId: string | null;\r\n };\r\n currentVersion: {\r\n id: string;\r\n versionNumber: number;\r\n title: string;\r\n body: string;\r\n summary: string | null;\r\n } | null;\r\n}\r\n\r\nexport interface AgentOsWriteResult {\r\n planId: string;\r\n versionId: string | null;\r\n versionNumber: number | null;\r\n}\r\n\r\nexport interface AgentOsApiDeps {\r\n baseUrl?: string;\r\n apiKey?: string;\r\n fetchFn?: typeof fetch;\r\n}\r\n\r\nfunction authHeaders(apiKey: string | undefined): Record<string, string> {\r\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\r\n return headers;\r\n}\r\n\r\nasync function parseJsonResponse(res: Response): Promise<unknown> {\r\n const text = await res.text();\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n}\r\n\r\nexport async function agentOsGetPlan(\r\n slug: string,\r\n planId: string,\r\n deps: AgentOsApiDeps = {},\r\n): Promise<AgentOsPlanGetPayload> {\r\n const base = resolveBaseUrl(deps.baseUrl);\r\n const apiKey = deps.apiKey ?? loadApiKey();\r\n const fetchFn = deps.fetchFn ?? fetch;\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}`;\r\n\r\n try {\r\n const res = await fetchFn(url, { method: \"GET\", headers: authHeaders(apiKey) });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `GET plan failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n return parsed as AgentOsPlanGetPayload;\r\n } catch (err) {\r\n if (err instanceof PlanPersistError) throw err;\r\n throw classifyFetchFailure(err);\r\n }\r\n}\r\n\r\nexport async function agentOsWritePlan(\r\n input: PersistPlanInput,\r\n deps: AgentOsApiDeps = {},\r\n): Promise<AgentOsWriteResult> {\r\n const base = resolveBaseUrl(deps.baseUrl);\r\n const apiKey = deps.apiKey ?? loadApiKey();\r\n const fetchFn = deps.fetchFn ?? fetch;\r\n const slug = input.agentOsSlug;\r\n\r\n try {\r\n if (input.operation === \"create\") {\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans`;\r\n const body = {\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n slug: input.planSlug ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n initialVersion: {\r\n title: input.title,\r\n body: input.body,\r\n summary: input.summary ?? null,\r\n changeSummary: input.changeSummary ?? null,\r\n author: input.author ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n },\r\n };\r\n const res = await fetchFn(url, {\r\n method: \"POST\",\r\n headers: authHeaders(apiKey),\r\n body: JSON.stringify(body),\r\n });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `create plan failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n const row = parsed as { plan: { id: string }; version: { id: string; versionNumber: number } };\r\n return {\r\n planId: row.plan.id,\r\n versionId: row.version.id,\r\n versionNumber: row.version.versionNumber,\r\n };\r\n }\r\n\r\n const planId = input.planId;\r\n if (!planId) throw new PlanPersistError(\"permanent\", \"planId is required for this operation\");\r\n\r\n if (input.operation === \"update_metadata\") {\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}`;\r\n const body: Record<string, unknown> = {\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n };\r\n const res = await fetchFn(url, {\r\n method: \"PATCH\",\r\n headers: authHeaders(apiKey),\r\n body: JSON.stringify(body),\r\n });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `update plan failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n const row = parsed as { id: string; currentVersionId: string | null };\r\n return {\r\n planId: row.id,\r\n versionId: row.currentVersionId,\r\n versionNumber: null,\r\n };\r\n }\r\n\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}/versions`;\r\n const body = {\r\n title: input.title,\r\n body: input.body,\r\n summary: input.summary ?? null,\r\n changeSummary: input.changeSummary ?? null,\r\n author: input.author ?? null,\r\n sourceRefs: mergeSourceRefs(input),\r\n markCurrent: input.markCurrent !== false,\r\n };\r\n const res = await fetchFn(url, {\r\n method: \"POST\",\r\n headers: authHeaders(apiKey),\r\n body: JSON.stringify(body),\r\n });\r\n const parsed = await parseJsonResponse(res);\r\n if (!res.ok) {\r\n const msg =\r\n typeof parsed === \"object\" && parsed && \"error\" in parsed\r\n ? String((parsed as { error: unknown }).error)\r\n : `add version failed (${res.status})`;\r\n throw classifyHttpFailure(res.status, msg);\r\n }\r\n const row = parsed as { version: { id: string; versionNumber: number; planId: string } };\r\n return {\r\n planId: row.version.planId,\r\n versionId: row.version.id,\r\n versionNumber: row.version.versionNumber,\r\n };\r\n } catch (err) {\r\n if (err instanceof PlanPersistError) throw err;\r\n throw classifyFetchFailure(err);\r\n }\r\n}\r\n\r\nfunction mergeSourceRefs(input: PersistPlanInput): PlanPersistSourceRefs | null {\r\n const refs: PlanPersistSourceRefs = { ...(input.sourceRefs ?? {}) };\r\n if (input.model) refs.model = input.model;\r\n if (!Object.keys(refs).length) return input.sourceRefs ?? null;\r\n return refs;\r\n}\r\n", "import type { PlanPersistFailureKind } from \"./types.js\";\r\n\r\nexport class PlanPersistError extends Error {\r\n readonly kind: PlanPersistFailureKind;\r\n readonly httpStatus?: number;\r\n\r\n constructor(kind: PlanPersistFailureKind, message: string, httpStatus?: number) {\r\n super(message);\r\n this.name = \"PlanPersistError\";\r\n this.kind = kind;\r\n this.httpStatus = httpStatus;\r\n }\r\n}\r\n\r\nexport function classifyHttpFailure(status: number, message: string): PlanPersistError {\r\n if (status === 401 || status === 403) {\r\n return new PlanPersistError(\"auth\", message, status);\r\n }\r\n if (status >= 500) {\r\n return new PlanPersistError(\"server\", message, status);\r\n }\r\n return new PlanPersistError(\"permanent\", message, status);\r\n}\r\n\r\nexport function classifyFetchFailure(err: unknown): PlanPersistError {\r\n const message = err instanceof Error ? err.message : String(err);\r\n if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|fetch failed|network/i.test(message)) {\r\n return new PlanPersistError(\"network\", message);\r\n }\r\n return new PlanPersistError(\"tool_interruption\", message);\r\n}\r\n\r\nexport function isRetryableFailure(kind: PlanPersistFailureKind): boolean {\r\n return kind !== \"permanent\";\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\nimport type { PersistPlanInput } from \"./types.js\";\r\nimport { hashPlanBody, hashSummary } from \"./body-hash.js\";\r\n\r\nexport function buildPlanPersistIdempotencyKey(input: PersistPlanInput): string {\r\n const payload = {\r\n operation: input.operation,\r\n agentOsSlug: input.agentOsSlug,\r\n planId: input.planId ?? null,\r\n planSlug: input.planSlug ?? null,\r\n title: input.title.trim(),\r\n summaryHash: hashSummary(input.summary),\r\n bodyHash: hashPlanBody(input.body),\r\n changeSummary: input.changeSummary?.trim() ?? null,\r\n markCurrent: input.markCurrent ?? true,\r\n };\r\n return createHash(\"sha256\").update(JSON.stringify(payload), \"utf8\").digest(\"hex\");\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nexport function resolveKynverStateRoot(): string {\r\n const env = process.env.KYNVER_STATE_ROOT;\r\n if (env) return path.resolve(env);\r\n return path.join(homedir(), \".kynver\", \"state\");\r\n}\r\n\r\nexport function planOutboxDir(): string {\r\n return path.join(resolveKynverStateRoot(), \"plan-outbox\");\r\n}\r\n\r\nexport function planOutboxArchiveDir(): string {\r\n return path.join(resolveKynverStateRoot(), \"plan-outbox-archive\");\r\n}\r\n\r\nexport function ensurePlanOutboxDirs(): { outboxDir: string; archiveDir: string } {\r\n const outboxDir = planOutboxDir();\r\n const archiveDir = planOutboxArchiveDir();\r\n mkdirSync(outboxDir, { recursive: true });\r\n mkdirSync(archiveDir, { recursive: true });\r\n return { outboxDir, archiveDir };\r\n}\r\n\r\nexport function isTmpOnlyPath(filePath: string): boolean {\r\n // Detect literal POSIX temp paths first \u2014 on Windows, path.resolve(\"/tmp/x\")\r\n // rewrites to \"C:\\tmp\\x\" and would no longer match, so a /tmp-only path would\r\n // wrongly read as durable. Check the raw string before resolving.\r\n if (filePath.startsWith(\"/tmp/\") || filePath.startsWith(\"/var/folders/\")) return true;\r\n const resolved = path.resolve(filePath);\r\n return resolved.startsWith(\"/tmp/\") || resolved.startsWith(path.join(\"/var\", \"folders\"));\r\n}\r\n", "import {\r\n existsSync,\r\n readFileSync,\r\n renameSync,\r\n readdirSync,\r\n writeFileSync,\r\n unlinkSync,\r\n} from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { randomUUID } from \"node:crypto\";\r\nimport type { PlanOutboxItem, PersistPlanInput } from \"./types.js\";\r\nimport { hashPlanBody } from \"./body-hash.js\";\r\nimport { buildPlanPersistIdempotencyKey } from \"./idempotency.js\";\r\nimport { ensurePlanOutboxDirs, planOutboxDir } from \"./paths.js\";\r\n\r\nconst DEFAULT_MAX_RETRIES = 12;\r\n\r\nexport function listOutboxItems(): PlanOutboxItem[] {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const files = readdirSync(outboxDir).filter((f) => f.endsWith(\".json\"));\r\n const items: PlanOutboxItem[] = [];\r\n for (const file of files) {\r\n const item = readOutboxItem(path.join(outboxDir, file));\r\n if (item && item.queueStatus === \"queued\") items.push(item);\r\n }\r\n return items.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\r\n}\r\n\r\nexport function findOutboxByIdempotencyKey(key: string): PlanOutboxItem | null {\r\n for (const item of listOutboxItems()) {\r\n if (item.idempotencyKey === key) return item;\r\n }\r\n return null;\r\n}\r\n\r\nexport function readOutboxItem(jsonPath: string): PlanOutboxItem | null {\r\n if (!existsSync(jsonPath)) return null;\r\n try {\r\n return JSON.parse(readFileSync(jsonPath, \"utf8\")) as PlanOutboxItem;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readOutboxBody(item: PlanOutboxItem): string {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const bodyFile = path.join(outboxDir, item.bodyPath);\r\n return readFileSync(bodyFile, \"utf8\");\r\n}\r\n\r\nexport function writeOutboxItem(input: PersistPlanInput, opts: {\r\n lastError: string;\r\n lastFailureKind: PlanOutboxItem[\"lastFailureKind\"];\r\n existing?: PlanOutboxItem;\r\n}): PlanOutboxItem {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const now = new Date().toISOString();\r\n const id = opts.existing?.id ?? randomUUID();\r\n const bodyPath = opts.existing?.bodyPath ?? `${id}.body.md`;\r\n const jsonPath = path.join(outboxDir, `${id}.json`);\r\n const bodyFile = path.join(outboxDir, bodyPath);\r\n\r\n if (!opts.existing) {\r\n writeFileSync(bodyFile, input.body, \"utf8\");\r\n }\r\n\r\n const item: PlanOutboxItem = {\r\n id,\r\n idempotencyKey: buildPlanPersistIdempotencyKey(input),\r\n operation: input.operation,\r\n agentOsSlug: input.agentOsSlug,\r\n planId: input.planId ?? opts.existing?.planId ?? null,\r\n planSlug: input.planSlug ?? opts.existing?.planSlug ?? null,\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n bodyPath,\r\n bodyHash: hashPlanBody(input.body),\r\n author: input.author ?? null,\r\n model: input.model ?? null,\r\n sourceRefs: input.sourceRefs ?? null,\r\n changeSummary: input.changeSummary ?? null,\r\n markCurrent: input.markCurrent ?? true,\r\n createdAt: opts.existing?.createdAt ?? now,\r\n updatedAt: now,\r\n retryCount: (opts.existing?.retryCount ?? 0) + (opts.existing ? 1 : 0),\r\n maxRetries: input.maxRetries ?? opts.existing?.maxRetries ?? DEFAULT_MAX_RETRIES,\r\n lastError: opts.lastError,\r\n lastFailureKind: opts.lastFailureKind,\r\n queueStatus: \"queued\",\r\n userStatus: \"queued for retry\",\r\n readbackEvidence: null,\r\n };\r\n\r\n writeFileSync(jsonPath, `${JSON.stringify(item, null, 2)}\\n`, { mode: 0o600 });\r\n return item;\r\n}\r\n\r\nexport function saveOutboxItem(item: PlanOutboxItem): void {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n const jsonPath = path.join(outboxDir, `${item.id}.json`);\r\n writeFileSync(jsonPath, `${JSON.stringify(item, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\nexport function archiveOutboxItem(item: PlanOutboxItem): void {\r\n const { outboxDir, archiveDir } = ensurePlanOutboxDirs();\r\n const jsonSrc = path.join(outboxDir, `${item.id}.json`);\r\n const bodySrc = path.join(outboxDir, item.bodyPath);\r\n const jsonDst = path.join(archiveDir, `${item.id}.json`);\r\n const bodyDst = path.join(archiveDir, item.bodyPath);\r\n if (existsSync(jsonSrc)) renameSync(jsonSrc, jsonDst);\r\n if (existsSync(bodySrc)) renameSync(bodySrc, bodyDst);\r\n}\r\n\r\nexport function outboxItemPaths(item: PlanOutboxItem): { jsonPath: string; bodyPath: string } {\r\n const { outboxDir } = ensurePlanOutboxDirs();\r\n return {\r\n jsonPath: path.join(outboxDir, `${item.id}.json`),\r\n bodyPath: path.join(outboxDir, item.bodyPath),\r\n };\r\n}\r\n\r\nexport function removeOutboxItem(item: PlanOutboxItem): void {\r\n const { jsonPath, bodyPath } = outboxItemPaths(item);\r\n if (existsSync(jsonPath)) unlinkSync(jsonPath);\r\n if (existsSync(bodyPath)) unlinkSync(bodyPath);\r\n}\r\n\r\nexport function outboxInputFromItem(item: PlanOutboxItem, body: string): PersistPlanInput {\r\n return {\r\n operation: item.operation,\r\n agentOsSlug: item.agentOsSlug,\r\n planId: item.planId,\r\n planSlug: item.planSlug,\r\n title: item.title,\r\n summary: item.summary,\r\n body,\r\n changeSummary: item.changeSummary ?? undefined,\r\n author: item.author ?? undefined,\r\n model: item.model ?? undefined,\r\n sourceRefs: item.sourceRefs,\r\n markCurrent: item.markCurrent ?? true,\r\n maxRetries: item.maxRetries,\r\n };\r\n}\r\n", "import { hashPlanBody, hashSummary } from \"./body-hash.js\";\r\nimport { PlanPersistError } from \"./errors.js\";\r\nimport { agentOsGetPlan, type AgentOsApiDeps } from \"./agentos-api.js\";\r\nimport type { PlanPersistReadbackEvidence, PersistPlanInput } from \"./types.js\";\r\n\r\nexport interface ReadbackExpectation {\r\n planId: string;\r\n title: string;\r\n summary: string | null;\r\n body: string;\r\n bodyHash: string;\r\n versionId?: string | null;\r\n versionNumber?: number | null;\r\n}\r\n\r\nexport async function verifyPlanReadback(\r\n slug: string,\r\n expectation: ReadbackExpectation,\r\n deps: AgentOsApiDeps = {},\r\n): Promise<PlanPersistReadbackEvidence> {\r\n const payload = await agentOsGetPlan(slug, expectation.planId, deps);\r\n const plan = payload.plan;\r\n const current = payload.currentVersion;\r\n\r\n if (plan.title.trim() !== expectation.title.trim()) {\r\n throw new PlanPersistError(\r\n \"verification_failed\",\r\n `title mismatch: expected \"${expectation.title}\", got \"${plan.title}\"`,\r\n );\r\n }\r\n\r\n const expectedSummaryHash = hashSummary(expectation.summary);\r\n const actualSummaryHash = hashSummary(plan.summary);\r\n if (expectedSummaryHash !== actualSummaryHash) {\r\n throw new PlanPersistError(\"verification_failed\", \"summary mismatch on readback\");\r\n }\r\n\r\n if (expectation.versionId && plan.currentVersionId !== expectation.versionId) {\r\n throw new PlanPersistError(\r\n \"verification_failed\",\r\n `currentVersionId mismatch: expected ${expectation.versionId}, got ${plan.currentVersionId}`,\r\n );\r\n }\r\n\r\n if (expectation.versionNumber != null) {\r\n if (!current || current.versionNumber !== expectation.versionNumber) {\r\n throw new PlanPersistError(\r\n \"verification_failed\",\r\n `versionNumber mismatch: expected ${expectation.versionNumber}, got ${current?.versionNumber ?? \"none\"}`,\r\n );\r\n }\r\n }\r\n\r\n const bodyForHash = current?.body ?? \"\";\r\n const actualBodyHash = hashPlanBody(bodyForHash);\r\n if (expectation.bodyHash && actualBodyHash !== expectation.bodyHash) {\r\n throw new PlanPersistError(\"verification_failed\", \"body hash mismatch on readback\");\r\n }\r\n\r\n return {\r\n planId: plan.id,\r\n currentVersionId: plan.currentVersionId,\r\n versionNumber: current?.versionNumber ?? null,\r\n title: plan.title,\r\n summary: plan.summary,\r\n bodyHash: expectation.bodyHash || actualBodyHash,\r\n readAt: new Date().toISOString(),\r\n };\r\n}\r\n\r\nexport function buildReadbackExpectation(\r\n input: PersistPlanInput,\r\n write: { planId: string; versionId: string | null; versionNumber: number | null },\r\n): ReadbackExpectation {\r\n return {\r\n planId: write.planId,\r\n title: input.title,\r\n summary: input.summary ?? null,\r\n body: input.body,\r\n bodyHash: hashPlanBody(input.body),\r\n versionId: write.versionId,\r\n versionNumber: write.versionNumber,\r\n };\r\n}\r\n", "import type { AgentOsApiDeps } from \"./agentos-api.js\";\r\nimport { agentOsWritePlan } from \"./agentos-api.js\";\r\nimport { isRetryableFailure, PlanPersistError } from \"./errors.js\";\r\nimport { buildPlanPersistIdempotencyKey } from \"./idempotency.js\";\r\nimport { isTmpOnlyPath } from \"./paths.js\";\r\nimport {\r\n archiveOutboxItem,\r\n findOutboxByIdempotencyKey,\r\n outboxItemPaths,\r\n saveOutboxItem,\r\n writeOutboxItem,\r\n} from \"./outbox-store.js\";\r\nimport {\r\n buildReadbackExpectation,\r\n verifyPlanReadback,\r\n type ReadbackExpectation,\r\n} from \"./readback.js\";\r\nimport type {\r\n PersistPlanInput,\r\n PersistPlanResult,\r\n PlanOutboxItem,\r\n PlanPersistUserStatus,\r\n} from \"./types.js\";\r\n\r\nexport interface PersistPlanDeps extends AgentOsApiDeps {\r\n /** When set, skip live HTTP (tests). */\r\n writePlan?: typeof agentOsWritePlan;\r\n verifyReadback?: typeof verifyPlanReadback;\r\n}\r\n\r\nconst SUCCESS_STATUS: PlanPersistUserStatus = \"persisted and read back\";\r\nconst QUEUED_STATUS: PlanPersistUserStatus = \"queued for retry\";\r\nconst FAILED_STATUS: PlanPersistUserStatus = \"failed and needs action\";\r\n\r\nexport async function persistPlan(\r\n input: PersistPlanInput,\r\n deps: PersistPlanDeps = {},\r\n): Promise<PersistPlanResult> {\r\n if (input.bodyPathHint && isTmpOnlyPath(input.bodyPathHint)) {\r\n // Caller must not treat /tmp-only paths as durable persistence.\r\n }\r\n\r\n const idempotencyKey = buildPlanPersistIdempotencyKey(input);\r\n const existingOutbox = findOutboxByIdempotencyKey(idempotencyKey);\r\n if (existingOutbox?.readbackEvidence) {\r\n return {\r\n userStatus: SUCCESS_STATUS,\r\n outboxId: existingOutbox.id,\r\n planId: existingOutbox.readbackEvidence.planId,\r\n readbackEvidence: existingOutbox.readbackEvidence,\r\n idempotencyKey,\r\n };\r\n }\r\n\r\n if (input.immediateFailure) {\r\n return queueForRetry(input, input.immediateFailure.message, input.immediateFailure.kind, existingOutbox);\r\n }\r\n\r\n const writeFn = deps.writePlan ?? agentOsWritePlan;\r\n const verifyFn = deps.verifyReadback ?? verifyPlanReadback;\r\n\r\n try {\r\n const write = await writeFn(input, deps);\r\n const enriched: PersistPlanInput = { ...input, planId: write.planId };\r\n const expectation = buildReadbackExpectation(enriched, write);\r\n const readback = await verifyFn(\r\n input.agentOsSlug,\r\n readbackExpectationForOperation(input, expectation),\r\n deps,\r\n );\r\n if (existingOutbox) archiveOutboxItem(existingOutbox);\r\n return {\r\n userStatus: SUCCESS_STATUS,\r\n planId: write.planId,\r\n versionId: write.versionId ?? undefined,\r\n readbackEvidence: readback,\r\n idempotencyKey,\r\n };\r\n } catch (err) {\r\n const failure =\r\n err instanceof PlanPersistError\r\n ? err\r\n : new PlanPersistError(\"tool_interruption\", err instanceof Error ? err.message : String(err));\r\n\r\n if (!isRetryableFailure(failure.kind)) {\r\n const item = writeOutboxItem(input, {\r\n lastError: failure.message,\r\n lastFailureKind: failure.kind,\r\n existing: existingOutbox ?? undefined,\r\n });\r\n const paths = outboxItemPaths(item);\r\n const failed = markOutboxFailed(item, failure.message);\r\n return {\r\n userStatus: FAILED_STATUS,\r\n outboxId: failed.id,\r\n outboxPath: paths.jsonPath,\r\n bodyPath: paths.bodyPath,\r\n lastError: failure.message,\r\n idempotencyKey,\r\n };\r\n }\r\n\r\n return queueForRetry(input, failure.message, failure.kind, existingOutbox);\r\n }\r\n}\r\n\r\nfunction readbackExpectationForOperation(\r\n input: PersistPlanInput,\r\n expectation: ReadbackExpectation,\r\n): ReadbackExpectation {\r\n if (input.operation === \"update_metadata\") {\r\n return { ...expectation, body: \"\", bodyHash: \"\" };\r\n }\r\n return expectation;\r\n}\r\n\r\nfunction queueForRetry(\r\n input: PersistPlanInput,\r\n message: string,\r\n kind: PlanOutboxItem[\"lastFailureKind\"],\r\n existing: PlanOutboxItem | null,\r\n): PersistPlanResult {\r\n const item = writeOutboxItem(input, {\r\n lastError: message,\r\n lastFailureKind: kind,\r\n existing: existing ?? undefined,\r\n });\r\n const paths = outboxItemPaths(item);\r\n\r\n if (item.retryCount >= item.maxRetries) {\r\n const failed = markOutboxFailed(item, message);\r\n return {\r\n userStatus: FAILED_STATUS,\r\n outboxId: failed.id,\r\n outboxPath: paths.jsonPath,\r\n bodyPath: paths.bodyPath,\r\n lastError: message,\r\n idempotencyKey: item.idempotencyKey,\r\n };\r\n }\r\n\r\n return {\r\n userStatus: QUEUED_STATUS,\r\n outboxId: item.id,\r\n outboxPath: paths.jsonPath,\r\n bodyPath: paths.bodyPath,\r\n lastError: message,\r\n idempotencyKey: item.idempotencyKey,\r\n };\r\n}\r\n\r\nfunction markOutboxFailed(item: PlanOutboxItem, message: string): PlanOutboxItem {\r\n const failed: PlanOutboxItem = {\r\n ...item,\r\n queueStatus: \"failed\",\r\n userStatus: FAILED_STATUS,\r\n lastError: message,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n saveOutboxItem(failed);\r\n return failed;\r\n}\r\n", "import type { AgentOsApiDeps } from \"./agentos-api.js\";\r\nimport {\r\n listOutboxItems,\r\n outboxInputFromItem,\r\n readOutboxBody,\r\n readOutboxItem,\r\n} from \"./outbox-store.js\";\r\nimport { persistPlan, type PersistPlanDeps } from \"./persist.js\";\r\nimport type { DrainOutboxResult, PlanOutboxItem } from \"./types.js\";\r\nimport { planOutboxDir } from \"./paths.js\";\r\nimport path from \"node:path\";\r\n\r\nexport async function drainPlanOutbox(\r\n opts: { max?: number; outboxId?: string } = {},\r\n deps: PersistPlanDeps = {},\r\n): Promise<DrainOutboxResult> {\r\n const items = listOutboxItems().filter((item) =>\r\n opts.outboxId ? item.id === opts.outboxId : true,\r\n );\r\n const slice = opts.max && opts.max > 0 ? items.slice(0, opts.max) : items;\r\n\r\n const result: DrainOutboxResult = {\r\n processed: 0,\r\n succeeded: 0,\r\n stillQueued: 0,\r\n failed: 0,\r\n results: [],\r\n };\r\n\r\n for (const item of slice) {\r\n result.processed += 1;\r\n const body = readOutboxBody(item);\r\n const input = outboxInputFromItem(item, body);\r\n const attempt = await persistPlan(input, deps);\r\n\r\n if (attempt.userStatus === \"persisted and read back\") {\r\n result.succeeded += 1;\r\n } else if (attempt.userStatus === \"failed and needs action\") {\r\n result.failed += 1;\r\n } else {\r\n result.stillQueued += 1;\r\n }\r\n\r\n result.results.push({\r\n outboxId: item.id,\r\n userStatus: attempt.userStatus,\r\n lastError: attempt.lastError,\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function loadOutboxById(outboxId: string): PlanOutboxItem | null {\r\n const jsonPath = path.join(planOutboxDir(), `${outboxId}.json`);\r\n return readOutboxItem(jsonPath);\r\n}\r\n", "import type { PlanOutboxItem } from \"./types.js\";\r\nimport { outboxItemPaths } from \"./outbox-store.js\";\r\n\r\nexport function formatPlanOutboxHandoffBlock(item: PlanOutboxItem): string {\r\n const paths = outboxItemPaths(item);\r\n\r\n return [\r\n \"## Plan persistence risk\",\r\n \"\",\r\n `AgentOS plan write is **not** confirmed (${item.userStatus}).`,\r\n `- outboxId: \\`${item.id}\\``,\r\n item.planId ? `- planId: \\`${item.planId}\\`` : \"- planId: (pending \u2014 create not yet applied)\",\r\n `- outbox: \\`${paths.jsonPath}\\``,\r\n `- body: \\`${paths.bodyPath}\\``,\r\n \"\",\r\n \"Drain when approval/connectivity returns: `kynver plan outbox drain`\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function extractPlanOutboxFromTask(task: Record<string, unknown>): {\r\n outboxId?: string;\r\n jsonPath?: string;\r\n bodyPath?: string;\r\n} | null {\r\n const meta =\r\n task.metadata && typeof task.metadata === \"object\"\r\n ? (task.metadata as Record<string, unknown>)\r\n : null;\r\n const outboxId =\r\n (typeof task.planPersistenceOutboxId === \"string\" && task.planPersistenceOutboxId) ||\r\n (meta && typeof meta.planPersistenceOutboxId === \"string\" ? meta.planPersistenceOutboxId : undefined);\r\n if (!outboxId) return null;\r\n return {\r\n outboxId,\r\n jsonPath:\r\n typeof task.planPersistenceOutboxPath === \"string\"\r\n ? task.planPersistenceOutboxPath\r\n : meta && typeof meta.planPersistenceOutboxPath === \"string\"\r\n ? meta.planPersistenceOutboxPath\r\n : undefined,\r\n bodyPath:\r\n typeof task.planPersistenceBodyPath === \"string\"\r\n ? task.planPersistenceBodyPath\r\n : meta && typeof meta.planPersistenceBodyPath === \"string\"\r\n ? meta.planPersistenceBodyPath\r\n : undefined,\r\n };\r\n}\r\n", "import { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\n\r\nexport interface ReleaseDispatchClaimInput {\r\n baseUrl: string;\r\n secret: string;\r\n agentOsId: string;\r\n taskId: string;\r\n leaseOwner: string;\r\n failureDetail?: string;\r\n}\r\n\r\nexport interface ReleaseDispatchClaimOutcome {\r\n released: boolean;\r\n releaseResponse: unknown;\r\n httpOk: boolean;\r\n}\r\n\r\n/**\r\n * Hand a dispatch-next lease back to the board when local worker spawn did not start.\r\n */\r\nexport async function releaseDispatchClaimAfterSpawnFailure(\r\n input: ReleaseDispatchClaimInput,\r\n): Promise<ReleaseDispatchClaimOutcome> {\r\n const releaseUrl = `${input.baseUrl}/api/agent-os/by-id/${encodeURIComponent(input.agentOsId)}/tasks/${encodeURIComponent(input.taskId)}/release`;\r\n let release;\r\n try {\r\n release = await postJsonWithCredentialRefresh(\r\n releaseUrl,\r\n input.secret,\r\n {\r\n agentOsId: input.agentOsId,\r\n leaseOwner: input.leaseOwner,\r\n ...(input.failureDetail ? { failureDetail: input.failureDetail } : {}),\r\n },\r\n { agentOsId: input.agentOsId, baseUrl: input.baseUrl },\r\n );\r\n } catch (relErr) {\r\n return {\r\n released: false,\r\n httpOk: false,\r\n releaseResponse: { ok: false, error: (relErr as Error).message },\r\n };\r\n }\r\n\r\n const body = release.response as Record<string, unknown> | null;\r\n const released = release.ok === true || body?.ok === true;\r\n return {\r\n released,\r\n httpOk: release.ok === true,\r\n releaseResponse: release.response ?? release,\r\n };\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport type { PrHandoffExec } from \"../pr-handoff/pr-handoff-gh.js\";\r\nimport { defaultPrHandoffExec } from \"../pr-handoff/pr-handoff-gh.js\";\r\nimport { ensureGitHubTokenFromCliAuth } from \"./cli-auth.js\";\r\n\r\nexport type LandPrOutcome = \"merged\" | \"blocked\" | \"skipped\";\r\n\r\nexport interface LandPrCompletionReport {\r\n prUrl: string;\r\n outcome: LandPrOutcome;\r\n mergeCommit?: string | null;\r\n reason: string;\r\n}\r\n\r\nexport interface ExecuteLandPrMergeInput {\r\n prUrl: string;\r\n repo?: string | null;\r\n cwd?: string;\r\n dryRun?: boolean;\r\n skipNotReady?: boolean;\r\n exec?: PrHandoffExec;\r\n}\r\n\r\nconst SUCCESSFUL_CHECK_CONCLUSIONS = new Set([\"SUCCESS\", \"SKIPPED\", \"NEUTRAL\"]);\r\nconst READY_MERGE_STATES = new Set([\"CLEAN\", \"HAS_HOOKS\"]);\r\n\r\ninterface GhPrView {\r\n number: number;\r\n url: string;\r\n title?: string;\r\n body?: string;\r\n state: string;\r\n isDraft: boolean;\r\n mergeStateStatus: string;\r\n statusCheckRollup?: unknown[];\r\n headRefName?: string;\r\n mergedAt?: string | null;\r\n mergeCommit?: { oid?: string } | null;\r\n}\r\n\r\nfunction repoArgs(repo: string | null | undefined): string[] {\r\n return repo?.trim() ? [\"--repo\", repo.trim()] : [];\r\n}\r\n\r\n/** Parse `owner/repo` from a GitHub PR URL, e.g. https://github.com/acme/app/pull/42 -> \"acme/app\". Returns null on non-match. */\r\nexport function repoFromPrUrl(prUrl: string): string | null {\r\n const m = /github\\.com\\/([^/]+)\\/([^/]+)\\/pull\\/\\d+/i.exec(prUrl.trim());\r\n return m ? `${m[1]}/${m[2]}` : null;\r\n}\r\n\r\nfunction ghJson(exec: PrHandoffExec, cwd: string, args: string[]): GhPrView {\r\n const res = exec.gh(cwd, args);\r\n if (res.status !== 0) {\r\n throw new Error(res.stderr || res.stdout || `gh ${args.join(\" \")} failed`);\r\n }\r\n return JSON.parse(res.stdout || \"{}\") as GhPrView;\r\n}\r\n\r\nfunction checkName(check: Record<string, unknown>): string {\r\n return (\r\n (typeof check.name === \"string\" && check.name) ||\r\n (typeof check.context === \"string\" && check.context) ||\r\n (typeof check.workflowName === \"string\" && check.workflowName) ||\r\n \"unknown check\"\r\n );\r\n}\r\n\r\nfunction classifyChecks(statusCheckRollup: unknown[] | undefined) {\r\n const checks = Array.isArray(statusCheckRollup) ? statusCheckRollup : [];\r\n const pending: string[] = [];\r\n const failed: string[] = [];\r\n for (const raw of checks) {\r\n const check = (raw && typeof raw === \"object\" ? raw : {}) as Record<string, unknown>;\r\n const conclusion =\r\n typeof check.conclusion === \"string\" ? check.conclusion.toUpperCase() : \"\";\r\n const status = typeof check.status === \"string\" ? check.status.toUpperCase() : \"\";\r\n const state = typeof check.state === \"string\" ? check.state.toUpperCase() : \"\";\r\n if (conclusion && SUCCESSFUL_CHECK_CONCLUSIONS.has(conclusion)) continue;\r\n if (conclusion) {\r\n failed.push(`${checkName(check)}=${conclusion}`);\r\n continue;\r\n }\r\n if (state && SUCCESSFUL_CHECK_CONCLUSIONS.has(state)) continue;\r\n // EXPECTED is GitHub's \"context registered, waiting for a status\" \u2014 a\r\n // waiting state, not a failure. Marking it failed blocked PRs the server\r\n // readiness classifier (check-runs based) had already deemed ready.\r\n if (state && state !== \"PENDING\" && state !== \"EXPECTED\") {\r\n failed.push(`${checkName(check)}=${state}`);\r\n continue;\r\n }\r\n if (state === \"PENDING\" || state === \"EXPECTED\") {\r\n pending.push(`${checkName(check)}=${state}`);\r\n continue;\r\n }\r\n if (status && status !== \"COMPLETED\") {\r\n pending.push(`${checkName(check)}=${status}`);\r\n continue;\r\n }\r\n pending.push(`${checkName(check)}=PENDING`);\r\n }\r\n return { pending, failed };\r\n}\r\n\r\nfunction vercelCheckSuccess(statusCheckRollup: unknown[] | undefined): boolean {\r\n const checks = Array.isArray(statusCheckRollup) ? statusCheckRollup : [];\r\n return checks.some((raw) => {\r\n const check = (raw && typeof raw === \"object\" ? raw : {}) as Record<string, unknown>;\r\n const name =\r\n (typeof check.name === \"string\" && check.name) ||\r\n (typeof check.context === \"string\" && check.context) ||\r\n \"\";\r\n const conclusion =\r\n typeof check.conclusion === \"string\" ? check.conclusion.toUpperCase() : \"\";\r\n const state = typeof check.state === \"string\" ? check.state.toUpperCase() : \"\";\r\n return /^vercel/i.test(name) && (conclusion === \"SUCCESS\" || state === \"SUCCESS\");\r\n });\r\n}\r\n\r\n// VERIFICATION-EVIDENCE GATE \u2014 intentional duplicate of the server gate in\r\n// src/modules/agent-os/ready-pr-landing/ready-pr-landing.verification-evidence.ts\r\n// (assessLandingVerificationEvidence). The runtime cannot import @/src modules\r\n// (standalone esbuild package), so the regex corpus is mirrored here.\r\n// CONTRACT: this runtime gate MUST remain a SUPERSET of the server gate \u2014 every\r\n// PR the server accepts, the runtime must also accept (the daemon must never\r\n// reject what the server already approved). The server additionally tightens\r\n// via preferLocalVerificationOnly() (release-train mode rejects Vercel-only\r\n// evidence); the runtime stays permissive on Vercel, so it cannot under-accept.\r\n// If you edit these regexes, edit the server copy too and keep the corpus test\r\n// (packages/kynver-runtime/__tests__/land-pr-evidence-superset.test.ts) green.\r\nconst STRUCTURED_SECTION_RE =\r\n /^##\\s*(test\\s*plan|verification|test\\s*evidence|verify)\\b/im;\r\nconst LOCAL_VERIFICATION_RE =\r\n /typecheck|npm run (test|build|typecheck)|vitest|tsc\\b|verify-pr-local|local verify|local-verify|tests? (pass|green)|build green|node --test/i;\r\nconst DOCS_TITLE_RE = /^docs[(:]/i;\r\nconst DOCS_BODY_RE =\r\n /docs[- ]only|documentation only|no[- ]code change|no code changes|low[- ]risk|plan tracker only|markdown only/i;\r\n\r\n/** Pure predicate form of the runtime verification-evidence gate (for tests). */\r\nexport function runtimeVerificationEvidenceSufficient(input: {\r\n title?: string | null;\r\n body?: string | null;\r\n vercelCheckSuccess?: boolean;\r\n}): boolean {\r\n // Trim to match the server gate exactly \u2014 without it a leading-whitespace\r\n // `docs(:` title passes the server but fails the start-anchored regex here,\r\n // a (narrow) superset-contract violation.\r\n const title = typeof input.title === \"string\" ? input.title.trim() : \"\";\r\n const body = typeof input.body === \"string\" ? input.body.trim() : \"\";\r\n const docsLowRisk = DOCS_TITLE_RE.test(title) || DOCS_BODY_RE.test(body);\r\n const structuredSection = STRUCTURED_SECTION_RE.test(body);\r\n const localVerification = LOCAL_VERIFICATION_RE.test(body);\r\n return docsLowRisk || structuredSection || localVerification || input.vercelCheckSuccess === true;\r\n}\r\n\r\nfunction assertVerificationEvidence(pr: GhPrView): void {\r\n const sufficient = runtimeVerificationEvidenceSufficient({\r\n title: pr.title,\r\n body: pr.body,\r\n vercelCheckSuccess: vercelCheckSuccess(pr.statusCheckRollup),\r\n });\r\n if (sufficient) return;\r\n throw new Error(\r\n `PR #${pr.number} lacks landing verification evidence \u2014 add ## Test plan / ## Verification with local commands, Vercel preview, or docs/no-code rationale`,\r\n );\r\n}\r\n\r\nfunction assertLandingReady(pr: GhPrView): void {\r\n if (pr.state !== \"OPEN\") throw new Error(`PR #${pr.number} is ${pr.state}, not OPEN`);\r\n if (pr.isDraft) throw new Error(`PR #${pr.number} is still a draft`);\r\n if (!READY_MERGE_STATES.has(pr.mergeStateStatus)) {\r\n throw new Error(`PR #${pr.number} mergeStateStatus is ${pr.mergeStateStatus}`);\r\n }\r\n const checks = classifyChecks(pr.statusCheckRollup);\r\n if (checks.failed.length > 0) {\r\n throw new Error(`PR #${pr.number} has failing checks: ${checks.failed.join(\", \")}`);\r\n }\r\n if (checks.pending.length > 0) {\r\n throw new Error(`PR #${pr.number} has pending checks: ${checks.pending.join(\", \")}`);\r\n }\r\n assertVerificationEvidence(pr);\r\n}\r\n\r\nfunction landingReadinessError(pr: GhPrView): string | null {\r\n try {\r\n assertLandingReady(pr);\r\n return null;\r\n } catch (err) {\r\n return err instanceof Error ? err.message : String(err);\r\n }\r\n}\r\n\r\nfunction deleteRemoteBranch(\r\n exec: PrHandoffExec,\r\n cwd: string,\r\n repo: string,\r\n branch: string | undefined,\r\n): void {\r\n if (!branch?.trim()) return;\r\n const refPath = encodeURI(`heads/${branch}`);\r\n exec.gh(cwd, [\"api\", \"-X\", \"DELETE\", `repos/${repo}/git/refs/${refPath}`]);\r\n}\r\n\r\nfunction resolveRepo(exec: PrHandoffExec, cwd: string, repo: string | null | undefined): string {\r\n if (repo?.trim()) return repo.trim();\r\n const res = exec.gh(cwd, [\"repo\", \"view\", \"--json\", \"nameWithOwner\"]);\r\n if (res.status !== 0) throw new Error(res.stderr || \"Could not resolve GitHub repo\");\r\n const parsed = JSON.parse(res.stdout || \"{}\") as { nameWithOwner?: string };\r\n if (!parsed.nameWithOwner) throw new Error(\"Could not resolve GitHub repo\");\r\n return parsed.nameWithOwner;\r\n}\r\n\r\nfunction removeBranchWorktrees(cwd: string, branch: string | undefined): void {\r\n if (!branch?.trim()) return;\r\n const list = spawnSync(\"git\", [\"worktree\", \"list\", \"--porcelain\"], {\r\n cwd,\r\n encoding: \"utf8\",\r\n });\r\n if (list.status !== 0) return;\r\n const lines = String(list.stdout || \"\").split(/\\r?\\n/);\r\n let currentPath: string | null = null;\r\n let currentBranch: string | null = null;\r\n for (const line of lines) {\r\n if (line.startsWith(\"worktree \")) {\r\n currentPath = line.slice(\"worktree \".length).trim();\r\n currentBranch = null;\r\n continue;\r\n }\r\n if (line.startsWith(\"branch \") && currentPath) {\r\n currentBranch = line.slice(\"branch \".length).trim();\r\n if (currentBranch.endsWith(`/${branch}`)) {\r\n spawnSync(\"git\", [\"worktree\", \"remove\", \"--force\", currentPath], {\r\n cwd,\r\n encoding: \"utf8\",\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Daemon-local PR merge \u2014 live readiness, squash merge, branch delete, worktree cleanup.\r\n */\r\nexport async function executeLandPrMerge(\r\n input: ExecuteLandPrMergeInput,\r\n): Promise<LandPrCompletionReport> {\r\n const cwd = input.cwd ?? process.cwd();\r\n const exec = input.exec ?? defaultPrHandoffExec;\r\n const prTarget = input.prUrl.trim();\r\n if (!prTarget) throw new Error(\"prUrl is required\");\r\n\r\n const auth = ensureGitHubTokenFromCliAuth();\r\n if (!auth.configured) {\r\n return {\r\n prUrl: prTarget,\r\n outcome: \"blocked\",\r\n reason: auth.reason,\r\n };\r\n }\r\n\r\n const before = ghJson(exec, cwd, [\r\n \"pr\",\r\n \"view\",\r\n prTarget,\r\n ...repoArgs(input.repo),\r\n \"--json\",\r\n [\r\n \"number\",\r\n \"url\",\r\n \"title\",\r\n \"body\",\r\n \"state\",\r\n \"isDraft\",\r\n \"mergeStateStatus\",\r\n \"statusCheckRollup\",\r\n \"headRefName\",\r\n \"mergedAt\",\r\n \"mergeCommit\",\r\n ].join(\",\"),\r\n ]);\r\n\r\n if (before.state === \"MERGED\" || before.mergedAt) {\r\n return {\r\n prUrl: before.url || prTarget,\r\n outcome: \"skipped\",\r\n mergeCommit: before.mergeCommit?.oid ?? null,\r\n reason: `PR #${before.number} is already merged \u2014 land_pr no-op (redelivery)`,\r\n };\r\n }\r\n\r\n const notReadyReason = landingReadinessError(before);\r\n if (notReadyReason) {\r\n if (input.skipNotReady) {\r\n return {\r\n prUrl: before.url || prTarget,\r\n outcome: \"skipped\",\r\n reason: notReadyReason,\r\n };\r\n }\r\n return {\r\n prUrl: before.url || prTarget,\r\n outcome: \"blocked\",\r\n reason: notReadyReason,\r\n };\r\n }\r\n\r\n if (input.dryRun) {\r\n return {\r\n prUrl: before.url || prTarget,\r\n outcome: \"skipped\",\r\n reason: \"dry-run: PR is ready to merge\",\r\n };\r\n }\r\n\r\n const target = String(before.number);\r\n const mergeRes = exec.gh(cwd, [\r\n \"pr\",\r\n \"merge\",\r\n target,\r\n ...repoArgs(input.repo),\r\n \"--squash\",\r\n ]);\r\n if (mergeRes.status !== 0) {\r\n // The merge can race another landing lane (ready-PR sweep, an operator):\r\n // gh refuses to merge a merged PR. Re-view before reporting blocked \u2014 a\r\n // merged PR's subject must never terminate `blocked`.\r\n const raced = viewMergedState(exec, cwd, target, input.repo);\r\n if (raced) {\r\n return {\r\n prUrl: raced.url || before.url || prTarget,\r\n outcome: \"skipped\",\r\n mergeCommit: raced.mergeCommit?.oid ?? null,\r\n reason: `PR #${before.number} is already merged \u2014 merged by another lane during land_pr (race)`,\r\n };\r\n }\r\n return {\r\n prUrl: before.url || prTarget,\r\n outcome: \"blocked\",\r\n reason: mergeRes.stderr || mergeRes.stdout || \"gh pr merge failed\",\r\n };\r\n }\r\n\r\n // gh exited 0 \u2014 the squash merge succeeded. Nothing after this point may\r\n // convert that into a thrown error or a blocked report: a lost \"merged\"\r\n // completion is exactly the redelivery seam that parks subjects.\r\n let after: GhPrView | null = viewMergedState(exec, cwd, target, input.repo);\r\n if (!after) {\r\n // Read-after-write lag or a transient view failure \u2014 retry once.\r\n after = viewMergedState(exec, cwd, target, input.repo);\r\n }\r\n\r\n try {\r\n const repo = resolveRepo(exec, cwd, input.repo);\r\n deleteRemoteBranch(exec, cwd, repo, before.headRefName);\r\n removeBranchWorktrees(cwd, before.headRefName);\r\n } catch {\r\n // Best-effort cleanup \u2014 never let it mask a successful merge.\r\n }\r\n\r\n return {\r\n prUrl: after?.url || before.url || prTarget,\r\n outcome: \"merged\",\r\n mergeCommit: after?.mergeCommit?.oid ?? null,\r\n reason: `Daemon land_pr merged PR #${before.number}${after ? \"\" : \" (post-merge view unavailable \u2014 merge verified by gh exit 0)\"}`,\r\n };\r\n}\r\n\r\n/** View the PR; return it only when it reads as merged. Never throws. */\r\nfunction viewMergedState(\r\n exec: PrHandoffExec,\r\n cwd: string,\r\n target: string,\r\n repo: string | null | undefined,\r\n): GhPrView | null {\r\n try {\r\n const view = ghJson(exec, cwd, [\r\n \"pr\",\r\n \"view\",\r\n target,\r\n ...repoArgs(repo),\r\n \"--json\",\r\n \"number,url,mergedAt,mergeCommit,state\",\r\n ]);\r\n return view.state === \"MERGED\" || view.mergedAt ? view : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\n\r\nexport interface EnsureGitHubCliAuthResult {\r\n source: \"env\" | \"gh-cli\" | \"missing\";\r\n configured: boolean;\r\n reason: string;\r\n}\r\n\r\n/**\r\n * Intentional duplicate of `src/modules/agent-os/ready-pr-landing/ready-pr-landing.cli-auth.ts`.\r\n * The runtime package cannot import `@/src` server modules (standalone esbuild bundle), so gh\r\n * token resolution is mirrored here. Keep both copies in sync when auth probe logic changes.\r\n */\r\nexport function ensureGitHubTokenFromCliAuth(): EnsureGitHubCliAuthResult {\r\n if (process.env.GITHUB_TOKEN?.trim() || process.env.GH_TOKEN?.trim()) {\r\n return {\r\n source: \"env\",\r\n configured: true,\r\n reason: \"GitHub token already configured in environment\",\r\n };\r\n }\r\n\r\n const result = spawnSync(\"gh\", [\"auth\", \"token\"], {\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n });\r\n\r\n if (result.status !== 0) {\r\n const reason =\r\n typeof result.stderr === \"string\" && result.stderr.trim()\r\n ? result.stderr.trim()\r\n : \"gh auth token failed; run `gh auth login` on this machine\";\r\n return { source: \"missing\", configured: false, reason };\r\n }\r\n\r\n const token = typeof result.stdout === \"string\" ? result.stdout.trim() : \"\";\r\n if (!token) {\r\n return {\r\n source: \"missing\",\r\n configured: false,\r\n reason: \"gh auth token returned an empty token; run `gh auth login` on this machine\",\r\n };\r\n }\r\n\r\n process.env.GH_TOKEN = token;\r\n return {\r\n source: \"gh-cli\",\r\n configured: true,\r\n reason: \"Using local GitHub CLI auth for daemon land_pr merge\",\r\n };\r\n}\r\n", "import { resolveCallbackSecretWithMint } from \"../config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"../callbacks.js\";\r\nimport type { LandPrCompletionReport } from \"./land-pr.js\";\r\n\r\nexport async function postLandPrHarnessCompletion(input: {\r\n baseUrl: string;\r\n secret?: string;\r\n agentOsId: string;\r\n runId: string;\r\n task: Record<string, unknown>;\r\n report: LandPrCompletionReport;\r\n}): Promise<{ ok: boolean; status: number }> {\r\n const secret = await resolveCallbackSecretWithMint(input.secret, input.agentOsId, {\r\n baseUrl: input.baseUrl,\r\n });\r\n const taskId = String(input.task.id);\r\n const url = `${input.baseUrl}/api/agent-os/by-id/${encodeURIComponent(input.agentOsId)}/harness/completion`;\r\n const finishedAt = new Date().toISOString();\r\n const body = {\r\n source: \"kynver-harness\",\r\n agentOsId: input.agentOsId,\r\n runId: input.runId,\r\n workerName: `land-pr-${taskId}`,\r\n taskId,\r\n leaseToken: input.task.leaseToken ?? null,\r\n startedAt: finishedAt,\r\n finishedAt,\r\n status: {\r\n finalResult: input.report,\r\n prUrl: input.report.prUrl,\r\n summary: input.report.reason,\r\n leaseToken: input.task.leaseToken ?? null,\r\n },\r\n workerInjection: null,\r\n };\r\n\r\n const result = await postJsonWithCredentialRefresh(url, secret, body, {\r\n agentOsId: input.agentOsId,\r\n baseUrl: input.baseUrl,\r\n });\r\n return { ok: result.ok, status: result.status };\r\n}\r\n", "/** Instruction block appended to verify_live harness dispatch tasks. */\r\nexport function formatVerifyLiveCompletionContract(): string {\r\n return [\r\n \"## verify_live completion contract\",\r\n \"Finish with a JSON finalResult object:\",\r\n \"{\",\r\n ' \"prUrl\": \"<landed pr>\",',\r\n ' \"outcome\": \"passed\" | \"failed\" | \"skipped\" | \"no_mcp_surface\",',\r\n ' \"reason\": \"<human summary>\",',\r\n ' \"mergeCommit\": \"<sha optional>\",',\r\n ' \"mcpCalls\": [{ \"tool\": \"<name>\", \"ok\": true, \"summary\": \"...\" }]',\r\n \"}\",\r\n \"\",\r\n \"Drive the feature MCP tools against live production. Do not mark passed without exercising the MCP surface.\",\r\n ].join(\"\\n\");\r\n}\r\n", "export { PACKAGE_VERSION } from \"./package-version.js\";\r\nexport {\r\n MEMORY_COST_PACKAGE_MIN_VERSIONS,\r\n MEMORY_COST_MANAGED_PACKAGES,\r\n MemoryCostPackageVersionGuardError,\r\n assertMemoryCostPackageVersionGuard,\r\n compareSemver,\r\n evaluateMemoryCostPackageVersionGuard,\r\n formatMemoryCostPackageGuardError,\r\n probeRepoPackageVersions,\r\n semverAtLeast,\r\n type MemoryCostManagedPackageName,\r\n type MemoryCostPackageGuardResult,\r\n type MemoryCostPackageGuardRow,\r\n} from \"./memory-cost-package-version-guard.js\";\r\nexport {\r\n buildMemoryCostPackageGuardInput,\r\n enforceMemoryCostPackageGuardAtStartup,\r\n evaluateMemoryCostPackageGuardAtStartup,\r\n shouldEnforceMemoryCostPackageGuardCli,\r\n} from \"./memory-cost-package-version-guard-enforce.js\";\r\nexport { buildDispatchTaskText, dispatchRun, DEFAULT_DISPATCH_LEASE_MS } from \"./dispatch.js\";\r\nexport { observeRunnerDiskGate } from \"./disk-gate.js\";\r\nexport {\r\n isWslHost,\r\n observeWslHostDisk,\r\n summarizeWslRecoverySteps,\r\n DEFAULT_WSL_HOST_MOUNT,\r\n DEFAULT_WSL_HOST_WARN_FREE_BYTES,\r\n DEFAULT_WSL_HOST_CRITICAL_FREE_BYTES,\r\n type WslHostDiskShape,\r\n} from \"./wsl-host.js\";\r\nexport {\r\n postJson,\r\n type DispatchNextDiskGateShape,\r\n type DispatchNextWslHostShape,\r\n} from \"./callbacks.js\";\r\nexport {\r\n parseClaudeStream,\r\n parseHarnessStream,\r\n summarizeEvent,\r\n summarizeShellToolCallEvent,\r\n} from \"./stream.js\";\r\nexport {\r\n classifyNpmAuditOutcome,\r\n classifyShellCommandOutcome,\r\n summarizeNpmAuditReport,\r\n type NpmAuditSummary,\r\n type ShellCommandOutcome,\r\n type ShellCommandOutcomeKind,\r\n} from \"./shell-command-outcome.js\";\r\nexport {\r\n classifyRepoSearchMeta,\r\n diagnoseRepoSearchFailure,\r\n extractSearchMeta,\r\n extractSearchMetaFromToolLine,\r\n formatRepoSearchGuidance,\r\n isRgExcludeScopeTarget,\r\n isSingleFileSearchTarget,\r\n metaToNormalizedRgCommand,\r\n normalizeRepoSearchCommand,\r\n normalizeRgArgv,\r\n type RepoSearchContext,\r\n type RepoSearchKind,\r\n} from \"./repo-search.js\";\r\nexport {\r\n parseHeartbeat,\r\n isTerminalHeartbeatPhase,\r\n terminalFinalResultFromHeartbeat,\r\n} from \"./heartbeat.js\";\r\nexport {\r\n buildBoxResourceSnapshotFromGate,\r\n formatHeartbeatLine,\r\n type RuntimeBoxResourceSnapshot,\r\n type RuntimeBoxResourceSnapshotPrEvidence,\r\n type HeartbeatLineInput,\r\n} from \"./box-resource-snapshot.js\";\r\nexport { resolveBoxKindFromEnv, defaultBoxId } from \"./box-resource-snapshot-shared.js\";\r\nexport {\r\n computeWorkerStatus,\r\n computeAttention,\r\n isFinishedWorkerStatus,\r\n isLandingBlockedWorkerStatus,\r\n deriveRunStatus,\r\n type RawHarnessWorkerStatus,\r\n type HarnessWorkerRecord,\r\n type WorkerAttention,\r\n} from \"./status.js\";\r\nexport { assessWorkerLanding, type WorkerLandingVerdict } from \"./landing-gate.js\";\r\nexport { isEngagementRequiredSkip } from \"./fortress-engagement-gate.js\";\r\nexport {\r\n assessWorkerLandingContract,\r\n landingContractAttentionReason,\r\n type WorkerLandingContract,\r\n type WorkerLandingContractVerdict,\r\n type TargetPrReconciliation,\r\n} from \"./landing-contract-gate.js\";\r\nexport {\r\n assessExitedWorkerSalvage,\r\n type ExitedSalvageAssessment,\r\n type ExitedSalvageKind,\r\n} from \"./exited-salvage.js\";\r\nexport { buildPrompt } from \"./prompt.js\";\r\nexport {\r\n WORKER_PERSONA_CATALOG,\r\n getWorkerPersonaCatalogEntry,\r\n getPersonaDispatchLane,\r\n getPersonaDefaultRoleLane,\r\n isKnownWorkerPersonaSlug,\r\n workerPersonaReviewSlugs,\r\n workerPersonaLandingSlugs,\r\n type WorkerPersonaCatalogEntry,\r\n type WorkerPersonaCatalogSlug,\r\n type WorkerPersonaDispatchLane,\r\n type WorkerPersonaDefaultRoleLane,\r\n} from \"./worker-persona-catalog.js\";\r\nexport {\r\n assessPrHandoffRequirement,\r\n ensurePrReadyHandoff,\r\n extractPrUrlFromText,\r\n} from \"./pr-handoff/index.js\";\r\nexport {\r\n normalizeCursorModelAlias,\r\n preflightClaudeModel,\r\n preflightCodexModel,\r\n preflightCursorModel,\r\n} from \"./providers/model-preflight.js\";\r\nexport { CODEX_DEFAULT_MODEL, codexProvider, buildCodexExecArgv } from \"./providers/codex.js\";\r\nexport {\r\n HERMES_OPENAI_CODEX_DEFAULT_MODEL,\r\n hermesCodexProvider,\r\n buildHermesOpenAiCodexChatArgv,\r\n} from \"./providers/hermes-codex.js\";\r\nexport {\r\n classifyOpenAiCodexError,\r\n formatCronJobDeliveryFailure,\r\n formatOpenAiCodexFailureNotice,\r\n redactProviderErrorText,\r\n resolveOpenAiCodexRetryBudget,\r\n TRANSIENT_OPENAI_CODEX_ERROR_CLASSES,\r\n OPENAI_CODEX_PROVIDER,\r\n type ClassifiedOpenAiCodexError,\r\n type CodexFailureNoticeInput,\r\n type OpenAiCodexErrorClass,\r\n} from \"./providers/openai-codex-resilience.js\";\r\nexport * from \"./cron/hermes-provider-notice.js\";\r\nexport {\r\n buildOrchestrationProviderInventory,\r\n classifyOrchestrationRisk,\r\n compareProviderCandidates,\r\n getOrchestrationProviderCapability,\r\n listOrchestrationProviderCapabilities,\r\n probeClaudeOAuthBinding,\r\n probeCodexOAuthBinding,\r\n probeCursorOAuthBinding,\r\n probeHermesCliAdapter,\r\n probeHermesOpenAiCodexBinding,\r\n probeOrchestrationProviderBinding,\r\n providerCapableForRisk,\r\n resolveCodexOrchestrationAdapter,\r\n resolveOrchestrationRouting,\r\n selectCheapestCapableProvider,\r\n sanitizeOrchestrationAudit,\r\n orchestrationAuditForWorkerJson,\r\n type CodexOrchestrationAdapterStatus,\r\n type CodexOrchestrationPath,\r\n type HermesCliAdapterStatus,\r\n type HermesOpenAiCodexBindingStatus,\r\n type OrchestrationAuthSource,\r\n type OrchestrationCloudApiCredits,\r\n type OrchestrationCostTier,\r\n type OrchestrationProviderBindingStatus,\r\n type OrchestrationProviderCapability,\r\n type OrchestrationProviderId,\r\n type OrchestrationProviderInventory,\r\n type OrchestrationRiskClass,\r\n type OrchestrationRoutingAudit,\r\n type OrchestrationRoutingDecision,\r\n} from \"./orchestration-providers/index.js\";\r\nexport {\r\n ORCHESTRATION_POLICY_MODES,\r\n ORCHESTRATION_ACTION_KINDS,\r\n ORCHESTRATION_POLICY_DECISIONS,\r\n resolveOrchestrationPolicyMode,\r\n isOrchestrationEnforceTasksEnabled,\r\n buildForegroundHarnessIdempotencyKey,\r\n evaluateOrchestrationPolicy,\r\n type OrchestrationPolicyMode,\r\n type OrchestrationActionKind,\r\n type OrchestrationPolicyDecision,\r\n type OrchestrationPolicyEvaluateInput,\r\n type OrchestrationPolicyEvaluateResult,\r\n} from \"./orchestration-enforcement/index.js\";\r\nexport {\r\n DEFAULT_WORKER_PROVIDER,\r\n enforceCursorWorkerProvider,\r\n isClaudeFamilyProvider,\r\n preferCursorExecutor,\r\n resolveConfiguredWorkerProvider,\r\n taskAllowsClaudeWorker,\r\n type EnforceCursorWorkerProviderInput,\r\n} from \"./worker-provider-policy.js\";\r\nexport { redactHarness } from \"./redact.js\";\r\nexport {\r\n scrubWorkerEnv,\r\n scrubClaudeEnv,\r\n auditWorkerEnv,\r\n listForbiddenWorkerEnvKeys,\r\n isForbiddenWorkerEnvKey,\r\n FORBIDDEN_WORKER_ENV_KEYS,\r\n type WorkerEnvAudit,\r\n} from \"./worker-env.js\";\r\nexport { discoverProductionDbEnvFilePaths, expandHomePath } from \"./db-credential-env-paths.js\";\r\nexport {\r\n applyProductionDatabaseToProcess,\r\n readProductionDbKeysFromEnvFile,\r\n resolveProductionDatabaseUrl,\r\n type DbCredentialResolution,\r\n type DbCredentialFailure,\r\n type DbCredentialSource,\r\n type ResolveProductionDatabaseResult,\r\n type ResolveProductionDatabaseOptions,\r\n} from \"./db-credential-resolver.js\";\r\nexport { safeDatabaseUrlHint } from \"./db-url-hint.js\";\r\nexport {\r\n validateRunId,\r\n validateWorkerName,\r\n validateRepo,\r\n validateOwnedPaths,\r\n validateTailLines,\r\n resolveWorkerTargetArgs,\r\n resolveRunTargetArg,\r\n} from \"./validate.js\";\r\nexport { spawnWorkerProcess, startWorker } from \"./supervisor.js\";\r\nexport { createRun, listRuns } from \"./worktree.js\";\r\nexport {\r\n buildRunListRows,\r\n listRunsCli,\r\n type RunListFinalizeBlockedReason,\r\n type RunListRow,\r\n type RunListWorkerEvidence,\r\n} from \"./run-list.js\";\r\nexport { resolveHarnessRunByName, resolveHarnessRunCli } from \"./run-resolve.js\";\r\nexport { isActiveHarnessWorker } from \"./harness-worker-active.js\";\r\nexport { sweepRun } from \"./sweep.js\";\r\nexport { completeWorker, runStatus, workerStatus, tailWorker, stopWorker } from \"./worker-ops.js\";\r\nexport {\r\n autoCompleteWorker,\r\n autoCompleteWorkerCli,\r\n spawnCompletionSidecar,\r\n type AutoCompleteArgs,\r\n type AutoCompleteOutcome,\r\n type SpawnSidecarOptions,\r\n type SpawnedSidecar,\r\n} from \"./auto-complete.js\";\r\nexport {\r\n loadUserConfig,\r\n saveUserConfig,\r\n resolveBaseUrl,\r\n resolveCallbackSecret,\r\n resolveCallbackSecretWithMint,\r\n parseArgs,\r\n} from \"./config.js\";\r\nexport {\r\n discoverDefaultRepo,\r\n discoverDefaultRepoCandidates,\r\n isKynverMonorepoRoot,\r\n gitRepoRoot,\r\n type DiscoveredDefaultRepo,\r\n type DefaultRepoDiscoverySource,\r\n} from \"./default-repo-discovery.js\";\r\nexport {\r\n resolveDefaultRepo,\r\n persistDefaultRepo,\r\n remediateDefaultRepo,\r\n formatResolvedDefaultRepo,\r\n type ResolvedDefaultRepo,\r\n type DefaultRepoSource,\r\n} from \"./default-repo.js\";\r\nexport {\r\n getHarnessPaths,\r\n harnessRunsDir,\r\n harnessWorktreesDir,\r\n normalizeHarnessRoot,\r\n resolveHarnessRoot,\r\n} from \"./paths.js\";\r\nexport {\r\n harnessStorageSnapshot,\r\n type HarnessStorageSnapshot,\r\n} from \"./harness-storage-snapshot.js\";\r\nexport {\r\n runHarnessCleanup,\r\n runPipelineHarnessCleanup,\r\n isPipelineCleanupEnabled,\r\n} from \"./cleanup.js\";\r\nexport type {\r\n HarnessCleanupSummary,\r\n HarnessCleanupOptions,\r\n HarnessStorageSnapshotShape,\r\n WorktreeRemovalGuardHook,\r\n WorktreeRemovalGuardInput,\r\n CleanupSkipReason,\r\n} from \"./cleanup-types.js\";\r\nexport {\r\n DEFAULT_MAX_ACTIONS_PER_SWEEP,\r\n DEFAULT_NODE_MODULES_AGE_MS,\r\n DEFAULT_RUN_DIRECTORIES_AGE_MS,\r\n DEFAULT_TERMINAL_WORKTREES_AGE_MS,\r\n DEFAULT_WORKTREES_AGE_MS,\r\n} from \"./cleanup-types.js\";\r\nexport { assessOrphanWorktreeSafety } from \"./cleanup-orphan-safety.js\";\r\nexport { isGeneratedHarnessPath, HARNESS_BUILD_CACHE_RELATIVE_PATHS } from \"./cleanup-build-cache-paths.js\";\r\nexport { usage, main } from \"./cli.js\";\r\nexport { reconcileRunsCli, reconcileStaleWorkers, type ReconcileStaleWorkersResult, type StaleWorkerReconcileOutcome } from \"./stale-reconcile.js\";\r\nexport {\r\n repairMissingRunMetadata,\r\n archiveTerminalWorkerMetadata,\r\n collectFilesystemLiveRunKeys,\r\n isHarnessRunMetadataPath,\r\n runDirHasActiveRetentionSignals,\r\n workerDirHasActiveRetentionSignals,\r\n RUN_METADATA_ACTIVE_SIGNAL_MS,\r\n TERMINAL_WORKER_ARCHIVE_AGE_MS,\r\n type TerminalWorkerArchiveOutcome,\r\n type TerminalWorkerArchiveResult,\r\n type RunMetadataRetentionOutcome,\r\n type RunMetadataRetentionResult,\r\n} from \"./run-metadata-retention.js\";\r\nexport {\r\n reconcileWorkerMetadata,\r\n reconcileWorkerMetadataCli,\r\n type WorkerMetadataReconcileOutcome,\r\n type WorkerMetadataReconcileResult,\r\n} from \"./worker-metadata-reconcile.js\";\r\nexport {\r\n reconcileLocalOnlyMergedPrAttention,\r\n type LocalPrAttentionReconcileOutcome,\r\n type LocalPrAttentionReconcileResult,\r\n} from \"./local-pr-attention-reconcile.js\";\r\nexport {\r\n canonicalWorkerDir,\r\n hasNestedRunsSegment,\r\n repairNestedRunsPath,\r\n resolveWorkerJsonPath,\r\n} from \"./worker-metadata-paths.js\";\r\nexport { runDaemon } from \"./daemon.js\";\r\nexport {\r\n runHarnessVerifyCommands,\r\n DEFAULT_HARNESS_VERIFY_COMMANDS,\r\n type HarnessVerifySummary,\r\n type HarnessVerifyStep,\r\n} from \"./harness-verify.js\";\r\nexport {\r\n runBoundedBuildCheck,\r\n assessBuildAdmission,\r\n mergeNodeOptionsForBuildCheck,\r\n buildSystemdRunArgv,\r\n isSystemdRunAvailable,\r\n readMemAvailableBytes,\r\n type BoundedBuildExecResult,\r\n type BuildAdmissionVerdict,\r\n} from \"./bounded-build/index.js\";\r\nexport {\r\n assessHeavyVerificationGate,\r\n countActiveHeavyVerificationSlots,\r\n isHeavyVerificationGateSkipped,\r\n listActiveHeavyVerificationSlots,\r\n reclaimStaleHeavyVerificationSlots,\r\n releaseHeavyVerificationSlot,\r\n resolveHeavyVerificationMaxConcurrent,\r\n tryAcquireHeavyVerificationSlot,\r\n waitForHeavyVerificationSlot,\r\n DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT,\r\n type HeavyVerificationGateVerdict,\r\n type HeavyVerificationSlotRecord,\r\n} from \"./heavy-verification/index.js\";\r\nexport {\r\n assessAutoCompleteEligibility,\r\n classifyWorkerHealth,\r\n getMonitorStatus,\r\n listMonitors,\r\n runMonitorTick,\r\n spawnMonitorSidecar,\r\n type AutoCompleteAssessment,\r\n type MonitorTickResult,\r\n type TaskLeaseSnapshot,\r\n type WorkerHealthClass,\r\n type WorkerMonitorView,\r\n} from \"./monitor/index.js\";\r\nexport {\r\n formatHarnessToolReadable,\r\n formatMonitorTickNotice,\r\n formatAutoCompleteOutcomeNotice,\r\n formatWorkerStatusNotice,\r\n formatWorkerCompleteNotice,\r\n joinHarnessNotice,\r\n type HarnessReadableNotice,\r\n type HarnessToolFormatContext,\r\n} from \"./harness-notice/index.js\";\r\nexport {\r\n persistPlan,\r\n drainPlanOutbox,\r\n listOutboxItems,\r\n formatPlanOutboxHandoffBlock,\r\n extractPlanOutboxFromTask,\r\n hashPlanBody,\r\n type PersistPlanInput,\r\n type PersistPlanResult,\r\n type PlanPersistUserStatus,\r\n} from \"./plan-persist/index.js\";\r\nexport {\r\n classifyVercelUrl,\r\n collectVercelEvidence,\r\n evidenceFromGitHubVercelStatus,\r\n isDashboardVercelUrl,\r\n isInspectableVercelTarget,\r\n isVercelStatusContext,\r\n pickVercelStatusContext,\r\n resolveVercelInspectTarget,\r\n type CollectVercelEvidenceInput,\r\n type GitHubCommitStatusRow,\r\n type VercelEvidenceResult,\r\n type VercelEvidenceStatus,\r\n} from \"./vercel/index.js\";\r\n", "import os from \"node:os\";\r\nimport type { RunnerResourceGateShape } from \"./resource-gate.js\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport { resolveBoxKindFromConfig } from \"./box-identity.js\";\r\nimport { defaultBoxId } from \"./box-resource-snapshot-shared.js\";\r\n\r\nexport interface RuntimeBoxResourceSnapshot {\r\n boxId: string;\r\n boxKind: string;\r\n displayName?: string | null;\r\n hostLabel?: string | null;\r\n observedAt: string;\r\n totalMemBytes: number;\r\n freeMemBytes: number;\r\n activeWorkers: number;\r\n maxConcurrentWorkers: number;\r\n autoCap: number;\r\n slotsAvailable: number;\r\n harnessRunId?: string | null;\r\n queuedTasks?: number | null;\r\n reason?: string | null;\r\n prEvidence?: RuntimeBoxResourceSnapshotPrEvidence[];\r\n}\r\n\r\nexport interface RuntimeBoxResourceSnapshotPrEvidence {\r\n prUrl: string;\r\n headSha?: string | null;\r\n mergeable?: string | null;\r\n observedAt: string;\r\n source: \"heartbeat\" | \"operator_tick\" | \"completion\" | \"handoff\";\r\n}\r\n\r\nexport function buildBoxResourceSnapshotFromGate(\r\n gate: RunnerResourceGateShape,\r\n input: {\r\n boxKind?: string | null;\r\n boxId?: string | null;\r\n displayName?: string | null;\r\n hostLabel?: string | null;\r\n harnessRunId?: string | null;\r\n queuedTasks?: number | null;\r\n prEvidence?: RuntimeBoxResourceSnapshotPrEvidence[];\r\n observedAt?: string;\r\n } = {},\r\n): RuntimeBoxResourceSnapshot {\r\n const boxKind = (input.boxKind ?? resolveBoxKindFromConfig(loadUserConfig())).trim().toLowerCase() || \"forge\";\r\n const hostLabel = input.hostLabel ?? os.hostname();\r\n const boxId = input.boxId ?? defaultBoxId(boxKind, hostLabel);\r\n return {\r\n boxId,\r\n boxKind,\r\n displayName: input.displayName ?? null,\r\n hostLabel,\r\n observedAt: input.observedAt ?? new Date().toISOString(),\r\n totalMemBytes: gate.totalMemBytes,\r\n freeMemBytes: gate.freeMemBytes,\r\n activeWorkers: gate.activeWorkers,\r\n maxConcurrentWorkers: gate.maxConcurrentWorkers,\r\n autoCap: gate.autoCap,\r\n slotsAvailable: gate.slotsAvailable,\r\n harnessRunId: input.harnessRunId ?? null,\r\n queuedTasks: input.queuedTasks ?? null,\r\n reason: gate.reason,\r\n ...(input.prEvidence?.length ? { prEvidence: input.prEvidence } : {}),\r\n };\r\n}\r\n\r\nexport interface HeartbeatLineInput {\r\n ts?: string;\r\n phase: string;\r\n summary: string;\r\n changedFiles?: string[];\r\n blocker?: string | null;\r\n boxResourceSnapshot?: RuntimeBoxResourceSnapshot;\r\n prEvidence?: RuntimeBoxResourceSnapshotPrEvidence[];\r\n}\r\n\r\nexport function formatHeartbeatLine(input: HeartbeatLineInput): string {\r\n const row: Record<string, unknown> = {\r\n ts: input.ts ?? new Date().toISOString(),\r\n phase: input.phase,\r\n summary: input.summary,\r\n changedFiles: input.changedFiles ?? [],\r\n blocker: input.blocker ?? null,\r\n };\r\n if (input.boxResourceSnapshot) row.boxResourceSnapshot = input.boxResourceSnapshot;\r\n if (input.prEvidence?.length) row.prEvidence = input.prEvidence;\r\n return `${JSON.stringify(row)}\\n`;\r\n}\r\n", "/** Parse dispatch-next skip decisions for Security Fortress engagement gates. */\r\nexport function isEngagementRequiredSkip(skip: {\r\n skipReason?: string;\r\n reason?: string;\r\n}): boolean {\r\n if (skip.skipReason === \"engagement_required\") return true;\r\n const reason = skip.reason ?? \"\";\r\n return (\r\n reason.includes(\"engagement_required\") ||\r\n reason.includes(\"engagement_not_found\") ||\r\n reason.includes(\"engagement_expired\") ||\r\n reason.includes(\"engagement_revoked\")\r\n );\r\n}\r\n", "/**\r\n * Classify transient OpenAI Codex / ChatGPT backend failures and build plain-English\r\n * operator notices. Shared by harness orchestration and Hermes cron delivery UX.\r\n */\r\n\r\nexport const OPENAI_CODEX_PROVIDER = \"openai-codex\";\r\n\r\nexport type OpenAiCodexErrorClass =\r\n | \"upstream_503\"\r\n | \"connection_refused\"\r\n | \"connection_reset\"\r\n | \"sse_no_event\"\r\n | \"sse_idle_timeout\"\r\n | \"rate_limit\"\r\n | \"billing\"\r\n | \"auth\"\r\n | \"unknown\";\r\n\r\nexport const TRANSIENT_OPENAI_CODEX_ERROR_CLASSES: ReadonlySet<OpenAiCodexErrorClass> =\r\n new Set([\r\n \"upstream_503\",\r\n \"connection_refused\",\r\n \"connection_reset\",\r\n \"sse_no_event\",\r\n \"sse_idle_timeout\",\r\n ]);\r\n\r\nexport type ClassifiedOpenAiCodexError = {\r\n errorClass: OpenAiCodexErrorClass;\r\n summary: string;\r\n statusCode?: number;\r\n transient: boolean;\r\n};\r\n\r\nconst SECRET_PATTERNS: RegExp[] = [\r\n /\\bsk-[a-zA-Z0-9_-]{8,}\\b/g,\r\n /\\bBearer\\s+[a-zA-Z0-9._-]{8,}\\b/gi,\r\n /\\baccess[_-]?token[\"\\s:=]+[a-zA-Z0-9._-]{8,}/gi,\r\n];\r\n\r\nexport function redactProviderErrorText(text: string, maxLen = 400): string {\r\n let out = String(text ?? \"\").replace(/\\s+/g, \" \").trim();\r\n for (const pattern of SECRET_PATTERNS) {\r\n out = out.replace(pattern, \"[redacted]\");\r\n }\r\n if (out.length > maxLen) {\r\n return `${out.slice(0, maxLen)}\u2026`;\r\n }\r\n return out;\r\n}\r\n\r\nfunction haystackFromError(error: unknown, statusCode?: number): { haystack: string; statusCode?: number } {\r\n const parts: string[] = [];\r\n if (error instanceof Error) {\r\n parts.push(error.message);\r\n parts.push(error.name);\r\n } else if (typeof error === \"string\") {\r\n parts.push(error);\r\n } else if (error != null) {\r\n parts.push(String(error));\r\n }\r\n const errObj = error as { status_code?: number; statusCode?: number };\r\n const code =\r\n statusCode ??\r\n errObj?.status_code ??\r\n errObj?.statusCode ??\r\n undefined;\r\n if (code != null) {\r\n parts.push(`http ${code}`);\r\n }\r\n return { haystack: parts.join(\" \").toLowerCase(), statusCode: code };\r\n}\r\n\r\nexport function classifyOpenAiCodexError(\r\n error: unknown,\r\n statusCode?: number,\r\n): ClassifiedOpenAiCodexError {\r\n const { haystack, statusCode: code } = haystackFromError(error, statusCode);\r\n const raw =\r\n error instanceof Error ? error.message : typeof error === \"string\" ? error : String(error ?? \"\");\r\n\r\n if (code === 402 || /billing|credit|payment required|insufficient_quota/.test(haystack)) {\r\n return {\r\n errorClass: \"billing\",\r\n summary: redactProviderErrorText(raw || \"Billing or credits exhausted\"),\r\n statusCode: code,\r\n transient: false,\r\n };\r\n }\r\n if (code === 401 || code === 403 || /\\bunauthorized\\b|\\bforbidden\\b/.test(haystack)) {\r\n return {\r\n errorClass: \"auth\",\r\n summary: redactProviderErrorText(raw || \"Authentication failed\"),\r\n statusCode: code,\r\n transient: false,\r\n };\r\n }\r\n if (code === 429 || /rate limit|too many requests|throttl/.test(haystack)) {\r\n return {\r\n errorClass: \"rate_limit\",\r\n summary: redactProviderErrorText(raw || \"Rate limited\"),\r\n statusCode: code,\r\n transient: true,\r\n };\r\n }\r\n if (\r\n code === 503 ||\r\n /upstream connect error|connection termination|remote connection failure|delayed connect error/.test(\r\n haystack,\r\n )\r\n ) {\r\n return {\r\n errorClass: \"upstream_503\",\r\n summary: redactProviderErrorText(raw || \"ChatGPT Codex backend returned HTTP 503\"),\r\n statusCode: code ?? 503,\r\n transient: true,\r\n };\r\n }\r\n if (/connection refused/.test(haystack)) {\r\n return {\r\n errorClass: \"connection_refused\",\r\n summary: redactProviderErrorText(raw || \"Connection refused by ChatGPT Codex backend\"),\r\n statusCode: code,\r\n transient: true,\r\n };\r\n }\r\n if (/no sse events|no bytes within|no stream events|codex stream produced no/.test(haystack)) {\r\n const sseClass: OpenAiCodexErrorClass = /no bytes|ttfb|first byte/.test(haystack)\r\n ? \"sse_no_event\"\r\n : \"sse_idle_timeout\";\r\n return {\r\n errorClass: sseClass,\r\n summary: redactProviderErrorText(\r\n raw ||\r\n (sseClass === \"sse_no_event\"\r\n ? \"Codex stream opened but sent no events\"\r\n : \"Codex stream stalled after the first event\"),\r\n ),\r\n statusCode: code,\r\n transient: true,\r\n };\r\n }\r\n if (/connection reset|connection lost|connection closed|disconnect\\/reset/.test(haystack)) {\r\n return {\r\n errorClass: \"connection_reset\",\r\n summary: redactProviderErrorText(raw || \"Connection reset while talking to ChatGPT Codex\"),\r\n statusCode: code,\r\n transient: true,\r\n };\r\n }\r\n\r\n return {\r\n errorClass: \"unknown\",\r\n summary: redactProviderErrorText(raw || \"Unknown provider error\"),\r\n statusCode: code,\r\n transient: false,\r\n };\r\n}\r\n\r\nexport function resolveOpenAiCodexRetryBudget(input: {\r\n platform?: string | null;\r\n provider?: string | null;\r\n defaultRetries?: number;\r\n env?: NodeJS.ProcessEnv;\r\n}): number {\r\n const env = input.env ?? process.env;\r\n const base = Math.max(1, input.defaultRetries ?? 3);\r\n const provider = String(input.provider ?? \"\").toLowerCase();\r\n const platform = String(input.platform ?? \"\").toLowerCase();\r\n if (provider !== OPENAI_CODEX_PROVIDER || platform !== \"cron\") {\r\n return base;\r\n }\r\n const raw = env.HERMES_CODEX_CRON_API_MAX_RETRIES?.trim();\r\n if (!raw) {\r\n return Math.max(base, 5);\r\n }\r\n const parsed = Number.parseInt(raw, 10);\r\n if (!Number.isFinite(parsed) || parsed < 1) {\r\n return Math.max(base, 5);\r\n }\r\n return Math.max(base, parsed);\r\n}\r\n\r\nexport type CodexFailureNoticeInput = {\r\n jobName?: string;\r\n provider?: string;\r\n model?: string;\r\n errorClass: OpenAiCodexErrorClass;\r\n summary: string;\r\n attempts: number;\r\n platform?: string;\r\n degraded?: boolean;\r\n};\r\n\r\nconst ERROR_CLASS_PLAIN: Record<OpenAiCodexErrorClass, string> = {\r\n upstream_503: \"ChatGPT Codex backend outage (HTTP 503)\",\r\n connection_refused: \"ChatGPT Codex backend refused the connection\",\r\n connection_reset: \"ChatGPT Codex connection dropped mid-request\",\r\n sse_no_event: \"Codex stream never started (no SSE events)\",\r\n sse_idle_timeout: \"Codex stream stalled (no SSE events after the first byte)\",\r\n rate_limit: \"ChatGPT Codex rate limit\",\r\n billing: \"ChatGPT Codex billing or quota limit\",\r\n auth: \"ChatGPT Codex authentication problem\",\r\n unknown: \"ChatGPT Codex provider error\",\r\n};\r\n\r\nexport function formatOpenAiCodexFailureNotice(input: CodexFailureNoticeInput): string {\r\n const provider = input.provider?.trim() || OPENAI_CODEX_PROVIDER;\r\n const model = input.model?.trim() || \"(unknown model)\";\r\n const label = input.jobName?.trim() || \"Scheduled Hermes job\";\r\n const what = ERROR_CLASS_PLAIN[input.errorClass] ?? ERROR_CLASS_PLAIN.unknown;\r\n const mode = input.degraded ? \"degraded\" : \"failed\";\r\n const lines = [\r\n `\u26A0\uFE0F ${label} \u2014 AI provider ${mode} (not a Kynver harness failure).`,\r\n \"\",\r\n `Provider: ${provider} (ChatGPT Codex subscription)`,\r\n `Model: ${model}`,\r\n `What happened: ${what} after ${input.attempts} attempt(s) with backoff.`,\r\n `Details: ${input.summary}`,\r\n \"\",\r\n \"This is a ChatGPT/Codex API issue on chatgpt.com \u2014 not AgentOS, not the Kynver runtime, and not your local harness.\",\r\n \"The cron job will run again on its next schedule. If it persists, check ChatGPT/Codex status or re-auth with: hermes auth status openai-codex\",\r\n ];\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nexport function formatCronJobDeliveryFailure(\r\n jobName: string,\r\n notice: string,\r\n): string {\r\n return `\u26A0\uFE0F Cron job '${jobName}' \u2014 provider degraded\\n\\n${notice}`;\r\n}\r\n", "import type { OrchestrationRoutingAudit } from \"./types.js\";\r\n\r\nexport function sanitizeOrchestrationAudit(\r\n audit: OrchestrationRoutingAudit,\r\n): OrchestrationRoutingAudit {\r\n const {\r\n provider,\r\n model,\r\n authSource,\r\n costTier,\r\n riskClass,\r\n costRationale,\r\n routingRule,\r\n escalatedFrom,\r\n escalatedReason,\r\n } = audit;\r\n return {\r\n provider,\r\n model,\r\n authSource,\r\n costTier,\r\n riskClass,\r\n costRationale,\r\n routingRule,\r\n escalatedFrom,\r\n escalatedReason,\r\n };\r\n}\r\n\r\nexport function orchestrationAuditForWorkerJson(\r\n audit: OrchestrationRoutingAudit,\r\n): OrchestrationRoutingAudit {\r\n return sanitizeOrchestrationAudit(audit);\r\n}\r\n", "/** Kynver-first foreground orchestration policy \u2014 observe before enforce. */\r\n\r\nexport const ORCHESTRATION_POLICY_MODES = [\"off\", \"observe\", \"enforce\"] as const;\r\nexport type OrchestrationPolicyMode = (typeof ORCHESTRATION_POLICY_MODES)[number];\r\n\r\nexport const ORCHESTRATION_ACTION_KINDS = [\r\n \"foreground_harness_spawn\",\r\n \"shell_platform_dispatch\",\r\n] as const;\r\nexport type OrchestrationActionKind = (typeof ORCHESTRATION_ACTION_KINDS)[number];\r\n\r\nexport const ORCHESTRATION_POLICY_DECISIONS = [\r\n \"allow_local\",\r\n \"observe_bypass\",\r\n \"enforce_harness_task\",\r\n] as const;\r\nexport type OrchestrationPolicyDecision = (typeof ORCHESTRATION_POLICY_DECISIONS)[number];\r\n\r\nexport interface OrchestrationPolicyEvaluateInput {\r\n action: OrchestrationActionKind;\r\n toolName?: string | null;\r\n sessionId?: string | null;\r\n planId?: string | null;\r\n parentTaskId?: string | null;\r\n title?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface OrchestrationPolicyEvaluateResult {\r\n mode: OrchestrationPolicyMode;\r\n decision: OrchestrationPolicyDecision;\r\n /** Stable idempotency key when enforce would create a linked harness task. */\r\n idempotencyKey: string | null;\r\n bypassLogged: boolean;\r\n reason: string;\r\n}\r\n", "import type { OrchestrationPolicyMode } from \"./types.js\";\r\nimport { ORCHESTRATION_POLICY_MODES } from \"./types.js\";\r\n\r\nfunction normalizeMode(raw: string | undefined): OrchestrationPolicyMode {\r\n const value = (raw ?? \"off\").trim().toLowerCase();\r\n if ((ORCHESTRATION_POLICY_MODES as readonly string[]).includes(value)) {\r\n return value as OrchestrationPolicyMode;\r\n }\r\n return \"off\";\r\n}\r\n\r\n/** Resolve orchestration policy mode from env (default off \u2014 local fallback preserved). */\r\nexport function resolveOrchestrationPolicyMode(\r\n env: NodeJS.ProcessEnv = process.env,\r\n): OrchestrationPolicyMode {\r\n return normalizeMode(env.KYNVER_ORCHESTRATION_POLICY_MODE);\r\n}\r\n\r\n/** Feature gate for enforce-mode linked AgentTask creation (default false until explicitly on). */\r\nexport function isOrchestrationEnforceTasksEnabled(\r\n env: NodeJS.ProcessEnv = process.env,\r\n): boolean {\r\n const raw = env.KYNVER_ORCHESTRATION_ENFORCE_TASKS?.trim().toLowerCase();\r\n if (!raw) return resolveOrchestrationPolicyMode(env) === \"enforce\";\r\n return raw === \"1\" || raw === \"true\" || raw === \"yes\" || raw === \"on\";\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\n\r\nfunction trimOrNull(value: string | null | undefined): string | null {\r\n if (value == null) return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\n/** Deterministic foreground harness task idempotency key for Hermes/Forge sessions. */\r\nexport function buildForegroundHarnessIdempotencyKey(input: {\r\n sessionId?: string | null;\r\n planId?: string | null;\r\n parentTaskId?: string | null;\r\n title?: string | null;\r\n action?: string | null;\r\n}): string {\r\n const session = trimOrNull(input.sessionId) ?? \"anonymous\";\r\n const title = trimOrNull(input.title) ?? trimOrNull(input.action) ?? \"foreground\";\r\n const digest = createHash(\"sha256\")\r\n .update(\r\n [\r\n trimOrNull(input.planId) ?? \"\",\r\n trimOrNull(input.parentTaskId) ?? \"\",\r\n title.toLowerCase(),\r\n ].join(\"|\"),\r\n )\r\n .digest(\"hex\")\r\n .slice(0, 16);\r\n return `hermes-foreground:${session}:${digest}`;\r\n}\r\n", "import {\r\n isOrchestrationEnforceTasksEnabled,\r\n resolveOrchestrationPolicyMode,\r\n} from \"./config.js\";\r\nimport { buildForegroundHarnessIdempotencyKey } from \"./idempotency.js\";\r\nimport type {\r\n OrchestrationPolicyDecision,\r\n OrchestrationPolicyEvaluateInput,\r\n OrchestrationPolicyEvaluateResult,\r\n OrchestrationPolicyMode,\r\n} from \"./types.js\";\r\n\r\nfunction decisionForMode(\r\n mode: OrchestrationPolicyMode,\r\n enforceEnabled: boolean,\r\n): OrchestrationPolicyDecision {\r\n if (mode === \"enforce\" && enforceEnabled) return \"enforce_harness_task\";\r\n if (mode === \"observe\") return \"observe_bypass\";\r\n return \"allow_local\";\r\n}\r\n\r\n/**\r\n * Evaluate whether a foreground orchestration action should stay local, be\r\n * observed (logged bypass), or route through linked harness AgentTask creation.\r\n */\r\nexport function evaluateOrchestrationPolicy(\r\n input: OrchestrationPolicyEvaluateInput,\r\n env: NodeJS.ProcessEnv = process.env,\r\n): OrchestrationPolicyEvaluateResult {\r\n const mode = resolveOrchestrationPolicyMode(env);\r\n const enforceEnabled = isOrchestrationEnforceTasksEnabled(env);\r\n const decision = decisionForMode(mode, enforceEnabled);\r\n const idempotencyKey =\r\n decision === \"enforce_harness_task\"\r\n ? buildForegroundHarnessIdempotencyKey({\r\n sessionId: input.sessionId,\r\n planId: input.planId,\r\n parentTaskId: input.parentTaskId,\r\n title: input.title,\r\n action: input.action,\r\n })\r\n : null;\r\n\r\n let reason: string;\r\n if (mode === \"off\") {\r\n reason = \"Orchestration policy off \u2014 local foreground path allowed.\";\r\n } else if (decision === \"observe_bypass\") {\r\n reason = `Observe mode: ${input.action} bypass logged; local fallback preserved.`;\r\n } else if (decision === \"enforce_harness_task\") {\r\n reason = `Enforce mode: ${input.action} must create linked harness AgentTask (${idempotencyKey}).`;\r\n } else {\r\n reason = \"Local foreground path allowed.\";\r\n }\r\n\r\n return {\r\n mode,\r\n decision,\r\n idempotencyKey,\r\n bypassLogged: decision === \"observe_bypass\",\r\n reason,\r\n };\r\n}\r\n", "export function redactHarness(text: string, secret?: string): string {\r\n let out = text;\r\n if (secret) out = out.split(secret).join(\"[REDACTED_SECRET]\");\r\n out = out.replace(/kynver_[a-z0-9_]+/gi, \"[REDACTED_KYNVER_TOKEN]\");\r\n out = out.replace(/sk-[a-zA-Z0-9_-]+/g, \"[REDACTED_API_KEY]\");\r\n return out;\r\n}\r\n", "import * as fs from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport * as path from \"node:path\";\r\n\r\n/** Expand a leading `~/` for filesystem use. */\r\nexport function expandHomePath(filePath: string): string {\r\n if (filePath.startsWith(\"~/\")) {\r\n return path.join(homedir(), filePath.slice(2));\r\n }\r\n return filePath;\r\n}\r\n\r\n/**\r\n * Candidate `.env` paths for selective production DB key reads.\r\n * Order: explicit `KYNVER_ENV_FILE` \u2192 walk up from `cwd` \u2192 `~/.kynver/.env` \u2192\r\n * `defaultRepo` from `~/.kynver/config.json`.\r\n */\r\nexport function discoverProductionDbEnvFilePaths(options: {\r\n cwd?: string;\r\n env?: NodeJS.ProcessEnv;\r\n /** Injectable for tests; defaults to `os.homedir()`. */\r\n homeDir?: string;\r\n} = {}): string[] {\r\n const env = options.env ?? process.env;\r\n const cwd = options.cwd ?? process.cwd();\r\n const home =\r\n options.homeDir ??\r\n (env.HOME?.trim() || env.USERPROFILE?.trim() || homedir());\r\n const seen = new Set<string>();\r\n const out: string[] = [];\r\n\r\n const push = (candidate: string) => {\r\n const resolved = path.resolve(expandHomePath(candidate));\r\n if (seen.has(resolved)) return;\r\n seen.add(resolved);\r\n out.push(resolved);\r\n };\r\n\r\n const explicit = env.KYNVER_ENV_FILE?.trim();\r\n if (explicit) push(explicit);\r\n\r\n let dir = cwd;\r\n for (let depth = 0; depth < 12; depth += 1) {\r\n push(path.join(dir, \".env\"));\r\n const parent = path.dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n\r\n push(path.join(home, \".kynver\", \".env\"));\r\n\r\n try {\r\n const configPath = path.join(home, \".kynver\", \"config.json\");\r\n if (fs.existsSync(configPath)) {\r\n const config = JSON.parse(fs.readFileSync(configPath, \"utf8\")) as {\r\n defaultRepo?: string;\r\n };\r\n const defaultRepo = config.defaultRepo?.trim();\r\n if (defaultRepo) {\r\n push(path.join(defaultRepo, \".env\"));\r\n }\r\n }\r\n } catch {\r\n // Best-effort \u2014 config is optional.\r\n }\r\n\r\n return out;\r\n}\r\n", "import { execFileSync, spawnSync } from \"node:child_process\";\r\nimport * as fs from \"node:fs\";\r\nimport * as path from \"node:path\";\r\nimport { discoverProductionDbEnvFilePaths } from \"./db-credential-env-paths.js\";\r\nimport { safeDatabaseUrlHint } from \"./db-url-hint.js\";\r\n\r\n/** How production DATABASE_URL was obtained (no secrets in this enum). */\r\nexport type DbCredentialSource =\r\n | \"neon-cli\"\r\n | \"env:KYNVER_PRODUCTION_DATABASE_URL\"\r\n | \"env:PRODUCTION_DATABASE_URL\"\r\n | \"env-file:PRODUCTION_DATABASE_URL\"\r\n | \"env-file:KYNVER_PRODUCTION_DATABASE_URL\";\r\n\r\nexport interface DbCredentialResolution {\r\n ok: true;\r\n databaseUrl: string;\r\n source: DbCredentialSource;\r\n hint: string;\r\n}\r\n\r\nexport interface DbCredentialFailure {\r\n ok: false;\r\n reason: string;\r\n attempted: DbCredentialSource[];\r\n}\r\n\r\nexport type ResolveProductionDatabaseResult = DbCredentialResolution | DbCredentialFailure;\r\n\r\nconst PRODUCTION_ENV_KEYS = [\r\n \"KYNVER_PRODUCTION_DATABASE_URL\",\r\n \"PRODUCTION_DATABASE_URL\",\r\n] as const;\r\n\r\nconst ENV_FILE_KEYS = [...PRODUCTION_ENV_KEYS] as const;\r\n\r\nexport interface ResolveProductionDatabaseOptions {\r\n cwd?: string;\r\n env?: NodeJS.ProcessEnv;\r\n /** Injectable for tests \u2014 runs `neon connection-string`. */\r\n neonConnectionString?: (args: {\r\n branch: string;\r\n projectId?: string;\r\n databaseName?: string;\r\n roleName?: string;\r\n pooled?: boolean;\r\n }) => string | null;\r\n}\r\n\r\nfunction readEnvValue(env: NodeJS.ProcessEnv, key: string): string | undefined {\r\n const value = env[key]?.trim();\r\n return value || undefined;\r\n}\r\n\r\n/** Parse only production DB keys from a dotenv file \u2014 never loads unrelated secrets. */\r\nexport function readProductionDbKeysFromEnvFile(envPath: string): Partial<\r\n Record<(typeof ENV_FILE_KEYS)[number], string>\r\n> {\r\n if (!fs.existsSync(envPath)) return {};\r\n const out: Partial<Record<(typeof ENV_FILE_KEYS)[number], string>> = {};\r\n const allowed = new Set<string>(ENV_FILE_KEYS);\r\n for (const line of fs.readFileSync(envPath, \"utf8\").split(\"\\n\")) {\r\n const m = line.match(/^\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/);\r\n if (!m || !allowed.has(m[1])) continue;\r\n const key = m[1] as (typeof ENV_FILE_KEYS)[number];\r\n out[key] = m[2].replace(/^[\"']|[\"']$/g, \"\").trim();\r\n }\r\n return out;\r\n}\r\n\r\nfunction resolveFromProcessEnv(env: NodeJS.ProcessEnv): DbCredentialResolution | null {\r\n for (const key of PRODUCTION_ENV_KEYS) {\r\n const value = readEnvValue(env, key);\r\n if (value) {\r\n return {\r\n ok: true,\r\n databaseUrl: value,\r\n source: `env:${key}` as DbCredentialSource,\r\n hint: safeDatabaseUrlHint(value),\r\n };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction resolveFromEnvFiles(\r\n cwd: string,\r\n env: NodeJS.ProcessEnv,\r\n): DbCredentialResolution | null {\r\n for (const envPath of discoverProductionDbEnvFilePaths({ cwd, env })) {\r\n const parsed = readProductionDbKeysFromEnvFile(envPath);\r\n for (const key of ENV_FILE_KEYS) {\r\n const value = parsed[key]?.trim();\r\n if (value) {\r\n return {\r\n ok: true,\r\n databaseUrl: value,\r\n source: `env-file:${key}` as DbCredentialSource,\r\n hint: `${safeDatabaseUrlHint(value)} (${path.basename(envPath)})`,\r\n };\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction defaultNeonConnectionString(args: {\r\n branch: string;\r\n projectId?: string;\r\n databaseName?: string;\r\n roleName?: string;\r\n pooled?: boolean;\r\n}): string | null {\r\n const neonBin = process.platform === \"win32\" ? \"neon.cmd\" : \"neon\";\r\n const argv = [\r\n \"connection-string\",\r\n args.branch,\r\n \"--prisma\",\r\n \"-o\",\r\n \"json\",\r\n \"--no-color\",\r\n \"--no-analytics\",\r\n ];\r\n if (args.projectId) argv.push(\"--project-id\", args.projectId);\r\n if (args.databaseName) argv.push(\"--database-name\", args.databaseName);\r\n if (args.roleName) argv.push(\"--role-name\", args.roleName);\r\n if (args.pooled) argv.push(\"--pooled\");\r\n\r\n let stdout: string;\r\n try {\r\n const result = spawnSync(neonBin, argv, {\r\n encoding: \"utf8\",\r\n env: process.env,\r\n timeout: 30_000,\r\n });\r\n if (result.status !== 0) return null;\r\n stdout = (result.stdout || \"\").trim();\r\n } catch {\r\n try {\r\n stdout = execFileSync(\"neonctl\", argv, {\r\n encoding: \"utf8\",\r\n env: process.env,\r\n timeout: 30_000,\r\n }).trim();\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n if (!stdout) return null;\r\n try {\r\n const parsed = JSON.parse(stdout) as Record<string, unknown>;\r\n const fromField =\r\n (typeof parsed.connection_uri === \"string\" && parsed.connection_uri) ||\r\n (typeof parsed.connection_string === \"string\" && parsed.connection_string) ||\r\n (typeof parsed.connectionString === \"string\" && parsed.connectionString);\r\n if (fromField) return fromField;\r\n } catch {\r\n // Plain string output when JSON parse fails.\r\n }\r\n if (/^postgres(ql)?:\\/\\//i.test(stdout)) return stdout;\r\n return null;\r\n}\r\n\r\nfunction resolveFromNeonCli(\r\n env: NodeJS.ProcessEnv,\r\n neonFn: NonNullable<ResolveProductionDatabaseOptions[\"neonConnectionString\"]>,\r\n): DbCredentialResolution | null {\r\n const branch =\r\n readEnvValue(env, \"KYNVER_NEON_BRANCH\") ||\r\n readEnvValue(env, \"NEON_BRANCH\") ||\r\n \"production\";\r\n const url = neonFn({\r\n branch,\r\n projectId: readEnvValue(env, \"KYNVER_NEON_PROJECT_ID\") || readEnvValue(env, \"NEON_PROJECT_ID\"),\r\n databaseName: readEnvValue(env, \"KYNVER_NEON_DATABASE_NAME\") || readEnvValue(env, \"NEON_DATABASE_NAME\"),\r\n roleName: readEnvValue(env, \"KYNVER_NEON_ROLE_NAME\") || readEnvValue(env, \"NEON_ROLE_NAME\"),\r\n pooled: readEnvValue(env, \"KYNVER_NEON_POOLED\") === \"1\" || readEnvValue(env, \"NEON_POOLED\") === \"1\",\r\n });\r\n if (!url) return null;\r\n return {\r\n ok: true,\r\n databaseUrl: url,\r\n source: \"neon-cli\",\r\n hint: safeDatabaseUrlHint(url),\r\n };\r\n}\r\n\r\n/**\r\n * Resolve a production Prisma `DATABASE_URL` at CLI execution time.\r\n * Precedence: Neon CLI \u2192 explicit process env \u2192 selective `.env` keys\r\n * (`KYNVER_ENV_FILE`, walk-up from cwd, `~/.kynver/.env`, `defaultRepo/.env`).\r\n */\r\nexport function resolveProductionDatabaseUrl(\r\n options: ResolveProductionDatabaseOptions = {},\r\n): ResolveProductionDatabaseResult {\r\n const env = options.env ?? process.env;\r\n const cwd = options.cwd ?? process.cwd();\r\n const neonFn = options.neonConnectionString ?? defaultNeonConnectionString;\r\n const attempted: DbCredentialSource[] = [];\r\n const envFileCandidates = discoverProductionDbEnvFilePaths({ cwd, env });\r\n\r\n const fromNeon = resolveFromNeonCli(env, neonFn);\r\n attempted.push(\"neon-cli\");\r\n if (fromNeon) return fromNeon;\r\n\r\n for (const key of PRODUCTION_ENV_KEYS) {\r\n attempted.push(`env:${key}` as DbCredentialSource);\r\n }\r\n const fromEnv = resolveFromProcessEnv(env);\r\n if (fromEnv) return fromEnv;\r\n\r\n for (const key of ENV_FILE_KEYS) {\r\n attempted.push(`env-file:${key}` as DbCredentialSource);\r\n }\r\n const fromFile = resolveFromEnvFiles(cwd, env);\r\n if (fromFile) return fromFile;\r\n\r\n const searchedEnvFiles =\r\n envFileCandidates.length > 0\r\n ? ` Searched env files: ${envFileCandidates.slice(0, 6).join(\", \")}${envFileCandidates.length > 6 ? \"\u2026\" : \"\"}.`\r\n : \"\";\r\n return {\r\n ok: false,\r\n reason:\r\n \"No production database credentials found. Authenticate Neon CLI (`neon auth`), set KYNVER_NEON_* / NEON_* project hints, or provide PRODUCTION_DATABASE_URL / KYNVER_PRODUCTION_DATABASE_URL (process env, KYNVER_ENV_FILE, ~/.kynver/.env, or selective .env keys in the repo / defaultRepo checkout).\" +\r\n searchedEnvFiles,\r\n attempted,\r\n };\r\n}\r\n\r\n/** Set `process.env.DATABASE_URL` from resolver; logs source + host hint to stderr (no secrets). */\r\nexport function applyProductionDatabaseToProcess(\r\n options: ResolveProductionDatabaseOptions = {},\r\n): DbCredentialResolution {\r\n const resolved = resolveProductionDatabaseUrl(options);\r\n if (!resolved.ok) {\r\n throw new Error(resolved.reason);\r\n }\r\n process.env.DATABASE_URL = resolved.databaseUrl;\r\n console.error(\r\n `[kynver-cli] database target: ${resolved.hint} (source: ${resolved.source})`,\r\n );\r\n return resolved;\r\n}\r\n", "/**\r\n * Host + database name only (no user/password) for logs and operator confirmation.\r\n */\r\nexport function safeDatabaseUrlHint(url: string | undefined): string {\r\n if (!url?.trim()) return \"(not set)\";\r\n try {\r\n const u = new URL(url);\r\n const name = (u.pathname || \"\").replace(/^\\//, \"\").split(\"?\")[0] || \"(no database name)\";\r\n return `${u.hostname} / ${name}`;\r\n } catch {\r\n return \"(invalid URL)\";\r\n }\r\n}\r\n", "import { existsSync, mkdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { ensureGitRepo, git } from \"./git.js\";\r\nimport { getPaths } from \"./run-store.js\";\r\nimport { loadRun, runDirectory, saveRun } from \"./run-store.js\";\r\nimport { listRunsCli } from \"./run-list.js\";\r\nimport { required, safeSlug, timestampSlug, writeJson } from \"./util.js\";\r\nimport { resolveDefaultRepo } from \"./default-repo.js\";\r\nimport { validateRepo, validateRunId } from \"./validate.js\";\r\n\r\nfunction resolveCreateRunRepo(args: Record<string, string | boolean>): string {\r\n const explicit = typeof args.repo === \"string\" ? args.repo.trim() : \"\";\r\n if (explicit) return explicit;\r\n const resolved = resolveDefaultRepo();\r\n if (resolved) return resolved.repo;\r\n required(\"\", \"--repo (or set defaultRepo via `kynver setup` / KYNVER_DEFAULT_REPO)\");\r\n return \"\";\r\n}\r\n\r\nexport interface CreatedRunInfo {\r\n runId: string;\r\n runDir: string;\r\n repo: string;\r\n base: string;\r\n baseCommit: string;\r\n}\r\n\r\nexport function createRun(args: Record<string, string | boolean>): CreatedRunInfo {\r\n const repo = validateRepo(resolveCreateRunRepo(args));\r\n ensureGitRepo(repo);\r\n const id = args.id ? validateRunId(String(args.id)) : timestampSlug(String(args.name || \"run\"));\r\n const dir = runDirectory(id);\r\n if (existsSync(dir)) failExists(`run already exists: ${id}`);\r\n mkdirSync(dir, { recursive: true });\r\n const base = String(args.base || \"origin/main\");\r\n const baseCommit = git(repo, [\"rev-parse\", base]).trim();\r\n const run = {\r\n id,\r\n name: String(args.name || id),\r\n repo,\r\n base,\r\n baseCommit,\r\n status: \"created\",\r\n createdAt: new Date().toISOString(),\r\n workers: {},\r\n };\r\n writeJson(path.join(dir, \"run.json\"), run);\r\n const info: CreatedRunInfo = { runId: id, runDir: dir, repo, base, baseCommit };\r\n console.log(JSON.stringify(info, null, 2));\r\n return info;\r\n}\r\n\r\nexport function listRuns(): void {\r\n listRunsCli();\r\n}\r\n\r\nfunction failExists(message: string): never {\r\n console.error(message);\r\n process.exit(1);\r\n}\r\n\r\nexport { loadRun, saveRun, runDirectory };\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { listRunRecords, runDirectory } from \"./run-store.js\";\r\nimport { listRunWorkerNames } from \"./run-worker-index.js\";\r\nimport { reconcileStaleWorkers } from \"./stale-reconcile.js\";\r\nimport { computeWorkerStatus, deriveRunStatus, isLandingBlockedWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\n\r\nexport interface RunListWorkerEvidence {\r\n worker: string;\r\n workerStatus: string;\r\n attention: string;\r\n attentionReason?: string;\r\n missingHeartbeat: boolean;\r\n missingFinalResult: boolean;\r\n landingBlocked: boolean;\r\n completionBlocked: boolean;\r\n}\r\n\r\nexport type RunListFinalizeBlockedReason =\r\n | \"landing_blocked\"\r\n | \"completion_blocked\"\r\n | \"active_workers\"\r\n | null;\r\n\r\nexport interface RunListRow {\r\n id: string;\r\n name: string;\r\n /** Persisted `run.json` status (updated by `finalizeStaleRuns` after reconcile). */\r\n status: string;\r\n /** Derived from worker attention/status \u2014 aligns with operator board semantics. */\r\n effectiveStatus: string;\r\n repo: string;\r\n createdAt: string;\r\n /** Workers still alive without a terminal result. */\r\n openWorkerCount: number;\r\n /** Highest-severity attention across workers (matches board rollup semantics). */\r\n attention: \"ok\" | \"done\" | \"stale\" | \"needs_attention\" | \"blocked\";\r\n attentionReason?: string;\r\n /** Why `finalizeStaleRuns` may keep `status` active while workers are dead. */\r\n finalizeBlockedReason: RunListFinalizeBlockedReason;\r\n evidence: {\r\n missingHeartbeatWorkers: string[];\r\n missingFinalResultWorkers: string[];\r\n landingBlockedWorkers: string[];\r\n completionBlockedWorkers: string[];\r\n workers: RunListWorkerEvidence[];\r\n };\r\n}\r\n\r\nfunction heartbeatByteLength(heartbeatPath: string | undefined): number {\r\n if (!heartbeatPath || !existsSync(heartbeatPath)) return 0;\r\n try {\r\n return readFileSync(heartbeatPath, \"utf8\").trim().length;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction workerEvidence(run: HarnessRunRecord, workerName: string): RunListWorkerEvidence {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(workerName), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker) {\r\n return {\r\n worker: workerName,\r\n workerStatus: \"missing\",\r\n attention: \"needs_attention\",\r\n attentionReason: \"worker.json missing\",\r\n missingHeartbeat: true,\r\n missingFinalResult: true,\r\n landingBlocked: false,\r\n completionBlocked: false,\r\n };\r\n }\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n const missingHeartbeat = heartbeatByteLength(worker.heartbeatPath) === 0;\r\n const missingFinalResult = !status.finalResult && !status.alive;\r\n const completionBlocked =\r\n typeof worker.completionBlocker === \"string\" && worker.completionBlocker.length > 0;\r\n return {\r\n worker: workerName,\r\n workerStatus: worker.status,\r\n attention: status.attention.state,\r\n attentionReason: status.attention.reason,\r\n missingHeartbeat,\r\n missingFinalResult,\r\n landingBlocked: isLandingBlockedWorkerStatus(status),\r\n completionBlocked,\r\n };\r\n}\r\n\r\nfunction deriveFinalizeBlockedReason(input: {\r\n run: HarnessRunRecord;\r\n workers: readonly RunListWorkerEvidence[];\r\n openWorkerCount: number;\r\n}): RunListFinalizeBlockedReason {\r\n if (input.openWorkerCount > 0) return \"active_workers\";\r\n if (input.workers.some((w) => w.completionBlocked)) return \"completion_blocked\";\r\n if (input.workers.some((w) => w.landingBlocked)) return \"landing_blocked\";\r\n return null;\r\n}\r\n\r\nfunction aggregateRunAttention(\r\n workers: readonly RunListWorkerEvidence[],\r\n): Pick<RunListRow, \"attention\" | \"attentionReason\"> {\r\n const rank: Record<RunListRow[\"attention\"], number> = {\r\n blocked: 5,\r\n needs_attention: 4,\r\n stale: 3,\r\n done: 2,\r\n ok: 1,\r\n };\r\n let best: RunListRow[\"attention\"] = \"ok\";\r\n let reason: string | undefined;\r\n for (const w of workers) {\r\n const state = w.attention as RunListRow[\"attention\"];\r\n if ((rank[state] ?? 0) >= (rank[best] ?? 0)) {\r\n best = state;\r\n reason = w.attentionReason;\r\n }\r\n }\r\n return { attention: best, attentionReason: reason };\r\n}\r\n\r\nfunction countOpenWorkers(run: HarnessRunRecord): number {\r\n let open = 0;\r\n for (const name of listRunWorkerNames(run)) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker) continue;\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n if (status.alive && !status.finalResult) open += 1;\r\n }\r\n return open;\r\n}\r\n\r\nexport function buildRunListRows(): RunListRow[] {\r\n reconcileStaleWorkers();\r\n return listRunRecords().map((run) => {\r\n const workerNames = listRunWorkerNames(run);\r\n const workers = workerNames.map((name) => workerEvidence(run, name));\r\n const missingHeartbeatWorkers = workers.filter((w) => w.missingHeartbeat).map((w) => w.worker);\r\n const missingFinalResultWorkers = workers.filter((w) => w.missingFinalResult).map((w) => w.worker);\r\n const landingBlockedWorkers = workers.filter((w) => w.landingBlocked).map((w) => w.worker);\r\n const completionBlockedWorkers = workers.filter((w) => w.completionBlocked).map((w) => w.worker);\r\n const { attention, attentionReason } = aggregateRunAttention(workers);\r\n const openWorkerCount = countOpenWorkers(run);\r\n const effectiveStatus = deriveRunStatus(\r\n run.status,\r\n workers.map((w) => ({ attention: w.attention, status: w.workerStatus })),\r\n );\r\n return {\r\n id: run.id,\r\n name: run.name,\r\n status: run.status,\r\n effectiveStatus,\r\n repo: run.repo,\r\n createdAt: run.createdAt,\r\n openWorkerCount,\r\n attention,\r\n attentionReason,\r\n finalizeBlockedReason: deriveFinalizeBlockedReason({ run, workers, openWorkerCount }),\r\n evidence: {\r\n missingHeartbeatWorkers,\r\n missingFinalResultWorkers,\r\n landingBlockedWorkers,\r\n completionBlockedWorkers,\r\n workers,\r\n },\r\n };\r\n });\r\n}\r\n\r\n/** `kynver run list` \u2014 reconciles stale workers first, then prints run rows (JSON array). */\r\nexport function listRunsCli(): void {\r\n console.log(JSON.stringify(buildRunListRows(), null, 2));\r\n}\r\n", "import path from \"node:path\";\r\nimport { finalizeStaleRuns, type RunFinalizeResult } from \"./finalize.js\";\r\nimport { listRunRecords, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { listRunWorkerNames } from \"./run-worker-index.js\";\r\nimport { computeWorkerStatus, STALE_MS, type HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, killWorkerProcess, readJson, safeSlug } from \"./util.js\";\r\nimport { reconcileWorkerMetadata } from \"./worker-metadata-reconcile.js\";\r\nimport { reconcileLocalOnlyMergedPrAttention } from \"./local-pr-attention-reconcile.js\";\r\nimport { archiveTerminalWorkerMetadata } from \"./run-metadata-retention.js\";\r\n\r\n/** No heartbeat this long + dead PID \u2192 reconcile as exited. */\r\nexport const STALE_RECONCILE_HEARTBEAT_MS = 15 * 60 * 1000;\r\n\r\nexport interface StaleWorkerReconcileOutcome {\r\n runId: string;\r\n worker: string;\r\n action: \"marked_exited\" | \"killed_stale\" | \"skipped\";\r\n reason: string;\r\n}\r\n\r\nexport interface ReconcileStaleWorkersResult {\r\n workers: StaleWorkerReconcileOutcome[];\r\n finalizedRuns: RunFinalizeResult[];\r\n metadataReconcile: ReturnType<typeof reconcileWorkerMetadata>;\r\n localPrAttentionReconcile: ReturnType<typeof reconcileLocalOnlyMergedPrAttention>;\r\n terminalWorkerArchive: ReturnType<typeof archiveTerminalWorkerMetadata>;\r\n}\r\n\r\nfunction staleReconcileDisabled(): boolean {\r\n return process.env.KYNVER_NO_STALE_CLEANUP === \"1\";\r\n}\r\n\r\n/**\r\n * Reconcile workers that exited without updating worker.json, and optionally\r\n * terminate long-idle live processes. Paused workers with recent heartbeat\r\n * blockers are left alone (heartbeat freshness gate).\r\n */\r\nexport function reconcileStaleWorkers(): ReconcileStaleWorkersResult {\r\n const metadataReconcile = reconcileWorkerMetadata();\r\n if (staleReconcileDisabled()) {\r\n const localPrAttentionReconcile = reconcileLocalOnlyMergedPrAttention();\r\n const terminalWorkerArchive = archiveTerminalWorkerMetadata();\r\n return {\r\n workers: [],\r\n finalizedRuns: finalizeStaleRuns(),\r\n metadataReconcile,\r\n localPrAttentionReconcile,\r\n terminalWorkerArchive,\r\n };\r\n }\r\n\r\n const outcomes: StaleWorkerReconcileOutcome[] = [];\r\n const now = Date.now();\r\n\r\n for (const run of listRunRecords()) {\r\n for (const name of listRunWorkerNames(run)) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker || worker.status !== \"running\") {\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"skipped\",\r\n reason: worker ? `worker status is ${worker.status}` : \"worker.json missing\",\r\n });\r\n continue;\r\n }\r\n\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n if (status.finalResult) {\r\n if (worker.status === \"running\") {\r\n const nextStatus =\r\n status.attention.state === \"blocked\"\r\n ? \"blocked\"\r\n : status.attention.state === \"done\" || status.status === \"done\"\r\n ? \"done\"\r\n : \"exited\";\r\n worker.status = nextStatus;\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = \"synced finished worker record after terminal stdout/heartbeat\";\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_exited\",\r\n reason: worker.reconcileReason,\r\n });\r\n } else {\r\n outcomes.push({ runId: run.id, worker: name, action: \"skipped\", reason: \"final result present\" });\r\n }\r\n continue;\r\n }\r\n\r\n if (!status.alive) {\r\n const nextStatus =\r\n status.attention.state === \"blocked\" ? \"blocked\" : status.status === \"done\" ? \"done\" : \"exited\";\r\n worker.status = nextStatus;\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = status.attention.reason;\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_exited\",\r\n reason: status.attention.reason,\r\n });\r\n continue;\r\n }\r\n\r\n // Live PID but no meaningful activity \u2014 only kill when heartbeat is also stale\r\n // (avoids killing a paused worker that recently reported a blocker).\r\n if (status.attention.state === \"stale\" && worker.pid && isPidAlive(worker.pid)) {\r\n const hbMs = status.lastHeartbeatAt ? Date.parse(status.lastHeartbeatAt) : NaN;\r\n const actMs = status.lastActivityAt ? Date.parse(status.lastActivityAt) : NaN;\r\n const hbStale =\r\n !Number.isFinite(hbMs) || now - hbMs > STALE_RECONCILE_HEARTBEAT_MS;\r\n const actStale = Number.isFinite(actMs) && now - actMs > STALE_MS;\r\n if (hbStale && actStale) {\r\n killWorkerProcess(worker.pid, \"SIGTERM\");\r\n worker.status = \"exited\";\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = `reconciled stale worker: ${status.attention.reason}`;\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"killed_stale\",\r\n reason: status.attention.reason,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"skipped\",\r\n reason: status.attention.reason,\r\n });\r\n }\r\n }\r\n\r\n const localPrAttentionReconcile = reconcileLocalOnlyMergedPrAttention();\r\n const terminalWorkerArchive = archiveTerminalWorkerMetadata();\r\n return { workers: outcomes, finalizedRuns: finalizeStaleRuns(), metadataReconcile, localPrAttentionReconcile, terminalWorkerArchive };\r\n}\r\n\r\n/**\r\n * One-shot CLI entry for `kynver run reconcile`: reconciles stale workers and\r\n * finalizes dead runs globally without requiring a running daemon. Prints a\r\n * JSON summary to stdout.\r\n */\r\nexport function reconcileRunsCli(): void {\r\n const result = reconcileStaleWorkers();\r\n const markedExited = result.workers.filter((w) => w.action === \"marked_exited\").length;\r\n const killedStale = result.workers.filter((w) => w.action === \"killed_stale\").length;\r\n const skipped = result.workers.filter((w) => w.action === \"skipped\").length;\r\n const metadataTotals = result.metadataReconcile.workers.reduce<Record<string, number>>((acc, row) => {\r\n acc[row.action] = (acc[row.action] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n const localPrAttentionTotals = result.localPrAttentionReconcile.workers.reduce<Record<string, number>>((acc, row) => {\r\n acc[row.action] = (acc[row.action] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n const runRetentionTotals = result.metadataReconcile.runMetadataRetention.runs.reduce<\r\n Record<string, number>\r\n >((acc, row) => {\r\n acc[row.action] = (acc[row.action] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n const archiveTotals = result.terminalWorkerArchive.workers.reduce<Record<string, number>>((acc, row) => {\r\n acc[row.action] = (acc[row.action] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n workers: { markedExited, killedStale, skipped, total: result.workers.length },\r\n metadataReconcile: {\r\n totals: metadataTotals,\r\n total: result.metadataReconcile.workers.length,\r\n runMetadataRetention: {\r\n totals: runRetentionTotals,\r\n total: result.metadataReconcile.runMetadataRetention.runs.length,\r\n },\r\n },\r\n localPrAttentionReconcile: {\r\n totals: localPrAttentionTotals,\r\n total: result.localPrAttentionReconcile.workers.length,\r\n },\r\n terminalWorkerArchive: {\r\n totals: archiveTotals,\r\n total: result.terminalWorkerArchive.workers.length,\r\n },\r\n finalizedRuns: result.finalizedRuns.length,\r\n details: {\r\n workers: result.workers,\r\n metadataReconcile: result.metadataReconcile.workers,\r\n localPrAttentionReconcile: result.localPrAttentionReconcile.workers,\r\n terminalWorkerArchive: result.terminalWorkerArchive.workers,\r\n runMetadataRetention: result.metadataReconcile.runMetadataRetention.runs,\r\n finalizedRuns: result.finalizedRuns,\r\n },\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n", "import path from \"node:path\";\r\nimport { listRunRecords, runDirectory, saveRun, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { listRunWorkerNames } from \"./run-worker-index.js\";\r\nimport { computeWorkerStatus, isLandingBlockedWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface RunFinalizeResult {\r\n runId: string;\r\n from: string;\r\n to: string;\r\n}\r\n\r\n/** Run statuses we treat as \"not yet terminal\" and therefore candidates for finalization. */\r\nexport const ACTIVE_RUN_STATUSES = new Set([\r\n \"running\",\r\n \"dispatching\",\r\n \"pending\",\r\n \"queued\",\r\n \"needs_attention\",\r\n]);\r\n\r\nexport const TERMINAL_RUN_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\", \"done\"]);\r\n\r\n/**\r\n * Decide the terminal status for a run, or null if it should stay active.\r\n * A run is terminal once none of its workers are still alive-and-unfinished.\r\n */\r\nexport function deriveTerminalRunStatus(run: HarnessRunRecord): string | null {\r\n const names = listRunWorkerNames(run);\r\n if (names.length === 0) return \"failed\"; // marked active but never started a worker\r\n let anyAlive = false;\r\n let anyResult = false;\r\n let anyCompletionBlocked = false;\r\n let anyLandingBlocked = false;\r\n for (const name of names) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) continue;\r\n const status = computeWorkerStatus(worker, {\r\n base: run.base,\r\n baseCommit: run.baseCommit,\r\n });\r\n if (status.alive && !status.finalResult) {\r\n anyAlive = true;\r\n break;\r\n }\r\n // A finished worker whose AgentOS completion replay was rejected (e.g. a\r\n // revoked / expired / cross-workspace runner token) is NOT done: its linked\r\n // AgentTask never advanced. Keep the run non-terminal so the pipeline keeps\r\n // retrying completion (and the board surfaces the blocked worker) instead of\r\n // papering an invalid runner token over as `completed`.\r\n if (typeof worker.completionBlocker === \"string\" && worker.completionBlocker) {\r\n anyCompletionBlocked = true;\r\n }\r\n if (isLandingBlockedWorkerStatus(status)) {\r\n anyLandingBlocked = true;\r\n }\r\n if (status.finalResult && status.attention.state === \"done\") anyResult = true;\r\n }\r\n if (anyAlive) return null; // still doing real work \u2014 leave it running\r\n if (anyCompletionBlocked) return null; // completion replay blocked \u2014 not yet terminal\r\n if (anyLandingBlocked) return null; // dirty/unlanded work \u2014 keep run active for operator attention\r\n return anyResult ? \"completed\" : \"failed\";\r\n}\r\n\r\n/**\r\n * Finalize runs that are still marked active but have no live workers.\r\n *\r\n * The harness creates one run per task and never closed them out, leaving dozens\r\n * of \"running\" runs that bloated disk and broke operator views (and made cleanup\r\n * unsafe to reason about). Active-worker accounting already excludes dead workers,\r\n * so this is about run-status hygiene + enabling safe pruning of finished runs.\r\n *\r\n * Returns the runs whose status changed.\r\n */\r\nexport function finalizeStaleRuns(): RunFinalizeResult[] {\r\n const finalized: RunFinalizeResult[] = [];\r\n for (const run of listRunRecords()) {\r\n if (!ACTIVE_RUN_STATUSES.has(run.status)) continue;\r\n const next = deriveTerminalRunStatus(run);\r\n if (!next || next === run.status) continue;\r\n const from = run.status;\r\n run.status = next;\r\n saveRun(run);\r\n finalized.push({ runId: run.id, from, to: next });\r\n }\r\n return finalized;\r\n}\r\n", "import { existsSync, lstatSync, readdirSync, readlinkSync, renameSync, rmSync, symlinkSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { parseHeartbeat, terminalFinalResultFromHeartbeat } from \"./heartbeat.js\";\r\nimport { parseHarnessStream } from \"./stream.js\";\r\nimport {\r\n canonicalRunDir,\r\n canonicalWorkerDir,\r\n hasNestedRunsSegment,\r\n legacyNestedWorkerDir,\r\n resolveWorkerJsonPath,\r\n workerArtifactFileNames,\r\n workerArtifactPaths,\r\n} from \"./worker-metadata-paths.js\";\r\nimport { repairMissingRunMetadata, runDirHasActiveRetentionSignals } from \"./run-metadata-retention.js\";\r\nimport { getPaths, listRunRecords, runDirectory, saveRun, saveWorker, type HarnessRunRecord } from \"./run-store.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { readJson } from \"./util.js\";\r\n\r\nexport interface WorkerMetadataReconcileOutcome {\r\n runId: string;\r\n worker: string;\r\n action:\r\n | \"materialized_run_symlink\"\r\n | \"repaired_run_index\"\r\n | \"repaired_worker_paths\"\r\n | \"relocated_artifacts\"\r\n | \"synthesized_worker_json\"\r\n | \"marked_abandoned\"\r\n | \"skipped\";\r\n reason: string;\r\n}\r\n\r\nexport interface WorkerMetadataReconcileResult {\r\n workers: WorkerMetadataReconcileOutcome[];\r\n runMetadataRetention: ReturnType<typeof repairMissingRunMetadata>;\r\n}\r\n\r\nfunction materializeSymlinkedRunDir(harnessRoot: string, runId: string): string | null {\r\n const canonical = canonicalRunDir(harnessRoot, runId);\r\n let stat;\r\n try {\r\n stat = lstatSync(canonical);\r\n } catch {\r\n return null;\r\n }\r\n if (!stat.isSymbolicLink()) return null;\r\n const linkedTarget = path.resolve(path.dirname(canonical), readlinkSync(canonical));\r\n if (runDirHasActiveRetentionSignals(linkedTarget) || runDirHasActiveRetentionSignals(canonical)) {\r\n return null;\r\n }\r\n const staging = `${canonical}.materialize-${Date.now()}`;\r\n renameSync(linkedTarget, staging);\r\n rmSync(canonical);\r\n renameSync(staging, canonical);\r\n return linkedTarget;\r\n}\r\n\r\nfunction relocateArtifacts(input: {\r\n fromDir: string;\r\n toDir: string;\r\n}): string[] {\r\n const moved: string[] = [];\r\n for (const fileName of workerArtifactFileNames()) {\r\n const from = path.join(input.fromDir, fileName);\r\n const to = path.join(input.toDir, fileName);\r\n if (!existsSync(from) || existsSync(to)) continue;\r\n renameSync(from, to);\r\n moved.push(fileName);\r\n }\r\n return moved;\r\n}\r\n\r\nfunction repairWorkerPathFields(worker: HarnessWorkerRecord, canonicalDir: string): boolean {\r\n const artifacts = workerArtifactPaths(canonicalDir);\r\n let changed = false;\r\n if (worker.workerDir !== canonicalDir) {\r\n worker.workerDir = canonicalDir;\r\n changed = true;\r\n }\r\n if (worker.stdoutPath !== artifacts.stdoutPath) {\r\n worker.stdoutPath = artifacts.stdoutPath;\r\n changed = true;\r\n }\r\n if (worker.stderrPath !== artifacts.stderrPath) {\r\n worker.stderrPath = artifacts.stderrPath;\r\n changed = true;\r\n }\r\n if (worker.heartbeatPath !== artifacts.heartbeatPath) {\r\n worker.heartbeatPath = artifacts.heartbeatPath;\r\n changed = true;\r\n }\r\n return changed;\r\n}\r\n\r\nfunction deriveSynthesizedStatus(input: {\r\n lastStatus: Record<string, unknown> | undefined;\r\n stdoutFinalResult: unknown;\r\n heartbeatFinalResult: unknown;\r\n}): string {\r\n const statusFromLast = typeof input.lastStatus?.status === \"string\" ? input.lastStatus.status : undefined;\r\n const attentionState =\r\n input.lastStatus?.attention && typeof input.lastStatus.attention === \"object\"\r\n ? (input.lastStatus.attention as { state?: string }).state\r\n : undefined;\r\n if (statusFromLast === \"done\" || attentionState === \"done\") return \"done\";\r\n if (input.stdoutFinalResult || input.heartbeatFinalResult) return \"done\";\r\n if (statusFromLast === \"blocked\") return \"blocked\";\r\n if (statusFromLast === \"running\") return \"exited\";\r\n return statusFromLast ?? \"exited\";\r\n}\r\n\r\nfunction synthesizeWorkerFromArtifacts(input: {\r\n run: HarnessRunRecord;\r\n workerName: string;\r\n canonicalDir: string;\r\n harnessRoot: string;\r\n}): HarnessWorkerRecord | null {\r\n const artifacts = workerArtifactPaths(input.canonicalDir);\r\n const lastStatus = readJson<Record<string, unknown> | undefined>(artifacts.lastStatusPath, undefined);\r\n const stdoutExists = existsSync(artifacts.stdoutPath);\r\n const heartbeatExists = existsSync(artifacts.heartbeatPath);\r\n const hasArtifacts = stdoutExists || heartbeatExists || lastStatus != null;\r\n if (!hasArtifacts) return null;\r\n\r\n const parsedStdout = stdoutExists ? parseHarnessStream(artifacts.stdoutPath) : { finalResult: null };\r\n const heartbeat = heartbeatExists ? parseHeartbeat(artifacts.heartbeatPath) : parseHeartbeat(\"\");\r\n const heartbeatFinalResult = terminalFinalResultFromHeartbeat(heartbeat);\r\n const status = deriveSynthesizedStatus({\r\n lastStatus,\r\n stdoutFinalResult: parsedStdout.finalResult,\r\n heartbeatFinalResult,\r\n });\r\n\r\n const worker: HarnessWorkerRecord = {\r\n name: input.workerName,\r\n runId: input.run.id,\r\n status,\r\n branch: typeof lastStatus?.branch === \"string\" ? lastStatus.branch : `agent/${input.run.id}/${input.workerName}`,\r\n worktreePath:\r\n typeof lastStatus?.worktreePath === \"string\"\r\n ? lastStatus.worktreePath\r\n : path.join(getPaths().worktreesDir, input.run.id, input.workerName),\r\n workerDir: input.canonicalDir,\r\n stdoutPath: artifacts.stdoutPath,\r\n stderrPath: artifacts.stderrPath,\r\n heartbeatPath: artifacts.heartbeatPath,\r\n startedAt: typeof lastStatus?.startedAt === \"string\" ? lastStatus.startedAt : input.run.createdAt,\r\n reconciledAt: new Date().toISOString(),\r\n reconcileReason: \"synthesized worker.json from on-disk artifacts after metadata repair\",\r\n };\r\n\r\n if (typeof lastStatus?.taskId === \"string\") worker.taskId = lastStatus.taskId;\r\n if (typeof lastStatus?.agentOsId === \"string\") worker.agentOsId = lastStatus.agentOsId;\r\n if (typeof lastStatus?.planId === \"string\") worker.planId = lastStatus.planId;\r\n if (typeof lastStatus?.pid === \"number\") worker.pid = lastStatus.pid;\r\n if (parsedStdout.finalResult || heartbeatFinalResult) {\r\n worker.completionSnapshot = {\r\n finalResult: parsedStdout.finalResult ?? heartbeatFinalResult ?? \"completed\",\r\n summary: heartbeat.lastHeartbeatSummary,\r\n };\r\n }\r\n\r\n repairWorkerPathFields(worker, input.canonicalDir);\r\n return worker;\r\n}\r\n\r\nfunction repairRunWorkerIndex(run: HarnessRunRecord, harnessRoot: string): boolean {\r\n let changed = false;\r\n const nextWorkers: HarnessRunRecord[\"workers\"] = { ...(run.workers || {}) };\r\n for (const [name, ref] of Object.entries(nextWorkers)) {\r\n const canonicalDir = canonicalWorkerDir(harnessRoot, run.id, name);\r\n const canonicalStatus = path.join(canonicalDir, \"worker.json\");\r\n const nested =\r\n hasNestedRunsSegment(ref.workerDir) ||\r\n hasNestedRunsSegment(ref.statusPath) ||\r\n ref.workerDir !== canonicalDir ||\r\n ref.statusPath !== canonicalStatus;\r\n if (!nested) continue;\r\n nextWorkers[name] = { workerDir: canonicalDir, statusPath: canonicalStatus };\r\n changed = true;\r\n }\r\n if (changed) {\r\n run.workers = nextWorkers;\r\n saveRun(run);\r\n }\r\n return changed;\r\n}\r\n\r\nfunction reconcileOneWorker(input: {\r\n run: HarnessRunRecord;\r\n workerName: string;\r\n harnessRoot: string;\r\n statusPath?: string;\r\n}): WorkerMetadataReconcileOutcome[] {\r\n const outcomes: WorkerMetadataReconcileOutcome[] = [];\r\n const canonicalDir = canonicalWorkerDir(input.harnessRoot, input.run.id, input.workerName);\r\n const legacyDir = legacyNestedWorkerDir(input.harnessRoot, input.run.id, input.workerName);\r\n const canonicalArtifacts = workerArtifactPaths(canonicalDir);\r\n\r\n const moved = relocateArtifacts({ fromDir: legacyDir, toDir: canonicalDir });\r\n if (moved.length > 0) {\r\n outcomes.push({\r\n runId: input.run.id,\r\n worker: input.workerName,\r\n action: \"relocated_artifacts\",\r\n reason: `moved ${moved.join(\", \")} from nested runs/runs layout`,\r\n });\r\n }\r\n\r\n const workerJsonPath = resolveWorkerJsonPath({\r\n harnessRoot: input.harnessRoot,\r\n runId: input.run.id,\r\n workerName: input.workerName,\r\n statusPath: input.statusPath,\r\n });\r\n\r\n let worker = readJson<HarnessWorkerRecord | undefined>(workerJsonPath, undefined);\r\n if (!worker && existsSync(canonicalArtifacts.workerJsonPath)) {\r\n worker = readJson<HarnessWorkerRecord | undefined>(canonicalArtifacts.workerJsonPath, undefined);\r\n }\r\n\r\n if (!worker) {\r\n const synthesized = synthesizeWorkerFromArtifacts({\r\n run: input.run,\r\n workerName: input.workerName,\r\n canonicalDir,\r\n harnessRoot: input.harnessRoot,\r\n });\r\n if (synthesized) {\r\n saveWorker(input.run.id, synthesized);\r\n outcomes.push({\r\n runId: input.run.id,\r\n worker: input.workerName,\r\n action: \"synthesized_worker_json\",\r\n reason: synthesized.reconcileReason ?? \"synthesized from artifacts\",\r\n });\r\n return outcomes;\r\n }\r\n\r\n const dirExists = existsSync(canonicalDir);\r\n const hasAnyArtifact = workerArtifactFileNames().some((f) => existsSync(path.join(canonicalDir, f)));\r\n if (dirExists && !hasAnyArtifact) {\r\n const abandoned: HarnessWorkerRecord = {\r\n name: input.workerName,\r\n runId: input.run.id,\r\n status: \"exited\",\r\n branch: `agent/${input.run.id}/${input.workerName}`,\r\n worktreePath: path.join(getPaths().worktreesDir, input.run.id, input.workerName),\r\n workerDir: canonicalDir,\r\n stdoutPath: canonicalArtifacts.stdoutPath,\r\n stderrPath: canonicalArtifacts.stderrPath,\r\n heartbeatPath: canonicalArtifacts.heartbeatPath,\r\n startedAt: input.run.createdAt,\r\n reconciledAt: new Date().toISOString(),\r\n reconcileReason: \"empty worker dir \u2014 marked abandoned during metadata reconcile\",\r\n };\r\n saveWorker(input.run.id, abandoned);\r\n outcomes.push({\r\n runId: input.run.id,\r\n worker: input.workerName,\r\n action: \"marked_abandoned\",\r\n reason: abandoned.reconcileReason ?? \"empty worker dir\",\r\n });\r\n return outcomes;\r\n }\r\n\r\n outcomes.push({\r\n runId: input.run.id,\r\n worker: input.workerName,\r\n action: \"skipped\",\r\n reason: \"worker.json missing and no recoverable artifacts\",\r\n });\r\n return outcomes;\r\n }\r\n\r\n if (repairWorkerPathFields(worker, canonicalDir)) {\r\n worker.reconciledAt = new Date().toISOString();\r\n worker.reconcileReason = worker.reconcileReason ?? \"repaired nested runs/runs path fields\";\r\n saveWorker(input.run.id, worker);\r\n outcomes.push({\r\n runId: input.run.id,\r\n worker: input.workerName,\r\n action: \"repaired_worker_paths\",\r\n reason: worker.reconcileReason,\r\n });\r\n } else {\r\n outcomes.push({\r\n runId: input.run.id,\r\n worker: input.workerName,\r\n action: \"skipped\",\r\n reason: \"worker metadata already canonical\",\r\n });\r\n }\r\n\r\n return outcomes;\r\n}\r\n\r\nfunction listOrphanWorkerNames(run: HarnessRunRecord, harnessRoot: string): string[] {\r\n const workersDir = path.join(runDirectory(run.id), \"workers\");\r\n if (!existsSync(workersDir)) return [];\r\n const indexed = new Set(Object.keys(run.workers || {}));\r\n const orphans: string[] = [];\r\n for (const entry of readdirSync(workersDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue;\r\n if (indexed.has(entry.name)) continue;\r\n orphans.push(entry.name);\r\n }\r\n return orphans;\r\n}\r\n\r\n/**\r\n * Repair historical harness worker metadata:\r\n * - fix run.json index paths that still reference nested `runs/runs`\r\n * - relocate split artifacts into canonical worker dirs\r\n * - synthesize missing worker.json from last-status/heartbeat/stdout when possible\r\n * - mark empty abandoned worker dirs truthfully\r\n */\r\nexport function reconcileWorkerMetadata(): WorkerMetadataReconcileResult {\r\n const { harnessRoot } = getPaths();\r\n const runMetadataRetention = repairMissingRunMetadata(harnessRoot);\r\n const outcomes: WorkerMetadataReconcileOutcome[] = [];\r\n\r\n for (const run of listRunRecords()) {\r\n const materializedFrom = materializeSymlinkedRunDir(harnessRoot, run.id);\r\n if (materializedFrom) {\r\n outcomes.push({\r\n runId: run.id,\r\n worker: \"*\",\r\n action: \"materialized_run_symlink\",\r\n reason: `replaced symlink with real run dir (was ${materializedFrom})`,\r\n });\r\n }\r\n\r\n if (repairRunWorkerIndex(run, harnessRoot)) {\r\n outcomes.push({\r\n runId: run.id,\r\n worker: \"*\",\r\n action: \"repaired_run_index\",\r\n reason: \"repaired nested runs/runs workerDir/statusPath entries in run.json\",\r\n });\r\n }\r\n\r\n const workerNames = new Set(Object.keys(run.workers || {}));\r\n for (const orphan of listOrphanWorkerNames(run, harnessRoot)) {\r\n workerNames.add(orphan);\r\n run.workers = {\r\n ...(run.workers || {}),\r\n [orphan]: {\r\n workerDir: canonicalWorkerDir(harnessRoot, run.id, orphan),\r\n statusPath: path.join(canonicalWorkerDir(harnessRoot, run.id, orphan), \"worker.json\"),\r\n },\r\n };\r\n saveRun(run);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: orphan,\r\n action: \"repaired_run_index\",\r\n reason: \"indexed orphan worker dir into run.json\",\r\n });\r\n }\r\n\r\n for (const name of workerNames) {\r\n const ref = run.workers?.[name];\r\n outcomes.push(\r\n ...reconcileOneWorker({\r\n run,\r\n workerName: name,\r\n harnessRoot,\r\n statusPath: ref?.statusPath,\r\n }),\r\n );\r\n }\r\n }\r\n\r\n return { workers: outcomes, runMetadataRetention };\r\n}\r\n\r\n/** JSON summary for CLI / verifier scripts. */\r\nexport function reconcileWorkerMetadataCli(): void {\r\n const result = reconcileWorkerMetadata();\r\n const byAction = result.workers.reduce<Record<string, number>>((acc, row) => {\r\n acc[row.action] = (acc[row.action] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n const runRetentionTotals = result.runMetadataRetention.runs.reduce<Record<string, number>>((acc, row) => {\r\n acc[row.action] = (acc[row.action] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n totals: byAction,\r\n runMetadataRetention: { totals: runRetentionTotals, details: result.runMetadataRetention.runs },\r\n details: result.workers,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n", "import path from \"node:path\";\r\nimport { harnessRunsDir, normalizeHarnessRoot } from \"./paths.js\";\r\nimport { safeSlug } from \"./util.js\";\r\n\r\nconst NESTED_RUNS = `${path.sep}runs${path.sep}runs${path.sep}`;\r\n\r\n/** True when a persisted harness path contains the historical `runs/runs` segment. */\r\nexport function hasNestedRunsSegment(filePath: string): boolean {\r\n return filePath.includes(NESTED_RUNS);\r\n}\r\n\r\n/**\r\n * Rewrite a nested `.../runs/runs/<runId>/...` path to canonical `.../runs/<runId>/...`.\r\n * Returns the input unchanged when no nested segment is present.\r\n */\r\nexport function repairNestedRunsPath(filePath: string, harnessRoot: string): string {\r\n if (!hasNestedRunsSegment(filePath)) return filePath;\r\n const root = normalizeHarnessRoot(harnessRoot);\r\n const runsDir = harnessRunsDir(root);\r\n const marker = `${path.sep}runs${path.sep}runs${path.sep}`;\r\n const idx = filePath.indexOf(marker);\r\n if (idx < 0) return filePath;\r\n const tail = filePath.slice(idx + marker.length);\r\n return path.join(runsDir, tail);\r\n}\r\n\r\nexport function canonicalRunDir(harnessRoot: string, runId: string): string {\r\n return path.join(harnessRunsDir(normalizeHarnessRoot(harnessRoot)), safeSlug(runId));\r\n}\r\n\r\nexport function canonicalWorkerDir(harnessRoot: string, runId: string, workerName: string): string {\r\n return path.join(canonicalRunDir(harnessRoot, runId), \"workers\", safeSlug(workerName));\r\n}\r\n\r\n/** Historical mistaken layout when harness root ended in `/runs`. */\r\nexport function legacyNestedWorkerDir(harnessRoot: string, runId: string, workerName: string): string {\r\n const root = normalizeHarnessRoot(harnessRoot);\r\n return path.join(root, \"runs\", \"runs\", safeSlug(runId), \"workers\", safeSlug(workerName));\r\n}\r\n\r\nexport function workerArtifactFileNames(): readonly string[] {\r\n return [\r\n \"stdout.jsonl\",\r\n \"stderr.log\",\r\n \"heartbeat.jsonl\",\r\n \"last-status.json\",\r\n \"auto-complete.log\",\r\n \"worker.json\",\r\n ] as const;\r\n}\r\n\r\nexport function workerArtifactPaths(workerDir: string): {\r\n workerJsonPath: string;\r\n stdoutPath: string;\r\n stderrPath: string;\r\n heartbeatPath: string;\r\n lastStatusPath: string;\r\n} {\r\n return {\r\n workerJsonPath: path.join(workerDir, \"worker.json\"),\r\n stdoutPath: path.join(workerDir, \"stdout.jsonl\"),\r\n stderrPath: path.join(workerDir, \"stderr.log\"),\r\n heartbeatPath: path.join(workerDir, \"heartbeat.jsonl\"),\r\n lastStatusPath: path.join(workerDir, \"last-status.json\"),\r\n };\r\n}\r\n\r\n/** Resolve the best on-disk worker.json path for a run worker entry. */\r\nexport function resolveWorkerJsonPath(input: {\r\n harnessRoot: string;\r\n runId: string;\r\n workerName: string;\r\n statusPath?: string;\r\n}): string {\r\n const canonical = workerArtifactPaths(canonicalWorkerDir(input.harnessRoot, input.runId, input.workerName))\r\n .workerJsonPath;\r\n if (input.statusPath && !hasNestedRunsSegment(input.statusPath)) {\r\n return input.statusPath;\r\n }\r\n return canonical;\r\n}\r\n", "import { existsSync, mkdirSync, readdirSync, renameSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { resolveDefaultRepo } from \"./default-repo.js\";\r\nimport { parseHeartbeat } from \"./heartbeat.js\";\r\nimport { harnessRunsDir, normalizeHarnessRoot, resolveHarnessRoot } from \"./paths.js\";\r\nimport { saveRun, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { canonicalWorkerDir, workerArtifactPaths } from \"./worker-metadata-paths.js\";\r\nimport { isPidAlive, readJson, safeSlug } from \"./util.js\";\r\n\r\n/** Recent heartbeat/stdout activity \u2014 treat run metadata as live. */\r\nexport const RUN_METADATA_ACTIVE_SIGNAL_MS = 15 * 60 * 1000;\r\nexport const TERMINAL_WORKER_ARCHIVE_AGE_MS = 60 * 60 * 1000;\r\n\r\nexport interface RunMetadataRetentionOutcome {\r\n runId: string;\r\n action: \"repaired_run_json\" | \"skipped\";\r\n reason: string;\r\n}\r\n\r\nexport interface RunMetadataRetentionResult {\r\n runs: RunMetadataRetentionOutcome[];\r\n}\r\n\r\nexport interface TerminalWorkerArchiveOutcome {\r\n runId: string;\r\n worker: string;\r\n action: \"archived\" | \"skipped\";\r\n reason: string;\r\n archivePath?: string;\r\n}\r\n\r\nexport interface TerminalWorkerArchiveResult {\r\n workers: TerminalWorkerArchiveOutcome[];\r\n}\r\n\r\n/** True when `targetPath` lives under `{harnessRoot}/runs/` (run + worker metadata). */\r\nexport function isHarnessRunMetadataPath(targetPath: string, harnessRoot: string): boolean {\r\n const resolved = path.resolve(targetPath);\r\n const runsDir = path.resolve(harnessRunsDir(harnessRoot));\r\n const rel = path.relative(runsDir, resolved);\r\n return rel !== \"..\" && !rel.startsWith(\"..\") && !path.isAbsolute(rel);\r\n}\r\n\r\nfunction listRunDirIds(runsDir: string): string[] {\r\n if (!existsSync(runsDir)) return [];\r\n try {\r\n return readdirSync(runsDir, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory() && entry.name !== \"runs\")\r\n .map((entry) => entry.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction listWorkerNamesOnDisk(runDir: string): string[] {\r\n const workersDir = path.join(runDir, \"workers\");\r\n if (!existsSync(workersDir)) return [];\r\n try {\r\n return readdirSync(workersDir, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory())\r\n .map((entry) => entry.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nfunction workerArchiveDir(runDir: string): string {\r\n return path.join(runDir, \"archived-workers\");\r\n}\r\n\r\nfunction uniqueArchivePath(runDir: string, workerName: string): string {\r\n const base = path.join(workerArchiveDir(runDir), safeSlug(workerName));\r\n if (!existsSync(base)) return base;\r\n return `${base}-${Date.now()}`;\r\n}\r\n\r\nfunction pathRecentlyTouched(target: string, now: number, windowMs: number): boolean {\r\n if (!existsSync(target)) return false;\r\n try {\r\n const age = now - statSync(target).mtimeMs;\r\n return Number.isFinite(age) && age >= 0 && age < windowMs;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Worker dir still has live process or recent harness artifacts \u2014 retain metadata. */\r\nexport function workerDirHasActiveRetentionSignals(\r\n workerDir: string,\r\n now = Date.now(),\r\n windowMs = RUN_METADATA_ACTIVE_SIGNAL_MS,\r\n): boolean {\r\n if (!existsSync(workerDir)) return false;\r\n const artifacts = workerArtifactPaths(workerDir);\r\n const worker = readJson<{ status?: string; pid?: number } | undefined>(\r\n artifacts.workerJsonPath,\r\n undefined,\r\n );\r\n if (worker?.status === \"running\" && isPidAlive(worker.pid)) return true;\r\n const heartbeat = parseHeartbeat(artifacts.heartbeatPath);\r\n if (heartbeat.lastHeartbeatAt) {\r\n const age = now - Date.parse(heartbeat.lastHeartbeatAt);\r\n if (Number.isFinite(age) && age >= 0 && age < windowMs) return true;\r\n }\r\n if (pathRecentlyTouched(artifacts.stdoutPath, now, windowMs)) return true;\r\n if (pathRecentlyTouched(artifacts.heartbeatPath, now, windowMs)) return true;\r\n return false;\r\n}\r\n\r\nfunction workerTerminalArchiveAgeMs(workerDir: string, worker: Record<string, unknown>, now: number): number {\r\n const completionReportedAt =\r\n typeof worker.completionReportedAt === \"string\" ? Date.parse(worker.completionReportedAt) : NaN;\r\n if (Number.isFinite(completionReportedAt)) return now - completionReportedAt;\r\n const completionSnapshotAt = (() => {\r\n const raw = worker.completionResponse;\r\n if (!raw || typeof raw !== \"object\") return NaN;\r\n const task = (raw as { task?: unknown }).task;\r\n if (!task || typeof task !== \"object\") return NaN;\r\n const updatedAt = (task as { updatedAt?: unknown }).updatedAt;\r\n return typeof updatedAt === \"string\" ? Date.parse(updatedAt) : NaN;\r\n })();\r\n if (Number.isFinite(completionSnapshotAt)) return now - completionSnapshotAt;\r\n try {\r\n return now - statSync(path.join(workerDir, \"worker.json\")).mtimeMs;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction isArchiveEligibleTerminalWorker(\r\n workerDir: string,\r\n worker: Record<string, unknown>,\r\n now: number,\r\n archiveAgeMs: number,\r\n): { eligible: boolean; reason: string } {\r\n if (workerDirHasActiveRetentionSignals(workerDir, now)) {\r\n return { eligible: false, reason: \"worker has active/recent retention signals\" };\r\n }\r\n const status = typeof worker.status === \"string\" ? worker.status : \"\";\r\n const completionBlocker =\r\n typeof worker.completionBlocker === \"string\" && worker.completionBlocker.trim().length > 0;\r\n if (completionBlocker) return { eligible: false, reason: \"worker has completion blocker\" };\r\n const completionAcknowledged =\r\n typeof worker.completionReportedAt === \"string\" || worker.completionOutcome === \"acknowledged\";\r\n if (status !== \"done\" && !completionAcknowledged) {\r\n return { eligible: false, reason: `worker status is ${status || \"unknown\"}` };\r\n }\r\n const age = workerTerminalArchiveAgeMs(workerDir, worker, now);\r\n if (!Number.isFinite(age) || age < archiveAgeMs) {\r\n return { eligible: false, reason: \"terminal worker is still within archive grace window\" };\r\n }\r\n return { eligible: true, reason: \"terminal worker metadata archived\" };\r\n}\r\n\r\n/** Any worker under a run dir still looks active \u2014 block metadata deletion/relocation. */\r\nexport function runDirHasActiveRetentionSignals(\r\n runDir: string,\r\n now = Date.now(),\r\n windowMs = RUN_METADATA_ACTIVE_SIGNAL_MS,\r\n): boolean {\r\n for (const name of listWorkerNamesOnDisk(runDir)) {\r\n if (workerDirHasActiveRetentionSignals(path.join(runDir, \"workers\", name), now, windowMs)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction inferRepoFields(): Pick<HarnessRunRecord, \"repo\" | \"base\" | \"baseCommit\"> {\r\n const resolved = resolveDefaultRepo();\r\n return {\r\n repo: resolved?.repo ?? \"\",\r\n base: \"origin/main\",\r\n baseCommit: \"unknown\",\r\n };\r\n}\r\n\r\nfunction synthesizeRunFromDisk(harnessRoot: string, runId: string): HarnessRunRecord | null {\r\n const runDir = path.join(harnessRunsDir(harnessRoot), safeSlug(runId));\r\n if (!existsSync(runDir)) return null;\r\n const workerNames = listWorkerNamesOnDisk(runDir);\r\n if (workerNames.length === 0) return null;\r\n\r\n let createdAt: string;\r\n try {\r\n createdAt = statSync(runDir).birthtime.toISOString();\r\n } catch {\r\n createdAt = new Date().toISOString();\r\n }\r\n\r\n const workers: HarnessRunRecord[\"workers\"] = {};\r\n for (const name of workerNames) {\r\n const canonicalDir = canonicalWorkerDir(harnessRoot, runId, name);\r\n workers[name] = {\r\n workerDir: canonicalDir,\r\n statusPath: path.join(canonicalDir, \"worker.json\"),\r\n };\r\n }\r\n\r\n const hasActive = runDirHasActiveRetentionSignals(runDir);\r\n return {\r\n id: runId,\r\n name: runId,\r\n ...inferRepoFields(),\r\n status: hasActive ? \"running\" : \"needs_attention\",\r\n createdAt,\r\n workers,\r\n };\r\n}\r\n\r\n/**\r\n * Rebuild missing `run.json` files from on-disk worker dirs so reconcile/status\r\n * cannot go blind while worker processes or fresh artifacts remain.\r\n */\r\nexport function repairMissingRunMetadata(harnessRootInput?: string): RunMetadataRetentionResult {\r\n const harnessRoot = normalizeHarnessRoot(harnessRootInput ?? resolveHarnessRoot());\r\n const runsDir = harnessRunsDir(harnessRoot);\r\n const outcomes: RunMetadataRetentionOutcome[] = [];\r\n\r\n for (const runId of listRunDirIds(runsDir)) {\r\n const runJsonPath = path.join(runsDir, runId, \"run.json\");\r\n if (existsSync(runJsonPath)) {\r\n outcomes.push({\r\n runId,\r\n action: \"skipped\",\r\n reason: \"run.json present\",\r\n });\r\n continue;\r\n }\r\n\r\n const synthesized = synthesizeRunFromDisk(harnessRoot, runId);\r\n if (!synthesized) {\r\n outcomes.push({\r\n runId,\r\n action: \"skipped\",\r\n reason: \"no worker dirs on disk\",\r\n });\r\n continue;\r\n }\r\n\r\n saveRun(synthesized);\r\n outcomes.push({\r\n runId,\r\n action: \"repaired_run_json\",\r\n reason: runDirHasActiveRetentionSignals(path.join(runsDir, runId))\r\n ? \"synthesized run.json while worker artifacts still active\"\r\n : \"synthesized run.json from orphan worker metadata dirs\",\r\n });\r\n }\r\n\r\n return { runs: outcomes };\r\n}\r\n\r\nexport function archiveTerminalWorkerMetadata(\r\n harnessRootInput?: string,\r\n options: { archiveAgeMs?: number; now?: number } = {},\r\n): TerminalWorkerArchiveResult {\r\n const harnessRoot = normalizeHarnessRoot(harnessRootInput ?? resolveHarnessRoot());\r\n const runsDir = harnessRunsDir(harnessRoot);\r\n const now = options.now ?? Date.now();\r\n const archiveAgeMs = options.archiveAgeMs ?? TERMINAL_WORKER_ARCHIVE_AGE_MS;\r\n const outcomes: TerminalWorkerArchiveOutcome[] = [];\r\n\r\n repairMissingRunMetadata(harnessRoot);\r\n for (const runId of listRunDirIds(runsDir)) {\r\n const runDir = path.join(runsDir, runId);\r\n const runJsonPath = path.join(runDir, \"run.json\");\r\n const run = readJson<HarnessRunRecord | undefined>(runJsonPath, undefined);\r\n if (!run?.id) continue;\r\n const names = new Set([...Object.keys(run.workers || {}), ...listWorkerNamesOnDisk(runDir)]);\r\n let changed = false;\r\n\r\n for (const name of names) {\r\n const workerDir = path.join(runDir, \"workers\", safeSlug(name));\r\n const workerJsonPath = path.join(workerDir, \"worker.json\");\r\n const worker = readJson<Record<string, unknown> | undefined>(workerJsonPath, undefined);\r\n if (!worker) {\r\n const archivedWorkerDir = path.join(workerArchiveDir(runDir), safeSlug(name));\r\n if (existsSync(archivedWorkerDir) && (run.workers[safeSlug(name)] || run.workers[name])) {\r\n delete run.workers[safeSlug(name)];\r\n delete run.workers[name];\r\n changed = true;\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"archived\",\r\n reason: \"removed stale live index entry for archived worker metadata\",\r\n archivePath: archivedWorkerDir,\r\n });\r\n continue;\r\n }\r\n outcomes.push({ runId: run.id, worker: name, action: \"skipped\", reason: \"worker.json missing\" });\r\n continue;\r\n }\r\n const eligibility = isArchiveEligibleTerminalWorker(workerDir, worker, now, archiveAgeMs);\r\n if (!eligibility.eligible) {\r\n outcomes.push({ runId: run.id, worker: name, action: \"skipped\", reason: eligibility.reason });\r\n continue;\r\n }\r\n\r\n const archivePath = uniqueArchivePath(runDir, name);\r\n mkdirSync(path.dirname(archivePath), { recursive: true });\r\n renameSync(workerDir, archivePath);\r\n delete run.workers[safeSlug(name)];\r\n delete run.workers[name];\r\n changed = true;\r\n outcomes.push({ runId: run.id, worker: name, action: \"archived\", reason: eligibility.reason, archivePath });\r\n }\r\n\r\n if (changed) saveRun(run);\r\n }\r\n\r\n return { workers: outcomes };\r\n}\r\n\r\n/** `${harnessRoot}\\0${runId}` keys for runs with filesystem active-retention signals. */\r\nexport function collectFilesystemLiveRunKeys(harnessRoot: string, now = Date.now()): Set<string> {\r\n const keys = new Set<string>();\r\n const runsDir = harnessRunsDir(harnessRoot);\r\n for (const runId of listRunDirIds(runsDir)) {\r\n const runDir = path.join(runsDir, runId);\r\n if (runDirHasActiveRetentionSignals(runDir, now)) {\r\n keys.add(`${harnessRoot}\\0${runId}`);\r\n }\r\n }\r\n return keys;\r\n}\r\n", "import path from \"node:path\";\r\nimport { loadUserConfig, saveUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport {\r\n discoverDefaultRepo,\r\n type DefaultRepoDiscoverySource,\r\n type DiscoveredDefaultRepo,\r\n} from \"./default-repo-discovery.js\";\r\nimport { displayUserPath, redactHomePath, resolveUserPath } from \"./path-values.js\";\r\n\r\nexport type DefaultRepoSource =\r\n | \"config\"\r\n | \"env_default_repo\"\r\n | \"env_harness_repo\"\r\n | DefaultRepoDiscoverySource;\r\n\r\nexport interface ResolvedDefaultRepo {\r\n repo: string;\r\n source: DefaultRepoSource;\r\n persistedInConfig: boolean;\r\n}\r\n\r\nexport interface ResolveDefaultRepoOptions {\r\n config?: KynverUserConfig;\r\n env?: NodeJS.ProcessEnv;\r\n cwd?: string;\r\n runtimeModuleUrl?: string;\r\n}\r\n\r\nfunction expandConfiguredRepo(value: string): string {\r\n return path.resolve(resolveUserPath(value.trim()));\r\n}\r\n\r\nfunction fromConfigured(\r\n value: string | undefined,\r\n source: Extract<DefaultRepoSource, \"config\" | \"env_default_repo\" | \"env_harness_repo\">,\r\n persistedInConfig: boolean,\r\n): ResolvedDefaultRepo | null {\r\n const trimmed = value?.trim();\r\n if (!trimmed) return null;\r\n return {\r\n repo: expandConfiguredRepo(trimmed),\r\n source,\r\n persistedInConfig,\r\n };\r\n}\r\n\r\nexport function resolveDefaultRepo(opts: ResolveDefaultRepoOptions = {}): ResolvedDefaultRepo | null {\r\n const env = opts.env ?? process.env;\r\n const config = opts.config ?? loadUserConfig();\r\n\r\n const fromConfig = fromConfigured(config.defaultRepo, \"config\", true);\r\n if (fromConfig) return fromConfig;\r\n\r\n const fromDefaultEnv = fromConfigured(env.KYNVER_DEFAULT_REPO, \"env_default_repo\", false);\r\n if (fromDefaultEnv) return fromDefaultEnv;\r\n\r\n const fromHarnessEnv = fromConfigured(env.KYNVER_HARNESS_REPO, \"env_harness_repo\", false);\r\n if (fromHarnessEnv) return fromHarnessEnv;\r\n\r\n const discovered = discoverDefaultRepo({\r\n cwd: opts.cwd,\r\n runtimeModuleUrl: opts.runtimeModuleUrl,\r\n });\r\n if (!discovered) return null;\r\n\r\n return {\r\n repo: discovered.repo,\r\n source: discovered.source,\r\n persistedInConfig: false,\r\n };\r\n}\r\n\r\nexport function persistDefaultRepo(repo: string, existing?: KynverUserConfig): KynverUserConfig {\r\n const config: KynverUserConfig = {\r\n ...(existing ?? loadUserConfig()),\r\n defaultRepo: redactHomePath(path.resolve(repo)),\r\n };\r\n saveUserConfig(config);\r\n return config;\r\n}\r\n\r\nexport function remediateDefaultRepo(opts?: ResolveDefaultRepoOptions): {\r\n ok: true;\r\n resolved: ResolvedDefaultRepo;\r\n config: KynverUserConfig;\r\n} | {\r\n ok: false;\r\n reason: string;\r\n} {\r\n const existing = opts?.config ?? loadUserConfig();\r\n const resolved = resolveDefaultRepo({ ...opts, config: existing });\r\n if (!resolved) {\r\n return {\r\n ok: false,\r\n reason:\r\n \"No Kynver git checkout found. Clone the repo, cd into it, then run `kynver setup --repo /path/to/Kynver` (or export KYNVER_DEFAULT_REPO).\",\r\n };\r\n }\r\n\r\n if (resolved.persistedInConfig) {\r\n return { ok: true, resolved, config: existing };\r\n }\r\n\r\n const config = persistDefaultRepo(resolved.repo, existing);\r\n return {\r\n ok: true,\r\n resolved: { ...resolved, persistedInConfig: true, source: \"config\" },\r\n config,\r\n };\r\n}\r\n\r\nexport function formatResolvedDefaultRepo(resolved: ResolvedDefaultRepo): {\r\n defaultRepo: string;\r\n source: DefaultRepoSource;\r\n persistedInConfig: boolean;\r\n} {\r\n return {\r\n defaultRepo: displayUserPath(resolved.repo),\r\n source: resolved.source,\r\n persistedInConfig: resolved.persistedInConfig,\r\n };\r\n}\r\n\r\nexport type { DiscoveredDefaultRepo };\r\n", "import { execFileSync } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport { parseHeartbeat, terminalFinalResultFromHeartbeat } from \"./heartbeat.js\";\r\nimport { extractEmbeddedWorkerFinalResultRecord } from \"./worker-final-result-embed.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord } from \"./status.js\";\r\nimport { listRunRecords, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { listRunWorkerNames } from \"./run-worker-index.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface LocalPrAttentionReconcileOutcome {\r\n runId: string;\r\n worker: string;\r\n action: \"marked_done\" | \"skipped\";\r\n reason: string;\r\n prUrl?: string;\r\n mergeCommit?: string | null;\r\n}\r\n\r\nexport interface LocalPrAttentionReconcileResult {\r\n workers: LocalPrAttentionReconcileOutcome[];\r\n}\r\n\r\ninterface MergedPrEvidence {\r\n prUrl: string;\r\n mergeCommit?: string | null;\r\n reason?: string | null;\r\n}\r\n\r\ninterface PrLookupResult {\r\n prUrl: string;\r\n state: string;\r\n mergedAt?: string | null;\r\n mergeCommit?: string | null;\r\n}\r\n\r\nexport interface LocalPrAttentionReconcileOptions {\r\n lookupPr?: (input: { repoDir: string; prNumber: number }) => PrLookupResult | null;\r\n}\r\n\r\nfunction normalizePrUrl(url: string): string | null {\r\n const m = url.trim().match(/github\\.com\\/([^/]+\\/[^/]+)\\/(?:pull|pulls)\\/(\\d+)/i);\r\n if (!m) return null;\r\n return `https://github.com/${m[1]}/pull/${m[2]}`;\r\n}\r\n\r\nfunction prNumberFromUrl(url: string): number | null {\r\n const m = normalizePrUrl(url)?.match(/\\/pull\\/(\\d+)$/);\r\n if (!m) return null;\r\n const n = Number.parseInt(m[1]!, 10);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nfunction extractText(value: unknown): string {\r\n if (value == null) return \"\";\r\n if (typeof value === \"string\") return value;\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\nfunction extractPrNumbersFromText(text: string): number[] {\r\n const out = new Set<number>();\r\n for (const match of text.matchAll(/github\\.com\\/[^/\\s)>\"']+\\/[^/\\s)>\"']+\\/(?:pull|pulls)\\/(\\d+)/gi)) {\r\n const n = Number.parseInt(match[1]!, 10);\r\n if (Number.isFinite(n)) out.add(n);\r\n }\r\n for (const match of text.matchAll(/\\bPR\\s*#?\\s*(\\d{2,})\\b/gi)) {\r\n const n = Number.parseInt(match[1]!, 10);\r\n if (Number.isFinite(n)) out.add(n);\r\n }\r\n for (const match of text.matchAll(/\\bpr[-_]?(\\d{2,})\\b/gi)) {\r\n const n = Number.parseInt(match[1]!, 10);\r\n if (Number.isFinite(n)) out.add(n);\r\n }\r\n return [...out];\r\n}\r\n\r\nfunction extractTargetPrReconciliation(value: unknown): MergedPrEvidence[] {\r\n let record: Record<string, unknown> | null = null;\r\n if (typeof value === \"string\") record = extractEmbeddedWorkerFinalResultRecord(value);\r\n else if (value && typeof value === \"object\" && !Array.isArray(value)) record = value as Record<string, unknown>;\r\n if (!record) return [];\r\n const raw = record.targetPrReconciliation ?? record.target_pr_reconciliation;\r\n if (!Array.isArray(raw)) return [];\r\n const out: MergedPrEvidence[] = [];\r\n for (const item of raw) {\r\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\r\n const row = item as Record<string, unknown>;\r\n const prUrl = normalizePrUrl(String(row.prUrl ?? row.pr_url ?? \"\"));\r\n const outcome = String(row.outcome ?? \"\").trim();\r\n if (!prUrl || outcome !== \"merged\") continue;\r\n out.push({\r\n prUrl,\r\n mergeCommit: typeof row.mergeCommit === \"string\" ? row.mergeCommit : typeof row.merge_commit === \"string\" ? row.merge_commit : null,\r\n reason: typeof row.reason === \"string\" ? row.reason : null,\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nfunction defaultLookupPr(input: { repoDir: string; prNumber: number }): PrLookupResult | null {\r\n try {\r\n const repo = execFileSync(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], {\r\n cwd: input.repoDir,\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n }).trim();\r\n const repoMatch = repo.match(/github\\.com[:/]([^/]+\\/[^/.]+)(?:\\.git)?$/i);\r\n const repoSlug = repoMatch?.[1];\r\n if (!repoSlug) return null;\r\n const raw = execFileSync(\r\n \"gh\",\r\n [\"pr\", \"view\", String(input.prNumber), \"--repo\", repoSlug, \"--json\", \"state,mergedAt,mergeCommit,url\"],\r\n { cwd: input.repoDir, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\r\n );\r\n const parsed = JSON.parse(raw) as {\r\n state?: string;\r\n mergedAt?: string | null;\r\n mergeCommit?: { oid?: string | null } | null;\r\n url?: string;\r\n };\r\n return {\r\n prUrl: normalizePrUrl(parsed.url ?? `https://github.com/${repoSlug}/pull/${input.prNumber}`) ?? `https://github.com/${repoSlug}/pull/${input.prNumber}`,\r\n state: parsed.state ?? \"\",\r\n mergedAt: parsed.mergedAt ?? null,\r\n mergeCommit: parsed.mergeCommit?.oid ?? null,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction finalResultForWorker(worker: HarnessWorkerRecord): unknown {\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n return worker.completionSnapshot?.finalResult ?? terminalFinalResultFromHeartbeat(heartbeat);\r\n}\r\n\r\nfunction collectMergedEvidenceByPr(run: { id: string; workers?: Record<string, unknown> }): Map<number, MergedPrEvidence> {\r\n const byPr = new Map<number, MergedPrEvidence>();\r\n const runDir = runDirectory(run.id);\r\n for (const name of listRunWorkerNames(run as never)) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDir, \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker) continue;\r\n for (const evidence of extractTargetPrReconciliation(finalResultForWorker(worker))) {\r\n const n = prNumberFromUrl(evidence.prUrl);\r\n if (n != null && !byPr.has(n)) byPr.set(n, evidence);\r\n }\r\n }\r\n return byPr;\r\n}\r\n\r\nfunction candidatePrNumbers(worker: HarnessWorkerRecord, statusFinalResult: unknown): number[] {\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n const text = [\r\n worker.name,\r\n worker.repairTargetPrUrl,\r\n worker.taskPrUrl,\r\n worker.branch,\r\n heartbeat.lastHeartbeatSummary,\r\n extractText(statusFinalResult),\r\n ]\r\n .filter(Boolean)\r\n .join(\"\\n\");\r\n return extractPrNumbersFromText(text);\r\n}\r\n\r\nfunction isLocalOnlyAttentionNoise(worker: HarnessWorkerRecord): boolean {\r\n return worker.localOnly === true && !worker.taskId && !worker.agentOsId;\r\n}\r\n\r\nexport function reconcileLocalOnlyMergedPrAttention(\r\n options: LocalPrAttentionReconcileOptions = {},\r\n): LocalPrAttentionReconcileResult {\r\n const lookupPr = options.lookupPr ?? defaultLookupPr;\r\n const outcomes: LocalPrAttentionReconcileOutcome[] = [];\r\n const liveLookupCache = new Map<string, PrLookupResult | null>();\r\n\r\n for (const run of listRunRecords()) {\r\n const mergedByPr = collectMergedEvidenceByPr(run);\r\n const runDir = runDirectory(run.id);\r\n for (const name of listRunWorkerNames(run)) {\r\n const workerPath = path.join(runDir, \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker || !isLocalOnlyAttentionNoise(worker)) continue;\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n if (status.attention.state !== \"needs_attention\") continue;\r\n\r\n let merged: MergedPrEvidence | null = null;\r\n for (const prNumber of candidatePrNumbers(worker, status.finalResult)) {\r\n merged = mergedByPr.get(prNumber) ?? null;\r\n if (!merged) {\r\n const repoDir = run.repo || worker.worktreePath;\r\n const cacheKey = `${repoDir}#${prNumber}`;\r\n const live = liveLookupCache.has(cacheKey)\r\n ? liveLookupCache.get(cacheKey) ?? null\r\n : lookupPr({ repoDir, prNumber });\r\n if (!liveLookupCache.has(cacheKey)) liveLookupCache.set(cacheKey, live);\r\n if (live && (live.state === \"MERGED\" || live.mergedAt)) {\r\n merged = { prUrl: live.prUrl, mergeCommit: live.mergeCommit ?? null, reason: \"GitHub reports PR merged\" };\r\n }\r\n }\r\n if (merged) break;\r\n }\r\n if (!merged) {\r\n outcomes.push({ runId: run.id, worker: name, action: \"skipped\", reason: \"no merged PR evidence\" });\r\n continue;\r\n }\r\n\r\n const now = new Date().toISOString();\r\n worker.status = \"done\";\r\n worker.completionSnapshot = {\r\n prUrl: merged.prUrl,\r\n summary: `Local-only worker superseded by merged PR ${merged.prUrl}`,\r\n finalResult: {\r\n summary: `Local-only repair/salvage worker superseded by merged PR ${merged.prUrl}`,\r\n targetPrReconciliation: [\r\n {\r\n prUrl: merged.prUrl,\r\n outcome: \"merged\",\r\n mergeCommit: merged.mergeCommit ?? null,\r\n reason: merged.reason ?? \"PR already merged; local-only worker no longer requires attention\",\r\n },\r\n ],\r\n },\r\n };\r\n worker.completionAckSource = \"local-pr-merged-reconcile\";\r\n worker.reconciledAt = now;\r\n worker.reconcileReason = \"local-only needs_attention superseded by merged PR\";\r\n saveWorker(run.id, worker);\r\n outcomes.push({\r\n runId: run.id,\r\n worker: name,\r\n action: \"marked_done\",\r\n reason: worker.reconcileReason,\r\n prUrl: merged.prUrl,\r\n mergeCommit: merged.mergeCommit ?? null,\r\n });\r\n }\r\n }\r\n\r\n return { workers: outcomes };\r\n}\r\n", "import { buildRunListRows, type RunListRow } from \"./run-list.js\";\r\nimport { required } from \"./util.js\";\r\n\r\n/** Reconcile stale workers/runs first, then pick a non-completed run by name. */\r\nexport function resolveHarnessRunByName(runName: string): RunListRow | null {\r\n const name = runName.trim();\r\n if (!name) return null;\r\n const rows = buildRunListRows();\r\n return rows.find((row) => row.name === name && row.status !== \"completed\") ?? null;\r\n}\r\n\r\nexport function resolveHarnessRunCli(args: Record<string, string | boolean>): void {\r\n const name = String(required(String(args.name || \"\"), \"--name\"));\r\n const hit = resolveHarnessRunByName(name);\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId: hit?.id ?? null,\r\n name,\r\n status: hit?.status ?? null,\r\n effectiveStatus: hit?.effectiveStatus ?? null,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { required, readJson, safeSlug } from \"./util.js\";\r\nimport { resolveHarnessLeaseOwnerForRenewal } from \"./harness-lease-owner.js\";\r\nimport { resolveRunnerPresencePayload } from \"./runner-identity.js\";\r\nimport { publishHarnessBoardSnapshot } from \"./worker-ops.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport async function sweepRun(args: Record<string, string | boolean>): Promise<Record<string, unknown> | void> {\r\n const pipeline = args.pipeline === true || args.pipeline === \"true\";\r\n try {\r\n const run = loadRun(String(required(String(args.run || \"\"), \"--run\")));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const runnerId = resolveRunnerPresencePayload({ runId: run.id }).runnerId;\r\n const snapshotPublished = await publishHarnessBoardSnapshot({ run: run.id, agentOsId, ...args }, \"run_sweep\");\r\n\r\n const releasedLocalOrphans: Array<Record<string, unknown>> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker || !worker.dispatched || !worker.taskId) continue;\r\n const status = computeWorkerStatus(worker);\r\n if (status.alive) continue;\r\n if (status.finalResult || worker.completionReportedAt) continue;\r\n\r\n const leaseOwner = resolveHarnessLeaseOwnerForRenewal({\r\n runId: run.id,\r\n workerLeaseOwner: worker.leaseOwner ?? null,\r\n runnerId,\r\n });\r\n\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(worker.taskId))}/release`;\r\n let release;\r\n try {\r\n release = await postJsonWithCredentialRefresh(releaseUrl, secret, { agentOsId, leaseOwner }, { agentOsId, baseUrl: base });\r\n } catch (relErr) {\r\n release = { ok: false, error: (relErr as Error).message };\r\n }\r\n releasedLocalOrphans.push({\r\n worker: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n response: release.response ?? release,\r\n });\r\n }\r\n\r\n const reapUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/reap`;\r\n let reap;\r\n try {\r\n reap = await postJsonWithCredentialRefresh(reapUrl, secret, {\r\n agentOsId,\r\n ...(Number(args.graceMs) >= 0 && args.graceMs !== undefined && args.graceMs !== true\r\n ? { graceMs: Math.floor(Number(args.graceMs)) }\r\n : {}),\r\n }, { agentOsId, baseUrl: base });\r\n } catch (reapErr) {\r\n reap = { ok: false, error: (reapErr as Error).message };\r\n }\r\n\r\n const summary = { runId: run.id, agentOsId, snapshotPublished, releasedLocalOrphans, reap: reap.response ?? reap };\r\n if (pipeline) return { ok: true, ...summary };\r\n console.log(JSON.stringify(summary, null, 2));\r\n } catch (error) {\r\n if (pipeline) return { ok: false, error: (error as Error).message };\r\n console.error(`run sweep failed: ${(error as Error).message}`);\r\n process.exit(1);\r\n }\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { harnessWorktreesDir, normalizeHarnessRoot, resolveHarnessRoot } from \"./paths.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\n\r\nexport interface HarnessStorageSnapshot {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n /** Sum of per-run directory sizes. `null` when scan exceeded entry cap. */\r\n worktreesBytes: number | null;\r\n /** Top-level run directory count under `worktreesDir`. */\r\n runCount: number;\r\n /** Total worktree (worker) directories across all runs. */\r\n workerCount: number;\r\n /** Earliest run-directory mtime, ISO string. `null` when no runs present. */\r\n oldestRunAt: string | null;\r\n scannedAt: string;\r\n}\r\n\r\ninterface ScanOptions {\r\n harnessRoot?: string;\r\n /** Cap per directorySizeBytes call. Default 50k entries \u2014 keeps the snapshot fast for monitor ticks. Set null/0 to return bytes=null without scanning. */\r\n perRunEntryCap?: number | null;\r\n now?: number;\r\n}\r\n\r\n/**\r\n * Read-only summary of harness worktree storage usage. Surfaced in cleanup\r\n * summaries and consumable by monitor/Command Center to flag disk pressure\r\n * before WSL runs out of space again.\r\n */\r\nexport function harnessStorageSnapshot(opts: ScanOptions = {}): HarnessStorageSnapshot {\r\n const harnessRoot = normalizeHarnessRoot(opts.harnessRoot ?? resolveHarnessRoot());\r\n const worktreesDir = harnessWorktreesDir(harnessRoot);\r\n const now = opts.now ?? Date.now();\r\n const scannedAt = new Date(now).toISOString();\r\n\r\n if (!existsSync(worktreesDir)) {\r\n return {\r\n harnessRoot,\r\n worktreesDir,\r\n worktreesBytes: 0,\r\n runCount: 0,\r\n workerCount: 0,\r\n oldestRunAt: null,\r\n scannedAt,\r\n };\r\n }\r\n\r\n let totalBytes: number | null = 0;\r\n let runCount = 0;\r\n let workerCount = 0;\r\n let oldestMs: number | null = null;\r\n\r\n let entries;\r\n try {\r\n entries = readdirSync(worktreesDir, { withFileTypes: true });\r\n } catch {\r\n return {\r\n harnessRoot,\r\n worktreesDir,\r\n worktreesBytes: null,\r\n runCount: 0,\r\n workerCount: 0,\r\n oldestRunAt: null,\r\n scannedAt,\r\n };\r\n }\r\n\r\n for (const runEntry of entries) {\r\n if (!runEntry.isDirectory()) continue;\r\n runCount += 1;\r\n const runPath = path.join(worktreesDir, runEntry.name);\r\n try {\r\n const st = statSync(runPath);\r\n oldestMs = oldestMs === null ? st.mtimeMs : Math.min(oldestMs, st.mtimeMs);\r\n } catch {\r\n // ignore unreadable run dir\r\n }\r\n try {\r\n for (const workerEntry of readdirSync(runPath, { withFileTypes: true })) {\r\n if (workerEntry.isDirectory()) workerCount += 1;\r\n }\r\n } catch {\r\n // ignore unreadable run dir\r\n }\r\n if (totalBytes !== null && opts.perRunEntryCap !== null) {\r\n const cap = opts.perRunEntryCap ?? 50_000;\r\n if (cap <= 0) {\r\n totalBytes = null;\r\n } else {\r\n const runBytes = directorySizeBytes(runPath, cap);\r\n if (runBytes === null) totalBytes = null;\r\n else totalBytes += runBytes;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n harnessRoot,\r\n worktreesDir,\r\n worktreesBytes: totalBytes,\r\n runCount,\r\n workerCount,\r\n oldestRunAt: oldestMs === null ? null : new Date(oldestMs).toISOString(),\r\n scannedAt,\r\n };\r\n}\r\n", "import { execFileSync } from \"node:child_process\";\r\nimport { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nconst DEFAULT_DU_TIMEOUT_MS = 2_500;\r\n\r\nfunction directorySizeBytesDu(root: string, timeoutMs = DEFAULT_DU_TIMEOUT_MS): number | null {\r\n if (!existsSync(root)) return 0;\r\n try {\r\n const out = execFileSync(\"du\", [\"-sb\", root], {\r\n encoding: \"utf8\",\r\n timeout: timeoutMs,\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n });\r\n const first = out.trim().split(/\\s+/)[0];\r\n const bytes = Number(first);\r\n return Number.isFinite(bytes) && bytes >= 0 ? bytes : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Best-effort directory size. Prefers `du -sb` (fast on large `node_modules`);\r\n * falls back to a capped walk. Returns null when entry cap is exceeded.\r\n */\r\nexport function directorySizeBytes(root: string, maxEntries = 50_000): number | null {\r\n if (!existsSync(root)) return 0;\r\n const duBytes = directorySizeBytesDu(root);\r\n if (duBytes !== null) return duBytes;\r\n let total = 0;\r\n let seen = 0;\r\n const stack: string[] = [root];\r\n while (stack.length > 0) {\r\n const current = stack.pop()!;\r\n let entries: string[];\r\n try {\r\n entries = readdirSync(current);\r\n } catch {\r\n continue;\r\n }\r\n for (const name of entries) {\r\n if (seen++ > maxEntries) return null;\r\n const full = path.join(current, name);\r\n let st;\r\n try {\r\n st = statSync(full);\r\n } catch {\r\n continue;\r\n }\r\n if (st.isDirectory()) stack.push(full);\r\n else total += st.size;\r\n }\r\n }\r\n return total;\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveUserPath } from \"./path-values.js\";\r\nimport { normalizeHarnessRoot, resolveHarnessRoot } from \"./paths.js\";\r\nimport {\r\n type CleanupAction,\r\n type CleanupCandidate,\r\n type CleanupSkipReason,\r\n type HarnessCleanupOptions,\r\n type HarnessCleanupSummary,\r\n} from \"./cleanup-types.js\";\r\nimport {\r\n skipBuildCacheRemoval,\r\n skipDependencyCacheRemoval,\r\n skipWorktreeRemoval,\r\n type WorktreeGuardSkip,\r\n} from \"./cleanup-guards.js\";\r\nimport { collectPreservedLivePaths } from \"./cleanup-evidence.js\";\r\nimport {\r\n scanStaleRunDirectoryCandidates,\r\n skipRunDirectoryRemoval,\r\n} from \"./cleanup-run-directory.js\";\r\nimport {\r\n isHarnessBuildCachePath,\r\n isHarnessNextCachePath,\r\n isHarnessNodeModulesPath,\r\n removeBuildCache,\r\n removeNextCache,\r\n removeNodeModules,\r\n removeRunDirectory,\r\n removeWorktree,\r\n} from \"./cleanup-execute.js\";\r\nimport { scanBuildCacheCandidates, scanWorktreeCandidates } from \"./cleanup-scan.js\";\r\nimport { scanDependencyCacheCandidates } from \"./cleanup-dependency-scan.js\";\r\nimport { scanDuplicateWorktreeCandidates } from \"./cleanup-duplicate-worktrees.js\";\r\nimport {\r\n buildWorktreeIndexAt,\r\n filterWorktreeIndexForRoot,\r\n type IndexedWorktree,\r\n} from \"./cleanup-worktree-index.js\";\r\nimport { finalizeStaleRuns } from \"./finalize.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\nimport { resolveHarnessRetention, resolvePipelineHarnessRetention } from \"./cleanup-retention-config.js\";\r\nimport { assessOrphanWorktreeSafety } from \"./cleanup-orphan-safety.js\";\r\nimport { harnessStorageSnapshot } from \"./harness-storage-snapshot.js\";\r\nimport { resolveHarnessScanRoots } from \"./cleanup-harness-roots.js\";\r\nimport { collectActiveWorktreeGuards } from \"./cleanup-active-worktrees.js\";\r\nimport { applyDiskPressureToRetention, observeCleanupDiskPressure } from \"./cleanup-disk-pressure.js\";\r\nimport { emitCleanupProgress } from \"./cleanup-progress.js\";\r\nimport { CleanupGitRevCache } from \"./cleanup-git-rev-cache.js\";\r\nimport { CleanupGitStatusCache } from \"./cleanup-git-status-cache.js\";\r\nimport { CleanupRunTerminalCache } from \"./cleanup-run-terminal-cache.js\";\r\nimport { buildCleanupCompactSummary } from \"./cleanup-summary.js\";\r\n\r\nfunction resolvePaths(options: HarnessCleanupOptions = {}) {\r\n const harnessRoot = options.harnessRoot\r\n ? normalizeHarnessRoot(options.harnessRoot)\r\n : resolveHarnessRoot();\r\n const scanRoots = resolveHarnessScanRoots({ harnessRoot });\r\n const now = options.now ?? Date.now();\r\n return { harnessRoot, scanRoots, now };\r\n}\r\n\r\nfunction normalizeGuardSkip(skip: WorktreeGuardSkip): { reason: CleanupSkipReason; detail?: string } {\r\n if (typeof skip === \"string\") return { reason: skip };\r\n return skip;\r\n}\r\n\r\nfunction recordSkip(\r\n skips: HarnessCleanupSummary[\"skips\"],\r\n pathValue: string,\r\n reason: CleanupSkipReason,\r\n detail?: string,\r\n): void {\r\n skips.push({ path: pathValue, reason, ...(detail ? { detail } : {}) });\r\n}\r\n\r\nfunction attachCandidateBytes(\r\n candidate: CleanupCandidate,\r\n accountBytes: boolean,\r\n byteEntryCap: number,\r\n): CleanupCandidate {\r\n if (!accountBytes || candidate.bytes != null) return candidate;\r\n return { ...candidate, bytes: directorySizeBytes(candidate.path, byteEntryCap) };\r\n}\r\n\r\nfunction tallySkipReasons(\r\n actions: CleanupAction[],\r\n skips: HarnessCleanupSummary[\"skips\"],\r\n): Partial<Record<CleanupSkipReason, number>> {\r\n const counts: Partial<Record<CleanupSkipReason, number>> = {};\r\n for (const skip of skips) {\r\n counts[skip.reason] = (counts[skip.reason] ?? 0) + 1;\r\n }\r\n for (const action of actions) {\r\n if (action.skipReason) {\r\n counts[action.skipReason] = (counts[action.skipReason] ?? 0) + 1;\r\n }\r\n }\r\n return counts;\r\n}\r\n\r\nfunction removeDependencyCacheAction(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n if (candidate.kind === \"remove_next_cache\") return removeNextCache(candidate, execute);\r\n return removeNodeModules(candidate, execute);\r\n}\r\n\r\nfunction pathGuardForDependencyCache(\r\n candidate: CleanupCandidate,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): CleanupSkipReason | null {\r\n if (candidate.kind === \"remove_next_cache\") {\r\n return isHarnessNextCachePath(candidate.path, harnessRoot, worktreesDir);\r\n }\r\n return isHarnessNodeModulesPath(candidate.path, harnessRoot, worktreesDir);\r\n}\r\n\r\nfunction mergeWorktreeIndexes(scanRoots: string[]): Map<string, IndexedWorktree> {\r\n const merged = new Map<string, IndexedWorktree>();\r\n for (const root of scanRoots) {\r\n for (const [key, value] of buildWorktreeIndexAt(root)) merged.set(key, value);\r\n }\r\n return merged;\r\n}\r\n\r\nfunction worktreePathForCandidate(\r\n candidate: CleanupCandidate,\r\n worktreesDir: string,\r\n): string {\r\n if (candidate.runId && candidate.worker) {\r\n return path.join(worktreesDir, candidate.runId, candidate.worker);\r\n }\r\n return path.resolve(candidate.path, \"..\");\r\n}\r\n\r\nexport function runHarnessCleanup(options: HarnessCleanupOptions = {}): HarnessCleanupSummary {\r\n let retention = resolveHarnessRetention(options);\r\n const diskPressure = observeCleanupDiskPressure();\r\n retention = applyDiskPressureToRetention(retention, diskPressure);\r\n\r\n const paths = resolvePaths(options);\r\n emitCleanupProgress(\"scan\", `${paths.scanRoots.length} harness root(s)`);\r\n const activeGuards = collectActiveWorktreeGuards(paths.scanRoots, paths.now);\r\n\r\n const finalizedRuns = retention.finalizeStaleRuns\r\n ? finalizeStaleRuns().map((f) => ({ runId: f.runId, from: f.from, to: f.to }))\r\n : [];\r\n if (finalizedRuns.length > 0) {\r\n emitCleanupProgress(\"finalize\", `${finalizedRuns.length} stale run(s) marked terminal`);\r\n }\r\n\r\n emitCleanupProgress(\"index\", \"building worktree index\");\r\n const index = mergeWorktreeIndexes(paths.scanRoots);\r\n emitCleanupProgress(\"index\", `${index.size} indexed worktree(s)`);\r\n const liveness = {\r\n runTerminalCache: new CleanupRunTerminalCache(),\r\n gitStatusCache: new CleanupGitStatusCache(),\r\n gitRevCache: new CleanupGitRevCache(),\r\n };\r\n\r\n const skips: HarnessCleanupSummary[\"skips\"] = [];\r\n const actions: CleanupAction[] = [];\r\n const processedPaths = new Set<string>();\r\n const maxActions = retention.maxActionsPerSweep;\r\n\r\n const atSweepCap = (): boolean => actions.length >= maxActions;\r\n\r\n for (const harnessRoot of paths.scanRoots) {\r\n if (atSweepCap()) break;\r\n emitCleanupProgress(\"root\", harnessRoot);\r\n const worktreesDir = path.join(harnessRoot, \"worktrees\");\r\n const rootIndex = filterWorktreeIndexForRoot(index, harnessRoot);\r\n const scanOpts = {\r\n harnessRoot,\r\n worktreesDir,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n includeOrphans: retention.includeOrphans,\r\n runIdFilter: retention.runIdFilter,\r\n index: rootIndex,\r\n now: paths.now,\r\n };\r\n\r\n const dependencyCandidates = retention.scanDependencyCaches\r\n ? scanDependencyCacheCandidates(scanOpts)\r\n : [];\r\n emitCleanupProgress(\r\n \"dependency\",\r\n retention.scanDependencyCaches\r\n ? `${dependencyCandidates.length} cache candidate(s) at ${harnessRoot}`\r\n : \"skipped (worktree-only sweep)\",\r\n );\r\n let dependencyProcessed = 0;\r\n for (const raw of dependencyCandidates) {\r\n if (atSweepCap()) break;\r\n dependencyProcessed += 1;\r\n if (dependencyProcessed % 50 === 0) {\r\n emitCleanupProgress(\"dependency\", `${dependencyProcessed}/${dependencyCandidates.length} evaluated`);\r\n }\r\n const resolved = path.resolve(raw.path);\r\n if (processedPaths.has(resolved)) continue;\r\n processedPaths.add(resolved);\r\n const candidate: CleanupCandidate = { ...raw, path: resolved };\r\n\r\n const pathSkip = pathGuardForDependencyCache(candidate, harnessRoot, worktreesDir);\r\n if (pathSkip) {\r\n recordSkip(skips, candidate.path, pathSkip);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: pathSkip });\r\n continue;\r\n }\r\n const worktreePath = worktreePathForCandidate(candidate, worktreesDir);\r\n const indexed = rootIndex.get(path.resolve(worktreePath)) ?? null;\r\n const guardReason = skipDependencyCacheRemoval({\r\n indexed,\r\n includeOrphans: true,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n ageMs: candidate.ageMs,\r\n worktreePath,\r\n activeWorktreePaths: activeGuards.activeWorktreePaths,\r\n diskPressure: retention.diskPressure,\r\n gitStatusCache: liveness.gitStatusCache,\r\n });\r\n if (guardReason) {\r\n recordSkip(skips, candidate.path, guardReason);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(\r\n removeDependencyCacheAction(\r\n attachCandidateBytes(candidate, retention.accountBytes, retention.byteAccountingEntryCap),\r\n retention.execute,\r\n ),\r\n );\r\n }\r\n\r\n if (retention.scanDependencyCaches) for (const raw of scanBuildCacheCandidates(scanOpts)) {\r\n if (atSweepCap()) break;\r\n const resolved = path.resolve(raw.path);\r\n if (processedPaths.has(resolved)) continue;\r\n processedPaths.add(resolved);\r\n const candidate: CleanupCandidate = { ...raw, path: resolved };\r\n\r\n const pathSkip = isHarnessBuildCachePath(candidate.path, harnessRoot, worktreesDir);\r\n if (pathSkip) {\r\n recordSkip(skips, candidate.path, pathSkip);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: pathSkip });\r\n continue;\r\n }\r\n const worktreePath = worktreePathForCandidate(candidate, worktreesDir);\r\n const indexed = rootIndex.get(path.resolve(worktreePath)) ?? null;\r\n const guardReason = skipBuildCacheRemoval({\r\n indexed,\r\n includeOrphans: true,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n ageMs: candidate.ageMs,\r\n worktreePath,\r\n activeWorktreePaths: activeGuards.activeWorktreePaths,\r\n diskPressure: retention.diskPressure,\r\n gitStatusCache: liveness.gitStatusCache,\r\n });\r\n if (guardReason) {\r\n recordSkip(skips, candidate.path, guardReason);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(\r\n removeBuildCache(\r\n attachCandidateBytes(candidate, retention.accountBytes, retention.byteAccountingEntryCap),\r\n retention.execute,\r\n ),\r\n );\r\n }\r\n\r\n const worktreeCandidates = [\r\n ...scanWorktreeCandidates(scanOpts),\r\n ...scanDuplicateWorktreeCandidates(scanOpts),\r\n ];\r\n emitCleanupProgress(\"worktrees\", `${worktreeCandidates.length} candidate(s) at ${harnessRoot}`);\r\n const worktreeSeen = new Set<string>();\r\n let worktreeProcessed = 0;\r\n for (const raw of worktreeCandidates) {\r\n if (atSweepCap()) break;\r\n worktreeProcessed += 1;\r\n if (worktreeProcessed % 50 === 0) {\r\n emitCleanupProgress(\"worktrees\", `${worktreeProcessed}/${worktreeCandidates.length} evaluated`);\r\n }\r\n const resolved = path.resolve(raw.path);\r\n if (worktreeSeen.has(resolved)) continue;\r\n worktreeSeen.add(resolved);\r\n const candidate: CleanupCandidate = { ...raw, path: resolved };\r\n const indexed = rootIndex.get(path.resolve(candidate.path)) ?? null;\r\n const orphanSafety = indexed\r\n ? null\r\n : assessOrphanWorktreeSafety({\r\n worktreePath: candidate.path,\r\n harnessRoot,\r\n runId: candidate.runId,\r\n workerName: candidate.worker,\r\n now: paths.now,\r\n });\r\n const guardSkip = skipWorktreeRemoval({\r\n indexed,\r\n worktreePath: path.resolve(candidate.path),\r\n includeOrphans: retention.includeOrphans,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n terminalWorktreesAgeMs: retention.terminalWorktreesAgeMs,\r\n ageMs: candidate.ageMs,\r\n orphanSafety,\r\n worktreeRemovalGuard: options.worktreeRemovalGuard,\r\n liveness,\r\n now: paths.now,\r\n harnessRoot,\r\n writeSalvageEvidence: retention.execute,\r\n });\r\n if (guardSkip) {\r\n const { reason: guardReason, detail: guardDetail } = normalizeGuardSkip(guardSkip);\r\n recordSkip(skips, candidate.path, guardReason, guardDetail);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: guardReason });\r\n continue;\r\n }\r\n actions.push(\r\n removeWorktree(\r\n attachCandidateBytes(candidate, retention.accountBytes, retention.byteAccountingEntryCap),\r\n retention.execute,\r\n ),\r\n );\r\n }\r\n\r\n if (!atSweepCap() && retention.runDirectoriesAgeMs >= 0) {\r\n for (const raw of scanStaleRunDirectoryCandidates({\r\n harnessRoot,\r\n worktreesDir,\r\n runDirectoriesAgeMs: retention.runDirectoriesAgeMs,\r\n runIdFilter: retention.runIdFilter,\r\n activeGuards,\r\n now: paths.now,\r\n })) {\r\n if (atSweepCap()) break;\r\n const resolved = path.resolve(raw.path);\r\n if (processedPaths.has(resolved)) continue;\r\n processedPaths.add(resolved);\r\n const candidate: CleanupCandidate = { ...raw, path: resolved };\r\n const runId = candidate.runId ?? path.basename(resolved);\r\n const dirSkip = skipRunDirectoryRemoval({\r\n harnessRoot,\r\n runId,\r\n runPath: resolved,\r\n ageMs: candidate.ageMs,\r\n runDirectoriesAgeMs: retention.runDirectoriesAgeMs,\r\n activeGuards,\r\n });\r\n if (dirSkip) {\r\n recordSkip(skips, candidate.path, dirSkip);\r\n actions.push({ ...candidate, executed: false, skipped: true, skipReason: dirSkip });\r\n continue;\r\n }\r\n actions.push(\r\n removeRunDirectory(\r\n attachCandidateBytes(candidate, retention.accountBytes, retention.byteAccountingEntryCap),\r\n retention.execute,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n\r\n let candidateBytes = 0;\r\n let removedRunDirectories = 0;\r\n let reclaimableBytes = 0;\r\n let removedBytes = 0;\r\n let removedPaths = 0;\r\n let skippedPaths = 0;\r\n for (const action of actions) {\r\n if (action.bytes) candidateBytes += action.bytes;\r\n if (!action.skipped && !action.executed && action.bytes) reclaimableBytes += action.bytes;\r\n if (action.executed) {\r\n removedPaths += 1;\r\n removedBytes += action.bytes ?? 0;\r\n if (action.kind === \"remove_run_directory\") removedRunDirectories += 1;\r\n } else if (action.skipped) {\r\n skippedPaths += 1;\r\n if (action.skipReason === \"dry_run\" && action.bytes) reclaimableBytes += action.bytes;\r\n }\r\n }\r\n\r\n const storage = retention.accountBytes\r\n ? harnessStorageSnapshot({\r\n harnessRoot: paths.harnessRoot,\r\n now: paths.now,\r\n perRunEntryCap: retention.storagePerRunEntryCap,\r\n })\r\n : undefined;\r\n emitCleanupProgress(\r\n \"complete\",\r\n `${actions.length} action(s), ${skippedPaths} skipped, ${removedPaths} removed`,\r\n );\r\n\r\n const preservedLivePaths = collectPreservedLivePaths(actions, skips);\r\n const compactSummary = buildCleanupCompactSummary({\r\n harnessRoot: paths.harnessRoot,\r\n scanRoots: paths.scanRoots,\r\n dryRun: !retention.execute,\r\n execute: retention.execute,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n includeOrphans: retention.includeOrphans,\r\n diskPressure: retention.diskPressure,\r\n diskGate: retention.diskGate\r\n ? {\r\n ok: retention.diskGate.ok,\r\n path: retention.diskGate.path,\r\n freeBytes: retention.diskGate.freeBytes,\r\n usedPercent: retention.diskGate.usedPercent,\r\n reason: retention.diskGate.reason,\r\n }\r\n : undefined,\r\n scannedAt: new Date(paths.now).toISOString(),\r\n finalizedRuns,\r\n actions,\r\n skips,\r\n totals: {\r\n candidateBytes,\r\n reclaimableBytes,\r\n removedBytes,\r\n removedPaths,\r\n skippedPaths,\r\n skipReasons: tallySkipReasons(actions, skips),\r\n },\r\n ...(storage ? { storage } : {}),\r\n ...(preservedLivePaths.length > 0 ? { preservedLivePaths } : {}),\r\n ...(removedRunDirectories > 0 ? { removedRunDirectories } : {}),\r\n });\r\n\r\n return {\r\n harnessRoot: paths.harnessRoot,\r\n scanRoots: paths.scanRoots,\r\n dryRun: !retention.execute,\r\n execute: retention.execute,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n includeOrphans: retention.includeOrphans,\r\n diskPressure: retention.diskPressure,\r\n diskGate: retention.diskGate\r\n ? {\r\n ok: retention.diskGate.ok,\r\n path: retention.diskGate.path,\r\n freeBytes: retention.diskGate.freeBytes,\r\n usedPercent: retention.diskGate.usedPercent,\r\n reason: retention.diskGate.reason,\r\n }\r\n : undefined,\r\n scannedAt: new Date(paths.now).toISOString(),\r\n finalizedRuns,\r\n actions,\r\n skips,\r\n totals: {\r\n candidateBytes,\r\n reclaimableBytes,\r\n removedBytes,\r\n removedPaths,\r\n skippedPaths,\r\n skipReasons: tallySkipReasons(actions, skips),\r\n },\r\n ...(storage ? { storage } : {}),\r\n ...(preservedLivePaths.length > 0 ? { preservedLivePaths } : {}),\r\n ...(removedRunDirectories > 0 ? { removedRunDirectories } : {}),\r\n compactSummary,\r\n };\r\n}\r\n\r\n/** Pipeline-safe defaults: finalize stale runs, dry-run unless execute env is set. */\r\nexport function runPipelineHarnessCleanup(runId?: string): HarnessCleanupSummary {\r\n const retention = resolvePipelineHarnessRetention(runId);\r\n return runHarnessCleanup({\r\n execute: retention.execute,\r\n finalizeStaleRuns: retention.finalizeStaleRuns,\r\n accountBytes: retention.accountBytes,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n includeOrphans: retention.includeOrphans,\r\n runIdFilter: retention.runIdFilter,\r\n });\r\n}\r\n\r\nexport function isPipelineCleanupEnabled(): boolean {\r\n return process.env.KYNVER_PIPELINE_CLEANUP !== \"0\";\r\n}\r\n", "import path from \"node:path\";\r\nimport type { CleanupGitStatusCache } from \"./cleanup-git-status-cache.js\";\r\nimport type { CleanupSkipReason, WorktreeRemovalGuardHook } from \"./cleanup-types.js\";\r\nimport { assessWorkerLanding } from \"./landing-gate.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport {\r\n indexedWorktreeHasMaterialChanges,\r\n resolveWorktreeGuardStatus,\r\n} from \"./cleanup-index-status.js\";\r\nimport type { CleanupRunLivenessContext } from \"./cleanup-run-liveness.js\";\r\nimport type { RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport { TERMINAL_RUN_STATUSES } from \"./finalize.js\";\r\nimport { isRunStaleActive, isWorkerProcessLive, runBlocksWorktreeRemoval } from \"./cleanup-run-liveness.js\";\r\nimport { completionBlockerBlocksWorktreeRemoval } from \"./cleanup-completion-blocker.js\";\r\nimport {\r\n hasSalvageEvidence,\r\n writeWorktreeSalvageEvidence,\r\n} from \"./cleanup-salvage-evidence.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\nimport {\r\n isLandedGitAncestry,\r\n isPrOrUnmergedWork,\r\n prUrlFromFinalResult,\r\n} from \"./cleanup-worktree-salvage.js\";\r\n\r\nexport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\nexport { isLandedGitAncestry, isPrOrUnmergedWork } from \"./cleanup-worktree-salvage.js\";\r\n\r\nexport interface WorktreeGuardInput {\r\n indexed: IndexedWorktree | null;\r\n /** Resolved worktree directory (required for overlay guards on orphans). */\r\n worktreePath: string;\r\n includeOrphans: boolean;\r\n worktreesAgeMs: number;\r\n /** Shorter age gate for harness runs already marked terminal. */\r\n terminalWorktreesAgeMs: number;\r\n ageMs: number;\r\n /**\r\n * Filesystem-derived skip reason for orphan candidates (computed by\r\n * `assessOrphanWorktreeSafety`). Used only when `indexed` is null.\r\n */\r\n orphanSafety?: CleanupSkipReason | null;\r\n worktreeRemovalGuard?: WorktreeRemovalGuardHook;\r\n liveness?: CleanupRunLivenessContext;\r\n now?: number;\r\n harnessRoot?: string;\r\n /** When true (execute mode), persist salvage evidence before allowing removal. */\r\n writeSalvageEvidence?: boolean;\r\n}\r\n\r\nconst SALVAGE_ELIGIBLE_SKIP_REASONS = new Set<CleanupSkipReason>([\r\n \"completion_blocked\",\r\n \"dirty_worktree\",\r\n \"pr_or_unmerged_commits\",\r\n \"landing_blocked\",\r\n]);\r\n\r\nfunction maybeSalvageBlockedWorktree(input: {\r\n indexed: IndexedWorktree;\r\n harnessRoot: string;\r\n skipReason: CleanupSkipReason;\r\n status: RawHarnessWorkerStatus;\r\n now: number;\r\n writeSalvageEvidence: boolean;\r\n}): boolean {\r\n if (!SALVAGE_ELIGIBLE_SKIP_REASONS.has(input.skipReason)) return false;\r\n if (isWorkerProcessLive(input.indexed, input.now)) return false;\r\n if (\r\n hasSalvageEvidence({\r\n harnessRoot: input.harnessRoot,\r\n runId: input.indexed.runId,\r\n workerName: input.indexed.workerName,\r\n })\r\n ) {\r\n return true;\r\n }\r\n if (!input.writeSalvageEvidence) return false;\r\n writeWorktreeSalvageEvidence({\r\n harnessRoot: input.harnessRoot,\r\n indexed: input.indexed,\r\n skipReason: input.skipReason,\r\n status: input.status,\r\n now: input.now,\r\n });\r\n return true;\r\n}\r\n\r\nexport type WorktreeGuardSkip = CleanupSkipReason | { reason: CleanupSkipReason; detail?: string };\r\n\r\nfunction effectiveWorktreeAgeMs(input: WorktreeGuardInput): number {\r\n const { indexed, includeOrphans, worktreesAgeMs, terminalWorktreesAgeMs } = input;\r\n if (!indexed) return includeOrphans ? terminalWorktreesAgeMs : worktreesAgeMs;\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) {\r\n return terminalWorktreesAgeMs;\r\n }\r\n if (input.liveness && isRunStaleActive(indexed, input.liveness)) {\r\n return terminalWorktreesAgeMs;\r\n }\r\n if (\r\n input.liveness &&\r\n isFinishedWorkerStatus(resolveWorktreeGuardStatus(indexed, input.liveness)) &&\r\n !isWorkerProcessLive(indexed)\r\n ) {\r\n return terminalWorktreesAgeMs;\r\n }\r\n return worktreesAgeMs;\r\n}\r\n\r\nfunction resolveHarnessRoot(input: WorktreeGuardInput, indexed: IndexedWorktree): string | null {\r\n if (input.harnessRoot?.trim()) return path.resolve(input.harnessRoot);\r\n const workerDir = indexed.worker.workerDir;\r\n if (!workerDir) return null;\r\n const runsMarker = `${path.sep}runs${path.sep}`;\r\n const idx = workerDir.indexOf(runsMarker);\r\n if (idx < 0) return null;\r\n return workerDir.slice(0, idx + runsMarker.length - 1);\r\n}\r\n\r\nexport function skipWorktreeRemoval(input: WorktreeGuardInput): WorktreeGuardSkip | null {\r\n const { indexed, includeOrphans, worktreesAgeMs, ageMs, orphanSafety, worktreeRemovalGuard } =\r\n input;\r\n const now = input.now ?? Date.now();\r\n if (!indexed) {\r\n if (!includeOrphans) return \"orphan_without_flag\";\r\n return orphanSafety ?? null;\r\n }\r\n // `--include-orphans` is the operator opt-in for aggressive cleanup; trust\r\n // the indexed salvage gates below (active_worker, pr_or_unmerged_commits,\r\n // dirty_worktree, landing_blocked) instead of the age-only short-circuit.\r\n const ageThresholdMs = effectiveWorktreeAgeMs(input);\r\n if (worktreesAgeMs <= 0 && !includeOrphans && ageThresholdMs <= 0) return \"worktrees_disabled\";\r\n if (ageThresholdMs > 0 && ageMs < ageThresholdMs) return \"below_age_threshold\";\r\n if (isWorkerProcessLive(indexed, now)) return \"active_worker\";\r\n\r\n const status = resolveWorktreeGuardStatus(indexed, input.liveness);\r\n const salvageHarnessRoot = resolveHarnessRoot(input, indexed);\r\n\r\n const salvageOrBlock = (skipReason: CleanupSkipReason): WorktreeGuardSkip | null => {\r\n if (\r\n salvageHarnessRoot &&\r\n maybeSalvageBlockedWorktree({\r\n indexed,\r\n harnessRoot: salvageHarnessRoot,\r\n skipReason,\r\n status,\r\n now,\r\n writeSalvageEvidence: input.writeSalvageEvidence === true,\r\n })\r\n ) {\r\n return null;\r\n }\r\n return skipReason;\r\n };\r\n\r\n if (completionBlockerBlocksWorktreeRemoval(indexed, status)) {\r\n const blocked = salvageOrBlock(\"completion_blocked\");\r\n if (blocked) return blocked;\r\n }\r\n if (indexedWorktreeHasMaterialChanges(indexed, input.liveness?.gitStatusCache)) {\r\n const blocked = salvageOrBlock(\"dirty_worktree\");\r\n if (blocked) return blocked;\r\n }\r\n const ahead = input.liveness?.gitRevCache?.countAheadOfMain(input.worktreePath);\r\n if (ahead !== null && ahead !== undefined && ahead > 0) {\r\n const blocked = salvageOrBlock(\"pr_or_unmerged_commits\");\r\n if (blocked) return blocked;\r\n }\r\n if (runBlocksWorktreeRemoval(indexed, input.liveness, now)) return \"run_still_active\";\r\n if (!isFinishedWorkerStatus(status)) return \"run_still_active\";\r\n if (isPrOrUnmergedWork(status)) {\r\n const blocked = salvageOrBlock(\"pr_or_unmerged_commits\");\r\n if (blocked) return blocked;\r\n }\r\n if (materialWorktreeChanges(status.changedFiles).length > 0) {\r\n const blocked = salvageOrBlock(\"dirty_worktree\");\r\n if (blocked) return blocked;\r\n }\r\n const landing = assessWorkerLanding({\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(status.finalResult),\r\n });\r\n if (landing.blocked) {\r\n const blocked = salvageOrBlock(\"landing_blocked\");\r\n if (blocked) return blocked;\r\n }\r\n if (worktreeRemovalGuard && input.worktreePath) {\r\n const overlay = worktreeRemovalGuard({\r\n worktreePath: input.worktreePath,\r\n indexed: Boolean(indexed),\r\n runId: indexed?.runId,\r\n worker: indexed?.workerName,\r\n });\r\n if (overlay) {\r\n return overlay.detail ? { reason: overlay.reason, detail: overlay.detail } : overlay.reason;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport interface NodeModulesGuardInput {\r\n indexed: IndexedWorktree | null;\r\n includeOrphans: boolean;\r\n nodeModulesAgeMs: number;\r\n ageMs: number;\r\n}\r\n\r\nexport interface DependencyCacheGuardInput extends NodeModulesGuardInput {\r\n worktreePath: string;\r\n activeWorktreePaths: Set<string>;\r\n diskPressure?: boolean;\r\n gitStatusCache?: CleanupGitStatusCache;\r\n}\r\n\r\n/**\r\n * Dependency caches (`node_modules`, `.next`) are safe to drop when the worker\r\n * process is dead and source files remain \u2014 even if the board still shows\r\n * completion/landing/PR blockers. Whole-worktree removal stays strict.\r\n */\r\nexport function skipDependencyCacheRemoval(input: DependencyCacheGuardInput): CleanupSkipReason | null {\r\n const { indexed, nodeModulesAgeMs, ageMs, worktreePath, activeWorktreePaths, diskPressure } =\r\n input;\r\n if (!diskPressure && ageMs < nodeModulesAgeMs) return \"below_age_threshold\";\r\n if (activeWorktreePaths.has(path.resolve(worktreePath))) return \"active_worker\";\r\n if (indexed && isWorkerProcessLive(indexed)) return \"active_worker\";\r\n if (indexed && indexedWorktreeHasMaterialChanges(indexed, input.gitStatusCache)) {\r\n return \"dirty_worktree\";\r\n }\r\n return null;\r\n}\r\n\r\n/** Build caches (`.turbo`, `dist`, etc.) use the same relaxed guards as dependency caches. */\r\nexport function skipBuildCacheRemoval(input: DependencyCacheGuardInput): CleanupSkipReason | null {\r\n return skipDependencyCacheRemoval(input);\r\n}\r\n\r\nexport function skipNodeModulesRemoval(input: NodeModulesGuardInput): CleanupSkipReason | null {\r\n return skipDependencyCacheRemoval({\r\n ...input,\r\n worktreePath: input.indexed?.worktreePath ?? \"\",\r\n activeWorktreePaths: new Set(),\r\n diskPressure: false,\r\n });\r\n}\r\n", "import { computeGitAncestry, gitStatusShort } from \"./git.js\";\r\nimport { computeWorkerStatus, type RawHarnessWorkerStatus } from \"./status.js\";\r\nimport type { CleanupGitStatusCache } from \"./cleanup-git-status-cache.js\";\r\nimport type { CleanupRunLivenessContext } from \"./cleanup-run-liveness.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport { prUrlFromFinalResult } from \"./cleanup-worktree-salvage.js\";\r\nimport { isPidAlive } from \"./util.js\";\r\n\r\n/** Lazily compute worker status \u2014 avoids git/stream work for every indexed worker up front. */\r\nexport function indexedWorktreeStatus(entry: IndexedWorktree): RawHarnessWorkerStatus {\r\n if (!entry.status) {\r\n entry.status = computeWorkerStatus(entry.worker, {\r\n base: entry.run.base,\r\n baseCommit: entry.run.baseCommit,\r\n });\r\n }\r\n return entry.status;\r\n}\r\n\r\n/**\r\n * Porcelain-only dirty probe for dependency-cache guards. Skips ancestry/stream\r\n * work that whole-worktree removal needs but `node_modules` GC does not.\r\n */\r\nexport function indexedWorktreeHasMaterialChanges(\r\n entry: IndexedWorktree,\r\n gitStatusCache?: CleanupGitStatusCache,\r\n): boolean {\r\n if (entry.status) {\r\n return materialWorktreeChanges(entry.status.changedFiles).length > 0;\r\n }\r\n const porcelain = gitStatusCache\r\n ? gitStatusCache.porcelain(entry.worktreePath)\r\n : gitStatusShort(entry.worktreePath);\r\n return materialWorktreeChanges(porcelain).length > 0;\r\n}\r\n\r\nfunction finalResultFromWorkerJson(entry: IndexedWorktree): unknown {\r\n const snapshot = entry.worker.completionSnapshot?.finalResult;\r\n if (snapshot !== undefined && snapshot !== null) return snapshot;\r\n if (entry.worker.taskPrUrl) {\r\n return { prUrl: entry.worker.taskPrUrl };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Guard-oriented status: avoids stdout/heartbeat stream parsing for terminal workers\r\n * while preserving salvage semantics (dirty / PR / landing checks).\r\n */\r\nexport function resolveWorktreeGuardStatus(\r\n entry: IndexedWorktree,\r\n ctx?: CleanupRunLivenessContext,\r\n): RawHarnessWorkerStatus {\r\n if (entry.status) return entry.status;\r\n\r\n const worker = entry.worker;\r\n const completionAcknowledged =\r\n typeof worker.completionReportedAt === \"string\" && worker.completionReportedAt.trim().length > 0;\r\n const workerJsonTerminal =\r\n Boolean(worker.status && [\"done\", \"exited\", \"blocked\", \"failed\", \"abandoned\"].includes(worker.status)) ||\r\n completionAcknowledged;\r\n const finalResult = finalResultFromWorkerJson(entry);\r\n\r\n if (workerJsonTerminal && !isPidAlive(worker.pid)) {\r\n const changedFiles = ctx?.gitStatusCache\r\n ? ctx.gitStatusCache.porcelain(entry.worktreePath)\r\n : gitStatusShort(entry.worktreePath);\r\n const baseLabel = entry.run.baseCommit?.trim() || entry.run.base?.trim() || \"origin/main\";\r\n const ahead = ctx?.gitRevCache?.countAheadOfMain(entry.worktreePath, baseLabel);\r\n const gitAncestry =\r\n ahead === 0\r\n ? {\r\n checked: true,\r\n base: baseLabel,\r\n relation: \"synced\" as const,\r\n }\r\n : computeGitAncestry(entry.worktreePath, {\r\n base: entry.run.base,\r\n baseCommit: entry.run.baseCommit,\r\n });\r\n const status = {\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n pid: worker.pid,\r\n alive: false,\r\n status: worker.status ?? (completionAcknowledged ? \"done\" : \"exited\"),\r\n attention: { state: completionAcknowledged ? \"done\" : \"stale\" },\r\n branch: worker.branch,\r\n worktreePath: entry.worktreePath,\r\n ownedPaths: worker.ownedPaths,\r\n stdoutBytes: 0,\r\n stderrBytes: 0,\r\n heartbeatBytes: 0,\r\n firstEventAt: null,\r\n lastEventAt: null,\r\n lastActivityAt: worker.completionReportedAt ?? null,\r\n currentTool: null,\r\n heartbeatCount: 0,\r\n lastHeartbeatAt: null,\r\n lastHeartbeatPhase: null,\r\n lastHeartbeatSummary: null,\r\n heartbeatBlocker: null,\r\n changedFiles,\r\n gitAncestry,\r\n finalResult,\r\n completionBlocker:\r\n typeof worker.completionBlocker === \"string\" ? worker.completionBlocker.trim() || null : null,\r\n prUrl: worker.repairTargetPrUrl ?? worker.taskPrUrl ?? prUrlFromFinalResult(finalResult),\r\n } as unknown as RawHarnessWorkerStatus;\r\n entry.status = status;\r\n return status;\r\n }\r\n\r\n return indexedWorktreeStatus(entry);\r\n}\r\n", "/** Generated install/build trees safe to delete under a harness worktree. */\r\nexport const HARNESS_BUILD_CACHE_RELATIVE_PATHS = [\r\n \".next\",\r\n \".turbo\",\r\n \"dist\",\r\n \"build\",\r\n \".cache\",\r\n \"node_modules/.cache\",\r\n] as const;\r\n\r\nexport type HarnessBuildCacheRelativePath = (typeof HARNESS_BUILD_CACHE_RELATIVE_PATHS)[number];\r\n\r\n/** True when a porcelain path is only generated build/install noise. */\r\nexport function isGeneratedHarnessPath(pathPart: string): boolean {\r\n const normalized = pathPart.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\r\n if (normalized === \"node_modules\" || normalized.startsWith(\"node_modules/\")) return true;\r\n for (const rel of HARNESS_BUILD_CACHE_RELATIVE_PATHS) {\r\n if (normalized === rel || normalized.startsWith(`${rel}/`)) return true;\r\n }\r\n return false;\r\n}\r\n", "import { isGeneratedHarnessPath } from \"./cleanup-build-cache-paths.js\";\r\n\r\n/** Strip generated install/build trees from porcelain \u2014 they are what cleanup removes. */\r\nexport function materialWorktreeChanges(changedFiles: string[]): string[] {\r\n return changedFiles.filter((line) => {\r\n const trimmed = line.trim();\r\n const pathPart = trimmed.startsWith(\"??\")\r\n ? trimmed.slice(2).trim()\r\n : trimmed.length > 3\r\n ? trimmed.slice(3).trim()\r\n : trimmed;\r\n return !isGeneratedHarnessPath(pathPart);\r\n });\r\n}\r\n", "import type { GitAncestry } from \"./git.js\";\r\nimport type { RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\n\r\nexport function prUrlFromFinalResult(finalResult: unknown): string | null {\r\n if (typeof finalResult === \"string\") {\r\n const match = finalResult.match(/https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/i);\r\n return match?.[0] ?? null;\r\n }\r\n if (finalResult && typeof finalResult === \"object\") {\r\n const obj = finalResult as Record<string, unknown>;\r\n for (const key of [\"prUrl\", \"pr_url\", \"pullRequestUrl\"]) {\r\n const value = obj[key];\r\n if (typeof value === \"string\" && value.trim()) return value.trim();\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** True when git ancestry shows the worker branch is fully landed on the run base. */\r\nexport function isLandedGitAncestry(ancestry: GitAncestry | null | undefined): boolean {\r\n const relation = ancestry?.relation;\r\n return relation === \"merged\" || relation === \"synced\";\r\n}\r\n\r\n/** Blocks whole-worktree removal when commits are not landed or tree is dirty. */\r\nexport function isPrOrUnmergedWork(status: RawHarnessWorkerStatus): boolean {\r\n const relation = status.gitAncestry?.relation;\r\n if (relation === \"merged\" || relation === \"synced\") {\r\n return materialWorktreeChanges(status.changedFiles).length > 0;\r\n }\r\n if (prUrlFromFinalResult(status.finalResult)) return true;\r\n if (relation === \"ahead\" || relation === \"diverged\") return true;\r\n if (status.changedFiles.length > 0 && status.finalResult) return true;\r\n return false;\r\n}\r\n", "import { deriveTerminalRunStatus, TERMINAL_RUN_STATUSES } from \"./finalize.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport { indexedWorktreeStatus } from \"./cleanup-index-status.js\";\r\nimport type { CleanupGitRevCache } from \"./cleanup-git-rev-cache.js\";\r\nimport type { CleanupGitStatusCache } from \"./cleanup-git-status-cache.js\";\r\nimport type { CleanupRunTerminalCache } from \"./cleanup-run-terminal-cache.js\";\r\nimport { isHarnessWorkerHarnessLive } from \"./cleanup-worker-harness-live.js\";\r\n\r\nexport interface CleanupRunLivenessContext {\r\n runTerminalCache: CleanupRunTerminalCache;\r\n gitStatusCache: CleanupGitStatusCache;\r\n gitRevCache: CleanupGitRevCache;\r\n}\r\n\r\nfunction deriveRunTerminal(\r\n indexed: IndexedWorktree,\r\n ctx?: CleanupRunLivenessContext,\r\n): string | null {\r\n if (ctx) return ctx.runTerminalCache.derive(indexed.run);\r\n return deriveTerminalRunStatus(indexed.run);\r\n}\r\n\r\n/** True when the worker process or heartbeat still shows live harness activity. */\r\nexport function isWorkerProcessLive(indexed: IndexedWorktree, now = Date.now()): boolean {\r\n return isHarnessWorkerHarnessLive(indexed.worker, now);\r\n}\r\n\r\n/**\r\n * Run record still marked active but every worker is finished \u2014 safe to treat as\r\n * terminal for GC after `finalizeStaleRuns()` (or when deriveTerminalRunStatus is set).\r\n */\r\nexport function isRunStaleActive(\r\n indexed: IndexedWorktree,\r\n ctx?: CleanupRunLivenessContext,\r\n): boolean {\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) return false;\r\n return deriveRunTerminal(indexed, ctx) !== null;\r\n}\r\n\r\n/**\r\n * Whether the harness run still has unfinished work that should block whole-worktree removal.\r\n * Does not block per-worker `node_modules` when only this worker is finished.\r\n */\r\nexport function runBlocksWorktreeRemoval(\r\n indexed: IndexedWorktree,\r\n ctx?: CleanupRunLivenessContext,\r\n now = Date.now(),\r\n): boolean {\r\n if (isWorkerProcessLive(indexed, now)) return true;\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) return false;\r\n if (isRunStaleActive(indexed, ctx)) return false;\r\n const status = indexedWorktreeStatus(indexed);\r\n if (!isFinishedWorkerStatus(status)) {\r\n // Dead worker with stale worker.json status \u2014 allow per-worktree salvage gates.\r\n if (!isWorkerProcessLive(indexed, now)) return false;\r\n return true;\r\n }\r\n // Finished worker on a non-terminal run (landing/completion debt) \u2014 do not pin disk.\r\n return false;\r\n}\r\n", "import { parseHeartbeat } from \"./heartbeat.js\";\r\nimport { RUN_METADATA_ACTIVE_SIGNAL_MS } from \"./run-metadata-retention.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive } from \"./util.js\";\r\n\r\n/** True when parsed heartbeat JSON has a recent `ts` (not file mtime alone). */\r\nexport function heartbeatContentIsFresh(\r\n worker: HarnessWorkerRecord,\r\n now = Date.now(),\r\n windowMs = RUN_METADATA_ACTIVE_SIGNAL_MS,\r\n): boolean {\r\n const heartbeat = parseHeartbeat(worker.heartbeatPath);\r\n if (!heartbeat.lastHeartbeatAt) return false;\r\n const age = now - Date.parse(heartbeat.lastHeartbeatAt);\r\n return Number.isFinite(age) && age >= 0 && age < windowMs;\r\n}\r\n\r\n/**\r\n * Whether a harness worker still has live execution signals: OS process and/or\r\n * fresh heartbeat content. Ignores stale `worker.json` status and file mtimes\r\n * that daemons or scanners may touch without a running worker.\r\n */\r\nexport function isHarnessWorkerHarnessLive(\r\n worker: HarnessWorkerRecord,\r\n now = Date.now(),\r\n windowMs = RUN_METADATA_ACTIVE_SIGNAL_MS,\r\n): boolean {\r\n if (isPidAlive(worker.pid)) return true;\r\n return heartbeatContentIsFresh(worker, now, windowMs);\r\n}\r\n", "import { assessWorkerLanding } from \"./landing-gate.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport { indexedWorktreeStatus } from \"./cleanup-index-status.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\nimport { isWorkerProcessLive } from \"./cleanup-run-liveness.js\";\r\nimport type { RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport { isPrOrUnmergedWork, prUrlFromFinalResult } from \"./cleanup-worktree-salvage.js\";\r\n\r\n/**\r\n * Whether a persisted `completionBlocker` should still block whole-worktree removal.\r\n *\r\n * Dead workers with landed/clean work may keep replay metadata on disk after the\r\n * board advanced externally \u2014 those blockers are stale for GC and must not pin\r\n * worktrees indefinitely.\r\n */\r\nexport function completionBlockerBlocksWorktreeRemoval(\r\n indexed: IndexedWorktree,\r\n status?: RawHarnessWorkerStatus,\r\n): boolean {\r\n const blocker =\r\n typeof indexed.worker.completionBlocker === \"string\" ? indexed.worker.completionBlocker.trim() : \"\";\r\n if (!blocker) return false;\r\n if (isWorkerProcessLive(indexed)) return true;\r\n\r\n const resolved = status ?? indexedWorktreeStatus(indexed);\r\n if (!isFinishedWorkerStatus(resolved)) return true;\r\n if (isPrOrUnmergedWork(resolved)) return true;\r\n if (materialWorktreeChanges(resolved.changedFiles).length > 0) return true;\r\n\r\n const landing = assessWorkerLanding({\r\n finalResult: resolved.finalResult,\r\n changedFiles: resolved.changedFiles,\r\n gitAncestry: resolved.gitAncestry,\r\n prUrl: prUrlFromFinalResult(resolved.finalResult),\r\n });\r\n if (landing.blocked) return true;\r\n\r\n return false;\r\n}\r\n", "import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\nimport { gitCapture } from \"./git.js\";\r\nimport type { RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { safeSlug } from \"./util.js\";\r\n\r\nexport interface WorktreeSalvageEvidenceRecord {\r\n capturedAt: string;\r\n skipReason: CleanupSkipReason;\r\n runId: string;\r\n workerName: string;\r\n worktreePath: string;\r\n taskId?: string;\r\n agentOsId?: string;\r\n branch?: string;\r\n completionBlocker?: string;\r\n finalResult?: unknown;\r\n changedFiles: string[];\r\n gitAncestry: RawHarnessWorkerStatus[\"gitAncestry\"];\r\n prUrl?: string | null;\r\n patchPath?: string | null;\r\n}\r\n\r\nexport function salvageEvidenceDir(\r\n harnessRoot: string,\r\n runId: string,\r\n workerName: string,\r\n): string {\r\n return path.join(harnessRoot, \"salvage\", safeSlug(runId), safeSlug(workerName));\r\n}\r\n\r\nexport function hasSalvageEvidence(input: {\r\n harnessRoot: string;\r\n runId: string;\r\n workerName: string;\r\n}): boolean {\r\n return existsSync(path.join(salvageEvidenceDir(input.harnessRoot, input.runId, input.workerName), \"evidence.json\"));\r\n}\r\n\r\n/** Persist worktree/git evidence before whole-worktree removal for operator salvage review. */\r\nexport function writeWorktreeSalvageEvidence(input: {\r\n harnessRoot: string;\r\n indexed: IndexedWorktree;\r\n skipReason: CleanupSkipReason;\r\n status: RawHarnessWorkerStatus;\r\n now?: number;\r\n}): WorktreeSalvageEvidenceRecord {\r\n const dir = salvageEvidenceDir(input.harnessRoot, input.indexed.runId, input.indexed.workerName);\r\n mkdirSync(dir, { recursive: true });\r\n const patchPath = path.join(dir, \"salvage.patch\");\r\n let wrotePatch = false;\r\n if (existsSync(input.indexed.worktreePath)) {\r\n const diff = gitCapture(input.indexed.worktreePath, [\"diff\", \"HEAD\"]);\r\n const staged = gitCapture(input.indexed.worktreePath, [\"diff\", \"--cached\"]);\r\n const patch = [diff.stdout, staged.stdout].filter((chunk) => chunk.trim()).join(\"\\n\");\r\n if (patch.trim()) {\r\n writeFileSync(patchPath, patch.endsWith(\"\\n\") ? patch : `${patch}\\n`);\r\n wrotePatch = true;\r\n }\r\n }\r\n const record: WorktreeSalvageEvidenceRecord = {\r\n capturedAt: new Date(input.now ?? Date.now()).toISOString(),\r\n skipReason: input.skipReason,\r\n runId: input.indexed.runId,\r\n workerName: input.indexed.workerName,\r\n worktreePath: input.indexed.worktreePath,\r\n taskId: input.indexed.worker.taskId,\r\n agentOsId: input.indexed.worker.agentOsId,\r\n branch: input.indexed.worker.branch,\r\n completionBlocker: input.indexed.worker.completionBlocker,\r\n finalResult: input.status.finalResult,\r\n changedFiles: input.status.changedFiles,\r\n gitAncestry: input.status.gitAncestry,\r\n prUrl: input.status.prUrl ?? null,\r\n ...(wrotePatch ? { patchPath } : {}),\r\n };\r\n writeFileSync(path.join(dir, \"evidence.json\"), `${JSON.stringify(record, null, 2)}\\n`);\r\n return record;\r\n}\r\n", "export type CleanupActionKind =\r\n | \"remove_node_modules\"\r\n | \"remove_next_cache\"\r\n | \"remove_build_cache\"\r\n | \"remove_worktree\"\r\n | \"remove_run_directory\";\r\n\r\nexport type CleanupSkipReason =\r\n | \"dry_run\"\r\n | \"below_age_threshold\"\r\n | \"active_worker\"\r\n | \"dirty_worktree\"\r\n | \"landing_blocked\"\r\n | \"pr_or_unmerged_commits\"\r\n | \"completion_blocked\"\r\n | \"run_still_active\"\r\n | \"path_outside_harness\"\r\n | \"worktrees_disabled\"\r\n | \"orphan_without_flag\"\r\n | \"missing_worktree\"\r\n | \"remove_failed\"\r\n /** Generated cache owned by another user (often root); daemon cannot unlink without privileged reclaim. */\r\n | \"foreign_owner\"\r\n /** Harness `runs/` metadata must never be removed by worktree GC. */\r\n | \"run_metadata_protected\"\r\n /** AgentOS / operator lifecycle overlay blocked removal (see `detail`). */\r\n | \"board_lifecycle_blocked\";\r\n\r\nexport interface CleanupCandidate {\r\n kind: CleanupActionKind;\r\n path: string;\r\n bytes: number | null;\r\n harnessRoot?: string;\r\n runId?: string;\r\n worker?: string;\r\n repo?: string;\r\n ageMs: number;\r\n}\r\n\r\nexport interface CleanupAction extends CleanupCandidate {\r\n executed: boolean;\r\n skipped: boolean;\r\n skipReason?: CleanupSkipReason;\r\n error?: string;\r\n}\r\n\r\nexport interface RunFinalizeSummary {\r\n runId: string;\r\n from: string;\r\n to: string;\r\n}\r\n\r\nexport interface HarnessStorageSnapshotShape {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n worktreesBytes: number | null;\r\n runCount: number;\r\n workerCount: number;\r\n oldestRunAt: string | null;\r\n scannedAt: string;\r\n}\r\n\r\nexport interface HarnessCleanupSummary {\r\n harnessRoot: string;\r\n /** Every harness tree scanned (primary + well-known extras). */\r\n scanRoots: string[];\r\n dryRun: boolean;\r\n execute: boolean;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n diskPressure?: boolean;\r\n diskGate?: {\r\n ok: boolean;\r\n path: string;\r\n freeBytes: number;\r\n usedPercent: number;\r\n reason: string | null;\r\n };\r\n scannedAt: string;\r\n finalizedRuns: RunFinalizeSummary[];\r\n actions: CleanupAction[];\r\n skips: Array<{ path: string; reason: CleanupSkipReason; detail?: string }>;\r\n totals: {\r\n candidateBytes: number;\r\n reclaimableBytes: number;\r\n removedBytes: number;\r\n removedPaths: number;\r\n skippedPaths: number;\r\n skipReasons: Partial<Record<CleanupSkipReason, number>>;\r\n };\r\n /** Disk-pressure evidence \u2014 present when bytes accounting is enabled. */\r\n storage?: HarnessStorageSnapshotShape;\r\n /** Sample of paths kept because workers/runs are still live (for operator summaries). */\r\n preservedLivePaths?: Array<{ path: string; reason: CleanupSkipReason; detail?: string }>;\r\n /** Empty harness worktree run directories removed after worker worktrees were reclaimed. */\r\n removedRunDirectories?: number;\r\n /** Bounded operator rollup (always attached; use `kynver cleanup --compact` to emit alone). */\r\n compactSummary?: import(\"./cleanup-summary.js\").CleanupCompactSummary;\r\n}\r\n\r\nexport interface WorktreeRemovalGuardInput {\r\n worktreePath: string;\r\n /** True when `buildWorktreeIndex()` has a worker.json entry for this path. */\r\n indexed: boolean;\r\n runId?: string;\r\n worker?: string;\r\n}\r\n\r\n/** Optional overlay (e.g. AgentOS board + lease checks) evaluated after runtime salvage gates. */\r\nexport type WorktreeRemovalGuardHook = (\r\n input: WorktreeRemovalGuardInput,\r\n) => { reason: CleanupSkipReason; detail?: string } | null;\r\n\r\nexport interface HarnessCleanupOptions {\r\n harnessRoot?: string;\r\n /** When false (default), only report candidates. */\r\n execute?: boolean;\r\n /** When true (default), call `finalizeStaleRuns()` before scanning. */\r\n finalizeStaleRuns?: boolean;\r\n /** When true, estimate candidate bytes for guard-passing removals only. CLI defaults false. */\r\n accountBytes?: boolean;\r\n /** Per-run entry cap for storage snapshot byte totals (`0` = counts only). */\r\n storagePerRunEntryCap?: number | null;\r\n /** Per-candidate filesystem walk cap when `du` is unavailable. */\r\n byteAccountingEntryCap?: number;\r\n /** When false, skip node_modules/.next/build-cache scans (worktree-only operator sweeps). */\r\n scanDependencyCaches?: boolean;\r\n /** Minimum age before removing generated `node_modules` (default 6h). */\r\n nodeModulesAgeMs?: number;\r\n /** When 0 or unset, worktree removal is disabled. */\r\n worktreesAgeMs?: number;\r\n /**\r\n * Age threshold for worktrees whose harness run is already terminal\r\n * (`completed` / `failed` / `cancelled` / `done`). Salvage gates still apply.\r\n */\r\n terminalWorktreesAgeMs?: number;\r\n /** Minimum age before removing an empty `worktrees/<runId>/` directory. */\r\n runDirectoriesAgeMs?: number;\r\n /** Cap actions evaluated per sweep (cron/watchdog boundedness). */\r\n maxActionsPerSweep?: number;\r\n /** Allow cleaning `node_modules` under worktrees with no worker index entry. */\r\n includeOrphans?: boolean;\r\n /** When set, only consider workers for this harness run (pipeline tick scope). */\r\n runIdFilter?: string;\r\n now?: number;\r\n /** When set, invoked for each worktree candidate after built-in salvage guards. */\r\n worktreeRemovalGuard?: WorktreeRemovalGuardHook;\r\n}\r\n\r\n/** Conservative default aligned with 2026-05-27 manual harness cleanup (6h). */\r\nexport const DEFAULT_NODE_MODULES_AGE_MS = 6 * 60 * 60 * 1000;\r\n\r\n/** Seven days \u2014 only used when worktree cleanup is explicitly enabled. */\r\nexport const DEFAULT_WORKTREES_AGE_MS = 7 * 24 * 60 * 60 * 1000;\r\n\r\n/** Terminal runs: salvage-first worktree removal after workers finish (6h default). */\r\nexport const DEFAULT_TERMINAL_WORKTREES_AGE_MS = DEFAULT_NODE_MODULES_AGE_MS;\r\n\r\n/** Empty per-run worktree folders under `worktrees/<runId>/`. */\r\nexport const DEFAULT_RUN_DIRECTORIES_AGE_MS = 60 * 60 * 1000;\r\n\r\n/** Bounded cron/watchdog scan \u2014 skip remaining candidates when exceeded. */\r\nexport const DEFAULT_MAX_ACTIONS_PER_SWEEP = 120;\r\n\r\nexport const MAX_PRESERVED_LIVE_PATH_SAMPLES = 24;\r\n", "import type { CleanupAction, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { MAX_PRESERVED_LIVE_PATH_SAMPLES } from \"./cleanup-types.js\";\r\n\r\nconst LIVE_SKIP_REASONS = new Set<CleanupSkipReason>([\r\n \"active_worker\",\r\n \"run_still_active\",\r\n \"completion_blocked\",\r\n \"landing_blocked\",\r\n]);\r\n\r\nexport function collectPreservedLivePaths(\r\n actions: CleanupAction[],\r\n skips: Array<{ path: string; reason: CleanupSkipReason; detail?: string }>,\r\n): Array<{ path: string; reason: CleanupSkipReason; detail?: string }> {\r\n const out: Array<{ path: string; reason: CleanupSkipReason; detail?: string }> = [];\r\n const seen = new Set<string>();\r\n\r\n const push = (path: string, reason: CleanupSkipReason, detail?: string) => {\r\n const key = `${path}\\0${reason}`;\r\n if (seen.has(key) || out.length >= MAX_PRESERVED_LIVE_PATH_SAMPLES) return;\r\n seen.add(key);\r\n out.push({ path, reason, ...(detail ? { detail } : {}) });\r\n };\r\n\r\n for (const skip of skips) {\r\n if (!LIVE_SKIP_REASONS.has(skip.reason)) continue;\r\n push(skip.path, skip.reason, skip.detail);\r\n }\r\n for (const action of actions) {\r\n if (!action.skipped || !action.skipReason) continue;\r\n if (!LIVE_SKIP_REASONS.has(action.skipReason)) continue;\r\n push(action.path, action.skipReason);\r\n }\r\n\r\n return out;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport type { ActiveWorktreeGuardSnapshot } from \"./cleanup-active-worktrees.js\";\r\nimport { isWorktreeOnLiveRun } from \"./cleanup-active-worktrees.js\";\r\nimport { deriveTerminalRunStatus, TERMINAL_RUN_STATUSES } from \"./finalize.js\";\r\nimport { readJson } from \"./util.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\n\r\nexport interface ScanRunDirectoryOptions {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n runDirectoriesAgeMs: number;\r\n runIdFilter?: string;\r\n activeGuards: ActiveWorktreeGuardSnapshot;\r\n now: number;\r\n}\r\n\r\nfunction pathAgeMs(target: string, now: number): number {\r\n try {\r\n const mtime = statSync(target).mtimeMs;\r\n return Math.max(0, now - mtime);\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction loadRunStatus(harnessRoot: string, runId: string): HarnessRunRecord | null {\r\n const runPath = path.join(harnessRoot, \"runs\", runId, \"run.json\");\r\n if (!existsSync(runPath)) return null;\r\n return readJson<HarnessRunRecord | null>(runPath, null);\r\n}\r\n\r\nfunction runDirectoryIsEmpty(runPath: string): boolean {\r\n try {\r\n const entries = readdirSync(runPath);\r\n return entries.length === 0;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function skipRunDirectoryRemoval(input: {\r\n harnessRoot: string;\r\n runId: string;\r\n runPath: string;\r\n ageMs: number;\r\n runDirectoriesAgeMs: number;\r\n activeGuards: ActiveWorktreeGuardSnapshot;\r\n}): CleanupSkipReason | null {\r\n const { harnessRoot, runId, runPath, ageMs, runDirectoriesAgeMs, activeGuards } = input;\r\n if (isWorktreeOnLiveRun(runPath, harnessRoot, runId, activeGuards.liveRunKeys)) {\r\n return \"run_still_active\";\r\n }\r\n if (!runDirectoryIsEmpty(runPath)) return \"run_still_active\";\r\n const run = loadRunStatus(harnessRoot, runId);\r\n if (run && !TERMINAL_RUN_STATUSES.has(run.status)) {\r\n if (!deriveTerminalRunStatus(run)) return \"run_still_active\";\r\n }\r\n if (runDirectoriesAgeMs > 0 && ageMs < runDirectoriesAgeMs) return \"below_age_threshold\";\r\n return null;\r\n}\r\n\r\n/** Empty per-run folders under `worktrees/<runId>/` after worker worktrees are gone. */\r\nexport function scanStaleRunDirectoryCandidates(\r\n opts: ScanRunDirectoryOptions,\r\n): CleanupCandidate[] {\r\n if (!existsSync(opts.worktreesDir)) return [];\r\n const candidates: CleanupCandidate[] = [];\r\n let entries;\r\n try {\r\n entries = readdirSync(opts.worktreesDir, { withFileTypes: true });\r\n } catch {\r\n return [];\r\n }\r\n\r\n for (const runEntry of entries) {\r\n if (!runEntry.isDirectory()) continue;\r\n const runId = runEntry.name;\r\n if (opts.runIdFilter && runId !== opts.runIdFilter) continue;\r\n const runPath = path.join(opts.worktreesDir, runId);\r\n if (!runDirectoryIsEmpty(runPath)) continue;\r\n candidates.push({\r\n kind: \"remove_run_directory\",\r\n path: runPath,\r\n bytes: null,\r\n harnessRoot: opts.harnessRoot,\r\n runId,\r\n ageMs: pathAgeMs(runPath, opts.now),\r\n });\r\n }\r\n\r\n return candidates;\r\n}\r\n", "import { existsSync, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { listRunRecordsForHarnessRoot, runDirectoryAt } from \"./run-store.js\";\r\nimport { harnessRunsDir, harnessWorktreesDir } from \"./paths.js\";\r\nimport { collectFilesystemLiveRunKeys } from \"./run-metadata-retention.js\";\r\nimport { isHarnessWorkerHarnessLive } from \"./cleanup-worker-harness-live.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface ActiveWorktreeGuardSnapshot {\r\n /** Resolved worktree paths that must keep dependency caches. */\r\n activeWorktreePaths: Set<string>;\r\n /** `${harnessRoot}\\0${runId}` keys for runs with at least one live worker. */\r\n liveRunKeys: Set<string>;\r\n}\r\n\r\n/** Fast liveness probe \u2014 avoids full `computeWorkerStatus` during broad cleanup scans. */\r\nfunction isActiveHarnessWorker(worker: HarnessWorkerRecord, now: number): boolean {\r\n return isHarnessWorkerHarnessLive(worker, now);\r\n}\r\n\r\n/** Collect worktrees/runs that still have live worker processes (current-run guard). */\r\nexport function collectActiveWorktreeGuards(\r\n harnessRoots: string[],\r\n now = Date.now(),\r\n): ActiveWorktreeGuardSnapshot {\r\n const activeWorktreePaths = new Set<string>();\r\n const liveRunKeys = new Set<string>();\r\n\r\n for (const harnessRoot of harnessRoots) {\r\n for (const run of listRunRecordsForHarnessRoot(harnessRoot)) {\r\n let runHasLive = false;\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectoryAt(harnessRoot, run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.worktreePath) continue;\r\n const worktreePath = path.resolve(worker.worktreePath);\r\n if (!isActiveHarnessWorker(worker, now)) continue;\r\n runHasLive = true;\r\n activeWorktreePaths.add(worktreePath);\r\n }\r\n if (runHasLive) liveRunKeys.add(`${harnessRoot}\\0${run.id}`);\r\n }\r\n for (const key of collectFilesystemLiveRunKeys(harnessRoot)) {\r\n liveRunKeys.add(key);\r\n }\r\n }\r\n\r\n return { activeWorktreePaths, liveRunKeys };\r\n}\r\n\r\n/** True when a worktree path still exists under a live run (belt-and-suspenders). */\r\nexport function isWorktreeOnLiveRun(\r\n worktreePath: string,\r\n harnessRoot: string,\r\n runId: string | undefined,\r\n liveRunKeys: Set<string>,\r\n): boolean {\r\n if (!runId) return false;\r\n return liveRunKeys.has(`${harnessRoot}\\0${runId}`);\r\n}\r\n\r\nexport function worktreesDirForRoot(harnessRoot: string): string {\r\n return harnessWorktreesDir(harnessRoot);\r\n}\r\n\r\nexport function runsDirForRoot(harnessRoot: string): string {\r\n return harnessRunsDir(harnessRoot);\r\n}\r\n\r\nexport function harnessRootExists(harnessRoot: string): boolean {\r\n return existsSync(harnessRoot);\r\n}\r\n\r\nexport function listWorktreeRunIds(worktreesDir: string): string[] {\r\n if (!existsSync(worktreesDir)) return [];\r\n try {\r\n return readdirSync(worktreesDir, { withFileTypes: true })\r\n .filter((entry) => entry.isDirectory())\r\n .map((entry) => entry.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport { git } from \"./git.js\";\r\nimport type { CleanupAction, CleanupCandidate } from \"./cleanup-types.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\nimport {\r\n isHarnessBuildCachePath,\r\n isHarnessNextCachePath,\r\n isHarnessNodeModulesPath,\r\n} from \"./cleanup-harness-path-validate.js\";\r\nimport { removeHarnessGeneratedPath } from \"./cleanup-remove-path.js\";\r\nimport { isHarnessRunMetadataPath } from \"./run-metadata-retention.js\";\r\n\r\nexport { isHarnessBuildCachePath, isHarnessNextCachePath, isHarnessNodeModulesPath } from \"./cleanup-harness-path-validate.js\";\r\n\r\nfunction skipRunMetadataRemoval(candidate: CleanupCandidate): CleanupAction | null {\r\n const harnessRoot = candidate.harnessRoot;\r\n if (!harnessRoot || !isHarnessRunMetadataPath(candidate.path, harnessRoot)) return null;\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"run_metadata_protected\",\r\n };\r\n}\r\n\r\nfunction removeDependencyCache(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n const metadataSkip = skipRunMetadataRemoval(candidate);\r\n if (metadataSkip) return metadataSkip;\r\n const outcome = removeHarnessGeneratedPath(candidate, execute);\r\n return {\r\n ...candidate,\r\n bytes: outcome.bytes ?? candidate.bytes,\r\n executed: outcome.executed,\r\n skipped: outcome.skipped,\r\n skipReason: outcome.skipReason,\r\n error: outcome.error,\r\n };\r\n}\r\n\r\nexport function removeNodeModules(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n return removeDependencyCache(candidate, execute);\r\n}\r\n\r\nexport function removeNextCache(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n return removeDependencyCache(candidate, execute);\r\n}\r\n\r\nexport function removeBuildCache(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n return removeDependencyCache(candidate, execute);\r\n}\r\n\r\nexport function removeRunDirectory(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n const metadataSkip = skipRunMetadataRemoval(candidate);\r\n if (metadataSkip) return metadataSkip;\r\n if (!existsSync(candidate.path)) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"missing_worktree\",\r\n };\r\n }\r\n if (!execute) {\r\n return { ...candidate, executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n try {\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n rmSync(candidate.path, { recursive: true, force: true });\r\n return {\r\n ...candidate,\r\n bytes: bytesBefore,\r\n executed: true,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function removeWorktree(candidate: CleanupCandidate, execute: boolean): CleanupAction {\r\n const metadataSkip = skipRunMetadataRemoval(candidate);\r\n if (metadataSkip) return metadataSkip;\r\n if (!existsSync(candidate.path)) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"missing_worktree\",\r\n };\r\n }\r\n if (!execute) {\r\n return { ...candidate, executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n const repo = candidate.repo;\r\n try {\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n if (repo) {\r\n git(repo, [\"worktree\", \"remove\", \"--force\", candidate.path], { allowFailure: true });\r\n }\r\n if (existsSync(candidate.path)) {\r\n rmSync(candidate.path, { recursive: true, force: true });\r\n }\r\n return {\r\n ...candidate,\r\n bytes: bytesBefore,\r\n executed: true,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return {\r\n ...candidate,\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport type { CleanupCandidate, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\nimport { harnessWorktreesDir } from \"./paths.js\";\r\nimport { pathHasForeignOwnedEntry } from \"./cleanup-path-ownership.js\";\r\nimport {\r\n HARNESS_ROOT_OWNED_CACHE_RUNBOOK,\r\n resolvePrivilegedCleanupMode,\r\n tryPrivilegedReclaimHarnessCache,\r\n} from \"./cleanup-privileged-remove.js\";\r\n\r\nexport interface RemoveHarnessPathOutcome {\r\n executed: boolean;\r\n skipped: boolean;\r\n skipReason?: CleanupSkipReason;\r\n error?: string;\r\n bytes?: number;\r\n privilegedReclaim?: boolean;\r\n}\r\n\r\ninterface RemoveHarnessGeneratedPathDeps {\r\n removePath?: typeof rmSync;\r\n hasForeignOwnedEntry?: typeof pathHasForeignOwnedEntry;\r\n}\r\n\r\nfunction permissionFailure(error: unknown): boolean {\r\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\r\n return code === \"EACCES\" || code === \"EPERM\";\r\n}\r\n\r\nexport function removeHarnessGeneratedPath(\r\n candidate: CleanupCandidate,\r\n execute: boolean,\r\n deps: RemoveHarnessGeneratedPathDeps = {},\r\n): RemoveHarnessPathOutcome {\r\n if (!existsSync(candidate.path)) {\r\n return { executed: false, skipped: true, skipReason: \"missing_worktree\" };\r\n }\r\n if (!execute) {\r\n return { executed: false, skipped: true, skipReason: \"dry_run\" };\r\n }\r\n\r\n const harnessRoot = candidate.harnessRoot;\r\n const worktreesDir = harnessRoot ? harnessWorktreesDir(harnessRoot) : null;\r\n const bytesBefore = candidate.bytes ?? directorySizeBytes(candidate.path);\r\n const bytesReported = bytesBefore ?? undefined;\r\n const removePath = deps.removePath ?? rmSync;\r\n const hasForeignOwnedEntry = deps.hasForeignOwnedEntry ?? pathHasForeignOwnedEntry;\r\n\r\n try {\r\n removePath(candidate.path, { recursive: true, force: true });\r\n return { executed: true, skipped: false, bytes: bytesReported };\r\n } catch (error) {\r\n if (!permissionFailure(error) || !harnessRoot || !worktreesDir) {\r\n return {\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n\r\n const foreign = hasForeignOwnedEntry(candidate.path);\r\n const mode = resolvePrivilegedCleanupMode();\r\n const shouldTryPrivileged = mode === \"force\" || (mode === \"auto\" && foreign);\r\n if (!shouldTryPrivileged) {\r\n return foreign\r\n ? {\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"foreign_owner\",\r\n error: `${(error as Error).message}; ${HARNESS_ROOT_OWNED_CACHE_RUNBOOK}`,\r\n }\r\n : {\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"remove_failed\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n\r\n const reclaim = tryPrivilegedReclaimHarnessCache(candidate.path, harnessRoot, worktreesDir);\r\n if (reclaim.ok && reclaim.method === \"sudo_rm\") {\r\n return {\r\n executed: true,\r\n skipped: false,\r\n bytes: bytesReported,\r\n privilegedReclaim: true,\r\n };\r\n }\r\n\r\n if (reclaim.ok) {\r\n try {\r\n removePath(candidate.path, { recursive: true, force: true });\r\n return {\r\n executed: true,\r\n skipped: false,\r\n bytes: bytesReported,\r\n privilegedReclaim: true,\r\n };\r\n } catch (retryError) {\r\n return {\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"foreign_owner\",\r\n error: `${(retryError as Error).message}; privileged chown succeeded but rm still failed`,\r\n };\r\n }\r\n }\r\n\r\n return {\r\n executed: false,\r\n skipped: true,\r\n skipReason: \"foreign_owner\",\r\n error: `${(error as Error).message}; privileged reclaim failed: ${reclaim.error}; ${HARNESS_ROOT_OWNED_CACHE_RUNBOOK}`,\r\n };\r\n }\r\n}\r\n", "import { lstatSync, readdirSync } from \"node:fs\";\r\n\r\nexport interface PathOwnershipInfo {\r\n uid: number;\r\n gid: number;\r\n /** True when the entry is not owned by the current process user/group. */\r\n foreign: boolean;\r\n}\r\n\r\nexport function readPathOwnership(targetPath: string): PathOwnershipInfo | null {\r\n try {\r\n const st = lstatSync(targetPath);\r\n const effectiveUid = typeof process.getuid === \"function\" ? process.getuid() : null;\r\n const effectiveGid = typeof process.getgid === \"function\" ? process.getgid() : null;\r\n const foreign =\r\n effectiveUid !== null &&\r\n (st.uid !== effectiveUid || (effectiveGid !== null && st.gid !== effectiveGid));\r\n return { uid: st.uid, gid: st.gid, foreign };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Shallow scan for foreign-owned entries (dependency caches are usually uniform). */\r\nexport function pathHasForeignOwnedEntry(targetPath: string, maxEntries = 32): boolean {\r\n const root = readPathOwnership(targetPath);\r\n if (!root) return false;\r\n if (root.foreign) return true;\r\n try {\r\n const names = readdirSync(targetPath);\r\n let checked = 0;\r\n for (const name of names) {\r\n if (checked >= maxEntries) break;\r\n const child = `${targetPath.replace(/\\/$/, \"\")}/${name}`;\r\n const info = readPathOwnership(child);\r\n checked += 1;\r\n if (info?.foreign) return true;\r\n }\r\n } catch {\r\n // unreadable \u2014 caller will hit EACCES on remove\r\n }\r\n return false;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport { isHarnessGeneratedCachePath } from \"./cleanup-harness-path-validate.js\";\r\n\r\nexport type PrivilegedCleanupMode = \"off\" | \"auto\" | \"force\";\r\n\r\nexport function resolvePrivilegedCleanupMode(): PrivilegedCleanupMode {\r\n const raw = (process.env.KYNVER_CLEANUP_PRIVILEGED ?? \"auto\").trim().toLowerCase();\r\n if (raw === \"0\" || raw === \"false\" || raw === \"off\" || raw === \"no\") return \"off\";\r\n if (raw === \"1\" || raw === \"true\" || raw === \"force\" || raw === \"yes\") return \"force\";\r\n return \"auto\";\r\n}\r\n\r\nfunction runSudoNonInteractive(argv: string[]): { ok: boolean; stderr: string } {\r\n const res = spawnSync(\"sudo\", [\"-n\", ...argv], {\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n });\r\n return {\r\n ok: res.status === 0,\r\n stderr: `${res.stderr ?? \"\"}${res.stdout ?? \"\"}`.trim(),\r\n };\r\n}\r\n\r\nexport interface PrivilegedReclaimResult {\r\n ok: boolean;\r\n method?: \"chown_then_rm\" | \"sudo_rm\";\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Reclaim a harness generated cache directory that is not owned by the daemon user.\r\n * Only operates on validated `worktrees/<run>/<worker>/{node_modules,.next,...}` paths.\r\n */\r\nexport function tryPrivilegedReclaimHarnessCache(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): PrivilegedReclaimResult {\r\n if (!isHarnessGeneratedCachePath(targetPath, harnessRoot, worktreesDir)) {\r\n return { ok: false, error: \"path is not an allowed harness generated cache\" };\r\n }\r\n const effectiveUid = typeof process.getuid === \"function\" ? process.getuid() : null;\r\n const effectiveGid = typeof process.getgid === \"function\" ? process.getgid() : null;\r\n if (effectiveUid === null || effectiveGid === null) {\r\n return { ok: false, error: \"privileged reclaim requires POSIX uid/gid\" };\r\n }\r\n\r\n const chown = runSudoNonInteractive([\r\n \"chown\",\r\n \"-R\",\r\n `${effectiveUid}:${effectiveGid}`,\r\n path.resolve(targetPath),\r\n ]);\r\n if (chown.ok) {\r\n return { ok: true, method: \"chown_then_rm\" };\r\n }\r\n\r\n const rm = runSudoNonInteractive([\"rm\", \"-rf\", path.resolve(targetPath)]);\r\n if (rm.ok) {\r\n return { ok: true, method: \"sudo_rm\" };\r\n }\r\n\r\n const detail = chown.stderr || rm.stderr || \"sudo -n failed (password required or not permitted)\";\r\n return {\r\n ok: false,\r\n error: detail,\r\n };\r\n}\r\n\r\nexport const HARNESS_ROOT_OWNED_CACHE_RUNBOOK =\r\n \"Root-owned harness caches require operator reclaim: configure passwordless sudo for chown/rm under ~/.kynver/harness/worktrees, or run `node scripts/reclaim-harness-root-owned-cache.mjs --execute` as the harness owner with sudo available. See docs/runbooks/harness-root-owned-cache-reclaim.md.\";\r\n", "import path from \"node:path\";\r\nimport type { CleanupSkipReason } from \"./cleanup-types.js\";\r\n\r\nfunction isHarnessDependencyCachePath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n cacheDirName: \"node_modules\" | \".next\",\r\n): CleanupSkipReason | null {\r\n const resolved = path.resolve(targetPath);\r\n const suffix = `${path.sep}${cacheDirName}`;\r\n const cachePath = resolved.endsWith(suffix) ? resolved : null;\r\n if (!cachePath) return \"path_outside_harness\";\r\n const rel = path.relative(worktreesDir, cachePath);\r\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) return \"path_outside_harness\";\r\n const parts = rel.split(path.sep);\r\n if (parts.length < 3 || parts[parts.length - 1] !== cacheDirName) return \"path_outside_harness\";\r\n if (!resolved.startsWith(path.resolve(harnessRoot))) return \"path_outside_harness\";\r\n return null;\r\n}\r\n\r\nexport function isHarnessNodeModulesPath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): CleanupSkipReason | null {\r\n return isHarnessDependencyCachePath(targetPath, harnessRoot, worktreesDir, \"node_modules\");\r\n}\r\n\r\nexport function isHarnessNextCachePath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): CleanupSkipReason | null {\r\n return isHarnessDependencyCachePath(targetPath, harnessRoot, worktreesDir, \".next\");\r\n}\r\n\r\nexport function isHarnessBuildCachePath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): CleanupSkipReason | null {\r\n const resolved = path.resolve(targetPath);\r\n const relToWt = path.relative(worktreesDir, resolved);\r\n if (relToWt.startsWith(\"..\") || path.isAbsolute(relToWt)) return \"path_outside_harness\";\r\n const parts = relToWt.split(path.sep);\r\n if (parts.length < 3) return \"path_outside_harness\";\r\n if (!resolved.startsWith(path.resolve(harnessRoot))) return \"path_outside_harness\";\r\n return null;\r\n}\r\n\r\nexport function isHarnessGeneratedCachePath(\r\n targetPath: string,\r\n harnessRoot: string,\r\n worktreesDir: string,\r\n): boolean {\r\n const resolved = path.resolve(targetPath);\r\n return (\r\n isHarnessNodeModulesPath(resolved, harnessRoot, worktreesDir) === null ||\r\n isHarnessNextCachePath(resolved, harnessRoot, worktreesDir) === null ||\r\n isHarnessBuildCachePath(resolved, harnessRoot, worktreesDir) === null\r\n );\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate } from \"./cleanup-types.js\";\r\nimport { HARNESS_BUILD_CACHE_RELATIVE_PATHS } from \"./cleanup-build-cache-paths.js\";\r\nimport { buildWorktreeIndex, type IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\n\r\nexport interface ScanHarnessOptions {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n runIdFilter?: string;\r\n index: Map<string, IndexedWorktree>;\r\n now: number;\r\n}\r\n\r\nfunction pathAgeMs(target: string, now: number): number {\r\n try {\r\n const mtime = statSync(target).mtimeMs;\r\n return Math.max(0, now - mtime);\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction isPathInside(child: string, parent: string): boolean {\r\n const rel = path.relative(parent, child);\r\n return rel === \"\" || (!rel.startsWith(\"..\") && !path.isAbsolute(rel));\r\n}\r\n\r\nexport function scanNodeModulesCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n const nm = path.join(entry.worktreePath, \"node_modules\");\r\n if (!existsSync(nm)) continue;\r\n const resolved = path.resolve(nm);\r\n if (seen.has(resolved)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_node_modules\",\r\n path: resolved,\r\n bytes: null,\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n\r\n if (!opts.includeOrphans || !existsSync(opts.worktreesDir)) return candidates;\r\n\r\n for (const runEntry of readdirSync(opts.worktreesDir, { withFileTypes: true })) {\r\n if (!runEntry.isDirectory()) continue;\r\n const runPath = path.join(opts.worktreesDir, runEntry.name);\r\n for (const workerEntry of readdirSync(runPath, { withFileTypes: true })) {\r\n if (!workerEntry.isDirectory()) continue;\r\n const worktreePath = path.join(runPath, workerEntry.name);\r\n const nm = path.join(worktreePath, \"node_modules\");\r\n if (!existsSync(nm)) continue;\r\n const resolved = path.resolve(nm);\r\n if (seen.has(resolved)) continue;\r\n if (!isPathInside(resolved, opts.harnessRoot)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_node_modules\",\r\n path: resolved,\r\n bytes: null,\r\n runId: runEntry.name,\r\n worker: workerEntry.name,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\nfunction collectBuildCacheForWorktree(\r\n worktreePath: string,\r\n opts: ScanHarnessOptions,\r\n seen: Set<string>,\r\n meta: { runId?: string; worker?: string; repo?: string },\r\n): CleanupCandidate[] {\r\n const out: CleanupCandidate[] = [];\r\n for (const rel of HARNESS_BUILD_CACHE_RELATIVE_PATHS) {\r\n if (rel === \".next\") continue;\r\n const target = path.join(worktreePath, rel);\r\n if (!existsSync(target)) continue;\r\n const resolved = path.resolve(target);\r\n if (seen.has(resolved)) continue;\r\n if (!isPathInside(resolved, opts.harnessRoot)) continue;\r\n seen.add(resolved);\r\n out.push({\r\n kind: \"remove_build_cache\",\r\n path: resolved,\r\n bytes: null,\r\n runId: meta.runId,\r\n worker: meta.worker,\r\n repo: meta.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nexport function scanBuildCacheCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n candidates.push(\r\n ...collectBuildCacheForWorktree(entry.worktreePath, opts, seen, {\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n }),\r\n );\r\n }\r\n\r\n if (!opts.includeOrphans || !existsSync(opts.worktreesDir)) return candidates;\r\n\r\n for (const runEntry of readdirSync(opts.worktreesDir, { withFileTypes: true })) {\r\n if (!runEntry.isDirectory()) continue;\r\n const runPath = path.join(opts.worktreesDir, runEntry.name);\r\n for (const workerEntry of readdirSync(runPath, { withFileTypes: true })) {\r\n if (!workerEntry.isDirectory()) continue;\r\n const worktreePath = path.join(runPath, workerEntry.name);\r\n candidates.push(\r\n ...collectBuildCacheForWorktree(worktreePath, opts, seen, {\r\n runId: runEntry.name,\r\n worker: workerEntry.name,\r\n }),\r\n );\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\nexport function scanWorktreeCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n // Indexed worktrees scan when either an explicit age threshold is set OR the\r\n // operator opted in via `--include-orphans` (the salvage gates in\r\n // `skipWorktreeRemoval` are the primary protection at age 0). Orphan scan\r\n // additionally requires `--include-orphans` and applies the orphan-safety\r\n // check via `assessOrphanWorktreeSafety`.\r\n const indexedEnabled = opts.worktreesAgeMs > 0 || opts.includeOrphans;\r\n const orphanEnabled = opts.includeOrphans;\r\n if (!indexedEnabled && !orphanEnabled) return [];\r\n\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n if (indexedEnabled) {\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n const resolved = entry.worktreePath;\r\n if (!existsSync(resolved)) continue;\r\n if (seen.has(resolved)) continue;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind: \"remove_worktree\",\r\n path: resolved,\r\n bytes: null,\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n }\r\n\r\n if (!orphanEnabled || !existsSync(opts.worktreesDir)) return candidates;\r\n\r\n // Track index entries so we can identify true orphans on disk.\r\n const indexedPaths = new Set<string>();\r\n for (const entry of opts.index.values()) {\r\n indexedPaths.add(path.resolve(entry.worktreePath));\r\n }\r\n\r\n for (const runEntry of readdirSync(opts.worktreesDir, { withFileTypes: true })) {\r\n if (!runEntry.isDirectory()) continue;\r\n if (opts.runIdFilter && runEntry.name !== opts.runIdFilter) continue;\r\n const runPath = path.join(opts.worktreesDir, runEntry.name);\r\n let workerEntries;\r\n try {\r\n workerEntries = readdirSync(runPath, { withFileTypes: true });\r\n } catch {\r\n continue;\r\n }\r\n for (const workerEntry of workerEntries) {\r\n if (!workerEntry.isDirectory()) continue;\r\n const worktreePath = path.resolve(path.join(runPath, workerEntry.name));\r\n if (seen.has(worktreePath)) continue;\r\n if (indexedPaths.has(worktreePath)) continue;\r\n if (!isPathInside(worktreePath, opts.harnessRoot)) continue;\r\n seen.add(worktreePath);\r\n candidates.push({\r\n kind: \"remove_worktree\",\r\n path: worktreePath,\r\n bytes: null,\r\n runId: runEntry.name,\r\n worker: workerEntry.name,\r\n ageMs: pathAgeMs(worktreePath, opts.now),\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupActionKind, CleanupCandidate } from \"./cleanup-types.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\n\r\nconst DEPENDENCY_CACHE_DIRS: Array<{ dirName: string; kind: CleanupActionKind }> = [\r\n { dirName: \"node_modules\", kind: \"remove_node_modules\" },\r\n { dirName: \".next\", kind: \"remove_next_cache\" },\r\n];\r\n\r\nexport interface ScanDependencyCacheOptions {\r\n harnessRoot: string;\r\n worktreesDir: string;\r\n nodeModulesAgeMs: number;\r\n includeOrphans?: boolean;\r\n runIdFilter?: string;\r\n index: Map<string, IndexedWorktree>;\r\n now: number;\r\n}\r\n\r\nfunction pathAgeMs(target: string, now: number): number {\r\n try {\r\n const mtime = statSync(target).mtimeMs;\r\n return Math.max(0, now - mtime);\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\nfunction isPathInside(child: string, parent: string): boolean {\r\n const rel = path.relative(parent, child);\r\n return rel === \"\" || (!rel.startsWith(\"..\") && !path.isAbsolute(rel));\r\n}\r\n\r\nfunction pushCandidate(\r\n candidates: CleanupCandidate[],\r\n seen: Set<string>,\r\n opts: ScanDependencyCacheOptions,\r\n targetPath: string,\r\n kind: CleanupActionKind,\r\n meta: { runId?: string; worker?: string; repo?: string },\r\n): void {\r\n if (!existsSync(targetPath)) return;\r\n const resolved = path.resolve(targetPath);\r\n if (seen.has(resolved)) return;\r\n if (!isPathInside(resolved, opts.harnessRoot)) return;\r\n seen.add(resolved);\r\n candidates.push({\r\n kind,\r\n path: resolved,\r\n bytes: null,\r\n harnessRoot: opts.harnessRoot,\r\n runId: meta.runId,\r\n worker: meta.worker,\r\n repo: meta.repo,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n}\r\n\r\nfunction scanWorktreeDependencyCaches(\r\n candidates: CleanupCandidate[],\r\n seen: Set<string>,\r\n opts: ScanDependencyCacheOptions,\r\n worktreePath: string,\r\n meta: { runId?: string; worker?: string; repo?: string },\r\n): void {\r\n for (const entry of DEPENDENCY_CACHE_DIRS) {\r\n pushCandidate(candidates, seen, opts, path.join(worktreePath, entry.dirName), entry.kind, meta);\r\n }\r\n}\r\n\r\n/** Scan indexed + on-disk worktrees for generated dependency caches. */\r\nexport function scanDependencyCacheCandidates(opts: ScanDependencyCacheOptions): CleanupCandidate[] {\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const entry of opts.index.values()) {\r\n if (opts.runIdFilter && entry.runId !== opts.runIdFilter) continue;\r\n scanWorktreeDependencyCaches(candidates, seen, opts, entry.worktreePath, {\r\n runId: entry.runId,\r\n worker: entry.workerName,\r\n repo: entry.run.repo,\r\n });\r\n }\r\n\r\n if (!opts.includeOrphans || !existsSync(opts.worktreesDir)) return candidates;\r\n\r\n for (const runEntry of readdirSync(opts.worktreesDir, { withFileTypes: true })) {\r\n if (!runEntry.isDirectory()) continue;\r\n if (opts.runIdFilter && runEntry.name !== opts.runIdFilter) continue;\r\n const runPath = path.join(opts.worktreesDir, runEntry.name);\r\n let workerEntries;\r\n try {\r\n workerEntries = readdirSync(runPath, { withFileTypes: true });\r\n } catch {\r\n continue;\r\n }\r\n for (const workerEntry of workerEntries) {\r\n if (!workerEntry.isDirectory()) continue;\r\n const worktreePath = path.join(runPath, workerEntry.name);\r\n scanWorktreeDependencyCaches(candidates, seen, opts, worktreePath, {\r\n runId: runEntry.name,\r\n worker: workerEntry.name,\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n", "import { existsSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate } from \"./cleanup-types.js\";\r\nimport { git } from \"./git.js\";\r\nimport type { ScanHarnessOptions } from \"./cleanup-scan.js\";\r\n\r\nfunction pathAgeMs(target: string, now: number): number {\r\n try {\r\n const mtime = statSync(target).mtimeMs;\r\n return Math.max(0, now - mtime);\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\ninterface PorcelainWorktree {\r\n path: string;\r\n branch?: string;\r\n head?: string;\r\n bare?: boolean;\r\n}\r\n\r\nfunction parseWorktreePorcelain(output: string): PorcelainWorktree[] {\r\n const records: PorcelainWorktree[] = [];\r\n let current: PorcelainWorktree | null = null;\r\n for (const line of output.split(\"\\n\")) {\r\n if (!line.trim()) continue;\r\n const [key, ...rest] = line.split(\" \");\r\n const value = rest.join(\" \");\r\n if (key === \"worktree\") {\r\n if (current) records.push(current);\r\n current = { path: value };\r\n continue;\r\n }\r\n if (!current) continue;\r\n if (key === \"branch\") current.branch = value;\r\n if (key === \"HEAD\") current.head = value;\r\n if (key === \"bare\") current.bare = true;\r\n }\r\n if (current) records.push(current);\r\n return records;\r\n}\r\n\r\nfunction isUnderWorktreesDir(worktreePath: string, worktreesDir: string): boolean {\r\n const rel = path.relative(path.resolve(worktreesDir), path.resolve(worktreePath));\r\n return rel !== \"\" && !rel.startsWith(\"..\") && !path.isAbsolute(rel);\r\n}\r\n\r\n/** Cap duplicate git-worktree probes per repo per sweep (list can be 1k+ entries). */\r\nconst MAX_DUPLICATE_WORKTREE_CANDIDATES_PER_REPO = 200;\r\n\r\n/**\r\n * Secondary git worktrees under the harness layout that are not indexed\r\n * (aborted duplicate attempts). Salvage guards (orphan safety) run at evaluation\r\n * time \u2014 do not run per-worktree `git status` during the scan pass.\r\n */\r\nexport function scanDuplicateWorktreeCandidates(opts: ScanHarnessOptions): CleanupCandidate[] {\r\n if (!opts.includeOrphans || !existsSync(opts.worktreesDir)) return [];\r\n\r\n const repos = new Set<string>();\r\n for (const entry of opts.index.values()) {\r\n if (entry.run.repo) repos.add(path.resolve(entry.run.repo));\r\n }\r\n\r\n const indexedPaths = new Set<string>();\r\n for (const entry of opts.index.values()) {\r\n indexedPaths.add(path.resolve(entry.worktreePath));\r\n }\r\n\r\n const candidates: CleanupCandidate[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const repoRoot of repos) {\r\n let repoCandidateCount = 0;\r\n let porcelain: string;\r\n try {\r\n porcelain = git(repoRoot, [\"worktree\", \"list\", \"--porcelain\"], { allowFailure: true });\r\n } catch {\r\n continue;\r\n }\r\n const worktrees = parseWorktreePorcelain(porcelain);\r\n for (const wt of worktrees) {\r\n if (repoCandidateCount >= MAX_DUPLICATE_WORKTREE_CANDIDATES_PER_REPO) break;\r\n const resolved = path.resolve(wt.path);\r\n if (resolved === path.resolve(repoRoot)) continue;\r\n if (!isUnderWorktreesDir(resolved, opts.worktreesDir)) continue;\r\n if (indexedPaths.has(resolved)) continue;\r\n if (seen.has(resolved)) continue;\r\n if (!existsSync(resolved)) continue;\r\n\r\n const rel = path.relative(opts.worktreesDir, resolved);\r\n const parts = rel.split(path.sep);\r\n const runId = parts[0];\r\n const worker = parts[1] ?? \"unknown\";\r\n seen.add(resolved);\r\n repoCandidateCount += 1;\r\n candidates.push({\r\n kind: \"remove_worktree\",\r\n path: resolved,\r\n bytes: null,\r\n runId,\r\n worker,\r\n repo: repoRoot,\r\n ageMs: pathAgeMs(resolved, opts.now),\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n", "import path from \"node:path\";\r\nimport {\r\n getPaths,\r\n listRunRecordsForHarnessRoot,\r\n loadWorker,\r\n runDirectoryAt,\r\n type HarnessRunRecord,\r\n} from \"./run-store.js\";\r\nimport type { HarnessWorkerRecord, RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface IndexedWorktree {\r\n harnessRoot?: string;\r\n worktreePath: string;\r\n runId: string;\r\n workerName: string;\r\n run: HarnessRunRecord;\r\n worker: HarnessWorkerRecord;\r\n /** Populated lazily via `indexedWorktreeStatus()` during guard evaluation. */\r\n status?: RawHarnessWorkerStatus;\r\n}\r\n\r\nexport function buildWorktreeIndex(): Map<string, IndexedWorktree> {\r\n const { harnessRoot } = getPaths();\r\n return buildWorktreeIndexAt(harnessRoot);\r\n}\r\n\r\n/** Scope a merged multi-root index to one harness tree (avoids triple-scanning every worker). */\r\nexport function filterWorktreeIndexForRoot(\r\n index: Map<string, IndexedWorktree>,\r\n harnessRoot: string,\r\n): Map<string, IndexedWorktree> {\r\n const resolvedRoot = path.resolve(harnessRoot);\r\n const scoped = new Map<string, IndexedWorktree>();\r\n for (const [key, entry] of index) {\r\n const entryRoot = entry.harnessRoot ? path.resolve(entry.harnessRoot) : null;\r\n if (entryRoot && entryRoot !== resolvedRoot) continue;\r\n scoped.set(key, entry);\r\n }\r\n return scoped;\r\n}\r\n\r\nexport function buildWorktreeIndexAt(harnessRoot: string): Map<string, IndexedWorktree> {\r\n const index = new Map<string, IndexedWorktree>();\r\n for (const run of listRunRecordsForHarnessRoot(harnessRoot)) {\r\n for (const name of Object.keys(run.workers || {})) {\r\n const workerPath = path.join(\r\n runDirectoryAt(harnessRoot, run.id),\r\n \"workers\",\r\n safeSlug(name),\r\n \"worker.json\",\r\n );\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n if (!worker?.worktreePath) continue;\r\n index.set(path.resolve(worker.worktreePath), {\r\n harnessRoot,\r\n worktreePath: path.resolve(worker.worktreePath),\r\n runId: run.id,\r\n workerName: name,\r\n run,\r\n worker,\r\n });\r\n }\r\n }\r\n return index;\r\n}\r\n\r\n/** Load worker when index miss but path is known from disk layout. */\r\nexport function loadIndexedWorker(runId: string, workerName: string): HarnessWorkerRecord | null {\r\n try {\r\n return loadWorker(runId, workerName);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "import type { DispatchNextDiskGateShape } from \"./callbacks.js\";\r\nimport {\r\n DEFAULT_MAX_ACTIONS_PER_SWEEP,\r\n DEFAULT_NODE_MODULES_AGE_MS,\r\n DEFAULT_RUN_DIRECTORIES_AGE_MS,\r\n DEFAULT_TERMINAL_WORKTREES_AGE_MS,\r\n DEFAULT_WORKTREES_AGE_MS,\r\n type HarnessCleanupOptions,\r\n} from \"./cleanup-types.js\";\r\n\r\nfunction envFlag(name: string): boolean {\r\n const v = process.env[name];\r\n return v === \"1\" || v === \"true\" || v === \"yes\";\r\n}\r\n\r\nfunction envMs(name: string, fallback: number): number {\r\n const raw = process.env[name];\r\n if (!raw) return fallback;\r\n const n = Number(raw);\r\n return Number.isFinite(n) && n >= 0 ? n : fallback;\r\n}\r\n\r\nexport interface ResolvedHarnessRetention {\r\n execute: boolean;\r\n finalizeStaleRuns: boolean;\r\n /** When false, skip node_modules/.next/build-cache scans (worktree-only operator sweeps). */\r\n scanDependencyCaches: boolean;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n terminalWorktreesAgeMs: number;\r\n runDirectoriesAgeMs: number;\r\n maxActionsPerSweep: number;\r\n includeOrphans: boolean;\r\n runIdFilter?: string;\r\n accountBytes: boolean;\r\n /** Cap filesystem walk depth per run dir in `harnessStorageSnapshot` (0 = counts only). */\r\n storagePerRunEntryCap: number | null;\r\n /** Per-candidate walk cap when `du` is unavailable (default 2k). */\r\n byteAccountingEntryCap: number;\r\n diskPressure?: boolean;\r\n diskGate?: DispatchNextDiskGateShape;\r\n}\r\n\r\n/** Merge CLI options with operator env defaults (pipeline + `kynver cleanup`). */\r\nexport function resolveHarnessRetention(\r\n options: HarnessCleanupOptions = {},\r\n): ResolvedHarnessRetention {\r\n const execute =\r\n options.execute === true ||\r\n (options.execute !== false && envFlag(\"KYNVER_CLEANUP_EXECUTE\"));\r\n const finalizeStaleRuns =\r\n options.finalizeStaleRuns !== false && !envFlag(\"KYNVER_CLEANUP_SKIP_FINALIZE\");\r\n const nodeModulesAgeMs =\r\n options.nodeModulesAgeMs ??\r\n envMs(\"KYNVER_CLEANUP_NODE_MODULES_AGE_MS\", DEFAULT_NODE_MODULES_AGE_MS);\r\n const scanDependencyCaches =\r\n options.scanDependencyCaches ??\r\n (options.nodeModulesAgeMs !== undefined ||\r\n process.env.KYNVER_CLEANUP_NODE_MODULES_AGE_MS != null);\r\n const worktreesAgeMs =\r\n options.worktreesAgeMs ??\r\n envMs(\"KYNVER_CLEANUP_WORKTREES_AGE_MS\", 0);\r\n const terminalWorktreesAgeMs =\r\n options.terminalWorktreesAgeMs ??\r\n envMs(\"KYNVER_CLEANUP_TERMINAL_WORKTREES_AGE_MS\", DEFAULT_TERMINAL_WORKTREES_AGE_MS);\r\n const runDirectoriesAgeMs =\r\n options.runDirectoriesAgeMs ??\r\n envMs(\"KYNVER_CLEANUP_RUN_DIRECTORIES_AGE_MS\", DEFAULT_RUN_DIRECTORIES_AGE_MS);\r\n const maxActionsPerSweep =\r\n options.maxActionsPerSweep ??\r\n envMs(\"KYNVER_CLEANUP_MAX_ACTIONS_PER_SWEEP\", DEFAULT_MAX_ACTIONS_PER_SWEEP);\r\n const includeOrphans =\r\n options.includeOrphans === true || envFlag(\"KYNVER_CLEANUP_INCLUDE_ORPHANS\");\r\n const scopeAll = envFlag(\"KYNVER_CLEANUP_SCOPE_ALL\") || process.env.KYNVER_CLEANUP_SCOPE === \"all\";\r\n const runIdFilter = scopeAll\r\n ? options.runIdFilter\r\n : options.runIdFilter ?? (process.env.KYNVER_CLEANUP_RUN_ID || undefined);\r\n const accountBytes = options.accountBytes !== false && !envFlag(\"KYNVER_CLEANUP_SKIP_BYTE_ACCOUNTING\");\r\n const storageCapEnv = envMs(\"KYNVER_CLEANUP_STORAGE_ENTRY_CAP\", 2_000);\r\n const storagePerRunEntryCap =\r\n options.storagePerRunEntryCap !== undefined\r\n ? options.storagePerRunEntryCap\r\n : accountBytes\r\n ? storageCapEnv > 0\r\n ? storageCapEnv\r\n : null\r\n : null;\r\n const byteCapEnv = envMs(\"KYNVER_CLEANUP_BYTE_ENTRY_CAP\", 2_000);\r\n const byteAccountingEntryCap =\r\n options.byteAccountingEntryCap ??\r\n (Number.isFinite(byteCapEnv) && byteCapEnv > 0 ? Math.floor(byteCapEnv) : 2_000);\r\n\r\n return {\r\n execute,\r\n finalizeStaleRuns,\r\n scanDependencyCaches,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs: worktreesAgeMs > 0 ? worktreesAgeMs : 0,\r\n terminalWorktreesAgeMs: terminalWorktreesAgeMs >= 0 ? terminalWorktreesAgeMs : 0,\r\n runDirectoriesAgeMs: runDirectoriesAgeMs >= 0 ? runDirectoriesAgeMs : 0,\r\n maxActionsPerSweep:\r\n Number.isFinite(maxActionsPerSweep) && maxActionsPerSweep > 0\r\n ? Math.floor(maxActionsPerSweep)\r\n : DEFAULT_MAX_ACTIONS_PER_SWEEP,\r\n includeOrphans,\r\n runIdFilter: runIdFilter ? String(runIdFilter) : undefined,\r\n accountBytes,\r\n storagePerRunEntryCap,\r\n byteAccountingEntryCap,\r\n };\r\n}\r\n\r\n/** Pipeline tick: dry-run by default; global scope when `KYNVER_CLEANUP_SCOPE=all`. */\r\nexport function resolvePipelineHarnessRetention(runId?: string): ResolvedHarnessRetention {\r\n const scopeAll = process.env.KYNVER_CLEANUP_SCOPE === \"all\";\r\n const envWorktrees = Number(process.env.KYNVER_CLEANUP_WORKTREES_AGE_MS);\r\n const worktreesAgeMs = scopeAll\r\n ? Number.isFinite(envWorktrees) && envWorktrees > 0\r\n ? envWorktrees\r\n : DEFAULT_WORKTREES_AGE_MS\r\n : Number.isFinite(envWorktrees) && envWorktrees > 0\r\n ? envWorktrees\r\n : 0;\r\n return resolveHarnessRetention({\r\n runIdFilter: scopeAll ? undefined : runId,\r\n worktreesAgeMs,\r\n terminalWorktreesAgeMs: scopeAll ? DEFAULT_TERMINAL_WORKTREES_AGE_MS : undefined,\r\n runDirectoriesAgeMs: scopeAll ? DEFAULT_RUN_DIRECTORIES_AGE_MS : undefined,\r\n includeOrphans: scopeAll ? true : undefined,\r\n finalizeStaleRuns: true,\r\n accountBytes: true,\r\n scanDependencyCaches: true,\r\n });\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { gitCapture } from \"./git.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\nimport { heartbeatContentIsFresh } from \"./cleanup-worker-harness-live.js\";\r\nimport type { CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { readJson } from \"./util.js\";\r\n\r\nconst DEFAULT_HEARTBEAT_FRESH_MS = 30 * 60 * 1000;\r\n\r\nexport interface OrphanSafetyInput {\r\n worktreePath: string;\r\n harnessRoot: string;\r\n runId?: string;\r\n workerName?: string;\r\n heartbeatFreshMs?: number;\r\n now?: number;\r\n}\r\n\r\n/**\r\n * Inspect filesystem signals for an orphan worktree (no run/worker.json index entry).\r\n *\r\n * Returns a `CleanupSkipReason` when removal is unsafe, or `null` when the orphan\r\n * appears safe to delete. Conservative on errors \u2014 any unreadable git state or\r\n * unexpected layout returns `pr_or_unmerged_commits` so genuine work is preserved.\r\n */\r\nexport function assessOrphanWorktreeSafety(\r\n input: OrphanSafetyInput,\r\n): CleanupSkipReason | null {\r\n const now = input.now ?? Date.now();\r\n const heartbeatFreshMs = input.heartbeatFreshMs ?? DEFAULT_HEARTBEAT_FRESH_MS;\r\n\r\n if (!existsSync(input.worktreePath)) return null;\r\n\r\n if (input.runId && input.workerName) {\r\n const workerDir = path.join(\r\n input.harnessRoot,\r\n \"runs\",\r\n input.runId,\r\n \"workers\",\r\n input.workerName,\r\n );\r\n const worker = readJson<HarnessWorkerRecord | undefined>(\r\n path.join(workerDir, \"worker.json\"),\r\n undefined,\r\n );\r\n if (\r\n worker &&\r\n heartbeatContentIsFresh(worker, now, heartbeatFreshMs)\r\n ) {\r\n return \"active_worker\";\r\n }\r\n }\r\n\r\n const gitDir = path.join(input.worktreePath, \".git\");\r\n if (!existsSync(gitDir)) return null;\r\n\r\n const porcelain = gitCapture(input.worktreePath, [\"status\", \"--porcelain\"]);\r\n if (porcelain.status !== 0) return \"pr_or_unmerged_commits\";\r\n const dirtyLines = porcelain.stdout\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0);\r\n if (materialWorktreeChanges(dirtyLines).length > 0) return \"dirty_worktree\";\r\n\r\n const upstreamAhead = gitCapture(input.worktreePath, [\r\n \"rev-list\",\r\n \"--count\",\r\n \"@{u}..HEAD\",\r\n ]);\r\n if (upstreamAhead.status === 0) {\r\n const count = Number(upstreamAhead.stdout.trim());\r\n if (Number.isFinite(count) && count > 0) return \"pr_or_unmerged_commits\";\r\n }\r\n\r\n const mainAhead = gitCapture(input.worktreePath, [\r\n \"rev-list\",\r\n \"--count\",\r\n \"origin/main..HEAD\",\r\n ]);\r\n if (mainAhead.status !== 0) {\r\n // Upstream may be gone after PR merge; when origin/main is also unreachable, preserve work.\r\n if (upstreamAhead.status !== 0) return \"pr_or_unmerged_commits\";\r\n return null;\r\n }\r\n const mainCount = Number(mainAhead.stdout.trim());\r\n if (Number.isFinite(mainCount) && mainCount > 0) return \"pr_or_unmerged_commits\";\r\n\r\n return null;\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { normalizeHarnessRoot, resolveHarnessRoot } from \"./paths.js\";\r\n\r\n/** Operator-known harness trees that accumulate stale dependency caches. */\r\nexport const WELL_KNOWN_HARNESS_SCAN_ROOTS = [\r\n \"/var/tmp/kynver-harness\",\r\n path.join(homedir(), \".openclaw\", \"harness\"),\r\n] as const;\r\n\r\nfunction addRoot(seen: Set<string>, roots: string[], candidate: string | undefined): void {\r\n if (!candidate?.trim()) return;\r\n const resolved = normalizeHarnessRoot(candidate.trim());\r\n if (seen.has(resolved)) return;\r\n seen.add(resolved);\r\n roots.push(resolved);\r\n}\r\n\r\n/**\r\n * Deduped harness roots to scan for dependency-cache GC. Includes the active\r\n * configured root plus well-known legacy/tmp trees when they exist on disk.\r\n */\r\nfunction shouldScanWellKnownRoots(options: { scanWellKnown?: boolean }): boolean {\r\n if (options.scanWellKnown != null) return options.scanWellKnown;\r\n if (process.env.VITEST === \"true\") return false;\r\n return (\r\n process.env.KYNVER_CLEANUP_SCAN_WELL_KNOWN !== \"0\" &&\r\n ![\"0\", \"false\", \"no\"].includes((process.env.KYNVER_CLEANUP_SCAN_WELL_KNOWN ?? \"\").toLowerCase())\r\n );\r\n}\r\n\r\nexport function resolveHarnessScanRoots(\r\n options: { harnessRoot?: string; scanWellKnown?: boolean } = {},\r\n): string[] {\r\n const seen = new Set<string>();\r\n const roots: string[] = [];\r\n\r\n addRoot(seen, roots, options.harnessRoot ?? resolveHarnessRoot());\r\n\r\n const extra = process.env.KYNVER_CLEANUP_EXTRA_ROOTS?.split(\",\")\r\n .map((part) => part.trim())\r\n .filter(Boolean);\r\n for (const candidate of extra ?? []) addRoot(seen, roots, candidate);\r\n\r\n if (shouldScanWellKnownRoots(options)) {\r\n for (const candidate of WELL_KNOWN_HARNESS_SCAN_ROOTS) {\r\n const resolved = path.resolve(candidate);\r\n if (!seen.has(resolved) && existsSync(resolved)) addRoot(seen, roots, resolved);\r\n }\r\n }\r\n\r\n return roots;\r\n}\r\n", "import type { DispatchNextDiskGateShape } from \"./callbacks.js\";\r\nimport { observeRunnerDiskGate, type ObserveDiskGateInput } from \"./disk-gate.js\";\r\nimport type { ResolvedHarnessRetention } from \"./cleanup-retention-config.js\";\r\nimport { DEFAULT_WORKTREES_AGE_MS } from \"./cleanup-types.js\";\r\n\r\nfunction envFlag(name: string): boolean {\r\n const v = process.env[name];\r\n return v === \"1\" || v === \"true\" || v === \"yes\";\r\n}\r\n\r\nfunction envNumber(name: string, fallback: number): number {\r\n const raw = process.env[name];\r\n if (!raw) return fallback;\r\n const n = Number(raw);\r\n return Number.isFinite(n) ? n : fallback;\r\n}\r\n\r\nexport interface CleanupDiskPressureShape {\r\n diskGate: DispatchNextDiskGateShape;\r\n /** Root filesystem (or override) is at/above the guard threshold. */\r\n pressured: boolean;\r\n maxUsedPercent: number;\r\n}\r\n\r\nexport function observeCleanupDiskPressure(input: ObserveDiskGateInput = {}): CleanupDiskPressureShape {\r\n const diskPath = input.diskPath?.trim() || process.env.KYNVER_DISK_GUARD_PATH?.trim() || \"/\";\r\n const maxUsedPercent = envNumber(\"KYNVER_DISK_GUARD_MAX_USED_PERCENT\", 75);\r\n const diskGate = observeRunnerDiskGate({\r\n ...input,\r\n diskPath,\r\n diskMaxUsedPercent: input.diskMaxUsedPercent ?? maxUsedPercent,\r\n });\r\n let pressured = !diskGate.ok || diskGate.usedPercent >= maxUsedPercent;\r\n\r\n // KYNVER_CLEANUP_DISK_PRESSURE_FORCE=none|pressured overrides the statfs\r\n // verdict. Quota-overlay hosts (managed sandboxes, container quotas) report\r\n // a huge filesystem with little \"available\" space, so the computed\r\n // used-percent reads as critically full even when the workload has plenty\r\n // of headroom \u2014 silently escalating every cleanup into an execute-mode,\r\n // include-orphans sweep. `none` pins pressure off for such hosts (and for\r\n // hermetic tests); `pressured` forces escalation for drills.\r\n const force = process.env.KYNVER_CLEANUP_DISK_PRESSURE_FORCE?.trim().toLowerCase();\r\n if (force === \"none\" || force === \"off\" || force === \"0\") pressured = false;\r\n else if (force === \"pressured\" || force === \"on\" || force === \"1\") pressured = true;\r\n\r\n return { diskGate, pressured, maxUsedPercent };\r\n}\r\n\r\n/**\r\n * Under disk pressure, reclaim generated dependency caches aggressively while\r\n * keeping source worktrees and stricter worktree deletion rules unchanged.\r\n */\r\nexport function applyDiskPressureToRetention(\r\n retention: ResolvedHarnessRetention,\r\n pressure: CleanupDiskPressureShape,\r\n): ResolvedHarnessRetention {\r\n if (!pressure.pressured) return retention;\r\n const executeOnPressure =\r\n retention.execute || !envFlag(\"KYNVER_CLEANUP_DRY_RUN_ON_PRESSURE\");\r\n return {\r\n ...retention,\r\n execute: executeOnPressure,\r\n nodeModulesAgeMs: 0,\r\n // Disk pressure means the current-run-only cleanup scope has already fallen\r\n // behind. Expand the sweep to every known harness root/run, but keep the\r\n // worktree salvage/PR/dirty/live-worker guards in the cleanup pipeline.\r\n runIdFilter: undefined,\r\n includeOrphans: true,\r\n terminalWorktreesAgeMs: 0,\r\n runDirectoriesAgeMs: 0,\r\n worktreesAgeMs: retention.worktreesAgeMs > 0 ? retention.worktreesAgeMs : DEFAULT_WORKTREES_AGE_MS,\r\n diskPressure: true,\r\n diskGate: pressure.diskGate,\r\n };\r\n}\r\n", "/** stderr progress lines so broad cleanup scans do not appear hung before JSON output. */\r\nexport function emitCleanupProgress(phase: string, detail?: string): void {\r\n if (process.env.KYNVER_CLEANUP_QUIET === \"1\") return;\r\n const suffix = detail ? `: ${detail}` : \"\";\r\n console.error(`[kynver cleanup] ${phase}${suffix}`);\r\n}\r\n", "import { gitCapture } from \"./git.js\";\r\n\r\n/** Per-sweep memo for cheap ahead-of-main probes during worktree guard passes. */\r\nexport class CleanupGitRevCache {\r\n private readonly aheadOfMain = new Map<string, number | null>();\r\n\r\n countAheadOfMain(worktreePath: string, base = \"origin/main\"): number | null {\r\n const key = `${worktreePath}\\0${base}`;\r\n if (this.aheadOfMain.has(key)) return this.aheadOfMain.get(key) ?? null;\r\n const result = gitCapture(worktreePath, [\"rev-list\", \"--count\", `${base}..HEAD`]);\r\n if (result.status !== 0) {\r\n this.aheadOfMain.set(key, null);\r\n return null;\r\n }\r\n const count = Number(result.stdout.trim());\r\n const parsed = Number.isFinite(count) ? count : null;\r\n this.aheadOfMain.set(key, parsed);\r\n return parsed;\r\n }\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { existsSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { GitCaptureResult } from \"./git.js\";\r\n\r\n/** Bounded git work during broad cleanup scans \u2014 hung repos must not stall the sweep. */\r\nexport const CLEANUP_GIT_PROBE_TIMEOUT_MS = 5_000;\r\n\r\nexport function cleanupGitCapture(cwd: string, args: string[]): GitCaptureResult {\r\n if (!existsSync(path.join(cwd, \".git\"))) {\r\n return { status: null, stdout: \"\", stderr: \"\", error: \"not_a_git_repo\" };\r\n }\r\n try {\r\n const res = spawnSync(\"git\", args, {\r\n cwd,\r\n encoding: \"utf8\",\r\n timeout: CLEANUP_GIT_PROBE_TIMEOUT_MS,\r\n });\r\n const timedOut = res.error?.message?.includes(\"ETIMEDOUT\") === true;\r\n return {\r\n status: timedOut ? null : res.status,\r\n stdout: res.stdout || \"\",\r\n stderr: res.stderr || \"\",\r\n error: timedOut ? \"git_timeout\" : res.error ? res.error.message : null,\r\n };\r\n } catch (error) {\r\n return {\r\n status: null,\r\n stdout: \"\",\r\n stderr: \"\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nexport function gitStatusShortForCleanup(worktreePath: string): string[] | null {\r\n const captured = cleanupGitCapture(worktreePath, [\"status\", \"--short\"]);\r\n if (captured.error === \"not_a_git_repo\") return [];\r\n if (captured.error === \"git_timeout\" || captured.status !== 0) return null;\r\n return captured.stdout\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter(Boolean);\r\n}\r\n", "import { gitStatusShortForCleanup } from \"./cleanup-git-probe.js\";\r\n\r\n/** Per-sweep memo so dependency-cache guards do not re-run git per cache dir. */\r\nexport class CleanupGitStatusCache {\r\n private readonly cache = new Map<string, string[]>();\r\n\r\n porcelain(worktreePath: string): string[] {\r\n const resolved = worktreePath;\r\n const cached = this.cache.get(resolved);\r\n if (cached !== undefined) return cached;\r\n const lines = gitStatusShortForCleanup(resolved) ?? [];\r\n this.cache.set(resolved, lines);\r\n return lines;\r\n }\r\n}\r\n", "import { deriveTerminalRunStatus } from \"./finalize.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\n\r\n/** Per-sweep memo so worktree guards do not re-derive terminal status for every worker in a run. */\r\nexport class CleanupRunTerminalCache {\r\n private readonly cache = new Map<string, string | null>();\r\n\r\n derive(run: HarnessRunRecord): string | null {\r\n const cached = this.cache.get(run.id);\r\n if (cached !== undefined) return cached;\r\n const derived = deriveTerminalRunStatus(run);\r\n this.cache.set(run.id, derived);\r\n return derived;\r\n }\r\n}\r\n", "import type {\r\n CleanupActionKind,\r\n HarnessCleanupSummary,\r\n HarnessStorageSnapshotShape,\r\n} from \"./cleanup-types.js\";\r\n\r\nconst DEFAULT_SAMPLE_ACTIONS = 12;\r\nconst DEFAULT_SAMPLE_SKIPS = 8;\r\n\r\nexport interface CleanupCompactSummary {\r\n harnessRoot: string;\r\n scanRoots: string[];\r\n dryRun: boolean;\r\n execute: boolean;\r\n scannedAt: string;\r\n finalizedRuns: number;\r\n actionCount: number;\r\n actionKinds: Partial<Record<CleanupActionKind, number>>;\r\n totals: HarnessCleanupSummary[\"totals\"];\r\n storage?: HarnessStorageSnapshotShape;\r\n preservedLivePaths?: HarnessCleanupSummary[\"preservedLivePaths\"];\r\n removedRunDirectories?: number;\r\n sampleActions: Array<{\r\n kind: CleanupActionKind;\r\n path: string;\r\n skipReason?: string;\r\n bytes?: number | null;\r\n runId?: string;\r\n worker?: string;\r\n }>;\r\n sampleSkips: HarnessCleanupSummary[\"skips\"];\r\n}\r\n\r\nfunction tallyActionKinds(actions: HarnessCleanupSummary[\"actions\"]): Partial<Record<CleanupActionKind, number>> {\r\n const counts: Partial<Record<CleanupActionKind, number>> = {};\r\n for (const action of actions) {\r\n counts[action.kind] = (counts[action.kind] ?? 0) + 1;\r\n }\r\n return counts;\r\n}\r\n\r\n/** Operator-facing rollup \u2014 bounded samples, no per-path megabyte JSON dumps. */\r\nexport function buildCleanupCompactSummary(\r\n summary: HarnessCleanupSummary,\r\n options: { maxSampleActions?: number; maxSampleSkips?: number } = {},\r\n): CleanupCompactSummary {\r\n const maxActions = options.maxSampleActions ?? DEFAULT_SAMPLE_ACTIONS;\r\n const maxSkips = options.maxSampleSkips ?? DEFAULT_SAMPLE_SKIPS;\r\n\r\n return {\r\n harnessRoot: summary.harnessRoot,\r\n scanRoots: summary.scanRoots,\r\n dryRun: summary.dryRun,\r\n execute: summary.execute,\r\n scannedAt: summary.scannedAt,\r\n finalizedRuns: summary.finalizedRuns.length,\r\n actionCount: summary.actions.length,\r\n actionKinds: tallyActionKinds(summary.actions),\r\n totals: summary.totals,\r\n ...(summary.storage ? { storage: summary.storage } : {}),\r\n ...(summary.preservedLivePaths?.length ? { preservedLivePaths: summary.preservedLivePaths } : {}),\r\n ...(summary.removedRunDirectories != null ? { removedRunDirectories: summary.removedRunDirectories } : {}),\r\n sampleActions: summary.actions.slice(0, maxActions).map((action) => ({\r\n kind: action.kind,\r\n path: action.path,\r\n ...(action.skipReason ? { skipReason: action.skipReason } : {}),\r\n ...(action.bytes != null ? { bytes: action.bytes } : {}),\r\n ...(action.runId ? { runId: action.runId } : {}),\r\n ...(action.worker ? { worker: action.worker } : {}),\r\n })),\r\n sampleSkips: summary.skips.slice(0, maxSkips),\r\n };\r\n}\r\n", "#!/usr/bin/env node\r\nimport { mkdirSync, realpathSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { parseArgs, runLogin, runSetup, mintRunnerCredential } from \"./config.js\";\r\nimport { runBootstrap } from \"./bootstrap.js\";\r\nimport { runStart } from \"./start.js\";\r\nimport { dispatchRun } from \"./dispatch.js\";\r\nimport { getPaths, loadRun } from \"./run-store.js\";\r\nimport { startWorker } from \"./supervisor.js\";\r\nimport { sweepRun } from \"./sweep.js\";\r\nimport { createRun, listRuns } from \"./worktree.js\";\r\nimport {\r\n completeWorker,\r\n runStatus,\r\n stopWorker,\r\n tailWorker,\r\n workerList,\r\n workerStatus,\r\n} from \"./worker-ops.js\";\r\nimport { discardDisposableCli } from \"./discard-disposable.js\";\r\nimport { autoCompleteWorkerCli } from \"./auto-complete.js\";\r\nimport { runDaemon } from \"./daemon.js\";\r\nimport { runDaemonKeeper, shouldRunDaemonKeeper } from \"./daemon-keeper.js\";\r\nimport { assertNativeDaemonAllowed } from \"./daemon-platform-guard.js\";\r\nimport { emitPlanProgress, verifyPlan } from \"./plan-progress.js\";\r\nimport { runHarnessVerifyCli } from \"./harness-verify-cli.js\";\r\nimport {\r\n runPlanOutboxDrain,\r\n runPlanOutboxList,\r\n runPlanPersist,\r\n} from \"./plan-persist-cli.js\";\r\nimport { runCleanupCli } from \"./cleanup-cli.js\";\r\nimport {\r\n monitorAutoCompleteCli,\r\n monitorListCli,\r\n monitorRunLoopCli,\r\n monitorStatusCli,\r\n monitorStopCli,\r\n monitorTickCli,\r\n startMonitorCli,\r\n} from \"./monitor/monitor-cli.js\";\r\nimport { handleCliVersionFlag } from \"./package-version.js\";\r\nimport {\r\n enforceMemoryCostPackageGuardAtStartup,\r\n shouldEnforceMemoryCostPackageGuardCli,\r\n} from \"./memory-cost-package-version-guard-enforce.js\";\r\nimport { reconcileRunsCli } from \"./stale-reconcile.js\";\r\nimport { resolveHarnessRunCli } from \"./run-resolve.js\";\r\nimport { postRestartUnblockCli } from \"./post-restart-unblock.js\";\r\nimport { runRuntimeTakeoverDoctorCli } from \"./doctor/runtime-takeover-cli.js\";\r\nimport { runEnsureDefaultRepoCli } from \"./default-repo-cli.js\";\r\nimport { runCommandCenterContractCli } from \"./command-center-contract-cli.js\";\r\nimport {\r\n runSchedulerAttestCutoverCli,\r\n runSchedulerCutoverCheckCli,\r\n} from \"./scheduler-cutover-cli.js\";\r\nimport { runCronStatusCli, runCronTickCli } from \"./cron/cron-tick-cli.js\";\r\nimport { runCronInstallCli, runCronVerifyCli } from \"./cron/cron-install-cli.js\";\r\nimport { runLaneTickCli } from \"./lane/lane-tick-cli.js\";\r\n\r\nfunction isHelpFlag(arg: string): boolean {\r\n return arg === \"help\" || arg === \"--help\" || arg === \"-h\";\r\n}\r\n\r\nfunction unknownCommand(scope?: string, action?: string): never {\r\n const cmd = [scope, action].filter(Boolean).join(\" \");\r\n console.error(`unknown command: ${cmd || \"(none)\"}`);\r\n usage(1);\r\n}\r\n\r\nexport function usage(code = 0): never {\r\n const out = code === 0 ? console.log : console.error;\r\n out(\r\n [\r\n \"Usage:\",\r\n \" kynver login [--api-key KEY] [--api-base-url URL] (omit --api-key to authorize in the browser)\",\r\n \" kynver bootstrap [--api-base-url URL] [--api-key KEY] [--repo PATH] (login + setup + runner credential in one shot)\",\r\n \" kynver start [--repo PATH] [--api-base-url URL] [--run RUN_ID] [--interval-ms MS] [--chat-oauth] (bring your agent online: bootstrap if needed + run + daemon; --chat-oauth lets delegated chat turns use your local Claude subscription)\",\r\n \" kynver runner credential [--agent-os-id ID] [--base-url URL]\",\r\n \" kynver setup [--api-base-url URL] [--agent-os-id ID] [--agent-os-slug SLUG] [--box-kind forge|ghost] [--repo PATH] [--discover-repo] [--max-workers N] [--provider claude|cursor] [--chat-oauth]\",\r\n \" kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS] [--stall-ms MS] [--no-supervise]\",\r\n \" kynver status --run RUN_ID [--blocked] [--running] [--task TASK_ID] [--worker WORKER] [--full] # top-level compact run status\",\r\n \" kynver run create [--repo /path/repo] [--name name] [--base origin/main]\",\r\n \" kynver run list\",\r\n \" kynver run resolve --name RUN_NAME\",\r\n \" kynver run status --run RUN_ID [--full] # defaults to compact shallow map with drill-down commands\",\r\n \" kynver run dispatch --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--execute] [--lane any|implementation|review|landing] [--target-task-id TASK_ID] [--executor harness] [--max-starts 1] [--lease-ms MS] [--owned path[,path]] [--model claude-opus-4-8] [--disk-path /] [--reconcile-stale-blockers]\",\r\n \" kynver run sweep --run RUN_ID --agent-os-id AOS_ID [--base-url URL] [--secret SECRET] [--grace-ms MS]\",\r\n \" kynver worker start --run RUN_ID --name worker --task \\\"...\\\" [--owned path[,path]] [--model MODEL] [--provider claude|cursor] [--agent-os-id AOS_ID] [--task-id TASK_ID] [--wait]\",\r\n \" kynver worker list --run RUN_ID [--full] # defaults to compact shallow map with drill-down commands\",\r\n \" kynver worker status --run RUN_ID --name worker\",\r\n \" kynver worker tail --run RUN_ID --name worker [--lines 40] [--raw]\",\r\n \" kynver worker stop --run RUN_ID --name worker\",\r\n \" kynver worker complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--task-id TASK_ID] [--base-url URL] [--secret SECRET]\",\r\n \" kynver worker discard-disposable --run RUN_ID --name worker --path scripts/helper.mjs[,other]\",\r\n \" kynver worker auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--poll-ms 5000] [--max-total-ms 21600000] [--complete-attempts 3] [--complete-backoff-ms 5000] [--base-url URL] [--secret SECRET]\",\r\n \" kynver run reconcile\",\r\n \" kynver run unblock [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET] [--dry-run]\",\r\n \" kynver plan progress --plan PLAN_ID --row ROW_KEY --role ROLE --status STATUS [--task TASK_ID] [--note NOTE] [--evidence type:value] [--agent-os-id AOS_ID]\",\r\n \" kynver plan verify --plan PLAN_ID [--worktree PATH] [--task TASK_ID] [--human-override] [--local]\",\r\n \" kynver harness verify --worktree PATH [--command CMD] [--json] [--wait-for-admission-ms MS] [--timeout-ms MS]\",\r\n \" kynver plan persist --operation create|add_version|update_metadata --title TITLE (--body-file PATH | --body TEXT) [--slug SLUG] [--plan PLAN_ID] [--summary TEXT] [--failure-kind approval_guard|auth|network|server|tool_interruption]\",\r\n \" kynver plan outbox list\",\r\n \" kynver plan outbox drain [--max N] [--id OUTBOX_ID]\",\r\n \" kynver cleanup [--execute] [--compact] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans] [--skip-finalize] [--account-bytes]\",\r\n \" --include-orphans also scans whole worktree directories (<harnessRoot>/worktrees/<runId>/<workerId>/) that no run/worker.json references; orphans pass salvage gates (recent heartbeat, dirty git, ahead of origin/main) before removal.\",\r\n \" Dry-run defaults to fast scan (no byte accounting). Pass --account-bytes for reclaimable byte totals. Pass --compact for a bounded operator summary (no full action list).\",\r\n \" kynver monitor start --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS]\",\r\n \" kynver monitor status [--run RUN_ID] [--name worker] [--tick]\",\r\n \" kynver monitor stop --run RUN_ID [--name worker]\",\r\n \" kynver monitor list\",\r\n \" kynver monitor tick --run RUN_ID [--name worker] [--agent-os-id AOS_ID] [--auto-complete] [--renew-leases]\",\r\n \" kynver monitor auto-complete --run RUN_ID --name worker [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET]\",\r\n \" kynver monitor run-loop --run RUN_ID --monitor-id ID [--name worker] [--agent-os-id AOS_ID] [--poll-ms MS] [--auto-complete] [--renew-leases]\",\r\n \" kynver config ensure-default-repo [--json]\",\r\n \" kynver doctor runtime-takeover [--remediate-default-repo]\",\r\n \" kynver scheduler cutover-check [--json]\",\r\n \" kynver scheduler attest-cutover [--json]\",\r\n \" kynver cron install [--dry-run] [--json] [--install-systemd] [--confirm-qstash-removal] [--skip-watchdog] [--skip-test-fire] [--agent-os-id ID] [--api-base-url URL] [--run RUN_ID]\",\r\n \" kynver cron verify [--json]\",\r\n \" kynver cron status [--json]\",\r\n \" kynver cron tick [--agent-os-id AOS_ID] [--json]\",\r\n \" kynver lane tick landing-maintainer [--fleet] [--repo OWNER/NAME] [--agent-os-id AOS_ID] [--execute] [--json]\",\r\n \" kynver board contract [--agent-os-id ID] [--base-url URL] [--since ISO] [--limit N]\",\r\n ].join(\"\\n\"),\r\n );\r\n process.exit(code);\r\n}\r\n\r\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\r\n if (handleCliVersionFlag(argv, import.meta.url, \"kynver\")) return;\r\n if (argv.length === 0 || isHelpFlag(argv[0]!)) return usage(0);\r\n\r\n const scope = argv.shift();\r\n let action: string | undefined;\r\n let rest: string[];\r\n\r\n if (\r\n scope === \"run\" ||\r\n scope === \"worker\" ||\r\n scope === \"plan\" ||\r\n scope === \"runner\" ||\r\n scope === \"harness\" ||\r\n scope === \"monitor\" ||\r\n scope === \"doctor\" ||\r\n scope === \"config\" ||\r\n scope === \"scheduler\" ||\r\n scope === \"cron\" ||\r\n scope === \"lane\" ||\r\n scope === \"board\"\r\n ) {\r\n action = argv.shift();\r\n rest = argv;\r\n } else {\r\n rest = argv;\r\n }\r\n\r\n if ((action && isHelpFlag(action)) || rest.some(isHelpFlag)) return usage(0);\r\n\r\n const args = parseArgs(rest);\r\n const { runsDir, worktreesDir } = getPaths();\r\n mkdirSync(runsDir, { recursive: true });\r\n mkdirSync(worktreesDir, { recursive: true });\r\n\r\n if (scope === \"daemon\") {\r\n assertNativeDaemonAllowed();\r\n }\r\n\r\n if (shouldEnforceMemoryCostPackageGuardCli(scope, action)) {\r\n let repoRoot: string | undefined;\r\n const runId = args.run ? String(args.run).trim() : \"\";\r\n if (runId) {\r\n try {\r\n repoRoot = loadRun(runId).repo;\r\n } catch {\r\n repoRoot = undefined;\r\n }\r\n }\r\n await enforceMemoryCostPackageGuardAtStartup({\r\n repoRoot,\r\n cwd: repoRoot,\r\n });\r\n }\r\n\r\n if (scope === \"login\") return void (await runLogin(args));\r\n if (scope === \"bootstrap\") return void (await runBootstrap(args));\r\n if (scope === \"start\") return void (await runStart(args));\r\n if (scope === \"status\") return runStatus(args);\r\n if (scope === \"runner\" && action === \"credential\") return void (await mintRunnerCredential(args));\r\n if (scope === \"setup\") return void (await runSetup(args));\r\n if (scope === \"daemon\") {\r\n // Supervised by DEFAULT: a keeper process respawns the daemon on exit\r\n // (crash/OOM) or heartbeat stall (hung loop). Opt out with --no-supervise\r\n // or KYNVER_DAEMON_SUPERVISED=0 when systemd/pm2 already owns restarts.\r\n // See daemon-keeper.ts.\r\n if (shouldRunDaemonKeeper(args)) {\r\n return void (await runDaemonKeeper(args));\r\n }\r\n return void (await runDaemon(args));\r\n }\r\n if (scope === \"plan\" && action === \"progress\") return void (await emitPlanProgress(args));\r\n if (scope === \"plan\" && action === \"verify\") return void (await verifyPlan(args));\r\n if (scope === \"harness\" && action === \"verify\") return runHarnessVerifyCli(args);\r\n if (scope === \"plan\" && action === \"persist\") return void (await runPlanPersist(args));\r\n if (scope === \"plan\" && action === \"outbox\") {\r\n const outboxAction = rest.shift();\r\n if (outboxAction === \"list\") return void (await runPlanOutboxList());\r\n if (outboxAction === \"drain\") return void (await runPlanOutboxDrain(parseArgs(rest)));\r\n unknownCommand(\"plan\", `outbox ${outboxAction ?? \"\"}`.trim());\r\n }\r\n if (scope === \"cleanup\") return runCleanupCli(args);\r\n if (scope === \"config\" && action === \"ensure-default-repo\") {\r\n return runEnsureDefaultRepoCli(args.json === true);\r\n }\r\n if (scope === \"doctor\" && action === \"runtime-takeover\") return runRuntimeTakeoverDoctorCli(args);\r\n if (scope === \"scheduler\" && action === \"cutover-check\") {\r\n return runSchedulerCutoverCheckCli(args.json === true);\r\n }\r\n if (scope === \"scheduler\" && action === \"attest-cutover\") {\r\n return runSchedulerAttestCutoverCli(args.json === true);\r\n }\r\n if (scope === \"cron\" && action === \"install\") {\r\n return void (await runCronInstallCli(args));\r\n }\r\n if (scope === \"cron\" && action === \"verify\") {\r\n return void (await runCronVerifyCli(args));\r\n }\r\n if (scope === \"cron\" && action === \"status\") {\r\n return void (await runCronStatusCli(args.json === true));\r\n }\r\n if (scope === \"cron\" && action === \"tick\") {\r\n return void (await runCronTickCli(args));\r\n }\r\n if (scope === \"lane\" && action === \"tick\") {\r\n const laneName = rest.shift();\r\n return void (await runLaneTickCli(parseArgs(rest), laneName));\r\n }\r\n if (scope === \"board\" && action === \"contract\") {\r\n return void (await runCommandCenterContractCli(args));\r\n }\r\n\r\n if (scope === \"run\" && action === \"create\") return void createRun(args);\r\n if (scope === \"run\" && action === \"list\") return listRuns();\r\n if (scope === \"run\" && action === \"resolve\") return resolveHarnessRunCli(args);\r\n if (scope === \"run\" && action === \"status\") return runStatus(args);\r\n if (scope === \"run\" && action === \"dispatch\") return void (await dispatchRun(args));\r\n if (scope === \"run\" && action === \"sweep\") return void (await sweepRun(args));\r\n if (scope === \"run\" && action === \"reconcile\") return reconcileRunsCli();\r\n if (scope === \"run\" && action === \"unblock\") return void (await postRestartUnblockCli(args));\r\n if (scope === \"worker\" && action === \"start\") return void (await startWorker(args));\r\n if (scope === \"worker\" && action === \"list\") return workerList(args);\r\n if (scope === \"worker\" && action === \"status\") return workerStatus(args);\r\n if (scope === \"worker\" && action === \"tail\") return tailWorker(args);\r\n if (scope === \"worker\" && action === \"stop\") return stopWorker(args);\r\n if (scope === \"worker\" && action === \"complete\") return void (await completeWorker(args));\r\n if (scope === \"worker\" && action === \"discard-disposable\") return discardDisposableCli(args);\r\n if (scope === \"worker\" && action === \"auto-complete\") return void (await autoCompleteWorkerCli(args));\r\n\r\n if (scope === \"monitor\" && action === \"start\") {\r\n const result = await startMonitorCli(args);\r\n console.log(JSON.stringify(result, null, 2));\r\n return;\r\n }\r\n if (scope === \"monitor\" && action === \"status\") return void (await monitorStatusCli(args));\r\n if (scope === \"monitor\" && action === \"stop\") return monitorStopCli(args);\r\n if (scope === \"monitor\" && action === \"list\") return monitorListCli();\r\n if (scope === \"monitor\" && action === \"tick\") return void (await monitorTickCli(args));\r\n if (scope === \"monitor\" && action === \"auto-complete\") return void (await monitorAutoCompleteCli(args));\r\n if (scope === \"monitor\" && action === \"run-loop\") return void (await monitorRunLoopCli(args));\r\n\r\n unknownCommand(scope, action);\r\n}\r\n\r\nconst isCliEntry =\r\n process.argv[1] &&\r\n realpathSync.native(process.argv[1]) === realpathSync.native(fileURLToPath(import.meta.url));\r\n\r\nif (isCliEntry) {\r\n void main().catch((error) => {\r\n console.error(error);\r\n process.exit(1);\r\n });\r\n}\r\n", "// `kynver bootstrap` \u2014 one-shot onboarding for a fresh machine.\r\n//\r\n// Chains: ensure login (device flow unless --api-key) \u2192 resolve the account's\r\n// primary AgentOS workspace \u2192 `kynver setup` (persists config + mints a scoped\r\n// runner credential). Leaves the machine linked and configured. It does NOT\r\n// start autonomous work \u2014 bringing workers online is the `kynver daemon` / run\r\n// flow, surfaced as a clear next step.\r\n\r\nimport os from \"node:os\";\r\nimport { loadApiKey, saveApiKey, loadUserConfig, runSetup } from \"./config.js\";\r\nimport { trimTrailingSlash } from \"./util.js\";\r\nimport { runDeviceLogin } from \"./device-login.js\";\r\n\r\nfunction resolveBootstrapBaseUrl(args: Record<string, string | boolean>): string | undefined {\r\n const raw =\r\n (typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : undefined) ||\r\n (typeof args.baseUrl === \"string\" ? args.baseUrl : undefined) ||\r\n process.env.KYNVER_API_URL ||\r\n loadUserConfig().apiBaseUrl;\r\n return raw ? trimTrailingSlash(String(raw)) : undefined;\r\n}\r\n\r\ninterface PrimaryAgentOs {\r\n id: string;\r\n slug: string;\r\n}\r\n\r\n/** Resolve the account's primary AgentOS workspace (id + slug) via GET /api/agent-os. */\r\nasync function fetchPrimaryAgentOs(base: string, apiKey: string): Promise<PrimaryAgentOs | null> {\r\n const res = await fetch(`${base}/api/agent-os`, {\r\n headers: { Authorization: `Bearer ${apiKey}` },\r\n });\r\n if (!res.ok) return null;\r\n const body = (await res.json().catch(() => null)) as {\r\n items?: Array<{ id?: string; slug?: string }>;\r\n primarySlug?: string;\r\n } | null;\r\n if (!body?.primarySlug) return null;\r\n const match = body.items?.find((it) => it.slug === body.primarySlug);\r\n if (match?.id && match.slug) return { id: match.id, slug: match.slug };\r\n // primarySlug known but no matching item id \u2014 return slug only (setup can still use the slug)\r\n return { id: \"\", slug: body.primarySlug };\r\n}\r\n\r\nexport async function runBootstrap(args: Record<string, string | boolean>): Promise<void> {\r\n const base = resolveBootstrapBaseUrl(args);\r\n if (!base) {\r\n console.error(\r\n \"kynver bootstrap requires a Kynver URL \u2014 pass --api-base-url https://your-kynver-site or set KYNVER_API_URL.\",\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // 1. Ensure we have an API key (device flow unless one is provided/stored).\r\n if (!loadApiKey()) {\r\n if (typeof args.apiKey === \"string\") {\r\n saveApiKey(args.apiKey);\r\n } else {\r\n const login = await runDeviceLogin({ ...args, apiBaseUrl: base });\r\n if (!login.ok) process.exit(1);\r\n }\r\n }\r\n const apiKey = loadApiKey();\r\n if (!apiKey) {\r\n console.error(\"No API key after login \u2014 aborting.\");\r\n process.exit(1);\r\n }\r\n\r\n // 2. Resolve the account's primary workspace.\r\n const primary = await fetchPrimaryAgentOs(base, apiKey);\r\n if (!primary) {\r\n console.error(\r\n \"Could not resolve your AgentOS workspace from the account. Confirm this account has AgentOS access, then retry.\",\r\n );\r\n process.exit(1);\r\n }\r\n\r\n // 3. Configure the machine + mint a scoped runner credential (runSetup does both).\r\n const setupArgs: Record<string, string | boolean> = {\r\n ...args,\r\n apiBaseUrl: base,\r\n agentOsSlug: primary.slug,\r\n ...(primary.id ? { agentOsId: primary.id } : {}),\r\n // Best-effort repo discovery unless the caller pinned one.\r\n ...(typeof args.repo === \"string\" ? {} : { discoverRepo: true }),\r\n };\r\n await runSetup(setupArgs);\r\n\r\n console.log(\"\");\r\n console.log(` Bootstrap complete \u2014 ${os.hostname()} is linked to workspace \"${primary.slug}\".`);\r\n console.log(\" Next: bring your agent online with `kynver start`.\");\r\n console.log(\" (Advanced: `kynver run create --repo /path/to/repo` + `kynver daemon --run <RUN_ID> --agent-os-id <AOS_ID> --execute`.)\");\r\n}\r\n", "// `kynver start` \u2014 the consumer \"bring my agent online\" verb (gateway plan).\r\n//\r\n// One command from a fresh machine to a live agent:\r\n// 1. Not linked yet \u2192 run the full `bootstrap` chain (device login \u2192 setup \u2192\r\n// runner credential), which resolves the workspace + repo.\r\n// 2. Reuse the newest non-terminal run for the configured repo, or create one.\r\n// 3. Hand off to the daemon (executes work; Ctrl-C to stop).\r\n//\r\n// Power users keep the explicit `run create` + `daemon --run \u2026` flow; `start`\r\n// only wraps it with sensible defaults.\r\n\r\nimport os from \"node:os\";\r\nimport { loadApiKey, loadUserConfig, saveUserConfig } from \"./config.js\";\r\nimport { runBootstrap } from \"./bootstrap.js\";\r\nimport { runDaemon } from \"./daemon.js\";\r\nimport { runDaemonKeeper, shouldRunDaemonKeeper } from \"./daemon-keeper.js\";\r\nimport { assertNativeDaemonAllowed } from \"./daemon-platform-guard.js\";\r\nimport { createRun } from \"./worktree.js\";\r\nimport { listRunRecords, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { resolveDefaultRepo } from \"./default-repo.js\";\r\nimport { TERMINAL_RUN_STATUSES } from \"./finalize.js\";\r\n\r\n/**\r\n * Pick the run `start` should attach the daemon to: the newest non-terminal\r\n * run whose repo matches. Returns null when none exists (create one).\r\n */\r\nexport function resolveStartRunId(runs: HarnessRunRecord[], repo: string): string | null {\r\n const candidates = runs\r\n .filter((r) => r.repo === repo && !TERMINAL_RUN_STATUSES.has(r.status))\r\n .sort((a, b) => (b.createdAt ?? \"\").localeCompare(a.createdAt ?? \"\"));\r\n return candidates[0]?.id ?? null;\r\n}\r\n\r\nexport async function runStart(args: Record<string, string | boolean>): Promise<void> {\r\n assertNativeDaemonAllowed();\r\n\r\n // 1. Link + configure the machine when it isn't yet (first run on a fresh\r\n // box). Bootstrap exits the process itself on failure.\r\n let config = loadUserConfig();\r\n if (!loadApiKey() || !config.agentOsId?.trim()) {\r\n console.log(\" This machine isn't linked yet \u2014 running bootstrap first.\");\r\n await runBootstrap(args);\r\n config = loadUserConfig();\r\n }\r\n\r\n const agentOsId =\r\n (typeof args.agentOsId === \"string\" ? args.agentOsId.trim() : \"\") ||\r\n config.agentOsId?.trim() ||\r\n \"\";\r\n if (!agentOsId) {\r\n console.error(\"No AgentOS workspace configured \u2014 run `kynver bootstrap` (or pass --agent-os-id).\");\r\n process.exit(1);\r\n }\r\n\r\n // Persist the Claude-OAuth chat opt-in when passed (one-time consent;\r\n // delegated chat turns may then use the local Claude Code token).\r\n if (args.chatOauth === true && config.chatUseClaudeOauth !== true) {\r\n saveUserConfig({ ...config, chatUseClaudeOauth: true });\r\n config = loadUserConfig();\r\n console.log(\" Chat: Claude Code OAuth opt-in saved (delegated turns may use your local subscription).\");\r\n }\r\n\r\n const repo =\r\n (typeof args.repo === \"string\" ? args.repo.trim() : \"\") ||\r\n config.defaultRepo?.trim() ||\r\n resolveDefaultRepo()?.repo ||\r\n \"\";\r\n if (!repo) {\r\n console.error(\"No repo configured \u2014 pass --repo /path/to/repo or run `kynver setup --discover-repo`.\");\r\n process.exit(1);\r\n }\r\n\r\n // 2. Attach to an existing run for this repo, or create one.\r\n let runId = typeof args.run === \"string\" && args.run.trim() ? args.run.trim() : \"\";\r\n if (!runId) {\r\n runId = resolveStartRunId(listRunRecords(), repo) ?? \"\";\r\n if (runId) {\r\n console.log(` Reusing run ${runId} for ${repo}.`);\r\n } else {\r\n runId = createRun({ ...args, repo, name: \"agent\" }).runId;\r\n }\r\n }\r\n\r\n console.log(\"\");\r\n console.log(` ${os.hostname()} \u2014 agent coming online`);\r\n console.log(` workspace: ${agentOsId}`);\r\n console.log(` repo: ${repo}`);\r\n console.log(` run: ${runId}`);\r\n console.log(\" Ctrl-C stops the agent. (Advanced control: `kynver daemon --help`.)\");\r\n console.log(\"\");\r\n\r\n // 3. Daemon owns the loop from here (execute defaults to on; pass\r\n // --execute false for a dry observation loop). Route through the keeper \u2014\r\n // supervision is the default for `kynver daemon`, and the consumer\r\n // entrypoint must not be the one place agents run unsupervised. The keeper\r\n // child re-invokes `kynver daemon` directly (run/workspace are resolved by\r\n // then), so a respawn never re-runs bootstrap/run-create.\r\n const daemonArgs = { ...args, run: runId, agentOsId };\r\n if (shouldRunDaemonKeeper(daemonArgs)) {\r\n await runDaemonKeeper(daemonArgs, buildStartDaemonArgv(runId, agentOsId, args));\r\n return;\r\n }\r\n await runDaemon(daemonArgs);\r\n}\r\n\r\n/**\r\n * The argv the keeper child re-invokes with: an explicit `kynver daemon`\r\n * command (NOT `start` \u2014 the child must skip bootstrap/run resolution and\r\n * just run the loop). Forwards the daemon-relevant flags `start` accepts.\r\n */\r\nexport function buildStartDaemonArgv(\r\n runId: string,\r\n agentOsId: string,\r\n args: Record<string, string | boolean>,\r\n): string[] {\r\n const argv = [\"daemon\", \"--run\", runId, \"--agent-os-id\", agentOsId];\r\n if (typeof args.intervalMs === \"string\" && args.intervalMs.trim()) {\r\n argv.push(\"--interval-ms\", args.intervalMs.trim());\r\n }\r\n if (args.execute === false || args.execute === \"false\") {\r\n argv.push(\"--execute\", \"false\");\r\n }\r\n if (typeof args.stallMs === \"string\" && args.stallMs.trim()) {\r\n argv.push(\"--stall-ms\", args.stallMs.trim());\r\n }\r\n return argv;\r\n}\r\n", "import { loadUserConfig, tryResolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { validateDaemonInstallIdentity } from \"./daemon-box-identity.js\";\r\nimport { writeDaemonHeartbeat } from \"./daemon-heartbeat.js\";\r\nimport { assertNativeDaemonAllowed } from \"./daemon-platform-guard.js\";\r\nimport { runKynverCronTick } from \"./cron/cron-tick.js\";\r\nimport { resolveKynverCronEnv } from \"./cron/cron-env.js\";\r\nimport { required, sleepMsAsync } from \"./util.js\";\r\nimport { runPipelineTick } from \"./pipeline-tick.js\";\r\nimport { runChatClaimLoop } from \"./chat/chat-claim-loop.js\";\r\n\r\nconst DEFAULT_INTERVAL_MS = 60_000;\r\nconst IDLE_INTERVAL_MS = 5 * 60_000;\r\nconst MAX_IDLE_STREAK = 10;\r\nconst SLEEP_POLL_MS = 250;\r\n\r\nasync function awaitDaemonBackoff(ms: number, isStopping: () => boolean): Promise<void> {\r\n let remaining = ms;\r\n while (remaining > 0 && !isStopping()) {\r\n const step = Math.min(SLEEP_POLL_MS, remaining);\r\n await sleepMsAsync(step);\r\n remaining -= step;\r\n }\r\n}\r\n\r\nexport async function runDaemon(args: Record<string, string | boolean>): Promise<void> {\r\n assertNativeDaemonAllowed();\r\n\r\n const runId = String(required(String(args.run || \"\"), \"--run\"));\r\n const agentOsId = String(required(String(args.agentOsId || loadUserConfig().agentOsId || \"\"), \"--agent-os-id\"));\r\n const execute = args.execute !== false && args.execute !== \"false\";\r\n const intervalMs = Number(args.intervalMs) > 0 ? Math.floor(Number(args.intervalMs)) : DEFAULT_INTERVAL_MS;\r\n let stopping = false;\r\n let idleStreak = 0;\r\n\r\n process.on(\"SIGINT\", () => {\r\n stopping = true;\r\n });\r\n process.on(\"SIGTERM\", () => {\r\n stopping = true;\r\n });\r\n\r\n const identity = validateDaemonInstallIdentity(loadUserConfig());\r\n if (!identity.ok) {\r\n console.error(\r\n JSON.stringify({\r\n event: \"daemon_start_blocked\",\r\n runId,\r\n agentOsId,\r\n errors: identity.errors,\r\n }),\r\n );\r\n process.exit(1);\r\n }\r\n\r\n console.error(\r\n JSON.stringify({\r\n event: \"daemon_start\",\r\n runId,\r\n agentOsId,\r\n execute,\r\n intervalMs,\r\n boxKind: identity.box.boxKind,\r\n workerCapSource: identity.workerCapSource,\r\n maxConcurrentWorkers: identity.maxConcurrentWorkers,\r\n }),\r\n );\r\n\r\n const cronEnv = resolveKynverCronEnv();\r\n\r\n // M5.4: runtime-delegated chat \u2014 park a long-poll claim on the bridge so\r\n // this box can serve the owner's chat turns on local credentials. No-op\r\n // unless KYNVER_RUNTIME_CHAT_BRIDGE_URL is configured. Runs alongside the\r\n // pipeline tick loop and stops with it; its own errors back off internally\r\n // and can never take the daemon down.\r\n const chatLoop = runChatClaimLoop({ shouldStop: () => stopping }).catch((err) => {\r\n console.error(\r\n JSON.stringify({\r\n event: \"chat_claim_loop_crashed\",\r\n error: err instanceof Error ? err.message : String(err),\r\n }),\r\n );\r\n });\r\n\r\n let credentialMissingLogged = false;\r\n\r\n while (!stopping) {\r\n try {\r\n // Keeper liveness signal \u2014 written every iteration so a hung tick or\r\n // dead loop is distinguishable from a slow one (`kynver daemon\r\n // --supervised` restarts the loop when this goes stale).\r\n writeDaemonHeartbeat({ agentOsId, runId });\r\n\r\n // Runner-credential preflight: the tick path hard-exits the process\r\n // when no secret can be resolved/minted, which under the keeper became\r\n // a silent crash loop that also killed the chat claim loop. Degrade\r\n // instead: skip pipeline/cron ticks with a clear remedy and retry next\r\n // iteration (auto-heals once the credential exists); chat delegation\r\n // keeps running on the account API key throughout.\r\n const credential = await tryResolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n );\r\n if (!credential.ok) {\r\n if (!credentialMissingLogged) {\r\n credentialMissingLogged = true;\r\n console.error(\r\n JSON.stringify({\r\n event: \"daemon_runner_credential_missing\",\r\n agentOsId,\r\n reason: credential.reason,\r\n remedy: `run \\`kynver runner credential --agent-os-id ${agentOsId}\\` (or \\`kynver bootstrap\\`); ticks resume automatically once the credential exists`,\r\n }),\r\n );\r\n }\r\n await awaitDaemonBackoff(intervalMs, () => stopping);\r\n continue;\r\n }\r\n if (credentialMissingLogged) {\r\n credentialMissingLogged = false;\r\n console.error(JSON.stringify({ event: \"daemon_runner_credential_recovered\", agentOsId }));\r\n }\r\n\r\n if (cronEnv.tickEnabled) {\r\n const cronTick = await runKynverCronTick({\r\n env: cronEnv,\r\n agentOsIdFilter: agentOsId,\r\n });\r\n if (cronTick.enabled && (cronTick.fired > 0 || cronTick.errors > 0)) {\r\n console.error(JSON.stringify({ event: \"daemon_cron_tick\", ...cronTick }));\r\n }\r\n }\r\n\r\n const tick = await runPipelineTick({ run: runId, agentOsId, execute, ...args });\r\n console.error(JSON.stringify({ event: \"daemon_tick\", ...tick }));\r\n\r\n if (tick.idle) {\r\n idleStreak++;\r\n } else {\r\n idleStreak = 0;\r\n }\r\n\r\n const backoff = idleStreak >= MAX_IDLE_STREAK ? IDLE_INTERVAL_MS : intervalMs;\r\n await awaitDaemonBackoff(backoff, () => stopping);\r\n } catch (error) {\r\n console.error(JSON.stringify({ event: \"daemon_tick_error\", error: (error as Error).message }));\r\n await awaitDaemonBackoff(intervalMs, () => stopping);\r\n }\r\n }\r\n\r\n await chatLoop;\r\n console.error(JSON.stringify({ event: \"daemon_stop\", runId, agentOsId }));\r\n}\r\n\r\nexport { runPipelineTick } from \"./pipeline-tick.js\";\r\nexport { dispatchRun } from \"./dispatch.js\";\r\nexport { sweepRun } from \"./sweep.js\";\r\nexport { completeWorker } from \"./worker-ops.js\";\r\n", "import { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { resolveBoxIdentity, type ResolvedBoxIdentity } from \"./box-identity.js\";\r\nimport { resolveWorkerCap } from \"./worker-cap-source.js\";\r\nimport os from \"node:os\";\r\n\r\nexport interface DaemonInstallValidation {\r\n ok: boolean;\r\n box: ResolvedBoxIdentity;\r\n workerCapSource: string;\r\n maxConcurrentWorkers: number;\r\n autoCap: number;\r\n warnings: string[];\r\n errors: string[];\r\n}\r\n\r\nfunction emitDaemonIdentityMessage(level: \"warn\" | \"error\", message: string): void {\r\n console.error(JSON.stringify({ event: \"daemon_identity\", level, message }));\r\n}\r\n\r\n/**\r\n * Validate box identity and worker-cap provenance before the daemon loop runs.\r\n * Loud warnings prevent Forge hosts from silently inheriting Ghost workspace slugs.\r\n */\r\nexport function validateDaemonInstallIdentity(\r\n config: KynverUserConfig = loadUserConfig(),\r\n env: NodeJS.ProcessEnv = process.env,\r\n): DaemonInstallValidation {\r\n const box = resolveBoxIdentity(env, config);\r\n const cap = resolveWorkerCap({\r\n config,\r\n totalMemBytes: os.totalmem(),\r\n env,\r\n });\r\n const warnings = [...box.warnings];\r\n const errors: string[] = [];\r\n\r\n if (!config.boxKind?.trim() && !env.KYNVER_BOX_KIND?.trim()) {\r\n warnings.push(\r\n \"boxKind is not persisted in ~/.kynver/config.json \u2014 run `kynver setup --box-kind forge|ghost` so Command Center attributes snapshots to the correct pool\",\r\n );\r\n }\r\n\r\n if (box.slugInferenceBlocked) {\r\n const strict = env.KYNVER_DAEMON_STRICT_IDENTITY === \"1\" || env.KYNVER_DAEMON_STRICT_IDENTITY === \"true\";\r\n const msg =\r\n \"ambiguous box identity: KYNVER_AGENT_OS_SLUG is set without KYNVER_BOX_KIND or config.boxKind; treating this host as forge\";\r\n if (strict) errors.push(msg);\r\n else warnings.push(msg);\r\n }\r\n\r\n const ok = errors.length === 0;\r\n for (const warning of warnings) emitDaemonIdentityMessage(\"warn\", warning);\r\n for (const error of errors) emitDaemonIdentityMessage(\"error\", error);\r\n\r\n return {\r\n ok,\r\n box,\r\n workerCapSource: cap.workerCapSource,\r\n maxConcurrentWorkers: cap.configuredMaxWorkers ?? cap.autoCap,\r\n autoCap: cap.autoCap,\r\n warnings,\r\n errors,\r\n };\r\n}\r\n", "// Daemon liveness heartbeat file \u2014 the keeper's hang/OOM detection signal.\r\n//\r\n// The daemon loop writes this every iteration; the keeper (daemon-keeper.ts)\r\n// restarts the child when the file goes stale (hung event loop, deadlocked\r\n// tick) or the process exits (crash, OOM kill). File-based so the two\r\n// processes need no IPC channel and the signal survives keeper restarts.\r\n\r\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nexport interface DaemonHeartbeat {\r\n observedAt: string;\r\n pid: number;\r\n runId: string;\r\n agentOsId: string;\r\n}\r\n\r\nexport function daemonHeartbeatPath(agentOsId: string): string {\r\n const safe = agentOsId.replace(/[^A-Za-z0-9_-]/g, \"_\");\r\n return path.join(homedir(), \".kynver\", `daemon-heartbeat-${safe}.json`);\r\n}\r\n\r\n/** Best-effort atomic write (temp + rename). Never throws. */\r\nexport function writeDaemonHeartbeat(input: {\r\n agentOsId: string;\r\n runId: string;\r\n now?: Date;\r\n}): void {\r\n try {\r\n const file = daemonHeartbeatPath(input.agentOsId);\r\n mkdirSync(path.dirname(file), { recursive: true });\r\n const beat: DaemonHeartbeat = {\r\n observedAt: (input.now ?? new Date()).toISOString(),\r\n pid: process.pid,\r\n runId: input.runId,\r\n agentOsId: input.agentOsId,\r\n };\r\n const tmp = `${file}.tmp-${process.pid}`;\r\n writeFileSync(tmp, JSON.stringify(beat), \"utf8\");\r\n renameSync(tmp, file);\r\n } catch {\r\n // Heartbeat is advisory \u2014 a write failure must never take the daemon down.\r\n }\r\n}\r\n\r\nexport function readDaemonHeartbeat(agentOsId: string): DaemonHeartbeat | null {\r\n try {\r\n const raw = readFileSync(daemonHeartbeatPath(agentOsId), \"utf8\");\r\n const parsed = JSON.parse(raw) as DaemonHeartbeat;\r\n if (typeof parsed?.observedAt !== \"string\") return null;\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * True when the heartbeat indicates a hung daemon. A missing heartbeat is NOT\r\n * stale \u2014 a freshly spawned child has not written one yet; the keeper grants a\r\n * startup grace window instead.\r\n */\r\nexport function isDaemonHeartbeatStale(\r\n beat: DaemonHeartbeat | null,\r\n stallMs: number,\r\n nowMs = Date.now(),\r\n): boolean {\r\n if (!beat) return false;\r\n const observed = Date.parse(beat.observedAt);\r\n if (Number.isNaN(observed)) return true;\r\n return nowMs - observed > stallMs;\r\n}\r\n", "function envFlag(name: string): boolean {\r\n const raw = process.env[name]?.trim().toLowerCase();\r\n return raw === \"1\" || raw === \"true\" || raw === \"yes\" || raw === \"on\";\r\n}\r\n\r\n/** Block native Windows daemon unless explicitly overridden (console flash swarm). */\r\nexport function assertNativeDaemonAllowed(): void {\r\n if (process.platform !== \"win32\") return;\r\n if (envFlag(\"KYNVER_DAEMON_ALLOW_NATIVE_WINDOWS\")) return;\r\n\r\n console.error(\r\n JSON.stringify({\r\n event: \"daemon_start_blocked\",\r\n reason: \"native_windows_console_flash\",\r\n remedy:\r\n \"Run the daemon inside WSL: .\\\\scripts\\\\start-tier2-wsl.ps1 \u2014 or set KYNVER_DAEMON_ALLOW_NATIVE_WINDOWS=1 to override (flashes visible consoles).\",\r\n }),\r\n );\r\n process.exit(1);\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { loadUserConfig } from \"../config.js\";\r\n\r\nexport interface KynverCronEnv {\r\n storePath: string;\r\n statePath: string;\r\n lockPath: string;\r\n fireBaseUrl: string | null;\r\n secret: string | null;\r\n tickEnabled: boolean;\r\n tickIntervalMs: number;\r\n missedRunPolicy: \"catch_up\" | \"skip\";\r\n maxCatchUpPerTick: number;\r\n maxRetries: number;\r\n retryBackoffMs: number;\r\n inflightLeaseMs: number;\r\n}\r\n\r\nfunction envFlag(name: string, defaultValue: boolean): boolean {\r\n const raw = process.env[name]?.trim().toLowerCase();\r\n if (!raw) return defaultValue;\r\n if (raw === \"0\" || raw === \"false\" || raw === \"no\" || raw === \"off\") return false;\r\n if (raw === \"1\" || raw === \"true\" || raw === \"yes\" || raw === \"on\") return true;\r\n return defaultValue;\r\n}\r\n\r\nfunction envInt(name: string, fallback: number, min = 1): number {\r\n const n = Number(process.env[name]);\r\n if (!Number.isFinite(n) || n < min) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nexport function defaultKynverCronStorePath(): string {\r\n const explicit =\r\n process.env.KYNVER_CRON_STORE_PATH?.trim() ||\r\n process.env.OPENCLAW_CRON_STORE_PATH?.trim();\r\n if (explicit) return explicit;\r\n return path.join(homedir(), \".kynver\", \"agent-os-cron.json\");\r\n}\r\n\r\nexport function defaultKynverCronStatePath(storePath = defaultKynverCronStorePath()): string {\r\n const explicit = process.env.KYNVER_CRON_TICK_STATE_PATH?.trim();\r\n if (explicit) return explicit;\r\n return `${storePath.replace(/\\.json$/i, \"\")}.tick-state.json`;\r\n}\r\n\r\nexport function resolveKynverCronFireBaseUrl(): string | null {\r\n const config = loadUserConfig();\r\n return (\r\n process.env.KYNVER_API_URL?.trim() ||\r\n config.apiBaseUrl?.trim() ||\r\n process.env.KYNVER_CRON_FIRE_BASE_URL?.trim() ||\r\n process.env.OPENCLAW_CRON_FIRE_BASE_URL?.trim() ||\r\n null\r\n );\r\n}\r\n\r\nexport function resolveKynverCronSecret(): string | null {\r\n return (\r\n process.env.KYNVER_CRON_SECRET?.trim() ||\r\n process.env.OPENCLAW_CRON_SECRET?.trim() ||\r\n process.env.KYNVER_RUNTIME_SECRET?.trim() ||\r\n null\r\n );\r\n}\r\n\r\n/** Whether the connected-box daemon should run the local cron tick loop. */\r\nexport function resolveKynverCronEnv(): KynverCronEnv {\r\n const storePath = defaultKynverCronStorePath();\r\n const statePath = defaultKynverCronStatePath(storePath);\r\n const fireBaseUrl = resolveKynverCronFireBaseUrl();\r\n const secret = resolveKynverCronSecret();\r\n const credsReady = Boolean(fireBaseUrl && secret);\r\n const storeExists = existsSync(storePath);\r\n const defaultEnabled = credsReady && (storeExists || envFlag(\"KYNVER_CRON_TICK_FORCE\", false));\r\n\r\n return {\r\n storePath,\r\n statePath,\r\n lockPath: `${statePath}.lock`,\r\n fireBaseUrl,\r\n secret,\r\n tickEnabled: envFlag(\"KYNVER_CRON_TICK_ENABLED\", defaultEnabled),\r\n tickIntervalMs: envInt(\"KYNVER_CRON_TICK_INTERVAL_MS\", 60_000, 5_000),\r\n missedRunPolicy:\r\n process.env.KYNVER_CRON_MISSED_RUN_POLICY?.trim().toLowerCase() === \"skip\"\r\n ? \"skip\"\r\n : \"catch_up\",\r\n maxCatchUpPerTick: envInt(\"KYNVER_CRON_MAX_CATCH_UP_PER_TICK\", 3, 0),\r\n maxRetries: envInt(\"KYNVER_CRON_MAX_RETRIES\", 3, 0),\r\n retryBackoffMs: envInt(\"KYNVER_CRON_RETRY_BACKOFF_MS\", 60_000, 1_000),\r\n inflightLeaseMs: envInt(\"KYNVER_CRON_INFLIGHT_LEASE_MS\", 120_000, 5_000),\r\n };\r\n}\r\n\r\nexport function isKynverCronDaemonPrimary(env: KynverCronEnv = resolveKynverCronEnv()): boolean {\r\n return env.tickEnabled && Boolean(env.fireBaseUrl && env.secret);\r\n}\r\n", "import type { CronFireResult, CronRegisteredJob } from \"./cron-types.js\";\r\nimport { buildHarnessCallbackHeaders } from \"../callback-headers.js\";\r\n\r\nfunction trimTrailingSlash(url: string): string {\r\n return url.replace(/\\/+$/, \"\");\r\n}\r\n\r\nexport async function fireKynverCronJob(input: {\r\n entry: CronRegisteredJob;\r\n baseUrl: string;\r\n secret: string;\r\n jobId?: string | null;\r\n fetchFn?: typeof fetch;\r\n}): Promise<CronFireResult> {\r\n const doFetch = input.fetchFn ?? fetch;\r\n const callbackPath = input.entry.spec.callbackPath.startsWith(\"/\")\r\n ? input.entry.spec.callbackPath\r\n : `/${input.entry.spec.callbackPath}`;\r\n const url = `${trimTrailingSlash(input.baseUrl)}${callbackPath}`;\r\n const jobId = input.jobId ?? input.entry.spec.dedupeKey ?? null;\r\n\r\n const body = {\r\n source: \"kynver-cron\",\r\n jobId,\r\n agentOsId: input.entry.spec.target.agentOsId,\r\n kind: input.entry.spec.kind,\r\n target: input.entry.spec.target,\r\n ...(input.entry.spec.payload !== undefined && { payload: input.entry.spec.payload }),\r\n };\r\n\r\n const res = await doFetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(input.secret),\r\n body: JSON.stringify(body),\r\n });\r\n\r\n let parsed: unknown = null;\r\n try {\r\n parsed = await res.json();\r\n } catch {\r\n parsed = null;\r\n }\r\n\r\n return { ok: res.ok, status: res.status, body: parsed };\r\n}\r\n", "import { closeSync, existsSync, openSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\r\nimport { isPidAlive } from \"../util.js\";\r\n\r\nexport interface CronTickLockInfo {\r\n pid: number;\r\n at: string;\r\n}\r\n\r\nconst STALE_LOCK_MS = 10 * 60_000;\r\n\r\nfunction readLockInfo(lockPath: string): CronTickLockInfo | null {\r\n if (!existsSync(lockPath)) return null;\r\n try {\r\n const parsed = JSON.parse(readFileSync(lockPath, \"utf8\")) as CronTickLockInfo;\r\n if (typeof parsed.pid === \"number\" && typeof parsed.at === \"string\") return parsed;\r\n } catch {\r\n return null;\r\n }\r\n return null;\r\n}\r\n\r\nfunction lockIsStale(lockPath: string): boolean {\r\n const info = readLockInfo(lockPath);\r\n if (!info) return true;\r\n if (!isPidAlive(info.pid)) return true;\r\n const atMs = Date.parse(info.at);\r\n if (Number.isNaN(atMs)) return true;\r\n return Date.now() - atMs > STALE_LOCK_MS;\r\n}\r\n\r\nexport function tryAcquireCronTickLock(lockPath: string): { acquired: boolean; reason?: string } {\r\n if (existsSync(lockPath) && !lockIsStale(lockPath)) {\r\n const info = readLockInfo(lockPath);\r\n return {\r\n acquired: false,\r\n reason: info ? `held by pid ${info.pid}` : \"held by another process\",\r\n };\r\n }\r\n if (existsSync(lockPath)) {\r\n try {\r\n unlinkSync(lockPath);\r\n } catch {\r\n /* best-effort reclaim */\r\n }\r\n }\r\n try {\r\n const fd = openSync(lockPath, \"wx\");\r\n writeFileSync(\r\n fd,\r\n JSON.stringify({ pid: process.pid, at: new Date().toISOString() }),\r\n \"utf8\",\r\n );\r\n closeSync(fd);\r\n return { acquired: true };\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === \"EEXIST\") {\r\n return { acquired: false, reason: \"concurrent acquire\" };\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\nexport function releaseCronTickLock(lockPath: string): void {\r\n try {\r\n unlinkSync(lockPath);\r\n } catch {\r\n /* ignore */\r\n }\r\n}\r\n", "import type { CronJobSpec } from \"./cron-types.js\";\r\n\r\nconst CRON_RE =\r\n /^[\\d*/,\\-?LW#]+\\s+[\\d*/,\\-?LW#]+\\s+[\\d*/,\\-?LW#]+\\s+[\\d*/,\\-?LW#]+\\s+[\\d*/,\\-?LW#]+$/;\r\n\r\nexport function isCronExpression(value: string): boolean {\r\n return CRON_RE.test(value.trim());\r\n}\r\n\r\nfunction parseList(field: string, min: number, max: number): Set<number> {\r\n const out = new Set<number>();\r\n for (const part of field.split(\",\")) {\r\n const token = part.trim();\r\n if (!token) continue;\r\n if (token === \"*\") {\r\n for (let i = min; i <= max; i++) out.add(i);\r\n continue;\r\n }\r\n const stepMatch = /^(.+)\\/(\\d+)$/.exec(token);\r\n const base = stepMatch ? stepMatch[1]! : token;\r\n const step = stepMatch ? Math.max(1, Number(stepMatch[2])) : 1;\r\n if (base === \"*\") {\r\n for (let i = min; i <= max; i += step) out.add(i);\r\n continue;\r\n }\r\n const rangeMatch = /^(\\d+)-(\\d+)$/.exec(base);\r\n if (rangeMatch) {\r\n const start = Math.max(min, Number(rangeMatch[1]));\r\n const end = Math.min(max, Number(rangeMatch[2]));\r\n for (let i = start; i <= end; i += step) out.add(i);\r\n continue;\r\n }\r\n const n = Number(base);\r\n if (Number.isInteger(n) && n >= min && n <= max) out.add(n);\r\n }\r\n return out;\r\n}\r\n\r\nfunction fieldMatches(field: string, value: number, min: number, max: number): boolean {\r\n const trimmed = field.trim();\r\n if (trimmed === \"*\") return true;\r\n return parseList(trimmed, min, max).has(value);\r\n}\r\n\r\n/** UTC 5-field cron match for a Date (minute resolution). */\r\nexport function cronMatchesUtc(expr: string, at: Date): boolean {\r\n const parts = expr.trim().split(/\\s+/);\r\n if (parts.length !== 5) return false;\r\n const [minF, hourF, domF, monF, dowF] = parts;\r\n return (\r\n fieldMatches(minF!, at.getUTCMinutes(), 0, 59) &&\r\n fieldMatches(hourF!, at.getUTCHours(), 0, 23) &&\r\n fieldMatches(domF!, at.getUTCDate(), 1, 31) &&\r\n fieldMatches(monF!, at.getUTCMonth() + 1, 1, 12) &&\r\n fieldMatches(dowF!, at.getUTCDay(), 0, 6)\r\n );\r\n}\r\n\r\nconst MAX_LOOKAHEAD_MINUTES = 366 * 24 * 60;\r\n\r\nfunction truncateToUtcMinute(at: Date): Date {\r\n return new Date(\r\n Date.UTC(\r\n at.getUTCFullYear(),\r\n at.getUTCMonth(),\r\n at.getUTCDate(),\r\n at.getUTCHours(),\r\n at.getUTCMinutes(),\r\n 0,\r\n 0,\r\n ),\r\n );\r\n}\r\n\r\n/** Next UTC fire at or strictly after `after` (minute resolution). */\r\nexport function computeNextCronFireUtc(expr: string, after: Date): Date | null {\r\n if (!isCronExpression(expr)) return null;\r\n let cursor = truncateToUtcMinute(after);\r\n cursor = new Date(cursor.getTime() + 60_000);\r\n for (let i = 0; i < MAX_LOOKAHEAD_MINUTES; i++) {\r\n if (cronMatchesUtc(expr, cursor)) return cursor;\r\n cursor = new Date(cursor.getTime() + 60_000);\r\n }\r\n return null;\r\n}\r\n\r\nexport function computeInitialNextFire(spec: CronJobSpec, now: Date): string | null {\r\n if (spec.scheduleKind === \"runAt\" && spec.runAt) {\r\n const ms = Date.parse(spec.runAt);\r\n return Number.isNaN(ms) ? null : new Date(ms).toISOString();\r\n }\r\n if (spec.scheduleKind === \"cron\" && spec.cron) {\r\n const next = computeNextCronFireUtc(spec.cron.trim(), now);\r\n return next ? next.toISOString() : null;\r\n }\r\n return null;\r\n}\r\n\r\nexport function advanceRecurringNextFire(spec: CronJobSpec, fromInclusive: Date): string | null {\r\n if (spec.scheduleKind !== \"cron\" || !spec.cron?.trim()) return null;\r\n const next = computeNextCronFireUtc(spec.cron.trim(), fromInclusive);\r\n return next ? next.toISOString() : null;\r\n}\r\n", "import { promises as fs } from \"node:fs\";\r\nimport type { CronRegisteredJob } from \"./cron-types.js\";\r\nimport { defaultKynverCronStorePath } from \"./cron-env.js\";\r\n\r\ninterface OnDiskShape {\r\n entries?: CronRegisteredJob[];\r\n}\r\n\r\nasync function readFileIfExists(filePath: string): Promise<string | null> {\r\n try {\r\n return await fs.readFile(filePath, \"utf8\");\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\r\n throw err;\r\n }\r\n}\r\n\r\nexport function parseCronStore(raw: string | null): CronRegisteredJob[] {\r\n if (!raw) return [];\r\n try {\r\n const parsed = JSON.parse(raw) as OnDiskShape;\r\n return Array.isArray(parsed.entries) ? parsed.entries : [];\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\nexport async function loadCronJobs(\r\n storePath: string = defaultKynverCronStorePath(),\r\n): Promise<CronRegisteredJob[]> {\r\n const raw = await readFileIfExists(storePath);\r\n return parseCronStore(raw);\r\n}\r\n\r\nasync function writeCronStore(\r\n storePath: string,\r\n entries: CronRegisteredJob[],\r\n): Promise<void> {\r\n const { mkdir, writeFile, rename } = await import(\"node:fs/promises\");\r\n const { randomBytes } = await import(\"node:crypto\");\r\n const { dirname } = await import(\"node:path\");\r\n await mkdir(dirname(storePath), { recursive: true });\r\n const tmp = `${storePath}.${randomBytes(4).toString(\"hex\")}.tmp`;\r\n const body = JSON.stringify({ entries } satisfies OnDiskShape, null, 2);\r\n await writeFile(tmp, body, \"utf8\");\r\n await rename(tmp, storePath);\r\n}\r\n\r\n/** Insert or replace a cron store entry (by `providerScheduleId`). */\r\nexport async function saveCronJob(\r\n entry: CronRegisteredJob,\r\n storePath: string = defaultKynverCronStorePath(),\r\n): Promise<void> {\r\n const entries = await loadCronJobs(storePath);\r\n const idx = entries.findIndex((e) => e.providerScheduleId === entry.providerScheduleId);\r\n if (idx >= 0) entries[idx] = entry;\r\n else entries.push(entry);\r\n await writeCronStore(storePath, entries);\r\n}\r\n\r\nexport async function ensureCronStoreInitialized(\r\n storePath: string = defaultKynverCronStorePath(),\r\n): Promise<{ created: boolean }> {\r\n const raw = await readFileIfExists(storePath);\r\n if (raw !== null) return { created: false };\r\n await writeCronStore(storePath, []);\r\n return { created: true };\r\n}\r\n", "import { randomBytes } from \"node:crypto\";\r\nimport { promises as fs } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CronTickJobState, CronTickStateFile } from \"./cron-types.js\";\r\n\r\nconst EMPTY: CronTickStateFile = { version: 1, jobs: {} };\r\n\r\nasync function readFileIfExists(filePath: string): Promise<string | null> {\r\n try {\r\n return await fs.readFile(filePath, \"utf8\");\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\r\n throw err;\r\n }\r\n}\r\n\r\nexport function parseCronTickState(raw: string | null): CronTickStateFile {\r\n if (!raw) return { ...EMPTY, jobs: { ...EMPTY.jobs } };\r\n try {\r\n const parsed = JSON.parse(raw) as CronTickStateFile;\r\n if (parsed?.version !== 1 || typeof parsed.jobs !== \"object\" || !parsed.jobs) {\r\n return { ...EMPTY, jobs: {} };\r\n }\r\n return parsed;\r\n } catch {\r\n return { ...EMPTY, jobs: {} };\r\n }\r\n}\r\n\r\nexport async function loadCronTickState(statePath: string): Promise<CronTickStateFile> {\r\n const raw = await readFileIfExists(statePath);\r\n return parseCronTickState(raw);\r\n}\r\n\r\nasync function writeStateAtomic(statePath: string, state: CronTickStateFile): Promise<void> {\r\n await fs.mkdir(path.dirname(statePath), { recursive: true });\r\n const suffix = randomBytes(6).toString(\"hex\");\r\n const tmp = `${statePath}.tmp-${process.pid}-${Date.now()}-${suffix}`;\r\n await fs.writeFile(tmp, `${JSON.stringify(state, null, 2)}\\n`, \"utf8\");\r\n try {\r\n await fs.rename(tmp, statePath);\r\n } catch (err) {\r\n const code = (err as NodeJS.ErrnoException).code;\r\n if (code !== \"EPERM\" && code !== \"EEXIST\" && code !== \"EACCES\") throw err;\r\n await fs.unlink(tmp).catch(() => {});\r\n }\r\n}\r\n\r\nexport async function saveCronTickState(\r\n statePath: string,\r\n state: CronTickStateFile,\r\n): Promise<void> {\r\n await writeStateAtomic(statePath, state);\r\n}\r\n\r\nexport function getOrCreateJobState(\r\n state: CronTickStateFile,\r\n providerScheduleId: string,\r\n): CronTickJobState {\r\n const existing = state.jobs[providerScheduleId];\r\n if (existing) return existing;\r\n const created: CronTickJobState = {\r\n providerScheduleId,\r\n nextFireAt: null,\r\n lastFiredAt: null,\r\n lastAttemptAt: null,\r\n consecutiveFailures: 0,\r\n completedAt: null,\r\n inflightUntil: null,\r\n };\r\n state.jobs[providerScheduleId] = created;\r\n return created;\r\n}\r\n", "import type { CronRegisteredJob, CronTickJobState, CronTickStateFile } from \"./cron-types.js\";\r\nimport type { KynverCronEnv } from \"./cron-env.js\";\r\nimport { resolveKynverCronEnv } from \"./cron-env.js\";\r\nimport { fireKynverCronJob } from \"./cron-fire.js\";\r\nimport { tryAcquireCronTickLock, releaseCronTickLock } from \"./cron-lock.js\";\r\nimport {\r\n advanceRecurringNextFire,\r\n computeInitialNextFire,\r\n} from \"./cron-match.js\";\r\nimport { loadCronJobs } from \"./cron-store.js\";\r\nimport {\r\n getOrCreateJobState,\r\n loadCronTickState,\r\n saveCronTickState,\r\n} from \"./cron-tick-state.js\";\r\n\r\nexport interface CronTickResult {\r\n enabled: boolean;\r\n skipped?: string;\r\n scanned: number;\r\n due: number;\r\n fired: number;\r\n skippedJobs: number;\r\n errors: number;\r\n lockHeld?: boolean;\r\n}\r\n\r\nfunction isInflight(job: CronTickJobState, nowMs: number): boolean {\r\n if (!job.inflightUntil) return false;\r\n const until = Date.parse(job.inflightUntil);\r\n return !Number.isNaN(until) && until > nowMs;\r\n}\r\n\r\nfunction isCompleted(job: CronTickJobState): boolean {\r\n return Boolean(job.completedAt);\r\n}\r\n\r\nfunction backoffReady(job: CronTickJobState, env: KynverCronEnv, nowMs: number): boolean {\r\n if (job.consecutiveFailures === 0) return true;\r\n if (job.consecutiveFailures > env.maxRetries) return false;\r\n if (!job.lastAttemptAt) return true;\r\n const last = Date.parse(job.lastAttemptAt);\r\n if (Number.isNaN(last)) return true;\r\n return nowMs - last >= env.retryBackoffMs;\r\n}\r\n\r\nfunction ensureNextFire(\r\n entry: CronRegisteredJob,\r\n job: CronTickJobState,\r\n now: Date,\r\n): string | null {\r\n if (job.nextFireAt) return job.nextFireAt;\r\n const initial = computeInitialNextFire(entry.spec, now);\r\n job.nextFireAt = initial;\r\n return initial;\r\n}\r\n\r\nfunction isDue(\r\n entry: CronRegisteredJob,\r\n job: CronTickJobState,\r\n nowMs: number,\r\n env: KynverCronEnv,\r\n): boolean {\r\n if (entry.paused || isCompleted(job) || isInflight(job, nowMs)) return false;\r\n if (!backoffReady(job, env, nowMs)) return false;\r\n const nextMs = job.nextFireAt ? Date.parse(job.nextFireAt) : NaN;\r\n if (Number.isNaN(nextMs)) return false;\r\n return nowMs >= nextMs;\r\n}\r\n\r\n/** Advance recurring schedules before POST so a slow callback cannot double-fire. */\r\nfunction advanceRecurringBeforeFire(\r\n entry: CronRegisteredJob,\r\n job: CronTickJobState,\r\n now: Date,\r\n): void {\r\n if (entry.spec.scheduleKind !== \"cron\") return;\r\n job.nextFireAt = advanceRecurringNextFire(entry.spec, now);\r\n}\r\n\r\nexport async function runKynverCronTick(\r\n opts: {\r\n env?: KynverCronEnv;\r\n now?: Date;\r\n fetchFn?: typeof fetch;\r\n agentOsIdFilter?: string | null;\r\n } = {},\r\n): Promise<CronTickResult> {\r\n const env = opts.env ?? resolveKynverCronEnv();\r\n const now = opts.now ?? new Date();\r\n const nowMs = now.getTime();\r\n\r\n if (!env.tickEnabled) {\r\n return { enabled: false, skipped: \"tick_disabled\", scanned: 0, due: 0, fired: 0, skippedJobs: 0, errors: 0 };\r\n }\r\n if (!env.fireBaseUrl || !env.secret) {\r\n return {\r\n enabled: true,\r\n skipped: \"missing_fire_credentials\",\r\n scanned: 0,\r\n due: 0,\r\n fired: 0,\r\n skippedJobs: 0,\r\n errors: 0,\r\n };\r\n }\r\n\r\n const lock = tryAcquireCronTickLock(env.lockPath);\r\n if (!lock.acquired) {\r\n return {\r\n enabled: true,\r\n skipped: lock.reason ?? \"lock_not_acquired\",\r\n scanned: 0,\r\n due: 0,\r\n fired: 0,\r\n skippedJobs: 0,\r\n errors: 0,\r\n lockHeld: true,\r\n };\r\n }\r\n\r\n try {\r\n const entries = await loadCronJobs(env.storePath);\r\n const filtered = opts.agentOsIdFilter\r\n ? entries.filter((e) => e.spec.target.agentOsId === opts.agentOsIdFilter)\r\n : entries;\r\n\r\n const state: CronTickStateFile = await loadCronTickState(env.statePath);\r\n const dueEntries: Array<{ entry: CronRegisteredJob; job: CronTickJobState }> = [];\r\n\r\n for (const entry of filtered) {\r\n const job = getOrCreateJobState(state, entry.providerScheduleId);\r\n ensureNextFire(entry, job, now);\r\n if (isDue(entry, job, nowMs, env)) {\r\n dueEntries.push({ entry, job });\r\n }\r\n }\r\n\r\n dueEntries.sort((a, b) => {\r\n const aMs = Date.parse(a.job.nextFireAt ?? \"\") || 0;\r\n const bMs = Date.parse(b.job.nextFireAt ?? \"\") || 0;\r\n return aMs - bMs;\r\n });\r\n\r\n let fired = 0;\r\n let errors = 0;\r\n let skippedJobs = 0;\r\n let catchUpBudget = env.maxCatchUpPerTick;\r\n\r\n for (const { entry, job } of dueEntries) {\r\n if (env.missedRunPolicy === \"skip\" && entry.spec.scheduleKind === \"cron\") {\r\n const next = Date.parse(job.nextFireAt ?? \"\");\r\n if (!Number.isNaN(next) && next < nowMs - env.tickIntervalMs * 2) {\r\n job.nextFireAt = advanceRecurringNextFire(entry.spec, now);\r\n skippedJobs++;\r\n continue;\r\n }\r\n }\r\n\r\n if (catchUpBudget <= 0) {\r\n skippedJobs++;\r\n continue;\r\n }\r\n\r\n job.inflightUntil = new Date(nowMs + env.inflightLeaseMs).toISOString();\r\n job.lastAttemptAt = now.toISOString();\r\n advanceRecurringBeforeFire(entry, job, now);\r\n\r\n try {\r\n const result = await fireKynverCronJob({\r\n entry,\r\n baseUrl: env.fireBaseUrl,\r\n secret: env.secret,\r\n fetchFn: opts.fetchFn,\r\n });\r\n job.inflightUntil = null;\r\n if (result.ok) {\r\n job.lastFiredAt = now.toISOString();\r\n job.consecutiveFailures = 0;\r\n if (entry.spec.scheduleKind === \"runAt\") {\r\n job.completedAt = now.toISOString();\r\n job.nextFireAt = null;\r\n }\r\n fired++;\r\n catchUpBudget--;\r\n } else {\r\n job.consecutiveFailures += 1;\r\n errors++;\r\n }\r\n } catch {\r\n job.inflightUntil = null;\r\n job.consecutiveFailures += 1;\r\n errors++;\r\n }\r\n }\r\n\r\n await saveCronTickState(env.statePath, state);\r\n\r\n return {\r\n enabled: true,\r\n scanned: filtered.length,\r\n due: dueEntries.length,\r\n fired,\r\n skippedJobs,\r\n errors,\r\n };\r\n } finally {\r\n releaseCronTickLock(env.lockPath);\r\n }\r\n}\r\n", "import path from \"node:path\";\r\nimport { collectRunActiveHarnessWorkers } from \"./active-harness-workers.js\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { countDispatchStarts, runPipelineDispatch } from \"./pipeline-dispatch.js\";\r\nimport { operatorExactTargetTaskIds } from \"./pipeline-exact-targets.js\";\r\nimport { resolvePipelineMaxStarts, type ResolvePipelineMaxStartsResult } from \"./pipeline-max-starts.js\";\r\nimport { reconcileStaleWorkers } from \"./stale-reconcile.js\";\r\nimport type { ReconcileStaleWorkersResult } from \"./stale-reconcile.js\";\r\nimport { observeRunnerResourceGate, type RunnerResourceGateShape } from \"./resource-gate.js\";\r\nimport { buildBoxResourceSnapshotFromGate } from \"./box-resource-snapshot.js\";\r\nimport { loadRun, runDirectory } from \"./run-store.js\";\r\nimport { assessExitedWorkerSalvage } from \"./exited-salvage.js\";\r\nimport { computeWorkerStatus, isFinishedWorkerStatus } from \"./status.js\";\r\nimport { sweepRun } from \"./sweep.js\";\r\nimport { required, readJson, safeSlug } from \"./util.js\";\r\nimport { syncActiveWorkerPlanProgress } from \"./plan-progress-daemon-sync.js\";\r\nimport { renewActiveTaskLeases } from \"./lease-renewal.js\";\r\nimport { buildRunBoard, runStatus, tryCompleteWorker } from \"./worker-ops.js\";\r\nimport { hasTerminalCompletionAck } from \"./completion-replay.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport {\r\n configuredMaxWorkersOverrideForBox,\r\n fetchWorkspaceRuntimePreferences,\r\n} from \"./workspace-runtime-config.js\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport { resolveBoxKindFromConfig } from \"./box-identity.js\";\r\nimport { isPipelineCleanupEnabled, runPipelineHarnessCleanup } from \"./cleanup.js\";\r\nimport type { HarnessCleanupSummary } from \"./cleanup-types.js\";\r\nimport { syncCompletionAcknowledgedFromOperatorTick } from \"./worker-lifecycle.js\";\r\nimport { collectInstalledPackageVersions } from \"./installed-package-versions.js\";\r\nimport { resolveRunnerPresencePayload } from \"./runner-identity.js\";\r\nimport { collectProviderEvidence } from \"./provider-evidence/collect.js\";\r\nimport {\r\n extractProviderEvidenceWanted,\r\n loadPersistedProviderEvidenceWanted,\r\n persistProviderEvidenceWanted,\r\n} from \"./provider-evidence/wanted-store.js\";\r\n\r\nexport interface PipelineTickResult {\r\n runId: string;\r\n agentOsId: string;\r\n execute: boolean;\r\n /** Gate sampled before operator tick (Command Center heartbeat). */\r\n resourceGate: RunnerResourceGateShape;\r\n /** Gate re-sampled after completion replay + board lifecycle sync \u2014 used for dispatch. */\r\n dispatchResourceGate: RunnerResourceGateShape;\r\n leaseRenewal?: Awaited<ReturnType<typeof renewActiveTaskLeases>>;\r\n completedWorkers: Array<{ worker: string; ok: boolean; taskId?: string | null; skipped?: boolean }>;\r\n staleReconcile: ReconcileStaleWorkersResult;\r\n planProgressSync: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>;\r\n completionAckSync: Array<{ worker: string; taskId: string; taskStatus: string }>;\r\n harnessCleanup?: HarnessCleanupSummary;\r\n operatorTick: unknown;\r\n sweep: unknown;\r\n dispatchAdvice: ResolvePipelineMaxStartsResult;\r\n dispatch: unknown;\r\n idle: boolean;\r\n}\r\n\r\nexport async function completeFinishedWorkers(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<Array<{ worker: string; ok: boolean; taskId?: string | null; skipped?: boolean }>> {\r\n const run = loadRun(runId);\r\n const outcomes: Array<{ worker: string; ok: boolean; taskId?: string | null; skipped?: boolean }> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.taskId || worker.localOnly) continue;\r\n if (hasTerminalCompletionAck(worker)) {\r\n outcomes.push({ worker: name, ok: true, taskId: worker.taskId ?? null, skipped: true });\r\n continue;\r\n }\r\n const status = computeWorkerStatus(worker);\r\n if (!isFinishedWorkerStatus(status)) continue;\r\n // Complete pull-queue (`dispatched`) workers AND directly-started workers\r\n // that produced a finalResult \u2014 the self-linked repair worker case, where\r\n // the worker is not in the dispatch queue but its linked AgentTask must\r\n // still advance (or block) instead of sitting queued while local status\r\n // reads \"done\". A directly-started worker that exited WITHOUT a finalResult\r\n // is left alone (it may be a manual / interrupted run the runtime doesn't\r\n // own).\r\n const exitedSalvage = assessExitedWorkerSalvage({\r\n alive: status.alive,\r\n finalResult: status.finalResult,\r\n changedFiles: status.changedFiles,\r\n gitAncestry: status.gitAncestry,\r\n });\r\n // Directly-started workers are normally left alone, but an exited worker with\r\n // salvageable work still needs completion ingested so the board can block +\r\n // propose a salvage review task.\r\n if (!worker.dispatched && !status.finalResult && !exitedSalvage?.salvageable) continue;\r\n const result = await tryCompleteWorker({\r\n run: runId,\r\n name,\r\n agentOsId: String(args.agentOsId || worker.agentOsId || \"\"),\r\n ...args,\r\n });\r\n outcomes.push({ worker: name, ok: result.ok, taskId: worker.taskId ?? null });\r\n }\r\n return outcomes;\r\n}\r\n\r\nasync function postOperatorTick(\r\n agentOsId: string,\r\n runId: string,\r\n resourceGate: RunnerResourceGateShape,\r\n args: Record<string, string | boolean>,\r\n harnessCleanup?: HarnessCleanupSummary,\r\n): Promise<unknown> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/operator/tick`;\r\n const packageVersions = await collectInstalledPackageVersions();\r\n const activeHarnessWorkers = collectRunActiveHarnessWorkers(runId);\r\n\r\n // Provider evidence: collect what the server asked for on the PREVIOUS tick\r\n // (daemon-owned CLI auth \u2014 gh/vercel/\u2026 on this box), ship it with this tick,\r\n // then persist the fresh wanted list from the response for the next tick.\r\n // Best-effort: a broken run directory or recipe must never block the tick\r\n // heartbeat.\r\n let evidenceCollection: ReturnType<typeof collectProviderEvidence> | null = null;\r\n try {\r\n const evidenceWanted = loadPersistedProviderEvidenceWanted(runId);\r\n evidenceCollection =\r\n evidenceWanted.length > 0 ? collectProviderEvidence(evidenceWanted) : null;\r\n } catch {\r\n evidenceCollection = null;\r\n }\r\n\r\n const res = await postJson(url, secret, {\r\n agentOsId,\r\n runId,\r\n ingestHarness: true,\r\n harnessBoardSnapshot: buildRunBoard(runId),\r\n resourceGate,\r\n boxResourceSnapshot: buildBoxResourceSnapshotFromGate(resourceGate, {\r\n harnessRunId: runId,\r\n boxKind: resolveBoxKindFromConfig(loadUserConfig()),\r\n }),\r\n packageVersions,\r\n ...(harnessCleanup ? { harnessCleanup } : {}),\r\n runnerPresence: resolveRunnerPresencePayload({ runId }),\r\n activeHarnessWorkers,\r\n ...(evidenceCollection && evidenceCollection.items.length > 0\r\n ? { providerEvidence: evidenceCollection.items }\r\n : {}),\r\n });\r\n const nextWanted = extractProviderEvidenceWanted(res.response);\r\n if (nextWanted) {\r\n try {\r\n persistProviderEvidenceWanted(runId, nextWanted);\r\n } catch {\r\n // Best-effort: a missing run directory must not fail the tick.\r\n }\r\n }\r\n return {\r\n ok: res.ok,\r\n httpStatus: res.status,\r\n response: res.response,\r\n ...(evidenceCollection\r\n ? {\r\n providerEvidence: {\r\n attempted: evidenceCollection.attempted,\r\n collected: evidenceCollection.collected,\r\n skipped: evidenceCollection.skipped.length,\r\n },\r\n }\r\n : {}),\r\n };\r\n}\r\n\r\n/**\r\n * One operator/dispatcher cycle (M10 / D7 pull-first):\r\n * refresh status \u2192 complete finished workers \u2192 ingest operator tick \u2192 sweep leases \u2192 dispatch up to slot cap.\r\n */\r\nexport async function runPipelineTick(args: Record<string, string | boolean>): Promise<PipelineTickResult> {\r\n const runId = String(required(String(args.run || \"\"), \"--run\"));\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const execute = args.execute !== false && args.execute !== \"false\";\r\n\r\n runStatus({ run: runId });\r\n\r\n const workspacePrefs = await fetchWorkspaceRuntimePreferences(agentOsId, args);\r\n const configuredMaxWorkersOverride = configuredMaxWorkersOverrideForBox(workspacePrefs);\r\n const resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride,\r\n });\r\n\r\n // Heartbeat operator tick before slow completion replay so Command Center\r\n // `runtime.lastSnapshot` advances even when attention/finished workers block\r\n // the completion path for longer than the harness watchdog TTL.\r\n const harnessCleanup = isPipelineCleanupEnabled() ? runPipelineHarnessCleanup(runId) : undefined;\r\n const operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args, harnessCleanup);\r\n const completionAckSync = syncCompletionAcknowledgedFromOperatorTick(runId, operatorTick);\r\n\r\n const leaseRenewal = await renewActiveTaskLeases(runId, args);\r\n\r\n // Replay completion for finished workers before finalizing run status.\r\n // A worker whose completion is rejected (revoked / cross-workspace runner\r\n // token) records its structural blocker here, so the finalization step below\r\n // sees it and refuses to paper the run over as `completed` while the linked\r\n // AgentTask is still stuck.\r\n const completedWorkers = await completeFinishedWorkers(runId, args);\r\n\r\n // Re-sample the worker cap after completion replay + board lifecycle pins so\r\n // dispatch in this tick can fill slots freed when tasks left `running` even\r\n // though the wrapper PID is still alive (completionAcknowledged \u2192 not active).\r\n const dispatchResourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride,\r\n });\r\n\r\n // Close out runs whose workers have all exited so they stop piling up as\r\n // \"running\" (the box had 40+ stale runs eating 28 GB of worktrees). Global\r\n // active-worker accounting already ignores dead workers; this keeps run\r\n // status truthful and lets stale worktrees be pruned safely. Completion-\r\n // blocked workers (above) keep their run non-terminal.\r\n const staleReconcile = reconcileStaleWorkers();\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, args);\r\n\r\n const maxStartsAdvice = resolvePipelineMaxStarts(dispatchResourceGate, operatorTick);\r\n let maxStarts = maxStartsAdvice.maxStarts;\r\n\r\n const sweep = await sweepRun({ run: runId, agentOsId, pipeline: true, ...args });\r\n\r\n let dispatch: unknown = null;\r\n let startedCount = 0;\r\n const exactTargetTaskIds = operatorExactTargetTaskIds(operatorTick);\r\n let remainingStarts = maxStarts;\r\n\r\n if (execute && remainingStarts > 0 && exactTargetTaskIds.length > 0) {\r\n const exactBudget = Math.min(remainingStarts, exactTargetTaskIds.length);\r\n const exact = await runPipelineDispatch(\r\n {\r\n ...args,\r\n run: runId,\r\n agentOsId,\r\n targetTaskIds: exactTargetTaskIds.join(\",\"),\r\n },\r\n exactBudget,\r\n );\r\n const exactStarted = countDispatchStarts(exact);\r\n startedCount += exactStarted;\r\n remainingStarts = Math.max(0, remainingStarts - exactStarted);\r\n dispatch = { exactTargetTaskIds, exact, startedCount };\r\n }\r\n\r\n if (execute && remainingStarts > 0) {\r\n const broad = await runPipelineDispatch(\r\n {\r\n ...args,\r\n run: runId,\r\n agentOsId,\r\n },\r\n remainingStarts,\r\n );\r\n const broadStarted = countDispatchStarts(broad);\r\n startedCount += broadStarted;\r\n dispatch =\r\n dispatch && typeof dispatch === \"object\"\r\n ? { ...(dispatch as Record<string, unknown>), broad, startedCount }\r\n : broad;\r\n } else if (!execute || maxStarts <= 0) {\r\n if (!dispatch) {\r\n dispatch = {\r\n ok: true,\r\n skipped: true,\r\n reason: execute ? dispatchResourceGate.reason ?? \"no slots or queued work\" : \"execute disabled\",\r\n maxStarts: 0,\r\n dispatchAdvice: maxStartsAdvice,\r\n ...(exactTargetTaskIds.length ? { exactTargetTaskIds, exactOnly: true } : {}),\r\n };\r\n }\r\n } else if (dispatch && typeof dispatch === \"object\") {\r\n dispatch = { ...(dispatch as Record<string, unknown>), broadSkipped: true, startedCount };\r\n }\r\n const idle =\r\n !maxStartsAdvice.underutilized &&\r\n maxStarts === 0 &&\r\n completedWorkers.length === 0 &&\r\n startedCount === 0;\r\n\r\n return {\r\n runId,\r\n agentOsId,\r\n execute,\r\n resourceGate,\r\n dispatchResourceGate,\r\n leaseRenewal,\r\n completedWorkers,\r\n staleReconcile,\r\n harnessCleanup,\r\n planProgressSync,\r\n completionAckSync,\r\n operatorTick,\r\n sweep,\r\n dispatchAdvice: maxStartsAdvice,\r\n dispatch,\r\n idle,\r\n };\r\n}\r\n", "import { dispatchRun } from \"./dispatch.js\";\r\n\r\nconst RESERVED_REVIEW_STARTS = 1;\r\n\r\nexport function countDispatchStarts(result: unknown): number {\r\n if (!result || typeof result !== \"object\") return 0;\r\n const startedCount = (result as { startedCount?: number }).startedCount;\r\n if (typeof startedCount === \"number\") return startedCount;\r\n const outcomes = (result as { outcomes?: Array<{ started?: boolean }> }).outcomes;\r\n if (!Array.isArray(outcomes)) return 0;\r\n return outcomes.filter((o) => o.started).length;\r\n}\r\n\r\n/** Drop CLI max-starts so pipeline ticks always use the resource-gate slot budget. */\r\nexport function stripCliMaxStarts(\r\n args: Record<string, string | boolean>,\r\n): Record<string, string | boolean> {\r\n const { maxStarts: _maxStarts, ...rest } = args;\r\n return rest;\r\n}\r\n\r\n/**\r\n * Two-pass daemon dispatch: reserve one start for the review lane, then fill\r\n * remaining slots from the mixed queue (review-first ordering on the server).\r\n */\r\nexport async function runPipelineDispatch(\r\n args: Record<string, string | boolean>,\r\n slots: number,\r\n): Promise<Record<string, unknown>> {\r\n if (slots <= 0) {\r\n return { ok: true, skipped: true, reason: \"no slots\", maxStarts: 0, startedCount: 0 };\r\n }\r\n\r\n const base = stripCliMaxStarts(args);\r\n if (base.targetTaskId || base.targetTaskIds) {\r\n const target = await dispatchRun({\r\n ...base,\r\n execute: true,\r\n pipeline: true,\r\n maxStarts: String(slots),\r\n });\r\n return {\r\n ...(typeof target === \"object\" && target !== null ? target : {}),\r\n passes: { target },\r\n startedCount: countDispatchStarts(target),\r\n };\r\n }\r\n\r\n const reviewBudget = Math.min(slots, RESERVED_REVIEW_STARTS);\r\n const workBudget = Math.max(0, slots - reviewBudget);\r\n\r\n const review = await dispatchRun({\r\n ...base,\r\n execute: true,\r\n pipeline: true,\r\n lane: \"review\",\r\n maxStarts: String(reviewBudget),\r\n });\r\n\r\n const reviewStarted = countDispatchStarts(review);\r\n const workSlots = workBudget + (reviewBudget - reviewStarted);\r\n if (workSlots <= 0) {\r\n return {\r\n ...(typeof review === \"object\" && review !== null ? review : {}),\r\n passes: { review },\r\n startedCount: reviewStarted,\r\n };\r\n }\r\n\r\n const work = await dispatchRun({\r\n ...base,\r\n execute: true,\r\n pipeline: true,\r\n maxStarts: String(workSlots),\r\n });\r\n\r\n const workStarted = countDispatchStarts(work);\r\n return {\r\n passes: { review, work },\r\n startedCount: reviewStarted + workStarted,\r\n ok: true,\r\n };\r\n}\r\n", "/** Operator tick `dispatch.exactTargetTaskIds` \u2014 start these before any broad sweep. */\r\nexport function operatorExactTargetTaskIds(operatorTick: unknown): string[] {\r\n if (!operatorTick || typeof operatorTick !== \"object\") return [];\r\n const body = operatorTick as {\r\n response?: { dispatch?: { exactTargetTaskIds?: unknown } };\r\n };\r\n const raw = body.response?.dispatch?.exactTargetTaskIds;\r\n if (!Array.isArray(raw)) return [];\r\n const seen = new Set<string>();\r\n const out: string[] = [];\r\n for (const value of raw) {\r\n if (typeof value !== \"string\") continue;\r\n const id = value.trim();\r\n if (!id || seen.has(id)) continue;\r\n seen.add(id);\r\n out.push(id);\r\n }\r\n return out;\r\n}\r\n", "import type { RunnerResourceGateShape } from \"./resource-gate.js\";\r\n\r\nexport interface OperatorDispatchShape {\r\n recommendedMaxStarts?: number;\r\n underutilized?: boolean;\r\n actionableReady?: number;\r\n queuedTasks?: number;\r\n boardAdvancedThisTick?: number;\r\n leaseReapedThisTick?: number;\r\n}\r\n\r\nexport interface ResolvePipelineMaxStartsResult {\r\n maxStarts: number;\r\n underutilized: boolean;\r\n advisedStarts: number | null;\r\n actionableReady: number | null;\r\n queuedTasks: number | null;\r\n nonDispatchableReady: number | null;\r\n boardAdvancedThisTick: number;\r\n leaseReapedThisTick: number;\r\n}\r\n\r\nfunction operatorDispatchFromTick(operatorTick: unknown): OperatorDispatchShape | null {\r\n const body = operatorTick as { response?: { dispatch?: OperatorDispatchShape } };\r\n const dispatch = body.response?.dispatch;\r\n return dispatch && typeof dispatch === \"object\" ? dispatch : null;\r\n}\r\n\r\nfunction nonNegativeInt(value: unknown): number | null {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\r\n return Math.max(0, Math.floor(value));\r\n}\r\n\r\n/**\r\n * Merge runner slot budget with server dispatch-floor advice from the operator tick.\r\n * Actionable backlog is authoritative: stale or conservative server advice may\r\n * reduce noise, but it must not underfill open worker slots when ready work is\r\n * startable.\r\n */\r\nexport function resolvePipelineMaxStarts(\r\n resourceGate: RunnerResourceGateShape,\r\n operatorTick: unknown,\r\n): ResolvePipelineMaxStartsResult {\r\n const dispatch = operatorDispatchFromTick(operatorTick);\r\n const advised = nonNegativeInt(dispatch?.recommendedMaxStarts);\r\n const actionableReady = nonNegativeInt(dispatch?.actionableReady);\r\n const queuedTasks = nonNegativeInt(dispatch?.queuedTasks);\r\n const boardAdvancedThisTick = nonNegativeInt(dispatch?.boardAdvancedThisTick) ?? 0;\r\n const leaseReapedThisTick = nonNegativeInt(dispatch?.leaseReapedThisTick) ?? 0;\r\n const hygieneAdvanced = boardAdvancedThisTick + leaseReapedThisTick;\r\n const readyFloor = actionableReady ?? queuedTasks;\r\n\r\n let maxStarts = resourceGate.slotsAvailable;\r\n if (readyFloor !== null) {\r\n maxStarts = Math.min(maxStarts, readyFloor);\r\n } else if (advised !== null) {\r\n maxStarts = Math.min(maxStarts, advised);\r\n }\r\n\r\n if (readyFloor === null && advised !== null) {\r\n maxStarts = Math.max(maxStarts, Math.min(resourceGate.slotsAvailable, advised));\r\n }\r\n\r\n const underutilized =\r\n dispatch?.underutilized === true ||\r\n ((readyFloor ?? 0) > 0 &&\r\n resourceGate.slotsAvailable > 0 &&\r\n resourceGate.maxConcurrentWorkers > 0 &&\r\n resourceGate.activeWorkers < resourceGate.maxConcurrentWorkers);\r\n\r\n if (resourceGate.slotsAvailable > 0 && maxStarts === 0 && (underutilized || hygieneAdvanced > 0)) {\r\n const ready = readyFloor ?? (hygieneAdvanced > 0 ? hygieneAdvanced : 1);\r\n maxStarts = Math.min(resourceGate.slotsAvailable, Math.max(1, ready));\r\n }\r\n\r\n const nonDispatchableReady =\r\n queuedTasks !== null && actionableReady !== null ? Math.max(0, queuedTasks - actionableReady) : null;\r\n\r\n return {\r\n maxStarts: Math.max(0, maxStarts),\r\n underutilized,\r\n advisedStarts: advised,\r\n actionableReady,\r\n queuedTasks,\r\n nonDispatchableReady,\r\n boardAdvancedThisTick,\r\n leaseReapedThisTick,\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { loadRun, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport { syncPlanProgress } from \"./plan-progress-sync.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\n/** Push heartbeat blockers to the server orchestrator (deduped per worker). */\r\nexport async function syncActiveWorkerPlanProgress(\r\n runId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }>> {\r\n const run = loadRun(runId);\r\n const agentOsId = String(args.agentOsId || \"\");\r\n if (!agentOsId) return [];\r\n\r\n const outcomes: Array<{ worker: string; phase: string; ok: boolean; skipped?: boolean }> = [];\r\n for (const name of Object.keys(run.workers || {})) {\r\n const worker = readJson<HarnessWorkerRecord>(\r\n path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n if (!worker?.dispatched || !worker.taskId) continue;\r\n\r\n const status = computeWorkerStatus(worker);\r\n if (!status.heartbeatBlocker) continue;\r\n\r\n if (worker.lastSyncedHeartbeatBlocker === status.heartbeatBlocker) {\r\n outcomes.push({ worker: name, phase: \"heartbeat_blocker\", ok: true, skipped: true });\r\n continue;\r\n }\r\n\r\n const res = await syncPlanProgress({\r\n agentOsId,\r\n taskId: worker.taskId,\r\n phase: \"heartbeat_blocker\",\r\n blocker: status.heartbeatBlocker,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n if (res.ok) {\r\n worker.lastSyncedHeartbeatBlocker = status.heartbeatBlocker;\r\n saveWorker(run.id, worker);\r\n }\r\n outcomes.push({ worker: name, phase: \"heartbeat_blocker\", ok: res.ok });\r\n }\r\n\r\n return outcomes;\r\n}\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\n\r\nexport type PlanProgressSyncPhase = \"worker_dispatched\" | \"worker_completed\" | \"heartbeat_blocker\";\r\n\r\nexport interface PlanProgressSyncArtifact {\r\n branch?: string;\r\n worktreePath?: string;\r\n prUrl?: string;\r\n headCommit?: string;\r\n changedFiles?: string[];\r\n}\r\n\r\nexport async function syncPlanProgress(args: {\r\n agentOsId: string;\r\n taskId: string;\r\n phase: PlanProgressSyncPhase;\r\n blocker?: string;\r\n artifact?: PlanProgressSyncArtifact;\r\n baseUrl?: string;\r\n secret?: string;\r\n}): Promise<{ ok: boolean; status: number; response: unknown }> {\r\n const base = resolveBaseUrl(args.baseUrl);\r\n const secret = await resolveCallbackSecretWithMint(args.secret, args.agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(args.agentOsId)}/tasks/${encodeURIComponent(args.taskId)}/plan-progress-sync`;\r\n const res = await postJsonWithCredentialRefresh(url, secret, {\r\n phase: args.phase,\r\n taskId: args.taskId,\r\n blocker: args.blocker,\r\n artifact: args.artifact,\r\n }, { agentOsId: args.agentOsId, baseUrl: base });\r\n return { ok: res.ok, status: res.status, response: res.response };\r\n}\r\n", "import { getJson } from \"./callbacks.js\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint, loadUserConfig } from \"./config.js\";\r\nimport { resolveBoxKindFromConfig } from \"./box-identity.js\";\r\n\r\nexport interface WorkspaceRuntimePreferences {\r\n maxConcurrentWorkers: number | null;\r\n}\r\n\r\nexport function shouldApplyWorkspaceRuntimePreferences(env: NodeJS.ProcessEnv = process.env): boolean {\r\n const config = loadUserConfig();\r\n // Workspace-level max worker preference is the Ghost orchestrator default.\r\n // Forge/Hermes runners honor ~/.kynver/config.json so pools stay separate.\r\n return resolveBoxKindFromConfig(config, env) !== \"forge\";\r\n}\r\n\r\nexport function configuredMaxWorkersOverrideForBox(\r\n preferences: WorkspaceRuntimePreferences | null | undefined,\r\n env: NodeJS.ProcessEnv = process.env,\r\n): number | undefined {\r\n if (!shouldApplyWorkspaceRuntimePreferences(env)) return undefined;\r\n return preferences?.maxConcurrentWorkers ?? undefined;\r\n}\r\n\r\n/**\r\n * Pull the Command Center worker cap each pipeline tick so the daemon honors\r\n * workspace settings without restarting or editing ~/.kynver/config.json.\r\n */\r\nexport async function fetchWorkspaceRuntimePreferences(\r\n agentOsId: string,\r\n args: Record<string, string | boolean>,\r\n): Promise<WorkspaceRuntimePreferences | null> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runtime`;\r\n\r\n try {\r\n const res = await getJson(url, secret);\r\n if (!res.ok) return null;\r\n const body = res.response as { preferences?: { maxConcurrentWorkers?: unknown } } | null;\r\n const raw = body?.preferences?.maxConcurrentWorkers;\r\n if (raw === null || raw === undefined) {\r\n return { maxConcurrentWorkers: null };\r\n }\r\n const n = Number(raw);\r\n if (!Number.isFinite(n) || n <= 0) return { maxConcurrentWorkers: null };\r\n return { maxConcurrentWorkers: Math.floor(n) };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport type { CliRunner } from \"./types.js\";\r\n\r\nconst DEFAULT_CLI_TIMEOUT_MS = 10_000;\r\nconst MAX_CLI_BUFFER_BYTES = 4 * 1024 * 1024;\r\n\r\n/** Default recipe CLI runner: bounded, capture-only, never throws. */\r\nexport const defaultCliRunner: CliRunner = (cmd, args, opts) => {\r\n try {\r\n const result = spawnSync(cmd, args, {\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n timeout: opts?.timeoutMs ?? DEFAULT_CLI_TIMEOUT_MS,\r\n maxBuffer: MAX_CLI_BUFFER_BYTES,\r\n });\r\n return {\r\n ok: result.status === 0,\r\n stdout: typeof result.stdout === \"string\" ? result.stdout : \"\",\r\n stderr: typeof result.stderr === \"string\" ? result.stderr : \"\",\r\n };\r\n } catch (err) {\r\n return { ok: false, stdout: \"\", stderr: err instanceof Error ? err.message : String(err) };\r\n }\r\n};\r\n\r\n/** Run a CLI expected to emit JSON on stdout; null on failure or bad JSON. */\r\nexport function runCliJson<T>(run: CliRunner, cmd: string, args: string[]): T | null {\r\n const result = run(cmd, args);\r\n if (!result.ok || !result.stdout.trim()) return null;\r\n try {\r\n return JSON.parse(result.stdout) as T;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "// Daemon-side provider-evidence envelope types.\r\n//\r\n// Intentional duplicate of the server-side contract in\r\n// `src/modules/agent-os/provider-evidence/provider-evidence.types.ts` \u2014 the\r\n// runtime package cannot import `@/src` server modules (standalone esbuild\r\n// bundle). Keep the envelope fields in sync when the contract changes.\r\n\r\n/** Subject the server asked us to collect (from the tick response). */\r\nexport interface ProviderEvidenceWantedItem {\r\n provider: string;\r\n kind: string;\r\n subject: string;\r\n}\r\n\r\n/** One collected evidence item shipped on the next operator tick. */\r\nexport interface ProviderEvidenceItem {\r\n provider: string;\r\n kind: string;\r\n subject: string;\r\n payload: unknown;\r\n observedAt: string;\r\n collectorVersion?: string;\r\n}\r\n\r\n/** Result of one CLI invocation (injectable for tests). */\r\nexport interface CliRunResult {\r\n ok: boolean;\r\n stdout: string;\r\n stderr: string;\r\n}\r\n\r\nexport type CliRunner = (\r\n cmd: string,\r\n args: string[],\r\n opts?: { timeoutMs?: number },\r\n) => CliRunResult;\r\n\r\n/**\r\n * A collector recipe: the only provider-specific code on the daemon side.\r\n * Runs a CLI with the user's own auth and shapes the output minimally \u2014 all\r\n * classification/validation lives with the matching server consumer.\r\n */\r\nexport interface EvidenceCollectorRecipe {\r\n provider: string;\r\n kind: string;\r\n version: string;\r\n /** Cheap probe: is the underlying CLI installed + authenticated? */\r\n isAvailable(run: CliRunner): boolean;\r\n /** Collect evidence for one subject; null when collection failed. */\r\n collect(subject: string, run: CliRunner): unknown | null;\r\n}\r\n\r\nexport function providerEvidenceKey(provider: string, kind: string, subject: string): string {\r\n return `${provider} ${kind} ${subject}`;\r\n}\r\n\r\nexport function parseCommitEvidenceSubject(\r\n subject: string,\r\n): { repo: string; sha: string } | null {\r\n const at = subject.lastIndexOf(\"@\");\r\n if (at <= 0 || at === subject.length - 1) return null;\r\n const repo = subject.slice(0, at);\r\n const sha = subject.slice(at + 1);\r\n if (!/^[^/\\s]+\\/[^/\\s]+$/.test(repo) || !/^[0-9a-f]{7,40}$/i.test(sha)) return null;\r\n return { repo, sha };\r\n}\r\n\r\n/** Same PR-URL grammar as the server's pr-notification parser. */\r\nexport function parsePrUrlSubject(\r\n subject: string,\r\n): { repo: string; number: number } | null {\r\n const m = subject\r\n .trim()\r\n .match(/[/:]([^/]+\\/[^/]+)\\/(?:pull|pulls|merge_requests|pull-requests)\\/(\\d+)/i);\r\n if (!m) return null;\r\n const number = Number(m[2]);\r\n if (!Number.isFinite(number) || number <= 0) return null;\r\n return { repo: m[1], number };\r\n}\r\n", "// GitHub collector recipes \u2014 run `gh api` with the user's own CLI auth (same\r\n// ownership model as land-pr's `ensureGitHubTokenFromCliAuth`); no central\r\n// server token involved. Payloads are near-raw GitHub API fields: the recipe\r\n// stays dumb, the server consumer owns classification/validation\r\n// (`src/modules/agent-os/provider-evidence/github-pr-snapshot.consumer.ts`).\r\n\r\nimport { runCliJson } from \"./exec.js\";\r\nimport {\r\n parseCommitEvidenceSubject,\r\n parsePrUrlSubject,\r\n type CliRunner,\r\n type EvidenceCollectorRecipe,\r\n} from \"./types.js\";\r\n\r\nconst MAX_BODY_CHARS = 8_000;\r\nconst MAX_STATUS_ROWS = 30;\r\nconst MAX_CHECK_RUNS = 100;\r\nconst MAX_CHANGED_FILES = 400;\r\n\r\nfunction githubCliAvailable(run: CliRunner): boolean {\r\n if (process.env.GITHUB_TOKEN?.trim() || process.env.GH_TOKEN?.trim()) return true;\r\n return run(\"gh\", [\"auth\", \"token\"]).ok;\r\n}\r\n\r\nfunction asRecord(value: unknown): Record<string, unknown> | null {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction pickStatusRows(value: unknown): Array<Record<string, unknown>> {\r\n if (!Array.isArray(value)) return [];\r\n return value\r\n .map((raw) => asRecord(raw))\r\n .filter((row): row is Record<string, unknown> => row !== null)\r\n .slice(0, MAX_STATUS_ROWS)\r\n .map((row) => ({\r\n context: row.context ?? null,\r\n state: row.state ?? null,\r\n target_url: row.target_url ?? null,\r\n description: row.description ?? null,\r\n }));\r\n}\r\n\r\nfunction fetchCombinedStatus(\r\n run: CliRunner,\r\n repo: string,\r\n sha: string,\r\n): { state: unknown; statuses: Array<Record<string, unknown>> } | null {\r\n const status = runCliJson<Record<string, unknown>>(run, \"gh\", [\r\n \"api\",\r\n `repos/${repo}/commits/${sha}/status`,\r\n ]);\r\n if (!status) return null;\r\n return { state: status.state ?? null, statuses: pickStatusRows(status.statuses) };\r\n}\r\n\r\nexport const githubPrSnapshotRecipe: EvidenceCollectorRecipe = {\r\n provider: \"github\",\r\n kind: \"pr_snapshot\",\r\n version: \"1\",\r\n isAvailable: githubCliAvailable,\r\n collect(subject, run) {\r\n const parsed = parsePrUrlSubject(subject);\r\n if (!parsed) return null;\r\n const pull = runCliJson<Record<string, unknown>>(run, \"gh\", [\r\n \"api\",\r\n `repos/${parsed.repo}/pulls/${parsed.number}`,\r\n ]);\r\n if (!pull) return null;\r\n\r\n const head = asRecord(pull.head);\r\n const headSha = typeof head?.sha === \"string\" ? head.sha : null;\r\n const user = asRecord(pull.user);\r\n const headRepoOwner = asRecord(asRecord(head?.repo)?.owner);\r\n const body = typeof pull.body === \"string\" ? pull.body.slice(0, MAX_BODY_CHARS) : null;\r\n\r\n let checkRuns: Array<Record<string, unknown>> = [];\r\n let combinedStatus: { state: unknown; statuses: Array<Record<string, unknown>> } = {\r\n state: null,\r\n statuses: [],\r\n };\r\n if (headSha) {\r\n const runs = runCliJson<{ check_runs?: unknown }>(run, \"gh\", [\r\n \"api\",\r\n `repos/${parsed.repo}/commits/${headSha}/check-runs?per_page=100`,\r\n ]);\r\n if (Array.isArray(runs?.check_runs)) {\r\n checkRuns = runs.check_runs\r\n .map((raw) => asRecord(raw))\r\n .filter((row): row is Record<string, unknown> => row !== null)\r\n .slice(0, MAX_CHECK_RUNS)\r\n .map((row) => ({\r\n name: row.name ?? null,\r\n status: row.status ?? null,\r\n conclusion: row.conclusion ?? null,\r\n }));\r\n }\r\n combinedStatus = fetchCombinedStatus(run, parsed.repo, headSha) ?? combinedStatus;\r\n }\r\n\r\n const filesResult = run(\"gh\", [\r\n \"api\",\r\n \"--paginate\",\r\n `repos/${parsed.repo}/pulls/${parsed.number}/files?per_page=100`,\r\n \"--jq\",\r\n \".[].filename\",\r\n ]);\r\n const changedFiles = filesResult.ok\r\n ? filesResult.stdout\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter(Boolean)\r\n .slice(0, MAX_CHANGED_FILES)\r\n : [];\r\n\r\n return {\r\n pull: {\r\n html_url: pull.html_url ?? null,\r\n title: pull.title ?? null,\r\n body,\r\n user: { login: user?.login ?? null },\r\n state: pull.state ?? null,\r\n draft: pull.draft ?? null,\r\n merged: pull.merged ?? null,\r\n merged_at: pull.merged_at ?? null,\r\n merge_commit_sha: pull.merge_commit_sha ?? null,\r\n mergeable: pull.mergeable ?? null,\r\n mergeable_state: pull.mergeable_state ?? null,\r\n head: {\r\n sha: headSha,\r\n ref: head?.ref ?? null,\r\n repo: { owner: { login: headRepoOwner?.login ?? null } },\r\n },\r\n },\r\n checkRuns,\r\n combinedStatus,\r\n changedFiles,\r\n };\r\n },\r\n};\r\n\r\nexport const githubCommitStatusRecipe: EvidenceCollectorRecipe = {\r\n provider: \"github\",\r\n kind: \"commit_status\",\r\n version: \"1\",\r\n isAvailable: githubCliAvailable,\r\n collect(subject, run) {\r\n const parsed = parseCommitEvidenceSubject(subject);\r\n if (!parsed) return null;\r\n return fetchCombinedStatus(run, parsed.repo, parsed.sha);\r\n },\r\n};\r\n\r\nexport const githubBranchReachabilityRecipe: EvidenceCollectorRecipe = {\r\n provider: \"github\",\r\n kind: \"branch_reachability\",\r\n version: \"1\",\r\n isAvailable: githubCliAvailable,\r\n collect(subject, run) {\r\n const parsed = parseCommitEvidenceSubject(subject);\r\n if (!parsed) return null;\r\n const repoMeta = runCliJson<{ default_branch?: unknown }>(run, \"gh\", [\r\n \"api\",\r\n `repos/${parsed.repo}`,\r\n ]);\r\n const defaultBranch =\r\n typeof repoMeta?.default_branch === \"string\" && repoMeta.default_branch.trim()\r\n ? repoMeta.default_branch.trim()\r\n : null;\r\n if (!defaultBranch) return null;\r\n const compare = runCliJson<{ status?: unknown }>(run, \"gh\", [\r\n \"api\",\r\n `repos/${parsed.repo}/compare/${encodeURIComponent(defaultBranch)}...${parsed.sha}`,\r\n ]);\r\n if (!compare) return null;\r\n const compareStatus = typeof compare.status === \"string\" ? compare.status : null;\r\n return {\r\n defaultBranch,\r\n compareStatus,\r\n reachable: compareStatus === \"identical\" || compareStatus === \"behind\",\r\n };\r\n },\r\n};\r\n", "// Vercel collector recipe \u2014 the extensibility proof (plan M5): a non-GitHub\r\n// provider added with zero transport/store/ingest changes. Uses the user's own\r\n// `vercel` CLI auth; the deploy gate consumes this as a *secondary* signal only.\r\n//\r\n// `vercel list --prod --meta githubCommitSha=<sha>` prints a human table, not\r\n// JSON, so parsing is deliberately tolerant: any line with a deployment URL is\r\n// captured with its state word. When the CLI is missing/unauthenticated or the\r\n// checkout isn't linked to a Vercel project, the recipe reports unavailability\r\n// or returns null \u2014 the gate then decides from GitHub evidence/token as usual.\r\n\r\nimport { parseCommitEvidenceSubject, type EvidenceCollectorRecipe } from \"./types.js\";\r\n\r\nconst MAX_DEPLOYMENT_ROWS = 5;\r\nconst STATE_PATTERN = /\\b(READY|ERROR|BUILDING|QUEUED|CANCELED|INITIALIZING)\\b/i;\r\nconst URL_PATTERN = /https:\\/\\/[^\\s]+/;\r\n\r\nexport const vercelDeploymentStatusRecipe: EvidenceCollectorRecipe = {\r\n provider: \"vercel\",\r\n kind: \"deployment_status\",\r\n version: \"1\",\r\n isAvailable(run) {\r\n return run(\"vercel\", [\"whoami\"]).ok;\r\n },\r\n collect(subject, run) {\r\n const parsed = parseCommitEvidenceSubject(subject);\r\n if (!parsed) return null;\r\n const result = run(\"vercel\", [\r\n \"list\",\r\n \"--prod\",\r\n \"--meta\",\r\n `githubCommitSha=${parsed.sha}`,\r\n ]);\r\n if (!result.ok) return null;\r\n\r\n const deployments: Array<{ url: string; state: string | null }> = [];\r\n // Vercel CLI writes the table to stdout and headers/notes to stderr.\r\n for (const line of result.stdout.split(\"\\n\")) {\r\n const url = line.match(URL_PATTERN)?.[0];\r\n if (!url) continue;\r\n const state = line.match(STATE_PATTERN)?.[1]?.toUpperCase() ?? null;\r\n deployments.push({ url, state });\r\n if (deployments.length >= MAX_DEPLOYMENT_ROWS) break;\r\n }\r\n return { found: deployments.length > 0, deployments };\r\n },\r\n};\r\n", "// Collector-recipe registry keyed (provider, kind). The transport and the\r\n// collection loop know nothing about providers \u2014 adding one later is a recipe\r\n// here plus a consumer server-side; zero envelope/storage changes.\r\n\r\nimport {\r\n githubBranchReachabilityRecipe,\r\n githubCommitStatusRecipe,\r\n githubPrSnapshotRecipe,\r\n} from \"./recipes-github.js\";\r\nimport { vercelDeploymentStatusRecipe } from \"./recipes-vercel.js\";\r\nimport type { EvidenceCollectorRecipe } from \"./types.js\";\r\n\r\nconst _recipes: EvidenceCollectorRecipe[] = [];\r\n\r\nexport function registerEvidenceCollector(recipe: EvidenceCollectorRecipe): void {\r\n if (_recipes.some((r) => r.provider === recipe.provider && r.kind === recipe.kind)) return;\r\n _recipes.push(recipe);\r\n}\r\n\r\nexport function getEvidenceCollector(\r\n provider: string,\r\n kind: string,\r\n): EvidenceCollectorRecipe | null {\r\n return _recipes.find((r) => r.provider === provider && r.kind === kind) ?? null;\r\n}\r\n\r\nexport function listEvidenceCollectors(): EvidenceCollectorRecipe[] {\r\n return [..._recipes];\r\n}\r\n\r\n/** Idempotent default-recipe registration (called by the collection loop). */\r\nexport function registerDefaultEvidenceCollectors(): void {\r\n registerEvidenceCollector(githubPrSnapshotRecipe);\r\n registerEvidenceCollector(githubCommitStatusRecipe);\r\n registerEvidenceCollector(githubBranchReachabilityRecipe);\r\n registerEvidenceCollector(vercelDeploymentStatusRecipe);\r\n}\r\n", "// Bounded provider-evidence collection for one daemon tick.\r\n//\r\n// The server's tick response says WHAT to collect (\"evidence wanted\"); this\r\n// loop stays dumb about why. Budgets keep the pre-tick heartbeat fast: subject\r\n// cap per tick plus a wall-clock deadline, with deterministic rotation over the\r\n// wanted list so capped lists still get full coverage across consecutive ticks.\r\n\r\nimport { defaultCliRunner } from \"./exec.js\";\r\nimport { getEvidenceCollector, registerDefaultEvidenceCollectors } from \"./registry.js\";\r\nimport {\r\n providerEvidenceKey,\r\n type CliRunner,\r\n type ProviderEvidenceItem,\r\n type ProviderEvidenceWantedItem,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_MAX_SUBJECTS_PER_TICK = 8;\r\nconst DEFAULT_DEADLINE_MS = 25_000;\r\n\r\nexport interface ProviderEvidenceCollectionSummary {\r\n attempted: number;\r\n collected: number;\r\n items: ProviderEvidenceItem[];\r\n skipped: Array<{\r\n provider: string;\r\n kind: string;\r\n subject: string;\r\n reason: \"no_recipe\" | \"provider_unavailable\" | \"collect_failed\" | \"budget_exhausted\";\r\n }>;\r\n}\r\n\r\nexport function collectProviderEvidence(\r\n wanted: ProviderEvidenceWantedItem[],\r\n opts: {\r\n run?: CliRunner;\r\n maxSubjects?: number;\r\n deadlineMs?: number;\r\n now?: () => Date;\r\n } = {},\r\n): ProviderEvidenceCollectionSummary {\r\n registerDefaultEvidenceCollectors();\r\n const run = opts.run ?? defaultCliRunner;\r\n const now = opts.now ?? (() => new Date());\r\n const maxSubjects = opts.maxSubjects ?? DEFAULT_MAX_SUBJECTS_PER_TICK;\r\n const deadline = Date.now() + (opts.deadlineMs ?? DEFAULT_DEADLINE_MS);\r\n\r\n const seen = new Set<string>();\r\n const deduped = wanted.filter((w) => {\r\n const key = providerEvidenceKey(w.provider, w.kind, w.subject);\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n\r\n // Rotate the window by wall-clock minute so a capped list cycles through all\r\n // subjects over consecutive ticks instead of starving the tail.\r\n const offset =\r\n deduped.length > 0\r\n ? Math.floor(now().getTime() / 60_000) % deduped.length\r\n : 0;\r\n const rotated = deduped.map((_, i) => deduped[(offset + i) % deduped.length]);\r\n const window = rotated.slice(0, maxSubjects);\r\n\r\n const summary: ProviderEvidenceCollectionSummary = {\r\n attempted: 0,\r\n collected: 0,\r\n items: [],\r\n skipped: [],\r\n };\r\n const availability = new Map<string, boolean>();\r\n\r\n for (const item of window) {\r\n if (Date.now() > deadline) {\r\n summary.skipped.push({ ...item, reason: \"budget_exhausted\" });\r\n continue;\r\n }\r\n const recipe = getEvidenceCollector(item.provider, item.kind);\r\n if (!recipe) {\r\n summary.skipped.push({ ...item, reason: \"no_recipe\" });\r\n continue;\r\n }\r\n const availKey = `${recipe.provider} ${recipe.kind}`;\r\n let available = availability.get(availKey);\r\n if (available === undefined) {\r\n available = recipe.isAvailable(run);\r\n availability.set(availKey, available);\r\n }\r\n if (!available) {\r\n summary.skipped.push({ ...item, reason: \"provider_unavailable\" });\r\n continue;\r\n }\r\n summary.attempted += 1;\r\n const payload = recipe.collect(item.subject, run);\r\n if (payload === null || payload === undefined) {\r\n summary.skipped.push({ ...item, reason: \"collect_failed\" });\r\n continue;\r\n }\r\n summary.collected += 1;\r\n summary.items.push({\r\n provider: item.provider,\r\n kind: item.kind,\r\n subject: item.subject,\r\n payload,\r\n observedAt: now().toISOString(),\r\n collectorVersion: recipe.version,\r\n });\r\n }\r\n\r\n return summary;\r\n}\r\n", "// Persist the server's \"evidence wanted\" list between ticks: tick N's response\r\n// drives tick N+1's collection, so the daemon stays stateless about WHY a\r\n// subject matters and never invents subjects the server didn't ask for.\r\n\r\nimport path from \"node:path\";\r\nimport { runDirectory } from \"../run-store.js\";\r\nimport { readJson, writeJson } from \"../util.js\";\r\nimport type { ProviderEvidenceWantedItem } from \"./types.js\";\r\n\r\nconst WANTED_FILE = \"provider-evidence-wanted.json\";\r\n\r\ninterface PersistedWanted {\r\n savedAt: string;\r\n wanted: ProviderEvidenceWantedItem[];\r\n}\r\n\r\nfunction wantedFilePath(runId: string): string {\r\n return path.join(runDirectory(runId), WANTED_FILE);\r\n}\r\n\r\nfunction parseWantedItems(value: unknown): ProviderEvidenceWantedItem[] {\r\n if (!Array.isArray(value)) return [];\r\n const out: ProviderEvidenceWantedItem[] = [];\r\n for (const raw of value) {\r\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) continue;\r\n const row = raw as Record<string, unknown>;\r\n const provider = typeof row.provider === \"string\" ? row.provider.trim() : \"\";\r\n const kind = typeof row.kind === \"string\" ? row.kind.trim() : \"\";\r\n const subject = typeof row.subject === \"string\" ? row.subject.trim() : \"\";\r\n if (!provider || !kind || !subject) continue;\r\n out.push({ provider, kind, subject });\r\n }\r\n return out;\r\n}\r\n\r\nexport function loadPersistedProviderEvidenceWanted(runId: string): ProviderEvidenceWantedItem[] {\r\n const persisted = readJson<PersistedWanted | null>(wantedFilePath(runId), null);\r\n return parseWantedItems(persisted?.wanted);\r\n}\r\n\r\nexport function persistProviderEvidenceWanted(\r\n runId: string,\r\n wanted: ProviderEvidenceWantedItem[],\r\n): void {\r\n writeJson(wantedFilePath(runId), {\r\n savedAt: new Date().toISOString(),\r\n wanted,\r\n } satisfies PersistedWanted);\r\n}\r\n\r\n/** Extract `providerEvidenceWanted` from an operator-tick response body. */\r\nexport function extractProviderEvidenceWanted(\r\n tickResponse: unknown,\r\n): ProviderEvidenceWantedItem[] | null {\r\n if (!tickResponse || typeof tickResponse !== \"object\" || Array.isArray(tickResponse)) return null;\r\n const wanted = (tickResponse as Record<string, unknown>).providerEvidenceWanted;\r\n if (!Array.isArray(wanted)) return null;\r\n return parseWantedItems(wanted);\r\n}\r\n", "// Runtime-side chat claim loop + turn executor (M5.4). Spike:\r\n// docs/superpowers/plans/2026-06-10-m5-runtime-delegated-chat-spike.md\r\n//\r\n// Long-polls the Express bridge for delegated chat turns (the parked claim IS\r\n// this box's presence signal), executes each turn against local Anthropic\r\n// credentials, and pushes seq-numbered delta batches back. Off entirely\r\n// unless `KYNVER_RUNTIME_CHAT_BRIDGE_URL` is set. Every failure surfaces as a\r\n// terminal `error` event so the gateway falls back to its platform tiers \u2014\r\n// this loop must never leave a turn hanging.\r\n\r\nimport os from \"node:os\";\r\nimport { loadApiKey, loadUserConfig } from \"../config.js\";\r\nimport { resolveLocalAnthropicCredentials } from \"./anthropic-credentials.js\";\r\nimport { streamLocalAnthropicTurn, type ChatTurnPayload } from \"./anthropic-stream.js\";\r\nimport { DeltaBatcher } from \"./delta-batcher.js\";\r\n\r\nconst CLAIM_WAIT_MS = 25_000;\r\nconst CLAIM_FETCH_TIMEOUT_MS = 32_000;\r\nconst ERROR_BACKOFF_MS = 5_000;\r\nconst AUTH_BACKOFF_MS = 60_000;\r\nconst BRIDGE_REDISCOVER_MS = 5 * 60_000;\r\nconst DISCOVERY_TIMEOUT_MS = 5_000;\r\nconst DEFAULT_CHAT_MODEL = \"claude-sonnet-4-6\";\r\n\r\nexport interface ChatBridgeTarget {\r\n bridgeUrl: string;\r\n agentOsId: string;\r\n apiKey: string;\r\n boxId: string;\r\n model: string;\r\n /** Claude Code OAuth opt-in (config `chatUseClaudeOauth` or env). */\r\n useClaudeOauth: boolean;\r\n}\r\n\r\n/**\r\n * Discover the bridge URL. The env var is a local override (dev); the normal\r\n * path asks the Kynver API (`GET /api/runtime/chat-bridge`) \u2014 the operator\r\n * sets the deployment env once and every runtime picks it up automatically,\r\n * no per-user setup. Returns null while the rollout is off or unreachable.\r\n */\r\nasync function discoverBridgeUrl(\r\n apiBaseUrl: string | undefined,\r\n apiKey: string,\r\n env: Record<string, string | undefined>,\r\n): Promise<string | null> {\r\n const override = env.KYNVER_RUNTIME_CHAT_BRIDGE_URL?.trim();\r\n if (override) return override;\r\n if (!apiBaseUrl) return null;\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), DISCOVERY_TIMEOUT_MS);\r\n try {\r\n const res = await fetch(`${apiBaseUrl.replace(/\\/$/, \"\")}/api/runtime/chat-bridge`, {\r\n headers: { Authorization: `Bearer ${apiKey}` },\r\n signal: controller.signal,\r\n });\r\n if (!res.ok) return null;\r\n const body = (await res.json().catch(() => null)) as { bridgeUrl?: unknown } | null;\r\n return typeof body?.bridgeUrl === \"string\" && body.bridgeUrl.trim() ? body.bridgeUrl.trim() : null;\r\n } catch {\r\n return null;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n}\r\n\r\n/** Resolve the chat-bridge target; null when the feature is off/unconfigured. */\r\nexport async function resolveChatBridgeTarget(\r\n env: Record<string, string | undefined> = process.env,\r\n): Promise<ChatBridgeTarget | null> {\r\n const config = loadUserConfig();\r\n const agentOsId = config.agentOsId?.trim();\r\n const apiKey = loadApiKey();\r\n if (!agentOsId || !apiKey) return null;\r\n const bridgeUrl = await discoverBridgeUrl(config.apiBaseUrl, apiKey, env);\r\n if (!bridgeUrl) return null;\r\n return {\r\n bridgeUrl: bridgeUrl.replace(/\\/$/, \"\"),\r\n agentOsId,\r\n apiKey,\r\n boxId: os.hostname(),\r\n model: env.KYNVER_CHAT_MODEL?.trim() || config.defaultModel?.trim() || DEFAULT_CHAT_MODEL,\r\n useClaudeOauth: config.chatUseClaudeOauth === true,\r\n };\r\n}\r\n\r\ninterface ClaimedTurn {\r\n turnId: string;\r\n agentOsId: string;\r\n payload: ChatTurnPayload;\r\n}\r\n\r\nasync function claimOnce(\r\n target: ChatBridgeTarget,\r\n shouldStop: () => boolean,\r\n): Promise<ClaimedTurn | null | \"auth_error\"> {\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), CLAIM_FETCH_TIMEOUT_MS);\r\n // Abort the parked claim promptly on daemon stop (don't hold exit ~25s).\r\n const stopPoll = setInterval(() => {\r\n if (shouldStop()) controller.abort();\r\n }, 500);\r\n try {\r\n const res = await fetch(`${target.bridgeUrl}/runtime-chat/claim`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${target.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n agentOsId: target.agentOsId,\r\n boxId: target.boxId,\r\n waitMs: CLAIM_WAIT_MS,\r\n }),\r\n signal: controller.signal,\r\n });\r\n if (res.status === 204) return null;\r\n if (res.status === 401 || res.status === 403) return \"auth_error\";\r\n if (!res.ok) throw new Error(`claim failed: HTTP ${res.status}`);\r\n const body = (await res.json().catch(() => null)) as { turn?: ClaimedTurn } | null;\r\n return body?.turn ?? null;\r\n } catch (err) {\r\n if (shouldStop()) return null; // aborted by daemon stop \u2014 not an error\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n clearInterval(stopPoll);\r\n }\r\n}\r\n\r\nasync function pushEvents(\r\n target: ChatBridgeTarget,\r\n turnId: string,\r\n events: Array<Record<string, unknown>>,\r\n): Promise<boolean> {\r\n const res = await fetch(`${target.bridgeUrl}/runtime-chat/turns/${encodeURIComponent(turnId)}/events`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${target.apiKey}`,\r\n },\r\n body: JSON.stringify({ agentOsId: target.agentOsId, events }),\r\n });\r\n // 410 = turn closed (gateway gone / deadline hit) \u2014 caller should abort.\r\n return res.ok;\r\n}\r\n\r\n/** Execute one claimed turn and stream its events back. Never throws. */\r\nexport async function executeChatTurn(target: ChatBridgeTarget, turn: ClaimedTurn): Promise<void> {\r\n let seq = 0;\r\n let turnClosed = false;\r\n const abort = new AbortController();\r\n\r\n const sendBatch = (text: string) => {\r\n if (turnClosed) return;\r\n void pushEvents(target, turn.turnId, [{ seq: seq++, kind: \"delta\", text }]).then((ok) => {\r\n if (!ok) {\r\n turnClosed = true;\r\n abort.abort(); // stop paying for tokens nobody is receiving\r\n }\r\n });\r\n };\r\n const batcher = new DeltaBatcher(sendBatch);\r\n\r\n const creds = resolveLocalAnthropicCredentials(process.env, { oauthOptIn: target.useClaudeOauth });\r\n if (!creds) {\r\n await pushEvents(target, turn.turnId, [\r\n { seq: 0, kind: \"error\", error: \"no_local_credentials\" },\r\n ]).catch(() => {});\r\n return;\r\n }\r\n\r\n try {\r\n const message = await streamLocalAnthropicTurn({\r\n creds,\r\n model: target.model,\r\n payload: turn.payload,\r\n onDelta: (text) => batcher.push(text),\r\n signal: abort.signal,\r\n });\r\n batcher.close();\r\n if (!turnClosed) {\r\n await pushEvents(target, turn.turnId, [{ seq: seq++, kind: \"final\", message }]);\r\n }\r\n console.error(JSON.stringify({ event: \"chat_turn_done\", turnId: turn.turnId, model: target.model }));\r\n } catch (err) {\r\n batcher.close();\r\n if (!turnClosed) {\r\n await pushEvents(target, turn.turnId, [\r\n { seq: seq++, kind: \"error\", error: err instanceof Error ? err.message : String(err) },\r\n ]).catch(() => {});\r\n }\r\n console.error(\r\n JSON.stringify({\r\n event: \"chat_turn_error\",\r\n turnId: turn.turnId,\r\n error: err instanceof Error ? err.message : String(err),\r\n }),\r\n );\r\n }\r\n}\r\n\r\nasync function sleep(ms: number, shouldStop: () => boolean): Promise<void> {\r\n const step = 500;\r\n for (let waited = 0; waited < ms && !shouldStop(); waited += step) {\r\n await new Promise((resolve) => setTimeout(resolve, Math.min(step, ms - waited)));\r\n }\r\n}\r\n\r\n/**\r\n * The forever loop the daemon runs alongside its pipeline ticks. Serial by\r\n * design (one turn at a time per box). Exits when `shouldStop()` flips.\r\n */\r\nexport async function runChatClaimLoop(opts: { shouldStop: () => boolean }): Promise<void> {\r\n // Discover the bridge; while the rollout is off (API returns null) keep\r\n // re-checking every few minutes so enabling it server-side reaches running\r\n // daemons without a restart. A machine that isn't linked at all (no API\r\n // key / workspace) exits quietly \u2014 `kynver bootstrap` is the fix there.\r\n let target = await resolveChatBridgeTarget();\r\n while (!target && !opts.shouldStop()) {\r\n if (!loadApiKey() || !loadUserConfig().agentOsId?.trim()) return;\r\n await sleep(BRIDGE_REDISCOVER_MS, opts.shouldStop);\r\n if (opts.shouldStop()) return;\r\n target = await resolveChatBridgeTarget();\r\n }\r\n if (!target || opts.shouldStop()) return;\r\n\r\n console.error(\r\n JSON.stringify({\r\n event: \"chat_claim_loop_start\",\r\n bridgeUrl: target.bridgeUrl,\r\n agentOsId: target.agentOsId,\r\n boxId: target.boxId,\r\n model: target.model,\r\n useClaudeOauth: target.useClaudeOauth,\r\n }),\r\n );\r\n\r\n while (!opts.shouldStop()) {\r\n try {\r\n const claimed = await claimOnce(target, opts.shouldStop);\r\n if (claimed === \"auth_error\") {\r\n console.error(JSON.stringify({ event: \"chat_claim_auth_error\" }));\r\n await sleep(AUTH_BACKOFF_MS, opts.shouldStop);\r\n continue;\r\n }\r\n if (claimed) await executeChatTurn(target, claimed);\r\n // 204 \u2192 immediately re-park (the long-poll cadence).\r\n } catch (err) {\r\n console.error(\r\n JSON.stringify({\r\n event: \"chat_claim_error\",\r\n error: err instanceof Error ? err.message : String(err),\r\n }),\r\n );\r\n await sleep(ERROR_BACKOFF_MS, opts.shouldStop);\r\n }\r\n }\r\n console.error(JSON.stringify({ event: \"chat_claim_loop_stop\" }));\r\n}\r\n", "// Local Anthropic credentials for runtime-delegated chat turns (M5.4).\r\n//\r\n// Resolution order:\r\n// 1. ANTHROPIC_API_KEY on this machine (clean, full fidelity).\r\n// 2. Opt-in (`KYNVER_CHAT_USE_CLAUDE_OAUTH=1`): the Claude Code CLI's stored\r\n// OAuth access token \u2014 `~/.claude/.credentials.json` on Linux, the\r\n// \"Claude Code-credentials\" keychain entry on macOS. The token never\r\n// leaves this machine (P7 no-token-custody); an expired token resolves\r\n// to null (run `claude` to refresh) and the gateway falls back to its\r\n// platform tiers.\r\n\r\nimport { readFileSync } from \"node:fs\";\r\nimport { homedir, platform } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { execFileSync } from \"node:child_process\";\r\n\r\nexport type LocalAnthropicCredentials =\r\n | { kind: \"api_key\"; key: string }\r\n | { kind: \"oauth\"; token: string };\r\n\r\ninterface ClaudeOauthBlob {\r\n claudeAiOauth?: {\r\n accessToken?: string;\r\n expiresAt?: number;\r\n };\r\n}\r\n\r\nexport function parseClaudeCredentials(raw: string, now: number = Date.now()): string | null {\r\n try {\r\n const blob = JSON.parse(raw) as ClaudeOauthBlob;\r\n const token = blob.claudeAiOauth?.accessToken;\r\n const expiresAt = blob.claudeAiOauth?.expiresAt;\r\n if (typeof token !== \"string\" || !token) return null;\r\n // Treat a token expiring within 60s as expired \u2014 don't start a turn on it.\r\n if (typeof expiresAt === \"number\" && expiresAt - now < 60_000) return null;\r\n return token;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction readClaudeCliToken(): string | null {\r\n if (platform() === \"darwin\") {\r\n try {\r\n const raw = execFileSync(\r\n \"security\",\r\n [\"find-generic-password\", \"-s\", \"Claude Code-credentials\", \"-w\"],\r\n { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\r\n );\r\n return parseClaudeCredentials(raw.trim());\r\n } catch {\r\n return null;\r\n }\r\n }\r\n try {\r\n const raw = readFileSync(path.join(homedir(), \".claude\", \".credentials.json\"), \"utf8\");\r\n return parseClaudeCredentials(raw);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function resolveLocalAnthropicCredentials(\r\n env: Record<string, string | undefined> = process.env,\r\n opts: { oauthOptIn?: boolean } = {},\r\n): LocalAnthropicCredentials | null {\r\n const apiKey = env.ANTHROPIC_API_KEY?.trim();\r\n if (apiKey) return { kind: \"api_key\", key: apiKey };\r\n\r\n const envOptIn = env.KYNVER_CHAT_USE_CLAUDE_OAUTH;\r\n const optedIn =\r\n opts.oauthOptIn === true || envOptIn === \"1\" || envOptIn === \"true\" || envOptIn === \"yes\";\r\n if (optedIn) {\r\n const token = readClaudeCliToken();\r\n if (token) return { kind: \"oauth\", token };\r\n }\r\n return null;\r\n}\r\n", "// Streaming Anthropic Messages call from the user's machine (M5.4) \u2014 fetch\r\n// based (this package has zero runtime deps). The pure SSE fold is exported\r\n// for tests; `streamLocalAnthropicTurn` wires it to the network.\r\n\r\nimport type { LocalAnthropicCredentials } from \"./anthropic-credentials.js\";\r\n\r\nexport interface ChatTurnPayload {\r\n system: string;\r\n tools?: unknown[];\r\n messages: unknown[];\r\n maxTokens: number;\r\n temperature?: number;\r\n}\r\n\r\n/** Anthropic-shaped final message \u2014 the relay's `final` event body. */\r\nexport interface LocalTurnMessage {\r\n content: unknown[];\r\n stop_reason: string;\r\n usage: { input_tokens: number; output_tokens: number };\r\n}\r\n\r\n// OAuth tokens are scoped to Claude Code: the API requires the first system\r\n// block to carry the Claude Code identity. Kynver's real system prompt rides\r\n// as the second block. API-key calls send the system prompt unmodified.\r\nconst CLAUDE_CODE_IDENTITY = \"You are Claude Code, Anthropic's official CLI for Claude.\";\r\n\r\n// \u2500\u2500\u2500 Pure SSE accumulation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\ninterface ContentBlockAccumulator {\r\n type: \"text\" | \"tool_use\";\r\n text: string;\r\n id?: string;\r\n name?: string;\r\n inputJson: string;\r\n}\r\n\r\nexport interface AnthropicStreamAccumulator {\r\n blocks: ContentBlockAccumulator[];\r\n stopReason: string | null;\r\n inputTokens: number;\r\n outputTokens: number;\r\n}\r\n\r\nexport function createAnthropicAccumulator(): AnthropicStreamAccumulator {\r\n return { blocks: [], stopReason: null, inputTokens: 0, outputTokens: 0 };\r\n}\r\n\r\n/** Fold one parsed SSE event; returns the text delta it carried (if any). */\r\nexport function foldAnthropicEvent(acc: AnthropicStreamAccumulator, event: unknown): string {\r\n const e = event as {\r\n type?: string;\r\n index?: number;\r\n message?: { usage?: { input_tokens?: number } };\r\n content_block?: { type?: string; id?: string; name?: string };\r\n delta?: { type?: string; text?: string; partial_json?: string; stop_reason?: string };\r\n usage?: { output_tokens?: number };\r\n };\r\n switch (e.type) {\r\n case \"message_start\":\r\n acc.inputTokens = e.message?.usage?.input_tokens ?? 0;\r\n return \"\";\r\n case \"content_block_start\": {\r\n const idx = e.index ?? acc.blocks.length;\r\n acc.blocks[idx] = {\r\n type: e.content_block?.type === \"tool_use\" ? \"tool_use\" : \"text\",\r\n text: \"\",\r\n id: e.content_block?.id,\r\n name: e.content_block?.name,\r\n inputJson: \"\",\r\n };\r\n return \"\";\r\n }\r\n case \"content_block_delta\": {\r\n const block = acc.blocks[e.index ?? acc.blocks.length - 1];\r\n if (!block) return \"\";\r\n if (e.delta?.type === \"text_delta\" && e.delta.text) {\r\n block.text += e.delta.text;\r\n return e.delta.text;\r\n }\r\n if (e.delta?.type === \"input_json_delta\" && e.delta.partial_json) {\r\n block.inputJson += e.delta.partial_json;\r\n }\r\n return \"\";\r\n }\r\n case \"message_delta\":\r\n if (e.delta?.stop_reason) acc.stopReason = e.delta.stop_reason;\r\n if (typeof e.usage?.output_tokens === \"number\") acc.outputTokens = e.usage.output_tokens;\r\n return \"\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\nexport function toLocalTurnMessage(acc: AnthropicStreamAccumulator): LocalTurnMessage {\r\n const content: unknown[] = [];\r\n for (const block of acc.blocks) {\r\n if (!block) continue;\r\n if (block.type === \"tool_use\") {\r\n let input: unknown = {};\r\n try {\r\n input = block.inputJson ? JSON.parse(block.inputJson) : {};\r\n } catch {\r\n input = {};\r\n }\r\n content.push({ type: \"tool_use\", id: block.id ?? \"\", name: block.name ?? \"\", input });\r\n } else if (block.text) {\r\n content.push({ type: \"text\", text: block.text });\r\n }\r\n }\r\n return {\r\n content,\r\n stop_reason: acc.stopReason ?? \"end_turn\",\r\n usage: { input_tokens: acc.inputTokens, output_tokens: acc.outputTokens },\r\n };\r\n}\r\n\r\n// \u2500\u2500\u2500 Network call \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nasync function* parseSseLines(body: ReadableStream<Uint8Array>): AsyncGenerator<unknown> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n try {\r\n for (;;) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n buffer += decoder.decode(value, { stream: true });\r\n let idx: number;\r\n while ((idx = buffer.indexOf(\"\\n\")) !== -1) {\r\n const line = buffer.slice(0, idx).trim();\r\n buffer = buffer.slice(idx + 1);\r\n if (!line.startsWith(\"data:\")) continue;\r\n const payload = line.slice(5).trim();\r\n if (!payload || payload === \"[DONE]\") continue;\r\n try {\r\n yield JSON.parse(payload);\r\n } catch {\r\n // skip malformed event\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\nexport function getAnthropicBaseUrl(env: Record<string, string | undefined> = process.env): string {\r\n return (env.ANTHROPIC_BASE_URL?.trim() || \"https://api.anthropic.com\").replace(/\\/$/, \"\");\r\n}\r\n\r\nexport async function streamLocalAnthropicTurn(input: {\r\n creds: LocalAnthropicCredentials;\r\n model: string;\r\n payload: ChatTurnPayload;\r\n onDelta: (text: string) => void;\r\n signal?: AbortSignal;\r\n}): Promise<LocalTurnMessage> {\r\n const { creds, model, payload } = input;\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n \"anthropic-version\": \"2023-06-01\",\r\n };\r\n let system: unknown = payload.system;\r\n if (creds.kind === \"api_key\") {\r\n headers[\"x-api-key\"] = creds.key;\r\n } else {\r\n headers.Authorization = `Bearer ${creds.token}`;\r\n headers[\"anthropic-beta\"] = \"oauth-2025-04-20\";\r\n system = [\r\n { type: \"text\", text: CLAUDE_CODE_IDENTITY },\r\n { type: \"text\", text: payload.system },\r\n ];\r\n }\r\n\r\n const res = await fetch(`${getAnthropicBaseUrl()}/v1/messages`, {\r\n method: \"POST\",\r\n headers,\r\n signal: input.signal,\r\n body: JSON.stringify({\r\n model,\r\n max_tokens: payload.maxTokens,\r\n system,\r\n messages: payload.messages,\r\n ...(Array.isArray(payload.tools) && payload.tools.length > 0 ? { tools: payload.tools } : {}),\r\n ...(payload.temperature !== undefined ? { temperature: payload.temperature } : {}),\r\n stream: true,\r\n }),\r\n });\r\n if (!res.ok || !res.body) {\r\n const detail = await res.text().catch(() => \"\");\r\n throw new Error(`Anthropic stream failed: HTTP ${res.status}${detail ? ` \u2014 ${detail.slice(0, 300)}` : \"\"}`);\r\n }\r\n\r\n const acc = createAnthropicAccumulator();\r\n for await (const event of parseSseLines(res.body)) {\r\n const delta = foldAnthropicEvent(acc, event);\r\n if (delta) input.onDelta(delta);\r\n }\r\n return toLocalTurnMessage(acc);\r\n}\r\n", "// Delta batching (M5 anti-spiral guardrail): text deltas are coalesced and\r\n// flushed no faster than the floor interval, so a fast model cannot multiply\r\n// the number of relay messages (\u2264 ~turn-seconds / floor flushes per turn).\r\n\r\nexport const DELTA_FLUSH_FLOOR_MS = 150;\r\n\r\nexport class DeltaBatcher {\r\n private buffer = \"\";\r\n private timer: NodeJS.Timeout | null = null;\r\n private closed = false;\r\n\r\n constructor(\r\n private readonly flushFn: (text: string) => void,\r\n private readonly floorMs: number = DELTA_FLUSH_FLOOR_MS,\r\n ) {}\r\n\r\n push(text: string): void {\r\n if (this.closed || !text) return;\r\n this.buffer += text;\r\n if (!this.timer) {\r\n this.timer = setTimeout(() => {\r\n this.timer = null;\r\n this.flushNow();\r\n }, this.floorMs);\r\n }\r\n }\r\n\r\n private flushNow(): void {\r\n if (!this.buffer) return;\r\n const text = this.buffer;\r\n this.buffer = \"\";\r\n this.flushFn(text);\r\n }\r\n\r\n /** Flush any remainder and stop the timer. Idempotent. */\r\n close(): void {\r\n if (this.closed) return;\r\n this.closed = true;\r\n if (this.timer) {\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n }\r\n this.flushNow();\r\n }\r\n}\r\n", "// Daemon keeper \u2014 local mutual keep-alive (`kynver daemon --supervised`).\r\n//\r\n// The keeper spawns the real daemon loop as a child process and restarts it\r\n// when it exits (crash, accidental OOM kill) or when its heartbeat file goes\r\n// stale (hung event loop / deadlocked tick): SIGTERM, a kill grace, SIGKILL,\r\n// respawn with exponential backoff. The other direction already exists \u2014 a\r\n// live daemon tick drives the server factory supervisor, which re-registers\r\n// the hosted watchdog schedule when it goes stale \u2014 so the pair keep each\r\n// other up unless the box itself dies.\r\n//\r\n// Catastrophic-box backstop: the hosted watchdog cron now also runs the\r\n// factory supervisor server-side, so a dead box still escalates (Telegram +\r\n// Command Center) instead of failing silently.\r\n\r\nimport { spawn, type ChildProcess } from \"node:child_process\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport {\r\n isDaemonHeartbeatStale,\r\n readDaemonHeartbeat,\r\n} from \"./daemon-heartbeat.js\";\r\nimport { required, sleepMsAsync } from \"./util.js\";\r\n\r\nconst DEFAULT_STALL_MS = 15 * 60_000;\r\nconst STARTUP_GRACE_MS = 2 * 60_000;\r\nconst KILL_GRACE_MS = 10_000;\r\nconst BACKOFF_BASE_MS = 5_000;\r\nconst BACKOFF_CAP_MS = 5 * 60_000;\r\nconst HEALTHY_RESET_MS = 30 * 60_000;\r\nconst POLL_MS = 5_000;\r\n\r\nexport function resolveKeeperStallMs(\r\n flag: string | boolean | undefined,\r\n env: NodeJS.ProcessEnv = process.env,\r\n): number {\r\n const fromFlag = typeof flag === \"string\" ? Number.parseInt(flag, 10) : NaN;\r\n if (Number.isFinite(fromFlag) && fromFlag > 0) return fromFlag;\r\n const fromEnv = Number.parseInt(env.KYNVER_DAEMON_STALL_MS ?? \"\", 10);\r\n if (Number.isFinite(fromEnv) && fromEnv > 0) return fromEnv;\r\n return DEFAULT_STALL_MS;\r\n}\r\n\r\n/**\r\n * Supervision is the DEFAULT for `kynver daemon`. Opt out only when an\r\n * external supervisor (systemd, pm2, container restart policy) already owns\r\n * restarts: `--no-supervise`, `--supervised false`, or\r\n * `KYNVER_DAEMON_SUPERVISED=0|false|no|off`. The keeper's own child carries\r\n * the internal `--keeper-child` flag so it can never recurse into a second\r\n * keeper. `--supervised` stays accepted as a no-op for back-compat.\r\n */\r\nexport function shouldRunDaemonKeeper(\r\n args: Record<string, string | boolean>,\r\n env: NodeJS.ProcessEnv = process.env,\r\n): boolean {\r\n if (args.keeperChild === true || args.keeperChild === \"true\") return false;\r\n if (args.noSupervise === true || args.noSupervise === \"true\") return false;\r\n if (args.supervised === \"false\") return false;\r\n const envFlag = (env.KYNVER_DAEMON_SUPERVISED ?? \"\").trim().toLowerCase();\r\n if (envFlag === \"0\" || envFlag === \"false\" || envFlag === \"no\" || envFlag === \"off\") {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Exponential backoff with cap; resets to base after a healthy stretch. */\r\nexport function nextKeeperBackoffMs(\r\n consecutiveFailures: number,\r\n base = BACKOFF_BASE_MS,\r\n cap = BACKOFF_CAP_MS,\r\n): number {\r\n const exp = Math.min(Math.max(consecutiveFailures, 1) - 1, 10);\r\n return Math.min(base * 2 ** exp, cap);\r\n}\r\n\r\n/** True when the child ran long enough to count as healthy (resets backoff). */\r\nexport function keeperRunWasHealthy(\r\n startedAtMs: number,\r\n endedAtMs: number,\r\n healthyMs = HEALTHY_RESET_MS,\r\n): boolean {\r\n return endedAtMs - startedAtMs >= healthyMs;\r\n}\r\n\r\nfunction keeperLog(event: string, detail: Record<string, unknown> = {}): void {\r\n console.error(JSON.stringify({ event: `daemon_keeper_${event}`, ...detail }));\r\n}\r\n\r\n/**\r\n * Rebuild the child argv: original daemon args minus keeper-only flags, plus\r\n * the internal `--keeper-child` marker that prevents keeper recursion now\r\n * that supervision is the default.\r\n */\r\nexport function buildKeeperChildArgv(argv: readonly string[]): string[] {\r\n const out: string[] = [];\r\n for (let i = 0; i < argv.length; i += 1) {\r\n const arg = argv[i]!;\r\n if (arg === \"--supervised\" || arg === \"--no-supervise\" || arg === \"--keeper-child\") continue;\r\n if (arg === \"--stall-ms\") {\r\n // Skip the flag and its value form `--stall-ms 900000`.\r\n if (i + 1 < argv.length && !argv[i + 1]!.startsWith(\"--\")) i += 1;\r\n continue;\r\n }\r\n if (arg.startsWith(\"--stall-ms=\") || arg.startsWith(\"--supervised=\")) continue;\r\n out.push(arg);\r\n }\r\n out.push(\"--keeper-child\");\r\n return out;\r\n}\r\n\r\nexport async function runDaemonKeeper(\r\n args: Record<string, string | boolean>,\r\n rawArgv: readonly string[] = process.argv.slice(2),\r\n): Promise<void> {\r\n const agentOsId = String(\r\n required(String(args.agentOsId || loadUserConfig().agentOsId || \"\"), \"--agent-os-id\"),\r\n );\r\n const stallMs = resolveKeeperStallMs(args.stallMs as string | undefined);\r\n const childArgv = buildKeeperChildArgv(rawArgv);\r\n const cliEntry = process.argv[1]!;\r\n\r\n let stopping = false;\r\n let child: ChildProcess | null = null;\r\n let consecutiveFailures = 0;\r\n\r\n const stop = (signal: NodeJS.Signals) => {\r\n stopping = true;\r\n keeperLog(\"stop\", { signal });\r\n if (child?.pid) child.kill(signal);\r\n };\r\n process.on(\"SIGINT\", () => stop(\"SIGINT\"));\r\n process.on(\"SIGTERM\", () => stop(\"SIGTERM\"));\r\n\r\n keeperLog(\"start\", { agentOsId, stallMs, childArgv });\r\n\r\n while (!stopping) {\r\n const startedAt = Date.now();\r\n let exited = false;\r\n let exitCode: number | null = null;\r\n let exitSignal: NodeJS.Signals | null = null;\r\n\r\n child = spawn(process.execPath, [cliEntry, ...childArgv], {\r\n stdio: \"inherit\",\r\n env: process.env,\r\n });\r\n keeperLog(\"child_spawned\", { pid: child.pid ?? null });\r\n\r\n child.on(\"exit\", (code, signal) => {\r\n exited = true;\r\n exitCode = code;\r\n exitSignal = signal;\r\n });\r\n\r\n // Monitor: exit OR stale heartbeat (after a startup grace window).\r\n while (!exited && !stopping) {\r\n await sleepMsAsync(POLL_MS);\r\n if (exited || stopping) break;\r\n if (Date.now() - startedAt < STARTUP_GRACE_MS) continue;\r\n const beat = readDaemonHeartbeat(agentOsId);\r\n // Only trust heartbeats from THIS child \u2014 a stale file from a previous\r\n // pid must not kill a fresh child still inside its grace window.\r\n const ownBeat = beat && beat.pid === child.pid ? beat : null;\r\n if (ownBeat && isDaemonHeartbeatStale(ownBeat, stallMs)) {\r\n keeperLog(\"stall_detected\", {\r\n pid: child.pid ?? null,\r\n lastBeatAt: ownBeat.observedAt,\r\n stallMs,\r\n });\r\n child.kill(\"SIGTERM\");\r\n await sleepMsAsync(KILL_GRACE_MS);\r\n if (!exited) child.kill(\"SIGKILL\");\r\n break;\r\n }\r\n if (!ownBeat && Date.now() - startedAt > stallMs + STARTUP_GRACE_MS) {\r\n // Child has run well past the stall window without ever heartbeating.\r\n keeperLog(\"no_heartbeat_detected\", { pid: child.pid ?? null, stallMs });\r\n child.kill(\"SIGTERM\");\r\n await sleepMsAsync(KILL_GRACE_MS);\r\n if (!exited) child.kill(\"SIGKILL\");\r\n break;\r\n }\r\n }\r\n\r\n // Wait for the exit event to land after a kill.\r\n while (!exited && !stopping) {\r\n await sleepMsAsync(POLL_MS);\r\n }\r\n if (stopping) break;\r\n\r\n const endedAt = Date.now();\r\n if (keeperRunWasHealthy(startedAt, endedAt)) consecutiveFailures = 0;\r\n consecutiveFailures += 1;\r\n const backoff = nextKeeperBackoffMs(consecutiveFailures);\r\n keeperLog(\"child_exited\", {\r\n code: exitCode,\r\n signal: exitSignal,\r\n uptimeMs: endedAt - startedAt,\r\n consecutiveFailures,\r\n respawnInMs: backoff,\r\n });\r\n await sleepMsAsync(backoff);\r\n }\r\n\r\n keeperLog(\"stopped\", { agentOsId });\r\n}\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { loadWorker, saveWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { resolveWorkerTargetArgs } from \"./validate.js\";\r\n\r\nfunction normalizeRelativePath(value: string): string {\r\n const normalized = value.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").trim();\r\n if (!normalized || normalized.startsWith(\"/\") || normalized.includes(\"..\")) {\r\n throw new Error(`unsafe path: ${value}`);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction parsePathsArg(raw: string | boolean | undefined): string[] {\r\n if (typeof raw !== \"string\" || !raw.trim()) return [];\r\n return raw\r\n .split(\",\")\r\n .map((p) => p.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nexport function discardDisposableArtifacts(args: Record<string, string | boolean>): {\r\n ok: boolean;\r\n removed: string[];\r\n reason?: string;\r\n} {\r\n const { runId, workerName } = resolveWorkerTargetArgs(args);\r\n const worker = loadWorker(runId, workerName);\r\n const paths = [\r\n ...parsePathsArg(args.path),\r\n ...(Array.isArray(args.paths) ? (args.paths as string[]) : []),\r\n ];\r\n if (paths.length === 0) {\r\n return { ok: false, removed: [], reason: \"requires at least one --path\" };\r\n }\r\n\r\n const worktreeRoot = path.resolve(worker.worktreePath);\r\n const removed: string[] = [];\r\n\r\n for (const raw of paths) {\r\n const rel = normalizeRelativePath(raw);\r\n const abs = path.resolve(worktreeRoot, rel);\r\n if (!abs.startsWith(worktreeRoot + path.sep) && abs !== worktreeRoot) {\r\n return { ok: false, removed, reason: `path escapes worktree: ${raw}` };\r\n }\r\n if (!existsSync(abs)) {\r\n return { ok: false, removed, reason: `path not found: ${raw}` };\r\n }\r\n rmSync(abs, { recursive: true, force: true });\r\n removed.push(rel);\r\n }\r\n\r\n const prior = Array.isArray(worker.disposableArtifactsRemoved)\r\n ? worker.disposableArtifactsRemoved.filter((p): p is string => typeof p === \"string\")\r\n : [];\r\n worker.disposableArtifactsRemoved = [...new Set([...prior, ...removed])];\r\n saveWorker(worker.runId, worker);\r\n\r\n const status = computeWorkerStatus(worker);\r\n return {\r\n ok: true,\r\n removed,\r\n ...(status.changedFiles.length ? { reason: \"worktree still has other changes\" } : {}),\r\n };\r\n}\r\n\r\nexport function discardDisposableCli(args: Record<string, string | boolean>): void {\r\n const result = discardDisposableArtifacts(args);\r\n console.log(JSON.stringify(result, null, 2));\r\n if (!result.ok) process.exit(1);\r\n}\r\n", "import path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint, loadUserConfig } from \"./config.js\";\r\nimport { buildHarnessCallbackHeaders } from \"./callback-headers.js\";\r\nimport { runHarnessVerifyCommands } from \"./harness-verify.js\";\r\nimport { required } from \"./util.js\";\r\nimport {\r\n DEFAULT_WORKER_PROVIDER,\r\n resolveConfiguredWorkerProvider,\r\n} from \"./worker-provider-policy.js\";\r\n\r\nexport interface PlanProgressCliEvidence {\r\n type: string;\r\n value: string;\r\n exitCode?: number;\r\n stdoutTail?: string;\r\n}\r\n\r\nfunction parseEvidenceArg(raw: string): PlanProgressCliEvidence {\r\n const idx = raw.indexOf(\":\");\r\n if (idx <= 0) throw new Error(`invalid --evidence ${raw} (expected type:value)`);\r\n return { type: raw.slice(0, idx), value: raw.slice(idx + 1) };\r\n}\r\n\r\nexport async function emitPlanProgress(args: Record<string, string | boolean>): Promise<void> {\r\n const planId = required(args.plan ? String(args.plan) : undefined, \"plan\");\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : loadUserConfig().agentOsId) || \"\";\r\n if (!agentOsId) {\r\n console.error(\"requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const roleLane = required(args.role ? String(args.role) : undefined, \"role\");\r\n const status = required(args.status ? String(args.status) : undefined, \"status\");\r\n const evidence: PlanProgressCliEvidence[] = [];\r\n const rawEvidence = args.evidence;\r\n if (Array.isArray(rawEvidence)) {\r\n for (const item of rawEvidence) evidence.push(parseEvidenceArg(String(item)));\r\n } else if (typeof rawEvidence === \"string\") {\r\n evidence.push(parseEvidenceArg(rawEvidence));\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : undefined, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/plans/${encodeURIComponent(planId)}/progress-events`;\r\n const cfg = loadUserConfig();\r\n const workerProvider = resolveConfiguredWorkerProvider(cfg.workerProvider, DEFAULT_WORKER_PROVIDER);\r\n const provider = `provider:${workerProvider}`;\r\n\r\n const explicitProposed =\r\n args.proposed === true || args.proposed === \"true\"\r\n ? true\r\n : args.proposed === false || args.proposed === \"false\"\r\n ? false\r\n : undefined;\r\n // Harness by-id route rejects `proposed: false` (confirm-done). Implementer checkpoints default to propose.\r\n const proposed =\r\n explicitProposed ??\r\n (status !== \"done\" && (roleLane === \"implementer\" || roleLane === \"repair_implementer\"));\r\n\r\n const body: Record<string, unknown> = {\r\n rowKey: args.row ? String(args.row) : undefined,\r\n rowId: args.rowId ? String(args.rowId) : undefined,\r\n taskId: args.task ? String(args.task) : undefined,\r\n reviewTaskId: args.reviewTask ? String(args.reviewTask) : undefined,\r\n roleLane,\r\n status,\r\n note: args.note ? String(args.note) : undefined,\r\n remainingWork: args.remaining ? String(args.remaining) : undefined,\r\n evidence: evidence.length ? evidence : undefined,\r\n executorRef: args.executorRef ? String(args.executorRef) : provider,\r\n };\r\n if (proposed !== undefined) body.proposed = proposed;\r\n\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers: buildHarnessCallbackHeaders(secret),\r\n body: JSON.stringify(body),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: unknown = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = text;\r\n }\r\n if (!res.ok) {\r\n console.error(JSON.stringify({ httpStatus: res.status, response: parsed }, null, 2));\r\n process.exit(1);\r\n }\r\n console.log(JSON.stringify(parsed, null, 2));\r\n}\r\n\r\n/** Memory-bounded local verify (npm typecheck/test) before optional API verify. */\r\nexport function verifyPlanLocal(args: Record<string, string | boolean>): void {\r\n const worktree = required(args.worktree ? String(args.worktree) : undefined, \"worktree\");\r\n const cwd = path.resolve(worktree);\r\n const summary = runHarnessVerifyCommands(cwd);\r\n const emitJson = args.json === true || args.json === \"true\";\r\n const payload = { passed: summary.passed, worktree: cwd, steps: summary.steps };\r\n if (emitJson) console.log(JSON.stringify(payload, null, 2));\r\n else console.log(summary.passed ? \"local plan verify passed\" : \"local plan verify failed\");\r\n if (!summary.passed) process.exit(1);\r\n}\r\n\r\nexport async function verifyPlan(args: Record<string, string | boolean>): Promise<void> {\r\n const planId = required(args.plan ? String(args.plan) : undefined, \"plan\");\r\n const localOnly = args.local === true || args.local === \"true\";\r\n if (localOnly) {\r\n verifyPlanLocal(args);\r\n return;\r\n }\r\n const slug = loadUserConfig().agentOsSlug;\r\n if (!slug) {\r\n console.error(\"requires agentOsSlug in ~/.kynver/config.json for verify (session route)\");\r\n process.exit(1);\r\n }\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const apiKey = process.env.KYNVER_API_KEY;\r\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\r\n\r\n const url = `${base}/api/agent-os/${encodeURIComponent(slug)}/plans/${encodeURIComponent(planId)}/verify`;\r\n const res = await fetch(url, {\r\n method: \"POST\",\r\n headers,\r\n body: JSON.stringify({\r\n worktreePath: args.worktree ? String(args.worktree) : undefined,\r\n taskId: args.task ? String(args.task) : undefined,\r\n humanOverride: args.humanOverride === true || args.humanOverride === \"true\",\r\n }),\r\n });\r\n\r\n const text = await res.text();\r\n let parsed: unknown = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = text;\r\n }\r\n if (!res.ok) {\r\n console.error(JSON.stringify({ httpStatus: res.status, response: parsed }, null, 2));\r\n process.exit(1);\r\n }\r\n console.log(JSON.stringify(parsed, null, 2));\r\n}\r\n", "/** Per-build RAM budget for admission (aligns with Hermes autopipeline worker sizing). */\r\nexport const DEFAULT_BUILD_MEM_BUDGET_BYTES = 1536 * 1024 * 1024;\r\n\r\n/** Headroom reserved for OS / gateway before admitting another build. */\r\nexport const DEFAULT_BUILD_MEM_RESERVE_BYTES = 2 * 1024 * 1024 * 1024;\r\n\r\n/** Node heap cap for npm/tsc build/check subprocesses unless overridden. */\r\nexport const DEFAULT_NODE_OLD_SPACE_SIZE_MB = 1024;\r\n\r\n/** systemd scope MemoryMax for build/check subprocesses. */\r\nexport const DEFAULT_SYSTEMD_MEMORY_MAX = \"1.5G\";\r\n\r\n/** systemd scope MemorySwapMax for build/check subprocesses. */\r\nexport const DEFAULT_SYSTEMD_MEMORY_SWAP_MAX = \"2G\";\r\n", "export {\r\n DEFAULT_BUILD_MEM_BUDGET_BYTES,\r\n DEFAULT_BUILD_MEM_RESERVE_BYTES,\r\n DEFAULT_NODE_OLD_SPACE_SIZE_MB,\r\n DEFAULT_SYSTEMD_MEMORY_MAX,\r\n DEFAULT_SYSTEMD_MEMORY_SWAP_MAX,\r\n} from \"./constants.js\";\r\nexport { readMemAvailableBytes } from \"./meminfo.js\";\r\nexport {\r\n formatNodeOptionsFlag,\r\n mergeNodeOptionsForBuildCheck,\r\n resolveNodeOldSpaceSizeMb,\r\n} from \"./node-options.js\";\r\nexport {\r\n buildSystemdRunArgv,\r\n isSystemdRunAvailable,\r\n type SystemdWrapOptions,\r\n} from \"./systemd-wrap.js\";\r\nexport {\r\n assessBuildAdmission,\r\n getActiveBuildCount,\r\n registerBuildEnd,\r\n registerBuildStart,\r\n resetActiveBuildCountForTests,\r\n resolveBuildAdmissionConfig,\r\n waitForBuildAdmission,\r\n type BuildAdmissionConfig,\r\n type BuildAdmissionVerdict,\r\n} from \"./admission.js\";\r\nexport { runBoundedBuildCheck, type BoundedBuildExecResult, type RunBoundedBuildCheckInput } from \"./exec.js\";\r\n", "import { DEFAULT_NODE_OLD_SPACE_SIZE_MB } from \"./constants.js\";\r\n\r\nconst MAX_OLD_SPACE_RE = /--max-old-space-size=(\\d+)/;\r\n\r\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\n/** Resolved Node old-space cap in MiB (env override, else default 1024). */\r\nexport function resolveNodeOldSpaceSizeMb(): number {\r\n return parsePositiveInt(process.env.KYNVER_NODE_OLD_SPACE_SIZE_MB, DEFAULT_NODE_OLD_SPACE_SIZE_MB);\r\n}\r\n\r\n/**\r\n * Merge NODE_OPTIONS for build/check subprocesses: set --max-old-space-size unless\r\n * the caller already set one in NODE_OPTIONS or KYNVER_NODE_OLD_SPACE_SIZE_MB=0\r\n * disables injection.\r\n */\r\nexport function mergeNodeOptionsForBuildCheck(baseEnv: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\r\n const env = { ...baseEnv };\r\n if (process.env.KYNVER_NODE_OLD_SPACE_SIZE_MB === \"0\") {\r\n return env;\r\n }\r\n const existing = env.NODE_OPTIONS ?? \"\";\r\n if (MAX_OLD_SPACE_RE.test(existing)) {\r\n return env;\r\n }\r\n const mb = resolveNodeOldSpaceSizeMb();\r\n const flag = `--max-old-space-size=${mb}`;\r\n env.NODE_OPTIONS = existing.trim() ? `${existing.trim()} ${flag}` : flag;\r\n return env;\r\n}\r\n\r\nexport function formatNodeOptionsFlag(mb = resolveNodeOldSpaceSizeMb()): string {\r\n return `--max-old-space-size=${mb}`;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport {\r\n DEFAULT_SYSTEMD_MEMORY_MAX,\r\n DEFAULT_SYSTEMD_MEMORY_SWAP_MAX,\r\n} from \"./constants.js\";\r\n\r\nexport interface SystemdWrapOptions {\r\n memoryMax?: string;\r\n memorySwapMax?: string;\r\n cwd?: string;\r\n /** argv after `--` (no shell). */\r\n command: string[];\r\n env?: NodeJS.ProcessEnv;\r\n}\r\n\r\nlet systemdAvailableCache: boolean | undefined;\r\n\r\n/** Clear cached systemd probe (tests). */\r\nexport function resetSystemdAvailabilityCacheForTests(): void {\r\n systemdAvailableCache = undefined;\r\n}\r\n\r\n/** True when `systemd-run --version` succeeds (Linux hosts with systemd). */\r\nexport function isSystemdRunAvailable(): boolean {\r\n if (process.env.KYNVER_BUILD_SKIP_SYSTEMD === \"1\" || process.env.KYNVER_BUILD_SKIP_SYSTEMD === \"true\") {\r\n return false;\r\n }\r\n if (systemdAvailableCache !== undefined) return systemdAvailableCache;\r\n if (process.platform !== \"linux\") {\r\n systemdAvailableCache = false;\r\n return false;\r\n }\r\n const res = spawnSync(\"systemd-run\", [\"--version\"], { encoding: \"utf8\", stdio: [\"ignore\", \"ignore\", \"pipe\"] });\r\n systemdAvailableCache = res.status === 0;\r\n return systemdAvailableCache;\r\n}\r\n\r\n/**\r\n * Build argv for `systemd-run --scope` with memory properties, then `-- command\u2026`.\r\n * Does not execute the command.\r\n */\r\nexport function buildSystemdRunArgv(opts: SystemdWrapOptions): string[] {\r\n const memoryMax = opts.memoryMax ?? process.env.KYNVER_BUILD_SYSTEMD_MEMORY_MAX ?? DEFAULT_SYSTEMD_MEMORY_MAX;\r\n const memorySwapMax =\r\n opts.memorySwapMax ?? process.env.KYNVER_BUILD_SYSTEMD_MEMORY_SWAP_MAX ?? DEFAULT_SYSTEMD_MEMORY_SWAP_MAX;\r\n const argv: string[] = [\r\n \"systemd-run\",\r\n \"--scope\",\r\n \"--collect\",\r\n \"-p\",\r\n `MemoryMax=${memoryMax}`,\r\n \"-p\",\r\n `MemorySwapMax=${memorySwapMax}`,\r\n ];\r\n if (opts.cwd) {\r\n argv.push(\"--working-directory\", opts.cwd);\r\n }\r\n argv.push(\"--\", ...opts.command);\r\n return argv;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport { loadUserConfig } from \"../config.js\";\r\nimport {\r\n DEFAULT_BUILD_MEM_BUDGET_BYTES,\r\n DEFAULT_BUILD_MEM_RESERVE_BYTES,\r\n} from \"./constants.js\";\r\nimport { readMemAvailableBytes } from \"./meminfo.js\";\r\n\r\nexport interface BuildAdmissionConfig {\r\n perBuildBudgetBytes: number;\r\n reserveBytes: number;\r\n}\r\n\r\nexport interface BuildAdmissionVerdict {\r\n admitted: boolean;\r\n memAvailableBytes: number;\r\n requiredBytes: number;\r\n activeBuilds: number;\r\n reason: string | null;\r\n}\r\n\r\nfunction positiveInt(value: unknown, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nexport function resolveBuildAdmissionConfig(\r\n config = loadUserConfig(),\r\n): BuildAdmissionConfig {\r\n const envBudget = process.env.KYNVER_BUILD_MEM_BUDGET_BYTES\r\n ? positiveInt(process.env.KYNVER_BUILD_MEM_BUDGET_BYTES, DEFAULT_BUILD_MEM_BUDGET_BYTES)\r\n : undefined;\r\n const envReserve = process.env.KYNVER_BUILD_MEM_RESERVE_BYTES\r\n ? positiveInt(process.env.KYNVER_BUILD_MEM_RESERVE_BYTES, DEFAULT_BUILD_MEM_RESERVE_BYTES)\r\n : undefined;\r\n return {\r\n perBuildBudgetBytes:\r\n envBudget ?? positiveInt(config.perWorkerMemBytes, DEFAULT_BUILD_MEM_BUDGET_BYTES),\r\n reserveBytes: envReserve ?? positiveInt(config.memReserveBytes, DEFAULT_BUILD_MEM_RESERVE_BYTES),\r\n };\r\n}\r\n\r\n/** In-process counter of builds started via runBoundedBuildCheck (same Node PID). */\r\nlet activeBuilds = 0;\r\n\r\nexport function getActiveBuildCount(): number {\r\n return activeBuilds;\r\n}\r\n\r\n/** Reset active build counter (tests). */\r\nexport function resetActiveBuildCountForTests(): void {\r\n activeBuilds = 0;\r\n}\r\n\r\nexport function registerBuildStart(): void {\r\n activeBuilds += 1;\r\n}\r\n\r\nexport function registerBuildEnd(): void {\r\n activeBuilds = Math.max(0, activeBuilds - 1);\r\n}\r\n\r\n/**\r\n * RAM-aware admission: start another worktree build only when MemAvailable \u2265\r\n * per-build budget + reserve. Cross-process serialization is enforced separately\r\n * by the heavy-verification gate before this check runs.\r\n */\r\nexport function assessBuildAdmission(\r\n opts: Partial<BuildAdmissionConfig> & { memAvailableBytes?: number } = {},\r\n): BuildAdmissionVerdict {\r\n const cfg = { ...resolveBuildAdmissionConfig(), ...opts };\r\n const memAvailableBytes = opts.memAvailableBytes ?? readMemAvailableBytes();\r\n const requiredBytes = cfg.perBuildBudgetBytes + cfg.reserveBytes;\r\n const admitted = memAvailableBytes >= requiredBytes;\r\n return {\r\n admitted,\r\n memAvailableBytes,\r\n requiredBytes,\r\n activeBuilds,\r\n reason: admitted\r\n ? null\r\n : `insufficient memory: need ${requiredBytes} bytes available (budget ${cfg.perBuildBudgetBytes} + reserve ${cfg.reserveBytes}), have ${memAvailableBytes}`,\r\n };\r\n}\r\n\r\nexport function sleepMs(ms: number): void {\r\n if (ms <= 0) return;\r\n spawnSync(process.execPath, [\"-e\", `const d=Date.now()+${Math.floor(ms)};while(Date.now()<d);`], {\r\n stdio: \"ignore\",\r\n });\r\n}\r\n\r\n/** Poll admission until admitted or timeout (ms). Returns last verdict. */\r\nexport function waitForBuildAdmission(\r\n timeoutMs: number,\r\n pollMs = 2_000,\r\n opts: Partial<BuildAdmissionConfig> & { memAvailableBytes?: () => number } = {},\r\n): BuildAdmissionVerdict {\r\n const deadline = Date.now() + Math.max(0, timeoutMs);\r\n let verdict = assessBuildAdmission({\r\n ...opts,\r\n memAvailableBytes: opts.memAvailableBytes?.(),\r\n });\r\n while (!verdict.admitted && Date.now() < deadline) {\r\n sleepMs(Math.min(pollMs, deadline - Date.now()));\r\n verdict = assessBuildAdmission({\r\n ...opts,\r\n memAvailableBytes: opts.memAvailableBytes?.(),\r\n });\r\n }\r\n return verdict;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\n\r\nfunction envArgv(env: NodeJS.ProcessEnv): string[] {\r\n const out: string[] = [];\r\n for (const [key, value] of Object.entries(env)) {\r\n if (value === undefined) continue;\r\n out.push(`${key}=${value}`);\r\n }\r\n return out;\r\n}\r\nimport {\r\n assessHeavyVerificationGate,\r\n releaseHeavyVerificationSlot,\r\n waitForHeavyVerificationSlot,\r\n type HeavyVerificationGateVerdict,\r\n} from \"../heavy-verification/index.js\";\r\nimport {\r\n assessBuildAdmission,\r\n registerBuildEnd,\r\n registerBuildStart,\r\n waitForBuildAdmission,\r\n type BuildAdmissionVerdict,\r\n} from \"./admission.js\";\r\nimport { assessHarnessWorktreeBuildGuard } from \"../harness-worktree-build-guard.js\";\r\nimport { mergeNodeOptionsForBuildCheck, formatNodeOptionsFlag } from \"./node-options.js\";\r\nimport { buildSystemdRunArgv, isSystemdRunAvailable } from \"./systemd-wrap.js\";\r\n\r\nexport interface BoundedBuildExecResult {\r\n ok: boolean;\r\n exitCode: number;\r\n stdout: string;\r\n stderr: string;\r\n admitted: boolean;\r\n wrappedWithSystemd: boolean;\r\n nodeOptionsFlag: string;\r\n admission: BuildAdmissionVerdict;\r\n /** Cross-process heavy-verification lease (typecheck/build throttle). */\r\n verificationGate: HeavyVerificationGateVerdict;\r\n command: string;\r\n}\r\n\r\nexport interface RunBoundedBuildCheckInput {\r\n cwd: string;\r\n /** Shell command line (e.g. `npm run typecheck`). */\r\n command: string;\r\n env?: NodeJS.ProcessEnv;\r\n /** Max ms to wait for RAM admission (0 = fail fast). Default 600_000. */\r\n waitForAdmissionMs?: number;\r\n timeoutMs?: number;\r\n}\r\n\r\nfunction runSpawn(\r\n argv: string[],\r\n opts: { cwd: string; env: NodeJS.ProcessEnv; shell?: boolean; timeoutMs?: number },\r\n): { exitCode: number; stdout: string; stderr: string } {\r\n const res = spawnSync(argv[0]!, argv.slice(1), {\r\n cwd: opts.cwd,\r\n env: opts.env,\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n shell: opts.shell,\r\n timeout: opts.timeoutMs,\r\n });\r\n return {\r\n exitCode: res.status ?? 1,\r\n stdout: (res.stdout ?? \"\").trim(),\r\n stderr: (res.stderr ?? \"\").trim(),\r\n };\r\n}\r\n\r\n/**\r\n * Run an expensive build/check command with a cross-process heavy-verification\r\n * lease, NODE_OPTIONS heap cap, optional systemd-run memory scope, and\r\n * RAM-aware admission.\r\n */\r\nexport function runBoundedBuildCheck(input: RunBoundedBuildCheckInput): BoundedBuildExecResult {\r\n const waitMs = input.waitForAdmissionMs ?? 600_000;\r\n const verificationGate =\r\n waitMs > 0\r\n ? waitForHeavyVerificationSlot(input.command, waitMs)\r\n : tryAcquireOrAssessVerificationGate(input.command);\r\n\r\n if (!verificationGate.admitted) {\r\n return {\r\n ok: false,\r\n exitCode: 1,\r\n stdout: \"\",\r\n stderr: verificationGate.reason ?? \"heavy verification gate denied\",\r\n admitted: false,\r\n wrappedWithSystemd: false,\r\n nodeOptionsFlag: formatNodeOptionsFlag(),\r\n admission: assessBuildAdmission(),\r\n verificationGate,\r\n command: input.command,\r\n };\r\n }\r\n\r\n const slotId = verificationGate.slotId;\r\n const admission =\r\n waitMs > 0 ? waitForBuildAdmission(waitMs) : assessBuildAdmission();\r\n\r\n if (!admission.admitted) {\r\n releaseHeavyVerificationSlot(slotId);\r\n return {\r\n ok: false,\r\n exitCode: 1,\r\n stdout: \"\",\r\n stderr: admission.reason ?? \"build admission denied\",\r\n admitted: false,\r\n wrappedWithSystemd: false,\r\n nodeOptionsFlag: formatNodeOptionsFlag(),\r\n admission,\r\n verificationGate,\r\n command: input.command,\r\n };\r\n }\r\n\r\n const worktreeGuard = assessHarnessWorktreeBuildGuard(input.cwd);\r\n if (!worktreeGuard.ok) {\r\n releaseHeavyVerificationSlot(slotId);\r\n return {\r\n ok: false,\r\n exitCode: 1,\r\n stdout: \"\",\r\n stderr: worktreeGuard.reason,\r\n admitted: true,\r\n wrappedWithSystemd: false,\r\n nodeOptionsFlag: formatNodeOptionsFlag(),\r\n admission,\r\n verificationGate,\r\n command: input.command,\r\n };\r\n }\r\n\r\n const env = mergeNodeOptionsForBuildCheck({ ...process.env, ...input.env });\r\n const nodeOptionsFlag = formatNodeOptionsFlag();\r\n const useSystemd = isSystemdRunAvailable();\r\n\r\n registerBuildStart();\r\n try {\r\n let result: { exitCode: number; stdout: string; stderr: string };\r\n if (useSystemd) {\r\n const argv = buildSystemdRunArgv({\r\n cwd: input.cwd,\r\n command: [\"/usr/bin/env\", ...envArgv(env), \"/bin/bash\", \"-lc\", input.command],\r\n });\r\n result = runSpawn(argv, { cwd: input.cwd, env, timeoutMs: input.timeoutMs });\r\n } else {\r\n result = runSpawn([input.command], {\r\n cwd: input.cwd,\r\n env,\r\n shell: true,\r\n timeoutMs: input.timeoutMs,\r\n });\r\n }\r\n\r\n return {\r\n ok: result.exitCode === 0,\r\n exitCode: result.exitCode,\r\n stdout: result.stdout,\r\n stderr: result.stderr,\r\n admitted: true,\r\n wrappedWithSystemd: useSystemd,\r\n nodeOptionsFlag,\r\n admission,\r\n verificationGate,\r\n command: input.command,\r\n };\r\n } finally {\r\n registerBuildEnd();\r\n releaseHeavyVerificationSlot(slotId);\r\n }\r\n}\r\n\r\nfunction tryAcquireOrAssessVerificationGate(command: string): HeavyVerificationGateVerdict & {\r\n slotId: string | null;\r\n} {\r\n const acquired = waitForHeavyVerificationSlot(command, 0);\r\n if (acquired.admitted) return acquired;\r\n return { ...assessHeavyVerificationGate(command), slotId: null };\r\n}\r\n", "import {\r\n closeSync,\r\n existsSync,\r\n mkdirSync,\r\n openSync,\r\n readdirSync,\r\n readFileSync,\r\n unlinkSync,\r\n writeFileSync,\r\n} from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { isPidAlive } from \"../util.js\";\r\nimport { ensureHeavyVerificationDirs, heavyVerificationSlotsDir } from \"./paths.js\";\r\n\r\n/** Reclaim slots held by dead PIDs or long-running orphans. */\r\nexport const DEFAULT_HEAVY_VERIFICATION_STALE_MS = 2 * 60 * 60_000;\r\n\r\n/** Default global cap \u2014 serialize typecheck/build across harness workers. */\r\nexport const DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT = 1;\r\n\r\nexport interface HeavyVerificationSlotRecord {\r\n slotId: string;\r\n pid: number;\r\n acquiredAt: string;\r\n command: string;\r\n}\r\n\r\nexport interface HeavyVerificationGateVerdict {\r\n admitted: boolean;\r\n slotId: string | null;\r\n activeSlots: number;\r\n maxSlots: number;\r\n reason: string | null;\r\n}\r\n\r\nfunction positiveInt(value: unknown, fallback: number): number {\r\n const n = Number(value);\r\n if (!Number.isFinite(n) || n <= 0) return fallback;\r\n return Math.floor(n);\r\n}\r\n\r\nexport function isHeavyVerificationGateSkipped(): boolean {\r\n const v = process.env.KYNVER_HEAVY_VERIFICATION_SKIP?.trim().toLowerCase();\r\n return v === \"1\" || v === \"true\" || v === \"yes\";\r\n}\r\n\r\nexport function resolveHeavyVerificationMaxConcurrent(): number {\r\n const env = process.env.KYNVER_HEAVY_VERIFICATION_MAX_CONCURRENT;\r\n if (env) return positiveInt(env, DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT);\r\n return DEFAULT_HEAVY_VERIFICATION_MAX_CONCURRENT;\r\n}\r\n\r\nfunction indexedSlotId(index: number): string {\r\n return `slot-${index}`;\r\n}\r\n\r\nfunction slotFilePath(slotId: string, slotsDir = heavyVerificationSlotsDir()): string {\r\n return path.join(slotsDir, `${slotId}.json`);\r\n}\r\n\r\nfunction readSlotRecord(filePath: string): HeavyVerificationSlotRecord | null {\r\n if (!existsSync(filePath)) return null;\r\n try {\r\n const parsed = JSON.parse(readFileSync(filePath, \"utf8\")) as HeavyVerificationSlotRecord;\r\n if (\r\n typeof parsed.slotId === \"string\" &&\r\n typeof parsed.pid === \"number\" &&\r\n typeof parsed.acquiredAt === \"string\" &&\r\n typeof parsed.command === \"string\"\r\n ) {\r\n return parsed;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n return null;\r\n}\r\n\r\nfunction slotIsStale(\r\n record: HeavyVerificationSlotRecord | null,\r\n staleMs = DEFAULT_HEAVY_VERIFICATION_STALE_MS,\r\n): boolean {\r\n if (!record) return true;\r\n if (!isPidAlive(record.pid)) return true;\r\n const atMs = Date.parse(record.acquiredAt);\r\n if (Number.isNaN(atMs)) return true;\r\n return Date.now() - atMs > staleMs;\r\n}\r\n\r\nfunction reclaimStaleSlot(filePath: string, staleMs: number): void {\r\n const record = readSlotRecord(filePath);\r\n if (!slotIsStale(record, staleMs)) return;\r\n try {\r\n unlinkSync(filePath);\r\n } catch {\r\n /* best-effort */\r\n }\r\n}\r\n\r\nfunction ensureSlotsDir(slotsDir: string): string {\r\n mkdirSync(slotsDir, { recursive: true });\r\n return slotsDir;\r\n}\r\n\r\n/** Remove dead/orphan slot files before admission attempts. */\r\nexport function reclaimStaleHeavyVerificationSlots(\r\n opts: { slotsDir?: string; staleMs?: number } = {},\r\n): number {\r\n const slotsDir = ensureSlotsDir(opts.slotsDir ?? ensureHeavyVerificationDirs());\r\n const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;\r\n let reclaimed = 0;\r\n for (const name of readdirSync(slotsDir)) {\r\n if (!name.endsWith(\".json\")) continue;\r\n const filePath = path.join(slotsDir, name);\r\n const before = existsSync(filePath);\r\n reclaimStaleSlot(filePath, staleMs);\r\n if (before && !existsSync(filePath)) reclaimed += 1;\r\n }\r\n return reclaimed;\r\n}\r\n\r\nexport function listActiveHeavyVerificationSlots(\r\n opts: { slotsDir?: string; staleMs?: number } = {},\r\n): HeavyVerificationSlotRecord[] {\r\n const slotsDir = opts.slotsDir ?? ensureHeavyVerificationDirs();\r\n const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;\r\n reclaimStaleHeavyVerificationSlots({ slotsDir, staleMs });\r\n const active: HeavyVerificationSlotRecord[] = [];\r\n for (const name of readdirSync(slotsDir)) {\r\n if (!name.endsWith(\".json\")) continue;\r\n const record = readSlotRecord(path.join(slotsDir, name));\r\n if (record && !slotIsStale(record, staleMs)) active.push(record);\r\n }\r\n return active;\r\n}\r\n\r\nexport function countActiveHeavyVerificationSlots(\r\n opts: { slotsDir?: string; staleMs?: number } = {},\r\n): number {\r\n return listActiveHeavyVerificationSlots(opts).length;\r\n}\r\n\r\n/**\r\n * Try to acquire one heavy-verification slot using fixed index files (`slot-0.json`, \u2026)\r\n * and exclusive `wx` create. Avoids count-then-UUID TOCTOU races under burst dispatch.\r\n */\r\nexport function tryAcquireHeavyVerificationSlot(\r\n command: string,\r\n opts: { slotsDir?: string; staleMs?: number; maxSlots?: number } = {},\r\n): HeavyVerificationGateVerdict {\r\n if (isHeavyVerificationGateSkipped()) {\r\n return {\r\n admitted: true,\r\n slotId: null,\r\n activeSlots: 0,\r\n maxSlots: resolveHeavyVerificationMaxConcurrent(),\r\n reason: null,\r\n };\r\n }\r\n\r\n const slotsDir = opts.slotsDir ?? ensureHeavyVerificationDirs();\r\n const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;\r\n const maxSlots = opts.maxSlots ?? resolveHeavyVerificationMaxConcurrent();\r\n reclaimStaleHeavyVerificationSlots({ slotsDir, staleMs });\r\n\r\n for (let index = 0; index < maxSlots; index += 1) {\r\n const slotId = indexedSlotId(index);\r\n const filePath = slotFilePath(slotId, slotsDir);\r\n const existing = readSlotRecord(filePath);\r\n if (existing && slotIsStale(existing, staleMs)) {\r\n try {\r\n unlinkSync(filePath);\r\n } catch {\r\n /* best-effort */\r\n }\r\n } else if (existing && !slotIsStale(existing, staleMs)) {\r\n continue;\r\n }\r\n\r\n const record: HeavyVerificationSlotRecord = {\r\n slotId,\r\n pid: process.pid,\r\n acquiredAt: new Date().toISOString(),\r\n command,\r\n };\r\n\r\n try {\r\n const fd = openSync(filePath, \"wx\");\r\n writeFileSync(fd, JSON.stringify(record, null, 2), \"utf8\");\r\n closeSync(fd);\r\n const activeSlots = countActiveHeavyVerificationSlots({ slotsDir, staleMs });\r\n return {\r\n admitted: true,\r\n slotId,\r\n activeSlots,\r\n maxSlots,\r\n reason: null,\r\n };\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === \"EEXIST\") {\r\n continue;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n const activeSlots = countActiveHeavyVerificationSlots({ slotsDir, staleMs });\r\n return {\r\n admitted: false,\r\n slotId: null,\r\n activeSlots,\r\n maxSlots,\r\n reason: `heavy verification at capacity (${activeSlots}/${maxSlots} slots)`,\r\n };\r\n}\r\n\r\nexport function releaseHeavyVerificationSlot(\r\n slotId: string | null | undefined,\r\n opts: { slotsDir?: string } = {},\r\n): void {\r\n if (!slotId) return;\r\n const filePath = slotFilePath(slotId, opts.slotsDir ?? heavyVerificationSlotsDir());\r\n try {\r\n unlinkSync(filePath);\r\n } catch {\r\n /* ignore */\r\n }\r\n}\r\n\r\nexport function assessHeavyVerificationGate(\r\n command: string,\r\n opts: { slotsDir?: string; staleMs?: number; maxSlots?: number } = {},\r\n): HeavyVerificationGateVerdict {\r\n if (isHeavyVerificationGateSkipped()) {\r\n return {\r\n admitted: true,\r\n slotId: null,\r\n activeSlots: 0,\r\n maxSlots: resolveHeavyVerificationMaxConcurrent(),\r\n reason: null,\r\n };\r\n }\r\n const slotsDir = opts.slotsDir ?? ensureHeavyVerificationDirs();\r\n const staleMs = opts.staleMs ?? DEFAULT_HEAVY_VERIFICATION_STALE_MS;\r\n const maxSlots = opts.maxSlots ?? resolveHeavyVerificationMaxConcurrent();\r\n reclaimStaleHeavyVerificationSlots({ slotsDir, staleMs });\r\n const activeSlots = countActiveHeavyVerificationSlots({ slotsDir, staleMs });\r\n const admitted = activeSlots < maxSlots;\r\n return {\r\n admitted,\r\n slotId: null,\r\n activeSlots,\r\n maxSlots,\r\n reason: admitted\r\n ? null\r\n : `heavy verification at capacity (${activeSlots}/${maxSlots} slots); waiting for ${command}`,\r\n };\r\n}\r\n", "import { mkdirSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { resolveKynverStateRoot } from \"../plan-persist/paths.js\";\r\n\r\nexport function resolveHeavyVerificationRoot(): string {\r\n return path.join(resolveKynverStateRoot(), \"heavy-verification\");\r\n}\r\n\r\nexport function heavyVerificationSlotsDir(): string {\r\n return path.join(resolveHeavyVerificationRoot(), \"slots\");\r\n}\r\n\r\nexport function ensureHeavyVerificationDirs(): string {\r\n const dir = heavyVerificationSlotsDir();\r\n mkdirSync(dir, { recursive: true });\r\n return dir;\r\n}\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport {\r\n assessHeavyVerificationGate,\r\n tryAcquireHeavyVerificationSlot,\r\n type HeavyVerificationGateVerdict,\r\n} from \"./slot.js\";\r\n\r\nexport function sleepMs(ms: number): void {\r\n if (ms <= 0) return;\r\n spawnSync(process.execPath, [\"-e\", `const d=Date.now()+${Math.floor(ms)};while(Date.now()<d);`], {\r\n stdio: \"ignore\",\r\n });\r\n}\r\n\r\n/**\r\n * Poll until a heavy-verification slot is acquired or timeout elapses.\r\n * Serializes expensive typecheck/build across harness worker processes.\r\n */\r\nexport function waitForHeavyVerificationSlot(\r\n command: string,\r\n timeoutMs: number,\r\n pollMs = 2_000,\r\n opts: Parameters<typeof tryAcquireHeavyVerificationSlot>[1] = {},\r\n): HeavyVerificationGateVerdict & { slotId: string | null } {\r\n const deadline = Date.now() + Math.max(0, timeoutMs);\r\n let verdict = tryAcquireHeavyVerificationSlot(command, opts);\r\n while (!verdict.admitted && Date.now() < deadline) {\r\n sleepMs(Math.min(pollMs, deadline - Date.now()));\r\n verdict = tryAcquireHeavyVerificationSlot(command, opts);\r\n }\r\n return verdict;\r\n}\r\n\r\nexport { assessHeavyVerificationGate, type HeavyVerificationGateVerdict };\r\n", "import path from \"node:path\";\r\nimport { harnessWorktreesDir, resolveHarnessRoot } from \"./paths.js\";\r\n\r\nexport function isPathUnderHarnessWorktree(cwd: string): boolean {\r\n const worktreesDir = harnessWorktreesDir(resolveHarnessRoot());\r\n const rel = path.relative(worktreesDir, path.resolve(cwd));\r\n return rel.length > 0 && !rel.startsWith(\"..\") && !path.isAbsolute(rel);\r\n}\r\n\r\nexport type HarnessWorktreeBuildGuardVerdict =\r\n | { ok: true }\r\n | { ok: false; reason: string };\r\n\r\n/**\r\n * Prevent root-owned generated caches: npm/build as uid 0 inside harness worktrees\r\n * creates node_modules/.next the daemon user cannot reclaim during cleanup.\r\n */\r\nexport function assessHarnessWorktreeBuildGuard(cwd: string): HarnessWorktreeBuildGuardVerdict {\r\n if (!isPathUnderHarnessWorktree(cwd)) return { ok: true };\r\n const uid = typeof process.getuid === \"function\" ? process.getuid() : null;\r\n if (uid === 0) {\r\n return {\r\n ok: false,\r\n reason:\r\n \"Refusing build/install as root inside a harness worktree \u2014 generated caches become root-owned and block daemon cleanup. Run kynver daemon and workers as the harness owner (never sudo kynver).\",\r\n };\r\n }\r\n return { ok: true };\r\n}\r\n", "import { runBoundedBuildCheck, type BoundedBuildExecResult } from \"./bounded-build/index.js\";\r\n\r\n/** Default expensive checks for harness / plan runtime verification. */\r\nexport const DEFAULT_HARNESS_VERIFY_COMMANDS = [\"npm run typecheck\", \"npm run test\"] as const;\r\n\r\nexport interface HarnessVerifyStep {\r\n command: string;\r\n result: BoundedBuildExecResult;\r\n}\r\n\r\nexport interface HarnessVerifySummary {\r\n passed: boolean;\r\n steps: HarnessVerifyStep[];\r\n}\r\n\r\n/**\r\n * Run plan/harness verification commands through the cross-process heavy-verification\r\n * gate and memory-bounded subprocess execution. Parallel workers queue here instead\r\n * of launching simultaneous typecheck/build commands.\r\n */\r\nexport function runHarnessVerifyCommands(\r\n cwd: string,\r\n commands: readonly string[] = DEFAULT_HARNESS_VERIFY_COMMANDS,\r\n opts: { waitForAdmissionMs?: number; timeoutMs?: number } = {},\r\n): HarnessVerifySummary {\r\n const steps: HarnessVerifyStep[] = [];\r\n let passed = true;\r\n for (const command of commands) {\r\n const result = runBoundedBuildCheck({\r\n cwd,\r\n command,\r\n waitForAdmissionMs: opts.waitForAdmissionMs,\r\n timeoutMs: opts.timeoutMs,\r\n });\r\n steps.push({ command, result });\r\n if (!result.ok) passed = false;\r\n }\r\n return { passed, steps };\r\n}\r\n", "import path from \"node:path\";\r\nimport { runHarnessVerifyCommands, DEFAULT_HARNESS_VERIFY_COMMANDS } from \"./harness-verify.js\";\r\nimport { required } from \"./util.js\";\r\n\r\nexport function runHarnessVerifyCli(args: Record<string, string | boolean>): void {\r\n const cwd = path.resolve(required(args.worktree ? String(args.worktree) : undefined, \"worktree\"));\r\n const emitJson = args.json === true || args.json === \"true\" || args.emitJson === true || args.emitJson === \"true\";\r\n\r\n const commands: string[] = [];\r\n const rawCmd = args.command;\r\n if (Array.isArray(rawCmd)) {\r\n for (const c of rawCmd) commands.push(String(c));\r\n } else if (typeof rawCmd === \"string\") {\r\n commands.push(rawCmd);\r\n }\r\n\r\n const summary = runHarnessVerifyCommands(\r\n cwd,\r\n commands.length ? commands : DEFAULT_HARNESS_VERIFY_COMMANDS,\r\n {\r\n waitForAdmissionMs: args.waitForAdmissionMs ? Number(args.waitForAdmissionMs) : undefined,\r\n timeoutMs: args.timeoutMs ? Number(args.timeoutMs) : undefined,\r\n },\r\n );\r\n\r\n const payload = {\r\n passed: summary.passed,\r\n worktree: cwd,\r\n steps: summary.steps.map((s) => ({\r\n command: s.command,\r\n ok: s.result.ok,\r\n exitCode: s.result.exitCode,\r\n admitted: s.result.admitted,\r\n wrappedWithSystemd: s.result.wrappedWithSystemd,\r\n nodeOptionsFlag: s.result.nodeOptionsFlag,\r\n admission: s.result.admission,\r\n verificationGate: s.result.verificationGate,\r\n stderr: s.result.stderr.slice(0, 4000),\r\n })),\r\n };\r\n\r\n if (emitJson) {\r\n console.log(JSON.stringify(payload, null, 2));\r\n } else {\r\n console.log(summary.passed ? \"harness verify passed\" : \"harness verify failed\");\r\n for (const step of payload.steps) {\r\n console.log(` ${step.ok ? \"\u2713\" : \"\u2717\"} ${step.command} (exit ${step.exitCode}, systemd=${step.wrappedWithSystemd})`);\r\n if (!step.ok && step.stderr) console.log(` ${step.stderr.split(\"\\n\")[0]}`);\r\n }\r\n }\r\n process.exit(summary.passed ? 0 : 1);\r\n}\r\n", "import { readFileSync } from \"node:fs\";\r\nimport { loadUserConfig } from \"./config.js\";\r\nimport { drainPlanOutbox } from \"./plan-persist/drain.js\";\r\nimport { listOutboxItems } from \"./plan-persist/outbox-store.js\";\r\nimport { persistPlan } from \"./plan-persist/persist.js\";\r\nimport type { PlanPersistOperation, PlanPersistFailureKind } from \"./plan-persist/types.js\";\r\nimport { required } from \"./util.js\";\r\nimport { isTmpOnlyPath } from \"./plan-persist/paths.js\";\r\n\r\nconst OPERATIONS: PlanPersistOperation[] = [\"create\", \"add_version\", \"update_metadata\"];\r\nconst FAILURE_KINDS: PlanPersistFailureKind[] = [\r\n \"approval_guard\",\r\n \"auth\",\r\n \"network\",\r\n \"server\",\r\n \"tool_interruption\",\r\n];\r\n\r\nfunction readBodyArg(args: Record<string, string | boolean>): { body: string; bodyPathHint?: string } {\r\n const bodyFile = args.bodyFile ? String(args.bodyFile) : undefined;\r\n if (bodyFile) {\r\n return { body: readFileSync(bodyFile, \"utf8\"), bodyPathHint: bodyFile };\r\n }\r\n const inline = args.body ? String(args.body) : undefined;\r\n if (inline) return { body: inline };\r\n throw new Error(\"requires --body-file PATH or --body TEXT\");\r\n}\r\n\r\nexport async function runPlanPersist(args: Record<string, string | boolean>): Promise<void> {\r\n const operationRaw = required(args.operation ? String(args.operation) : undefined, \"operation\");\r\n if (!OPERATIONS.includes(operationRaw as PlanPersistOperation)) {\r\n throw new Error(`invalid --operation ${operationRaw}`);\r\n }\r\n const operation = operationRaw as PlanPersistOperation;\r\n const cfg = loadUserConfig();\r\n const agentOsSlug = required(\r\n args.slug ? String(args.slug) : cfg.agentOsSlug,\r\n \"slug (or agentOsSlug in ~/.kynver/config.json)\",\r\n );\r\n const title = required(args.title ? String(args.title) : undefined, \"title\");\r\n const { body, bodyPathHint } = readBodyArg(args);\r\n\r\n if (bodyPathHint && isTmpOnlyPath(bodyPathHint)) {\r\n console.warn(\r\n JSON.stringify({\r\n warning:\r\n \"/tmp-only body path is not durable; AgentOS persistence requires outbox or successful API write\",\r\n bodyPathHint,\r\n }),\r\n );\r\n }\r\n\r\n const input = {\r\n operation,\r\n agentOsSlug,\r\n title,\r\n body,\r\n bodyPathHint,\r\n summary: args.summary ? String(args.summary) : undefined,\r\n planId: args.plan ? String(args.plan) : undefined,\r\n planSlug: args.planSlug ? String(args.planSlug) : undefined,\r\n changeSummary: args.changeSummary ? String(args.changeSummary) : undefined,\r\n author: args.author ? String(args.author) : undefined,\r\n model: args.model ? String(args.model) : undefined,\r\n maxRetries: args.maxRetries ? Number(args.maxRetries) : undefined,\r\n immediateFailure: parseImmediateFailure(args),\r\n };\r\n\r\n const result = await persistPlan(input);\r\n console.log(JSON.stringify(result, null, 2));\r\n if (result.userStatus === \"failed and needs action\") process.exit(1);\r\n}\r\n\r\nfunction parseImmediateFailure(\r\n args: Record<string, string | boolean>,\r\n): { kind: PlanPersistFailureKind; message: string } | undefined {\r\n const kind = args.failureKind ? String(args.failureKind) : undefined;\r\n if (!kind) return undefined;\r\n if (!FAILURE_KINDS.includes(kind as PlanPersistFailureKind)) {\r\n throw new Error(`invalid --failure-kind ${kind}`);\r\n }\r\n const message = args.failureMessage\r\n ? String(args.failureMessage)\r\n : `immediate failure (${kind})`;\r\n return { kind: kind as PlanPersistFailureKind, message };\r\n}\r\n\r\nexport async function runPlanOutboxList(): Promise<void> {\r\n const items = listOutboxItems();\r\n console.log(JSON.stringify({ count: items.length, items }, null, 2));\r\n}\r\n\r\nexport async function runPlanOutboxDrain(args: Record<string, string | boolean>): Promise<void> {\r\n const max = args.max ? Number(args.max) : undefined;\r\n const outboxId = args.id ? String(args.id) : undefined;\r\n const result = await drainPlanOutbox({ max, outboxId });\r\n console.log(JSON.stringify(result, null, 2));\r\n if (result.failed > 0) process.exit(1);\r\n}\r\n", "import { runHarnessCleanup } from \"./cleanup.js\";\r\nimport { DEFAULT_NODE_MODULES_AGE_MS } from \"./cleanup-types.js\";\r\n\r\nexport function runCleanupCli(args: Record<string, string | boolean>): void {\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const skipFinalize = args.skipFinalize === true || args.skipFinalize === \"true\";\r\n const accountBytes = args.accountBytes === true || args.accountBytes === \"true\";\r\n const compact = args.compact === true || args.compact === \"true\";\r\n const nodeModulesAgeMsRaw = args.nodeModulesAgeMs;\r\n const scanDependencyCaches = nodeModulesAgeMsRaw != null && nodeModulesAgeMsRaw !== \"\";\r\n const nodeModulesAgeMs = scanDependencyCaches ? Number(nodeModulesAgeMsRaw) : undefined;\r\n const worktreesAgeMs = args.worktreesAgeMs ? Number(args.worktreesAgeMs) : 0;\r\n const includeOrphans = args.includeOrphans === true || args.includeOrphans === \"true\";\r\n const harnessRoot = args.harnessRoot ? String(args.harnessRoot) : undefined;\r\n\r\n const summary = runHarnessCleanup({\r\n execute,\r\n finalizeStaleRuns: !skipFinalize,\r\n accountBytes,\r\n scanDependencyCaches,\r\n nodeModulesAgeMs:\r\n nodeModulesAgeMs !== undefined && Number.isFinite(nodeModulesAgeMs)\r\n ? nodeModulesAgeMs\r\n : scanDependencyCaches\r\n ? DEFAULT_NODE_MODULES_AGE_MS\r\n : undefined,\r\n worktreesAgeMs: Number.isFinite(worktreesAgeMs) ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n harnessRoot,\r\n });\r\n\r\n if (compact && summary.compactSummary) {\r\n console.log(JSON.stringify(summary.compactSummary, null, 2));\r\n } else {\r\n console.log(JSON.stringify(summary, null, 2));\r\n }\r\n\r\n if (execute && summary.totals.removedPaths === 0 && summary.actions.length === 0) {\r\n process.exitCode = 0;\r\n }\r\n}\r\n", "const MAX_DIAGNOSTIC_CHARS = 2_400;\r\n\r\nexport function tryParseJsonValue(text: string): unknown | null {\r\n const trimmed = text.trim();\r\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return null;\r\n try {\r\n return JSON.parse(trimmed) as unknown;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function diagnosticJson(value: unknown, maxChars = MAX_DIAGNOSTIC_CHARS): string | undefined {\r\n if (value === undefined || value === null) return undefined;\r\n const raw = typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\r\n const trimmed = raw.trim();\r\n if (!trimmed) return undefined;\r\n if (trimmed.length <= maxChars) return trimmed;\r\n return `${trimmed.slice(0, maxChars - 1).trimEnd()}\u2026`;\r\n}\r\n\r\nexport function firstJsonFromStdout(stdout: string): unknown | null {\r\n const trimmed = stdout.trim();\r\n if (!trimmed) return null;\r\n const direct = tryParseJsonValue(trimmed);\r\n if (direct !== null) return direct;\r\n for (const line of trimmed.split(\"\\n\")) {\r\n const parsed = tryParseJsonValue(line);\r\n if (parsed !== null) return parsed;\r\n }\r\n return null;\r\n}\r\n", "import type { AutoCompleteOutcome } from \"../auto-complete.js\";\r\nimport type { HarnessReadableNotice } from \"./harness-notice.types.js\";\r\nimport { diagnosticJson } from \"./harness-notice.parse.js\";\r\n\r\nexport function formatAutoCompleteOutcomeNotice(outcome: AutoCompleteOutcome): HarnessReadableNotice {\r\n const lines: string[] = [];\r\n lines.push(`Background auto-complete \u00B7 ${outcome.runId} / ${outcome.worker}`);\r\n\r\n switch (outcome.outcome) {\r\n case \"completed\":\r\n lines.push(\"Outcome: harness completion posted to AgentOS successfully.\");\r\n lines.push(\"AgentOS task should close or advance to review per completion routing.\");\r\n lines.push(\"Next: check Command Center \u2014 no manual complete needed unless the board still shows running.\");\r\n break;\r\n case \"blocked\":\r\n lines.push(\r\n `Outcome: worker finished but completion was blocked${outcome.httpStatus ? ` (HTTP ${outcome.httpStatus})` : \"\"}.`,\r\n );\r\n if (outcome.reason) lines.push(`Blocker: ${outcome.reason}`);\r\n lines.push(\"Next: fix the blocker (auth, landing gate, dirty worktree) and replay completion from Command Center.\");\r\n break;\r\n case \"timed_out\":\r\n lines.push(`Outcome: monitor gave up waiting \u2014 ${outcome.reason ?? \"worker did not finish in time\"}.`);\r\n lines.push(\"Next: inspect the worker process/logs; stop or unblock the worker, then retry auto-complete.\");\r\n break;\r\n case \"missing_link\":\r\n lines.push(`Outcome: cannot complete \u2014 ${outcome.reason ?? \"worker missing agentOsId/taskId\"}.`);\r\n lines.push(\"Next: re-dispatch with board linkage or run `kynver worker complete` with --agent-os-id.\");\r\n break;\r\n default:\r\n lines.push(`Outcome: ${outcome.outcome}`);\r\n }\r\n\r\n return { primary: lines.join(\"\\n\"), diagnostic: diagnosticJson(outcome) };\r\n}\r\n", "import type { MonitorTickResult } from \"../monitor/monitor.types.js\";\r\nimport type { HarnessReadableNotice } from \"./harness-notice.types.js\";\r\nimport { diagnosticJson } from \"./harness-notice.parse.js\";\r\n\r\nexport function formatMonitorTickNotice(tick: MonitorTickResult & { monitorId?: string; phase?: string }): HarnessReadableNotice {\r\n const lines: string[] = [];\r\n const monitorId = typeof tick.monitorId === \"string\" ? tick.monitorId : undefined;\r\n lines.push(\r\n monitorId\r\n ? `Harness monitor tick \u00B7 ${tick.runId} (${monitorId})`\r\n : `Harness monitor tick \u00B7 ${tick.runId}`,\r\n );\r\n\r\n if (!tick.workers.length) {\r\n lines.push(\"No workers in scope for this poll.\");\r\n return { primary: lines.join(\"\\n\"), diagnostic: diagnosticJson(tick) };\r\n }\r\n\r\n for (const view of tick.workers) {\r\n const auto = view.autoComplete.eligible ? \"eligible for auto-complete\" : \"not auto-completing\";\r\n const blockers =\r\n view.autoComplete.blockers.length > 0 ? ` (${view.autoComplete.blockers.slice(0, 2).join(\"; \")})` : \"\";\r\n lines.push(\r\n `\u2022 ${view.worker}: ${view.workerStatus}, ${view.health}${view.healthReason ? ` \u2014 ${view.healthReason}` : \"\"}; ${auto}${blockers}`,\r\n );\r\n if (view.taskStatus) {\r\n lines.push(` Board task: ${view.taskStatus}${view.leaseOwner ? ` (lease: ${view.leaseOwner})` : \"\"}`);\r\n }\r\n }\r\n\r\n const completed = tick.autoCompleted?.filter((a) => a.outcome === \"completed\" && a.ok) ?? [];\r\n const blocked = tick.autoCompleted?.filter((a) => !a.ok && a.outcome !== \"skipped\") ?? [];\r\n if (completed.length) {\r\n lines.push(\r\n `Auto-completed: ${completed.map((c) => c.worker).join(\", \")} \u2014 AgentOS completion should be posted.`,\r\n );\r\n }\r\n if (blocked.length) {\r\n lines.push(\r\n `Auto-complete blocked: ${blocked.map((c) => `${c.worker}${c.reason ? ` (${c.reason})` : \"\"}`).join(\"; \")}`,\r\n );\r\n }\r\n if (tick.leaseRenewal?.failed?.length) {\r\n lines.push(`Lease renew failed for: ${tick.leaseRenewal.failed.map((f) => f.worker).join(\", \")}`);\r\n }\r\n\r\n const allDone =\r\n tick.workers.length > 0 &&\r\n tick.workers.every((w) => w.autoComplete.terminalVerified) &&\r\n (tick.autoCompleted?.every((a) => a.ok || a.outcome === \"skipped\") ?? true);\r\n lines.push(\r\n allDone\r\n ? \"Next: monitor loop should stop \u2014 all workers terminal and handled.\"\r\n : \"Next: monitor will poll again until workers are terminal-verified or max time elapses.\",\r\n );\r\n\r\n return { primary: lines.join(\"\\n\"), diagnostic: diagnosticJson(tick) };\r\n}\r\n", "import type { HarnessReadableNotice } from \"./harness-notice.types.js\";\r\nimport { diagnosticJson } from \"./harness-notice.parse.js\";\r\n\r\nfunction record(value: unknown): Record<string, unknown> | null {\r\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction str(value: unknown): string | null {\r\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\r\n}\r\n\r\n/** Format `kynver worker complete` CLI JSON for operators. */\r\nexport function formatWorkerCompleteNotice(data: unknown): HarnessReadableNotice {\r\n const rec = record(data);\r\n if (!rec) {\r\n return {\r\n primary: \"Harness worker complete finished with no parseable result.\",\r\n diagnostic: diagnosticJson(data),\r\n };\r\n }\r\n\r\n const worker = str(rec.worker) ?? \"worker\";\r\n const runId = str(rec.runId);\r\n const skipped = str(rec.status) === \"skipped\";\r\n const httpStatus = typeof rec.httpStatus === \"number\" ? rec.httpStatus : null;\r\n const response = record(rec.response);\r\n\r\n const lines: string[] = [];\r\n lines.push(`Harness worker complete \u00B7 ${worker}${runId ? ` (${runId})` : \"\"}`);\r\n\r\n if (skipped) {\r\n lines.push(`Outcome: skipped \u2014 ${str(rec.reason) ?? \"worker not finished yet\"}.`);\r\n lines.push(\"Next: wait for the worker to exit or post a finalResult, then retry complete.\");\r\n return { primary: lines.join(\"\\n\"), diagnostic: diagnosticJson(data) };\r\n }\r\n\r\n const routeOutcome = str(response?.outcome);\r\n const taskRec = record(response?.task);\r\n const taskStatus = str(taskRec?.status);\r\n const prUrl = str(taskRec?.prUrl) ?? str(response?.prUrl);\r\n\r\n if (httpStatus && httpStatus >= 200 && httpStatus < 300) {\r\n lines.push(\"Outcome: completion callback accepted by AgentOS.\");\r\n if (routeOutcome) lines.push(`Routing: ${routeOutcome.replace(/_/g, \" \")}`);\r\n if (taskStatus) lines.push(`AgentOS task status: ${taskStatus}`);\r\n if (prUrl) lines.push(`PR: ${prUrl}`);\r\n lines.push(\"Next: check Command Center for review scheduling or blockers.\");\r\n } else {\r\n lines.push(\r\n `Outcome: completion failed${httpStatus != null ? ` (HTTP ${httpStatus})` : \"\"}.`,\r\n );\r\n const detail = str(response?.detail) ?? str(response?.error);\r\n if (detail) lines.push(`Blocker: ${detail}`);\r\n lines.push(\"Next: fix the reported blocker and replay completion from the board.\");\r\n }\r\n\r\n return { primary: lines.join(\"\\n\"), diagnostic: diagnosticJson(data) };\r\n}\r\n", "import type { HarnessReadableNotice } from \"./harness-notice.types.js\";\r\nimport { diagnosticJson } from \"./harness-notice.parse.js\";\r\n\r\nfunction str(value: unknown): string | null {\r\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\r\n}\r\n\r\nfunction record(value: unknown): Record<string, unknown> | null {\r\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : null;\r\n}\r\n\r\nfunction prFromFinalResult(finalResult: unknown): string | null {\r\n const fr = record(finalResult);\r\n if (!fr) return null;\r\n return str(fr.prUrl) ?? str(fr.pr);\r\n}\r\n\r\nexport function formatWorkerStatusNotice(status: unknown): HarnessReadableNotice {\r\n const rec = record(status);\r\n if (!rec) {\r\n return {\r\n primary: \"Harness worker status unavailable.\",\r\n diagnostic: diagnosticJson(status),\r\n };\r\n }\r\n\r\n const worker = str(rec.worker) ?? str(rec.name) ?? \"worker\";\r\n const runId = str(rec.runId);\r\n const workerStatus = str(rec.status) ?? \"unknown\";\r\n const alive = rec.alive === true;\r\n const attention = record(rec.attention);\r\n const attentionState = str(attention?.state) ?? str(rec.attentionState);\r\n const attentionReason = str(attention?.reason) ?? str(rec.attentionReason);\r\n const taskId = str(rec.taskId);\r\n const prUrl = str(rec.prUrl) ?? prFromFinalResult(rec.finalResult);\r\n const branch = str(rec.branch);\r\n const headCommit = str(rec.headCommit);\r\n\r\n const lines: string[] = [];\r\n lines.push(`Harness worker ${worker}${runId ? ` (${runId})` : \"\"}`);\r\n lines.push(`Process: ${alive ? \"running\" : \"stopped\"} \u00B7 harness status: ${workerStatus}`);\r\n if (attentionState) {\r\n lines.push(\r\n attentionReason\r\n ? `Attention: ${attentionState} \u2014 ${attentionReason}`\r\n : `Attention: ${attentionState}`,\r\n );\r\n }\r\n if (taskId) lines.push(`AgentOS task: ${taskId}`);\r\n if (prUrl) lines.push(`PR: ${prUrl}`);\r\n if (branch) lines.push(`Branch: ${branch}`);\r\n if (headCommit) lines.push(`Commit: ${headCommit.slice(0, 12)}`);\r\n\r\n if (workerStatus === \"done\" || workerStatus === \"exited\") {\r\n lines.push(\r\n prUrl\r\n ? \"Outcome: worker finished \u2014 open the PR or check Command Center for review routing.\"\r\n : \"Outcome: worker finished \u2014 check Command Center for task status and next action.\",\r\n );\r\n } else if (attentionState === \"blocked\" || attentionState === \"needs_attention\") {\r\n lines.push(\"Next: resolve the blocker on the board or wait for the monitor to auto-complete when terminal.\");\r\n } else if (alive) {\r\n lines.push(\"Next: wait for completion or poll again; background monitor will auto-complete when eligible.\");\r\n }\r\n\r\n return { primary: lines.join(\"\\n\"), diagnostic: diagnosticJson(status) };\r\n}\r\n", "import type { AutoCompleteOutcome } from \"../auto-complete.js\";\r\nimport type { MonitorTickResult } from \"../monitor/monitor.types.js\";\r\nimport type { HarnessReadableNotice, HarnessToolFormatContext } from \"./harness-notice.types.js\";\r\nimport { firstJsonFromStdout, diagnosticJson } from \"./harness-notice.parse.js\";\r\nimport { formatAutoCompleteOutcomeNotice } from \"./harness-notice.auto-complete.js\";\r\nimport { formatMonitorTickNotice } from \"./harness-notice.monitor-tick.js\";\r\nimport { formatWorkerCompleteNotice } from \"./harness-notice.worker-complete.js\";\r\nimport { formatWorkerStatusNotice } from \"./harness-notice.worker-status.js\";\r\n\r\nconst DIVIDER = \"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Diagnostic (JSON) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\";\r\n\r\nexport function joinHarnessNotice(notice: HarnessReadableNotice): string {\r\n if (!notice.diagnostic?.trim()) return notice.primary;\r\n return `${notice.primary}\\n\\n${DIVIDER}\\n${notice.diagnostic}`;\r\n}\r\n\r\nfunction failureNotice(ctx: HarnessToolFormatContext): HarnessReadableNotice {\r\n const lines = [`Harness ${ctx.scope} ${ctx.action} failed.`];\r\n if (ctx.timedOut) lines.push(\"Reason: command timed out on the runner host.\");\r\n else if (ctx.error) lines.push(`Reason: ${ctx.error}`);\r\n else if (ctx.exitCode != null) lines.push(`Exit code: ${ctx.exitCode}`);\r\n const errText = ctx.stderr.trim();\r\n if (errText) lines.push(`Stderr: ${errText.split(\"\\n\").slice(-3).join(\" \")}`);\r\n lines.push(\"Next: retry on the runner host or inspect harness logs.\");\r\n const parsed = firstJsonFromStdout(ctx.stdout);\r\n return {\r\n primary: lines.join(\"\\n\"),\r\n diagnostic: diagnosticJson(parsed ?? { stdout: ctx.stdout, stderr: ctx.stderr }),\r\n };\r\n}\r\n\r\nexport function formatHarnessToolReadable(ctx: HarnessToolFormatContext): HarnessReadableNotice {\r\n if (!ctx.ok) return failureNotice(ctx);\r\n\r\n const parsed = firstJsonFromStdout(ctx.stdout);\r\n if (parsed === null) {\r\n const text = ctx.stdout.trim() || ctx.stderr.trim() || \"(no output)\";\r\n return {\r\n primary: `Harness ${ctx.scope} ${ctx.action} finished.\\n${text.slice(0, 800)}`,\r\n diagnostic: diagnosticJson({ stdout: ctx.stdout, stderr: ctx.stderr }),\r\n };\r\n }\r\n\r\n if (ctx.scope === \"worker\" && ctx.action === \"status\") {\r\n return formatWorkerStatusNotice(parsed);\r\n }\r\n if (ctx.scope === \"worker\" && ctx.action === \"complete\") {\r\n return formatWorkerCompleteNotice(parsed);\r\n }\r\n if (ctx.scope === \"monitor\" && (ctx.action === \"tick\" || ctx.action === \"run-loop\")) {\r\n return formatMonitorTickNotice(parsed as MonitorTickResult);\r\n }\r\n if (ctx.scope === \"monitor\" && ctx.action === \"auto-complete\") {\r\n const rec = parsed as Record<string, unknown>;\r\n if (rec.outcome && rec.worker && rec.runId) {\r\n return formatAutoCompleteOutcomeNotice(parsed as AutoCompleteOutcome);\r\n }\r\n if (Array.isArray(rec.blockers)) {\r\n return {\r\n primary: [\r\n `Monitor auto-complete blocked \u00B7 ${rec.runId ?? \"run\"} / ${rec.worker ?? \"worker\"}`,\r\n `Blockers: ${(rec.blockers as string[]).join(\"; \")}`,\r\n \"Next: resolve blockers on the runner, then retry auto-complete.\",\r\n ].join(\"\\n\"),\r\n diagnostic: diagnosticJson(parsed),\r\n };\r\n }\r\n }\r\n\r\n if (ctx.scope === \"run\" && ctx.action === \"status\") {\r\n const workers = (parsed as Record<string, unknown>).workers;\r\n if (Array.isArray(workers) && workers.length === 1) {\r\n return formatWorkerStatusNotice(workers[0]);\r\n }\r\n return {\r\n primary: `Harness run status \u00B7 ${(parsed as Record<string, unknown>).runId ?? \"run\"} (${Array.isArray(workers) ? workers.length : 0} workers).`,\r\n diagnostic: diagnosticJson(parsed),\r\n };\r\n }\r\n\r\n return {\r\n primary: `Harness ${ctx.scope} ${ctx.action} completed successfully on the runner.`,\r\n diagnostic: diagnosticJson(parsed),\r\n };\r\n}\r\n", "import path from \"node:path\";\r\nimport { autoCompleteWorker } from \"../auto-complete.js\";\r\nimport { loadRun, loadWorker, runDirectory } from \"../run-store.js\";\r\nimport { renewActiveTaskLeases } from \"../lease-renewal.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord } from \"../status.js\";\r\nimport { isPidAlive, readJson, required, safeSlug, sleepMs } from \"../util.js\";\r\nimport { classifyWorkerHealth } from \"./monitor.classify.js\";\r\nimport {\r\n deleteMonitorSession,\r\n listMonitorSessions,\r\n loadMonitorSession,\r\n monitorIdFor,\r\n saveMonitorSession,\r\n} from \"./monitor.store.js\";\r\nimport { assessAutoCompleteEligibility } from \"./monitor.terminal.js\";\r\nimport type {\r\n MonitorListEntry,\r\n MonitorSessionRecord,\r\n MonitorTickResult,\r\n TaskLeaseSnapshot,\r\n WorkerMonitorView,\r\n} from \"./monitor.types.js\";\r\nimport { fetchTaskLeasesForWorkers } from \"./monitor.task-lease.js\";\r\n\r\nfunction workerRecord(runId: string, name: string): HarnessWorkerRecord | undefined {\r\n return readJson<HarnessWorkerRecord | undefined>(\r\n path.join(runDirectory(runId), \"workers\", safeSlug(name), \"worker.json\"),\r\n undefined,\r\n );\r\n}\r\n\r\nfunction workerNamesForRun(runId: string, scope?: string): string[] {\r\n const run = loadRun(runId);\r\n const names = Object.keys(run.workers || {});\r\n if (!scope) return names;\r\n const wanted = safeSlug(scope);\r\n return names.filter((n) => safeSlug(n) === wanted);\r\n}\r\n\r\nfunction buildWorkerView(\r\n worker: HarnessWorkerRecord,\r\n taskLeases: Map<string, TaskLeaseSnapshot>,\r\n): WorkerMonitorView {\r\n const run = loadRun(worker.runId);\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n const taskLease = worker.taskId ? taskLeases.get(worker.taskId) ?? null : null;\r\n const health = classifyWorkerHealth({ worker, status, taskLease });\r\n const autoComplete = assessAutoCompleteEligibility({ worker, status });\r\n return {\r\n runId: worker.runId,\r\n worker: worker.name,\r\n health: health.health,\r\n healthReason: health.reason,\r\n workerStatus: status.status,\r\n attentionState: status.attention.state,\r\n attentionReason: status.attention.reason,\r\n alive: status.alive,\r\n taskId: worker.taskId,\r\n leaseOwner: taskLease?.leaseOwner ?? undefined,\r\n taskStatus: taskLease?.status,\r\n autoComplete,\r\n status,\r\n };\r\n}\r\n\r\n/** One monitor poll: classify workers, renew leases, auto-complete when verified terminal. */\r\nexport async function runMonitorTick(\r\n args: Record<string, string | boolean>,\r\n): Promise<MonitorTickResult> {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const scope = args.name ? String(args.name) : undefined;\r\n const agentOsId = args.agentOsId ? String(args.agentOsId) : undefined;\r\n const run = loadRun(runId);\r\n const names = workerNamesForRun(runId, scope);\r\n const workers: HarnessWorkerRecord[] = [];\r\n for (const name of names) {\r\n const worker = workerRecord(runId, name);\r\n if (worker) workers.push(worker);\r\n }\r\n\r\n const resolvedAgentOsId =\r\n agentOsId ||\r\n workers.map((w) => w.agentOsId).find((id) => typeof id === \"string\" && id.trim()) ||\r\n undefined;\r\n\r\n const taskIds = workers.map((w) => w.taskId).filter((id): id is string => Boolean(id));\r\n const taskLeases = await fetchTaskLeasesForWorkers({\r\n agentOsId: resolvedAgentOsId,\r\n taskIds,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n\r\n const views = workers.map((w) => buildWorkerView(w, taskLeases));\r\n\r\n let leaseRenewal: MonitorTickResult[\"leaseRenewal\"];\r\n if (resolvedAgentOsId && args.renewLeases !== false && args.renewLeases !== \"false\") {\r\n leaseRenewal = await renewActiveTaskLeases(runId, {\r\n ...args,\r\n agentOsId: resolvedAgentOsId,\r\n });\r\n }\r\n\r\n const autoCompleted: MonitorTickResult[\"autoCompleted\"] = [];\r\n const shouldAutoComplete = args.autoComplete === true || args.autoComplete === \"true\";\r\n if (shouldAutoComplete) {\r\n for (const view of views) {\r\n if (!view.autoComplete.eligible) {\r\n autoCompleted.push({\r\n worker: view.worker,\r\n outcome: \"skipped\",\r\n ok: false,\r\n reason: view.autoComplete.blockers.join(\"; \") || \"not eligible\",\r\n });\r\n continue;\r\n }\r\n const outcome = await autoCompleteWorker({\r\n run: runId,\r\n name: view.worker,\r\n ...(resolvedAgentOsId ? { agentOsId: resolvedAgentOsId } : {}),\r\n ...(args.baseUrl ? { baseUrl: String(args.baseUrl) } : {}),\r\n ...(args.secret ? { secret: String(args.secret) } : {}),\r\n });\r\n autoCompleted.push({\r\n worker: view.worker,\r\n outcome: outcome.outcome,\r\n ok: outcome.outcome === \"completed\",\r\n reason: outcome.reason,\r\n });\r\n }\r\n }\r\n\r\n return {\r\n runId,\r\n agentOsId: resolvedAgentOsId,\r\n workers: views,\r\n leaseRenewal,\r\n autoCompleted,\r\n };\r\n}\r\n\r\nexport function getMonitorStatus(args: Record<string, string | boolean>): MonitorTickResult {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const scope = args.name ? String(args.name) : undefined;\r\n const names = workerNamesForRun(runId, scope);\r\n const workers: WorkerMonitorView[] = [];\r\n for (const name of names) {\r\n const worker = workerRecord(runId, name);\r\n if (!worker) continue;\r\n workers.push(buildWorkerView(worker, new Map()));\r\n }\r\n return { runId, workers, autoCompleted: [] };\r\n}\r\n\r\nexport function listMonitors(): MonitorListEntry[] {\r\n return listMonitorSessions();\r\n}\r\n\r\nexport interface StartMonitorResult {\r\n monitorId: string;\r\n session: MonitorSessionRecord;\r\n spawned: boolean;\r\n pid?: number;\r\n}\r\n\r\nexport function stopMonitor(args: Record<string, string | boolean>): {\r\n monitorId: string;\r\n stopped: boolean;\r\n pid?: number;\r\n} {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const monitorId = monitorIdFor(runId, args.name ? String(args.name) : undefined);\r\n const session = loadMonitorSession(monitorId);\r\n if (!session) {\r\n return { monitorId, stopped: false };\r\n }\r\n if (session.pid && isPidAlive(session.pid)) {\r\n try {\r\n process.kill(session.pid, \"SIGTERM\");\r\n } catch {\r\n // best effort\r\n }\r\n }\r\n session.stoppedAt = new Date().toISOString();\r\n saveMonitorSession(session);\r\n deleteMonitorSession(monitorId);\r\n return { monitorId, stopped: true, pid: session.pid };\r\n}\r\n\r\nexport async function monitorAutoCompleteCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<void> {\r\n const runId = String(args.run || \"\");\r\n const name = String(args.name || \"\");\r\n required(runId, \"--run\");\r\n required(name, \"--name\");\r\n const worker = loadWorker(runId, name);\r\n const run = loadRun(runId);\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n const assessment = assessAutoCompleteEligibility({ worker, status });\r\n if (!assessment.eligible) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n runId,\r\n worker: name,\r\n outcome: \"blocked\",\r\n blockers: assessment.blockers,\r\n terminalVerified: assessment.terminalVerified,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n process.exitCode = 1;\r\n return;\r\n }\r\n const outcome = await autoCompleteWorker({\r\n ...args,\r\n run: runId,\r\n name,\r\n });\r\n console.log(JSON.stringify(outcome, null, 2));\r\n if (outcome.outcome !== \"completed\" && outcome.outcome !== \"blocked\") {\r\n process.exitCode = 1;\r\n }\r\n}\r\n", "import { harnessLeaseOwnerMatchesRun } from \"../harness-lease-owner.js\";\r\nimport { STALE_MS, type HarnessWorkerRecord, type RawHarnessWorkerStatus } from \"../status.js\";\r\nimport { isPidAlive } from \"../util.js\";\r\nimport type { TaskLeaseSnapshot, WorkerHealthClass } from \"./monitor.types.js\";\r\n\r\nexport interface WorkerHealthClassification {\r\n health: WorkerHealthClass;\r\n reason: string;\r\n}\r\n\r\n/**\r\n * Classify harness worker disk state vs optional board lease snapshot.\r\n * `running` on AgentTask means live executor lease \u2014 not plan-row `in_progress`.\r\n */\r\nexport function classifyWorkerHealth(input: {\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n taskLease?: TaskLeaseSnapshot | null;\r\n}): WorkerHealthClassification {\r\n const { worker, status, taskLease } = input;\r\n const leaseOwner = taskLease?.leaseOwner ?? null;\r\n\r\n if (worker.dispatched && taskLease) {\r\n if (\r\n taskLease.status === \"running\" &&\r\n leaseOwner &&\r\n !harnessLeaseOwnerMatchesRun(leaseOwner, worker.runId)\r\n ) {\r\n return {\r\n health: \"orphaned\",\r\n reason: `task lease held by ${leaseOwner}, expected harness run ${worker.runId}`,\r\n };\r\n }\r\n if (taskLease.status === \"running\" && !status.alive && !status.finalResult) {\r\n return {\r\n health: \"orphaned\",\r\n reason: \"board task running but worker process is not alive\",\r\n };\r\n }\r\n }\r\n\r\n if (worker.status === \"running\" && !status.alive && !status.finalResult) {\r\n return {\r\n health: \"orphaned\",\r\n reason: \"worker.json still running but process is dead\",\r\n };\r\n }\r\n\r\n if (status.attention.state === \"stale\") {\r\n return { health: \"stale\", reason: status.attention.reason };\r\n }\r\n\r\n const hbMs = status.lastHeartbeatAt ? Date.parse(status.lastHeartbeatAt) : NaN;\r\n if (status.alive && Number.isFinite(hbMs) && Date.now() - hbMs > STALE_MS) {\r\n return {\r\n health: \"stale\",\r\n reason: `heartbeat older than ${Math.floor(STALE_MS / 1000)}s`,\r\n };\r\n }\r\n\r\n if (status.alive && worker.pid && !isPidAlive(worker.pid)) {\r\n return { health: \"orphaned\", reason: \"pid recorded but process is not alive\" };\r\n }\r\n\r\n if (taskLease?.status === \"running\" && !status.alive && status.finalResult) {\r\n return {\r\n health: \"healthy\",\r\n reason: \"finished worker awaiting completion replay\",\r\n };\r\n }\r\n\r\n return {\r\n health: \"healthy\",\r\n reason: status.attention.reason || \"worker within expected lifecycle bounds\",\r\n };\r\n}\r\n", "import { existsSync, mkdirSync, readdirSync, unlinkSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths } from \"../paths.js\";\r\nimport { isPidAlive, readJson, safeSlug, writeJson } from \"../util.js\";\r\nimport type { MonitorListEntry, MonitorSessionRecord } from \"./monitor.types.js\";\r\n\r\nfunction monitorsDir(): string {\r\n const { harnessRoot } = getHarnessPaths();\r\n const dir = path.join(harnessRoot, \"monitors\");\r\n mkdirSync(dir, { recursive: true });\r\n return dir;\r\n}\r\n\r\nexport function monitorIdFor(runId: string, workerName?: string): string {\r\n return workerName ? `${safeSlug(runId)}--${safeSlug(workerName)}` : safeSlug(runId);\r\n}\r\n\r\nfunction monitorPath(monitorId: string): string {\r\n return path.join(monitorsDir(), `${monitorId}.json`);\r\n}\r\n\r\nexport function loadMonitorSession(monitorId: string): MonitorSessionRecord | undefined {\r\n return readJson<MonitorSessionRecord | undefined>(monitorPath(monitorId), undefined);\r\n}\r\n\r\nexport function saveMonitorSession(session: MonitorSessionRecord): void {\r\n writeJson(monitorPath(session.monitorId), session);\r\n}\r\n\r\nexport function deleteMonitorSession(monitorId: string): boolean {\r\n const file = monitorPath(monitorId);\r\n if (!existsSync(file)) return false;\r\n unlinkSync(file);\r\n return true;\r\n}\r\n\r\nexport function listMonitorSessions(): MonitorListEntry[] {\r\n const dir = monitorsDir();\r\n if (!existsSync(dir)) return [];\r\n const entries: MonitorListEntry[] = [];\r\n for (const name of readdirSync(dir)) {\r\n if (!name.endsWith(\".json\")) continue;\r\n const session = readJson<MonitorSessionRecord | undefined>(\r\n path.join(dir, name),\r\n undefined,\r\n );\r\n if (!session?.monitorId) continue;\r\n entries.push({\r\n monitorId: session.monitorId,\r\n runId: session.runId,\r\n workerName: session.workerName,\r\n agentOsId: session.agentOsId,\r\n pid: session.pid,\r\n alive: session.pid ? isPidAlive(session.pid) : false,\r\n startedAt: session.startedAt,\r\n pollMs: session.pollMs,\r\n logPath: session.logPath,\r\n });\r\n }\r\n return entries.sort((a, b) => a.startedAt.localeCompare(b.startedAt));\r\n}\r\n", "import { hasCompletionAck } from \"../completion-ack.js\";\r\nimport {\r\n isFinishedWorkerStatus,\r\n isLandingBlockedWorkerStatus,\r\n type HarnessWorkerRecord,\r\n type RawHarnessWorkerStatus,\r\n} from \"../status.js\";\r\nimport type { AutoCompleteAssessment } from \"./monitor.types.js\";\r\n\r\n/**\r\n * Auto-complete may only run when the worker has reached a verified terminal\r\n * condition and no structural blocker is present. Never paper over heartbeat\r\n * blockers, landing gates, or completion replay failures.\r\n */\r\nexport function assessAutoCompleteEligibility(input: {\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n}): AutoCompleteAssessment {\r\n const { worker, status } = input;\r\n const blockers: string[] = [];\r\n\r\n if (worker.localOnly) {\r\n blockers.push(\"local-only worker (no board linkage)\");\r\n }\r\n if (!worker.agentOsId || !worker.taskId) {\r\n blockers.push(\"missing agentOsId/taskId linkage\");\r\n }\r\n if (hasCompletionAck(worker)) {\r\n blockers.push(\"completion already acknowledged\");\r\n }\r\n if (worker.completionBlocker) {\r\n blockers.push(worker.completionBlocker);\r\n }\r\n if (status.heartbeatBlocker && status.alive) {\r\n blockers.push(`worker heartbeat blocker: ${status.heartbeatBlocker}`);\r\n }\r\n if (status.attention.state === \"blocked\") {\r\n blockers.push(status.attention.reason || \"worker attention blocked\");\r\n }\r\n if (isLandingBlockedWorkerStatus(status)) {\r\n blockers.push(status.attention.reason || \"landing gate blocked\");\r\n }\r\n\r\n const terminalVerified = isFinishedWorkerStatus(status);\r\n let terminalReason: string | undefined;\r\n if (terminalVerified) {\r\n if (status.finalResult) terminalReason = \"final_result\";\r\n else if (!status.alive) terminalReason = \"process_exited\";\r\n else terminalReason = \"terminal_status\";\r\n } else {\r\n blockers.push(\"worker has not reached a terminal condition\");\r\n }\r\n\r\n const eligible = terminalVerified && blockers.length === 0;\r\n return {\r\n eligible,\r\n terminalVerified,\r\n terminalReason,\r\n blockers,\r\n };\r\n}\r\n", "import { resolveBaseUrl, resolveCallbackSecretWithMint } from \"../config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"../callbacks.js\";\r\nimport type { TaskLeaseSnapshot } from \"./monitor.types.js\";\r\n\r\n/**\r\n * Best-effort board lease snapshot for monitor classification. Failures return\r\n * an empty map \u2014 local disk classification still runs without server data.\r\n */\r\nexport async function fetchTaskLeasesForWorkers(input: {\r\n agentOsId?: string;\r\n taskIds: string[];\r\n baseUrl?: string;\r\n secret?: string;\r\n}): Promise<Map<string, TaskLeaseSnapshot>> {\r\n const out = new Map<string, TaskLeaseSnapshot>();\r\n const agentOsId = input.agentOsId?.trim();\r\n if (!agentOsId || input.taskIds.length === 0) return out;\r\n\r\n const base = resolveBaseUrl(input.baseUrl);\r\n try {\r\n const secret = await resolveCallbackSecretWithMint(input.secret, agentOsId, { baseUrl: base });\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/monitor/task-leases`;\r\n\r\n const res = await postJsonWithCredentialRefresh(\r\n url,\r\n secret,\r\n { taskIds: [...new Set(input.taskIds)] },\r\n { agentOsId, baseUrl: base },\r\n );\r\n if (!res.ok || !res.response || typeof res.response !== \"object\") return out;\r\n const rows = (res.response as { tasks?: TaskLeaseSnapshot[] }).tasks;\r\n if (!Array.isArray(rows)) return out;\r\n for (const row of rows) {\r\n if (row?.taskId) out.set(row.taskId, row);\r\n }\r\n } catch {\r\n // Best-effort \u2014 local classification still runs without board lease data.\r\n }\r\n return out;\r\n}\r\n", "import { formatMonitorTickNotice } from \"../harness-notice/index.js\";\r\nimport { runMonitorTick } from \"./monitor.service.js\";\r\nimport { loadMonitorSession, saveMonitorSession } from \"./monitor.store.js\";\r\nimport { sleepMs } from \"../util.js\";\r\n\r\nconst DEFAULT_POLL_MS = 5_000;\r\nconst DEFAULT_MAX_TOTAL_MS = 6 * 60 * 60 * 1000;\r\n\r\nexport async function runMonitorLoop(args: Record<string, string | boolean>): Promise<void> {\r\n const monitorId = String(args.monitorId || \"\");\r\n const pollMs =\r\n Number(args.pollMs) > 0 ? Math.floor(Number(args.pollMs)) : DEFAULT_POLL_MS;\r\n const maxTotalMs =\r\n Number(args.maxTotalMs) > 0 ? Math.floor(Number(args.maxTotalMs)) : DEFAULT_MAX_TOTAL_MS;\r\n const startMs = Date.now();\r\n\r\n while (Date.now() - startMs <= maxTotalMs) {\r\n const session = monitorId ? loadMonitorSession(monitorId) : undefined;\r\n if (session?.stoppedAt) break;\r\n\r\n const tick = await runMonitorTick({\r\n ...args,\r\n autoComplete: args.autoComplete ?? true,\r\n renewLeases: args.renewLeases ?? true,\r\n });\r\n const notice = formatMonitorTickNotice({ monitorId, phase: \"tick\", ...tick });\r\n console.log(notice.primary);\r\n if (notice.diagnostic) {\r\n console.error(`[monitor diagnostic] ${notice.diagnostic}`);\r\n }\r\n\r\n const allTerminal =\r\n tick.workers.length > 0 &&\r\n tick.workers.every(\r\n (w) =>\r\n w.autoComplete.terminalVerified &&\r\n (w.autoComplete.eligible ||\r\n w.autoComplete.blockers.some((b) => b.includes(\"already acknowledged\"))),\r\n );\r\n if (allTerminal && tick.autoCompleted.every((a) => a.ok || a.outcome === \"skipped\")) {\r\n if (monitorId && session) {\r\n session.stoppedAt = new Date().toISOString();\r\n saveMonitorSession(session);\r\n }\r\n break;\r\n }\r\n\r\n sleepMs(pollMs);\r\n }\r\n}\r\n", "import { spawn } from \"node:child_process\";\r\nimport { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { hiddenSpawnOptions } from \"../util.js\";\r\nimport { getHarnessPaths } from \"../paths.js\";\r\nimport { monitorIdFor, saveMonitorSession } from \"./monitor.store.js\";\r\nimport type { MonitorSessionRecord } from \"./monitor.types.js\";\r\n\r\nexport interface SpawnMonitorOptions {\r\n runId: string;\r\n workerName?: string;\r\n agentOsId?: string;\r\n pollMs?: number;\r\n cliPath?: string;\r\n nodeExecutable?: string;\r\n baseUrl?: string;\r\n secret?: string;\r\n}\r\n\r\nexport interface SpawnedMonitor {\r\n monitorId: string;\r\n pid?: number;\r\n logPath: string;\r\n session: MonitorSessionRecord;\r\n}\r\n\r\nfunction resolveDefaultCliPath(): string {\r\n // Bundled dist/cli.js: import.meta.url is the cli bundle; cli.js lives in the\r\n // same directory (same contract as spawnCompletionSidecar in auto-complete.ts).\r\n return path.join(fileURLToPath(new URL(\".\", import.meta.url)), \"cli.js\");\r\n}\r\n\r\nexport function spawnMonitorSidecar(opts: SpawnMonitorOptions): SpawnedMonitor | undefined {\r\n const cliPath = opts.cliPath ?? resolveDefaultCliPath();\r\n if (!existsSync(cliPath)) return undefined;\r\n\r\n const monitorId = monitorIdFor(opts.runId, opts.workerName);\r\n const { harnessRoot } = getHarnessPaths();\r\n const logPath = path.join(harnessRoot, \"monitors\", `${monitorId}.log`);\r\n let logFd: number | undefined;\r\n try {\r\n logFd = openSync(logPath, \"a\");\r\n } catch {\r\n logFd = undefined;\r\n }\r\n\r\n const nodeExecutable = opts.nodeExecutable ?? process.execPath;\r\n const pollMs = opts.pollMs ?? 5_000;\r\n const args = [\r\n cliPath,\r\n \"monitor\",\r\n \"run-loop\",\r\n \"--run\",\r\n opts.runId,\r\n \"--monitor-id\",\r\n monitorId,\r\n \"--poll-ms\",\r\n String(pollMs),\r\n \"--auto-complete\",\r\n \"true\",\r\n \"--renew-leases\",\r\n \"true\",\r\n ];\r\n if (opts.workerName) args.push(\"--name\", opts.workerName);\r\n if (opts.agentOsId) args.push(\"--agent-os-id\", opts.agentOsId);\r\n if (opts.baseUrl) args.push(\"--base-url\", opts.baseUrl);\r\n if (opts.secret) args.push(\"--secret\", opts.secret);\r\n\r\n const stdio: (\"ignore\" | number)[] = [\r\n \"ignore\",\r\n logFd ?? \"ignore\",\r\n logFd ?? \"ignore\",\r\n ];\r\n\r\n try {\r\n const child = spawn(\r\n nodeExecutable,\r\n args,\r\n hiddenSpawnOptions({\r\n detached: true,\r\n stdio,\r\n env: process.env,\r\n }),\r\n );\r\n if (logFd !== undefined) closeSync(logFd);\r\n child.unref();\r\n\r\n const session: MonitorSessionRecord = {\r\n monitorId,\r\n runId: opts.runId,\r\n workerName: opts.workerName,\r\n agentOsId: opts.agentOsId,\r\n pid: child.pid,\r\n startedAt: new Date().toISOString(),\r\n pollMs,\r\n logPath,\r\n };\r\n saveMonitorSession(session);\r\n return { monitorId, pid: child.pid, logPath, session };\r\n } catch {\r\n if (logFd !== undefined) {\r\n try {\r\n closeSync(logFd);\r\n } catch {\r\n // best effort\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n", "import { runMonitorLoop } from \"./monitor-loop.js\";\r\nimport { spawnMonitorSidecar } from \"./monitor-spawn.js\";\r\nimport {\r\n getMonitorStatus,\r\n listMonitors,\r\n monitorAutoCompleteCli,\r\n runMonitorTick,\r\n stopMonitor,\r\n} from \"./monitor.service.js\";\r\nimport type { StartMonitorResult } from \"./monitor.service.js\";\r\nimport { loadMonitorSession, monitorIdFor } from \"./monitor.store.js\";\r\nimport { required } from \"../util.js\";\r\n\r\nexport async function startMonitorCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<StartMonitorResult> {\r\n const runId = String(args.run || \"\");\r\n required(runId, \"--run\");\r\n const workerName = args.name ? String(args.name) : undefined;\r\n const monitorId = monitorIdFor(runId, workerName);\r\n const existing = loadMonitorSession(monitorId);\r\n if (existing?.pid && !existing.stoppedAt) {\r\n return { monitorId, session: existing, spawned: false, pid: existing.pid };\r\n }\r\n\r\n const spawned = spawnMonitorSidecar({\r\n runId,\r\n workerName,\r\n agentOsId: args.agentOsId ? String(args.agentOsId) : undefined,\r\n pollMs: Number(args.pollMs) > 0 ? Math.floor(Number(args.pollMs)) : undefined,\r\n baseUrl: args.baseUrl ? String(args.baseUrl) : undefined,\r\n secret: args.secret ? String(args.secret) : undefined,\r\n });\r\n if (!spawned) {\r\n throw new Error(\"failed to spawn monitor sidecar (cli.js missing or spawn error)\");\r\n }\r\n return {\r\n monitorId,\r\n session: spawned.session,\r\n spawned: true,\r\n pid: spawned.pid,\r\n };\r\n}\r\n\r\nexport async function monitorStatusCli(args: Record<string, string | boolean>): Promise<void> {\r\n const runId = String(args.run || \"\");\r\n if (runId) {\r\n const tick = args.tick === true || args.tick === \"true\"\r\n ? await runMonitorTick({ ...args, autoComplete: false })\r\n : getMonitorStatus(args);\r\n console.log(JSON.stringify(tick, null, 2));\r\n return;\r\n }\r\n console.log(JSON.stringify({ monitors: listMonitors() }, null, 2));\r\n}\r\n\r\nexport function monitorStopCli(args: Record<string, string | boolean>): void {\r\n console.log(JSON.stringify(stopMonitor(args), null, 2));\r\n}\r\n\r\nexport function monitorListCli(): void {\r\n console.log(JSON.stringify({ monitors: listMonitors() }, null, 2));\r\n}\r\n\r\nexport async function monitorRunLoopCli(args: Record<string, string | boolean>): Promise<void> {\r\n await runMonitorLoop(args);\r\n}\r\n\r\nexport async function monitorTickCli(args: Record<string, string | boolean>): Promise<void> {\r\n const tick = await runMonitorTick(args);\r\n console.log(JSON.stringify(tick, null, 2));\r\n}\r\n\r\nexport {\r\n monitorAutoCompleteCli,\r\n startMonitorCli as startMonitor,\r\n getMonitorStatus,\r\n listMonitors,\r\n runMonitorTick,\r\n stopMonitor,\r\n};\r\n", "// packages/kynver-runtime/src/post-restart-unblock.ts\r\n//\r\n// Post-restart auto-unblock: after a daemon restart, dispatched workers that\r\n// died while holding active server-side leases leave their linked AgentTasks\r\n// stuck as `running` in the Command Center. `dispatch-next` only considers\r\n// `queued` rows, so those tasks will never be re-dispatched until their 1-hour\r\n// lease expires \u2014 and even a hard page refresh shows stale `running` state.\r\n//\r\n// This module scans ALL local run records (not just the current run), finds\r\n// dispatched workers that are dead and have no completion ack or final result,\r\n// and calls the server `release` API for each using the worker's stored\r\n// `leaseOwner`. Releasing the lease atomically requeues the task so the next\r\n// `dispatch-next` cycle picks it up and the Command Center reflects accurate\r\n// state after the next hard refresh.\r\n//\r\n// Usage:\r\n// kynver run unblock [--agent-os-id AOS_ID] [--base-url URL] [--secret SECRET] [--dry-run]\r\n\r\nimport path from \"node:path\";\r\nimport { listRunRecords, runDirectory } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\n\r\nexport interface UnblockWorkerOutcome {\r\n runId: string;\r\n worker: string;\r\n taskId: string;\r\n agentOsId: string;\r\n leaseOwner: string;\r\n action: \"released\" | \"skipped\" | \"error\";\r\n reason: string;\r\n}\r\n\r\nexport interface PostRestartUnblockResult {\r\n dryRun: boolean;\r\n released: UnblockWorkerOutcome[];\r\n skipped: UnblockWorkerOutcome[];\r\n errors: UnblockWorkerOutcome[];\r\n}\r\n\r\nfunction skip(\r\n runId: string,\r\n worker: string,\r\n taskId: string,\r\n agentOsId: string,\r\n leaseOwner: string,\r\n reason: string,\r\n): UnblockWorkerOutcome {\r\n return { runId, worker, taskId, agentOsId, leaseOwner, action: \"skipped\", reason };\r\n}\r\n\r\n/**\r\n * Scan all local run records for dead dispatched workers and release their\r\n * server-side leases so the linked AgentTasks are requeued. Safe to run\r\n * multiple times \u2014 the server `releaseLease` is owner-guarded and idempotent\r\n * (a mismatched or already-released owner returns 409 / ok:false, not an\r\n * error that breaks the loop).\r\n */\r\nexport async function postRestartUnblock(\r\n args: Record<string, string | boolean>,\r\n): Promise<PostRestartUnblockResult> {\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const agentOsIdFilter = args.agentOsId ? String(args.agentOsId).trim() : null;\r\n const dryRun = args.dryRun === true || args.dryRun === \"true\";\r\n\r\n const released: UnblockWorkerOutcome[] = [];\r\n const skipped: UnblockWorkerOutcome[] = [];\r\n const errors: UnblockWorkerOutcome[] = [];\r\n\r\n for (const run of listRunRecords()) {\r\n for (const name of Object.keys(run.workers ?? {})) {\r\n const workerPath = path.join(runDirectory(run.id), \"workers\", safeSlug(name), \"worker.json\");\r\n const worker = readJson<HarnessWorkerRecord | undefined>(workerPath, undefined);\r\n\r\n if (!worker) {\r\n skipped.push(skip(run.id, name, \"\", \"\", \"\", \"worker.json missing\"));\r\n continue;\r\n }\r\n\r\n const taskId = worker.taskId ?? \"\";\r\n const agentOsId = worker.agentOsId ?? \"\";\r\n const leaseOwner = worker.leaseOwner ?? \"\";\r\n\r\n // Only target dispatched workers with full server-side lease info.\r\n if (!worker.dispatched || !taskId || !agentOsId || !leaseOwner) {\r\n skipped.push(\r\n skip(run.id, name, taskId, agentOsId, leaseOwner, \"not a fully-leased dispatched worker\"),\r\n );\r\n continue;\r\n }\r\n\r\n // Optional per-agentOsId scope.\r\n if (agentOsIdFilter && agentOsId !== agentOsIdFilter) continue;\r\n\r\n // Skip workers that already had completion reported \u2014 the server already\r\n // knows about this worker's outcome; releasing would be a no-op or wrong.\r\n if (worker.completionReportedAt) {\r\n skipped.push(\r\n skip(run.id, name, taskId, agentOsId, leaseOwner, \"completion already reported\"),\r\n );\r\n continue;\r\n }\r\n\r\n const status = computeWorkerStatus(worker);\r\n\r\n // Skip workers that already have a final result \u2014 completion will be\r\n // replayed by the normal pipeline tick.\r\n if (status.finalResult) {\r\n skipped.push(\r\n skip(run.id, name, taskId, agentOsId, leaseOwner, \"has final result \u2014 let pipeline tick complete it\"),\r\n );\r\n continue;\r\n }\r\n\r\n // Skip live workers \u2014 they are still renewing their lease.\r\n if (status.alive) {\r\n skipped.push(\r\n skip(run.id, name, taskId, agentOsId, leaseOwner, \"worker process is still alive\"),\r\n );\r\n continue;\r\n }\r\n\r\n if (dryRun) {\r\n released.push({\r\n runId: run.id,\r\n worker: name,\r\n taskId,\r\n agentOsId,\r\n leaseOwner,\r\n action: \"released\",\r\n reason: \"dry-run: would release dead dispatched worker lease\",\r\n });\r\n continue;\r\n }\r\n\r\n // Release the server-side lease. The release API is owner-guarded: a\r\n // mismatch returns 409 (ok:false) rather than an error, so we log it as\r\n // a skipped outcome rather than an error.\r\n try {\r\n const secret = await resolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n { baseUrl: base },\r\n );\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(taskId)}/release`;\r\n const release = await postJsonWithCredentialRefresh(\r\n releaseUrl,\r\n secret,\r\n { agentOsId, leaseOwner },\r\n { agentOsId, baseUrl: base },\r\n );\r\n const releaseOk =\r\n release.ok === true ||\r\n (release.response as Record<string, unknown> | null)?.ok === true;\r\n\r\n if (releaseOk) {\r\n released.push({\r\n runId: run.id,\r\n worker: name,\r\n taskId,\r\n agentOsId,\r\n leaseOwner,\r\n action: \"released\",\r\n reason: \"dead dispatched worker lease released; task requeued\",\r\n });\r\n } else {\r\n // 409 = owner mismatch (lease already released or held by another run).\r\n skipped.push({\r\n runId: run.id,\r\n worker: name,\r\n taskId,\r\n agentOsId,\r\n leaseOwner,\r\n action: \"skipped\",\r\n reason: `release returned ok:false (likely owner mismatch or already released): HTTP ${release.status}`,\r\n });\r\n }\r\n } catch (err) {\r\n errors.push({\r\n runId: run.id,\r\n worker: name,\r\n taskId,\r\n agentOsId,\r\n leaseOwner,\r\n action: \"error\",\r\n reason: (err as Error).message,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return { dryRun, released, skipped, errors };\r\n}\r\n\r\nexport async function postRestartUnblockCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<void> {\r\n const result = await postRestartUnblock(args);\r\n const summary = {\r\n ok: result.errors.length === 0,\r\n dryRun: result.dryRun,\r\n released: result.released.length,\r\n skipped: result.skipped.length,\r\n errors: result.errors.length,\r\n details: result,\r\n };\r\n console.log(JSON.stringify(summary, null, 2));\r\n if (result.errors.length > 0) process.exit(1);\r\n}\r\n", "import path from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\nimport { displayUserPath } from \"./path-values.js\";\r\nimport { loadUserConfig, presentUserConfig } from \"./config.js\";\r\nimport {\r\n formatResolvedDefaultRepo,\r\n persistDefaultRepo,\r\n resolveDefaultRepo,\r\n type ResolvedDefaultRepo,\r\n} from \"./default-repo.js\";\r\n\r\nconst CONFIG_FILE = path.join(homedir(), \".kynver\", \"config.json\");\r\n\r\nexport interface EnsureDefaultRepoResult {\r\n ok: boolean;\r\n remediated: boolean;\r\n alreadyPersisted: boolean;\r\n configPath: string;\r\n resolved: ReturnType<typeof formatResolvedDefaultRepo> | null;\r\n config?: ReturnType<typeof presentUserConfig>;\r\n reason?: string;\r\n remediation?: string;\r\n}\r\n\r\nexport function ensureDefaultRepo(opts?: { cwd?: string }): EnsureDefaultRepoResult {\r\n const existing = loadUserConfig();\r\n const resolved = resolveDefaultRepo({ ...opts, config: existing });\r\n if (!resolved) {\r\n return {\r\n ok: false,\r\n remediated: false,\r\n alreadyPersisted: false,\r\n configPath: displayUserPath(CONFIG_FILE),\r\n resolved: null,\r\n reason:\r\n \"No Kynver git checkout found. Clone the repo, cd into it, then run `kynver setup --repo /path/to/Kynver` \" +\r\n \"(or export KYNVER_DEFAULT_REPO).\",\r\n remediation:\r\n \"Clone the Kynver monorepo, cd into it, then run `kynver config ensure-default-repo` \" +\r\n \"(or `kynver setup --repo /path/to/Kynver`).\",\r\n };\r\n }\r\n\r\n if (resolved.persistedInConfig) {\r\n return {\r\n ok: true,\r\n remediated: false,\r\n alreadyPersisted: true,\r\n configPath: displayUserPath(CONFIG_FILE),\r\n resolved: formatResolvedDefaultRepo(resolved),\r\n config: presentUserConfig(existing),\r\n };\r\n }\r\n\r\n const config = persistDefaultRepo(resolved.repo, existing);\r\n const persisted = formatResolvedDefaultRepo({\r\n ...resolved,\r\n persistedInConfig: true,\r\n source: \"config\",\r\n });\r\n\r\n return {\r\n ok: true,\r\n remediated: true,\r\n alreadyPersisted: false,\r\n configPath: displayUserPath(CONFIG_FILE),\r\n resolved: persisted,\r\n config: presentUserConfig(config),\r\n remediation:\r\n \"defaultRepo persisted in ~/.kynver/config.json \u2014 `kynver run create` no longer requires --repo.\",\r\n };\r\n}\r\n\r\nexport function runEnsureDefaultRepoCli(json = false): void {\r\n const result = ensureDefaultRepo();\r\n if (json) {\r\n console.log(JSON.stringify(result, null, 2));\r\n if (!result.ok) process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (!result.ok) {\r\n console.error(result.reason ?? \"Could not resolve a Kynver git checkout.\");\r\n if (result.remediation) console.error(result.remediation);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (result.alreadyPersisted) {\r\n console.log(\r\n `defaultRepo already set (${result.resolved?.defaultRepo ?? \"unknown\"}) in ${result.configPath}`,\r\n );\r\n return;\r\n }\r\n\r\n console.log(\r\n `Persisted defaultRepo ${result.resolved?.defaultRepo ?? \"\"} in ${result.configPath}. ` +\r\n \"`kynver run create` can omit --repo.\",\r\n );\r\n}\r\n\r\nexport function summarizeResolvedDefaultRepo(resolved: ResolvedDefaultRepo | null): {\r\n status: \"pass\" | \"warn\";\r\n remediation?: string;\r\n} {\r\n if (!resolved) {\r\n return {\r\n status: \"warn\",\r\n remediation:\r\n \"Run `kynver config ensure-default-repo` from a Kynver checkout \" +\r\n \"(or `kynver setup --repo /path/to/Kynver`).\",\r\n };\r\n }\r\n if (!resolved.persistedInConfig) {\r\n return {\r\n status: \"warn\",\r\n remediation:\r\n \"Run `kynver config ensure-default-repo` to persist defaultRepo in ~/.kynver/config.json \" +\r\n \"(or `kynver doctor runtime-takeover --remediate-default-repo`).\",\r\n };\r\n }\r\n return { status: \"pass\" };\r\n}\r\n", "import path from \"node:path\";\r\nimport { summarizeResolvedDefaultRepo } from \"../default-repo-cli.js\";\r\nimport { formatResolvedDefaultRepo, resolveDefaultRepo } from \"../default-repo.js\";\r\nimport { displayUserPath, redactHomePath } from \"../path-values.js\";\r\nimport type { DoctorCheck, DoctorSection, RuntimeTakeoverDoctorReport } from \"./doctor.types.js\";\r\nimport {\r\n defaultRuntimeTakeoverProbes,\r\n type RuntimeTakeoverProbes,\r\n} from \"./runtime-takeover.probes.js\";\r\nimport { assessRuntimeTakeoverScheduler } from \"./runtime-takeover-scheduler.js\";\r\n\r\nfunction check(partial: DoctorCheck): DoctorCheck {\r\n return partial;\r\n}\r\n\r\nfunction summarizeCounts(sections: DoctorSection[]): RuntimeTakeoverDoctorReport[\"counts\"] {\r\n const counts = { pass: 0, warn: 0, fail: 0 };\r\n for (const section of sections) {\r\n for (const item of section.checks) {\r\n counts[item.status] += 1;\r\n }\r\n }\r\n return counts;\r\n}\r\n\r\nfunction assessCliPackage(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const runningVersion = probes.packageVersion();\r\n const which = probes.commandOnPath(\"kynver\");\r\n const onPath = which.ok && which.stdout.length > 0;\r\n const firstPath = onPath ? which.stdout.split(/\\r?\\n/)[0]?.trim() : undefined;\r\n const displayCliPath = firstPath ? displayUserPath(firstPath) : undefined;\r\n\r\n const checks: DoctorCheck[] = [\r\n check({\r\n id: \"cli_running_version\",\r\n label: \"Running @kynver-app/runtime version\",\r\n status: \"pass\",\r\n summary: `@kynver-app/runtime ${runningVersion}`,\r\n details: { version: runningVersion },\r\n }),\r\n check({\r\n id: \"cli_on_path\",\r\n label: \"kynver executable on PATH\",\r\n status: onPath ? \"pass\" : \"warn\",\r\n summary: onPath ? `Found ${displayCliPath}` : \"kynver not found on PATH (invoked via node/npx?)\",\r\n remediation: onPath\r\n ? undefined\r\n : \"Install globally (`npm i -g @kynver-app/runtime`) or invoke via `npx @kynver-app/runtime`.\",\r\n details: { path: displayCliPath },\r\n }),\r\n ];\r\n\r\n if (onPath && firstPath) {\r\n const versionProbe = probes.kynverVersion(firstPath);\r\n const installedVersion = versionProbe.stdout.replace(/^kynver\\s+/i, \"\").trim() || undefined;\r\n const versionMatch = versionProbe.ok && (!installedVersion || installedVersion === runningVersion);\r\n checks.push(\r\n check({\r\n id: \"cli_installed_version\",\r\n label: \"Installed kynver CLI version matches running package\",\r\n status: versionMatch ? \"pass\" : \"warn\",\r\n summary: versionProbe.ok && installedVersion\r\n ? versionMatch\r\n ? `Installed ${installedVersion}`\r\n : `Installed ${installedVersion} differs from running ${runningVersion}`\r\n : versionProbe.error\r\n ? `Could not read installed version (${versionProbe.error})`\r\n : versionProbe.stderr || \"Could not read installed version\",\r\n remediation: versionMatch\r\n ? undefined\r\n : \"Reinstall or rebuild @kynver-app/runtime so PATH kynver matches the harness worktree version.\",\r\n details: { installedVersion, runningVersion, path: displayCliPath },\r\n }),\r\n );\r\n }\r\n\r\n return { id: \"cli_package\", label: \"CLI / package\", checks };\r\n}\r\n\r\nfunction assessUserConfig(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const configPath = probes.configFilePath();\r\n const displayConfigPath = displayUserPath(configPath);\r\n const exists = probes.pathExists(configPath);\r\n const config = probes.loadConfig();\r\n const checks: DoctorCheck[] = [\r\n check({\r\n id: \"config_file\",\r\n label: \"~/.kynver/config.json present\",\r\n status: exists ? \"pass\" : \"fail\",\r\n summary: exists ? `Found ${displayConfigPath}` : `Missing ${displayConfigPath}`,\r\n remediation: exists ? undefined : \"Run `kynver setup --api-base-url <url> --agent-os-id <id> --repo <path>`.\",\r\n details: { configPath: displayConfigPath },\r\n }),\r\n ];\r\n\r\n if (exists) {\r\n const apiBaseUrl = config.apiBaseUrl?.trim();\r\n const agentOsId = config.agentOsId?.trim();\r\n const resolvedDefaultRepo = resolveDefaultRepo({ config });\r\n const formatted = resolvedDefaultRepo ? formatResolvedDefaultRepo(resolvedDefaultRepo) : null;\r\n const defaultRepoAssessment = summarizeResolvedDefaultRepo(resolvedDefaultRepo);\r\n checks.push(\r\n check({\r\n id: \"config_api_base_url\",\r\n label: \"Default API base URL\",\r\n status: apiBaseUrl ? \"pass\" : \"warn\",\r\n summary: apiBaseUrl ?? \"Not set in config (KYNVER_API_URL / --base-url required per command)\",\r\n remediation: apiBaseUrl ? undefined : \"Set `apiBaseUrl` via `kynver setup --api-base-url https://\u2026`.\",\r\n details: { apiBaseUrl: apiBaseUrl ?? null },\r\n }),\r\n check({\r\n id: \"config_agent_os_id\",\r\n label: \"Default AgentOS id\",\r\n status: agentOsId ? \"pass\" : \"warn\",\r\n summary: agentOsId ?? \"Not set (pass --agent-os-id on daemon/dispatch/worker commands)\",\r\n remediation: agentOsId ? undefined : \"Set `agentOsId` via `kynver setup --agent-os-id <uuid>`.\",\r\n details: { agentOsId: agentOsId ?? null, agentOsSlug: config.agentOsSlug ?? null },\r\n }),\r\n check({\r\n id: \"config_default_repo\",\r\n label: \"Default repo path\",\r\n status: defaultRepoAssessment.status,\r\n summary: resolvedDefaultRepo\r\n ? resolvedDefaultRepo.persistedInConfig\r\n ? `${formatted!.defaultRepo} (config)`\r\n : `${formatted!.defaultRepo} (${resolvedDefaultRepo.source}, not persisted in ~/.kynver/config.json)`\r\n : \"Not set in ~/.kynver/config.json (`kynver run create` requires --repo)\",\r\n remediation: defaultRepoAssessment.remediation,\r\n details: {\r\n defaultRepo: formatted?.defaultRepo ?? null,\r\n source: formatted?.source ?? null,\r\n persistedInConfig: formatted?.persistedInConfig ?? false,\r\n harnessRoot: config.harnessRoot ? redactHomePath(config.harnessRoot) : null,\r\n },\r\n }),\r\n );\r\n }\r\n\r\n return { id: \"user_config\", label: \"User config (~/.kynver)\", checks };\r\n}\r\n\r\nfunction assessRunnerToken(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const config = probes.loadConfig();\r\n const targetAgentOsId = config.agentOsId?.trim();\r\n const creds = probes.readCredentials();\r\n const env = probes.envSnapshot();\r\n const credPath = probes.credentialsFilePath();\r\n const displayCredPath = displayUserPath(credPath);\r\n\r\n const envToken = env.kynverRunnerTokenPrefix;\r\n const savedToken = creds.runnerTokenPrefix;\r\n const savedAgentOsId = creds.runnerTokenAgentOsId;\r\n const scopedSaved =\r\n Boolean(savedToken) && (!targetAgentOsId || !savedAgentOsId || savedAgentOsId === targetAgentOsId);\r\n const hasScoped = Boolean(envToken?.startsWith(\"krc1.\")) || (scopedSaved && savedToken?.startsWith(\"krc1.\"));\r\n\r\n const checks: DoctorCheck[] = [\r\n check({\r\n id: \"runner_token_scoped\",\r\n label: \"Scoped runner token (krc1.*) ready\",\r\n status: hasScoped ? \"pass\" : \"fail\",\r\n summary: hasScoped\r\n ? envToken\r\n ? \"KYNVER_RUNNER_TOKEN is set (scoped prefix shown)\"\r\n : `Saved scoped token for agentOsId ${savedAgentOsId ?? targetAgentOsId ?? \"(unknown)\"}`\r\n : \"No scoped runner token for the configured AgentOS workspace\",\r\n remediation: hasScoped\r\n ? undefined\r\n : \"Run `kynver login` then `kynver runner credential --agent-os-id <id>` (or `kynver setup` with API key).\",\r\n details: {\r\n source: envToken ? \"env\" : savedToken ? \"credentials\" : \"none\",\r\n tokenPrefix: envToken ?? (scopedSaved ? savedToken : undefined),\r\n agentOsId: targetAgentOsId ?? savedAgentOsId ?? null,\r\n credentialsPath: displayCredPath,\r\n },\r\n }),\r\n check({\r\n id: \"runner_token_agent_os_match\",\r\n label: \"Saved runner token matches configured agentOsId\",\r\n status:\r\n !savedToken || !targetAgentOsId || !savedAgentOsId || savedAgentOsId === targetAgentOsId\r\n ? \"pass\"\r\n : \"warn\",\r\n summary:\r\n !savedToken || !savedAgentOsId\r\n ? \"No saved token agentOsId to compare\"\r\n : !targetAgentOsId\r\n ? \"Config agentOsId unset \u2014 token scope not validated against config\"\r\n : savedAgentOsId === targetAgentOsId\r\n ? \"Saved token scoped to configured agentOsId\"\r\n : `Saved token is for ${savedAgentOsId}, config expects ${targetAgentOsId}`,\r\n remediation:\r\n savedToken && targetAgentOsId && savedAgentOsId && savedAgentOsId !== targetAgentOsId\r\n ? \"`kynver runner credential --agent-os-id <configured-id>` to mint a workspace-bound token.\"\r\n : undefined,\r\n details: { configuredAgentOsId: targetAgentOsId ?? null, savedAgentOsId: savedAgentOsId ?? null },\r\n }),\r\n check({\r\n id: \"runner_api_key_for_refresh\",\r\n label: \"API key available for token refresh\",\r\n status: creds.hasApiKey || Boolean(process.env.KYNVER_API_KEY?.trim()) ? \"pass\" : \"warn\",\r\n summary: creds.hasApiKey || process.env.KYNVER_API_KEY\r\n ? \"KYNVER API key present for runner credential mint/refresh\"\r\n : \"No API key \u2014 401 callback recovery cannot auto-mint a replacement token\",\r\n remediation: creds.hasApiKey || process.env.KYNVER_API_KEY ? undefined : \"Run `kynver login --api-key \u2026`.\",\r\n details: { credentialsPath: displayCredPath, hasApiKey: creds.hasApiKey || Boolean(process.env.KYNVER_API_KEY) },\r\n }),\r\n ];\r\n\r\n return { id: \"runner_token\", label: \"Runner token readiness\", checks };\r\n}\r\n\r\nfunction assessVercelDeployEvidence(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const globalCli = probes.commandOnPath(\"vercel\");\r\n const cliInstalled = globalCli.ok;\r\n const githubToken = Boolean(\r\n process.env.GITHUB_TOKEN?.trim() || process.env.GH_TOKEN?.trim(),\r\n );\r\n const vercelToken = Boolean(process.env.VERCEL_TOKEN?.trim());\r\n\r\n return {\r\n id: \"vercel_deploy_evidence\",\r\n label: \"Vercel deploy evidence\",\r\n checks: [\r\n check({\r\n id: \"vercel_global_cli_absent\",\r\n label: \"Global Vercel CLI not installed\",\r\n status: cliInstalled ? \"warn\" : \"pass\",\r\n summary: cliInstalled\r\n ? `Global Vercel CLI found (${globalCli.stdout || \"on PATH\"}) \u2014 uninstall after operator approval`\r\n : \"No global Vercel CLI on PATH\",\r\n remediation: cliInstalled\r\n ? \"Uninstall global Vercel CLI (`npm uninstall -g vercel`) \u2014 use GitHub commit status or scoped VERCEL_TOKEN + REST API instead.\"\r\n : undefined,\r\n details: { path: cliInstalled ? globalCli.stdout || null : null },\r\n }),\r\n check({\r\n id: \"github_token_for_vercel_status\",\r\n label: \"GitHub token for Vercel status\",\r\n status: githubToken ? \"pass\" : \"warn\",\r\n summary: githubToken\r\n ? \"GITHUB_TOKEN/GH_TOKEN present for GitHub Vercel StatusContext evidence\"\r\n : \"No GITHUB_TOKEN \u2014 merge-gate Vercel evidence requires GitHub commit status API\",\r\n remediation: githubToken\r\n ? undefined\r\n : \"Export GITHUB_TOKEN (or GH_TOKEN) for PR head commit status lookups.\",\r\n }),\r\n check({\r\n id: \"vercel_api_token_optional\",\r\n label: \"Vercel API token (optional fallback)\",\r\n status: vercelToken ? \"pass\" : \"warn\",\r\n summary: vercelToken\r\n ? \"VERCEL_TOKEN configured for optional REST API deployment lookup\"\r\n : \"VERCEL_TOKEN unset \u2014 GitHub status is the default path; API fallback disabled\",\r\n remediation: vercelToken\r\n ? undefined\r\n : \"Set ephemeral/scoped VERCEL_TOKEN only when GitHub status is insufficient; avoid persistent ~/.vercel auth on runner hosts.\",\r\n }),\r\n ],\r\n };\r\n}\r\n\r\nfunction assessHarnessDirs(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const harnessRoot = probes.harnessRoot();\r\n const runsDir = path.join(harnessRoot, \"runs\");\r\n const worktreesDir = path.join(harnessRoot, \"worktrees\");\r\n const displayHarnessRoot = redactHomePath(harnessRoot);\r\n const displayRunsDir = redactHomePath(runsDir);\r\n const displayWorktreesDir = redactHomePath(worktreesDir);\r\n const runsExists = probes.pathExists(runsDir);\r\n const worktreesExists = probes.pathExists(worktreesDir);\r\n\r\n return {\r\n id: \"harness_dirs\",\r\n label: \"Harness / daemon directories\",\r\n checks: [\r\n check({\r\n id: \"harness_root\",\r\n label: \"Harness root resolved\",\r\n status: \"pass\",\r\n summary: displayHarnessRoot,\r\n details: { harnessRoot: displayHarnessRoot },\r\n }),\r\n check({\r\n id: \"harness_runs_dir\",\r\n label: \"Runs directory ready\",\r\n status: runsExists && probes.pathWritable(runsDir) ? \"pass\" : runsExists ? \"warn\" : \"warn\",\r\n summary: runsExists\r\n ? probes.pathWritable(runsDir)\r\n ? `Writable ${displayRunsDir}`\r\n : `Exists but not writable: ${displayRunsDir}`\r\n : `Will be created on first run: ${displayRunsDir}`,\r\n remediation:\r\n runsExists && !probes.pathWritable(runsDir)\r\n ? `Fix permissions on ${displayRunsDir} or set KYNVER_HARNESS_ROOT to a writable path.`\r\n : undefined,\r\n details: { runsDir: displayRunsDir, exists: runsExists, writable: probes.pathWritable(runsDir) },\r\n }),\r\n check({\r\n id: \"harness_worktrees_dir\",\r\n label: \"Worktrees directory ready\",\r\n status: worktreesExists && probes.pathWritable(worktreesDir) ? \"pass\" : \"warn\",\r\n summary: worktreesExists\r\n ? probes.pathWritable(worktreesDir)\r\n ? `Writable ${displayWorktreesDir}`\r\n : `Exists but not writable: ${displayWorktreesDir}`\r\n : `Will be created on first worker: ${displayWorktreesDir}`,\r\n remediation:\r\n worktreesExists && !probes.pathWritable(worktreesDir)\r\n ? `Fix permissions on ${displayWorktreesDir}.`\r\n : undefined,\r\n details: { worktreesDir: displayWorktreesDir, exists: worktreesExists, writable: probes.pathWritable(worktreesDir) },\r\n }),\r\n ],\r\n };\r\n}\r\n\r\nfunction assessCallbackAuth(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const config = probes.loadConfig();\r\n const env = probes.envSnapshot();\r\n const baseUrl = env.kynverApiUrl ?? config.apiBaseUrl?.trim() ?? env.openclawCronFireBaseUrl;\r\n const usingLegacyBase = !env.kynverApiUrl && !config.apiBaseUrl && Boolean(env.openclawCronFireBaseUrl);\r\n\r\n const legacySecret = env.openclawCronSecret || env.kynverRuntimeSecret;\r\n const envScoped = env.kynverRunnerTokenPrefix?.startsWith(\"krc1.\");\r\n const creds = probes.readCredentials();\r\n const savedScoped = creds.runnerTokenPrefix?.startsWith(\"krc1.\");\r\n\r\n const checks: DoctorCheck[] = [\r\n check({\r\n id: \"callback_base_url\",\r\n label: \"Callback base URL configured\",\r\n status: baseUrl ? (usingLegacyBase ? \"warn\" : \"pass\") : \"fail\",\r\n summary: baseUrl\r\n ? usingLegacyBase\r\n ? `Using legacy OPENCLAW_CRON_FIRE_BASE_URL (${baseUrl})`\r\n : baseUrl\r\n : \"No KYNVER_API_URL, config apiBaseUrl, or legacy OpenClaw base URL\",\r\n remediation: baseUrl\r\n ? usingLegacyBase\r\n ? \"Migrate to KYNVER_API_URL or `kynver setup --api-base-url` and drop OPENCLAW_CRON_FIRE_BASE_URL.\"\r\n : undefined\r\n : \"Set KYNVER_API_URL or run `kynver setup --api-base-url https://\u2026`.\",\r\n details: {\r\n source: env.kynverApiUrl\r\n ? \"KYNVER_API_URL\"\r\n : config.apiBaseUrl\r\n ? \"config.apiBaseUrl\"\r\n : env.openclawCronFireBaseUrl\r\n ? \"OPENCLAW_CRON_FIRE_BASE_URL\"\r\n : \"none\",\r\n baseUrl: baseUrl ?? null,\r\n },\r\n }),\r\n check({\r\n id: \"callback_auth_mode\",\r\n label: \"Callback auth uses scoped runner token\",\r\n status: envScoped || savedScoped ? \"pass\" : legacySecret ? \"warn\" : \"fail\",\r\n summary: envScoped\r\n ? \"KYNVER_RUNNER_TOKEN scoped token will be sent as X-Kynver-Runner-Token\"\r\n : savedScoped\r\n ? \"Saved krc1.* token in ~/.kynver/credentials\"\r\n : legacySecret\r\n ? \"Deployment-level KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET in use (legacy headers)\"\r\n : \"No callback secret configured\",\r\n remediation:\r\n envScoped || savedScoped\r\n ? undefined\r\n : \"Mint a scoped token: `kynver runner credential --agent-os-id <id>`. Avoid shared OPENCLAW_CRON_SECRET on user runners.\",\r\n details: {\r\n mode: envScoped || savedScoped ? \"scoped\" : legacySecret ? \"legacy_global_secret\" : \"missing\",\r\n legacyHeadersWhenNotScoped: [\"X-OpenClaw-Cron-Secret\", \"X-Kynver-Runtime-Secret\"],\r\n },\r\n }),\r\n ];\r\n\r\n return { id: \"callback_auth\", label: \"Callback auth / config\", checks };\r\n}\r\n\r\nfunction assessOpenclawHotspots(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const env = probes.envSnapshot();\r\n const config = probes.loadConfig();\r\n const creds = probes.readCredentials();\r\n const harnessRoot = probes.harnessRoot();\r\n const legacyRoot = probes.legacyOpenclawHarnessRoot();\r\n const displayHarnessRoot = redactHomePath(harnessRoot);\r\n const displayLegacyRoot = redactHomePath(legacyRoot);\r\n const displayOpusHarnessRoot = env.opusHarnessRoot ? redactHomePath(env.opusHarnessRoot) : null;\r\n const legacyHarnessActive = harnessRoot === legacyRoot && probes.pathExists(legacyRoot);\r\n const targetAgentOsId = config.agentOsId?.trim();\r\n const envToken = env.kynverRunnerTokenPrefix;\r\n const savedToken = creds.runnerTokenPrefix;\r\n const savedAgentOsId = creds.runnerTokenAgentOsId;\r\n const scopedSaved =\r\n Boolean(savedToken) && (!targetAgentOsId || !savedAgentOsId || savedAgentOsId === targetAgentOsId);\r\n const hasScopedRunnerToken =\r\n Boolean(envToken?.startsWith(\"krc1.\")) ||\r\n (scopedSaved && Boolean(savedToken?.startsWith(\"krc1.\")));\r\n\r\n const checks: DoctorCheck[] = [\r\n check({\r\n id: \"hotspot_legacy_harness_root\",\r\n label: \"Legacy ~/.openclaw/harness still active\",\r\n status: legacyHarnessActive ? \"warn\" : \"pass\",\r\n summary: legacyHarnessActive\r\n ? `Harness root is legacy ${displayLegacyRoot}`\r\n : env.opusHarnessRoot\r\n ? `OPUS_HARNESS_ROOT override in use (${displayOpusHarnessRoot})`\r\n : `Using ${displayHarnessRoot}`,\r\n remediation: legacyHarnessActive\r\n ? \"Set KYNVER_HARNESS_ROOT=~/.kynver/harness (or run setup), migrate artifacts, retire OPUS_HARNESS_ROOT.\"\r\n : env.opusHarnessRoot\r\n ? \"Prefer KYNVER_HARNESS_ROOT over OPUS_HARNESS_ROOT.\"\r\n : undefined,\r\n details: { harnessRoot: displayHarnessRoot, legacyRoot: displayLegacyRoot, opusHarnessRoot: displayOpusHarnessRoot },\r\n }),\r\n check({\r\n id: \"hotspot_openclaw_env_secrets\",\r\n label: \"OpenClaw deployment secrets in runner env\",\r\n status: env.openclawCronSecret || env.openclawCronFireBaseUrl ? \"warn\" : \"pass\",\r\n summary:\r\n env.openclawCronSecret || env.openclawCronFireBaseUrl\r\n ? [\r\n env.openclawCronSecret ? \"OPENCLAW_CRON_SECRET set\" : null,\r\n env.openclawCronFireBaseUrl ? \"OPENCLAW_CRON_FIRE_BASE_URL set\" : null,\r\n ]\r\n .filter(Boolean)\r\n .join(\"; \")\r\n : \"No OpenClaw cron env overrides on this runner\",\r\n remediation:\r\n env.openclawCronSecret || env.openclawCronFireBaseUrl\r\n ? \"Move to KYNVER_API_URL + scoped runner tokens; unset OpenClaw cron env on user-hosted runners.\"\r\n : undefined,\r\n }),\r\n assessRuntimeTakeoverScheduler(env, {\r\n agentOsId: targetAgentOsId ?? null,\r\n apiBaseUrl: config.apiBaseUrl?.trim() ?? env.kynverApiUrl ?? null,\r\n hasScopedRunnerToken,\r\n deploymentSchedulerProvider:\r\n config.deploymentSchedulerProvider === \"qstash\" ||\r\n config.deploymentSchedulerProvider === \"kynver-cron\" ||\r\n config.deploymentSchedulerProvider === \"openclaw-cron\"\r\n ? config.deploymentSchedulerProvider\r\n : undefined,\r\n }),\r\n check({\r\n id: \"hotspot_lease_source_names\",\r\n label: \"Harness lease/completion source names\",\r\n status: \"pass\",\r\n summary: \"Runtime uses kynver-harness:* lease owners and completion source kynver-harness (OpenClaw names retired in runtime)\",\r\n details: {\r\n leaseOwnerPattern: \"kynver-harness:<runId>\",\r\n completionSource: \"kynver-harness\",\r\n note: \"OpenClaw adapter remains optional in packages/kynver-openclaw-agent-os only\",\r\n },\r\n }),\r\n ];\r\n\r\n return { id: \"openclaw_hotspots\", label: \"OpenClaw dependency hotspots\", checks };\r\n}\r\n\r\nexport function assessRuntimeTakeoverReadiness(\r\n probes: RuntimeTakeoverProbes = defaultRuntimeTakeoverProbes,\r\n): RuntimeTakeoverDoctorReport {\r\n const sections = [\r\n assessCliPackage(probes),\r\n assessUserConfig(probes),\r\n assessRunnerToken(probes),\r\n assessVercelDeployEvidence(probes),\r\n assessHarnessDirs(probes),\r\n assessCallbackAuth(probes),\r\n assessOpenclawHotspots(probes),\r\n ];\r\n\r\n const counts = summarizeCounts(sections);\r\n const ready = counts.fail === 0;\r\n const summary = ready\r\n ? counts.warn > 0\r\n ? `Ready with ${counts.warn} warning(s) \u2014 review remediation before retiring OpenClaw as primary runtime agent.`\r\n : \"Ready \u2014 Kynver runtime can serve as primary runtime agent on this host.\"\r\n : `${counts.fail} blocking check(s) \u2014 fix failures before OpenClaw takeover.`;\r\n\r\n return {\r\n command: \"doctor runtime-takeover\",\r\n ready,\r\n summary,\r\n counts,\r\n sections,\r\n };\r\n}\r\n", "import { accessSync, constants, existsSync, readFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { spawnSync } from \"node:child_process\";\r\nimport { loadUserConfig, type KynverUserConfig } from \"../config.js\";\r\nimport { isKynverCronDaemonPrimary } from \"../cron/cron-env.js\";\r\nimport { PACKAGE_VERSION } from \"../package-version.js\";\r\nimport { resolveHarnessRoot } from \"../paths.js\";\r\n\r\nexport interface CommandProbeResult {\r\n ok: boolean;\r\n stdout: string;\r\n stderr: string;\r\n error?: string;\r\n}\r\n\r\nexport interface RuntimeTakeoverProbes {\r\n packageVersion(): string;\r\n commandOnPath(bin: string): CommandProbeResult;\r\n kynverVersion(bin: string): CommandProbeResult;\r\n loadConfig(): KynverUserConfig;\r\n configFilePath(): string;\r\n credentialsFilePath(): string;\r\n readCredentials(): {\r\n hasApiKey: boolean;\r\n runnerTokenPrefix?: string;\r\n runnerTokenAgentOsId?: string;\r\n };\r\n envSnapshot(): {\r\n kynverApiUrl?: string;\r\n openclawCronFireBaseUrl?: string;\r\n kynverRunnerTokenPrefix?: string;\r\n kynverRuntimeSecret: boolean;\r\n openclawCronSecret: boolean;\r\n kynverHarnessRoot?: string;\r\n opusHarnessRoot?: string;\r\n kynverSchedulerProvider?: string;\r\n /** Local durable cron store (`KYNVER_CRON_STORE_PATH` / legacy alias). */\r\n openclawCronStorePath?: boolean;\r\n kynverCronDaemonPrimary?: boolean;\r\n qstashTokenPresent?: boolean;\r\n kynverHostedDeployment?: boolean;\r\n };\r\n harnessRoot(): string;\r\n legacyOpenclawHarnessRoot(): string;\r\n pathExists(target: string): boolean;\r\n pathWritable(target: string): boolean;\r\n}\r\n\r\nfunction captureCommand(bin: string, args: string[]): CommandProbeResult {\r\n try {\r\n const res = spawnSync(bin, args, { encoding: \"utf8\" });\r\n const stdout = (res.stdout || \"\").trim();\r\n const stderr = (res.stderr || \"\").trim();\r\n const ok = res.status === 0;\r\n return {\r\n ok,\r\n stdout,\r\n stderr,\r\n error: res.error?.message,\r\n };\r\n } catch (error) {\r\n return {\r\n ok: false,\r\n stdout: \"\",\r\n stderr: \"\",\r\n error: (error as Error).message,\r\n };\r\n }\r\n}\r\n\r\nfunction tokenPrefix(token: string | undefined): string | undefined {\r\n const trimmed = token?.trim();\r\n if (!trimmed) return undefined;\r\n return trimmed.length <= 12 ? `${trimmed}\u2026` : `${trimmed.slice(0, 12)}\u2026`;\r\n}\r\n\r\nfunction isWritable(target: string): boolean {\r\n if (!existsSync(target)) return false;\r\n try {\r\n accessSync(target, constants.W_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport const defaultRuntimeTakeoverProbes: RuntimeTakeoverProbes = {\r\n packageVersion: () => PACKAGE_VERSION,\r\n commandOnPath: (bin) => captureCommand(process.platform === \"win32\" ? \"where\" : \"which\", [bin]),\r\n kynverVersion: (bin) => captureCommand(bin, [\"--version\"]),\r\n loadConfig: () => loadUserConfig(),\r\n configFilePath: () => path.join(homedir(), \".kynver\", \"config.json\"),\r\n credentialsFilePath: () => path.join(homedir(), \".kynver\", \"credentials\"),\r\n readCredentials: () => {\r\n const credPath = path.join(homedir(), \".kynver\", \"credentials\");\r\n if (!existsSync(credPath)) {\r\n return { hasApiKey: false };\r\n }\r\n try {\r\n const parsed = JSON.parse(readFileSync(credPath, \"utf8\")) as {\r\n apiKey?: string;\r\n runnerToken?: string;\r\n runnerTokenAgentOsId?: string;\r\n };\r\n return {\r\n hasApiKey: Boolean(parsed.apiKey?.trim()),\r\n runnerTokenPrefix: tokenPrefix(parsed.runnerToken),\r\n runnerTokenAgentOsId: parsed.runnerTokenAgentOsId,\r\n };\r\n } catch {\r\n return { hasApiKey: false };\r\n }\r\n },\r\n envSnapshot: () => ({\r\n kynverApiUrl: process.env.KYNVER_API_URL?.trim() || undefined,\r\n openclawCronFireBaseUrl: process.env.OPENCLAW_CRON_FIRE_BASE_URL?.trim() || undefined,\r\n kynverRunnerTokenPrefix: tokenPrefix(process.env.KYNVER_RUNNER_TOKEN),\r\n kynverRuntimeSecret: Boolean(process.env.KYNVER_RUNTIME_SECRET?.trim()),\r\n openclawCronSecret: Boolean(process.env.OPENCLAW_CRON_SECRET?.trim()),\r\n kynverHarnessRoot: process.env.KYNVER_HARNESS_ROOT?.trim() || undefined,\r\n opusHarnessRoot: process.env.OPUS_HARNESS_ROOT?.trim() || undefined,\r\n kynverSchedulerProvider: process.env.KYNVER_SCHEDULER_PROVIDER?.trim() || undefined,\r\n openclawCronStorePath: Boolean(\r\n process.env.KYNVER_CRON_STORE_PATH?.trim() ||\r\n process.env.OPENCLAW_CRON_STORE_PATH?.trim(),\r\n ),\r\n kynverCronDaemonPrimary: isKynverCronDaemonPrimary(),\r\n qstashTokenPresent: Boolean(process.env.QSTASH_TOKEN?.trim()),\r\n kynverHostedDeployment: (() => {\r\n const v = process.env.KYNVER_HOSTED_DEPLOYMENT?.trim().toLowerCase();\r\n return v === \"1\" || v === \"true\" || v === \"yes\";\r\n })(),\r\n }),\r\n harnessRoot: () => resolveHarnessRoot(),\r\n legacyOpenclawHarnessRoot: () => path.join(homedir(), \".openclaw\", \"harness\"),\r\n pathExists: (target) => existsSync(target),\r\n pathWritable: (target) => isWritable(target),\r\n};\r\n", "import type { DoctorCheck } from \"./doctor.types.js\";\r\n\r\nexport type DeploymentSchedulerProvider = \"qstash\" | \"kynver-cron\" | \"openclaw-cron\";\r\n\r\nexport interface RuntimeTakeoverSchedulerEnv {\r\n kynverSchedulerProvider?: string;\r\n /** Local durable cron store (`KYNVER_CRON_STORE_PATH` / legacy `OPENCLAW_CRON_STORE_PATH`). */\r\n openclawCronStorePath?: boolean;\r\n /** `kynver daemon` runs the Kynver Cron tick loop (primary connected-box scheduler). */\r\n kynverCronDaemonPrimary?: boolean;\r\n /** True when this process has QStash credentials (typical Kynver server deploy). */\r\n qstashTokenPresent?: boolean;\r\n /** Explicit hosted-deploy marker (`KYNVER_HOSTED_DEPLOYMENT=1|true|yes`). */\r\n kynverHostedDeployment?: boolean;\r\n}\r\n\r\nexport interface RuntimeTakeoverSchedulerContext {\r\n agentOsId?: string | null;\r\n apiBaseUrl?: string | null;\r\n hasScopedRunnerToken: boolean;\r\n /** Operator attestation in ~/.kynver/config.json for the hosted deployment. */\r\n deploymentSchedulerProvider?: DeploymentSchedulerProvider;\r\n}\r\n\r\nfunction hasOpenClawLegacyDependency(\r\n env: RuntimeTakeoverSchedulerEnv,\r\n ctx: RuntimeTakeoverSchedulerContext,\r\n): boolean {\r\n return (\r\n env.kynverSchedulerProvider === \"openclaw-cron\" ||\r\n ctx.deploymentSchedulerProvider === \"openclaw-cron\"\r\n );\r\n}\r\n\r\nfunction hasKynverCronOwnership(\r\n env: RuntimeTakeoverSchedulerEnv,\r\n ctx: RuntimeTakeoverSchedulerContext,\r\n): boolean {\r\n return (\r\n env.kynverSchedulerProvider === \"kynver-cron\" ||\r\n ctx.deploymentSchedulerProvider === \"kynver-cron\"\r\n );\r\n}\r\n\r\nfunction hasLocalCronStore(env: RuntimeTakeoverSchedulerEnv): boolean {\r\n return Boolean(env.openclawCronStorePath);\r\n}\r\n\r\nfunction hasQstashCutover(\r\n env: RuntimeTakeoverSchedulerEnv,\r\n ctx: RuntimeTakeoverSchedulerContext,\r\n): boolean {\r\n return env.kynverSchedulerProvider === \"qstash\" || ctx.deploymentSchedulerProvider === \"qstash\";\r\n}\r\n\r\nfunction check(partial: DoctorCheck): DoctorCheck {\r\n return partial;\r\n}\r\n\r\n/**\r\n * Scheduler readiness for runtime takeover.\r\n *\r\n * Runner hosts drive dispatch via `kynver daemon` \u2192 `pipeline-tick` \u2192 `operator/tick`\r\n * and must not depend on OpenClaw cron. Server/hosted deploys should resolve to QStash\r\n * when configured; otherwise the Kynver-owned `kynver-cron` provider is the fallback\r\n * (not the legacy OpenClaw adapter).\r\n */\r\nexport function assessRuntimeTakeoverScheduler(\r\n env: RuntimeTakeoverSchedulerEnv,\r\n ctx: RuntimeTakeoverSchedulerContext,\r\n): DoctorCheck {\r\n const schedulerDetails = {\r\n schedulerProvider: env.kynverSchedulerProvider ?? null,\r\n deploymentSchedulerProvider: ctx.deploymentSchedulerProvider ?? null,\r\n openclawCronStorePath: Boolean(env.openclawCronStorePath),\r\n kynverCronDaemonPrimary: Boolean(env.kynverCronDaemonPrimary),\r\n };\r\n\r\n const daemonDispatchReady =\r\n Boolean(ctx.agentOsId?.trim()) &&\r\n Boolean(ctx.apiBaseUrl?.trim()) &&\r\n ctx.hasScopedRunnerToken;\r\n\r\n if (hasQstashCutover(env, ctx) && !hasOpenClawLegacyDependency(env, ctx)) {\r\n const source =\r\n env.kynverSchedulerProvider === \"qstash\"\r\n ? \"KYNVER_SCHEDULER_PROVIDER=qstash on this host\"\r\n : \"deploymentSchedulerProvider=qstash in ~/.kynver/config.json\";\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary: `AgentOS scheduler cut over to QStash (${source})`,\r\n details: schedulerDetails,\r\n });\r\n }\r\n\r\n if (hasKynverCronOwnership(env, ctx) && !hasOpenClawLegacyDependency(env, ctx)) {\r\n if (hasLocalCronStore(env) && env.kynverCronDaemonPrimary && daemonDispatchReady) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary:\r\n \"Kynver Cron local store present; `kynver daemon` owns schedule fires (kynver-cron tick loop)\",\r\n details: {\r\n ...schedulerDetails,\r\n dispatchPath: \"kynver-daemon-cron-tick\",\r\n kynverCronDaemonPrimary: true,\r\n },\r\n });\r\n }\r\n\r\n const source =\r\n env.kynverSchedulerProvider === \"kynver-cron\"\r\n ? \"KYNVER_SCHEDULER_PROVIDER=kynver-cron on this host\"\r\n : \"deploymentSchedulerProvider=kynver-cron in ~/.kynver/config.json\";\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary: `AgentOS scheduler owned by Kynver Cron (${source})`,\r\n details: schedulerDetails,\r\n });\r\n }\r\n\r\n if (hasLocalCronStore(env)) {\r\n if (env.kynverCronDaemonPrimary && daemonDispatchReady) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary:\r\n \"Kynver Cron local store present; `kynver daemon` owns schedule fires (kynver-cron tick loop)\",\r\n details: {\r\n ...schedulerDetails,\r\n dispatchPath: \"kynver-daemon-cron-tick\",\r\n kynverCronDaemonPrimary: true,\r\n },\r\n });\r\n }\r\n\r\n const parts: string[] = [];\r\n if (env.openclawCronStorePath) {\r\n parts.push(\"KYNVER_CRON_STORE_PATH or OPENCLAW_CRON_STORE_PATH set (local cron store)\");\r\n }\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary: `Local cron store without daemon tick (${parts.join(\"; \")})`,\r\n remediation:\r\n \"Run `kynver daemon` with KYNVER_CRON_SECRET + KYNVER_API_URL (or KYNVER_CRON_FIRE_BASE_URL) so the daemon-owned cron tick fires schedules. \" +\r\n \"On hosted deploys use QStash (KYNVER_SCHEDULER_PROVIDER=qstash). Legacy OpenClaw cron env aliases still work during cutover.\",\r\n details: schedulerDetails,\r\n });\r\n }\r\n\r\n const runnerOpenclaw = env.kynverSchedulerProvider === \"openclaw-cron\";\r\n const configOpenclaw = ctx.deploymentSchedulerProvider === \"openclaw-cron\";\r\n const runnerQstash = env.kynverSchedulerProvider === \"qstash\";\r\n const hostedDeployment = Boolean(env.qstashTokenPresent) || Boolean(env.kynverHostedDeployment);\r\n /** Runner hosts own dispatch via `kynver daemon`; hosted QStash env belongs on the server only. */\r\n const hostedSchedulerProcess = hostedDeployment && !daemonDispatchReady;\r\n\r\n const deploymentOpenclaw =\r\n hostedSchedulerProcess && env.kynverSchedulerProvider === \"openclaw-cron\";\r\n\r\n if (configOpenclaw && !runnerOpenclaw) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary: \"deploymentSchedulerProvider=openclaw-cron in ~/.kynver/config.json \u2014 migrate to kynver-cron or qstash\",\r\n remediation:\r\n 'Run `kynver scheduler attest-cutover` or set deploymentSchedulerProvider to \"kynver-cron\" or \"qstash\" in ~/.kynver/config.json.',\r\n details: schedulerDetails,\r\n });\r\n }\r\n\r\n if (daemonDispatchReady && runnerOpenclaw) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary:\r\n \"KYNVER_SCHEDULER_PROVIDER=openclaw-cron on this runner \u2014 dispatch is owned by kynver daemon; unset the OpenClaw override\",\r\n remediation:\r\n \"Unset KYNVER_SCHEDULER_PROVIDER on user runners (or set kynver-cron). Use `kynver daemon` (pipeline-tick \u2192 operator/tick). On the Kynver server set KYNVER_SCHEDULER_PROVIDER=qstash when QStash is configured.\",\r\n details: {\r\n schedulerProvider: env.kynverSchedulerProvider ?? null,\r\n dispatchPath: \"kynver-daemon-pipeline-tick\",\r\n hostedDeployment,\r\n },\r\n });\r\n }\r\n\r\n if (daemonDispatchReady) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary: runnerQstash\r\n ? \"Runner override qstash present; hosted dispatch still owned by kynver daemon pipeline-tick\"\r\n : \"Hosted dispatch owned by kynver daemon (pipeline-tick \u2192 operator/tick); no OpenClaw cron on runner\",\r\n details: {\r\n schedulerProvider: env.kynverSchedulerProvider ?? null,\r\n dispatchPath: \"kynver-daemon-pipeline-tick\",\r\n hostedDeployment,\r\n },\r\n });\r\n }\r\n\r\n if (runnerOpenclaw) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary:\r\n \"KYNVER_SCHEDULER_PROVIDER=openclaw-cron on this runner \u2014 hosted dispatch still depends on the OpenClaw local-cron adapter\",\r\n remediation:\r\n \"Unset KYNVER_SCHEDULER_PROVIDER on user runners (or set kynver-cron). Use `kynver daemon` (pipeline-tick \u2192 operator/tick). On the Kynver server set KYNVER_SCHEDULER_PROVIDER=qstash when QStash is configured.\",\r\n details: { schedulerProvider: env.kynverSchedulerProvider ?? null, hostedDeployment },\r\n });\r\n }\r\n\r\n if (deploymentOpenclaw) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary:\r\n \"Hosted deployment has KYNVER_SCHEDULER_PROVIDER=openclaw-cron \u2014 AgentOS scheduled ticks should use QStash or kynver-cron\",\r\n remediation:\r\n \"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server (or kynver-cron for Kynver-owned local scheduling). User runners use `kynver daemon` for dispatch and should not set a scheduler provider.\",\r\n details: {\r\n schedulerProvider: env.kynverSchedulerProvider ?? null,\r\n qstashTokenPresent: env.qstashTokenPresent ?? false,\r\n hostedDeployment,\r\n },\r\n });\r\n }\r\n\r\n if (hostedSchedulerProcess && env.qstashTokenPresent && !env.kynverSchedulerProvider) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary:\r\n \"QSTASH_TOKEN present; hosted scheduler auto-selects qstash (explicit KYNVER_SCHEDULER_PROVIDER=qstash optional)\",\r\n details: {\r\n schedulerProvider: null,\r\n qstashTokenPresent: true,\r\n hostedDeployment,\r\n },\r\n });\r\n }\r\n\r\n if (\r\n hostedSchedulerProcess &&\r\n !env.qstashTokenPresent &&\r\n !env.kynverSchedulerProvider\r\n ) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary:\r\n \"Hosted deployment with no QSTASH_TOKEN and no KYNVER_SCHEDULER_PROVIDER \u2014 kynver-cron is an in-process stub here and will NOT fire; no firing scheduler is configured\",\r\n remediation:\r\n \"Set QSTASH_TOKEN + KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server for hosted AgentOS schedules. \" +\r\n \"Only use kynver-cron when a `kynver daemon` (or local cron store) actually owns firing on this box.\",\r\n details: {\r\n schedulerProvider: null,\r\n resolvedFallback: \"none\",\r\n qstashTokenPresent: false,\r\n hostedDeployment,\r\n },\r\n });\r\n }\r\n\r\n if (\r\n hostedSchedulerProcess &&\r\n !env.qstashTokenPresent &&\r\n env.kynverSchedulerProvider &&\r\n env.kynverSchedulerProvider !== \"qstash\" &&\r\n env.kynverSchedulerProvider !== \"kynver-cron\"\r\n ) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"warn\",\r\n summary: `Hosted deployment without QSTASH_TOKEN (KYNVER_SCHEDULER_PROVIDER=${env.kynverSchedulerProvider}) \u2014 use qstash or kynver-cron`,\r\n remediation:\r\n \"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server, or kynver-cron for Kynver-owned local scheduling. User runners use `kynver daemon` for dispatch.\",\r\n details: {\r\n schedulerProvider: env.kynverSchedulerProvider ?? null,\r\n qstashTokenPresent: env.qstashTokenPresent ?? false,\r\n hostedDeployment,\r\n },\r\n });\r\n }\r\n\r\n if (!env.kynverSchedulerProvider) {\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary:\r\n \"No KYNVER_SCHEDULER_PROVIDER on runner (expected) \u2014 finish runner setup so daemon pipeline-tick owns dispatch\",\r\n details: { schedulerProvider: null, dispatchPath: \"kynver-daemon-pipeline-tick-pending\" },\r\n });\r\n }\r\n\r\n return check({\r\n id: \"hotspot_openclaw_scheduler\",\r\n label: \"Scheduler provider (runtime daemon vs OpenClaw cron)\",\r\n status: \"pass\",\r\n summary: `KYNVER_SCHEDULER_PROVIDER=${env.kynverSchedulerProvider}`,\r\n details: { schedulerProvider: env.kynverSchedulerProvider ?? null },\r\n });\r\n}\r\n", "import { ensureDefaultRepo } from \"../default-repo-cli.js\";\r\nimport { assessRuntimeTakeoverReadiness } from \"./runtime-takeover.js\";\r\n\r\nexport function runRuntimeTakeoverDoctorCli(args: Record<string, string | boolean> = {}): void {\r\n let remediationNote: string | undefined;\r\n if (args.remediateDefaultRepo === true) {\r\n const remediation = ensureDefaultRepo();\r\n if (!remediation.ok) {\r\n console.error(remediation.reason ?? \"defaultRepo remediation failed\");\r\n if (remediation.remediation) console.error(remediation.remediation);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n if (remediation.remediated) {\r\n remediationNote = `Remediated defaultRepo \u2192 ${remediation.resolved?.defaultRepo ?? \"unknown\"}`;\r\n } else {\r\n remediationNote = `defaultRepo already persisted (${remediation.resolved?.defaultRepo ?? \"unknown\"})`;\r\n }\r\n }\r\n\r\n const report = assessRuntimeTakeoverReadiness();\r\n if (remediationNote) {\r\n report.notes = [...(report.notes ?? []), remediationNote];\r\n }\r\n console.log(JSON.stringify(report, null, 2));\r\n if (!report.ready) {\r\n process.exitCode = 1;\r\n }\r\n}\r\n", "import { getJson } from \"./callbacks.js\";\r\nimport { loadUserConfig, resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\n\r\nexport async function runCommandCenterContractCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<void> {\r\n const config = loadUserConfig();\r\n const agentOsId =\r\n (args.agentOsId ? String(args.agentOsId) : config.agentOsId) || \"\";\r\n if (!agentOsId) {\r\n console.error(\"requires --agent-os-id or agentOsId in ~/.kynver/config.json\");\r\n process.exit(1);\r\n }\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : config.apiBaseUrl);\r\n const secret = await resolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n { baseUrl: base },\r\n );\r\n\r\n const qs = new URLSearchParams();\r\n if (typeof args.since === \"string\" && args.since.trim()) qs.set(\"since\", args.since.trim());\r\n if (args.limit != null && String(args.limit).trim()) {\r\n const n = Number(args.limit);\r\n if (Number.isFinite(n) && n > 0) qs.set(\"limit\", String(Math.floor(n)));\r\n }\r\n const suffix = qs.toString() ? `?${qs.toString()}` : \"\";\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/command-center/dashboard-contract${suffix}`;\r\n\r\n const res = await getJson(url, secret);\r\n if (!res.ok) {\r\n console.error(`dashboard-contract GET failed: HTTP ${res.status}`);\r\n if (res.response) console.error(JSON.stringify(res.response, null, 2));\r\n process.exit(1);\r\n }\r\n\r\n console.log(JSON.stringify(res.response, null, 2));\r\n}\r\n", "import { displayUserPath } from \"./path-values.js\";\r\nimport {\r\n applySchedulerCutoverAttestation,\r\n assessSchedulerCutover,\r\n DEPLOYMENT_SCHEDULER_CUTOVER_STEPS,\r\n RUNNER_SCHEDULER_CUTOVER_STEPS,\r\n} from \"./scheduler-cutover.js\";\r\nimport { loadUserConfig, presentUserConfig, saveUserConfig } from \"./config.js\";\r\nimport path from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\n\r\nconst CONFIG_FILE = path.join(homedir(), \".kynver\", \"config.json\");\r\n\r\nexport function runSchedulerCutoverCheckCli(json = false): void {\r\n const config = loadUserConfig();\r\n const report = assessSchedulerCutover(config);\r\n const payload = {\r\n ...report,\r\n configPath: displayUserPath(CONFIG_FILE),\r\n configAttestationExample: { deploymentSchedulerProvider: \"qstash\" as const },\r\n };\r\n\r\n if (json) {\r\n console.log(JSON.stringify(payload, null, 2));\r\n if (!report.ok) process.exitCode = 1;\r\n return;\r\n }\r\n\r\n console.log(\"AgentOS scheduler provider cutover checklist\\n\");\r\n console.log(\"Deployment (Vercel):\");\r\n for (const step of DEPLOYMENT_SCHEDULER_CUTOVER_STEPS) console.log(` - ${step}`);\r\n console.log(\"\\nUser runner:\");\r\n for (const step of RUNNER_SCHEDULER_CUTOVER_STEPS) console.log(` - ${step}`);\r\n console.log(\"\\nThis host:\");\r\n console.log(` config: ${payload.configPath}`);\r\n console.log(\r\n ` deploymentSchedulerProvider: ${report.deploymentSchedulerProvider ?? \"(unset)\"}`,\r\n );\r\n console.log(\r\n ` KYNVER_SCHEDULER_PROVIDER: ${report.runnerEnv.kynverSchedulerProvider ?? \"(unset)\"}`,\r\n );\r\n console.log(\r\n ` KYNVER_CRON_STORE_PATH: ${report.runnerEnv.kynverCronStorePath ?? \"(unset)\"}`,\r\n );\r\n console.log(\r\n ` OPENCLAW_CRON_STORE_PATH (legacy): ${report.runnerEnv.openclawCronStorePath ?? \"(unset)\"}`,\r\n );\r\n if (report.blockers.length) {\r\n console.log(\"\\nBlockers:\");\r\n for (const b of report.blockers) console.log(` ! ${b}`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n console.log(\"\\nNo local blockers detected on this runner.\");\r\n}\r\n\r\nexport function runSchedulerAttestCutoverCli(json = false): void {\r\n const existing = loadUserConfig();\r\n const report = assessSchedulerCutover(existing);\r\n if (!report.ok) {\r\n const payload = {\r\n ok: false,\r\n attested: false,\r\n blockers: report.blockers,\r\n remediation: \"Clear local OpenClaw scheduler blockers before attesting qstash cutover.\",\r\n };\r\n if (json) {\r\n console.log(JSON.stringify(payload, null, 2));\r\n } else {\r\n console.error(\"Cannot attest scheduler cutover \u2014 local blockers remain:\");\r\n for (const b of report.blockers) console.error(` ! ${b}`);\r\n }\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const next = applySchedulerCutoverAttestation(existing);\r\n saveUserConfig(next);\r\n\r\n const payload = {\r\n ok: true,\r\n attested: true,\r\n configPath: displayUserPath(CONFIG_FILE),\r\n deploymentSchedulerProvider: \"qstash\" as const,\r\n config: presentUserConfig(next),\r\n note:\r\n \"Recorded deploymentSchedulerProvider=qstash in ~/.kynver/config.json. \" +\r\n \"Confirm Vercel has KYNVER_SCHEDULER_PROVIDER=qstash and QSTASH_TOKEN before relying on hosted schedules.\",\r\n };\r\n\r\n if (json) {\r\n console.log(JSON.stringify(payload, null, 2));\r\n return;\r\n }\r\n\r\n console.log(payload.note);\r\n console.log(` config: ${payload.configPath}`);\r\n}\r\n", "import type { KynverUserConfig } from \"./config.js\";\r\n\r\nexport type DeploymentSchedulerProvider = \"qstash\" | \"kynver-cron\" | \"openclaw-cron\";\r\n\r\nexport const SCHEDULER_CUTOVER_RUNNER_ENV_KEYS = [\r\n \"KYNVER_SCHEDULER_PROVIDER\",\r\n \"KYNVER_CRON_STORE_PATH\",\r\n \"KYNVER_CRON_SECRET\",\r\n \"KYNVER_CRON_FIRE_BASE_URL\",\r\n \"OPENCLAW_CRON_STORE_PATH\",\r\n \"OPENCLAW_CRON_SECRET\",\r\n \"OPENCLAW_CRON_FIRE_BASE_URL\",\r\n] as const;\r\n\r\nexport interface SchedulerCutoverEnvSnapshot {\r\n kynverSchedulerProvider: string | null;\r\n kynverCronStorePath: string | null;\r\n kynverCronSecret: boolean;\r\n kynverCronFireBaseUrl: string | null;\r\n openclawCronStorePath: string | null;\r\n openclawCronSecret: boolean;\r\n openclawCronFireBaseUrl: string | null;\r\n}\r\n\r\nexport interface SchedulerCutoverReport {\r\n ok: boolean;\r\n blockers: string[];\r\n runnerEnv: SchedulerCutoverEnvSnapshot;\r\n deploymentSchedulerProvider: DeploymentSchedulerProvider | null;\r\n deploymentSteps: string[];\r\n runnerSteps: string[];\r\n}\r\n\r\nexport const DEPLOYMENT_SCHEDULER_CUTOVER_STEPS = [\r\n \"Vercel/hosted: set KYNVER_SCHEDULER_PROVIDER=qstash\",\r\n \"Vercel/hosted: ensure QSTASH_TOKEN (and QStash signing keys) are configured\",\r\n \"Vercel/hosted: unset OPENCLAW_CRON_STORE_PATH if present\",\r\n] as const;\r\n\r\nexport const RUNNER_SCHEDULER_CUTOVER_STEPS = [\r\n \"User runner: unset KYNVER_SCHEDULER_PROVIDER (scheduling is deployment-owned)\",\r\n \"User runner: unset OPENCLAW_CRON_STORE_PATH, OPENCLAW_CRON_SECRET, OPENCLAW_CRON_FIRE_BASE_URL\",\r\n 'User runner: after deployment cutover, run `kynver scheduler attest-cutover` (or set deploymentSchedulerProvider to \"qstash\" in ~/.kynver/config.json)',\r\n \"Verify: kynver doctor runtime-takeover \u2014 hotspot_openclaw_scheduler should pass\",\r\n] as const;\r\n\r\nexport function readSchedulerCutoverEnv(\r\n env: NodeJS.ProcessEnv = process.env,\r\n): SchedulerCutoverEnvSnapshot {\r\n return {\r\n kynverSchedulerProvider: env.KYNVER_SCHEDULER_PROVIDER?.trim() || null,\r\n kynverCronStorePath:\r\n env.KYNVER_CRON_STORE_PATH?.trim() || env.OPENCLAW_CRON_STORE_PATH?.trim() || null,\r\n kynverCronSecret: Boolean(\r\n env.KYNVER_CRON_SECRET?.trim() || env.OPENCLAW_CRON_SECRET?.trim(),\r\n ),\r\n kynverCronFireBaseUrl:\r\n env.KYNVER_CRON_FIRE_BASE_URL?.trim() ||\r\n env.OPENCLAW_CRON_FIRE_BASE_URL?.trim() ||\r\n null,\r\n openclawCronStorePath: env.OPENCLAW_CRON_STORE_PATH?.trim() || null,\r\n openclawCronSecret: Boolean(env.OPENCLAW_CRON_SECRET?.trim()),\r\n openclawCronFireBaseUrl: env.OPENCLAW_CRON_FIRE_BASE_URL?.trim() || null,\r\n };\r\n}\r\n\r\nexport function assessSchedulerCutover(\r\n config: Pick<KynverUserConfig, \"deploymentSchedulerProvider\">,\r\n env: SchedulerCutoverEnvSnapshot = readSchedulerCutoverEnv(),\r\n): SchedulerCutoverReport {\r\n const blockers: string[] = [];\r\n if (env.kynverSchedulerProvider === \"openclaw-cron\") {\r\n blockers.push(\"Runner still has KYNVER_SCHEDULER_PROVIDER=openclaw-cron\");\r\n }\r\n if (env.kynverCronStorePath && env.kynverSchedulerProvider !== \"kynver-cron\") {\r\n blockers.push(\r\n \"Runner has KYNVER_CRON_STORE_PATH but KYNVER_SCHEDULER_PROVIDER is not kynver-cron \u2014 use `kynver daemon` cron tick or unset the store for QStash-only runners\",\r\n );\r\n }\r\n if (env.openclawCronStorePath && !env.kynverCronStorePath) {\r\n blockers.push(\"Runner still has legacy OPENCLAW_CRON_STORE_PATH (prefer KYNVER_CRON_STORE_PATH)\");\r\n }\r\n if (config.deploymentSchedulerProvider === \"openclaw-cron\") {\r\n blockers.push(\"~/.kynver/config.json deploymentSchedulerProvider is still openclaw-cron\");\r\n }\r\n\r\n return {\r\n ok: blockers.length === 0,\r\n blockers,\r\n runnerEnv: env,\r\n deploymentSchedulerProvider: config.deploymentSchedulerProvider ?? null,\r\n deploymentSteps: [...DEPLOYMENT_SCHEDULER_CUTOVER_STEPS],\r\n runnerSteps: [...RUNNER_SCHEDULER_CUTOVER_STEPS],\r\n };\r\n}\r\n\r\nexport function applySchedulerCutoverAttestation(\r\n config: KynverUserConfig,\r\n): KynverUserConfig {\r\n return {\r\n ...config,\r\n deploymentSchedulerProvider: \"qstash\",\r\n };\r\n}\r\n", "import type { KynverCronEnv } from \"./cron-env.js\";\r\nimport { isKynverCronDaemonPrimary, resolveKynverCronEnv } from \"./cron-env.js\";\r\nimport { loadCronJobs } from \"./cron-store.js\";\r\nimport { loadCronTickState } from \"./cron-tick-state.js\";\r\n\r\nexport interface KynverCronStatusReport {\r\n primary: \"kynver-cron-daemon\" | \"qstash\" | \"disabled\";\r\n env: Pick<\r\n KynverCronEnv,\r\n | \"storePath\"\r\n | \"statePath\"\r\n | \"tickEnabled\"\r\n | \"fireBaseUrl\"\r\n | \"missedRunPolicy\"\r\n | \"maxCatchUpPerTick\"\r\n | \"maxRetries\"\r\n >;\r\n jobCount: number;\r\n stateJobCount: number;\r\n credentialsReady: boolean;\r\n daemonPrimary: boolean;\r\n}\r\n\r\nexport async function buildKynverCronStatusReport(\r\n env: KynverCronEnv = resolveKynverCronEnv(),\r\n): Promise<KynverCronStatusReport> {\r\n const jobs = await loadCronJobs(env.storePath).catch(() => []);\r\n const state = await loadCronTickState(env.statePath).catch(() => ({ version: 1 as const, jobs: {} }));\r\n const credentialsReady = Boolean(env.fireBaseUrl && env.secret);\r\n const daemonPrimary = isKynverCronDaemonPrimary(env);\r\n\r\n let primary: KynverCronStatusReport[\"primary\"] = \"disabled\";\r\n if (daemonPrimary) primary = \"kynver-cron-daemon\";\r\n else if (process.env.QSTASH_TOKEN?.trim()) primary = \"qstash\";\r\n\r\n return {\r\n primary,\r\n env: {\r\n storePath: env.storePath,\r\n statePath: env.statePath,\r\n tickEnabled: env.tickEnabled,\r\n fireBaseUrl: env.fireBaseUrl,\r\n missedRunPolicy: env.missedRunPolicy,\r\n maxCatchUpPerTick: env.maxCatchUpPerTick,\r\n maxRetries: env.maxRetries,\r\n },\r\n jobCount: jobs.length,\r\n stateJobCount: Object.keys(state.jobs).length,\r\n credentialsReady,\r\n daemonPrimary,\r\n };\r\n}\r\n", "import { runKynverCronTick } from \"./cron-tick.js\";\r\nimport { buildKynverCronStatusReport } from \"./cron-status.js\";\r\n\r\nexport async function runCronStatusCli(json: boolean): Promise<void> {\r\n const report = await buildKynverCronStatusReport();\r\n if (json) {\r\n console.log(JSON.stringify(report, null, 2));\r\n return;\r\n }\r\n console.log(`Kynver Cron primary: ${report.primary}`);\r\n console.log(` store: ${report.env.storePath} (${report.jobCount} jobs)`);\r\n console.log(` tick state: ${report.env.statePath} (${report.stateJobCount} tracked)`);\r\n console.log(` tick enabled: ${report.env.tickEnabled}`);\r\n console.log(` fire base URL: ${report.env.fireBaseUrl ?? \"(unset)\"}`);\r\n console.log(` credentials ready: ${report.credentialsReady}`);\r\n console.log(` daemon-owned primary: ${report.daemonPrimary}`);\r\n}\r\n\r\nexport async function runCronTickCli(\r\n args: Record<string, string | boolean>,\r\n): Promise<void> {\r\n const agentOsId =\r\n typeof args.agentOsId === \"string\" ? args.agentOsId : undefined;\r\n const result = await runKynverCronTick({\r\n agentOsIdFilter: agentOsId ?? null,\r\n });\r\n if (args.json === true) {\r\n console.log(JSON.stringify(result, null, 2));\r\n return;\r\n }\r\n console.log(\r\n JSON.stringify({\r\n event: \"kynver_cron_tick\",\r\n ...result,\r\n }),\r\n );\r\n}\r\n", "import { loadUserConfig } from \"../config.js\";\r\nimport { runCronInstall } from \"./cron-install.js\";\r\nimport { verifyCronInstall } from \"./cron-install-verify.js\";\r\n\r\nfunction parseBoolArg(value: string | boolean | undefined, defaultValue: boolean): boolean {\r\n if (value === undefined) return defaultValue;\r\n if (value === true) return true;\r\n if (value === false) return false;\r\n const v = String(value).trim().toLowerCase();\r\n if (v === \"0\" || v === \"false\" || v === \"no\" || v === \"off\") return false;\r\n if (v === \"1\" || v === \"true\" || v === \"yes\" || v === \"on\") return true;\r\n return defaultValue;\r\n}\r\n\r\nexport async function runCronInstallCli(args: Record<string, string | boolean>): Promise<void> {\r\n const dryRun = args.dryRun === true || args[\"dry-run\"] === true;\r\n const result = await runCronInstall({\r\n execute: dryRun ? false : parseBoolArg(args.execute, true),\r\n json: args.json === true,\r\n installSystemd: args.installSystemd === true || args[\"install-systemd\"] === true,\r\n confirmQstashRemoval:\r\n args.confirmQstashRemoval === true || args[\"confirm-qstash-removal\"] === true,\r\n skipWatchdog: args.skipWatchdog === true || args[\"skip-watchdog\"] === true,\r\n skipTestFire: args.skipTestFire === true || args[\"skip-test-fire\"] === true,\r\n agentOsId: typeof args.agentOsId === \"string\" ? args.agentOsId : undefined,\r\n apiBaseUrl: typeof args.apiBaseUrl === \"string\" ? args.apiBaseUrl : undefined,\r\n runId: typeof args.run === \"string\" ? args.run : undefined,\r\n });\r\n\r\n if (args.json === true) {\r\n console.log(JSON.stringify(result, null, 2));\r\n if (!result.ok) process.exitCode = 1;\r\n return;\r\n }\r\n\r\n console.log(result.dryRun ? \"Kynver Cron install (dry-run)\\n\" : \"Kynver Cron install\\n\");\r\n console.log(` config: ${result.configPath}`);\r\n console.log(` env file: ${result.plan.envFilePath}`);\r\n console.log(` store: ${result.plan.storePath}`);\r\n if (result.secretGenerated) console.log(\" generated new KYNVER_CRON_SECRET\");\r\n if (result.envFile) {\r\n console.log(\r\n ` env merge: ${result.envFile.changed ? \"updated\" : \"unchanged\"} (${result.envFile.keysWritten.join(\", \") || \"no key changes\"})`,\r\n );\r\n }\r\n if (result.watchdog?.remoteJobId) {\r\n console.log(\r\n ` watchdog: job ${result.watchdog.remoteJobId} provider=${result.watchdog.provider} local=${result.watchdog.localProviderScheduleId}`,\r\n );\r\n } else if (result.watchdog?.error) {\r\n console.log(` watchdog: ERROR ${result.watchdog.error}`);\r\n }\r\n if (result.qstashWatchdog?.found.length) {\r\n console.log(` qstash watchdog leftovers: ${result.qstashWatchdog.found.length}`);\r\n for (const j of result.qstashWatchdog.found) {\r\n console.log(` - ${j.id} (${j.status})`);\r\n }\r\n if (result.qstashWatchdog.removed.length) {\r\n console.log(` removed: ${result.qstashWatchdog.removed.join(\", \")}`);\r\n }\r\n }\r\n if (result.systemd) {\r\n console.log(` systemd: ${result.systemd.note ?? (result.systemd.started ? \"running\" : \"not started\")}`);\r\n }\r\n if (result.testFire && !result.testFire.skipped) {\r\n console.log(` test fire: fired=${result.testFire.fired} errors=${result.testFire.errors}`);\r\n }\r\n console.log(\"\\nHosted deployment (manual):\");\r\n for (const step of result.plan.deploymentSteps) console.log(` - ${step}`);\r\n if (result.blockers.length) {\r\n console.log(\"\\nBlockers:\");\r\n for (const b of result.blockers) console.log(` ! ${b}`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n console.log(\"\\nInstall complete \u2014 run `kynver cron verify` to re-check.\");\r\n}\r\n\r\nexport async function runCronVerifyCli(args: Record<string, string | boolean>): Promise<void> {\r\n const config = loadUserConfig();\r\n const report = await verifyCronInstall({ config });\r\n if (args.json === true) {\r\n console.log(JSON.stringify(report, null, 2));\r\n if (!report.ok) process.exitCode = 1;\r\n return;\r\n }\r\n console.log(`Kynver Cron verify: ${report.ok ? \"PASS\" : \"FAIL\"}\\n`);\r\n for (const check of report.checks) {\r\n const mark = check.ok ? \"ok\" : \"FAIL\";\r\n console.log(` [${mark}] ${check.id}: ${check.summary}`);\r\n if (!check.ok && check.remediation) console.log(` \u2192 ${check.remediation}`);\r\n }\r\n if (!report.ok) process.exitCode = 1;\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport {\r\n fetchRunnerCredential,\r\n loadApiKey,\r\n loadUserConfig,\r\n saveRunnerToken,\r\n saveUserConfig,\r\n type KynverUserConfig,\r\n} from \"../config.js\";\r\nimport { displayUserPath } from \"../path-values.js\";\r\nimport { trimTrailingSlash } from \"../util.js\";\r\nimport { runKynverCronTick } from \"./cron-tick.js\";\r\nimport { deterministicCronProviderId } from \"./cron-id.js\";\r\nimport {\r\n buildWatchdogCronSpec,\r\n canCancelQstashWatchdogLeftovers,\r\n cancelSchedulerJob,\r\n ensureWatchdogScheduleRemote,\r\n findQstashWatchdogLeftovers,\r\n listSchedulerJobs,\r\n} from \"./cron-install-api.js\";\r\nimport { mergeEnvFile } from \"./cron-env-file.js\";\r\nimport { buildCronInstallPlan } from \"./cron-install-plan.js\";\r\nimport { resolveCronSecretForInstall } from \"./cron-install-secrets.js\";\r\nimport { installSystemdUserDaemon } from \"./cron-install-systemd.js\";\r\nimport { ensureCronStoreInitialized, saveCronJob } from \"./cron-store.js\";\r\nimport type { CronRegisteredJob } from \"./cron-types.js\";\r\nimport { verifyCronInstall } from \"./cron-install-verify.js\";\r\nimport { getPaths, listRunRecords, loadRun } from \"../run-store.js\";\r\n\r\nexport interface CronInstallOptions {\r\n execute?: boolean;\r\n json?: boolean;\r\n installSystemd?: boolean;\r\n confirmQstashRemoval?: boolean;\r\n skipWatchdog?: boolean;\r\n skipTestFire?: boolean;\r\n agentOsId?: string;\r\n apiBaseUrl?: string;\r\n runId?: string;\r\n}\r\n\r\nexport interface CronInstallResult {\r\n ok: boolean;\r\n dryRun: boolean;\r\n plan: ReturnType<typeof buildCronInstallPlan>;\r\n secretGenerated: boolean;\r\n envFile?: { path: string; changed: boolean; keysWritten: string[] };\r\n configPath: string;\r\n storeInitialized: boolean;\r\n watchdog?: {\r\n remoteJobId?: string;\r\n provider?: string;\r\n localProviderScheduleId?: string;\r\n error?: string;\r\n };\r\n qstashWatchdog?: {\r\n found: Array<{ id: string; provider: string; status: string }>;\r\n removed: string[];\r\n manualSteps: string[];\r\n };\r\n systemd?: ReturnType<typeof installSystemdUserDaemon>;\r\n testFire?: { fired: number; errors: number; skipped?: boolean };\r\n verify?: Awaited<ReturnType<typeof verifyCronInstall>>;\r\n blockers: string[];\r\n}\r\n\r\nfunction resolveDaemonRunId(config: KynverUserConfig, explicit?: string): string | null {\r\n if (explicit?.trim()) return explicit.trim();\r\n if (config.defaultDaemonRunId?.trim()) return config.defaultDaemonRunId.trim();\r\n const runsDir = getPaths().runsDir;\r\n if (!existsSync(runsDir)) return null;\r\n const runs = listRunRecords().sort(\r\n (a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt),\r\n );\r\n return runs[0]?.id ?? null;\r\n}\r\n\r\nexport async function runCronInstall(opts: CronInstallOptions = {}): Promise<CronInstallResult> {\r\n const execute = opts.execute !== false;\r\n const existing = loadUserConfig();\r\n const apiBaseUrl = trimTrailingSlash(\r\n opts.apiBaseUrl?.trim() ||\r\n existing.apiBaseUrl?.trim() ||\r\n process.env.KYNVER_API_URL?.trim() ||\r\n \"\",\r\n );\r\n const agentOsId =\r\n opts.agentOsId?.trim() || existing.agentOsId?.trim() || process.env.KYNVER_AGENT_OS_ID?.trim() || \"\";\r\n\r\n const secretResolution = resolveCronSecretForInstall();\r\n const plan = buildCronInstallPlan({\r\n config: existing,\r\n apiBaseUrl,\r\n agentOsId,\r\n cronSecret: secretResolution.secret,\r\n defaultDaemonRunId: opts.runId?.trim() || existing.defaultDaemonRunId,\r\n installSystemd: opts.installSystemd === true,\r\n });\r\n\r\n const blockers = [...plan.prerequisites];\r\n const result: CronInstallResult = {\r\n ok: false,\r\n dryRun: !execute,\r\n plan,\r\n secretGenerated: secretResolution.generated,\r\n configPath: displayUserPath(plan.configPath),\r\n storeInitialized: false,\r\n blockers,\r\n };\r\n\r\n if (blockers.length) return result;\r\n\r\n if (execute) {\r\n const envMerge = mergeEnvFile(plan.envUpdates, {\r\n filePath: plan.envFilePath,\r\n removeKeys: plan.envRemovals,\r\n });\r\n result.envFile = {\r\n path: displayUserPath(envMerge.path),\r\n changed: envMerge.changed,\r\n keysWritten: envMerge.keysWritten,\r\n };\r\n\r\n const nextConfig: KynverUserConfig = { ...existing, ...plan.configUpdates };\r\n const runId = resolveDaemonRunId(nextConfig, opts.runId);\r\n if (runId) nextConfig.defaultDaemonRunId = runId;\r\n saveUserConfig(nextConfig);\r\n\r\n process.env.KYNVER_API_URL = apiBaseUrl;\r\n process.env.KYNVER_CRON_SECRET = secretResolution.secret;\r\n process.env.KYNVER_CRON_STORE_PATH = plan.storePath;\r\n process.env.KYNVER_CRON_TICK_ENABLED = \"1\";\r\n\r\n const storeInit = await ensureCronStoreInitialized(plan.storePath);\r\n result.storeInitialized = storeInit.created || existsSync(plan.storePath);\r\n\r\n const apiKey = loadApiKey();\r\n if (apiKey) {\r\n try {\r\n const token = await fetchRunnerCredential(agentOsId, { baseUrl: apiBaseUrl, apiKey });\r\n saveRunnerToken(agentOsId, token);\r\n } catch {\r\n // Non-fatal \u2014 operator can mint later.\r\n }\r\n }\r\n\r\n if (!opts.skipWatchdog) {\r\n if (!apiKey) {\r\n result.watchdog = { error: \"KYNVER_API_KEY required to register watchdog on server\" };\r\n blockers.push(\"login \u2014 run `kynver login --api-key \u2026` to register watchdog remotely\");\r\n } else {\r\n try {\r\n const remote = await ensureWatchdogScheduleRemote(apiBaseUrl, agentOsId, apiKey, undefined, {\r\n requireProvider: \"kynver-cron\",\r\n });\r\n const spec = buildWatchdogCronSpec(agentOsId, remote.requestedCron, remote.dedupeKey);\r\n const entry: CronRegisteredJob = {\r\n providerScheduleId: deterministicCronProviderId(spec),\r\n spec,\r\n registeredAt: new Date().toISOString(),\r\n paused: false,\r\n };\r\n await saveCronJob(entry, plan.storePath);\r\n result.watchdog = {\r\n remoteJobId: remote.job.id,\r\n provider: remote.selectedProvider ?? remote.job.provider,\r\n localProviderScheduleId: entry.providerScheduleId,\r\n };\r\n\r\n const allJobs = await listSchedulerJobs(apiBaseUrl, agentOsId, apiKey);\r\n const leftovers = findQstashWatchdogLeftovers(allJobs);\r\n const manualSteps = [\r\n \"Phase 1 (local): `kynver cron install` writes box env/store and may fail remote watchdog until Vercel cutover.\",\r\n \"Phase 2 (hosted): set KYNVER_SCHEDULER_PROVIDER=kynver-cron + KYNVER_CRON_SECRET on Vercel, redeploy, re-run install.\",\r\n \"Phase 3 (cleanup): `kynver cron install --confirm-qstash-removal` after a kynver-cron watchdog row exists.\",\r\n \"Analyst/market QStash schedules are never touched by this installer.\",\r\n ];\r\n const removed: string[] = [];\r\n if (leftovers.length) {\r\n if (opts.confirmQstashRemoval) {\r\n const cancelGuard = canCancelQstashWatchdogLeftovers(allJobs);\r\n if (!cancelGuard.allowed) {\r\n blockers.push(cancelGuard.reason!);\r\n } else {\r\n for (const job of leftovers) {\r\n await cancelSchedulerJob(apiBaseUrl, agentOsId, job.id, apiKey);\r\n removed.push(job.id);\r\n }\r\n }\r\n } else {\r\n blockers.push(\r\n `${leftovers.length} QStash watchdog job(s) still active \u2014 complete Vercel cutover ` +\r\n `(KYNVER_SCHEDULER_PROVIDER=kynver-cron + KYNVER_CRON_SECRET), re-run install, then ` +\r\n `--confirm-qstash-removal`,\r\n );\r\n }\r\n }\r\n result.qstashWatchdog = {\r\n found: leftovers.map((j) => ({ id: j.id, provider: j.provider, status: j.status })),\r\n removed,\r\n manualSteps,\r\n };\r\n } catch (err) {\r\n result.watchdog = { error: (err as Error).message };\r\n blockers.push(`watchdog registration failed: ${(err as Error).message}`);\r\n }\r\n }\r\n }\r\n\r\n if (opts.installSystemd) {\r\n const runId = resolveDaemonRunId({ ...existing, ...plan.configUpdates }, opts.runId);\r\n if (!runId) {\r\n result.systemd = {\r\n supported: plan.systemdSupported,\r\n unitPath: null,\r\n written: false,\r\n enabled: false,\r\n started: false,\r\n note: \"No harness run found \u2014 run `kynver run create` first or pass --run <runId>.\",\r\n };\r\n blockers.push(\"harness run \u2014 create a run before installing systemd unit\");\r\n } else {\r\n try {\r\n loadRun(runId);\r\n } catch {\r\n blockers.push(`harness run ${runId} not found`);\r\n }\r\n result.systemd = installSystemdUserDaemon(\r\n { envFilePath: plan.envFilePath, agentOsId, runId: runId! },\r\n execute,\r\n );\r\n }\r\n }\r\n\r\n if (!opts.skipTestFire && blockers.length === 0) {\r\n const tick = await runKynverCronTick({ agentOsIdFilter: agentOsId });\r\n result.testFire = { fired: tick.fired, errors: tick.errors };\r\n if (tick.errors > 0) {\r\n blockers.push(`test fire reported ${tick.errors} error(s) \u2014 check server KYNVER_CRON_SECRET matches`);\r\n }\r\n } else if (opts.skipTestFire) {\r\n result.testFire = { fired: 0, errors: 0, skipped: true };\r\n }\r\n\r\n result.verify = await verifyCronInstall({\r\n config: loadUserConfig(),\r\n envFilePath: plan.envFilePath,\r\n });\r\n result.blockers = blockers;\r\n result.ok = blockers.length === 0 && (result.verify?.ok ?? false);\r\n } else {\r\n result.ok = blockers.length === 0;\r\n }\r\n\r\n return result;\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\nimport type { CronJobSpec } from \"./cron-types.js\";\r\n\r\n/** Match server `deterministicId` in scheduler.providers.kynver-cron.ts */\r\nexport function deterministicCronProviderId(spec: CronJobSpec): string {\r\n const seed = JSON.stringify({\r\n cb: spec.callbackPath,\r\n cron: spec.cron ?? null,\r\n runAt: spec.runAt ?? null,\r\n kind: spec.kind,\r\n target: spec.target,\r\n dedupeKey: spec.dedupeKey ?? null,\r\n });\r\n const sha = createHash(\"sha1\").update(seed).digest(\"hex\").slice(0, 16);\r\n return `kc-cron:${sha}`;\r\n}\r\n", "import { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { KynverUserConfig } from \"../config.js\";\r\nimport { defaultKynverCronStorePath } from \"./cron-env.js\";\r\nimport { DEFAULT_KYNVER_ENV_FILE } from \"./cron-env-file.js\";\r\n\r\nexport const WATCHDOG_DEDUPE_KEY = \"watchdog:board-sweep\";\r\nexport const DEFAULT_WATCHDOG_CRON = \"*/5 * * * *\";\r\n\r\nexport const VERCEL_KYNVER_CRON_CUTOVER_STEPS = [\r\n \"Set KYNVER_SCHEDULER_PROVIDER=kynver-cron on the hosted Kynver deployment (Vercel).\",\r\n \"Set KYNVER_CRON_SECRET to the same value written to ~/.kynver/.env by this installer.\",\r\n \"Unset KYNVER_CRON_STORE_PATH on Vercel \u2014 the connected box owns the local store.\",\r\n \"Keep QSTASH_TOKEN only if other non-watchdog schedules still use QStash (analyst/market jobs).\",\r\n] as const;\r\n\r\nexport interface CronInstallPlanInput {\r\n config: KynverUserConfig;\r\n apiBaseUrl: string;\r\n agentOsId: string;\r\n cronSecret: string;\r\n storePath?: string;\r\n envFilePath?: string;\r\n defaultDaemonRunId?: string;\r\n installSystemd?: boolean;\r\n}\r\n\r\nexport interface CronInstallPlan {\r\n envFilePath: string;\r\n configPath: string;\r\n storePath: string;\r\n envUpdates: Record<string, string>;\r\n envRemovals: string[];\r\n configUpdates: Partial<KynverUserConfig>;\r\n deploymentSteps: readonly string[];\r\n prerequisites: string[];\r\n systemdSupported: boolean;\r\n watchdogSpec: {\r\n kind: \"watchdog\";\r\n cron: string;\r\n dedupeKey: string;\r\n callbackPath: string;\r\n };\r\n}\r\n\r\nexport function buildCronInstallPlan(input: CronInstallPlanInput): CronInstallPlan {\r\n const storePath = input.storePath?.trim() || defaultKynverCronStorePath();\r\n const envFilePath = input.envFilePath?.trim() || DEFAULT_KYNVER_ENV_FILE;\r\n const configPath = path.join(homedir(), \".kynver\", \"config.json\");\r\n const callbackPath = `/api/agent-os/by-id/${input.agentOsId}/scheduler/fire`;\r\n\r\n const prerequisites: string[] = [];\r\n if (!input.apiBaseUrl?.trim()) prerequisites.push(\"apiBaseUrl \u2014 run `kynver setup --api-base-url \u2026`\");\r\n if (!input.agentOsId?.trim()) prerequisites.push(\"agentOsId \u2014 run `kynver setup --agent-os-id \u2026`\");\r\n\r\n const envUpdates: Record<string, string> = {\r\n KYNVER_API_URL: input.apiBaseUrl,\r\n KYNVER_CRON_SECRET: input.cronSecret,\r\n KYNVER_CRON_STORE_PATH: storePath,\r\n KYNVER_CRON_TICK_ENABLED: \"1\",\r\n };\r\n\r\n const envRemovals = [\"OPENCLAW_CRON_STORE_PATH\", \"OPENCLAW_CRON_SECRET\", \"OPENCLAW_CRON_FIRE_BASE_URL\"];\r\n\r\n const configUpdates: Partial<KynverUserConfig> = {\r\n deploymentSchedulerProvider: \"kynver-cron\",\r\n apiBaseUrl: input.apiBaseUrl,\r\n agentOsId: input.agentOsId,\r\n ...(input.defaultDaemonRunId ? { defaultDaemonRunId: input.defaultDaemonRunId } : {}),\r\n };\r\n\r\n return {\r\n envFilePath,\r\n configPath,\r\n storePath,\r\n envUpdates,\r\n envRemovals,\r\n configUpdates,\r\n deploymentSteps: VERCEL_KYNVER_CRON_CUTOVER_STEPS,\r\n prerequisites,\r\n systemdSupported: process.platform === \"linux\",\r\n watchdogSpec: {\r\n kind: \"watchdog\",\r\n cron: DEFAULT_WATCHDOG_CRON,\r\n dedupeKey: WATCHDOG_DEDUPE_KEY,\r\n callbackPath,\r\n },\r\n };\r\n}\r\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nexport const DEFAULT_KYNVER_ENV_FILE = path.join(homedir(), \".kynver\", \".env\");\r\n\r\nexport interface EnvFileMergeResult {\r\n path: string;\r\n changed: boolean;\r\n keysWritten: string[];\r\n keysRemoved: string[];\r\n}\r\n\r\n/** Parse `KEY=VALUE` lines; skips blanks and `#` comments. */\r\nexport function parseEnvFile(content: string): Map<string, string> {\r\n const map = new Map<string, string>();\r\n for (const line of content.split(/\\r?\\n/)) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n const eq = trimmed.indexOf(\"=\");\r\n if (eq <= 0) continue;\r\n const key = trimmed.slice(0, eq).trim();\r\n let value = trimmed.slice(eq + 1).trim();\r\n if (\r\n (value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\r\n ) {\r\n value = value.slice(1, -1);\r\n }\r\n map.set(key, value);\r\n }\r\n return map;\r\n}\r\n\r\nexport function serializeEnvFile(\r\n values: Map<string, string>,\r\n header = \"# Managed by kynver cron install \u2014 safe to edit; re-run install to merge keys.\\n\",\r\n): string {\r\n const lines = [header.trimEnd(), \"\"];\r\n for (const [key, value] of [...values.entries()].sort(([a], [b]) => a.localeCompare(b))) {\r\n const escaped =\r\n value.includes(\" \") || value.includes(\"#\") || value.includes('\"')\r\n ? `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`\r\n : value;\r\n lines.push(`${key}=${escaped}`);\r\n }\r\n lines.push(\"\");\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nexport function readEnvFile(filePath = DEFAULT_KYNVER_ENV_FILE): Map<string, string> {\r\n if (!existsSync(filePath)) return new Map();\r\n return parseEnvFile(readFileSync(filePath, \"utf8\"));\r\n}\r\n\r\nexport function mergeEnvFile(\r\n updates: Record<string, string | undefined>,\r\n options: { filePath?: string; removeKeys?: string[] } = {},\r\n): EnvFileMergeResult {\r\n const filePath = options.filePath ?? DEFAULT_KYNVER_ENV_FILE;\r\n const existing = existsSync(filePath) ? readFileSync(filePath, \"utf8\") : \"\";\r\n const map = parseEnvFile(existing);\r\n const keysWritten: string[] = [];\r\n const keysRemoved: string[] = [];\r\n\r\n for (const key of options.removeKeys ?? []) {\r\n if (map.delete(key)) keysRemoved.push(key);\r\n }\r\n\r\n for (const [key, value] of Object.entries(updates)) {\r\n if (value === undefined) continue;\r\n const prev = map.get(key);\r\n map.set(key, value);\r\n if (prev !== value) keysWritten.push(key);\r\n }\r\n\r\n const prevMap = parseEnvFile(existing);\r\n let changed = prevMap.size !== map.size;\r\n if (!changed) {\r\n for (const [key, value] of map) {\r\n if (prevMap.get(key) !== value) {\r\n changed = true;\r\n break;\r\n }\r\n }\r\n }\r\n const nextContent = serializeEnvFile(map);\r\n if (changed) {\r\n mkdirSync(path.dirname(filePath), { recursive: true });\r\n writeFileSync(filePath, nextContent, { mode: 0o600 });\r\n }\r\n\r\n return { path: filePath, changed, keysWritten, keysRemoved };\r\n}\r\n", "import type { CronJobSpec } from \"./cron-types.js\";\r\nimport { WATCHDOG_DEDUPE_KEY } from \"./cron-install-plan.js\";\r\n\r\nexport interface SchedulerJobRow {\r\n id: string;\r\n kind: string;\r\n provider: string;\r\n status: string;\r\n cron?: string | null;\r\n dedupeKey?: string | null;\r\n}\r\n\r\nasync function apiFetch(\r\n url: string,\r\n apiKey: string,\r\n init: RequestInit = {},\r\n): Promise<Response> {\r\n return fetch(url, {\r\n ...init,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${apiKey}`,\r\n ...(init.headers as Record<string, string> | undefined),\r\n },\r\n });\r\n}\r\n\r\nexport async function listSchedulerJobs(\r\n baseUrl: string,\r\n agentOsId: string,\r\n apiKey: string,\r\n query: Record<string, string> = {},\r\n): Promise<SchedulerJobRow[]> {\r\n const sp = new URLSearchParams(query);\r\n const url = `${baseUrl}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/scheduler/jobs?${sp}`;\r\n const res = await apiFetch(url, apiKey);\r\n const text = await res.text();\r\n let parsed: { items?: SchedulerJobRow[]; error?: string } | null = null;\r\n try {\r\n parsed = JSON.parse(text) as { items?: SchedulerJobRow[]; error?: string };\r\n } catch {\r\n parsed = null;\r\n }\r\n if (!res.ok) {\r\n throw new Error(\r\n `list scheduler jobs failed (${res.status}): ${parsed?.error ?? text.slice(0, 200)}`,\r\n );\r\n }\r\n return parsed?.items ?? [];\r\n}\r\n\r\nexport async function ensureWatchdogScheduleRemote(\r\n baseUrl: string,\r\n agentOsId: string,\r\n apiKey: string,\r\n cron?: string,\r\n options: { requireProvider?: \"kynver-cron\" } = {},\r\n): Promise<{\r\n job: SchedulerJobRow;\r\n route: string;\r\n dedupeKey: string;\r\n requestedCron: string;\r\n selectedProvider: string | null;\r\n}> {\r\n const url = `${baseUrl}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/scheduler/watchdog/ensure`;\r\n const body: Record<string, string> = {};\r\n if (cron) body.cron = cron;\r\n if (options.requireProvider) body.requireProvider = options.requireProvider;\r\n const res = await apiFetch(url, apiKey, {\r\n method: \"POST\",\r\n body: JSON.stringify(body),\r\n });\r\n const text = await res.text();\r\n let parsed: {\r\n job?: SchedulerJobRow;\r\n route?: string;\r\n dedupeKey?: string;\r\n requestedCron?: string;\r\n selectedProvider?: string | null;\r\n error?: string;\r\n } | null = null;\r\n try {\r\n parsed = JSON.parse(text);\r\n } catch {\r\n parsed = null;\r\n }\r\n if (!res.ok || !parsed?.job) {\r\n throw new Error(\r\n `ensure watchdog failed (${res.status}): ${parsed?.error ?? text.slice(0, 200)}`,\r\n );\r\n }\r\n return {\r\n job: parsed.job,\r\n route: parsed.route ?? `/api/agent-os/by-id/${agentOsId}/scheduler/fire`,\r\n dedupeKey: parsed.dedupeKey ?? WATCHDOG_DEDUPE_KEY,\r\n requestedCron: parsed.requestedCron ?? cron ?? \"*/5 * * * *\",\r\n selectedProvider: parsed.selectedProvider ?? parsed.job.provider ?? null,\r\n };\r\n}\r\n\r\nexport async function cancelSchedulerJob(\r\n baseUrl: string,\r\n agentOsId: string,\r\n jobId: string,\r\n apiKey: string,\r\n): Promise<void> {\r\n const url = `${baseUrl}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/scheduler/jobs/${encodeURIComponent(jobId)}/cancel`;\r\n const res = await apiFetch(url, apiKey, { method: \"POST\", body: \"{}\" });\r\n if (!res.ok) {\r\n const text = await res.text();\r\n throw new Error(`cancel job ${jobId} failed (${res.status}): ${text.slice(0, 200)}`);\r\n }\r\n}\r\n\r\nexport function buildWatchdogCronSpec(\r\n agentOsId: string,\r\n cron: string,\r\n dedupeKey = WATCHDOG_DEDUPE_KEY,\r\n): CronJobSpec {\r\n return {\r\n kind: \"watchdog\",\r\n scheduleKind: \"cron\",\r\n cron,\r\n callbackPath: `/api/agent-os/by-id/${agentOsId}/scheduler/fire`,\r\n payload: { source: \"agent-os.watchdog-schedule\", agentOsId },\r\n target: { agentOsId },\r\n description: \"Watchdog board sweep (repair loop)\",\r\n dedupeKey,\r\n };\r\n}\r\n\r\nexport function findQstashWatchdogLeftovers(jobs: SchedulerJobRow[]): SchedulerJobRow[] {\r\n return jobs.filter(\r\n (job) =>\r\n job.kind === \"watchdog\" &&\r\n job.dedupeKey === WATCHDOG_DEDUPE_KEY &&\r\n job.provider === \"qstash\" &&\r\n job.status !== \"cancelled\",\r\n );\r\n}\r\n\r\nexport function findKynverCronWatchdog(jobs: SchedulerJobRow[]): SchedulerJobRow | undefined {\r\n return jobs.find(\r\n (job) =>\r\n job.kind === \"watchdog\" &&\r\n job.dedupeKey === WATCHDOG_DEDUPE_KEY &&\r\n job.provider === \"kynver-cron\" &&\r\n job.status !== \"cancelled\",\r\n );\r\n}\r\n\r\nexport function canCancelQstashWatchdogLeftovers(jobs: SchedulerJobRow[]): {\r\n allowed: boolean;\r\n reason?: string;\r\n} {\r\n if (findKynverCronWatchdog(jobs)) return { allowed: true };\r\n return {\r\n allowed: false,\r\n reason:\r\n \"Cannot cancel QStash watchdog until hosted KYNVER_SCHEDULER_PROVIDER=kynver-cron is live \" +\r\n \"and a kynver-cron watchdog row exists. Set Vercel env, redeploy, re-run `kynver cron install`, \" +\r\n \"then `--confirm-qstash-removal`.\",\r\n };\r\n}\r\n", "import { randomBytes } from \"node:crypto\";\r\nimport { readEnvFile, DEFAULT_KYNVER_ENV_FILE } from \"./cron-env-file.js\";\r\nimport { resolveKynverCronSecret } from \"./cron-env.js\";\r\n\r\nexport function generateCronSecret(): string {\r\n return randomBytes(32).toString(\"base64url\");\r\n}\r\n\r\nexport function resolveCronSecretForInstall(\r\n envFilePath = DEFAULT_KYNVER_ENV_FILE,\r\n): { secret: string; generated: boolean; source: \"env\" | \"env-file\" | \"generated\" } {\r\n const fromProcess = resolveKynverCronSecret();\r\n if (fromProcess) {\r\n return { secret: fromProcess, generated: false, source: \"env\" };\r\n }\r\n\r\n const file = readEnvFile(envFilePath);\r\n const fromFile = file.get(\"KYNVER_CRON_SECRET\")?.trim();\r\n if (fromFile) {\r\n return { secret: fromFile, generated: false, source: \"env-file\" };\r\n }\r\n\r\n return { secret: generateCronSecret(), generated: true, source: \"generated\" };\r\n}\r\n", "import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { spawnSync } from \"node:child_process\";\r\nimport { isSystemdRunAvailable } from \"../bounded-build/systemd-wrap.js\";\r\n\r\nexport const KYNVER_CRON_DAEMON_UNIT = \"kynver-cron-daemon.service\";\r\n\r\nexport interface SystemdDaemonServiceInput {\r\n envFilePath: string;\r\n agentOsId: string;\r\n runId: string;\r\n kynverBin?: string;\r\n}\r\n\r\nexport function defaultSystemdUserUnitDir(): string {\r\n return path.join(homedir(), \".config\", \"systemd\", \"user\");\r\n}\r\n\r\nexport function renderKynverCronDaemonService(input: SystemdDaemonServiceInput): string {\r\n const kynverBin = input.kynverBin?.trim() || \"kynver\";\r\n return [\r\n \"[Unit]\",\r\n \"Description=Kynver AgentOS daemon (pipeline + cron tick)\",\r\n \"After=network-online.target\",\r\n \"\",\r\n \"[Service]\",\r\n \"Type=simple\",\r\n `EnvironmentFile=${input.envFilePath}`,\r\n `ExecStart=${kynverBin} daemon --run ${input.runId} --agent-os-id ${input.agentOsId} --execute`,\r\n \"Restart=on-failure\",\r\n \"RestartSec=10\",\r\n \"\",\r\n \"[Install]\",\r\n \"WantedBy=default.target\",\r\n \"\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport interface SystemdInstallResult {\r\n supported: boolean;\r\n unitPath: string | null;\r\n written: boolean;\r\n enabled: boolean;\r\n started: boolean;\r\n note?: string;\r\n}\r\n\r\nexport function installSystemdUserDaemon(\r\n input: SystemdDaemonServiceInput,\r\n execute: boolean,\r\n): SystemdInstallResult {\r\n if (!isSystemdRunAvailable()) {\r\n return {\r\n supported: false,\r\n unitPath: null,\r\n written: false,\r\n enabled: false,\r\n started: false,\r\n note:\r\n process.platform === \"linux\"\r\n ? \"systemd-run not available \u2014 install user service manually or run `kynver daemon` under your supervisor.\"\r\n : \"systemd user units are only supported on Linux; use `kynver daemon` manually on macOS/Windows.\",\r\n };\r\n }\r\n\r\n const unitDir = defaultSystemdUserUnitDir();\r\n const unitPath = path.join(unitDir, KYNVER_CRON_DAEMON_UNIT);\r\n const content = renderKynverCronDaemonService(input);\r\n\r\n if (!execute) {\r\n return {\r\n supported: true,\r\n unitPath,\r\n written: false,\r\n enabled: false,\r\n started: false,\r\n note: \"Dry-run \u2014 pass --execute to write and enable the user unit.\",\r\n };\r\n }\r\n\r\n mkdirSync(unitDir, { recursive: true });\r\n const existed = existsSync(unitPath);\r\n writeFileSync(unitPath, content, \"utf8\");\r\n\r\n const reload = spawnSync(\"systemctl\", [\"--user\", \"daemon-reload\"], { encoding: \"utf8\" });\r\n if (reload.status !== 0) {\r\n return {\r\n supported: true,\r\n unitPath,\r\n written: true,\r\n enabled: false,\r\n started: false,\r\n note: `Wrote ${unitPath} but systemctl --user daemon-reload failed: ${reload.stderr || reload.stdout}`,\r\n };\r\n }\r\n\r\n const enable = spawnSync(\"systemctl\", [\"--user\", \"enable\", \"--now\", KYNVER_CRON_DAEMON_UNIT], {\r\n encoding: \"utf8\",\r\n });\r\n\r\n return {\r\n supported: true,\r\n unitPath,\r\n written: !existed || true,\r\n enabled: enable.status === 0,\r\n started: enable.status === 0,\r\n note:\r\n enable.status === 0\r\n ? `Enabled and started ${KYNVER_CRON_DAEMON_UNIT}`\r\n : `Wrote ${unitPath} but enable failed: ${enable.stderr || enable.stdout}`,\r\n };\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport type { KynverUserConfig } from \"../config.js\";\r\nimport { buildKynverCronStatusReport } from \"./cron-status.js\";\r\nimport { resolveKynverCronEnv } from \"./cron-env.js\";\r\nimport { loadCronJobs } from \"./cron-store.js\";\r\nimport { WATCHDOG_DEDUPE_KEY } from \"./cron-install-plan.js\";\r\nimport { readEnvFile, DEFAULT_KYNVER_ENV_FILE } from \"./cron-env-file.js\";\r\n\r\nexport interface CronVerifyCheck {\r\n id: string;\r\n ok: boolean;\r\n summary: string;\r\n remediation?: string;\r\n}\r\n\r\nexport interface CronInstallVerifyReport {\r\n ok: boolean;\r\n checks: CronVerifyCheck[];\r\n}\r\n\r\nexport async function verifyCronInstall(input: {\r\n config: KynverUserConfig;\r\n envFilePath?: string;\r\n}): Promise<CronInstallVerifyReport> {\r\n const envFilePath = input.envFilePath ?? DEFAULT_KYNVER_ENV_FILE;\r\n const checks: CronVerifyCheck[] = [];\r\n const env = resolveKynverCronEnv();\r\n const status = await buildKynverCronStatusReport(env);\r\n const fileEnv = readEnvFile(envFilePath);\r\n\r\n checks.push({\r\n id: \"config_agent_os\",\r\n ok: Boolean(input.config.agentOsId?.trim()),\r\n summary: input.config.agentOsId\r\n ? `agentOsId configured (${input.config.agentOsId})`\r\n : \"agentOsId missing in ~/.kynver/config.json\",\r\n remediation: \"Run `kynver setup --agent-os-id <id>`.\",\r\n });\r\n\r\n checks.push({\r\n id: \"config_api_base\",\r\n ok: Boolean(input.config.apiBaseUrl?.trim() || env.fireBaseUrl),\r\n summary: env.fireBaseUrl\r\n ? `fire base URL resolved (${env.fireBaseUrl})`\r\n : \"KYNVER_API_URL / apiBaseUrl not configured\",\r\n remediation: \"Run `kynver setup --api-base-url https://\u2026`.\",\r\n });\r\n\r\n checks.push({\r\n id: \"deployment_provider\",\r\n ok: input.config.deploymentSchedulerProvider === \"kynver-cron\",\r\n summary: `deploymentSchedulerProvider=${input.config.deploymentSchedulerProvider ?? \"(unset)\"}`,\r\n remediation: 'Run `kynver cron install` or set deploymentSchedulerProvider to \"kynver-cron\".',\r\n });\r\n\r\n checks.push({\r\n id: \"cron_secret\",\r\n ok: Boolean(env.secret),\r\n summary: env.secret ? \"KYNVER_CRON_SECRET present\" : \"KYNVER_CRON_SECRET missing\",\r\n remediation: \"Run `kynver cron install` to generate and persist the shared secret.\",\r\n });\r\n\r\n checks.push({\r\n id: \"env_file\",\r\n ok: existsSync(envFilePath) && Boolean(fileEnv.get(\"KYNVER_CRON_SECRET\")),\r\n summary: existsSync(envFilePath)\r\n ? `~/.kynver/.env present (${fileEnv.size} keys)`\r\n : \"~/.kynver/.env missing\",\r\n remediation: \"Run `kynver cron install` to write ~/.kynver/.env.\",\r\n });\r\n\r\n checks.push({\r\n id: \"cron_store\",\r\n ok: existsSync(env.storePath),\r\n summary: existsSync(env.storePath)\r\n ? `cron store present (${env.storePath})`\r\n : `cron store missing (${env.storePath})`,\r\n remediation: \"Run `kynver cron install` to initialize the local store.\",\r\n });\r\n\r\n const jobs = await loadCronJobs(env.storePath).catch(() => []);\r\n const watchdog = jobs.find((j) => j.spec.dedupeKey === WATCHDOG_DEDUPE_KEY);\r\n checks.push({\r\n id: \"watchdog_local\",\r\n ok: Boolean(watchdog),\r\n summary: watchdog\r\n ? `watchdog entry in local store (${watchdog.providerScheduleId})`\r\n : \"watchdog entry not mirrored in local cron store\",\r\n remediation: \"Run `kynver cron install` (with API access) to register and mirror watchdog.\",\r\n });\r\n\r\n checks.push({\r\n id: \"daemon_primary\",\r\n ok: status.daemonPrimary,\r\n summary: status.daemonPrimary\r\n ? \"cron tick enabled with credentials (daemon-primary)\"\r\n : `cron primary=${status.primary}; tickEnabled=${status.env.tickEnabled}`,\r\n remediation:\r\n \"Ensure KYNVER_CRON_TICK_ENABLED=1 and run `kynver daemon` (or enable the systemd user unit).\",\r\n });\r\n\r\n const legacyOpenclaw =\r\n fileEnv.has(\"OPENCLAW_CRON_STORE_PATH\") ||\r\n fileEnv.has(\"OPENCLAW_CRON_SECRET\") ||\r\n fileEnv.has(\"OPENCLAW_CRON_FIRE_BASE_URL\");\r\n checks.push({\r\n id: \"legacy_openclaw_env\",\r\n ok: !legacyOpenclaw,\r\n summary: legacyOpenclaw\r\n ? \"legacy OPENCLAW_CRON_* keys still present in ~/.kynver/.env\"\r\n : \"no legacy OPENCLAW_CRON_* keys in env file\",\r\n remediation: \"Re-run `kynver cron install` to retire legacy aliases.\",\r\n });\r\n\r\n const ok = checks.every((c) => c.ok);\r\n return { ok, checks };\r\n}\r\n", "import os from \"node:os\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"../config.js\";\r\nimport { postJson } from \"../callbacks.js\";\r\nimport { buildBoxResourceSnapshotFromGate } from \"../box-resource-snapshot.js\";\r\nimport { loadUserConfig } from \"../config.js\";\r\nimport { resolveBoxKindFromConfig } from \"../box-identity.js\";\r\nimport { observeRunnerResourceGate } from \"../resource-gate.js\";\r\nimport { required } from \"../util.js\";\r\nimport { LANDING_MAINTAINER_LANE_SPEC } from \"./lane-spec.js\";\r\nimport { resolveLandingMaintainerRepoRoot, runLandingWrapper } from \"./landing-maintainer-local.js\";\r\n\r\nexport interface LandingMaintainerTickResult {\r\n repo: string;\r\n fleet: boolean;\r\n execute: boolean;\r\n coordinator: unknown;\r\n localOutcomes: Array<{\r\n action: { kind: string; prNumber?: number; reason: string };\r\n executed: boolean;\r\n exitCode: number | null;\r\n }>;\r\n}\r\n\r\nexport async function runLandingMaintainerLaneTick(\r\n args: Record<string, string | boolean>,\r\n): Promise<LandingMaintainerTickResult> {\r\n const agentOsId = String(required(String(args.agentOsId || \"\"), \"--agent-os-id\"));\r\n const repoSlug = String(args.repo || LANDING_MAINTAINER_LANE_SPEC.defaultRepo).trim();\r\n const fleet = args.fleet === true || args.fleet === \"true\";\r\n const execute = args.execute === true || args.execute === \"true\";\r\n const runId = args.run ? String(args.run) : undefined;\r\n\r\n const resourceGate = observeRunnerResourceGate({\r\n runId: runId ?? \"fleet-lane-tick\",\r\n });\r\n const boxCapacity = {\r\n ...buildBoxResourceSnapshotFromGate(resourceGate, {\r\n harnessRunId: runId,\r\n boxKind: resolveBoxKindFromConfig(loadUserConfig()),\r\n hostLabel: os.hostname(),\r\n }),\r\n providerHealthy: resourceGate.ok,\r\n authorizedForRepair: resourceGate.ok,\r\n authorizedForLanding: resourceGate.ok,\r\n systemHealthBlockers: resourceGate.ok ? [] : [resourceGate.reason ?? \"resource_gate_blocked\"],\r\n actionableWorkers: resourceGate.activeWorkers,\r\n };\r\n\r\n const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : undefined);\r\n const secret = await resolveCallbackSecretWithMint(\r\n args.secret ? String(args.secret) : undefined,\r\n agentOsId,\r\n { baseUrl: base },\r\n );\r\n const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/fleet-landing-maintainer/tick`;\r\n\r\n const res = await postJson(url, secret, {\r\n repo: repoSlug,\r\n fleet,\r\n execute,\r\n runId,\r\n boxCapacity,\r\n });\r\n\r\n const coordinator = res.response;\r\n const localOutcomes: LandingMaintainerTickResult[\"localOutcomes\"] = [];\r\n const repoRoot = resolveLandingMaintainerRepoRoot(args);\r\n\r\n const actions = Array.isArray((coordinator as { localActions?: unknown })?.localActions)\r\n ? ((coordinator as {\r\n localActions: Array<{ kind: string; prNumber?: number; prUrl?: string; reason: string }>;\r\n }).localActions)\r\n : [];\r\n\r\n const holderBoxId = boxCapacity.boxId;\r\n\r\n for (const action of actions) {\r\n if (action.kind === \"land_pr\" && typeof action.prNumber === \"number\") {\r\n const outcome = runLandingWrapper(action.prNumber, repoRoot, execute);\r\n localOutcomes.push({\r\n action: outcome.action,\r\n executed: outcome.executed,\r\n exitCode: outcome.exitCode,\r\n });\r\n if (execute && outcome.executed) {\r\n const merged = outcome.exitCode === 0;\r\n const prUrl =\r\n typeof action.prUrl === \"string\" && action.prUrl.trim()\r\n ? action.prUrl.trim()\r\n : `https://github.com/${repoSlug}/pull/${action.prNumber}`;\r\n try {\r\n await postJson(\r\n `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/fleet-landing-maintainer/outcome`,\r\n secret,\r\n { repo: repoSlug, prUrl, holderBoxId, merged },\r\n );\r\n } catch {\r\n // Best-effort lock release; TTL still clears stale locks.\r\n }\r\n }\r\n continue;\r\n }\r\n localOutcomes.push({\r\n action,\r\n executed: false,\r\n exitCode: null,\r\n });\r\n }\r\n\r\n return {\r\n repo: repoSlug,\r\n fleet,\r\n execute,\r\n coordinator,\r\n localOutcomes,\r\n };\r\n}\r\n", "/** Runtime mirror of server landing-maintainer lane policy. */\r\n\r\nexport const LANDING_MAINTAINER_LANE_SPEC = {\r\n slug: \"landing-maintainer\",\r\n originCron: \"maintain-8-blocker-and-pr-landing-workers\",\r\n defaultRepo: \"Totalsolutionsync/Kynver\",\r\n landScript: \"scripts/agent-os-land-pr.mjs\",\r\n landScriptArgs: [\"--skip-not-ready\"],\r\n} as const;\r\n", "import { spawnSync } from \"node:child_process\";\r\nimport path from \"node:path\";\r\nimport { resolveDefaultRepo } from \"../default-repo.js\";\r\nimport { LANDING_MAINTAINER_LANE_SPEC } from \"./lane-spec.js\";\r\n\r\nexport interface LandingMaintainerLocalAction {\r\n kind: \"land_pr\" | \"skip\" | \"noop\" | \"repair_dispatch_hint\";\r\n prNumber?: number;\r\n prUrl?: string;\r\n reason: string;\r\n}\r\n\r\nexport interface LandingMaintainerLocalOutcome {\r\n action: LandingMaintainerLocalAction;\r\n executed: boolean;\r\n exitCode: number | null;\r\n stdout: string;\r\n stderr: string;\r\n}\r\n\r\nexport function runLandingWrapper(\r\n prNumber: number,\r\n repoRoot: string,\r\n execute: boolean,\r\n): LandingMaintainerLocalOutcome {\r\n const script = path.join(repoRoot, LANDING_MAINTAINER_LANE_SPEC.landScript);\r\n const args = [script, String(prNumber), ...LANDING_MAINTAINER_LANE_SPEC.landScriptArgs];\r\n if (!execute) {\r\n return {\r\n action: { kind: \"land_pr\", prNumber, reason: \"dry-run\" },\r\n executed: false,\r\n exitCode: 0,\r\n stdout: `dry-run: node ${args.join(\" \")}`,\r\n stderr: \"\",\r\n };\r\n }\r\n const result = spawnSync(\"node\", args, {\r\n cwd: repoRoot,\r\n encoding: \"utf8\",\r\n timeout: 10 * 60 * 1000,\r\n });\r\n return {\r\n action: { kind: \"land_pr\", prNumber, reason: \"landing wrapper invoked\" },\r\n executed: true,\r\n exitCode: result.status,\r\n stdout: result.stdout ?? \"\",\r\n stderr: result.stderr ?? \"\",\r\n };\r\n}\r\n\r\nexport function resolveLandingMaintainerRepoRoot(args: Record<string, string | boolean>): string {\r\n const explicit = args.repoPath ? String(args.repoPath).trim() : \"\";\r\n if (explicit) return path.resolve(explicit);\r\n const resolved = resolveDefaultRepo();\r\n return resolved?.repo ?? process.cwd();\r\n}\r\n", "import { runLandingMaintainerLaneTick } from \"./landing-maintainer-tick.js\";\r\n\r\nexport async function runLaneTickCli(\r\n args: Record<string, string | boolean>,\r\n laneFromArgv?: string,\r\n): Promise<void> {\r\n const lane = String(laneFromArgv ?? args.lane ?? \"\").trim();\r\n if (lane !== \"landing-maintainer\") {\r\n console.error(`unknown lane: ${lane || \"(none)\"}`);\r\n process.exit(1);\r\n }\r\n const result = await runLandingMaintainerLaneTick(args);\r\n if (args.json === true || args.json === \"true\") {\r\n console.log(JSON.stringify(result, null, 2));\r\n return;\r\n }\r\n console.log(\r\n [\r\n `fleet landing-maintainer tick`,\r\n `repo=${result.repo}`,\r\n `fleet=${result.fleet}`,\r\n `execute=${result.execute}`,\r\n `localOutcomes=${result.localOutcomes.length}`,\r\n ].join(\" \"),\r\n );\r\n for (const row of result.localOutcomes) {\r\n console.log(` ${row.action.kind} pr=${row.action.prNumber ?? \"-\"} executed=${row.executed}`);\r\n }\r\n}\r\n", "// Vercel REST API deployment lookup \u2014 replaces global `vercel inspect` CLI.\r\n\r\nconst VERCEL_API = \"https://api.vercel.com\";\r\n\r\nexport interface VercelDeploymentLookupResult {\r\n ok: boolean;\r\n readyState: string | null;\r\n previewUrl: string | null;\r\n error: string | null;\r\n}\r\n\r\nexport interface VercelDeploymentLookupOptions {\r\n token?: string | null;\r\n teamId?: string | null;\r\n fetchImpl?: typeof fetch;\r\n}\r\n\r\nfunction resolveToken(explicit?: string | null): string | null {\r\n const trimmed = explicit?.trim();\r\n if (trimmed) return trimmed;\r\n return process.env.VERCEL_TOKEN?.trim() || null;\r\n}\r\n\r\nfunction mapReadyState(state: string | null | undefined): string {\r\n return (state ?? \"\").trim().toUpperCase();\r\n}\r\n\r\nfunction previewUrlFromDeployment(url: unknown): string | null {\r\n if (typeof url !== \"string\" || !url.trim()) return null;\r\n const trimmed = url.trim();\r\n return trimmed.startsWith(\"http\") ? trimmed : `https://${trimmed}`;\r\n}\r\n\r\n/**\r\n * Fetch deployment state by id (`dpl_*`) or `*.vercel.app` host URL.\r\n * Requires `VERCEL_TOKEN` (or explicit token) \u2014 never shells out to the Vercel CLI.\r\n */\r\nexport async function fetchVercelDeploymentStatus(\r\n deploymentIdOrUrl: string,\r\n options: VercelDeploymentLookupOptions = {},\r\n): Promise<VercelDeploymentLookupResult> {\r\n const target = deploymentIdOrUrl.trim();\r\n if (!target) {\r\n return { ok: false, readyState: null, previewUrl: null, error: \"missing deployment id or URL\" };\r\n }\r\n\r\n const token = resolveToken(options.token);\r\n if (!token) {\r\n return {\r\n ok: false,\r\n readyState: null,\r\n previewUrl: null,\r\n error: \"VERCEL_TOKEN not configured\",\r\n };\r\n }\r\n\r\n const teamId = options.teamId?.trim() || process.env.VERCEL_TEAM_ID?.trim();\r\n const teamQuery = teamId ? `?teamId=${encodeURIComponent(teamId)}` : \"\";\r\n const fetchImpl = options.fetchImpl ?? fetch;\r\n\r\n try {\r\n const res = await fetchImpl(`${VERCEL_API}/v13/deployments/${encodeURIComponent(target)}${teamQuery}`, {\r\n headers: { Authorization: `Bearer ${token}` },\r\n });\r\n\r\n if (!res.ok) {\r\n const body = await res.text();\r\n return {\r\n ok: false,\r\n readyState: null,\r\n previewUrl: null,\r\n error: `Vercel API ${res.status}: ${body.slice(0, 200)}`,\r\n };\r\n }\r\n\r\n const data = (await res.json()) as {\r\n readyState?: string;\r\n state?: string;\r\n url?: string;\r\n };\r\n\r\n const readyState = mapReadyState(data.readyState ?? data.state);\r\n return {\r\n ok: true,\r\n readyState: readyState || null,\r\n previewUrl: previewUrlFromDeployment(data.url),\r\n error: null,\r\n };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n readyState: null,\r\n previewUrl: null,\r\n error: err instanceof Error ? err.message : \"Vercel API fetch failed\",\r\n };\r\n }\r\n}\r\n\r\nexport function mapVercelReadyStateToEvidenceStatus(\r\n readyState: string | null,\r\n githubPending: boolean,\r\n): \"ready\" | \"building\" | \"error\" {\r\n const state = mapReadyState(readyState);\r\n if (state === \"READY\") return \"ready\";\r\n if (state === \"ERROR\" || state === \"CANCELED\") return \"error\";\r\n if (state === \"BUILDING\" || state === \"QUEUED\" || state === \"INITIALIZING\") return \"building\";\r\n return githubPending ? \"building\" : \"error\";\r\n}\r\n", "// Classify Vercel URLs from GitHub StatusContext.target_url for REST API lookup vs trust-github.\r\n\r\nexport type VercelUrlKind =\r\n | \"deployment_host\"\r\n | \"dashboard\"\r\n | \"deployment_id\"\r\n | \"unknown\";\r\n\r\nexport interface ClassifiedVercelUrl {\r\n kind: VercelUrlKind;\r\n /** Original URL when it is a usable preview/deployment host. */\r\n previewUrl: string | null;\r\n /** Deployment id or host URL suitable for Vercel REST API lookup \u2014 never a dashboard page URL. */\r\n inspectTarget: string | null;\r\n /** Deployment id extracted from dashboard paths when present. */\r\n deploymentId: string | null;\r\n}\r\n\r\nconst VERCEL_HOST_RE = /(^|\\.)vercel\\.app$/i;\r\nconst DPL_ID_RE = /^dpl_[a-z0-9]+$/i;\r\n\r\n/** True when the string is safe for Vercel REST API deployment lookup (never a dashboard page URL). */\r\nexport function isInspectableVercelTarget(target: string): boolean {\r\n const trimmed = target.trim();\r\n if (!trimmed) return false;\r\n if (/vercel\\.com/i.test(trimmed)) return false;\r\n if (DPL_ID_RE.test(trimmed)) return true;\r\n try {\r\n const url = new URL(trimmed.startsWith(\"http\") ? trimmed : `https://${trimmed}`);\r\n return VERCEL_HOST_RE.test(url.hostname);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction tryParseUrl(raw: string): URL | null {\r\n const trimmed = raw.trim();\r\n if (!trimmed) return null;\r\n try {\r\n return new URL(trimmed);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Dashboard deployment pages: /{team}/{project}/{deploymentId} */\r\nfunction parseDashboardDeployment(url: URL): string | null {\r\n const parts = url.pathname.split(\"/\").filter(Boolean);\r\n if (parts.length < 3) return null;\r\n const deploymentId = parts[parts.length - 1]?.trim();\r\n if (!deploymentId || deploymentId === \"deployments\") return null;\r\n return deploymentId;\r\n}\r\n\r\n/** Alternate dashboard shape: .../deployments/{id} */\r\nfunction parseDeploymentsSegment(url: URL): string | null {\r\n const parts = url.pathname.split(\"/\").filter(Boolean);\r\n const idx = parts.indexOf(\"deployments\");\r\n if (idx < 0 || idx >= parts.length - 1) return null;\r\n const deploymentId = parts[idx + 1]?.trim();\r\n return deploymentId || null;\r\n}\r\n\r\n/**\r\n * Classify a Vercel-related URL from GitHub commit status target_url.\r\n * Vercel REST API accepts deployment ids and `*.vercel.app` hosts \u2014 not vercel.com dashboard links.\r\n */\r\nexport function classifyVercelUrl(raw: string): ClassifiedVercelUrl {\r\n const empty: ClassifiedVercelUrl = {\r\n kind: \"unknown\",\r\n previewUrl: null,\r\n inspectTarget: null,\r\n deploymentId: null,\r\n };\r\n\r\n const trimmed = raw.trim();\r\n if (!trimmed) return empty;\r\n\r\n if (/^dpl_[a-z0-9]+$/i.test(trimmed)) {\r\n return {\r\n kind: \"deployment_id\",\r\n previewUrl: null,\r\n inspectTarget: trimmed,\r\n deploymentId: trimmed,\r\n };\r\n }\r\n\r\n const url = tryParseUrl(trimmed);\r\n if (!url) return empty;\r\n\r\n if (VERCEL_HOST_RE.test(url.hostname)) {\r\n const hostUrl = url.origin;\r\n return {\r\n kind: \"deployment_host\",\r\n previewUrl: hostUrl,\r\n inspectTarget: hostUrl,\r\n deploymentId: null,\r\n };\r\n }\r\n\r\n if (url.hostname === \"vercel.com\" || url.hostname.endsWith(\".vercel.com\")) {\r\n const deploymentId =\r\n parseDeploymentsSegment(url) ?? parseDashboardDeployment(url);\r\n const inspectTarget =\r\n deploymentId && DPL_ID_RE.test(deploymentId) ? deploymentId : null;\r\n return {\r\n kind: \"dashboard\",\r\n previewUrl: null,\r\n inspectTarget,\r\n deploymentId,\r\n };\r\n }\r\n\r\n return empty;\r\n}\r\n\r\nexport function isDashboardVercelUrl(raw: string): boolean {\r\n return classifyVercelUrl(raw).kind === \"dashboard\";\r\n}\r\n", "// GitHub commit StatusContext rows for the Vercel GitHub app integration.\r\n\r\nimport { classifyVercelUrl } from \"./vercel-url.js\";\r\n\r\nexport type GitHubStatusState = \"success\" | \"pending\" | \"failure\" | \"error\" | \"unknown\";\r\n\r\nexport interface GitHubCommitStatusRow {\r\n context?: string | null;\r\n state?: string | null;\r\n target_url?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface GitHubVercelStatusContext {\r\n context: string;\r\n state: GitHubStatusState;\r\n targetUrl: string | null;\r\n description: string | null;\r\n deploymentId: string | null;\r\n previewUrl: string | null;\r\n dashboardUrl: string | null;\r\n}\r\n\r\nconst VERCEL_CONTEXT_RE = /vercel/i;\r\n\r\nexport function normalizeGitHubStatusState(state: unknown): GitHubStatusState {\r\n const value = typeof state === \"string\" ? state.trim().toLowerCase() : \"\";\r\n if (value === \"success\") return \"success\";\r\n if (value === \"pending\") return \"pending\";\r\n if (value === \"failure\") return \"failure\";\r\n if (value === \"error\") return \"error\";\r\n return \"unknown\";\r\n}\r\n\r\nexport function isVercelStatusContext(context: unknown): boolean {\r\n const label = typeof context === \"string\" ? context.trim() : \"\";\r\n return Boolean(label && VERCEL_CONTEXT_RE.test(label));\r\n}\r\n\r\nexport function pickVercelStatusContext(\r\n statuses: GitHubCommitStatusRow[] | null | undefined,\r\n): GitHubVercelStatusContext | null {\r\n const rows = Array.isArray(statuses) ? statuses : [];\r\n const vercelRows = rows.filter((row) => isVercelStatusContext(row.context));\r\n if (vercelRows.length === 0) return null;\r\n\r\n const score = (state: GitHubStatusState): number => {\r\n if (state === \"failure\" || state === \"error\") return 0;\r\n if (state === \"pending\") return 1;\r\n if (state === \"success\") return 2;\r\n return 1;\r\n };\r\n\r\n let best: GitHubCommitStatusRow | null = null;\r\n let bestScore = Infinity;\r\n for (const row of vercelRows) {\r\n const rowScore = score(normalizeGitHubStatusState(row.state));\r\n if (rowScore < bestScore) {\r\n best = row;\r\n bestScore = rowScore;\r\n }\r\n }\r\n if (!best) return null;\r\n\r\n const targetUrl =\r\n typeof best.target_url === \"string\" && best.target_url.trim()\r\n ? best.target_url.trim()\r\n : null;\r\n const classified = targetUrl ? classifyVercelUrl(targetUrl) : null;\r\n\r\n return {\r\n context: String(best.context ?? \"Vercel\").trim(),\r\n state: normalizeGitHubStatusState(best.state),\r\n targetUrl,\r\n description:\r\n typeof best.description === \"string\" && best.description.trim()\r\n ? best.description.trim()\r\n : null,\r\n deploymentId: classified?.deploymentId ?? null,\r\n previewUrl: classified?.previewUrl ?? null,\r\n dashboardUrl: classified?.kind === \"dashboard\" ? targetUrl : null,\r\n };\r\n}\r\n", "// Build merge-gate Vercel evidence from GitHub status and optional Vercel REST API.\r\n\r\nimport {\r\n fetchVercelDeploymentStatus,\r\n mapVercelReadyStateToEvidenceStatus,\r\n type VercelDeploymentLookupResult,\r\n} from \"./vercel-api.js\";\r\nimport {\r\n pickVercelStatusContext,\r\n type GitHubCommitStatusRow,\r\n type GitHubStatusState,\r\n type GitHubVercelStatusContext,\r\n} from \"./vercel-github-status.js\";\r\nimport {\r\n classifyVercelUrl,\r\n isInspectableVercelTarget,\r\n type ClassifiedVercelUrl,\r\n} from \"./vercel-url.js\";\r\n\r\nexport type VercelEvidenceStatus =\r\n | \"ready\"\r\n | \"building\"\r\n | \"error\"\r\n | \"unavailable\"\r\n | \"not_run\";\r\n\r\nexport interface VercelEvidenceResult {\r\n status: VercelEvidenceStatus;\r\n previewUrl: string | null;\r\n deploymentUrl: string | null;\r\n summary: string | null;\r\n observedAt: string | null;\r\n /** True when Vercel API lookup was not run (GitHub-only or missing token). */\r\n inspectSkipped: boolean;\r\n inspectReason: string | null;\r\n githubState: GitHubStatusState | null;\r\n vercelContext: string | null;\r\n}\r\n\r\n/** @deprecated Renamed \u2014 use VercelDeploymentLookupResult from vercel-api. */\r\nexport type VercelInspectCommandResult = VercelDeploymentLookupResult;\r\n\r\nexport type RunVercelDeploymentLookup = (\r\n target: string,\r\n) => Promise<VercelDeploymentLookupResult>;\r\n\r\n/** @deprecated Renamed \u2014 use RunVercelDeploymentLookup. */\r\nexport type RunVercelInspect = RunVercelDeploymentLookup;\r\n\r\nfunction mapGitHubStateToEvidence(state: GitHubStatusState): VercelEvidenceStatus {\r\n if (state === \"success\") return \"ready\";\r\n if (state === \"pending\") return \"building\";\r\n if (state === \"failure\" || state === \"error\") return \"error\";\r\n return \"unavailable\";\r\n}\r\n\r\nfunction evidenceSummary(parts: string[]): string {\r\n return parts.filter(Boolean).join(\"; \");\r\n}\r\n\r\n/**\r\n * Resolve the deployment lookup target. Never returns a vercel.com dashboard page URL.\r\n */\r\nexport function resolveVercelInspectTarget(rawUrl: string | null | undefined): {\r\n target: string | null;\r\n classified: ClassifiedVercelUrl | null;\r\n reason: string | null;\r\n} {\r\n const trimmed = typeof rawUrl === \"string\" ? rawUrl.trim() : \"\";\r\n if (!trimmed) {\r\n return { target: null, classified: null, reason: \"missing target_url\" };\r\n }\r\n\r\n const classified = classifyVercelUrl(trimmed);\r\n if (classified.inspectTarget && isInspectableVercelTarget(classified.inspectTarget)) {\r\n return { target: classified.inspectTarget, classified, reason: null };\r\n }\r\n\r\n if (classified.kind === \"dashboard\") {\r\n return {\r\n target: null,\r\n classified,\r\n reason: classified.deploymentId\r\n ? \"dashboard deployment id is not API-inspectable; trust GitHub Vercel status\"\r\n : \"dashboard URL is not valid for Vercel API lookup\",\r\n };\r\n }\r\n\r\n return { target: null, classified, reason: \"unrecognized Vercel URL\" };\r\n}\r\n\r\nexport function evidenceFromGitHubVercelStatus(\r\n statuses: GitHubCommitStatusRow[] | null | undefined,\r\n options: { observedAt?: string } = {},\r\n): VercelEvidenceResult {\r\n const observedAt = options.observedAt ?? new Date().toISOString();\r\n const row = pickVercelStatusContext(statuses);\r\n\r\n if (!row) {\r\n return {\r\n status: \"not_run\",\r\n previewUrl: null,\r\n deploymentUrl: null,\r\n summary: \"No Vercel GitHub status context on commit\",\r\n observedAt,\r\n inspectSkipped: true,\r\n inspectReason: \"no_vercel_status_context\",\r\n githubState: null,\r\n vercelContext: null,\r\n };\r\n }\r\n\r\n const status = mapGitHubStateToEvidence(row.state);\r\n const previewUrl = row.previewUrl ?? row.dashboardUrl;\r\n const deploymentUrl = row.previewUrl ?? row.dashboardUrl;\r\n\r\n return {\r\n status,\r\n previewUrl,\r\n deploymentUrl,\r\n summary: evidenceSummary([\r\n `GitHub ${row.context}=${row.state}`,\r\n row.description ?? \"\",\r\n row.dashboardUrl ? \"dashboard target_url (API lookup skipped)\" : \"\",\r\n ]),\r\n observedAt,\r\n inspectSkipped: true,\r\n inspectReason:\r\n row.dashboardUrl && row.state === \"success\"\r\n ? \"trusted_github_status_dashboard_url\"\r\n : row.dashboardUrl\r\n ? \"dashboard_url_not_api_inspectable\"\r\n : \"github_status_only\",\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n}\r\n\r\nexport interface CollectVercelEvidenceInput {\r\n statuses?: GitHubCommitStatusRow[] | null;\r\n /** When false, never call Vercel REST API (GitHub status only). Default path. */\r\n allowInspect?: boolean;\r\n /** @deprecated waitSeconds was for CLI inspect; ignored for API lookup. */\r\n waitSeconds?: number;\r\n runInspect?: RunVercelDeploymentLookup;\r\n observedAt?: string;\r\n}\r\n\r\n/**\r\n * Prefer GitHub Vercel StatusContext.state for gates. Call Vercel REST API only when\r\n * inspectable (deployment host or id), GitHub state is not terminal success, and\r\n * `allowInspect` is true with VERCEL_TOKEN configured.\r\n */\r\nexport async function collectVercelEvidence(\r\n input: CollectVercelEvidenceInput,\r\n): Promise<VercelEvidenceResult> {\r\n const observedAt = input.observedAt ?? new Date().toISOString();\r\n const base = evidenceFromGitHubVercelStatus(input.statuses ?? [], { observedAt });\r\n const row = pickVercelStatusContext(input.statuses ?? []);\r\n\r\n if (!row) return base;\r\n\r\n if (row.state === \"success\") {\r\n return {\r\n ...base,\r\n inspectSkipped: true,\r\n inspectReason: row.dashboardUrl\r\n ? \"trusted_github_status_dashboard_url\"\r\n : \"trusted_github_status\",\r\n };\r\n }\r\n\r\n if (!input.allowInspect) {\r\n return {\r\n ...base,\r\n inspectSkipped: true,\r\n inspectReason: \"api_lookup_disabled\",\r\n };\r\n }\r\n\r\n const { target, reason } = resolveVercelInspectTarget(row.targetUrl);\r\n if (!target) {\r\n return {\r\n ...base,\r\n inspectSkipped: true,\r\n inspectReason: reason ?? \"not_api_inspectable\",\r\n summary: evidenceSummary([\r\n base.summary ?? \"\",\r\n reason ?? \"skipped Vercel API lookup\",\r\n ]),\r\n };\r\n }\r\n\r\n const runLookup = input.runInspect ?? fetchVercelDeploymentStatus;\r\n const lookedUp = await runLookup(target);\r\n const observed = new Date().toISOString();\r\n\r\n if (!lookedUp.ok && lookedUp.error?.includes(\"VERCEL_TOKEN\")) {\r\n return {\r\n status: \"unavailable\",\r\n previewUrl: base.previewUrl,\r\n deploymentUrl: base.deploymentUrl,\r\n summary: \"VERCEL_TOKEN not configured for API fallback\",\r\n observedAt: observed,\r\n inspectSkipped: true,\r\n inspectReason: \"vercel_token_missing\",\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n }\r\n\r\n if (!lookedUp.ok) {\r\n return {\r\n status: row.state === \"pending\" ? \"building\" : \"error\",\r\n previewUrl: base.previewUrl,\r\n deploymentUrl: target.startsWith(\"http\") ? target : base.deploymentUrl,\r\n summary: evidenceSummary([\r\n `Vercel API lookup ${target} failed`,\r\n lookedUp.error ?? \"\",\r\n ]),\r\n observedAt: observed,\r\n inspectSkipped: false,\r\n inspectReason: null,\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n }\r\n\r\n const mapped = mapVercelReadyStateToEvidenceStatus(\r\n lookedUp.readyState,\r\n row.state === \"pending\",\r\n );\r\n const previewUrl =\r\n lookedUp.previewUrl ??\r\n (target.startsWith(\"http\") ? target : base.previewUrl);\r\n\r\n return {\r\n status: mapped,\r\n previewUrl,\r\n deploymentUrl: previewUrl ?? base.deploymentUrl,\r\n summary: evidenceSummary([\r\n `Vercel API ${target}=${lookedUp.readyState ?? \"unknown\"}`,\r\n mapped === \"ready\" ? \"preview ready\" : \"\",\r\n ]),\r\n observedAt: observed,\r\n inspectSkipped: false,\r\n inspectReason: null,\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n}\r\n\r\nexport type { GitHubVercelStatusContext };\r\n"],
5
- "mappings": ";;;;;;;;;;;AAAA,SAAS,cAAAA,aAAY,WAAW,gBAAAC,eAAc,aAAa,UAAU,qBAAqB;AAC1F,OAAO,UAAU;AAEV,SAAS,KAAK,SAAwB;AAC3C,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAChB;AAGO,SAAS,mBAAsD,MAAY;AAChF,MAAI,QAAQ,aAAa,QAAS,QAAO;AACzC,SAAO,EAAE,aAAa,MAAM,GAAG,KAAK;AACtC;AAEO,SAAS,SAAS,OAA2B,MAAsB;AACxE,MAAI,CAAC,MAAO,MAAK,WAAW,IAAI,EAAE;AAClC,SAAO;AACT;AAEO,SAAS,SAAS,MAAuB;AAC9C,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SAAY,MAAc,UAAiB;AACzD,MAAI;AACF,WAAO,KAAK,MAAMA,cAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,SAAS,OAAO;AACd,QAAI,UAAU,SAAS,EAAG,QAAO;AACjC,SAAK,kBAAkB,IAAI,KAAM,MAAgB,OAAO,EAAE;AAAA,EAC5D;AACF;AAEO,SAAS,UAAU,MAAc,OAAsB;AAC5D,YAAU,KAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACjD,gBAAc,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAC3D;AAEO,SAAS,SAAS,OAAmC;AAC1D,SACE,OAAO,SAAS,EAAE,EACf,YAAY,EACZ,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,YAAY,EAAE,KAAK;AAElC;AAEO,SAAS,cAAc,MAAsB;AAClD,SAAO,SAAS,IAAG,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,CAAC,IAAI,IAAI,EAAE;AACjG;AAMO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACvC;AAEO,SAAS,QAAQ,OAAuB;AAC7C,SAAO,OAAO,SAAS,EAAE,EACtB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEO,SAAS,SAAS,MAAsB;AAC7C,MAAI;AACF,WAAO,SAAS,IAAI,EAAE;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU,MAA6B;AACrD,MAAI;AACF,WAAO,SAAS,IAAI,EAAE,MAAM,YAAY;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SAAS,MAAc,OAAuB;AAC5D,MAAI,CAACD,YAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,OAAOC,cAAa,MAAM,MAAM;AACtC,SAAO,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI;AACjD;AAEO,SAAS,cAAc,MAAkC;AAC9D,SAAO,OAAOA,cAAa,KAAK,QAAQ,IAAI,GAAG,MAAM,IAAI;AAC3D;AASO,SAAS,QAAQ,IAAkB;AACxC,UAAQ,KAAK,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE;AACjE;AAGO,SAAS,aAAa,IAA2B;AACtD,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEO,SAAS,WAAW,KAAkC;AAC3D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,KAAa,QAA8B;AAC3E,MAAI;AACF,YAAQ,KAAK,CAAC,KAAK,MAAM;AAAA,EAC3B,QAAQ;AACN,YAAQ,KAAK,KAAK,MAAM;AAAA,EAC1B;AACF;AAEO,SAAS,UAAU,QAAyD;AACjF,MAAI,OAAsB;AAC1B,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAO;AACZ,UAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,QAAI,OAAO,SAAS,EAAE,KAAK,KAAK,QAAQ;AACtC,eAAS;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,QAAQ,IAAoB;AAC1C,SAAO,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI,IAAI,MAAM,GAAI,CAAC;AACzD;AAhJA;AAAA;AAAA;AAAA;AAAA;;;AC2CO,SAAS,wBAAwB,KAAsB;AAC5D,MAAI,kBAAkB,IAAI,GAAG,EAAG,QAAO;AACvC,SAAO,mBAAmB,KAAK,CAAC,WAAW,IAAI,SAAS,MAAM,CAAC;AACjE;AAEO,SAAS,2BAA2B,KAAkC;AAC3E,SAAO,OAAO,KAAK,GAAG,EAAE,OAAO,uBAAuB,EAAE,KAAK;AAC/D;AAEO,SAAS,eAAe,KAA2C;AACxE,QAAM,OAAO,EAAE,GAAG,IAAI;AACtB,aAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,QAAI,wBAAwB,GAAG,EAAG,QAAO,KAAK,GAAG;AAAA,EACnD;AACA,SAAO;AACT;AAOO,SAAS,eAAe,KAAwC;AACrE,QAAM,mBAAmB,2BAA2B,GAAG;AACvD,SAAO,EAAE,kBAAkB,MAAM,iBAAiB,WAAW,EAAE;AACjE;AAGO,SAAS,eAAe,KAA2C;AACxE,SAAO,eAAe,GAAG;AAC3B;AAzEA,IAKa,2BAiCP,mBAGA;AAzCN;AAAA;AAAA;AAKO,IAAM,4BAA4B;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,oBAAoB,IAAI,IAAY,yBAAyB;AAGnE,IAAM,qBAAqB,CAAC,WAAW,UAAU;AAAA;AAAA;;;ACzCjD,SAAS,iBAAiB;AAQnB,SAAS,IAAI,KAAa,MAAgB,UAAsB,CAAC,GAAW;AACjF,QAAM,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA,mBAAmB,EAAE,KAAK,UAAU,OAAgB,CAAC;AAAA,EACvD;AACA,MAAI,IAAI,WAAW,KAAK,CAAC,QAAQ,cAAc;AAC7C,UAAM,UAAU,OAAO,KAAK,KAAK,GAAG,CAAC,YAAY,IAAI,UAAU,IAAI,MAAM;AACzE,QAAI,QAAQ,WAAY,OAAM,IAAI,MAAM,OAAO;AAC/C,SAAK,OAAO;AAAA,EACd;AACA,SAAO,IAAI,UAAU;AACvB;AAEO,SAAS,cAAc,MAAoB;AAChD,MAAI,MAAM,CAAC,aAAa,iBAAiB,CAAC;AAC5C;AAEO,SAAS,eAAe,cAAgC;AAC7D,SAAO,IAAI,cAAc,CAAC,UAAU,SAAS,GAAG,EAAE,cAAc,KAAK,CAAC,EACnE,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AASO,SAAS,WAAW,KAAa,MAAkC;AACxE,MAAI;AACF,UAAM,MAAM;AAAA,MACZ;AAAA,MACA;AAAA,MACA,mBAAmB,EAAE,KAAK,UAAU,OAAgB,CAAC;AAAA,IACvD;AACE,WAAO;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,QAAQ,IAAI,UAAU;AAAA,MACtB,QAAQ,IAAI,UAAU;AAAA,MACtB,OAAO,IAAI,QAAQ,IAAI,MAAM,UAAU;AAAA,IACzC;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,cACd,KACA,UACA,YACsD;AACtD,QAAM,MAAM,WAAW,KAAK,CAAC,cAAc,iBAAiB,UAAU,UAAU,CAAC;AACjF,MAAI,IAAI,WAAW,EAAG,QAAO,EAAE,YAAY,MAAM,OAAO,KAAK;AAC7D,MAAI,IAAI,WAAW,EAAG,QAAO,EAAE,YAAY,OAAO,OAAO,KAAK;AAC9D,SAAO,EAAE,YAAY,MAAM,OAAO,IAAI,SAAS,IAAI,UAAU,IAAI,UAAU,cAAc,IAAI,MAAM,GAAG;AACxG;AAsBO,SAAS,mBAAmB,cAAsB,gBAA6C,eAA4B;AAChI,QAAM,UACJ,OAAO,kBAAkB,WAAW,EAAE,MAAM,cAAc,IAAI;AAChE,QAAM,YAAY,QAAQ,YAAY,KAAK,KAAK,QAAQ,MAAM,KAAK,KAAK;AACxE,QAAM,mBAAmB,QAAQ,YAAY,KAAK,KAAK;AAEvD,MAAI,CAAC,cAAc;AACjB,WAAO,gBAAgB,WAAW,uBAAuB;AAAA,EAC3D;AAEA,QAAM,OAAO,WAAW,cAAc,CAAC,aAAa,MAAM,CAAC;AAC3D,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,gBAAgB,WAAW,KAAK,SAAS,KAAK,UAAU,KAAK,UAAU,wBAAwB;AAAA,EACxG;AAEA,MAAI;AACJ,MAAI,kBAAkB;AACpB,cAAU;AAAA,EACZ,OAAO;AACL,UAAM,WAAW,WAAW,cAAc,CAAC,aAAa,SAAS,CAAC;AAClE,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,QACL;AAAA,QACA,SAAS,SAAS,SAAS,UAAU,SAAS,UAAU,qBAAqB,SAAS;AAAA,QACtF,KAAK,OAAO,KAAK;AAAA,MACnB;AAAA,IACF;AACA,cAAU,SAAS,OAAO,KAAK;AAAA,EACjC;AAEA,QAAM,UAAU,KAAK,OAAO,KAAK;AACjC,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,uBAAuB,cAAc,cAAc,SAAS,OAAO;AACzE,QAAM,uBAAuB,cAAc,cAAc,SAAS,OAAO;AACzE,QAAM,QAAQ,qBAAqB,SAAS,qBAAqB,SAAS;AAC1E,MAAI,qBAAqB,cAAc,QAAQ,qBAAqB,cAAc,MAAM;AACtF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,sBAAsB,qBAAqB;AAAA,MAC3C,sBAAsB,qBAAqB;AAAA,MAC3C,UAAU;AAAA,MACV,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,WAAgC,qBAAqB,aACvD,UACA,qBAAqB,aACnB,WACA;AAEN,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,sBAAsB,qBAAqB;AAAA,IAC3C,sBAAsB,qBAAqB;AAAA,IAC3C;AAAA,IACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B;AACF;AAEA,SAAS,gBAAgB,MAAc,OAAe,OAAsB,MAAmB;AAC7F,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAtLA;AAAA;AAAA;AACA;AAuLA;AAAA;AAAA;;;ACxLA,SAAS,eAAe;AACxB,OAAOC,WAAU;AAEV,SAAS,eAAe,OAAuB;AACpD,MAAI,UAAU,IAAK,QAAO,QAAQ;AAClC,MAAI,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,GAAG;AACrD,WAAOA,MAAK,KAAK,QAAQ,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA,EAC5C;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAuB;AACrD,SAAOA,MAAK,QAAQ,eAAe,KAAK,CAAC;AAC3C;AAEO,SAAS,eAAe,OAAuB;AACpD,QAAM,WAAW,eAAe,KAAK;AACrC,QAAM,WAAWA,MAAK,QAAQ,QAAQ;AACtC,QAAM,OAAOA,MAAK,QAAQ,QAAQ,CAAC;AAEnC,MAAI,aAAa,KAAM,QAAO;AAC9B,MAAI,SAAS,WAAW,GAAG,IAAI,GAAGA,MAAK,GAAG,EAAE,GAAG;AAC7C,WAAO,KAAKA,MAAK,SAAS,MAAM,QAAQ,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,EACrE;AAEA,QAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG;AACzC,QAAM,WAAW,MACd,QAAQ,0BAA0B,GAAG,EACrC,QAAQ,2BAA2B,GAAG,EAEtC,QAAQ,oCAAoC,GAAG,EAC/C,QAAQ,qCAAqC,GAAG;AACnD,SAAO;AACT;AAGO,SAAS,gBAAgB,OAAuB;AACrD,SAAO,eAAe,KAAK;AAC7B;AAtCA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAsB9B,SAAS,gBAAgB,UAAiC;AACxD,QAAM,UAAUD,MAAK,KAAK,UAAU,cAAc;AAClD,MAAI,CAACH,YAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,cAAa,SAAS,MAAM,CAAC;AACpD,WAAO,OAAO,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,IAAI;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,UAA2B;AAC9D,SAAO,gBAAgB,QAAQ,MAAM;AACvC;AAEO,SAAS,YAAY,UAAiC;AAC3D,QAAM,gBAAgBE,MAAK,QAAQ,QAAQ;AAC3C,MAAI,CAACH,YAAW,aAAa,EAAG,QAAO;AACvC,QAAM,QAAQ,WAAW,eAAe,CAAC,aAAa,iBAAiB,CAAC;AACxE,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,SAAO,KAAK,SAASG,MAAK,QAAQ,IAAI,IAAI;AAC5C;AAEA,SAAS,0BAA0B,YAAoB,YAAY,KAAoB;AACrF,MAAI,MAAMA,MAAK,QAAQC,eAAc,SAAS,CAAC;AAC/C,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,UAAM,UAAUD,MAAK,KAAK,KAAK,cAAc;AAC7C,QAAIH,YAAW,OAAO,GAAG;AACvB,UAAI;AACF,cAAM,MAAM,KAAK,MAAMC,cAAa,SAAS,MAAM,CAAC;AACpD,YAAI,IAAI,SAAS,sBAAuB,QAAO;AAAA,MACjD,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,SAASE,MAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,cACP,MACA,KACA,MACA,QACM;AACN,MAAI,CAAC,KAAM;AACX,QAAM,WAAWA,MAAK,QAAQ,IAAI;AAClC,MAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,MAAI,CAAC,qBAAqB,QAAQ,EAAG;AACrC,OAAK,IAAI,QAAQ;AACjB,MAAI,KAAK,EAAE,MAAM,UAAU,OAAO,CAAC;AACrC;AAEO,SAAS,8BAA8B,MAGlB;AAC1B,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAAsC,CAAC;AAE7C,gBAAc,MAAM,YAAY,YAAY,GAAG,GAAG,SAAS;AAE3D,QAAM,iBAAiB,0BAA0B,MAAM,oBAAoB,YAAY,GAAG;AAC1F,MAAI,gBAAgB;AAClB,kBAAc,MAAM,YAAY,YAAY,cAAc,GAAG,kBAAkB;AAAA,EACjF;AAEA,QAAM,OAAOD,SAAQ;AACrB,aAAW,OAAO,sBAAsB;AACtC,kBAAc,MAAM,YAAY,gBAAgBC,MAAK,KAAK,MAAM,GAAG,CAAC,GAAG,iBAAiB;AAAA,EAC1F;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,MAGH;AAC/B,SAAO,8BAA8B,IAAI,EAAE,CAAC,KAAK;AACnD;AA9GA,IAiBM;AAjBN;AAAA;AAAA;AAIA;AACA;AAYA,IAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACRO,SAAS,2BAA2B,KAAmD;AAC5F,QAAM,QAAQ,OAAO,IAAI,KAAK,EAAE,YAAY;AAC5C,MAAI,SAAS,WAAW,SAAS,QAAS,QAAO;AACjD,MAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AACnC,MAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,UAAU,EAAG,QAAO;AAChE,SAAO;AACT;AAEA,SAAS,QAAQ,KAAwB,KAA4B;AACnE,QAAM,QAAQ,IAAI,GAAG,GAAG,KAAK;AAC7B,SAAO,SAAS;AAClB;AAOO,SAAS,mBACd,MAAyB,QAAQ,KACjC,SAA4C,CAAC,GACxB;AACrB,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAa,OAAO,SAAS,KAAK;AACxC,MAAI,YAAY;AACd,WAAO;AAAA,MACL,SAAS,2BAA2B,UAAU;AAAA,MAC9C,QAAQ;AAAA,MACR,sBAAsB;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,KAAK,iBAAiB;AAC9C,MAAI,SAAS;AACX,WAAO;AAAA,MACL,SAAS,2BAA2B,OAAO;AAAA,MAC3C,QAAQ;AAAA,MACR,sBAAsB;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,KAAK,sBAAsB;AACvD,MAAI,aAAa;AACf,aAAS;AAAA,MACP,wBAAwB,WAAW;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,sBAAsB,QAAQ,WAAW;AAAA,IACzC;AAAA,EACF;AACF;AAEO,SAAS,yBACd,SAA4C,CAAC,GAC7C,MAAyB,QAAQ,KACd;AACnB,SAAO,mBAAmB,KAAK,MAAM,EAAE;AACzC;AA9EA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,gBAAAE,qBAAoB;AAC7B,OAAO,QAAQ;AAMR,SAAS,sBAAsB,aAA8B;AAClE,MAAI,gBAAgB,QAAW;AAC7B,UAAM,QAAQ,YAAY,MAAM,8BAA8B;AAC9D,QAAI,MAAO,QAAO,OAAO,MAAM,CAAC,CAAC,IAAI;AACrC,WAAO,GAAG,QAAQ;AAAA,EACpB;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,QAAI;AACF,YAAM,UAAUA,cAAa,iBAAiB,MAAM;AACpD,YAAM,QAAQ,QAAQ,MAAM,8BAA8B;AAC1D,UAAI,MAAO,QAAO,OAAO,MAAM,CAAC,CAAC,IAAI;AAAA,IACvC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,GAAG,QAAQ;AACpB;AAvBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,kBAAkB;AA4C9C,SAAS,YAAqB;AACnC,MAAI,QAAQ,aAAa,QAAS,QAAO;AACzC,aAAW,SAAS,CAAC,8BAA8B,eAAe,GAAG;AACnE,QAAI;AACF,UAAI,CAACD,YAAW,KAAK,EAAG;AACxB,YAAM,OAAOC,cAAa,OAAO,MAAM;AACvC,UAAI,iBAAiB,KAAK,IAAI,EAAG,QAAO;AAAA,IAC1C,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAuBO,SAAS,mBACd,UAAqC,CAAC,GACb;AACzB,QAAM,MAAM,QAAQ,aAAa,SAAY,UAAU,IAAI,QAAQ;AACnE,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAMC,SACJ,QAAQ,cAAc,KAAK,KAC3B,QAAQ,IAAI,uBAAuB,KAAK,KACxC;AACF,QAAM,iBAAiB,QAAQ,wBAAwB;AACvD,QAAM,qBACJ,QAAQ,4BAA4B;AAEtC,QAAM,SAAS,QAAQ,UAAU;AACjC,MAAI;AACJ,MAAI;AACF,YAAQ,OAAOA,MAAI;AAAA,EACrB,SAAS,OAAO;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAAA;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,QAAQ,qCAAqCA,MAAI,KAAM,MAAgB,OAAO;AAAA,MAC9E,YAAa,MAAgB;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,KAAK;AAC3D,QAAM,aAAa,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,KAAK;AAC5D,QAAM,cAAc,aAAa,KAAM,aAAa,aAAa,aAAc,MAAM;AACrF,QAAM,UAAU,YAAY;AAC5B,QAAM,eAAe,YAAY;AACjC,QAAM,KAAK,CAAC,WAAW,CAAC;AAExB,QAAM,WAAW,aAAa,OAAO,OAAO,OAAO,QAAQ,CAAC;AAC5D,MAAI,SAAwB;AAC5B,MAAI,CAAC,IAAI;AACP,UAAM,MAAM,eAAe,aAAa;AACxC,aACE,qBAAqBA,MAAI,OAAO,GAAG,KAAK,OAAO,gBACzC,eAAe,qBAAqB,kBAAkB,OAAO,OAAO,IAAI,uCAC9C,0BAA0B,CAAC;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAOO,SAAS,4BAAoC;AAClD,SACE;AAMJ;AA1JA,IAea,kCAIA,sCAEA;AArBb;AAAA;AAAA;AAeO,IAAM,mCAAmC,KAAK,OAAO,OAAO;AAI5D,IAAM,uCAAuC,KAAK,OAAO,OAAO;AAEhE,IAAM,yBAAyB;AAAA;AAAA;;;ACrBtC,SAAS,cAAAC,mBAAkB;AAyBpB,SAAS,sBAAsB,QAA8B,CAAC,GAA8B;AACjG,QAAMC,SAAO,MAAM,UAAU,KAAK,KAAK;AACvC,QAAM,iBAAiB,MAAM,qBAAqB;AAClD,QAAM,qBAAqB,MAAM,yBAAyB;AAC1D,QAAM,iBAAiB,MAAM,sBAAsB;AACnD,QAAM,qBAAqB,MAAM,0BAA0B;AAE3D,QAAM,QAAQD,YAAWC,MAAI;AAC7B,QAAM,YAAY,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,KAAK;AAC3D,QAAM,aAAa,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,KAAK;AAC5D,QAAM,cAAc,aAAa,KAAM,aAAa,aAAa,aAAc,MAAM;AACrF,QAAM,UAAU,YAAY;AAC5B,QAAM,eAAe,YAAY;AACjC,QAAM,UAAU,cAAc;AAC9B,QAAM,cAAc,cAAc;AAClC,QAAM,UAAU,CAAC,WAAW,CAAC,gBAAgB,CAAC,WAAW,CAAC;AAI1D,QAAM,UAAmC,MAAM,mBAC3C,OACA,mBAAmB,MAAM,OAAO;AAEpC,QAAM,KAAK,YAAY,UAAU,QAAQ,KAAK;AAE9C,MAAI,SAAwB;AAC5B,MAAI,CAAC,IAAI;AACP,aAAS;AAAA,MACP,eAAe,6BAA6B,kBAAkB,WAAW;AAAA,MACzE,UAAU,4BAA4B,cAAc,WAAW;AAAA,MAC/D,cAAc,+BAA+B,kBAAkB,MAAM;AAAA,MACrE,UAAU,0BAA0B,cAAc,MAAM;AAAA,MACxD,WAAW,CAAC,QAAQ,KAAK,QAAQ,SAAS;AAAA,IAC5C,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AA5EA,IAQM,yBACA,6BACA,0BACA;AAXN;AAAA;AAAA;AAEA;AAMA,IAAM,0BAA0B,KAAK,OAAO,OAAO;AACnD,IAAM,8BAA8B,KAAK,OAAO,OAAO;AACvD,IAAM,2BAA2B;AACjC,IAAM,gCAAgC;AAAA;AAAA;;;ACXtC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AAcV,SAAS,qBAAqB,MAAsB;AACzD,MAAI,WAAWA,MAAK,QAAQ,gBAAgB,KAAK,KAAK,CAAC,CAAC;AACxD,SAAO,yBAAyB,IAAIA,MAAK,SAAS,QAAQ,CAAC,GAAG;AAC5D,eAAWA,MAAK,QAAQ,QAAQ;AAAA,EAClC;AACA,SAAO;AACT;AAGO,SAAS,qBAA6B;AAC3C,QAAM,MAAM,QAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAC3D,MAAI,IAAK,QAAO,qBAAqB,GAAG;AACxC,QAAM,aAAa,eAAe,EAAE,aAAa,KAAK;AACtD,MAAI,WAAY,QAAO,qBAAqB,UAAU;AACtD,QAAM,aAAaA,MAAK,KAAKD,SAAQ,GAAG,WAAW,SAAS;AAC5D,MAAID,YAAW,UAAU,EAAG,QAAO;AACnC,MAAIA,YAAW,WAAW,EAAG,QAAO;AACpC,SAAO;AACT;AAEO,SAAS,eAAe,aAA6B;AAC1D,SAAOE,MAAK,KAAK,qBAAqB,WAAW,GAAG,MAAM;AAC5D;AAEO,SAAS,oBAAoB,aAA6B;AAC/D,SAAOA,MAAK,KAAK,qBAAqB,WAAW,GAAG,WAAW;AACjE;AAEO,SAAS,kBAAkB;AAChC,QAAM,cAAc,mBAAmB;AACvC,SAAO;AAAA,IACL;AAAA,IACA,SAAS,eAAe,WAAW;AAAA,IACnC,cAAc,oBAAoB,WAAW;AAAA,EAC/C;AACF;AAEO,SAAS,OAAO,SAAiB,IAAoB;AAC1D,SAAOA,MAAK,KAAK,SAAS,SAAS,EAAE,CAAC;AACxC;AAvDA,IAOM,aAEA;AATN;AAAA;AAAA;AAGA;AACA;AACA;AAEA,IAAM,cAAcA,MAAK,KAAKD,SAAQ,GAAG,aAAa,SAAS;AAE/D,IAAM,2BAA2B,oBAAI,IAAI,CAAC,QAAQ,WAAW,CAAC;AAAA;AAAA;;;ACT9D,SAAS,cAAAE,aAAY,eAAAC,cAAa,YAAAC,iBAAgB;AAClD,OAAOC,WAAU;AAgBV,SAAS,WAAW;AACzB,SAAO,gBAAgB;AACzB;AAEO,SAAS,QAAQ,IAA8B;AACpD,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,SAAO,SAA2BA,MAAK,KAAK,OAAW,SAAS,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC;AAC5F;AAOO,SAAS,iBAAqC;AACnD,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,SAAO,iBAAiB,OAAO;AACjC;AAEO,SAAS,6BAA6B,aAAyC;AACpF,SAAO,iBAAiB,eAAe,WAAW,CAAC;AACrD;AAEA,SAAS,oBAAoB,YAA6B;AACxD,MAAI;AACF,WAAOD,UAAS,UAAU,EAAE,YAAY;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,SAAqC;AAC7D,MAAI,CAACF,YAAW,OAAO,EAAG,QAAO,CAAC;AAClC,QAAM,OAA2B,CAAC;AAClC,aAAW,SAASC,aAAY,SAAS,EAAE,eAAe,KAAK,CAAC,GAAG;AACjE,QAAI,MAAM,SAAS,OAAQ;AAC3B,UAAMG,UAASD,MAAK,KAAK,SAAS,MAAM,IAAI;AAC5C,QAAI,CAAC,oBAAoBC,OAAM,EAAG;AAClC,UAAM,MAAM;AAAA,MACVD,MAAK,KAAKC,SAAQ,UAAU;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,KAAK,GAAI,MAAK,KAAK,GAAG;AAAA,EAC5B;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAAe,MAAmC;AAC3E,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,SAAO;AAAA,IACLD,MAAK,KAAK,OAAW,SAAS,SAAS,KAAK,CAAC,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,EAC1F;AACF;AAEO,SAAS,QAAQ,KAA6B;AACnD,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,YAAUA,MAAK,KAAK,OAAW,SAAS,IAAI,EAAE,GAAG,UAAU,GAAG,GAAG;AACnE;AAEO,SAAS,WAAW,OAAe,QAAmC;AAC3E,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,YAAUA,MAAK,KAAK,OAAW,SAAS,KAAK,GAAG,WAAW,OAAO,MAAM,aAAa,GAAG,MAAM;AAChG;AAEO,SAAS,aAAa,IAAoB;AAC/C,QAAM,EAAE,YAAY,IAAI,SAAS;AACjC,SAAO,eAAe,aAAa,EAAE;AACvC;AAEO,SAAS,eAAe,aAAqB,IAAoB;AACtE,SAAO,OAAW,eAAe,WAAW,GAAG,SAAS,EAAE,CAAC;AAC7D;AAxFA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA,SAAS,cAAAE,aAAY,eAAAC,oBAAmB;AACxC,OAAOC,WAAU;AAYV,SAAS,mBAAmB,KAAiC;AAClE,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,IAAI,SAAS,IAAI,CAAC;AAAA,EAC1B;AACA,QAAM,aAAaA,MAAK,KAAK,aAAa,IAAI,EAAE,GAAG,SAAS;AAC5D,MAAI,CAACF,YAAW,UAAU,EAAG,QAAO,CAAC,GAAG,KAAK;AAC7C,aAAW,SAASC,aAAY,YAAY,EAAE,eAAe,KAAK,CAAC,GAAG;AACpE,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAM,IAAI,SAAS,MAAM,IAAI,CAAC;AAAA,EAChC;AACA,SAAO,CAAC,GAAG,KAAK;AAClB;AAzBA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACDA,SAAS,mBAAmB,MAA8C;AACxE,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAQ,WAAW,GAAG,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,MAA8C;AAC7E,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAS,mBAAmB,OAAO;AACzC,MAAI,OAAQ,QAAO;AAEnB,QAAM,aAAwC,CAAC;AAC/C,QAAM,UAAU;AAChB,MAAI;AACJ,UAAQ,aAAa,QAAQ,KAAK,OAAO,OAAO,MAAM;AACpD,UAAM,YAAY,mBAAmB,WAAW,CAAC,KAAK,EAAE;AACxD,QAAI,UAAW,YAAW,KAAK,SAAS;AAAA,EAC1C;AAEA,QAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,QAAM,YAAY,QAAQ,YAAY,GAAG;AACzC,MAAI,cAAc,KAAK,YAAY,YAAY;AAC7C,UAAM,QAAQ,mBAAmB,QAAQ,MAAM,YAAY,YAAY,CAAC,CAAC;AACzE,QAAI,MAAO,YAAW,KAAK,KAAK;AAAA,EAClC;AAEA,SAAO,WAAW,SAAS,IAAI,WAAW,WAAW,SAAS,CAAC,IAAK;AACtE;AAMO,SAAS,oCACd,KACS;AACT,QAAM,WAAW,IAAI,eAAe,IAAI;AACxC,MAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,QAAI,OAAO,aAAa,UAAU;AAChC,YAAME,YAAW,wBAAwB,QAAQ;AACjD,aAAOA,cAAa,SAAS,KAAK,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,QAAQ,KAAK,IAAI;AACvE,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,WAAW,wBAAwB,OAAO;AAChD,MAAI,SAAU,QAAO;AAErB,SAAO;AACT;AA/DA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AA2BlC,SAAS,yBAAyB,OAA2C;AAClF,SAAO,UAAU;AACnB;AAOO,SAAS,iCAAiC,WAAqC;AACpF,MAAI,CAAC,yBAAyB,UAAU,kBAAkB,EAAG,QAAO;AACpE,MAAI,UAAU,wBAAwB,UAAa,UAAU,wBAAwB,MAAM;AACzF,WAAO,UAAU;AAAA,EACnB;AACA,QAAM,UAAU,UAAU,sBAAsB,KAAK;AACrD,SAAO,WAAW;AACpB;AAEO,SAAS,eAAe,MAA+B;AAC5D,QAAM,SAA0B;AAAA,IAC9B,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,oBAAoB,CAAC;AAAA,IACrB,yBAAyB;AAAA,IACzB,gBAAgB,CAAC;AAAA,EACnB;AACA,MAAI,CAACD,YAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,cAAc,KAAK,IAAI,IAAI;AACjC,QAAM,YAAY,IAAI,KAAK,WAAW,EAAE,YAAY;AACpD,QAAM,QAAQC,cAAa,MAAM,MAAM,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACnE,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,SAAS,IAAI;AAC3B,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG;AACjE,UAAM,MAAM;AACZ,WAAO;AACP,QAAI,IAAI,IAAI;AACV,YAAM,KAAK,OAAO,IAAI,EAAE;AACxB,YAAM,OAAO,KAAK,MAAM,EAAE;AAC1B,UAAI,OAAO,SAAS,IAAI,KAAK,OAAO,aAAa;AAC/C,eAAO,mBAAmB,KAAK;AAAA,UAC7B,MAAM;AAAA,UACN,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,eAAO,kBAAkB;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,IAAI,UAAU,UAAa,IAAI,UAAU,KAAM,QAAO,qBAAqB,OAAO,IAAI,KAAK;AAC/F,QAAI,IAAI,YAAY,UAAa,IAAI,YAAY,KAAM,QAAO,uBAAuB,OAAO,IAAI,OAAO;AACvG,QAAI,yBAAyB,OAAO,kBAAkB,GAAG;AACvD,aAAO,sBAAsB,oCAAoC,GAAG;AAAA,IACtE;AACA,WAAO,mBAAmB,IAAI,UAAU,OAAO,IAAI,OAAO,IAAI;AAC9D,QAAI,IAAI,uBAAuB,OAAO,IAAI,wBAAwB,YAAY,CAAC,MAAM,QAAQ,IAAI,mBAAmB,GAAG;AACrH,aAAO,0BAA0B,IAAI;AAAA,IACvC;AACA,QAAI,MAAM,QAAQ,IAAI,UAAU,GAAG;AACjC,aAAO,iBAAiB,IAAI,WAAW;AAAA,QACrC,CAACC,WACC,CAAC,CAACA,UACF,OAAOA,WAAU,YACjB,OAAQA,OAA+C,UAAU;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAlGA,IAwBM;AAxBN;AAAA;AAAA;AACA;AACA;AAsBA,IAAM,2BAA2B;AAAA;AAAA;;;ACcjC,SAAS,WAAW,OAA0C;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AACvC,SAAO,KAAK,QAAQ,WAAW,EAAE,EAAE,YAAY;AACjD;AAEA,SAAS,gBAAgB,OAAyB;AAChD,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU;AACd,MAAI;AACJ,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS;AACX,iBAAW;AACX,gBAAU;AACV;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,gBAAU;AACV;AAAA,IACF;AACA,QAAI,OAAO;AACT,UAAI,SAAS,MAAO,SAAQ;AAAA,UACvB,YAAW;AAChB;AAAA,IACF;AACA,QAAI,SAAS,OAAO,SAAS,KAAK;AAChC,cAAQ;AACR;AAAA,IACF;AACA,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,UAAI,SAAS;AACX,cAAM,KAAK,OAAO;AAClB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AACA,eAAW;AAAA,EACb;AACA,MAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,SAAO;AACT;AAEA,SAAS,SAAS,MAAyB;AACzC,QAAM,MAAM,WAAW,KAAK,CAAC,CAAC;AAC9B,SAAO,QAAQ,OAAO,YAAY,IAAI,GAAG,CAAC;AAC5C;AAEO,SAAS,yBAAyB,QAAqC;AAC5E,MAAI,CAAC,UAAU,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,GAAG,EAAG,QAAO;AACpE,SAAO,8CAA8C,KAAK,MAAM;AAClE;AAGO,SAAS,uBAAuB,QAAqC;AAC1E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,IAAI,OAAO,KAAK;AACtB,SAAO,EAAE,WAAW,GAAG,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,EAAE,SAAS,KAAK;AACnE;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,CAAC,MAAM,WAAW,SAAS,EAAG,QAAO;AACzC,QAAM,QAAQ,MAAM,MAAM,UAAU,MAAM;AAC1C,MAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,SAAS,KAAK,GAAG;AAC3E,WAAO,UAAU,KAAK;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAA0B;AACrD,QAAM,aAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,CAAC,MAAO;AACZ,QAAI,UAAU,MAAM;AAClB,iBAAW,KAAK,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;AACpC;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,UAAI,MAAM,SAAS,GAAG,EAAG;AACzB,UAAI,mBAAmB,IAAI,KAAK,EAAG,MAAK;AACxC;AAAA,IACF;AACA,eAAW,KAAK,KAAK;AAAA,EACvB;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAsD;AACpF,MAAI,UAAU;AACd,QAAM,MAAM,KAAK,IAAI,CAAC,UAAU;AAC9B,UAAM,QAAQ,eAAe,KAAK;AAClC,QAAI,UAAU,MAAO,WAAU;AAC/B,WAAO;AAAA,EACT,CAAC;AACD,QAAM,aAAa,oBAAoB,GAAG;AAC1C,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,CAAC,SAAS,MAAM,IAAI;AAC1B,QAAI,yBAAyB,MAAM,GAAG;AACpC,aAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,MAAM,QAAQ,SAAS,GAAG,GAAG,SAAS,KAAK;AAAA,IAC7E;AAAA,EACF;AACA,SAAO,EAAE,MAAM,KAAK,QAAQ;AAC9B;AAEO,SAAS,2BAA2B,SAAwD;AACjG,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS,QAAO,EAAE,SAAS,SAAS,SAAS,MAAM;AACxD,QAAM,SAAS,QAAQ,SAAS,IAAI,IAAI,SAAS,QAAQ,SAAS,IAAI,IAAI,SAAS;AACnF,QAAM,SAAS,QAAQ,MAAM,sBAAsB;AACnD,MAAI,UAAU;AACd,QAAM,mBAAmB,OAAO,IAAI,CAAC,UAAU;AAC7C,UAAM,OAAO,gBAAgB,MAAM,KAAK,CAAC;AACzC,QAAI,CAAC,KAAK,UAAU,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5C,UAAM,aAAa,gBAAgB,IAAI;AACvC,QAAI,WAAW,SAAS;AACtB,gBAAU;AACV,aAAO,WAAW,KAAK,KAAK,GAAG;AAAA,IACjC;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,CAAC,QAAS,QAAO,EAAE,SAAS,SAAS,SAAS,MAAM;AACxD,SAAO,EAAE,SAAS,iBAAiB,KAAK,MAAM,GAAG,SAAS,KAAK;AACjE;AAEO,SAAS,kBAAkB,MAAqD;AACrF,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,gBAAgB,KAAK,MAAM,+CAA+C;AAChF,MAAI,eAAe;AACjB,WAAO,EAAE,SAAS,cAAc,CAAC,GAAG,QAAQ,cAAc,CAAC,GAAG,KAAK,EAAE;AAAA,EACvE;AACA,QAAM,QAAQ,KAAK,MAAM,iCAAiC;AAC1D,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,SAAO,EAAE,SAAS,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,KAAK,EAAE;AACvD;AAEO,SAAS,uBAAuB,MAAiC;AACtE,QAAM,EAAE,SAAS,OAAO,IAAI,kBAAkB,IAAI;AAClD,MAAI,CAAC,QAAS,QAAO,EAAE,MAAM,kBAAkB;AAC/C,MAAI,uBAAuB,MAAM,GAAG;AAClC,WAAO,EAAE,MAAM,qBAAqB,SAAS,OAAO;AAAA,EACtD;AACA,MAAI,yBAAyB,MAAM,GAAG;AACpC,WAAO,EAAE,MAAM,aAAa,SAAS,OAAO;AAAA,EAC9C;AACA,SAAO,EAAE,MAAM,mBAAmB,SAAS,OAAO;AACpD;AAEO,SAAS,0BAA0B,MAA4D;AACpG,QAAM,EAAE,SAAS,OAAO,IAAI,kBAAkB,IAAI;AAClD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,uBAAuB,MAAM,GAAG;AAClC,UAAM,OAAO,GAAG,OAAQ,KAAK,CAAC;AAC9B,WAAO;AAAA,MACL,SAAS,OAAO,OAAO,SAAS,IAAI;AAAA,MACpC,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,UAAU,yBAAyB,MAAM,GAAG;AAC9C,WAAO;AAAA,MACL,SAAS,SAAS,MAAM,KAAK,OAAO;AAAA,MACpC,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,KAAuC;AAC9E,MACE,IAAI,SAAS,eACb,IAAI,SAAS,SAAS,kBAAkB,KACxC,IAAI,WAAW,gBACf;AACA,WACE;AAAA,EAGJ;AACA,MAAI,IAAI,SAAS,eAAe,IAAI,WAAW,IAAI,QAAQ;AACzD,WAAO,gBAAgB,IAAI,MAAM,KAAK,IAAI,OAAO,+CAA+C,IAAI,MAAM;AAAA,EAC5G;AACA,MAAI,IAAI,SAAS,uBAAuB,IAAI,SAAS;AACnD,UAAM,OAAO,IAAI,SAAS,GAAG,IAAI,OAAO,KAAK,CAAC,QAAQ;AACtD,WACE,uBAAuB,IAAI,UAAU,eAAe,6CACvC,IAAI,OAAO,SAAS,IAAI;AAAA,EAEzC;AACA,MAAI,IAAI,SAAS,gBAAgB,IAAI,SAAS;AAC5C,WAAO,mBAAmB,IAAI,OAAO,+FAA+F,IAAI,OAAO;AAAA,EACjJ;AACA,SAAO;AACT;AAGO,SAAS,8BAA8B,MAA6B;AACzE,QAAM,QAAQ,KAAK,MAAM,gEAAgE;AACzF,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,WAAW,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,GAAG,KAAK,CAAC;AACpD;AAEO,SAAS,0BAA0B,OAIxB;AAChB,QAAM,OACJ,MAAM,MAAM,KAAK,MAChB,MAAM,UAAU,8BAA8B,MAAM,OAAO,IAAI,SAChE;AACF,MAAI,MAAM;AACR,UAAM,MAAM,uBAAuB,IAAI;AACvC,UAAM,WAAW,yBAAyB,GAAG;AAC7C,QAAI,SAAU,QAAO;AACrB,UAAM,aAAa,0BAA0B,IAAI;AACjD,QAAI,YAAY,SAAS;AACvB,aAAO,oDAAoD,WAAW,OAAO;AAAA,IAC/E;AAAA,EACF;AACA,MAAI,MAAM,WAAW,oBAAoB,KAAK,MAAM,OAAO,GAAG;AAC5D,UAAM,aAAa,2BAA2B,MAAM,OAAO;AAC3D,QAAI,WAAW,SAAS;AACtB,aAAO,+CAA+C,WAAW,OAAO;AAAA,IAC1E;AACA,QAAI,MAAM,aAAa,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AA5QA,IAOM,aACA;AARN;AAAA;AAAA;AAOA,IAAM,cAAc,oBAAI,IAAI,CAAC,MAAM,WAAW,MAAM,CAAC;AACrD,IAAM,qBAAqB,oBAAI,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACeD,SAAS,KAAK,MAAc,MAAM,KAAa;AAC7C,QAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC3C,SAAO,IAAI,SAAS,MAAM,GAAG,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAC1D;AAEA,SAAS,kBAAkB,MAA8B;AACvD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAM,MAAM,QAAQ,YAAY,GAAG;AACnC,MAAI,SAAS,KAAK,MAAM,OAAO;AAC7B,QAAI;AACF,aAAO,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,IACjD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,wBAAwB,QAAyD;AAC/F,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,QAAM,OAAO,KAAK;AAClB,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,QAAM,MAAM,CAAC,QAAiB,OAAO,KAAK,GAAG,MAAM,WAAW,KAAK,GAAG,IAAI;AAC1E,QAAM,UAA2B;AAAA,IAC/B,MAAM,IAAI,MAAM;AAAA,IAChB,KAAK,IAAI,KAAK;AAAA,IACd,UAAU,IAAI,UAAU;AAAA,IACxB,MAAM,IAAI,MAAM;AAAA,IAChB,UAAU,IAAI,UAAU;AAAA,IACxB,OAAO,IAAI,OAAO;AAAA,EACpB;AACA,MACE,OAAO,KAAK,UAAU,YACtB,CAAC,QAAQ,YACT,CAAC,QAAQ,QACT,CAAC,QAAQ,YACT,CAAC,QAAQ,OACT,CAAC,QAAQ,MACT;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAgC;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,SAAU,OAAM,KAAK,GAAG,MAAM,QAAQ,WAAW;AAC3D,MAAI,MAAM,KAAM,OAAM,KAAK,GAAG,MAAM,IAAI,OAAO;AAC/C,MAAI,MAAM,SAAU,OAAM,KAAK,GAAG,MAAM,QAAQ,WAAW;AAC3D,MAAI,MAAM,IAAK,OAAM,KAAK,GAAG,MAAM,GAAG,MAAM;AAC5C,MAAI,MAAM,KAAM,OAAM,KAAK,GAAG,MAAM,IAAI,OAAO;AAC/C,QAAM,YAAY,MAAM,SAAS,MAAM,KAAK,IAAI,IAAI;AACpD,SAAO,cAAc,MAAM,KAAK,gBAAgB,MAAM,UAAU,IAAI,MAAM,KAAK,KAAK,SAAS;AAC/F;AAEA,SAAS,sBAAsB,QAAiC,QAAwB;AACtF,QAAM,MAAM,OAAO;AACnB,MAAI,SAAS,GAAG,GAAG;AACjB,UAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,QAAQ,KAAK,IAAI;AACvE,UAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,IAAI;AAC9D,QAAI,QAAS,QAAO,OAAO,GAAG,IAAI,KAAK,OAAO,KAAK;AACnD,QAAI,KAAM,QAAO;AAAA,EACnB;AACA,QAAM,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,QAAQ,KAAK,IAAI;AAC5E,MAAI,OAAQ,QAAO;AACnB,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAS,QAAO,KAAK,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAO,KAAK,SAAS,GAAG;AAC1E,SAAO;AACT;AAEO,SAAS,wBAAwB,OAIhB;AACtB,QAAM,WAAW,GAAG,MAAM,MAAM;AAAA,EAAK,MAAM,MAAM,GAAG,KAAK;AACzD,QAAM,SAAS,kBAAkB,QAAQ;AAEzC,MAAI,CAAC,UAAU,CAAC,SAAS,MAAM,GAAG;AAChC,UAAM,OAAO,KAAK,YAAY,QAAQ,MAAM,QAAQ,IAAI,GAAG;AAC3D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,SAAS,+CAA+C,IAAI;AAAA,MAC5D,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,SAAS,OAAO,KAAK,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,SAAS,6BAA6B,sBAAsB,QAAQ,MAAM,MAAM,CAAC;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,QAAQ,wBAAwB,MAAM;AAC5C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,KAAK,MAAM,UAAU,GAAG;AAC7C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,MAAM;AAAA,IAChB,SAAS,uBAAuB,KAAK;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,SAA0B;AACnD,SAAO,aAAa,KAAK,OAAO;AAClC;AAEA,SAAS,YAAY,SAA0B;AAC7C,SAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,kBAAkB,OAMH;AACtB,QAAM,YAAY,0BAA0B;AAAA,IAC1C,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,EAClB,CAAC;AAED,MAAI,MAAM,aAAa,GAAG;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,GAAG;AACxB,UAAM,WAAW,MAAM,UAAU,MAAM,aAAa,KAAK;AACzD,QAAI,WAAW,iBAAiB,KAAK,OAAO,GAAG;AAC7C,YAAMC,QAAO,KAAK,SAAS,GAAG;AAC9B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,aAAa,4BAA4BA,KAAI;AAAA,MACxD;AAAA,IACF;AACA,UAAM,aAAa,2BAA2B,MAAM,OAAO;AAC3D,UAAM,QACJ,WAAW,WAAW,CAAC,YAAY,kBAAkB,WAAW,OAAO,QAAQ;AACjF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SACE,aACA,gCAAgC,KAAK;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,MAAM,eAAe,MAAM,UAAU,MAAM,UAAU,QAAQ,MAAM,QAAQ,IAAI,GAAG;AACpG,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,MAAM;AAAA,IAChB,SAAS,aAAa,wBAAwB,MAAM,QAAQ,MAAM,IAAI;AAAA,EACxE;AACF;AAEO,SAAS,4BAA4B,OAMpB;AACtB,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,cAAc,MAAM,qBAAqB;AAE/C,MAAI,kBAAkB,MAAM,OAAO,GAAG;AACpC,UAAM,OAAO,OAAO,KAAK,KAAK,YAAY,KAAK,KAAK,OAAO,KAAK;AAChE,WAAO,wBAAwB;AAAA,MAC7B,UAAU,MAAM;AAAA,MAChB,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,YAAY,MAAM,OAAO,GAAG;AAC9B,WAAO,kBAAkB;AAAA,MACvB,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,0BAA0B;AAAA,IAChD,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,MAAI,mBAAmB,MAAM,aAAa,GAAG;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,GAAG;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,eAAe,UAAU,UAAU,QAAQ,MAAM,QAAQ,IAAI,GAAG;AAClF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,MAAM;AAAA,IAChB,SAAS,wBAAwB,MAAM,QAAQ,MAAM,IAAI;AAAA,EAC3D;AACF;AAlSA,IAmCM,cACA,WACA;AArCN;AAAA;AAAA;AAOA;AA4BA,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,mBAAmB;AAAA;AAAA;;;ACrCzB,SAAS,cAAAC,cAAY,gBAAAC,qBAAoB;AAiBzC,SAAS,kBAAkB,OAAoD;AAC7E,QAAM,OAAO,MAAM;AACnB,SAAQ,MAAM,aAAa,MAAM,OAAO,OAAO,IAAI,KAAK,IAAI,EAAE,YAAY,IAAI;AAGhF;AAGA,SAAS,uBAAuB,UAA8D;AAC5F,MAAI,CAAC,SAAU,QAAO;AACtB,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,QAAI,IAAI,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,IAAI,MAAM,GAAG,CAAC,WAAW,MAAM;AAC5C,aAAO,KAAK,SAAS,OAAO;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAsB,OAAsC;AACtF,SAAO,cAAc,MAAM,UAAU,MAAM,WAAW,MAAM,mBAAmB;AAC/E,MAAI,MAAM,UAAU;AAClB,WAAO,QAAQ,OAAO,MAAM,UAAU,MAAM,oBAAoB,qBAAqB;AAAA,EACvF;AACF;AAEA,SAAS,4BACP,OACmG;AACnG,MAAI,MAAM,SAAS,eAAe,MAAM,YAAY,YAAa,QAAO;AACxE,QAAM,WACJ,MAAM,aAAa,OAAO,MAAM,cAAc,YAAY,CAAC,MAAM,QAAQ,MAAM,SAAS,IACnF,MAAM,YACP;AACN,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,WAAW;AACjB,QAAM,OAAO,SAAS;AACtB,QAAM,UACJ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,KAAK,OAAQ,KAAiC,YAAY,WAC7G,OAAQ,KAAiC,OAAO,IAChD;AACN,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO;AAC3E,QAAM,OAAQ,OAAmC,WAAY,OAAmC;AAChG,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,QAAO;AACrE,QAAM,MAAM;AACZ,QAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACtD,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACtD,aAAa,OAAO,IAAI,sBAAsB,WAAW,IAAI,oBAAoB;AAAA,EACnF;AACF;AAEA,SAAS,kBAAkB,QAAsB,SAAoC;AACnF,MAAI,QAAQ,SAAS,aAAa,QAAQ,SAAS,oBAAqB;AACxE,SAAO,mBAAmB;AAC5B;AAOO,SAAS,mBAAmB,MAA4B;AAC7D,QAAM,SAAuB;AAAA,IAC3B,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,IACP,kBAAkB;AAAA,EACpB;AACA,MAAI,CAACD,aAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,QAAQC,cAAa,MAAM,MAAM,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACnE,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,SAAS,IAAI;AAC3B,QAAI,CAAC,MAAO;AACZ,UAAM,KAAK,kBAAkB,KAAK;AAClC,QAAI,IAAI;AACN,aAAO,iBAAiB;AACxB,aAAO,cAAc;AAAA,IACvB;AACA,QACE,MAAM,SAAS,kBACf,MAAM,SACN,OAAO,MAAM,UAAU,YACtB,MAAM,MAAkC,SAAS,uBAClD;AACA,YAAM,QAAS,MAAM,MAAkC;AACvD,UAAI,OAAO,SAAS,WAAY,QAAO,cAAc,OAAO,MAAM,QAAQ,MAAM;AAAA,IAClF;AACA,QAAI,MAAM,SAAS,eAAe,MAAM,WAAW,OAAO,MAAM,YAAY,UAAU;AACpF,YAAM,UAAW,MAAM,QAAoC;AAC3D,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,cAAM,OAAO,QAAQ,KAAK,CAAC,SAAS,MAAM,SAAS,UAAU;AAC7D,YAAI,KAAM,QAAO,cAAc,OAAO,KAAK,QAAQ,OAAO,WAAW;AAAA,MACvE;AAAA,IACF;AACA,QAAI,MAAM,SAAS,eAAe,MAAM,YAAY,WAAW;AAC7D,YAAM,WACJ,MAAM,aAAa,OAAO,MAAM,cAAc,YAAY,CAAC,MAAM,QAAQ,MAAM,SAAS,IACnF,MAAM,YACP;AACN,YAAM,OAAO,uBAAuB,QAAQ;AAC5C,UAAI,KAAM,QAAO,cAAc;AAAA,IACjC;AACA,UAAM,QAAQ,4BAA4B,KAAK;AAC/C,QAAI,OAAO;AACT;AAAA,QACE;AAAA,QACA,4BAA4B;AAAA,UAC1B,SAAS,MAAM;AAAA,UACf,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,mBAAmB,MAAM;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,MAAM,SAAS,UAAU;AAC3B,yBAAmB,QAAQ,KAAK;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,MAA4B;AAC5D,SAAO,mBAAmB,IAAI;AAChC;AAEO,SAAS,4BAA4B,OAAoD;AAC9F,QAAM,QAAQ,4BAA4B,KAAK;AAC/C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,4BAA4B;AAAA,IAC1C,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,mBAAmB,MAAM;AAAA,EAC3B,CAAC;AACD,QAAM,MAAM,QAAQ,MAAM,OAAO,EAAE,MAAM,GAAG,GAAG;AAC/C,MAAI,QAAQ,SAAS,kBAAkB;AACrC,WAAO,oBAAoB,QAAQ,OAAO,GAAG,MAAM,SAAM,GAAG,KAAK,EAAE;AAAA,EACrE;AACA,MAAI,QAAQ,SAAS,qBAAqB;AACxC,WAAO,uBAAuB,QAAQ,OAAO,GAAG,MAAM,SAAM,GAAG,KAAK,EAAE;AAAA,EACxE;AACA,MAAI,QAAQ,SAAS,mBAAmB;AACtC,WAAO,oBAAoB,QAAQ,OAAO,GAAG,MAAM,SAAM,GAAG,KAAK,EAAE;AAAA,EACrE;AACA,SAAO,sBAAsB,MAAM,SAAM,GAAG,KAAK,EAAE;AACrD;AAEO,SAAS,eAAe,OAAoD;AACjF,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS;AAC5C,WAAO,WAAW,MAAM,OAAO,KAAK,OAAO,MAAM,UAAU,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK;AAAA,EACrF;AACA,MAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU;AACnF,UAAM,OAAQ,MAAM,MAAkC;AACtD,QAAI,SAAS,uBAAuB;AAClC,YAAM,QAAS,MAAM,MAAkC;AACvD,UAAI,OAAO,SAAS,WAAY,QAAO,gBAAgB,MAAM,IAAI;AAAA,IACnE;AACA,QAAI,SAAS,uBAAuB;AAClC,YAAM,QAAS,MAAM,MAAkC;AACvD,UAAI,OAAO,aAAc,QAAO,gBAAgB,MAAM,YAAY;AAAA,IACpE;AACA,QAAI,SAAS,eAAgB,QAAO;AACpC,WAAO,OAAO,WAAW,IAAI,MAAM;AAAA,EACrC;AACA,MAAI,MAAM,SAAS,eAAe,MAAM,WAAW,OAAO,MAAM,YAAY,UAAU;AACpF,UAAM,UAAW,MAAM,QAAoC;AAC3D,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAM,OAAO,QAAQ,KAAK,CAAC,SAAS,MAAM,SAAS,MAAM;AACzD,UAAI,KAAM,QAAO,eAAe,QAAQ,OAAO,KAAK,QAAQ,EAAE,CAAC,CAAC;AAChE,YAAM,OAAO,QAAQ,KAAK,CAAC,SAAS,MAAM,SAAS,UAAU;AAC7D,UAAI,KAAM,QAAO,UAAU,KAAK,IAAI,IAAI,KAAK,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,MAAM,SAAS,UAAU,MAAM,iBAAiB;AAClD,UAAM,SAAS,MAAM;AACrB,WAAO,wBAAwB,KAAK,UAAU,OAAO,UAAU,EAAE,CAAC,WAAW,KAAK,UAAU,OAAO,UAAU,EAAE,CAAC;AAAA,EAClH;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,UAAM,UAAU,OAAO,MAAM,WAAW,EAAE;AAC1C,UAAM,eACJ,YAAY,cAAc,4BAA4B,KAAK,IAAI;AACjE,QAAI,aAAc,QAAO;AACzB,UAAM,WACJ,MAAM,aAAa,OAAO,MAAM,cAAc,YAAY,CAAC,MAAM,QAAQ,MAAM,SAAS,IACnF,MAAM,YACP;AACN,UAAM,OAAO,uBAAuB,QAAQ,KAAK;AACjD,WAAO,SAAS,OAAO,KAAK,IAAI;AAAA,EAClC;AACA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO,YAAY,MAAM,WAAW,EAAE,IAAI,QAAQ,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC,GAAG,KAAK;AAAA,EACvF;AACA,SAAO;AACT;AA7NA;AAAA;AAAA;AACA;AAIA;AAAA;AAAA;;;ACwDA,SAASC,MAAK,WAAmB,MAAM,KAAa;AAClD,QAAMC,WAAU,UAAU,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACpD,SAAOA,SAAQ,SAAS,MAAM,GAAGA,SAAQ,MAAM,GAAG,MAAM,CAAC,CAAC,WAAMA;AAClE;AAOO,SAAS,oBACd,WAC2B;AAC3B,QAAM,QAAQ,aAAa,IAAI,KAAK;AACpC,MAAI,CAAC,KAAM,QAAO;AAClB,aAAW,WAAW,kBAAkB;AACtC,QAAI,QAAQ,KAAK,KAAK,IAAI,GAAG;AAC3B,aAAO,EAAE,SAAS,MAAM,QAAQ,GAAG,QAAQ,KAAK,KAAKD,MAAK,IAAI,CAAC,GAAG;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AACT;AAlFA,IA6BM;AA7BN;AAAA;AAAA;AA6BA,IAAM,mBAAqC;AAAA,MACzC;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACvCA,SAAS,WAAW,OAA+B;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,EAAE,SAAS;AAC5D,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAe,EAAE,SAAS;AAC5E,SAAO;AACT;AAEA,SAAS,0BAA0B,UAAyD;AAC1F,MAAI,CAAC,UAAU,QAAS,QAAO;AAC/B,MAAI,SAAS,yBAAyB,MAAO,QAAO;AACpD,SAAO,WAAW,SAAS,IAAI;AACjC;AAEA,SAAS,qBACP,MACA,kBACA,YACQ;AACR,QAAM,QAAkB,CAAC,6BAA6B;AACtD,MAAI,SAAS,iBAAiB,SAAS,QAAQ;AAC7C,UAAM;AAAA,MACJ,GAAG,gBAAgB,sBAAsB,qBAAqB,IAAI,KAAK,GAAG;AAAA,IAC5E;AAAA,EACF;AACA,OAAK,SAAS,qBAAqB,SAAS,WAAW,YAAY;AACjE,UAAM,MAAM,WAAW,SAAS,KAAK,WAAW,MAAM,GAAG,EAAE,IAAI;AAC/D,UAAM,KAAK,UAAU,GAAG,qCAAqC;AAAA,EAC/D;AACA,QAAM,KAAK,qFAAgF;AAC3F,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,0BAA0B,OAMP;AACjC,MAAI,MAAM,SAAS,eAAe,MAAM,WAAW,EAAG,QAAO;AAE7D,QAAM,oBAAoB,MAAM,gBAAgB,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;AAClF,QAAM,aAAa,WAAW,MAAM,UAAU,KAAK,0BAA0B,MAAM,WAAW;AAC9F,QAAM,iBAAiB,mBAAmB;AAC1C,QAAM,oBAAoB,QAAQ,UAAU;AAE5C,MAAI,CAAC,kBAAkB,CAAC,mBAAmB;AACzC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,OACJ,kBAAkB,oBAAoB,SAAS,iBAAiB,gBAAgB;AAElF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,iBAAiB,qBAAqB,MAAM,kBAAkB,UAAU;AAAA,EAC1E;AACF;AAjGA;AAAA;AAAA;AAAA;AAAA;;;ACsBA,SAASE,YAAW,OAA+B;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEA,SAASC,gBAAe,OAAyB;AAC/C,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,EAAE,SAAS;AAC5D,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAe,EAAE,SAAS;AAC5E,SAAO;AACT;AAEA,SAAS,uBAAuB,UAA0C;AACxE,MAAID,YAAW,SAAS,UAAU,EAAG,QAAO;AAC5C,MAAIA,YAAW,SAAS,KAAK,EAAG,QAAO;AACvC,MAAIA,YAAW,SAAS,kBAAkB,EAAG,QAAO;AACpD,MAAIA,YAAW,SAAS,SAAS,EAAG,QAAO;AAC3C,QAAM,WAAW,SAAS;AAC1B,MAAI,UAAU,WAAW,SAAS,yBAAyB,SAASA,YAAW,SAAS,IAAI,GAAG;AAC7F,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,oBAAoB,UAAuD;AACzF,MAAI,CAACC,gBAAe,SAAS,WAAW,EAAG,QAAO,EAAE,SAAS,MAAM;AACnE,MAAI,SAAS,aAAa,WAAW,EAAG,QAAO,EAAE,SAAS,MAAM;AAChE,MAAI,CAAC,uBAAuB,QAAQ,GAAG;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,gBAAgB,SAAS,aAAa,MAAM;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,gBAAgB,SAAS,aAAa,MAAM;AAAA,EACtD;AACF;AAEO,SAAS,uBAAuB,SAAmD;AACxF,MAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,SAAO,QAAQ,UAAU,QAAQ,UAAU;AAC7C;AAxEA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAASC,oBAAmB,MAA8C;AACxE,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAQ,WAAW,GAAG,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyBC,SAAyC;AACzE,QAAM,MACJA,QAAO,0BACPA,QAAO,4BACPA,QAAO,aACPA,QAAO;AACT,SAAO,MAAM,QAAQ,GAAG,IAAI,IAAI,SAAS;AAC3C;AAEO,SAAS,uCACd,OACgC;AAChC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,SAASD,oBAAmB,OAAO;AACzC,MAAI,OAAQ,QAAO;AAEnB,QAAM,aAAwC,CAAC;AAE/C,QAAM,UAAU;AAChB,MAAI;AACJ,UAAQ,aAAa,QAAQ,KAAK,OAAO,OAAO,MAAM;AACpD,UAAM,YAAYA,oBAAmB,WAAW,CAAC,KAAK,EAAE;AACxD,QAAI,UAAW,YAAW,KAAK,SAAS;AAAA,EAC1C;AAEA,QAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,QAAM,YAAY,QAAQ,YAAY,GAAG;AACzC,MAAI,cAAc,KAAK,YAAY,YAAY;AAC7C,UAAM,QAAQA,oBAAmB,QAAQ,MAAM,YAAY,YAAY,CAAC,CAAC;AACzE,QAAI,MAAO,YAAW,KAAK,KAAK;AAAA,EAClC;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,MAAI,OAAO,WAAW,WAAW,SAAS,CAAC;AAC3C,MAAI,YAAY,yBAAyB,IAAI;AAC7C,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,yBAAyB,SAAS;AAChD,QAAI,QAAQ,WAAW;AACrB,aAAO;AACP,kBAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AA9DA;AAAA;AAAA;AAAA;AAAA;;;ACmCA,SAASE,YAAW,OAA+B;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,IAAI,MAAM,KAAK;AACrB,SAAO,EAAE,SAAS,IAAI;AACxB;AAEA,SAASC,gBAAe,OAAyB;AAC/C,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,EAAE,SAAS;AAC5D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAe,EAAE,SAAS;AAC5E,SAAO;AACT;AAEA,SAAS,eAAe,KAA4B;AAClD,QAAM,IAAI,IACP,KAAK,EACL,MAAM,qDAAqD;AAC9D,MAAI,CAAC,EAAG,QAAOD,YAAW,GAAG;AAC7B,SAAO,sBAAsB,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAChD;AAEA,SAAS,YAAY,KAAqB;AACxC,QAAM,IAAI,IACP,KAAK,EACL,MAAM,qDAAqD;AAC9D,MAAI,CAAC,EAAG,QAAO,IAAI,KAAK,EAAE,YAAY;AACtC,SAAO,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;AAC3C;AAEA,SAAS,oBAAoB,aAAgD;AAC3E,MAAIE,UAAyC;AAC7C,MAAI,OAAO,gBAAgB,UAAU;AACnC,UAAM,WAAW,uCAAuC,WAAW;AACnE,QAAI,SAAU,CAAAA,UAAS;AAAA,EACzB,WAAW,eAAe,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AACxF,IAAAA,UAAS;AAAA,EACX;AACA,MAAI,CAACA,QAAQ,QAAO,CAAC;AACrB,QAAM,MAAMA,QAAO,0BAA0BA,QAAO;AACpD,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,MAAgC,CAAC;AACvC,aAAW,QAAQ,KAAK;AACtB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG;AAC9D,UAAM,MAAM;AACZ,UAAM,QAAQ,eAAe,OAAO,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;AAClE,UAAM,UAAUF,YAAW,IAAI,OAAO;AACtC,QAAI,CAAC,SAAU,YAAY,YAAY,YAAY,aAAa,YAAY,UAAY;AACxF,QAAI,KAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA,aAAaA,YAAW,IAAI,eAAe,IAAI,YAAY;AAAA,MAC3D,QAAQA,YAAW,IAAI,MAAM;AAAA,IAC/B,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGA,SAAS,qBAAqB,UAAiC,aAAgC;AAC7F,QAAM,OAAiB,CAAC;AACxB,QAAM,eAAe,eAAeA,YAAW,SAAS,KAAK,KAAK,EAAE;AACpE,MAAI,aAAc,MAAK,KAAK,YAAY;AACxC,MAAI,eAAe,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AACjF,UAAME,UAAS;AACf,UAAM,KAAK,eAAe,OAAOA,QAAO,SAASA,QAAO,UAAU,EAAE,CAAC;AACrE,QAAI,GAAI,MAAK,KAAK,EAAE;AAAA,EACtB;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAEO,SAAS,4BAA4B,OAIX;AAC/B,QAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,QAAM,cAAc,MAAM,eAAe,SAAS;AAElD,MACE,CAAC,SAAS,eACV,SAAS,aAAa,WAAW,KACjC,CAAC,SAAS,yBACV;AACA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AACA,MAAI,CAACD,gBAAe,WAAW,GAAG;AAChC,UAAM,gBACJ,SAAS,mCACR,SAAS,eACR,QAAQ,SAAS,uBAAuB,KACxC,SAAS,aAAa,SAAS;AACnC,QAAI,iBAAiB,SAAS,aAAa,SAAS,GAAG;AACrD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ,oDAAoD,SAAS,aAAa,KAAK,IAAI,CAAC;AAAA,MAC9F;AAAA,IACF;AACA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,QAAM,iCACJ,SAAS,mCACR,SAAS,eACR,QAAQ,SAAS,uBAAuB,KACxC,SAAS,aAAa,SAAS;AAEnC,MAAI,CAAC,kCAAkC,CAAC,SAAS,yBAAyB;AACxE,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAEA,QAAM,eAAe,SAAS,0BAC1B,eAAeD,YAAW,SAAS,WAAW,KAAK,EAAE,MACpD,SAAS,aAAa,WAAW,IAC9B,eAAe,SAAS,aAAa,CAAC,CAAE,IACxC,QACJ;AACJ,MAAI,cAAc;AAChB,UAAM,YAAY,qBAAqB,UAAU,WAAW;AAC5D,UAAM,aACJ,eACA,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,KACzB,YAAwC,+BAA+B;AAC1E,QAAI,CAAC,YAAY;AACf,iBAAW,MAAM,WAAW;AAC1B,YAAI,OAAO,cAAc;AACvB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ,uCAAuC,EAAE,gCAAgC,YAAY;AAAA,UAC/F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAMG,kBAAiB,oBAAoB,WAAW;AACtD,UAAM,QAAQA,gBAAe,KAAK,CAAC,MAAM,EAAE,UAAU,YAAY;AACjE,QACE,CAAC,SACA,MAAM,YAAY,YACjB,EAAE,MAAM,QAAQ,KAAK,MAAM,MAAM,YAAY,aAAa,MAAM,YAAY,aAC9E;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ,0CAA0C,YAAY;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,oBAAoB,WAAW;AACtD,QAAM,QAAQ,IAAI;AAAA,IAChB,eAAe,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAU;AAAA,EAC9D;AACA,QAAM,YAAY,IAAI;AAAA,IACpB,SAAS,aAAa,IAAI,CAAC,MAAM,YAAY,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,OAAO;AAAA,EACtF;AACA,QAAM,cAAc,qBAAqB,UAAU,WAAW;AAE9D,MAAI,SAAS,aAAa;AACxB,eAAW,MAAM,aAAa;AAC5B,UAAI,UAAU,OAAO,KAAK,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC,GAAG;AACzD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,6CAA6C,EAAE;AAAA,QACzD;AAAA,MACF;AACA,UAAI,UAAU,SAAS,GAAG;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,aAAa,WAAW,EAAG,QAAO,EAAE,SAAS,MAAM;AAEhE,QAAM,UAAoB,CAAC;AAC3B,aAAW,UAAU,SAAS,cAAc;AAC1C,UAAM,MAAM,YAAY,eAAe,MAAM,KAAK,MAAM;AACxD,UAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,QAAI,CAAC,OAAO;AACV,cAAQ,KAAK,GAAG;AAChB;AAAA,IACF;AACA,QAAI,MAAM,YAAY,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvD,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,QAAQ,MAAM,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,IACrC,iCACA;AAAA,MACJ,QAAQ,wCAAwC,QAAQ,KAAK,IAAI,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEO,SAAS,+BACd,SACoB;AACpB,MAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,SAAO,QAAQ,UAAU,QAAQ;AACnC;AAtPA;AAAA;AAAA;AAEA;AAAA;AAAA;;;AC8NO,SAAS,iBAAiB,OAqBb;AAClB,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,MAAM,qBAAqB,CAAC,mCAAmC,MAAM,iBAAiB,GAAG;AAC3F,WAAO,EAAE,OAAO,WAAW,QAAQ,MAAM,kBAAkB;AAAA,EAC7D;AACA,MAAI,MAAM,aAAa;AACrB,QAAI,MAAM,aAAa,gCAAgC,MAAM,WAAW,GAAG;AACzE,aAAO,EAAE,OAAO,QAAQ,QAAQ,4CAA4C;AAAA,IAC9E;AACA,UAAM,kBAAkB;AAAA,MACtB,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM,gBAAgB,CAAC;AAAA,MACrC,aAAa,MAAM,eAAe;AAAA,MAClC,OAAO,MAAM,SAAS;AAAA,IACxB;AACA,UAAM,UAAU,oBAAoB,eAAe;AACnD,QAAI,QAAQ,SAAS;AACnB,YAAM,SAAS,uBAAuB,OAAO;AAC7C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,QAAQ,SACZ,oBAAoB,QAAQ,MAAM,MAAM,MAAM,KAC9C,oBAAoB,MAAM;AAAA,MAChC;AAAA,IACF;AACA,QAAI,MAAM,iBAAiB;AACzB,YAAM,kBAAkB,4BAA4B;AAAA,QAClD,UAAU,MAAM;AAAA,QAChB,UAAU;AAAA,QACV,aAAa,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,iBAAiB,+BAA+B,eAAe;AACrE,UAAI,gBAAgB;AAClB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ,gBAAgB,SACpB,qBAAqB,gBAAgB,MAAM,MAAM,cAAc,KAC/D,qBAAqB,cAAc;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,OAAO,QAAQ,QAAQ,wBAAwB;AAAA,EAC1D;AACA,MAAI,CAAC,MAAM,OAAO;AAChB,QAAI,uBAAuB,KAAK,GAAG;AACjC,aAAO,EAAE,OAAO,QAAQ,QAAQ,gCAAgC;AAAA,IAClE;AAIA,UAAM,aAAa,oBAAoB,MAAM,KAAK;AAClD,QAAI,WAAY,QAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAO;AACrE,UAAM,UAAU,0BAA0B;AAAA,MACxC,OAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,IACrB,CAAC;AACD,QAAI,SAAS,aAAa;AACxB,YAAMC,QAAO,MAAM,OAAO,KAAK;AAC/B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQA,QAAO,GAAG,QAAQ,eAAe,KAAKA,KAAI,MAAM,QAAQ;AAAA,MAClE;AAAA,IACF;AACA,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,OACJ,0CAA0C,IAAI,KAC9C,SAAS,mBAAmB;AAAA,IAClC;AAAA,EACF;AACA,MAAI,MAAM,kBAAkB;AAC1B,WAAO,EAAE,OAAO,WAAW,QAAQ,sCAAsC,MAAM,gBAAgB,GAAG;AAAA,EACpG;AACA,QAAM,UAAU,MAAM,YAAY,KAAK,MAAM,MAAM,SAAS,IAAI;AAChE,MACE,CAAC,MAAM,gBACP,MAAM,gBAAgB,KACtB,MAAM,mBAAmB,KACzB,OAAO,SAAS,OAAO,KACvB,MAAM,UAAU,aAChB;AACA,WAAO,EAAE,OAAO,mBAAmB,QAAQ,yBAAyB,QAAQ,OAAO,CAAC,gBAAgB;AAAA,EACtG;AACA,QAAM,QAAQ,MAAM,iBAAiB,KAAK,MAAM,MAAM,cAAc,IAAI;AACxE,MAAI,OAAO,SAAS,KAAK,KAAK,MAAM,QAAQ,UAAU;AACpD,WAAO,EAAE,OAAO,SAAS,QAAQ,uCAAuC,QAAQ,KAAK,CAAC,IAAI;AAAA,EAC5F;AACA,SAAO,EAAE,OAAO,MAAM,QAAQ,kBAAkB;AAClD;AAEA,SAAS,mCAAmC,QAA4C;AACtF,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,kDAAkD,KAAK,IAAI,KAAK,yBAAyB,KAAK,IAAI;AAC3G;AAEA,SAAS,uBAAuB,OAUpB;AACV,MAAI,MAAM,YAAa,QAAO;AAC9B,MAAI,MAAM,UAAU,MAAM,UAAW,QAAO;AAC5C,MAAI,MAAM,cAAc,MAAM,MAAM,eAAe,KAAK,KAAK,MAAM,iBAAiB,EAAG,QAAO;AAC9F,MAAI,MAAM,OAAO,KAAK,EAAG,QAAO;AAChC,OAAK,MAAM,gBAAgB,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAAG,QAAO;AACnE,SAAO,qCAAqC,KAAK,MAAM,mBAAmB,EAAE;AAC9E;AAEA,SAAS,gCAAgC,OAAyB;AAChE,MAAIC,UAAyC;AAC7C,MAAI,OAAO,UAAU,SAAU,CAAAA,UAAS,uCAAuC,KAAK;AAAA,WAC3E,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,EAAG,CAAAA,UAAS;AAC/E,MAAI,CAACA,QAAQ,QAAO;AACpB,QAAM,MAAMA,QAAO,0BAA0BA,QAAO;AACpD,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO;AAChC,SAAO,IAAI,KAAK,CAAC,SAAyC;AACxD,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,QAAO;AACrE,WAAO,OAAQ,KAAiC,WAAW,EAAE,EAAE,KAAK,MAAM;AAAA,EAC5E,CAAC;AACH;AAEA,SAAS,mBACP,QACA,mBACA,WACS;AACT,QAAM,cAAc,OAAO,oBAAoB;AAC/C,MAAI,OAAO,wBAAwB,+BAA+B,gBAAgB,UAAa,gBAAgB,MAAM;AACnH,WAAO;AAAA,EACT;AACA,MAAI,kBAAmB,QAAO;AAC9B,MAAI,gBAAgB,UAAa,gBAAgB,KAAM,QAAO;AAC9D,SAAO,iCAAiC,SAAS;AACnD;AAEO,SAAS,oBAAoB,QAA6B,UAA+B,CAAC,GAA2B;AAC1H,QAAM,SAAS,mBAAmB,OAAO,UAAU;AACnD,QAAM,YAAY,eAAe,OAAO,aAAa;AACrD,QAAM,yBACJ,OAAO,OAAO,yBAAyB,YAAY,OAAO,qBAAqB,KAAK,EAAE,SAAS;AACjG,QAAM,cAAc,mBAAmB,QAAQ,OAAO,aAAa,SAAS;AAC5E,QAAM,QAAQ,yBAAyB,QAAQ,WAAW,OAAO,GAAG;AACpE,QAAM,cAAc,SAAS,OAAO,UAAU;AAC9C,QAAM,cAAc,SAAS,OAAO,UAAU;AAC9C,QAAM,iBAAiB,SAAS,OAAO,aAAa;AACpD,QAAM,eAAe,eAAe,OAAO,YAAY;AACvD,QAAM,cAAc,mBAAmB,OAAO,cAAc;AAAA,IAC1D,MAAM,QAAQ;AAAA,IACd,YAAY,QAAQ;AAAA,EACtB,CAAC;AACD,QAAM,iBAAiB,UAAU;AAAA,IAC/B,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU,OAAO,UAAU;AAAA,IAC3B,UAAU,OAAO,UAAU;AAAA,IAC3B,UAAU,OAAO,aAAa;AAAA,EAChC,CAAC;AAID,QAAM,QACJ,OAAO,UACN,CAAC,SAAS,CAAC,cAAc,SAAS,OAAO,YAAY,EAAE,EAAE,KAAK,KAAK,SAAY;AAClF,QAAM,oBACJ,OAAO,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,KAAK,IAC1E,OAAO,kBAAkB,KAAK,IAC9B;AACN,QAAM,6BAA6B,mCAAmC,iBAAiB,IACnF,OACA;AACJ,QAAM,kBAAgD,OAAO,oBACzD;AAAA,IACE,aAAa;AAAA,IACb,cAAc,CAAC,OAAO,iBAAiB;AAAA,IACvC,aAAa,OAAO;AAAA,IACpB,yBAAyB;AAAA,EAC3B,IACA;AAEJ,QAAM,YAAY,iBAAiB;AAAA,IACjC;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,UAAU;AAAA,IAC5B,WAAW,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA,OAAO,OAAO,qBAAqB,OAAO,aAAa;AAAA,IACvD,WAAW,OAAO,cAAc;AAAA,IAChC,QAAQ,OAAO,UAAU;AAAA,IACzB,WAAW,OAAO,aAAa;AAAA,IAC/B,iBAAiB,OAAO,mBAAmB;AAAA,EAC7C,CAAC;AACD,QAAM,oBACJ,8BAA8B,UAAU,UAAU,YAC9C,YACA,0BAA0B,UAAU,UAAU,SAC5C,SACA,cACE,WACA,QACE,YACA;AACZ,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,KAAK,OAAO;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB;AAAA,IACA,aAAa,yBAAyB,OAAO,OAAO;AAAA,IACpD,gBAAgB,UAAU;AAAA,IAC1B,iBAAiB,UAAU;AAAA,IAC3B,oBAAoB,UAAU;AAAA,IAC9B,sBAAsB,UAAU;AAAA,IAChC,kBAAkB,UAAU;AAAA,IAC5B,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,8BAA8B,OAAO,gCAAgC;AAAA,IACrE,2BAA2B,OAAO,6BAA6B;AAAA,IAC/D,OAAO,OAAO,SAAS,OAAO,oBAAoB,SAAS;AAAA,IAC3D,UAAU,OAAO,oBAAoB,YAAY;AAAA,IACjD,SAAS,OAAO,WAAW;AAAA,IAC3B,OAAO,OAAO,SAAS;AAAA,IACvB,WAAW,OAAO,aAAa;AAAA,IAC/B,aAAa,OAAO,eAAe;AAAA,IACnC,YAAY,OAAO,cAAc;AAAA,IACjC,WAAW,OAAO,aAAa;AAAA,EACjC;AACF;AAEO,SAAS,uBAAuB,QAAyC;AAC9E,MAAI,OAAO,YAAa,QAAO;AAC/B,MAAI,OAAO,UAAU,MAAO,QAAO;AACnC,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,OAAQ,QAAO;AACnE,SAAO;AACT;AAGO,SAAS,6BAA6B,QAAyC;AACpF,MAAI,CAAC,OAAO,YAAa,QAAO;AAChC,SAAO,OAAO,UAAU,UAAU,qBAAqB,OAAO,UAAU,UAAU;AACpF;AAEO,SAAS,gBAAgB,UAAkB,SAAiE;AACjH,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,cAAc,qBAAqB,EAAE,cAAc,WAAW,EAAE,cAAc,SAAS,GAAG;AAClH,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,WAAW,MAAM,EAAG,QAAO;AACtD,MAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS,EAAG,QAAO;AACxD,SAAO;AACT;AA9gBA,IAsBa,aACA;AAvBb;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AASO,IAAM,cAAc;AACpB,IAAM,WAAW;AAAA;AAAA;;;ACvBxB,SAAS,gBAAAC,qBAAoB;AAI7B,SAAS,eAAe,KAAwC;AAC9D,MAAI,CAAC,OAAO,QAAQ,aAAa,QAAS,QAAO;AACjD,MAAI;AACF,WAAOA,cAAa,SAAS,GAAG,YAAY,MAAM,EAAE,QAAQ,OAAO,GAAG;AAAA,EACxE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,2BAA2B,QAAsC;AAC/E,MAAI,CAAC,OAAO,OAAO,QAAQ,aAAa,QAAS,QAAO;AACxD,QAAM,UAAU,eAAe,OAAO,GAAG;AACzC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAS,CAAC,OAAO,cAAc,OAAO,WAAW,OAAO,aAAa,EAAE;AAAA,IAC3E,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,EACjF;AACA,SAAO,OAAO,KAAK,CAAC,UAAU,QAAQ,SAAS,KAAK,CAAC;AACvD;AAMO,SAAS,sBAAsB,QAAsC;AAC1E,MAAI,OAAO,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,KAAK,GAAG;AACnF,WAAO;AAAA,EACT;AACA,QAAM,SAAS,oBAAoB,MAAM;AACzC,MAAI,OAAO,SAAS,CAAC,2BAA2B,MAAM,EAAG,QAAO;AAChE,SAAO,OAAO,SAAS,CAAC,OAAO,eAAe,OAAO,UAAU,UAAU;AAC3E;AAvCA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,OAAOC,SAAQ;AAEf,OAAOC,WAAU;AA6DjB,SAAS,YAAY,OAAgB,UAA0B;AAC7D,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO,KAAK,MAAM,CAAC;AACrB;AAEA,SAAS,sBACP,SAA2B,eAAe,GAC1C,8BACA,eACA;AACA,QAAM,oBAAoB,YAAY,OAAO,mBAAmB,4BAA4B;AAC5F,QAAM,kBAAkB,YAAY,OAAO,iBAAiB,yBAAyB;AACrF,QAAM,iBAAiB,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK,IAAI,KAAK,OAAO,OAAO,cAAc,IAAI,IAAI,OAAO,OAAO,cAAc,IAAI,uBAAuB;AAAA,EAC3G;AACA,QAAM,MAAM,iBAAiB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,eAAe,iBAAiBD,IAAG,SAAS;AAAA,EAC9C,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,IAAI;AAAA,IAC1B,SAAS,IAAI;AAAA,IACb,iBAAiB,IAAI;AAAA,EACvB;AACF;AAGO,SAAS,sBACd,eACA,OAA0F,CAAC,GACnF;AACR,QAAM,oBAAoB,KAAK,qBAAqB;AACpD,QAAM,kBAAkB,KAAK,mBAAmB;AAChD,QAAM,iBAAiB,KAAK,kBAAkB;AAC9C,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,cAAc,IAAI,eAAe;AAC5F,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,iBAAiB,CAAC;AACnE,SAAO,KAAK,IAAI,KAAK,wBAAwB;AAC/C;AAEA,SAAS,wBAAgC;AACvC,SAAO,sBAAsB;AAC/B;AAGA,SAAS,yBAAyB,KAA+B;AAC/D,MAAI,SAAS;AACb,aAAW,QAAQ,mBAAmB,GAAG,GAAG;AAC1C,UAAM,SAAS;AAAA,MACbC,MAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,UAAU,CAAC,sBAAsB,MAAM,EAAG;AAC/C;AAAA,EACF;AACA,SAAO;AACT;AAaO,SAAS,2BAAmC;AACjD,MAAI,SAAS;AACb,aAAW,OAAO,eAAe,EAAG,WAAU,yBAAyB,GAAG;AAC1E,SAAO;AACT;AAMO,SAAS,0BAA0B,OAA0D;AAClG,QAAM,SAAS,MAAM,UAAU,eAAe;AAC9C,QAAM,gBAAgB,MAAM,iBAAiBD,IAAG,SAAS;AACzD,QAAM,EAAE,mBAAmB,iBAAiB,gBAAgB,sBAAsB,SAAS,iBAAiB,gBAAgB,IAC1H,sBAAsB,QAAQ,MAAM,8BAA8B,aAAa;AACjF,QAAM,UAAU,yBAAyB,MAAM;AAC/C,QAAM,eAAe,MAAM,gBAAgB,sBAAsB;AAGjE,QAAM,gBAAgB,MAAM,iBAAiB,yBAAyB;AAEtE,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,cAAc,IAAI,eAAe;AAC5F,QAAM,oBAAoB,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,iBAAiB,CAAC;AACjF,QAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,GAAG,eAAe,eAAe,IAAI,iBAAiB,CAAC;AAEhH,QAAM,UAAU;AAChB,QAAM,YAAY,wBAAwB;AAC1C,QAAM,uBAAuB,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,iBAAiB,CAAC;AAC/E,QAAM,kBAAkB,KAAK,IAAI,GAAG,uBAAuB,aAAa;AAKxE,QAAM,iBAAiB;AACvB,MAAI,iBAAiB,KAAK,IAAI,iBAAiB,cAAc;AAE7D,QAAM,WAAW,MAAM,gBAAgB,QAAQ,IAAI,mCAAmC;AACtF,QAAM,WAAW,WACb,SACA,sBAAsB;AAAA,IACpB,UACE,MAAM,UAAU,KAAK,KACrB,QAAQ,IAAI,wBAAwB,KAAK,KACzC;AAAA,EACJ,CAAC;AACL,MAAI,YAAY,CAAC,SAAS,GAAI,kBAAiB;AAE/C,MAAI,SAAwB;AAC5B,MAAI,kBAAkB,GAAG;AACvB,QAAI,YAAY,CAAC,SAAS,IAAI;AAC5B,eAAS,SAAS,UAAU;AAAA,IAC9B,WAAW,iBAAiB,sBAAsB;AAChD,eAAS,oBAAoB,aAAa,IAAI,oBAAoB;AAAA,IACpE,WAAW,oBAAoB,GAAG;AAChC,eAAS;AAAA,IACX,OAAO;AACL,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC;AACF;AAtNA,IAkBa,8BAGA,2BAGA,yBAGA;AA3Bb;AAAA;AAAA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAMO,IAAM,+BAA+B,MAAM,OAAO;AAGlD,IAAM,4BAA4B,IAAI,OAAO,OAAO;AAGpD,IAAM,0BAA0B;AAGhC,IAAM,2BAA2B;AAAA;AAAA;;;ACVxC,SAASE,aAAY,OAAgB,UAA0B;AAC7D,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO,KAAK,MAAM,CAAC;AACrB;AAEO,SAAS,iBACd,OAMmB;AACnB,QAAM,SAAS,MAAM,UAAU,CAAC;AAChC,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,QAAM,oBAAoBA,aAAY,OAAO,mBAAmB,4BAA4B;AAC5F,QAAM,kBAAkBA,aAAY,OAAO,iBAAiB,yBAAyB;AACrF,QAAM,iBAAiB,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK,IAAI,KAAK,OAAO,OAAO,cAAc,IAAI,IAAI,OAAO,OAAO,cAAc,IAAI,uBAAuB;AAAA,EAC3G;AACA,QAAM,UAAU,sBAAsB,MAAM,eAAe;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,MAAM,iCAAiC,UAAa,MAAM,iCAAiC,MAAM;AACnG,WAAO;AAAA,MACL,sBAAsBA,aAAY,MAAM,8BAA8B,OAAO;AAAA,MAC7E;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,OAAO,yBAAyB,UAAa,OAAO,yBAAyB,MAAM;AACrF,UAAM,aAAaA,aAAY,OAAO,sBAAsB,CAAC,KAAK;AAClE,QAAI,YAAY;AACd,aAAO;AAAA,QACL,sBAAsB,KAAK,IAAI,YAAY,wBAAwB;AAAA,QACnE;AAAA,QACA,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBACJ,IAAI,mCAAmC,OAAO,IAAI,mCAAmC;AACvF,QAAM,SAAS,kBAAkB,IAAI,qBAAqBA,aAAY,IAAI,oBAAoB,CAAC,KAAK,OAAO;AAC3G,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,sBAAsB,KAAK,IAAI,QAAQ,wBAAwB;AAAA,MAC/D;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,sBAAsB;AAAA,IACtB;AAAA,IACA,iBAAiB;AAAA,EACnB;AACF;AAYO,SAAS,wBACd,QAMI,CAAC,GACyB;AAC9B,QAAM,gBAAgB,MAAM,iBAAiB;AAC7C,QAAM,UAAU,sBAAsB,eAAe;AAAA,IACnD,mBAAmBA,aAAY,MAAM,QAAQ,mBAAmB,4BAA4B;AAAA,IAC5F,iBAAiBA,aAAY,MAAM,QAAQ,iBAAiB,yBAAyB;AAAA,IACrF,gBACE,MAAM,QAAQ,kBAAkB,OAAO,MAAM,OAAO,cAAc,IAAI,IAClE,OAAO,MAAM,OAAO,cAAc,IAClC;AAAA,EACR,CAAC;AACD,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,wBAAwB,aAAa,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC;AACrF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,MAAM,YAAY;AAAA,IAC5B;AAAA,IACA,eAAe,MAAM,iBAAiB;AAAA,EACxC;AACF;AAxHA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA;AAAA;AAAA;AAAA;AAQA,OAAOC,SAAQ;AAIf,SAAS,qBAAqB,MAA4D;AACxF,QAAM,OACH,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,YACxD,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,WACnD,QAAQ,IAAI,kBACZ,eAAe,EAAE;AACnB,SAAO,MAAM,kBAAkB,OAAO,GAAG,CAAC,IAAI;AAChD;AAEA,eAAe,MAAM,IAA2B;AAC9C,QAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACxD;AAeA,eAAsB,eACpB,MAC2C;AAC3C,QAAM,OAAO,qBAAqB,IAAI;AACtC,MAAI,CAAC,MAAM;AACT,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AAEA,QAAM,aAAa,GAAGD,IAAG,SAAS,CAAC,KAAKA,IAAG,SAAS,CAAC;AACrD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,yBAAyB;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;AAAA,IACrC,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,cAAQ,MAAM,yCAAyC,IAAI,MAAM,IAAI;AACrE,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB;AACA,YAAS,MAAM,IAAI,KAAK;AAAA,EAC1B,SAAS,KAAK;AACZ,YAAQ,MAAM,mBAAmB,IAAI,KAAM,IAAc,OAAO,EAAE;AAClE,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AAEA,QAAM,YAAY,MAAM,6BAA6B,MAAM;AAC3D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,gBAAgB,SAAS,EAAE;AACvC,UAAQ,IAAI,4BAA4B,MAAM,SAAS,EAAE;AACzD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,8BAAyB;AAErC,QAAM,WAAW,KAAK,IAAI,IAAI,MAAM,aAAa;AACjD,MAAI,aAAa,KAAK,IAAI,GAAG,MAAM,QAAQ,IAAI;AAE/C,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,MAAM,UAAU;AACtB,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,IAAI,0BAA0B;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,aAAa,MAAM,YAAY,CAAC;AAAA,MACzD,CAAC;AACD,aAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,IAC3C,QAAQ;AACN;AAAA,IACF;AAEA,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AACH,YAAI,KAAK,SAAS;AAChB,qBAAW,KAAK,OAAO;AACvB,kBAAQ,IAAI,sEAAiE;AAC7E,iBAAO,EAAE,IAAI,MAAM,QAAQ,KAAK,QAAQ;AAAA,QAC1C;AACA,eAAO,EAAE,IAAI,MAAM;AAAA,MACrB,KAAK;AACH,sBAAc;AACd;AAAA,MACF,KAAK;AACH,YAAI,OAAO,KAAK,aAAa,SAAU,cAAa,KAAK,IAAI,YAAY,KAAK,WAAW,GAAI;AAC7F;AAAA,MACF,KAAK;AACH,gBAAQ,MAAM,sCAAsC;AACpD,eAAO,EAAE,IAAI,MAAM;AAAA,MACrB,KAAK;AACH,gBAAQ,MAAM,sEAAsE;AACpF,eAAO,EAAE,IAAI,MAAM;AAAA,MACrB;AAEE;AAAA,IACJ;AAAA,EACF;AAEA,UAAQ,MAAM,6DAA6D;AAC3E,SAAO,EAAE,IAAI,MAAM;AACrB;AAxHA;AAAA;AAAA;AASA;AACA;AAAA;AAAA;;;ACVA,SAAS,cAAAE,cAAY,aAAAC,YAAW,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,UAAS,gBAAgB;AAClC,OAAOC,YAAU;AAOjB,OAAOC,SAAQ;AAiDR,SAAS,iBAAmC;AACjD,MAAI,CAACN,aAAW,WAAW,EAAG,QAAO,CAAC;AACtC,MAAI;AACF,WAAO,KAAK,MAAME,eAAa,aAAa,MAAM,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,eAAe,QAAgC;AAC7D,EAAAD,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,EAAAE,eAAc,aAAa,GAAG,KAAK,UAAU,qBAAqB,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC1G;AAGO,SAAS,qBAAqB,QAA4C;AAC/E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,OAAO,aAAa,KAAK,IAAI,EAAE,aAAa,eAAe,OAAO,YAAY,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,IAC/F,GAAI,OAAO,aAAa,KAAK,IAAI,EAAE,aAAa,eAAe,OAAO,YAAY,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,EACjG;AACF;AAGO,SAAS,kBAAkB,QAA4C;AAC5E,SAAO,qBAAqB,MAAM;AACpC;AAEA,SAAS,iBACP,UACA,MAC2B;AAC3B,QAAM,QAAQ,oBAAoB;AAClC,QAAM,cACH,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,WACzD,SAAS,YAAY,KAAK,KAC1B,QAAQ,IAAI,gBAAgB,KAAK,KACjC,QAAQ,IAAI,2BAA2B,KAAK,KAC5C,QAAQ,IAAI,6BAA6B,KAAK;AAChD,QAAM,aACH,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY,WACvD,SAAS,WAAW,KAAK,KACzB,QAAQ,IAAI,oBAAoB,KAAK,MACpC,MAAM,aAAa,KAAK,EAAE,WAAW,OAAO,IAAI,MAAM,sBAAsB,KAAK,IAAI;AACxF,QAAM,eACJ,OAAO,KAAK,SAAS,WACjB,KAAK,OACL,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB,SAClD,oBAAoB,GAAG,OACvB;AACR,QAAM,cACJ,gBACA,SAAS,aAAa,KAAK,KAC3B,QAAQ,IAAI,qBAAqB,KAAK,KACtC,QAAQ,IAAI,qBAAqB,KAAK,KACtC,oBAAoB,GAAG;AACzB,QAAM,eACH,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,WAC3D,SAAS,aAAa,KAAK,KAC3B,QAAQ,IAAI,qBAAqB,KAAK,KACtC,QAAQ,IAAI,mBAAmB,KAAK;AAEtC,SAAO;AAAA,IACL,GAAI,aAAa,EAAE,YAAY,kBAAkB,UAAU,EAAE,IAAI,CAAC;AAAA,IAClE,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACrC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACrC,GAAI,OAAO,KAAK,gBAAgB,WAC5B,EAAE,aAAa,KAAK,YAAY,IAChC,SAAS,cACP,EAAE,aAAa,SAAS,YAAY,IACpC,CAAC;AAAA,EACT;AACF;AAqBO,SAAS,yBACd,UACA,MACA,gBAAgB,SAAS,GACkE;AAC3F,QAAM,gBACJ,OAAO,KAAK,eAAe,WACvB,KAAK,aACL,OAAO,KAAK,yBAAyB,WACnC,KAAK,uBACL;AACR,QAAM,qBACJ,OAAO,KAAK,YAAY,WACpB,KAAK,UACL,OAAO,KAAK,UAAU,MAAM,WAC1B,OAAO,KAAK,UAAU,CAAC,IACvB;AACR,QAAM,UAAU,mBAAmB,QAAQ,KAAK;AAAA,IAC9C,GAAG;AAAA,IACH,GAAI,qBAAqB,EAAE,SAAS,2BAA2B,kBAAkB,EAAE,IAAI,CAAC;AAAA,EAC1F,CAAC,EAAE;AACH,QAAM,WAAW,sBAAsB;AAAA,IACrC,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,EAChE,CAAC;AACD,QAAM,oBAAoB,wBAAwB;AAAA,IAChD;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,YAAY,SAAS;AAAA,IACrB,eAAe,SAAS;AAAA,IACxB,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,eAAe;AACjB,WAAO;AAAA,MACL,sBAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,aAAa,CAAC,CAAC;AAAA,MACnE,4BAA4B;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,yBAAyB,UAAa,SAAS,yBAAyB,MAAM;AACzF,WAAO;AAAA,MACL,sBAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,oBAAoB,CAAC,CAAC;AAAA,MACnF,4BAA4B,SAAS,8BAA8B;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,sBAAsB,kBAAkB;AAAA,IACxC,4BAA4B;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,sBAA6C;AACpD,MAAI,CAACH,aAAW,gBAAgB,EAAG,QAAO,CAAC;AAC3C,MAAI;AACF,WAAO,KAAK,MAAME,eAAa,kBAAkB,MAAM,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,oBAAoB,QAAqC;AAChE,EAAAD,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,EAAAE,eAAc,kBAAkB,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AACzF;AAEO,SAAS,aAAiC;AAC/C,MAAI,QAAQ,IAAI,eAAgB,QAAO,QAAQ,IAAI;AACnD,SAAO,oBAAoB,EAAE;AAC/B;AAEO,SAAS,WAAW,QAAsB;AAC/C,sBAAoB,EAAE,GAAG,oBAAoB,GAAG,OAAO,CAAC;AAC1D;AAEO,SAAS,gBAAgB,WAAwC;AACtE,QAAM,WAAW,QAAQ,IAAI,qBAAqB,KAAK;AACvD,MAAI,SAAU,QAAO;AAErB,QAAM,QAAQ,oBAAoB;AAClC,MAAI,CAAC,MAAM,YAAa,QAAO;AAC/B,MAAI,aAAa,MAAM,wBAAwB,MAAM,yBAAyB,WAAW;AACvF,WAAO;AAAA,EACT;AACA,SAAO,MAAM;AACf;AAEO,SAAS,gBAAgB,WAAmB,OAAqB;AACtE,sBAAoB;AAAA,IAClB,GAAG,oBAAoB;AAAA,IACvB,aAAa;AAAA,IACb,sBAAsB;AAAA,EACxB,CAAC;AACH;AAEO,SAAS,eAAe,aAA8B;AAC3D,QAAM,UAAU,yBAAyB,WAAW;AACpD,MAAI,CAAC,QAAS,YAAW,qGAAqG;AAC9H,SAAO;AACT;AAEA,SAAS,yBAAyB,aAA0C;AAC1E,QAAM,UACJ,eACA,QAAQ,IAAI,kBACZ,QAAQ,IAAI,6BACZ,QAAQ,IAAI,+BACZ,eAAe,EAAE;AACnB,SAAO,UAAU,kBAAkB,OAAO,OAAO,CAAC,IAAI;AACxD;AAEA,SAAS,gCAAgC,YAAqB,WAAwC;AACpG,QAAM,SACJ,cACA,gBAAgB,SAAS,MACxB,YAAY,SAAY,gBAAgB,eAAe,EAAE,SAAS;AACrE,MAAI,OAAQ,QAAO,OAAO,MAAM;AAEhC,QAAM,eACJ,QAAQ,IAAI,yBACZ,QAAQ,IAAI,sBACZ,QAAQ,IAAI;AACd,MAAI,cAAc;AAChB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO,OAAO,YAAY;AAAA,EAC5B;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,YAAqB,WAA4B;AACrF,QAAM,aAAa,gCAAgC,YAAY,SAAS;AACxE,MAAI,WAAY,QAAO;AAEvB;AAAA,IACE;AAAA,EACF;AACF;AASA,eAAsB,iCACpB,YACA,WACA,MACuE;AACvE,QAAM,aAAa,gCAAgC,YAAY,SAAS;AACxE,MAAI,WAAY,QAAO,EAAE,IAAI,MAAM,QAAQ,WAAW;AAEtD,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,yBAAyB,MAAM,OAAO;AACtD,MAAI,UAAU,aAAa,SAAS;AAClC,QAAI;AACF,YAAM,QAAQ,MAAM,sBAAsB,WAAW,EAAE,SAAS,OAAO,CAAC;AACxE,sBAAgB,WAAW,KAAK;AAChC,aAAO,EAAE,IAAI,MAAM,QAAQ,MAAM;AAAA,IACnC,SAAS,OAAO;AACd,aAAO,EAAE,IAAI,OAAO,QAAQ,kCAAmC,MAAgB,OAAO,GAAG;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QACE;AAAA,EACJ;AACF;AAEA,eAAsB,8BACpB,YACA,WACA,MACiB;AACjB,QAAM,SAAS,MAAM,iCAAiC,YAAY,WAAW,IAAI;AACjF,MAAI,OAAO,GAAI,QAAO,OAAO;AAC7B,aAAW,OAAO,MAAM;AAC1B;AAUA,eAAsB,mBACpB,WACA,MACwB;AACxB,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,yBAAyB,MAAM,OAAO;AACtD,MAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAS,QAAO;AAC9C,MAAI;AACF,UAAM,QAAQ,MAAM,sBAAsB,WAAW,EAAE,SAAS,OAAO,CAAC;AACxE,oBAAgB,WAAW,KAAK;AAChC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,iCACpB,gBACA,WACA,MACsE;AACtE,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,yBAAyB,MAAM,OAAO;AACtD,MAAI,CAAC,OAAQ,QAAO,EAAE,IAAI,OAAO,QAAQ,gEAAgE;AACzG,MAAI,CAAC,UAAW,QAAO,EAAE,IAAI,OAAO,QAAQ,2DAA2D;AACvG,MAAI,CAAC,QAAS,QAAO,EAAE,IAAI,OAAO,QAAQ,8EAA8E;AAExH,MAAI;AACF,UAAM,QAAQ,MAAM,sBAAsB,WAAW,EAAE,SAAS,OAAO,CAAC;AACxE,QAAI,SAAS,UAAU,gBAAgB;AACrC,sBAAgB,WAAW,KAAK;AAChC,aAAO,EAAE,IAAI,MAAM,MAAM;AAAA,IAC3B;AACA,WAAO,EAAE,IAAI,OAAO,QAAQ,wDAAwD;AAAA,EACtF,SAAS,OAAO;AACd,WAAO,EAAE,IAAI,OAAO,QAAS,MAAgB,QAAQ;AAAA,EACvD;AACF;AAEA,eAAsB,sBACpB,WACA,MACiB;AACjB,QAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,kDAA6C;AAE1E,QAAM,OAAO,eAAe,MAAM,OAAO;AACzC,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AACvE,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,EACzB,CAAC;AAED,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,SAAoD;AACxD,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AACA,MAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,OAAO;AAC7B,UAAM,IAAI;AAAA,MACR,kCAAkC,IAAI,MAAM,MAAM,QAAQ,SAAS,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,IACvF;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,qBAAqB,MAAuD;AAChG,QAAM,aACH,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI,eAAe,EAAE,cAAc;AAC5E,MAAI,CAAC,UAAW,YAAW,gFAAgF;AAE3G,MAAI;AACF,UAAM,QAAQ,MAAM,sBAAsB,WAAW;AAAA,MACnD,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,IACjD,CAAC;AACD,oBAAgB,WAAW,KAAK;AAChC,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ;AAAA,UACA,iBAAiB,gBAAgB,gBAAgB;AAAA,UACjD,aAAa,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,UAClC,MAAM;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,WAAW,SAAwB;AAC1C,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,UAAU,MAAkD;AAC1E,QAAM,OAAyC,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,CAAC,KAAK,WAAW,IAAI,EAAG;AAC5B,UAAM,MAAM,KAAK,MAAM,CAAC,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAc,EAAE,YAAY,CAAC;AAChF,UAAM,OAAO,KAAK,IAAI,CAAC;AACvB,QAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,EAAG,MAAK,GAAG,IAAI;AAAA,SAC3C;AACH,WAAK,GAAG,IAAI;AACZ;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,SAAS,MAAuD;AACpF,QAAM,WAAW,eAAe;AAChC,QAAM,WAAW,sBAAsB;AAAA,IACrC,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,EAChE,CAAC;AACD,QAAM,oBAAoB,wBAAwB;AAAA,IAChD,eAAeG,IAAG,SAAS;AAAA,IAC3B,UAAU,SAAS;AAAA,IACnB,YAAY,SAAS;AAAA,IACrB,eAAe,SAAS;AAAA,IACxB,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,eAAe,yBAAyB,UAAU,IAAI;AAC5D,QAAM,SAA2B,qBAAqB;AAAA,IACpD,GAAG;AAAA,IACH,GAAG,iBAAiB,UAAU,IAAI;AAAA,IAClC,GAAG;AAAA,IACH,gBACE,OAAO,KAAK,aAAa,WACrB,KAAK,WACL,SAAS,kBAAkB;AAAA;AAAA;AAAA,IAGjC,GAAI,KAAK,cAAc,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAAA,EAChE,CAAC;AACD,iBAAe,MAAM;AACrB,QAAM,cAAc,mBAAmB,QAAQ,KAAK,MAAM;AAE1D,MAAI;AACJ,QAAM,SAAS,WAAW;AAC1B,QAAM,YAAY,OAAO;AACzB,MAAI,UAAU,WAAW;AACvB,QAAI;AACF,YAAM,QAAQ,MAAM,sBAAsB,WAAW;AAAA,QACnD,SAAS,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,OAAO;AAAA,QACxE;AAAA,MACF,CAAC;AACD,sBAAgB,WAAW,KAAK;AAChC,6BAAuB;AAAA,IACzB,QAAQ;AACN,6BACE;AAAA,IACJ;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,YAAY,gBAAgB,WAAW;AAAA,QACvC,QAAQ,kBAAkB,MAAM;AAAA,QAChC,SAAS,OAAO;AAAA,QAChB,eAAe,YAAY;AAAA,QAC3B,yBAAyB;AAAA,QACzB,GAAI,YAAY,SAAS,SAAS,EAAE,qBAAqB,YAAY,SAAS,IAAI,CAAC;AAAA,QACnF,MACE,wBACA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,SAAS,MAAuD;AACpF,QAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,QAAQ,IAAI;AAC3E,MAAI,QAAQ;AACV,eAAW,MAAM;AACjB,YAAQ,IAAI,KAAK,UAAU,EAAE,IAAI,MAAM,iBAAiB,gBAAgB,gBAAgB,EAAE,GAAG,MAAM,CAAC,CAAC;AACrG;AAAA,EACF;AAEA,QAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AACjC,QAAM,SAAS,MAAMA,gBAAe,IAAI;AACxC,MAAI,CAAC,OAAO,GAAI,SAAQ,KAAK,CAAC;AAC9B,UAAQ,IAAI,KAAK,UAAU,EAAE,IAAI,MAAM,iBAAiB,gBAAgB,gBAAgB,EAAE,GAAG,MAAM,CAAC,CAAC;AACvG;AAhiBA,IA+CM,YACA,aACA,kBAoFA,4BACA;AAtIN;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AAuCA,IAAM,aAAaF,OAAK,KAAKD,SAAQ,GAAG,SAAS;AACjD,IAAM,cAAcC,OAAK,KAAK,YAAY,aAAa;AACvD,IAAM,mBAAmBA,OAAK,KAAK,YAAY,aAAa;AAoF5D,IAAM,6BAA6B,MAAM,OAAO;AAChD,IAAM,0BAA0B,IAAI,OAAO,OAAO;AAAA;AAAA;;;ACtIlD,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB,WAA2B;AACrD,MAAI,MAAM,QAAQ,cAAc,SAAS,CAAC;AAC1C,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,QAAI,WAAW,KAAK,KAAK,cAAc,CAAC,EAAG,QAAO;AAClD,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,QAAM,IAAI,MAAM,gCAAgC,QAAQ,cAAc,SAAS,CAAC,CAAC,EAAE;AACrF;AAEO,SAAS,sBAAsB,YAAoB,YAAY,KAAa;AACjF,QAAM,UAAU,KAAK,mBAAmB,SAAS,GAAG,cAAc;AAClE,QAAM,MAAM,KAAK,MAAM,aAAa,SAAS,MAAM,CAAC;AACpD,MAAI,OAAO,IAAI,YAAY,YAAY,CAAC,IAAI,QAAQ,KAAK,GAAG;AAC1D,UAAM,IAAI,MAAM,mCAAmC,OAAO,EAAE;AAAA,EAC9D;AACA,SAAO,IAAI;AACb;AAEO,IAAM,kBAAkB,sBAAsB;AAE9C,SAAS,gBAAgB,MAAyB;AACvD,SAAO,KAAK,KAAK,CAAC,QAAQ,QAAQ,eAAe,QAAQ,IAAI;AAC/D;AAEO,SAAS,uBAAuB,SAAiB,SAAyB;AAC/E,UAAQ,IAAI,UAAU,GAAG,OAAO,IAAI,OAAO,KAAK,OAAO;AACvD,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,qBACd,MACA,YAAoB,YAAY,KAChC,SACS;AACT,MAAI,CAAC,gBAAgB,IAAI,EAAG,QAAO;AACnC,yBAAuB,sBAAsB,SAAS,GAAG,OAAO;AAChE,SAAO;AACT;;;ACzCA;AAFA,SAAS,cAAAG,aAAY,gBAAAC,qBAAoB;AACzC,OAAOC,WAAU;AAIV,IAAM,mCAAmC;AAAA,EAC9C,uBAAuB;AAAA,EACvB,iCAAiC;AAAA,EACjC,4BAA4B;AAC9B;AAIO,IAAM,+BAA+B,OAAO;AAAA,EACjD;AACF;AA2BA,IAAM,gBAA8D;AAAA,EAClE,uBAAuB;AAAA,EACvB,iCAAiC;AAAA,EACjC,4BAA4B;AAC9B;AAEA,IAAM,6BAA2E;AAAA,EAC/E,uBAAuB;AAAA,EACvB,iCAAiC;AAAA,EACjC,4BAA4B;AAC9B;AAGO,SAAS,iBAAiB,SAAkD;AACjF,QAAM,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AACvD,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,SAAS,KAAK,MAAM,SAAS,EAAG,QAAO;AACjD,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC;AACpD,MAAI,KAAK,KAAK,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,CAAC,EAAG,QAAO;AAC3D,SAAO,KAAK,SAAS,EAAG,MAAK,KAAK,CAAC;AACnC,SAAO,CAAC,KAAK,CAAC,GAAI,KAAK,CAAC,GAAI,KAAK,CAAC,CAAE;AACtC;AAGO,SAAS,cAAc,GAAW,GAAmB;AAC1D,QAAM,KAAK,iBAAiB,CAAC;AAC7B,QAAM,KAAK,iBAAiB,CAAC;AAC7B,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,QAAI,GAAG,CAAC,IAAK,GAAG,CAAC,EAAI,QAAO;AAC5B,QAAI,GAAG,CAAC,IAAK,GAAG,CAAC,EAAI,QAAO;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,SAAS,cAAc,SAAiB,SAA0B;AACvE,SAAO,cAAc,SAAS,OAAO,KAAK;AAC5C;AAEA,SAAS,UAAU,UAA4C;AAC7D,MAAI,OAAsB;AAC1B,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,QAAQ,cAAc,SAAS,IAAI,IAAI,EAAG,QAAO;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,iBAAwC;AACtE,MAAI;AACF,UAAM,SAAS,KAAK,MAAMD,cAAa,iBAAiB,MAAM,CAAC;AAC/D,WAAO,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,KAAK,IAAI;AAAA,EAC/F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,KAAa,kBAA0C;AAC9E,QAAM,aAAa,CAAC,kBAAkB,QAAQ,IAAI,aAAa,GAAG,EAAE;AAAA,IAClE,CAAC,UAA2B,QAAQ,OAAO,KAAK,CAAC;AAAA,EACnD;AACA,aAAW,aAAa,YAAY;AAClC,UAAM,WAAWC,MAAK,QAAQ,SAAS;AACvC,QACEF,YAAWE,MAAK,KAAK,UAAU,sCAAsC,CAAC,KACtEF,YAAWE,MAAK,KAAK,UAAU,cAAc,CAAC,GAC9C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,aAAa,oBAAoB,EAAE,IAAI,CAAC;AAC9C,SAAO,YAAY,QAAQ;AAC7B;AAEO,SAAS,yBAAyB,QAGrC,CAAC,GAAqF;AACxF,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,QAAM,WAAW,gBAAgB,KAAK,MAAM,QAAQ;AACpD,MAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAM,MAAwF,CAAC;AAC/F,aAAW,eAAe,8BAA8B;AACtD,UAAM,kBAAkBA,MAAK,KAAK,UAAU,2BAA2B,WAAW,CAAC;AACnF,UAAM,UAAU,uBAAuB,eAAe;AACtD,QAAI,CAAC,QAAS;AACd,QAAI,WAAW,IAAI,EAAE,SAAS,QAAQ,QAAQ,MAAM,gBAAgB;AAAA,EACtE;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,aAAqD;AAC/E,MAAI,gBAAgB,uBAAuB;AACzC,WAAO,CAAC,wBAAwB,gBAAgB;AAAA,EAClD;AACA,SAAO,CAAC,oBAAoB,WAAW,EAAE;AAC3C;AAEA,SAAS,iBAAiB,OAMb;AACX,QAAM,EAAE,aAAa,gBAAgB,kBAAkB,iBAAiB,YAAY,IAAI;AACxF,QAAM,QAAkB,CAAC;AACzB,MAAI,eAAe,cAAc,aAAa,cAAc,GAAG;AAC7D,UAAM;AAAA,MACJ,8BAA8B,WAAW,qCAAqC,mBAAmB,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA,IAC1H;AACA,UAAM,KAAK,6DAA6D;AACxE,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB;AACpB,UAAM;AAAA,MACJ,WAAW,WAAW,SAAS,gBAAgB,UAAU,cAAc,oBAAoB,WAAW;AAAA,IACxG;AAAA,EACF,OAAO;AACL,UAAM,KAAK,WAAW,WAAW,OAAO,cAAc,6CAA6C;AAAA,EACrG;AACA,MAAI,gBAAgB,uBAAuB;AACzC,UAAM,KAAK,iEAAiE;AAAA,EAC9E;AACA,MAAI,oBAAoB,eAAe,aAAa;AAClD,UAAM,KAAK,yBAAyB,WAAW,8DAA8D;AAAA,EAC/G;AACA,SAAO;AACT;AAEA,SAAS,uBACP,YAC6D;AAC7D,MAAI,WAAW,WAAW,EAAG,QAAO,EAAE,SAAS,MAAM,QAAQ,UAAU;AACvE,QAAM,OAAO,UAAU,WAAW,IAAI,CAAC,cAAc,UAAU,OAAO,CAAC;AACvE,MAAI,CAAC,KAAM,QAAO,EAAE,SAAS,MAAM,QAAQ,UAAU;AACrD,QAAM,SAAS,WAAW,KAAK,CAAC,cAAc,UAAU,YAAY,IAAI,KAAK,WAAW,CAAC;AACzF,SAAO,EAAE,SAAS,OAAO,SAAS,QAAQ,OAAO,OAAO;AAC1D;AAEO,SAAS,sCAAsC,QAIlD,CAAC,GAAiC;AACpC,QAAMC,aAAY,CAChB,OACA,mBAC6C;AAC7C,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,OAAO,UAAU,SAAU,QAAO,EAAE,SAAS,OAAO,QAAQ,eAAe;AAC/E,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,6BAA6B,IAAI,CAAC,gBAA2C;AAC5F,UAAM,iBAAiB,iCAAiC,WAAW;AACnE,UAAM,aAAkD,CAAC;AACzD,UAAM,YAAYA,WAAU,MAAM,YAAY,WAAW,GAAG,WAAW;AACvE,UAAM,OAAOA,WAAU,MAAM,OAAO,WAAW,GAAG,MAAM;AACxD,UAAM,OAAOA,WAAU,MAAM,OAAO,WAAW,GAAG,MAAM;AACxD,QAAI,UAAW,YAAW,KAAK,SAAS;AACxC,QAAI,KAAM,YAAW,KAAK,IAAI;AAC9B,QAAI,KAAM,YAAW,KAAK,IAAI;AAE9B,UAAM,EAAE,SAAS,kBAAkB,QAAQ,gBAAgB,IAAI,uBAAuB,UAAU;AAChG,UAAM,cAAc,MAAM,WAAW;AACrC,UAAMC,MAAK,mBAAmB,cAAc,kBAAkB,cAAc,IAAI;AAChF,UAAM,cAAcA,MAChB,CAAC,IACD,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAEL,UAAMC,WAAUD,MACZ,GAAG,cAAc,WAAW,CAAC,IAAI,gBAAgB,8BAA8B,cAAc,KAAK,eAAe,OACjH,GAAG,cAAc,WAAW,CAAC,iCAAiC,cAAc,MAC3E,mBAAmB,eAAe,gBAAgB,QAAQ,eAAe,MAAM,4BAChF;AAEJ,WAAO;AAAA,MACL;AAAA,MACA,aAAa,cAAc,WAAW;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAAA;AAAA,MACA,SAAAC;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,aAAa,SAAS,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AACnD,QAAM,KAAK,WAAW,WAAW;AACjC,QAAM,UAAU,KACZ,oEACA,qCAAqC,WAAW,MAAM,sBAAsB,WACzE,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,MAAM,IAAI,cAAc,EAAE,EACzD,KAAK,IAAI,CAAC;AAEjB,SAAO,EAAE,IAAI,SAAS,SAAS;AACjC;AAEO,IAAM,qCAAN,cAAiD,MAAM;AAAA,EACnD;AAAA,EAET,YAAY,QAAsC;AAChD,UAAM,QAAQ;AAAA,MACZ,OAAO;AAAA,MACP,GAAG,OAAO,SACP,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EACvB,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,IAAI,GAAG,IAAI,YAAY,IAAI,CAAC,SAAS,YAAO,IAAI,EAAE,CAAC,CAAC;AAAA,IAC3F;AACA,UAAM,MAAM,KAAK,IAAI,CAAC;AACtB,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,SAAS,oCACd,QAAqE,CAAC,GACxC;AAC9B,QAAM,SAAS,sCAAsC,KAAK;AAC1D,MAAI,CAAC,OAAO,GAAI,OAAM,IAAI,mCAAmC,MAAM;AACnE,SAAO;AACT;AAEO,SAAS,kCAAkC,QAA8C;AAC9F,SAAO,IAAI,mCAAmC,MAAM,EAAE;AACxD;;;ACnRA,SAAS,gBAAgB;AACzB,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AAGjB,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF;AAWA,SAAS,KAAK,OAA0C;AACtD,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,MAAM,MAAM;AACrB;AAEA,SAAS,OAAO,QAAoD;AAClE,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,CAAC,CAAC;AAC/E;AAEA,SAAS,cAAwB;AAC/B,QAAM,OAAOC,SAAQ;AACrB,QAAM,iBACJ,KAAK,QAAQ,IAAI,wBAAwB,KACzC,KAAK,QAAQ,IAAI,iBAAiB,KAClCC,MAAK,KAAK,MAAM,aAAa,KAAK;AACpC,QAAM,gBACJ,KAAK,QAAQ,IAAI,sBAAsB,KACvC,KAAK,QAAQ,IAAI,8BAA8B,MAC9C,KAAK,QAAQ,IAAI,iBAAiB,IAC/BA,MAAK,KAAK,KAAK,QAAQ,IAAI,iBAAiB,GAAI,OAAO,cAAc,IACrEA,MAAK,KAAK,MAAM,eAAe,OAAO,cAAc;AAE1D,SAAO,OAAO;AAAA,IACZA,MAAK,KAAK,gBAAgB,OAAO,cAAc;AAAA,IAC/CA,MAAK,KAAK,gBAAgB,cAAc;AAAA,IACxC,cAAc,SAAS,cAAc,IAAI,gBAAgBA,MAAK,KAAK,eAAe,OAAO,cAAc;AAAA,EACzG,CAAC;AACH;AAEA,eAAe,YAAY,iBAAiD;AAC1E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM,SAAS,iBAAiB,MAAM,CAAC;AACjE,WAAO,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,KAAK,IAAI;AAAA,EAC/F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,+BAA+B,aAA+B;AAC5E,QAAM,QAAQ,YAAY;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAYA,MAAK,KAAK,MAAM,aAAa,cAAc;AAC7D,QAAI,KAAK,IAAI,SAAS,EAAG;AACzB,SAAK,IAAI,SAAS;AAClB,QAAI,KAAK,SAAS;AAAA,EACpB;AACA,SAAO;AACT;AAEA,eAAsB,gCACpB,cAAqB,oBAAI,KAAK,GAAE,YAAY,GACP;AACrC,QAAM,MAAkC,CAAC;AACzC,aAAW,eAAe,kBAAkB;AAC1C,QAAI,OAAiD;AACrD,eAAW,mBAAmB,+BAA+B,WAAW,GAAG;AACzE,YAAM,UAAU,MAAM,YAAY,eAAe;AACjD,UAAI,CAAC,QAAS;AACd,UAAI,CAAC,QAAQ,cAAc,SAAS,KAAK,OAAO,IAAI,GAAG;AACrD,eAAO,EAAE,SAAS,MAAM,gBAAgB;AAAA,MAC1C;AAAA,IACF;AACA,QAAI,MAAM;AACR,UAAI,WAAW,IAAI,EAAE,SAAS,KAAK,SAAS,YAAY,MAAM,KAAK,KAAK;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;;;AChFA,SAAS,oBACP,UACuG;AACvG,QAAM,MAEF,CAAC;AACL,aAAW,CAAC,aAAa,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACzD,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,WAA2C,IAAI;AAAA,MACjD,SAAS,IAAI;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,iCAAiC,QAKnD,CAAC,GAAyE;AAC5E,QAAM,CAAC,WAAW,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1C,gCAAgC;AAAA,IAChC,QAAQ,QAAQ,yBAAyB,EAAE,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,CAAC,CAAC;AAAA,EACxF,CAAC;AAED,QAAM,OAA2F,CAAC;AAClG,QAAM,qBACJ,MAAM,oBAAoB,yBAAyB,MAAM,cACrD,MAAM,cACN;AACN,OAAK,qBAAqB,IAAI,EAAE,SAAS,oBAAoB,QAAQ,OAAO;AAC5E,MACE,MAAM,mBACN,MAAM,eACN,MAAM,oBAAoB,uBAC1B;AACA,SAAK,MAAM,eAAe,IAAI,EAAE,SAAS,MAAM,aAAa,QAAQ,OAAO;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL,WAAW,oBAAoB,SAAS;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,wCACpB,QAAgE,CAAC,GAC1B;AACvC,QAAM,aAAa,MAAM,iCAAiC,KAAK;AAC/D,SAAO,sCAAsC,UAAU;AACzD;AAEA,eAAsB,uCACpB,QAAgE,CAAC,GAC1B;AACvC,QAAM,aAAa,MAAM,iCAAiC,KAAK;AAC/D,SAAO,oCAAoC,UAAU;AACvD;AAEO,SAAS,uCAAuC,OAAgB,QAA0B;AAC/F,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,SAAU,QAAO;AAE/B,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,UAAU,WAAW,cAAc,WAAW,WAAW,WAAW,eAAe,WAAW,YAAY;AACtH,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU,WAAW,OAAQ,QAAO;AAClD,SAAO;AACT;;;ACrFA;;;ACCO,SAAS,4BAA4B,QAAwC;AAClF,QAAM,UAAU,OAAO,MAAM,EAAE,KAAK;AACpC,MAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AAAA,IACL,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,EAC7B;AACF;;;AClBA;AAuDA,SAAS,oBAA4B;AACnC,QAAM,SAAS,OAAO,QAAQ,IAAI,0BAA0B;AAC5D,MAAI,OAAO,SAAS,MAAM,KAAK,SAAS,EAAG,QAAO,KAAK,MAAM,MAAM;AACnE,SAAO;AACT;AAEA,eAAe,YAAe,IAAqD;AACjF,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,kBAAkB,CAAC;AACxE,MAAI;AACF,WAAO,MAAM,GAAG,WAAW,MAAM;AAAA,EACnC,UAAE;AACA,iBAAa,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,mBAAmB,OAAgC;AAC1D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,WAAW,kBAAkB;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,eAAsB,SAAS,KAAa,QAAgB,MAAwC;AAClG,MAAI;AACJ,MAAI;AACF,UAAM,MAAM;AAAA,MAAY,CAAC,WACvB,MAAM,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,SAAS,4BAA4B,MAAM;AAAA,QAC3C,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACA,MAAI,WAAoB;AACxB,MAAI;AACF,eAAW,MAAM,IAAI,KAAK;AAAA,EAC5B,QAAQ;AACN,eAAW;AAAA,EACb;AACA,SAAO,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,SAAS;AACpD;AAEA,eAAsB,8BACpB,KACA,QACA,MACA,MACyB;AACzB,QAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ,IAAI;AAC9C,MAAI,MAAM,MAAM,MAAM,WAAW,IAAK,QAAO;AAE7C,QAAM,YAAY,MAAM,iCAAiC,QAAQ,KAAK,WAAW,EAAE,SAAS,KAAK,QAAQ,CAAC;AAC1G,MAAI,CAAC,UAAU,GAAI,QAAO,EAAE,GAAG,OAAO,oBAAoB,UAAU,OAAO;AAE3E,QAAM,QAAQ,MAAM,SAAS,KAAK,UAAU,OAAO,IAAI;AACvD,SAAO,EAAE,GAAG,OAAO,eAAe,KAAK;AACzC;AAEA,eAAsB,QAAQ,KAAa,QAAyC;AAClF,MAAI;AACJ,MAAI;AACF,UAAM,MAAM;AAAA,MAAY,CAAC,WACvB,MAAM,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,SAAS,4BAA4B,MAAM;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACA,MAAI,WAAoB;AACxB,MAAI;AACF,eAAW,MAAM,IAAI,KAAK;AAAA,EAC5B,QAAQ;AACN,eAAW;AAAA,EACb;AACA,SAAO,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,SAAS;AACpD;;;AC7GO,IAAM,yBAA+D;AAAA,EAC1E;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aACE;AAAA,IACF,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aACE;AAAA,IACF,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AACF;AAIA,IAAM,UAAU,IAAI,IAAI,uBAAuB,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAE3E,SAAS,6BACd,MACkC;AAClC,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,MAAM,KAAK,KAAK,EAAE,YAAY;AACpC,SAAO,QAAQ,IAAI,GAAG,KAAK;AAC7B;AAGO,SAAS,uBACd,MACkC;AAClC,SAAO,6BAA6B,IAAI,GAAG,gBAAgB;AAC7D;AAEO,SAAS,0BACd,MACqC;AACrC,SAAO,6BAA6B,IAAI,GAAG,mBAAmB;AAChE;AAEO,SAAS,yBAAyB,MAA0C;AACjF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,QAAQ,IAAI,KAAK,KAAK,EAAE,YAAY,CAAC;AAC9C;AAGO,SAAS,2BAAgE;AAC9E,SAAO,uBAAuB,OAAO,CAAC,UAAU,MAAM,iBAAiB,QAAQ,EAAE;AAAA,IAC/E,CAAC,UAAU,MAAM;AAAA,EACnB;AACF;AAGO,SAAS,4BAAiE;AAC/E,SAAO,uBAAuB,OAAO,CAAC,UAAU,MAAM,iBAAiB,SAAS,EAAE;AAAA,IAChF,CAAC,UAAU,MAAM;AAAA,EACnB;AACF;;;ACnJA,SAAS,UAAU,OAA0C;AAC3D,UAAQ,SAAS,IAAI,KAAK,EAAE,YAAY;AAC1C;AAsCO,SAAS,uBACd,UACyB;AACzB,UAAQ,UAAU,QAAQ,GAAG;AAAA,IAC3B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,gCACd,KAC8B;AAC9B,QAAM,MAAM,UAAU,GAAG;AACzB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,oBAAoB,QAAQ,YAAY,QAAQ,aAAa,QAAQ,OAAO;AACtF,WAAO;AAAA,EACT;AACA,QAAM,SAAS,uBAAuB,GAAG;AACzC,MAAI,OAAQ,QAAO;AACnB,MAAI,QAAQ,eAAe,QAAQ,YAAY,QAAQ,SAAU,QAAO;AACxE,MAAI,QAAQ,UAAU,QAAQ,QAAS,QAAO;AAC9C,SAAO;AACT;AA4DO,SAAS,8BACd,KACkB;AAClB,SAAO,gCAAgC,GAAG,KAAK;AACjD;;;AJrJA;AACA;AACA;AACA;;;AKFA,SAAS,WAAW,MAA+B,KAAqB;AACtE,QAAM,IAAI,KAAK,GAAG;AAClB,SAAO,OAAO,MAAM,WAAW,EAAE,KAAK,IAAI;AAC5C;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MAAM,YAAY;AAC3B;AAMO,SAAS,sBAAsB,MAAmD;AACvF,QAAM,WAAW,WAAW,MAAM,UAAU;AAC5C,MAAI,SAAU,QAAO;AAErB,QAAM,MAAM,UAAU,WAAW,MAAM,aAAa,CAAC;AACrD,QAAM,QAAQ,UAAU,WAAW,MAAM,OAAO,CAAC;AACjD,QAAM,UAAU,UAAU,WAAW,MAAM,aAAa,CAAC;AACzD,QAAM,WAAW,GAAG,GAAG,IAAI,KAAK;AAEhC,MAAI,SAAS,SAAS,aAAa,KAAK,SAAS,SAAS,iBAAiB,KAAK,IAAI,SAAS,eAAe,GAAG;AAC7G,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS,aAAa,KAAK,SAAS,SAAS,aAAa,KAAK,MAAM,SAAS,eAAe,GAAG;AAC3G,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS,aAAa,KAAK,IAAI,SAAS,eAAe,GAAG;AACrE,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS,eAAe,KAAK,SAAS,SAAS,mBAAmB,GAAG;AAChF,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS,QAAQ,KAAK,MAAM,WAAW,MAAM,KAAK,IAAI,SAAS,QAAQ,GAAG;AACrF,WAAO;AAAA,EACT;AACA,MACE,IAAI,SAAS,QAAQ,KACrB,IAAI,SAAS,OAAO,KACpB,IAAI,SAAS,UAAU,KACvB,MAAM,SAAS,WAAW,KAC1B,MAAM,SAAS,OAAO,GACtB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,yBAAyB,0BAA0B,OAAO;AAChE,MAAI,wBAAwB;AAC1B,QAAI,YAAY,cAAc,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,UAAU,IAAI;AACzF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,QAAQ,EAAG,QAAO;AAExC,SAAO;AACT;AAGO,SAAS,0BAA0B,MAAwD;AAChG,QAAM,WAAW,sBAAsB,IAAI;AAC3C,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,EAAE,GAAG,MAAM,SAAS;AAC7B;;;ACrEA;;;ACIO,IAAM,0BAA0B;AAEvC,IAAM,gBAAgB,oBAAI,IAAI,CAAC,UAAU,QAAQ,WAAW,CAAC;AAE7D,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASC,YAAW,MAA+B,KAAqB;AACtE,QAAM,IAAI,KAAK,GAAG;AAClB,SAAO,OAAO,MAAM,WAAW,EAAE,KAAK,IAAI;AAC5C;AAEO,SAAS,uBAAuB,UAA8C;AACnF,MAAI,CAAC,UAAU,KAAK,EAAG,QAAO;AAC9B,QAAM,aAAa,SAAS,KAAK,EAAE,YAAY;AAC/C,MAAI,cAAc,IAAI,UAAU,EAAG,QAAO;AAC1C,SAAO,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,MAAM;AACpE;AAMO,SAAS,uBAAuB,MAA2D;AAChG,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,WAAW,KAAK;AACtB,MAAI,OAAO,aAAa,YAAY,uBAAuB,QAAQ,EAAG,QAAO;AAE7E,QAAM,MAAMA,YAAW,MAAM,aAAa,EAAE,YAAY;AACxD,MAAI,QAAQ,qBAAqB,IAAI,WAAW,kBAAkB,EAAG,QAAO;AAC5E,MAAI,IAAI,SAAS,wBAAwB,KAAK,IAAI,SAAS,iBAAiB,EAAG,QAAO;AAEtF,QAAM,cAAcA,YAAW,MAAM,aAAa;AAClD,MAAI,sBAAsB,KAAK,CAAC,OAAO,GAAG,KAAK,WAAW,CAAC,EAAG,QAAO;AAErE,QAAM,QAAQA,YAAW,MAAM,OAAO;AACtC,MAAI,yBAAyB,KAAK,KAAK,EAAG,QAAO;AAEjD,SAAO;AACT;AAWA,SAAS,kBAAkB,OAA2B,YAA0C;AAC9F,QAAM,UAAgC;AAAA,IACpC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM,wBAAwB,UAAU;AAAA,IACxC,gBAAgB;AAAA,EAClB;AACA,SAAO;AACT;AAMO,SAAS,4BACd,OACsB;AACtB,QAAM,EAAE,SAAS,KAAK,IAAI;AAC1B,QAAM,WAAW,MAAM,kBAAkB,KAAK,EAAE,YAAY;AAE5D,MAAI,MAAM,sCAAsC,uBAAuB,QAAQ,GAAG;AAChF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,MAAM,QAAQ,KAAK,WAAW,WAAW,IAAI,QAAQ,OAAO;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,uBAAuB,IAAI,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,kBAAkB,uBAAuB,QAAQ,QAAQ,GAAG;AAC/E,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,uBAAuB,QAAQ,QAAQ,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,SACJ,QAAQ,QAAQ,QAAQ,SAAS,mBAAmB,IAAI,QAAQ,KAAK,QAAQ,MAAM,GAAG,CAAC,KAAK;AAC9F,SAAO,kBAAkB,QAAQ,OAAO,MAAM;AAChD;AAGO,SAAS,gCACd,YACA,WAAmB,yBACX;AACR,QAAM,UAAU,YAAY,KAAK;AACjC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,uBAAuB,OAAO,EAAG,QAAO;AAC5C,MAAI,YAAY,QAAS,QAAO;AAChC,SAAO;AACT;AAGO,SAAS,qBAAqB,WAA+B;AAClE,QAAMC,UAAS,CAAC,GAAG,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACxF,MAAIA,QAAO,SAAS,uBAAuB,GAAG;AAC5C,WAAO,CAAC,GAAG,IAAI,IAAIA,QAAO,IAAI,CAAC,MAAO,uBAAuB,CAAC,IAAI,0BAA0B,CAAE,CAAC,CAAC;AAAA,EAClG;AACA,MAAIA,QAAO,MAAM,CAAC,MAAM,uBAAuB,CAAC,CAAC,GAAG;AAClD,WAAO,CAAC,uBAAuB;AAAA,EACjC;AACA,SAAOA;AACT;;;AC3HA,IAAM,eAAiF;AAAA,EACrF,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,aAAa,CAAC,eAAe,eAAe,qBAAqB;AAAA,IACjE,8BAA8B;AAAA,IAC9B,mCAAmC;AAAA,EACrC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,aAAa,CAAC,eAAe,aAAa;AAAA,IAC1C,8BAA8B;AAAA,IAC9B,mCAAmC;AAAA,EACrC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,aAAa,CAAC,aAAa;AAAA,IAC3B,8BAA8B;AAAA,IAC9B,mCAAmC;AAAA,EACrC;AACF;AAEO,SAAS,mCACd,IACiC;AACjC,SAAO,aAAa,EAAE;AACxB;AAEO,SAAS,wCAA2E;AACzF,SAAO,OAAO,OAAO,YAAY;AACnC;;;ACrCA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;;;ACFjB,SAAS,kBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAGnB,SAAS,qBAAqB,UAAsC;AACzE,MAAI;AACF,UAAM,KAAKD,UAAS,QAAQ;AAC5B,UAAM,WAAW,GAAG,QAAQ,IAAI,GAAG,IAAI,IAAI,GAAG,OAAO;AACrD,WAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,EACxE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,QAAwB;AACxD,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC/E;AAEO,SAAS,cACd,YACA,SACQ;AACR,aAAW,OAAO,SAAS;AACzB,UAAM,QAAQ,QAAQ,IAAI,GAAG,GAAG,KAAK;AACrC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,gBACd,KACA,MACA,UAII,CAAC,GAC2B;AAChC,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI;AACF,UAAM,SAASC,WAAU,KAAK,MAAM;AAAA,MAClC,UAAU;AAAA,MACV,SAAS;AAAA,MACT,KAAK,EAAE,GAAG,QAAQ,KAAK,IAAI,KAAK,UAAU,IAAI;AAAA,IAChD,CAAC;AACD,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,UAAU,GAAG,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,OAAO;AAAA,IAC5E;AACA,UAAM,UAAU,OAAO,UAAU,OAAO,UAAU,IAAI,KAAK;AAC3D,UAAM,SAAS,QAAQ,cAAc,GAAG,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;AAC7D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,SAAS,GAAG,MAAM,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC,KAAK;AAAA,IACxD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,eAAe,QAAQ,IAAI,UAAU,GAAG,GAAG;AAAA,IACnD;AAAA,EACF;AACF;AAGO,SAAS,qBACd,KACA,MACA,UAAsE,CAAC,GACvC;AAChC,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI;AACF,UAAM,SAASA,WAAU,KAAK,MAAM;AAAA,MAClC,OAAO;AAAA,MACP,SAAS;AAAA,MACT,KAAK,EAAE,GAAG,QAAQ,KAAK,IAAI,KAAK,UAAU,IAAI;AAAA,IAChD,CAAC;AACD,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,UAAU,GAAG,GAAG,iBAAiB;AAAA,IACpE;AACA,WAAO,EAAE,IAAI,OAAO,MAAM,QAAQ,YAAY,GAAG,GAAG,qBAAqB;AAAA,EAC3E,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,eAAe,QAAQ,IAAI,UAAU,GAAG,GAAG;AAAA,IACnD;AAAA,EACF;AACF;;;AD3EA,IAAM,oBAAoB;AAE1B,SAAS,sBAAgC;AACvC,QAAM,OAAOC,SAAQ;AACrB,SAAO;AAAA,IACLC,OAAK,KAAK,MAAM,UAAU,WAAW;AAAA,IACrCA,OAAK,KAAK,MAAM,WAAW,SAAS,WAAW;AAAA,EACjD;AACF;AAKO,SAAS,uBACd,UAAiB,oBAAI,KAAK,GAAE,YAAY,GACJ;AACpC,QAAM,MAAM,cAAc,mBAAmB,CAAC,oBAAoB,WAAW,CAAC;AAE9E,MAAI,QAAQ,IAAI,eAAe,KAAK,GAAG;AACrC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,oBAAoB,kBAAkB,eAAe;AAAA,MACrD,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,WAAW,oBAAoB,EAAE,KAAK,CAAC,MAAMC,aAAW,CAAC,CAAC;AAChE,QAAM,QAAQ,gBAAgB,KAAK,CAAC,SAAS,QAAQ,GAAG;AAAA,IACtD,QAAQ;AAAA,IACR,YAAY;AAAA,EACd,CAAC;AACD,QAAM,QAAQ,QAAQ,QAAQ,KAAK,MAAM;AAEzC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,IACZ,oBAAoB,WAAW,qBAAqB,QAAQ,IAAI;AAAA,IAChE,WAAW;AAAA,IACX,MAAM,QACF,8CACA,CAAC,MAAM,MAAM,WAAW,SAAY,uBAAuB,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAC5F;AACF;;;AEzDA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;AAoBjB,SAAS,sBAA8B;AACrC,QAAM,aAAa,QAAQ,IAAI,aAAa,KAAK;AACjD,QAAM,OAAO,aAAaC,OAAK,QAAQ,UAAU,IAAIA,OAAK,KAAKC,SAAQ,GAAG,SAAS;AACnF,SAAOD,OAAK,KAAK,MAAM,WAAW;AACpC;AAMO,SAAS,8BACd,UAAiB,oBAAI,KAAK,GAAE,YAAY,GACR;AAChC,QAAM,MAAM,cAAc,UAAU,CAAC,qBAAqB,YAAY,CAAC;AACvE,QAAM,MAAM,gBAAgB,KAAK,CAAC,WAAW,GAAG;AAAA,IAC9C,QAAQ,GAAG,GAAG;AAAA,IACd,YAAY,GAAG,GAAG;AAAA,EACpB,CAAC;AACD,QAAM,WAAW,oBAAoB;AACrC,QAAM,mBAAmBE,aAAW,QAAQ;AAC5C,QAAM,OAAO,qBAAqB,KAAK,CAAC,QAAQ,UAAU,cAAc,GAAG;AAAA,IACzE,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,QAAQ,IAAI,MAAM,KAAK;AAC7B,QAAM,aAAsC,QAAQ,wBAAwB;AAE5E,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,oBAAoB,mBAAmB,qBAAqB,QAAQ,IAAI;AAAA,IACxE,WAAW;AAAA,IACX,MAAM,QACF,yEACA,CAAC,IAAI,MAAM,KAAK,MAAM,mBAAmB,SAAY,wBAAwB,EAC1E,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EAClB;AACF;;;AC1CO,SAAS,iCACd,UAAiB,oBAAI,KAAK,GAAE,YAAY,GACP;AACjC,QAAM,aAAa,uBAAuB,MAAM;AAChD,MAAI,WAAW,OAAO;AACpB,WAAO,EAAE,GAAG,YAAY,MAAM,YAAY;AAAA,EAC5C;AAEA,QAAM,SAAS,8BAA8B,MAAM;AACnD,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY,OAAO;AAAA,MACnB,oBAAoB,OAAO;AAAA,MAC3B,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,MACN,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,MAAM,CAAC,WAAW,MAAM,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,KAAK;AAAA,EACrE;AACF;;;ACxCA,IAAM,kBAA2C,CAAC,OAAO,UAAU,MAAM;AAEzE,IAAM,mBAA4D;AAAA,EAChE,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,MAAM;AACR;AAEO,SAAS,uBACd,YACA,WACS;AACT,QAAM,MAAM,mCAAmC,UAAU;AACzD,MAAI,cAAc,aAAc,QAAO,IAAI;AAC3C,MAAI,cAAc,MAAO,QAAO,IAAI;AACpC,SAAO;AACT;AAEO,SAAS,0BACd,GACA,GACQ;AACR,QAAM,OAAO,mCAAmC,EAAE,UAAU;AAC5D,QAAM,OAAO,mCAAmC,EAAE,UAAU;AAC5D,QAAM,WACJ,gBAAgB,QAAQ,KAAK,QAAQ,IAAI,gBAAgB,QAAQ,KAAK,QAAQ;AAChF,MAAI,aAAa,EAAG,QAAO;AAC3B,QAAM,WACJ,iBAAiB,EAAE,QAAQ,UAAU,IAAI,iBAAiB,EAAE,QAAQ,UAAU;AAChF,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO,EAAE,WAAW,cAAc,EAAE,UAAU;AAChD;AAaO,SAAS,8BAA8B,OAGV;AAClC,QAAM,aAAa,sCAAsC,EACtD,IAAI,CAAC,SAAS;AAAA,IACb,YAAY,IAAI;AAAA,IAChB,SAAS,MAAM,UAAU,SAAS,IAAI,EAAE;AAAA,EAC1C,EAAE,EACD;AAAA,IACC,CAAC,MAAM,EAAE,QAAQ,SAAS,uBAAuB,EAAE,YAAY,MAAM,SAAS;AAAA,EAChF;AAEF,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,QAAM,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,yBAAyB;AAC7D,QAAM,SAAS,OAAO,CAAC;AACvB,QAAM,oBAA6C;AAEnD,MAAI,OAAO,eAAe,mBAAmB;AAC3C,WAAO,EAAE,YAAY,OAAO,YAAY,SAAS,OAAO,QAAQ;AAAA,EAClE;AAEA,QAAM,aAAa,MAAM,UAAU,SAAS,iBAAiB;AAC7D,MAAI;AACJ,MAAI,CAAC,uBAAuB,mBAAmB,MAAM,SAAS,GAAG;AAC/D,sBAAkB,GAAG,MAAM,SAAS;AAAA,EACtC,WAAW,CAAC,WAAW,OAAO;AAC5B,sBAAkB,WAAW,QAAQ,GAAG,iBAAiB;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,eAAe;AAAA,IACf;AAAA,EACF;AACF;;;AC7FA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;AAUjB,IAAM,qBAAqB;AAE3B,SAAS,4BAAsC;AAC7C,QAAM,OAAOC,SAAQ;AACrB,SAAO,CAACC,OAAK,KAAK,MAAM,WAAW,mBAAmB,CAAC;AACzD;AAMO,SAAS,wBACd,UAAiB,oBAAI,KAAK,GAAE,YAAY,GACJ;AACpC,QAAM,MAAM,cAAc,oBAAoB,CAAC,qBAAqB,YAAY,CAAC;AAEjF,MAAI,QAAQ,IAAI,mBAAmB,KAAK,GAAG;AACzC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,oBAAoB,kBAAkB,mBAAmB;AAAA,MACzD,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,MAAM,gBAAgB,KAAK,CAAC,WAAW,GAAG;AAAA,IAC9C,QAAQ,GAAG,GAAG;AAAA,IACd,YAAY,GAAG,GAAG;AAAA,EACpB,CAAC;AACD,QAAM,WAAW,0BAA0B,EAAE,KAAK,CAAC,MAAMC,aAAW,CAAC,CAAC;AACtE,QAAM,QAAQ,qBAAqB,KAAK,CAAC,QAAQ,QAAQ,GAAG;AAAA,IAC1D,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,QAAQ,IAAI,OAAO,MAAM,MAAM,QAAQ,QAAQ;AAErD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,IACZ,oBAAoB,WAAW,qBAAqB,QAAQ,IAAI;AAAA,IAChE,WAAW;AAAA,IACX,MAAM,QACF,oDACA,CAAC,IAAI,MAAM,MAAM,MAAM,WAAW,SAAY,gCAAgC,EAC3E,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EAClB;AACF;;;AC9DA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;AASjB,IAAM,oBAAoB;AAE1B,SAAS,4BAAsC;AAC7C,QAAM,OAAOC,SAAQ;AACrB,SAAO,CAACC,OAAK,KAAK,MAAM,WAAW,UAAU,WAAW,CAAC;AAC3D;AAKO,SAAS,wBACd,UAAiB,oBAAI,KAAK,GAAE,YAAY,GACJ;AACpC,QAAM,MAAM,cAAc,mBAAmB;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,IAAI,gBAAgB,KAAK,GAAG;AACtC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,oBAAoB,kBAAkB,gBAAgB;AAAA,MACtD,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,MAAM,gBAAgB,KAAK,CAAC,IAAI,GAAG;AAAA,IACvC,QAAQ,GAAG,GAAG;AAAA,IACd,YAAY,GAAG,GAAG;AAAA,EACpB,CAAC;AACD,QAAM,WAAW,0BAA0B,EAAE,KAAK,CAAC,MAAMC,aAAW,CAAC,CAAC;AACtE,QAAM,QAAQ,QAAQ,QAAQ,KAAK,IAAI;AAEvC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,IACZ,oBAAoB,WAAW,qBAAqB,QAAQ,IAAI;AAAA,IAChE,WAAW;AAAA,IACX,MAAM,QACF,wDACA,CAAC,IAAI,MAAM,WAAW,SAAY,+BAA+B,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClG;AACF;;;ACzDA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AAkBjB,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,uBAA+B;AACtC,QAAM,aAAa,QAAQ,IAAI,aAAa,KAAK;AACjD,QAAM,OAAO,aAAaC,OAAK,QAAQ,UAAU,IAAIA,OAAK,KAAKC,UAAQ,GAAG,SAAS;AACnF,SAAOD,OAAK,KAAK,MAAM,MAAM;AAC/B;AAGA,SAAS,sBAAsB,SAA2B;AACxD,MAAI;AACF,UAAM,OAAOE,eAAa,SAAS,MAAM;AACzC,UAAM,UAAoB,CAAC;AAC3B,eAAW,OAAO,kBAAkB;AAClC,YAAM,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK,GAAG;AACrC,UAAI,GAAG,KAAK,IAAI,EAAG,SAAQ,KAAK,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMO,SAAS,sBACd,UAAiB,oBAAI,KAAK,GAAE,YAAY,GAChB;AACxB,QAAM,MAAM,cAAc,UAAU,CAAC,qBAAqB,YAAY,CAAC;AACvE,QAAM,MAAM,gBAAgB,KAAK,CAAC,WAAW,GAAG;AAAA,IAC9C,QAAQ,GAAG,GAAG;AAAA,IACd,YAAY,GAAG,GAAG;AAAA,EACpB,CAAC;AACD,QAAM,cAAc,qBAAqB;AACzC,QAAM,eAAeC,aAAW,WAAW;AAC3C,QAAM,UAAU,eAAe,sBAAsB,WAAW,IAAI,CAAC;AACrE,QAAM,aAAa,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,CAAC;AAC7D,QAAM,aAAsC,aAAa,gBAAgB,eAAe,gBAAgB;AACxG,QAAM,QAAQ,IAAI,MAAM;AAExB,SAAO;AAAA,IACL,WAAW;AAAA,IACX,cAAc,IAAI;AAAA,IAClB;AAAA,IACA;AAAA,IACA,oBAAoB,eAAe,qBAAqB,WAAW,IAAI;AAAA,IACvE,WAAW;AAAA,IACX,MAAM,QACF,yBAAyB,QAAQ,SAAS,SAAS,QAAQ,KAAK,IAAI,CAAC,KAAK,sBAAsB,MAChG,CAAC,IAAI,MAAM,eAAe,SAAY,mBAAmB,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAC1F;AACF;;;ACpCO,SAAS,oCACd,UAAsD,CAAC,GACvB;AAChC,QAAM,cAAc,QAAQ,SAAS,MAAK,oBAAI,KAAK,GAAE,YAAY;AACjE,QAAM,eAAe,iCAAiC,WAAW;AACjE,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP,QAAQ,wBAAwB,WAAW;AAAA,IAC3C,QAAQ,wBAAwB,WAAW;AAAA,EAC7C;AAEA,QAAM,aAAa,OAAO,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AAElE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,MACf,iBAAiB,QAAQ,QAAQ,IAAI,mBAAmB,KAAK,CAAC;AAAA,MAC9D,cAAc,QAAQ,QAAQ,IAAI,gBAAgB,KAAK,CAAC;AAAA,MACxD,aAAa,QAAQ,QAAQ,IAAI,eAAe,KAAK,CAAC;AAAA,IACxD;AAAA,IACA,QAAQ,sBAAsB,WAAW;AAAA,IACzC,mBAAmB,8BAA8B,WAAW;AAAA,IAC5D,kBAAkB,aAAa;AAAA,IAC/B;AAAA,EACF;AACF;AAEO,SAAS,kCACd,YACA,QACoC;AACpC,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,iCAAiC,MAAM;AAAA,IAChD,KAAK;AACH,aAAO,wBAAwB,MAAM;AAAA,IACvC,KAAK;AACH,aAAO,wBAAwB,MAAM;AAAA,EACzC;AACF;;;ACpEA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASC,YAAW,MAA+B,KAAqB;AACtE,QAAM,IAAI,KAAK,GAAG;AAClB,SAAO,OAAO,MAAM,WAAW,EAAE,KAAK,IAAI;AAC5C;AAEO,SAAS,0BAA0B,MAAuD;AAC/F,QAAM,MAAMA,YAAW,MAAM,aAAa,EAAE,YAAY;AACxD,QAAM,QAAQA,YAAW,MAAM,OAAO,EAAE,YAAY;AACpD,QAAM,cAAcA,YAAW,MAAM,aAAa,EAAE,YAAY;AAChE,QAAM,OAAO,GAAG,GAAG;AAAA,EAAK,KAAK;AAAA,EAAK,WAAW;AAE7C,MAAI,mBAAmB,KAAK,CAAC,OAAO,GAAG,KAAK,IAAI,CAAC,EAAG,QAAO;AAC3D,MAAI,IAAI,SAAS,iBAAiB,KAAK,IAAI,SAAS,aAAa,KAAK,IAAI,SAAS,UAAU,GAAG;AAC9F,WAAO;AAAA,EACT;AACA,MACE,IAAI,SAAS,SAAS,KACtB,IAAI,SAAS,QAAQ,KACrB,MAAM,WAAW,OAAO,KACxB,IAAI,SAAS,aAAa,KAC1B,IAAI,SAAS,QAAQ,KACrB,MAAM,SAAS,WAAW,GAC1B;AACA,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,KAAK,CAAC,OAAO,GAAG,KAAK,IAAI,CAAC,GAAG;AAChD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAQU;AAC5B,QAAM,MAAM,mCAAmC,MAAM,QAAQ;AAC7D,QAAM,gBACJ,MAAM,iBAAiB,MAAM,kBACzB,kBAAkB,MAAM,aAAa,KAAK,MAAM,eAAe,YAAY,IAAI,WAAW,KAAK,IAAI,QAAQ,WAC3G,GAAG,IAAI,WAAW,iBAAiB,MAAM,SAAS,mBAAmB,IAAI,QAAQ,eAAe,MAAM,UAAU;AAEtH,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,YAAY,MAAM;AAAA,IAClB,UAAU,IAAI;AAAA,IACd,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,iBAAiB,MAAM;AAAA,EACzB;AACF;AAEA,SAAS,iBAAiB,OAGS;AACjC,QAAM,YAAY,MAAM,aAAa,oCAAoC;AACzE,MAAI,CAAC,MAAM,aAAc,QAAO;AAChC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,EAAE,GAAG,UAAU,UAAU,OAAO,MAAM,aAAa;AAAA,EAC/D;AACF;AAEA,SAAS,oBAAoB,OAQI;AAC/B,QAAM,QAAQ,WAAW;AAAA,IACvB,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,YAAY,MAAM,QAAQ;AAAA,IAC1B,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,iBAAiB,MAAM;AAAA,EACzB,CAAC;AACD,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ;AAAA,EACF;AACF;AAeO,SAAS,4BACd,OAC8B;AAC9B,QAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,QAAM,OAAO,0BAA0B,IAAI;AAC3C,QAAM,YAAY,iBAAiB;AAAA,IACjC,WAAW,MAAM;AAAA;AAAA;AAAA,IAGjB,cACE,MAAM,iBAAiB,MAAM,YAAY,OAAO,iCAAiC;AAAA,EACrF,CAAC;AACD,QAAM,WAAW,MAAM,kBAAkB,QAAQ,OAAO,MAAM,kBAAkB,KAAK,EAAE,YAAY;AACnG,QAAM,gBAAgB,MAAM,eAAe,KAAK,KAAK;AACrD,QAAM,mBAAmB;AAEzB,MAAI,aAAa,WAAW,aAAa,kBAAkB;AACzD,UAAM,UAAU,UAAU,SAAS;AACnC,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAMC,aAAY,8BAA8B,EAAE,WAAW,WAAW,KAAK,CAAC;AAC9E,UAAIA,YAAW;AACb,eAAO,oBAAoB;AAAA,UACzB,YAAYA,WAAU;AAAA,UACtB,SAASA,WAAU;AAAA,UACnB,WAAW;AAAA,UACX,aAAa;AAAA,UACb,OAAO;AAAA,UACP,eAAe;AAAA,UACf,iBAAiB,QAAQ,QAAQ;AAAA,QACnC,CAAC;AAAA,MACH;AACA,aAAO,oBAAoB;AAAA,QACzB,YAAY;AAAA,QACZ,SAAS,UAAU,SAAS,gBAAgB;AAAA,QAC5C,WAAW;AAAA,QACX,aAAa;AAAA,QACb,OAAO;AAAA,QACP,eAAe;AAAA,QACf,iBAAiB,QAAQ,QAAQ;AAAA,MACnC,CAAC;AAAA,IACH;AACA,WAAO,oBAAoB;AAAA,MACzB,YAAY;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,YAAY,aAAa,mBAAmB;AAC3D,UAAM,UAAU,UAAU,SAAS;AACnC,QAAI,QAAQ,OAAO;AACjB,aAAO,oBAAoB;AAAA,QACzB,YAAY;AAAA,QACZ;AAAA,QACA,WAAW;AAAA,QACX,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,aAAa,YAAY,aAAa,mBAAmB;AAC3D,UAAM,UAAU,UAAU,SAAS;AACnC,QAAI,QAAQ,OAAO;AACjB,aAAO,oBAAoB;AAAA,QACzB,YAAY;AAAA,QACZ;AAAA,QACA,WAAW;AAAA,QACX,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,8BAA8B,EAAE,WAAW,WAAW,KAAK,CAAC;AAC9E,MAAI,WAAW;AACb,WAAO,oBAAoB;AAAA,MACzB,YAAY,UAAU;AAAA,MACtB,SAAS,UAAU;AAAA,MACnB,WAAW;AAAA,MACX,aAAa,4BAA4B,UAAU,UAAU;AAAA,MAC7D,OAAO;AAAA,MACP,eAAe,UAAU;AAAA,MACzB,iBAAiB,UAAU;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,UAAU,SAAS;AACxC,SAAO,oBAAoB;AAAA,IACzB,YAAY;AAAA,IACZ,SAAS,UAAU,SAAS,gBAAgB;AAAA,IAC5C,WAAW;AAAA,IACX,aAAa,aAAa,QACtB,iDACA;AAAA,IACJ,OAAO;AAAA,IACP,GAAI,aAAa,QACb,CAAC,IACD,EAAE,eAAe,SAAS,iBAAiB,aAAa,QAAQ,wBAAwB;AAAA,EAC9F,CAAC;AACH;;;ACtPA;AACA;AAHA,SAAS,WAAW,gBAAgB;AACpC,SAAS,aAAgC;;;ACoCzC,IAAM,sBACJ;AAGK,SAAS,qBAAqB,OAAuB;AAC1D,SAAO,MAAM,QAAQ,qBAAqB,EAAE;AAC9C;AAGA,IAAM,mBAAmB;AAGzB,SAAS,qBAAqB,OAAwB;AACpD,SAAO,eAAe,KAAK,KAAK,KAAK,4BAA4B,KAAK,KAAK;AAC7E;AAGA,IAAM,uBAAuB,oBAAI,IAAI,CAAC,QAAQ,CAAC;AAOxC,SAAS,0BAA0B,OAA8B;AACtE,QAAM,MAAM,MAAM,KAAK,EAAE,YAAY;AACrC,MAAI,qBAAqB,IAAI,GAAG,EAAG,QAAO;AAC1C,SAAO;AACT;AAMO,SAAS,qBACd,OACA,cACsB;AACtB,QAAM,aAAa,SAAS,IAAI,KAAK;AACrC,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,IAAI,MAAM,OAAO,cAAc,YAAY,MAAM;AAAA,EAC5D;AAEA,QAAM,WAAW,qBAAqB,SAAS,EAAE,KAAK;AACtD,QAAM,SAAS,YAAY;AAE3B,MAAI,iBAAiB,KAAK,MAAM,KAAM,CAAC,qBAAqB,MAAM,KAAK,WAAW,cAAe;AAC/F,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,MACE,UAAU,SAAS,2HACwC,MAAM;AAAA,IAErE;AAAA,EACF;AAEA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,MAAM,qBAAqB,SAAS,aAAQ,MAAM;AAAA,IACpD;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,OAAO,QAAQ,YAAY,MAAM;AACtD;AAQO,SAAS,oBACd,OACA,cACsB;AACtB,QAAM,aAAa,SAAS,IAAI,KAAK;AACrC,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,IAAI,MAAM,OAAO,cAAc,YAAY,MAAM;AAAA,EAC5D;AACA,MAAI,qBAAqB,SAAS,GAAG;AACnC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,MACE,UAAU,SAAS;AAAA,IAEvB;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,OAAO,WAAW,YAAY,MAAM;AACzD;AAEO,SAAS,qBACd,OACA,cACsB;AACtB,QAAM,aAAa,SAAS,IAAI,KAAK;AACrC,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,IAAI,MAAM,OAAO,cAAc,YAAY,MAAM;AAAA,EAC5D;AACA,QAAM,cAAc,0BAA0B,SAAS;AACvD,MAAI,aAAa;AACf,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,MACE,qBAAqB,SAAS,aAAQ,WAAW;AAAA,IAErD;AAAA,EACF;AACA,MAAI,qBAAqB,SAAS,GAAG;AACnC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA,MACE,UAAU,SAAS;AAAA,IAEvB;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,OAAO,WAAW,YAAY,MAAM;AACzD;;;ADhKO,IAAM,uBAAuB;AAE7B,IAAM,iBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,cAAc;AAAA,EACd,eAAe,OAAO;AACpB,WAAO,qBAAqB,OAAO,oBAAoB;AAAA,EACzD;AAAA,EACA,MAAM,MAAM;AAGV,UAAM,YAAY,qBAAqB,KAAK,OAAO,oBAAoB;AACvE,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,IAAI,MAAM,2CAA2C,UAAU,IAAI,EAAE;AAAA,IAC7E;AACA,UAAM,QAAQ,UAAU;AACxB,UAAM,WAAW,SAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,WAAW,SAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,QAAsB,CAAC,UAAU,UAAU,QAAQ;AACzD,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AAAA,MACA,mBAAmB;AAAA,QACjB,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA,KAAK,eAAe,QAAQ,GAAG;AAAA,MACjC,CAAC;AAAA,IACH;AACA,cAAU,QAAQ;AAClB,cAAU,QAAQ;AAElB,QAAI,CAAC,MAAM,KAAK;AACd,YAAM,IAAI,MAAM,sEAAsE;AAAA,IACxF;AACA,UAAM,MAAM;AACZ,WAAO,EAAE,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC;AACF;;;AEvDA;AACA;AAHA,SAAS,aAAAC,YAAW,cAAAC,cAAY,YAAAC,iBAAgB;AAChD,SAAS,SAAAC,cAAgC;;;ACCzC;AACA;AAHA,SAAS,aAAAC,YAAW,YAAAC,iBAAgB;AACpC,SAAS,SAAAC,cAAgC;AAYlC,IAAM,oCACX,QAAQ,IAAI,4BAA4B,KAAK,KAAK;AAEpD,SAAS,kBAAqC;AAC5C,SAAO,eAAe;AAAA,IACpB,GAAG,QAAQ;AAAA,IACX,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,qBAAqB,QAAQ,IAAI,uBAAuB;AAAA,EAC1D,CAAC;AACH;AAMO,SAAS,+BAA+B,OAAe,QAA0B;AACtF,QAAM,WAAW,QAAQ,IAAI,+BAA+B,KAAK,KAAK;AACtE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,sBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,cAAc;AAAA,EACd,eAAe,OAAO;AACpB,WAAO,oBAAoB,OAAO,iCAAiC;AAAA,EACrE;AAAA,EACA,MAAM,MAAM;AACV,UAAM,YAAY,oBAAoB,KAAK,OAAO,iCAAiC;AACnF,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,IAAI,MAAM,iDAAiD,UAAU,IAAI,EAAE;AAAA,IACnF;AACA,UAAM,QAAQ,UAAU;AACxB,UAAM,WAAWC,UAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,WAAWA,UAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,QAAsB,CAAC,UAAU,UAAU,QAAQ;AACzD,UAAM,MAAM,cAAc,UAAU,CAAC,qBAAqB,YAAY,CAAC;AACvE,UAAM,OAAO,+BAA+B,OAAO,KAAK,MAAM;AAC9D,UAAM,QAAQC;AAAA,MACZ;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,QACjB,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,QACA,KAAK,gBAAgB;AAAA,MACvB,CAAC;AAAA,IACH;AACA,IAAAC,WAAU,QAAQ;AAClB,IAAAA,WAAU,QAAQ;AAElB,QAAI,CAAC,MAAM,KAAK;AACd,YAAM,IAAI;AAAA,QACR,oDAAoD,GAAG;AAAA,MACzD;AAAA,IACF;AACA,UAAM,MAAM;AACZ,WAAO,EAAE,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC;AACF;;;ADzEO,SAAS,2BAAmC;AACjD,SAAO,QAAQ,IAAI,4BAA4B,KAAK,KAAK;AAC3D;AAEO,IAAM,sBAAsB,yBAAyB;AAE5D,SAAS,kBAA0B;AACjC,SACE,QAAQ,IAAI,kBAAkB,KAAK,KACnC,QAAQ,IAAI,WAAW,KAAK,KAC5B;AAEJ;AAEA,SAAS,iBAAoC;AAC3C,SAAO,eAAe;AAAA,IACpB,GAAG,QAAQ;AAAA,IACX,IAAI;AAAA,IACJ,UAAU;AAAA,EACZ,CAAC;AACH;AAMO,SAAS,mBAAmB,OAAe,QAA0B;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,kBACP,KACA,MACA,MAC0B;AAC1B,QAAM,YAAY,QAAQ,aAAa,WAAWC,aAAW,iBAAiB;AAC9E,MAAI,CAAC,WAAW;AACd,WAAOC,OAAM,KAAK,MAAM,IAAI;AAAA,EAC9B;AACA,QAAM,SAAS,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,QAAQ,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG;AAClF,SAAOA,OAAM,UAAU,CAAC,QAAQ,QAAQ,WAAW,GAAG,IAAI;AAC5D;AAEO,IAAM,gBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,cAAc;AAAA,EACd,eAAe,OAAO;AACpB,WAAO,oBAAoB,OAAO,mBAAmB;AAAA,EACvD;AAAA,EACA,MAAM,MAAM;AACV,UAAM,UAAU,iCAAiC;AACjD,QAAI,QAAQ,SAAS,uBAAuB;AAC1C,aAAO,oBAAoB,MAAM,IAAI;AAAA,IACvC;AAEA,UAAM,YAAY,oBAAoB,KAAK,OAAO,mBAAmB;AACrE,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,IAAI,MAAM,0CAA0C,UAAU,IAAI,EAAE;AAAA,IAC5E;AACA,UAAM,QAAQ,UAAU;AACxB,UAAM,WAAWC,UAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,WAAWA,UAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,QAAsB,CAAC,UAAU,UAAU,QAAQ;AACzD,UAAM,MAAM,gBAAgB;AAC5B,UAAM,OAAO,mBAAmB,OAAO,KAAK,MAAM;AAClD,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,QACjB,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,QACA,KAAK,eAAe;AAAA,MACtB,CAAC;AAAA,IACH;AACA,IAAAC,WAAU,QAAQ;AAClB,IAAAA,WAAU,QAAQ;AAElB,QAAI,CAAC,MAAM,KAAK;AACd,YAAM,IAAI;AAAA,QACR,sCAAsC,GAAG;AAAA,MAC3C;AAAA,IACF;AACA,UAAM,MAAM;AACZ,WAAO,EAAE,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC;AACF;;;AfvGO,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAepC,SAASC,YAAW,MAA+B,KAAqB;AACtE,QAAM,IAAI,KAAK,GAAG;AAClB,SAAO,OAAO,MAAM,WAAW,EAAE,KAAK,IAAI;AAC5C;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,YAAY;AACzB;AAGO,SAAS,0BAA0B,SAA2B,eAAe,GAAW;AAC7F,QAAM,aAAa,OAAO,cAAc,KAAK;AAC7C,MAAI,WAAY,QAAO;AACvB,QAAM,UAAU,QAAQ,IAAI,sBAAsB,KAAK;AACvD,MAAI,QAAS,QAAO;AACpB,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAmC;AACjE,QAAM,KAAK,SAAS,IAAI,YAAY;AACpC,MAAI,CAAC,EAAG,QAAO;AACf,MACE,EAAE,SAAS,UAAU,KACrB,EAAE,SAAS,QAAQ,KACnB,EAAE,SAAS,OAAO,KAClB,EAAE,WAAW,MAAM,KACnB,EAAE,WAAW,MAAM,GACnB;AACA,WAAO;AAAA,EACT;AACA,MAAI,eAAe,KAAK,CAAC,KAAK,4BAA4B,KAAK,CAAC,GAAG;AACjE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,OAAe,kBAAmE;AACrH,QAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,QAAM,WAAW,kBAAkB,KAAK;AACxC,MAAI,UAAU,UAAU;AACtB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MACE,YAAY,aAAa,WACrB,oDACA;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AACA,MAAI,UAAU,YAAY,UAAU,aAAa;AAC/C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MACE,YAAY,aAAa,WACrB,oDACA;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,OAAwB;AACvD,MAAI,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,QAAQ,EAAG,QAAO;AAC3D,MAAI,IAAI,SAAS,UAAU,EAAG,QAAO;AACrC,MAAI,IAAI,SAAS,aAAa,KAAK,IAAI,SAAS,aAAa,EAAG,QAAO;AACvE,MAAI,MAAM,SAAS,aAAa,KAAK,MAAM,SAAS,iBAAiB,EAAG,QAAO;AAC/E,MAAI,IAAI,SAAS,MAAM,KAAK,CAAC,IAAI,SAAS,QAAQ,MAAM,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,UAAU,IAAI;AAC3G,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,0BAA0B,MAAqD;AAC7F,QAAM,MAAM,aAAaA,YAAW,MAAM,aAAa,CAAC;AACxD,QAAM,QAAQA,YAAW,MAAM,OAAO,EAAE,YAAY;AACpD,QAAM,WAAWA,YAAW,MAAM,UAAU,KAAK;AACjD,QAAM,WAAW,aAAaA,YAAW,MAAM,UAAU,CAAC;AAG1D,MAAI,IAAI,SAAS,gBAAgB,KAAK,IAAI,WAAW,QAAQ,GAAG;AAC9D,WAAO,EAAE,UAAU,SAAS,OAAO,qBAAqB,MAAM,2BAA2B;AAAA,EAC3F;AACA,MACE,IAAI,SAAS,QAAQ,KACrB,IAAI,SAAS,UAAU,KACvB,IAAI,SAAS,SAAS,KACtB,aAAa,iBACb,aAAa,sBACb;AACA,WAAO,EAAE,UAAU,UAAU,MAAM,sBAAsB;AAAA,EAC3D;AACA,MAAI,IAAI,SAAS,OAAO,GAAG;AACzB,WAAO,EAAE,UAAU,SAAS,OAAO,qBAAqB,MAAM,2BAA2B;AAAA,EAC3F;AAGA,MAAI,IAAI,SAAS,SAAS,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,SAAS,QAAQ,GAAG;AACpF,WAAO,EAAE,UAAU,UAAU,MAAM,eAAe;AAAA,EACpD;AAGA,MAAI,IAAI,SAAS,QAAQ,KAAK,eAAe,KAAK,KAAK,KAAK,SAAS,SAAS,QAAQ,GAAG;AACvF,QAAI,WAAW,KAAK,KAAK,KAAK,aAAa,iBAAiB;AAC1D,aAAO,EAAE,UAAU,UAAU,MAAM,mBAAmB;AAAA,IACxD;AACA,WAAO,EAAE,UAAU,UAAU,MAAM,cAAc;AAAA,EACnD;AAGA,MAAI,WAAW,KAAK,KAAK,KAAK,aAAa,eAAe;AACxD,WAAO,EAAE,UAAU,UAAU,MAAM,gBAAgB;AAAA,EACrD;AAEA,MAAI,aAAa,YAAY;AAC3B,WAAO,EAAE,UAAU,UAAU,MAAM,oBAAoB;AAAA,EACzD;AACA,MAAI,aAAa,QAAQ;AACvB,WAAO,EAAE,UAAU,UAAU,MAAM,gBAAgB;AAAA,EACrD;AACA,MAAI,aAAa,OAAO;AACtB,WAAO,EAAE,UAAU,UAAU,MAAM,eAAe;AAAA,EACpD;AAEA,QAAM,QAAQ,0BAA0B;AACxC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,uBAAuB,KAAK;AAAA,IACtC,MAAM;AAAA,EACR;AACF;AAGO,SAAS,oBAAoB,OAMX;AACvB,MAAI;AAEJ,MAAI,MAAM,eAAe,KAAK,GAAG;AAC/B,UAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,UAAM,gBAAgB,4BAA4B,OAAO,MAAM,gBAAgB;AAC/E,QAAI,eAAe;AACjB,iBAAW;AAAA,IACb,OAAO;AACL,iBAAW;AAAA,QACT;AAAA,QACA,UAAU,MAAM,kBAAkB,KAAK,KAAK,uBAAuB,KAAK;AAAA,QACxE,MAAM;AAAA,QACN,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF,WAAW,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,EAAE,SAAS,GAAG;AAC3D,UAAM,WAAW,0BAA0B,MAAM,IAAI;AACrD,eAAW;AAAA,MACT,GAAG;AAAA,MACH,gBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,0BAA0B;AACxC,eAAW;AAAA,MACT;AAAA,MACA,UAAU,MAAM,kBAAkB,KAAK,KAAK,uBAAuB,KAAK;AAAA,MACxE,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,oBAAoB,4BAA4B;AAAA,IACpD,SAAS;AAAA,IACT,MAAM,MAAM;AAAA,IACZ,kBAAkB,MAAM;AAAA,IACxB,oCAAoC,MAAM;AAAA,EAC5C,CAAC;AAED,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,EAAE,WAAW,GAAG;AACvD,WAAO;AAAA,EACT;AAKA,MACE,kBAAkB,SAAS,mCAC3B,kBAAkB,SAAS,qDAC3B,kBAAkB,SAAS,gBAC3B;AACA,WAAO;AAAA,EACT;AAEA,MACE,uBAAuB,kBAAkB,QAAQ,MAChD,MAAM,sCAAsC,uBAAuB,MAAM,IAAI,IAC9E;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,4BAA4B;AAAA,IAChD,MAAM,MAAM;AAAA,IACZ,kBAAkB,MAAM,oBAAoB,kBAAkB;AAAA,IAC9D,eAAe,kBAAkB;AAAA,EACnC,CAAC;AAED,SAAO;AAAA,IACL,UAAU,cAAc;AAAA,IACxB,OACE,cAAc,aAAa,UACvB,cAAc,SAAS,kBAAkB,SAAS,sBAClD,kBAAkB;AAAA,IACxB,MAAM,cAAc;AAAA,IACpB,gBAAgB,kBAAkB;AAAA,IAClC,oBAAoB,cAAc;AAAA,EACpC;AACF;AAGO,SAAS,qBACd,cACA,aACA,iBACQ;AACR,SAAO,gBAAgB,eAAe,mBAAmB,0BAA0B,KAAK;AAC1F;;;AiB7PA,SAASC,aAAY,OAA2B,UAA0B;AACxE,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO,KAAK,MAAM,CAAC;AACrB;AASO,SAAS,yBAA6C;AAC3D,SAAO;AAAA,IACL,iBAAiBA,aAAY,QAAQ,IAAI,0BAA0B,CAAC;AAAA,IACpE,oBAAoBA,aAAY,QAAQ,IAAI,6BAA6B,GAAK;AAAA,EAChF;AACF;;;ACnBA;AADA,OAAOC,YAAU;AAGjB;AACA;AAEA;;;ACNA,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AAEtB,SAASC,YAAW,OAAiD;AACnE,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,SAAO,MAAM,KAAK;AACpB;AAGO,SAAS,uBAAuB,YAAsD;AAC3F,QAAM,QAAQA,YAAW,UAAU;AACnC,MAAI,CAAC,OAAO,WAAW,oBAAoB,EAAG,QAAO;AACrD,QAAM,OAAO,MAAM,MAAM,qBAAqB,MAAM;AACpD,QAAM,WAAW,KAAK,QAAQ,aAAa;AAC3C,MAAI,YAAY,EAAG,QAAO,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,KAAK;AAC5D,SAAO,KAAK,KAAK,KAAK;AACxB;AAWO,SAAS,wBAAwB,OAAe,UAA0B;AAC/E,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,SAAS,SAAS,KAAK;AAC7B,SAAO,GAAG,oBAAoB,GAAG,GAAG,GAAG,aAAa,GAAG,MAAM;AAC/D;AAGO,SAAS,4BACd,YACA,OACS;AACT,QAAM,cAAcC,YAAW,KAAK;AACpC,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,uBAAuB,UAAU,MAAM;AAChD;AAGO,SAAS,mCAAmC,OAIxC;AACT,QAAM,SAASA,YAAW,MAAM,gBAAgB;AAChD,MAAI,UAAU,4BAA4B,QAAQ,MAAM,KAAK,GAAG;AAC9D,WAAO;AAAA,EACT;AACA,SAAO,wBAAwB,MAAM,OAAO,MAAM,QAAQ;AAC5D;;;ACtDA,OAAOC,SAAQ;;;ACCf;AAEA;AAHA,OAAOC,SAAQ;AAMR,SAAS,sBAAsB,MAAyB,QAAQ,KAAa;AAClF,SAAO,mBAAmB,GAAG,EAAE;AACjC;AAEO,SAAS,aAAa,SAAiB,WAAmC;AAC/E,QAAM,QAAQ,aAAaA,IAAG,SAAS,GAAG,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,KAAK;AACvF,SAAO,GAAG,OAAO,IAAI,IAAI;AAC3B;;;ADVA,SAASC,YAAW,OAA0C;AAC5D,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,SAAO,MAAM,KAAK;AACpB;AAsBO,SAAS,6BAA6B,QAGzC,CAAC,GAA0B;AAC7B,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,QAAM,WACJC,YAAW,IAAI,iBAAiB,KAChCA,YAAW,IAAI,mBAAmB,KAClCA,YAAW,IAAI,QAAQ,KACvBC,IAAG,SAAS;AAEd,SAAO;AAAA,IACL;AAAA,IACA,UAAUD,YAAW,IAAI,QAAQ,KAAKC,IAAG,SAAS;AAAA,IAClD,SACED,YAAW,IAAI,qBAAqB,KAAKA,YAAW,IAAI,uBAAuB;AAAA,IACjF,aAAaA,YAAW,IAAI,mBAAmB,KAAKA,YAAW,IAAI,mBAAmB;AAAA,IACtF,OAAO,MAAM,SAAS;AAAA,EACxB;AACF;;;AF9BA,SAAS,aAAa,OAAe,MAA+C;AAClF,SAAO;AAAA,IACLE,OAAK,KAAK,aAAa,KAAK,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,IACvE;AAAA,EACF;AACF;AAMA,eAAsB,sBACpB,OACA,MACkC;AAClC,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EAChD;AAEA,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,MAAM;AAAA,IACnB,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,IACpC;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AACA,QAAM,kBACJ,OAAO,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC,IAAI;AAChE,QAAM,WAAW,6BAA6B,EAAE,MAAM,CAAC,EAAE;AAEzD,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAoD,CAAC;AAC3D,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,SAAS,aAAa,OAAO,IAAI;AACvC,QAAI,CAAC,QAAQ,UAAU,CAAC,OAAO,WAAW;AACxC,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,QAAI,CAAC,WAAW,OAAO,GAAG,GAAG;AAC3B,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,UAAM,SAAS,oBAAoB,MAAM;AACzC,QAAI,OAAO,WAAW,QAAQ;AAC5B,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AAEA,UAAM,aAAa,mCAAmC;AAAA,MACpD;AAAA,MACA,kBAAkB,OAAO,cAAc;AAAA,MACvC;AAAA,IACF,CAAC;AAED,UAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,OAAO,MAAM,CAAC;AAClH,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC/D;AAAA,MACA,EAAE,WAAW,SAAS,KAAK;AAAA,IAC7B;AACA,QAAI,IAAI,IAAI;AACV,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,UAAM,SACJ,IAAI,YAAY,OAAO,IAAI,aAAa,YAAY,YAAY,IAAI,WAChE,OAAQ,IAAI,SAAkC,UAAU,QAAQ,IAAI,MAAM,EAAE,IAC5E,QAAQ,IAAI,MAAM;AACxB,WAAO,KAAK,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,EACtC;AAEA,SAAO,EAAE,SAAS,QAAQ,QAAQ;AACpC;AAGO,SAAS,qBAAqB,OAAe,QAAyB;AAC3E,QAAM,MAAM,QAAQ,KAAK;AACzB,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,SAAS,aAAa,OAAO,IAAI;AACvC,QAAI,CAAC,UAAU,OAAO,WAAW,OAAQ;AACzC,QAAI,CAAC,WAAW,OAAO,GAAG,EAAG;AAC7B,UAAM,SAAS,oBAAoB,MAAM;AACzC,QAAI,OAAO,WAAW,OAAQ;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AI7GA;AACA;AACA;AAJA,SAAS,cAAAC,cAAY,aAAAC,kBAAiB;AACtC,OAAOC,YAAU;;;ACCjB,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAahC,SAASC,YAAW,OAA+B;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,IAAI,MAAM,KAAK;AACrB,SAAO,EAAE,SAAS,IAAI;AACxB;AAEO,SAASC,gBAAe,KAA4B;AACzD,QAAM,IAAI,IACP,KAAK,EACL,MAAM,qDAAqD;AAC9D,MAAI,CAAC,EAAG,QAAOD,YAAW,GAAG;AAC7B,SAAO,sBAAsB,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAChD;AAEO,SAAS,oBAAoB,MAGxB;AACV,QAAM,SAAS,KAAK,SAAS,IAAI,KAAK,EAAE,YAAY;AACpD,MAAI,MAAM,WAAW,MAAM,KAAK,MAAM,WAAW,SAAS,EAAG,QAAO;AACpE,QAAM,OAAO,KAAK,eAAe,IAAI,YAAY;AACjD,MAAI,IAAI,WAAW,uBAAuB,EAAG,QAAO;AACpD,MAAI,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,SAAS,EAAG,QAAO;AAC9D,SAAO;AACT;AAEO,SAAS,yCACd,aAC6B;AAC7B,QAAM,QAAqC;AAAA,IACzC,yBAAyB;AAAA,IACzB,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AACA,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,IAAI,YAAY,MAAM,mBAAmB;AAC/C,MAAI,CAAC,IAAI,CAAC,EAAG,QAAO;AACpB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC;AAC9B,UAAM,MAAMA;AAAA,MACV,OAAO,OAAO,eAAe,OAAO,iBAAiB,EAAE;AAAA,IACzD;AACA,UAAM,SAASA;AAAA,MACb,OAAO,OAAO,kBAAkB,OAAO,oBAAoB,EAAE;AAAA,IAC/D;AACA,UAAM,UACJ,OAAO,4BAA4B,QACnC,OAAO,+BAA+B;AACxC,WAAO;AAAA,MACL,yBAAyB,WAAW,QAAQ,GAAG;AAAA,MAC/C,aAAa,MAAMC,gBAAe,GAAG,IAAI;AAAA,MACzC,gBAAgB;AAAA,IAClB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mCAAmC,MAMpB;AAC7B,MAAI,CAAC,oBAAoB,IAAI,EAAG,QAAO;AACvC,QAAM,QAAQ,yCAAyC,KAAK,WAAW;AACvE,QAAM,SAAS,KAAK,QAAQA,gBAAe,KAAK,KAAK,IAAI;AACzD,QAAM,cAAc,MAAM,eAAe;AACzC,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,MAAM,kBAAkBD,YAAW,KAAK,MAAM;AAAA,EAChE;AACF;AAEO,SAAS,wBAAwB,QAAuC;AAC7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,0BAA0B,OAAO,WAAW;AAAA,IAC5C,GAAI,OAAO,iBACP,CAAC,gCAAgC,OAAO,cAAc,0CAA0C,IAChG,CAAC;AAAA,IACL,eAAe,OAAO,WAAW;AAAA,IACjC;AAAA,EACF;AACF;;;ACrGO,SAAS,YAAY,OAmBjB;AACT,QAAM,YAAY,MAAM,WAAW,SAC/B,gBAAgB,MAAM,WAAW,KAAK,IAAI,CAAC,0EAC3C;AACJ,QAAM,UAAU,QAAQ,MAAM,OAAO,YAAY,EAAE,SAAS,OAAO,CAAC;AACpE,QAAM,gBAAgB,UAClB;AAAA,IACE;AAAA,IACA,MAAM,SAAS,kBAAkB,MAAM,MAAM,KAAK;AAAA,EACpD,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,SACF,kBAAkB,MAAM,MAAM,GAAG,MAAM,SAAS,iBAAc,MAAM,MAAM,KAAK,EAAE,KACjF;AAAA,EACN;AACJ,QAAM,iBAAiB,UACnB;AAAA,IACE;AAAA,EACF,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACJ,QAAM,oBAAoB,UACtB;AAAA,IACE;AAAA,EACF,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,MAAM,YAAY;AAAA,IAC/B,4BAA4B,MAAM,aAAa;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA,GAAI,MAAM,yBAAyB,KAAK,IACpC,CAAC,MAAM,wBAAwB,KAAK,GAAG,EAAE,IACzC,CAAC;AAAA,IACL,GAAI,MAAM,iBAAiB,KAAK,IAC5B,CAAC,MAAM,gBAAgB,KAAK,GAAG,EAAE,IACjC,CAAC;AAAA,IACL,GAAI,MAAM,2BAA2B,KAAK,IACtC,CAAC,+DAA0D,MAAM,0BAA0B,KAAK,GAAG,EAAE,IACrG,CAAC;AAAA,IACL,GAAI,MAAM,uBAAuB,KAAK,IAClC,CAAC,MAAM,sBAAsB,KAAK,GAAG,EAAE,IACvC,CAAC;AAAA,IACL,GAAI,MAAM,oBACN;AAAA,MACE,GAAG,wBAAwB;AAAA,QACzB,aAAa,MAAM;AAAA,QACnB,gBAAgB,MAAM,sBAAsB;AAAA,MAC9C,CAAC;AAAA,MACD;AAAA,IACF,IACA,CAAC;AAAA,IACL;AAAA,IACA,MAAM;AAAA,EACR,EAAE,KAAK,IAAI;AACb;;;AF5GA;;;AGNA;;;ACIA;AACA;AALA,SAAS,aAAAE,YAAW,cAAAC,cAAY,aAAAC,YAAW,YAAAC,WAAU,YAAAC,WAAU,kBAAkB;AACjF,SAAS,SAAAC,cAAmD;AAC5D,OAAOC,SAAQ;AACf,OAAOC,YAAU;;;ACHjB,SAAS,cAAAC,cAAY,eAAAC,oBAAmB;AACxC,OAAOC,YAAU;AAGjB,IAAM,qBAAqB;AAEpB,SAAS,0BAA0B,aAAoC;AAC5E,QAAM,WAAW,YAAY,MAAM,GAAG,EAAE,CAAC;AACzC,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI;AAC3B,MAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAK,QAAO;AACpC,SAAO,OAAO,GAAG,IAAI,GAAG,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,GAAG,GAAG,CAAC,EAAE;AACzE;AAEO,SAAS,2BAA2B,WAAkC;AAC3E,QAAM,eAAeA,OAAK,KAAK,WAAW,UAAU;AACpD,MAAI,CAACF,aAAW,YAAY,EAAG,QAAO;AAEtC,MAAI,UAAyB;AAC7B,MAAI,UAAU;AAEd,aAAW,SAASC,aAAY,cAAc,EAAE,eAAe,KAAK,CAAC,GAAG;AACtE,QAAI,CAAC,MAAM,YAAY,KAAK,CAAC,mBAAmB,KAAK,MAAM,IAAI,EAAG;AAClE,UAAM,MAAM,0BAA0B,MAAM,IAAI;AAChD,QAAI,OAAO,QAAQ,OAAO,QAAS;AACnC,cAAU;AACV,cAAUC,OAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EAC9C;AAEA,SAAO;AACT;AAEO,SAAS,4BAA4B,WAInC;AACP,QAAM,OACJ,WAAW,KAAK,KAChBA,OAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,cAAc;AAE1D,QAAM,aAAaA,OAAK,KAAK,MAAM,UAAU;AAC7C,QAAM,cAAcA,OAAK,KAAK,MAAM,UAAU;AAC9C,MAAIF,aAAW,UAAU,KAAKA,aAAW,WAAW,GAAG;AACrD,WAAO,EAAE,SAAS,YAAY,SAAS,aAAa,YAAY,KAAK;AAAA,EACvE;AAEA,QAAM,aAAa,2BAA2B,IAAI;AAClD,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,UAAUE,OAAK,KAAK,YAAY,UAAU;AAChD,QAAM,UAAUA,OAAK,KAAK,YAAY,UAAU;AAChD,MAAI,CAACF,aAAW,OAAO,KAAK,CAACA,aAAW,OAAO,EAAG,QAAO;AAEzD,SAAO,EAAE,SAAS,SAAS,WAAW;AACxC;;;AD9CA,IAAM,uBAAuB;AAC7B,IAAM,oCAAoC;AAC1C,IAAM,uCAAuC;AAC7C,IAAM,qCAAqC;AAU3C,SAAS,mBAAmB,SAAiB,SAAiB,YAAwC;AACpG,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,YAAY,CAAC,OAAO;AAAA,IACpB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AACF;AAGO,SAAS,mBAAmB,UAAqC;AACtE,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,kBAAkB,gBAAgB,KAAK,QAAQ;AACrD,UAAM,gBACJ,cAAc,KAAK,QAAQ,KAAKG,aAAWC,OAAK,KAAKA,OAAK,QAAQ,QAAQ,GAAG,UAAU,CAAC;AAC1F,UAAM,gBAAgB,aAAa;AAEnC,QAAI,mBAAmB,iBAAiB,eAAe;AACrD,YAAM,UAAU,kBACZ,4BAA4BA,OAAK,QAAQ,QAAQ,CAAC,IAClD,gBACE;AAAA,QACE,SAAS;AAAA,QACT,SAASA,OAAK,KAAKA,OAAK,QAAQ,QAAQ,GAAG,UAAU;AAAA,QACrD,YAAYA,OAAK,QAAQ,QAAQ;AAAA,MACnC,IACA,4BAA4B;AAElC,UAAI,SAAS;AACX,eAAO,mBAAmB,QAAQ,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA,MAChF;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,UAAU,YAAY,CAAC,GAAG,OAAO,OAAO,UAAU,KAAK;AAC9E;AAEA,SAAS,kBAA0B;AACjC,QAAM,aACJ,QAAQ,IAAI,yBAAyB,KAAK,KAC1C,QAAQ,IAAI,kBAAkB,KAAK;AACrC,MAAI,WAAY,QAAO;AAEvB,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,UAAU;AAAA,MACd,QAAQ,IAAI,0BAA0B,KAAK,KAAK;AAAA,IAClD;AACA,QAAI,QAAS,QAAO,QAAQ;AAE5B,UAAM,aAAaA,OAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,gBAAgB,WAAW;AACxF,QAAID,aAAW,UAAU,EAAG,QAAO;AAAA,EACrC;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAkB,aAAmD;AAC5F,SAAO,eAAe;AAAA,IACpB,GAAG,QAAQ;AAAA,IACX,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,GAAI,YAAY,oBACZ,EAAE,mBAAmBC,OAAK,SAAS,QAAQ,KAAK,YAAY,IAC5D,CAAC;AAAA,EACP,CAAC;AACH;AAEA,SAAS,UAAU,IAAkB;AACnC,MAAI,MAAM,EAAG;AACb,UAAQ,KAAK,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE;AACjE;AAEA,SAAS,eAAe,MAAc,UAA0B;AAC9D,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,GAAG;AACzB,SAAO,OAAO,SAAS,MAAM,KAAK,UAAU,IAAI,KAAK,MAAM,MAAM,IAAI;AACvE;AAEA,SAAS,sBAA8B;AACrC,QAAM,OAAO,QAAQ,IAAI,8BAA8B,KAAK,KAAKA,OAAK,KAAKC,IAAG,QAAQ,GAAG,WAAW,OAAO;AAC3G,EAAAC,WAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACnC,SAAOF,OAAK,KAAK,MAAM,yBAAyB;AAClD;AAEA,SAAS,yBAAqC;AAC5C,MAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO,MAAM;AAAA,EAAC;AAEhE,QAAM,WAAW,oBAAoB;AACrC,QAAM,YAAY,eAAe,uCAAuC,oCAAoC;AAC5G,QAAM,UAAU,eAAe,qCAAqC,kCAAkC;AACtG,QAAM,UAAU,KAAK,IAAI;AAEzB,SAAO,MAAM;AACX,QAAI;AACF,YAAM,KAAKG,UAAS,UAAU,IAAI;AAClC,MAAAC,WAAU,EAAE;AACZ,aAAO,MAAM;AACX,YAAI;AACF,qBAAW,QAAQ;AAAA,QACrB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,OAAQ,MAAgC;AAC9C,UAAI,SAAS,SAAU,OAAM;AAE7B,UAAI;AACF,cAAM,QAAQ,KAAK,IAAI,IAAIC,UAAS,QAAQ,EAAE;AAC9C,YAAI,QAAQ,SAAS;AACnB,qBAAW,QAAQ;AACnB;AAAA,QACF;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAEA,UAAI,KAAK,IAAI,IAAI,UAAU,WAAW;AACpC,cAAM,IAAI,MAAM,kDAAkD,QAAQ,EAAE;AAAA,MAC9E;AACA,gBAAU,GAAG;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,iBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,cAAc;AAAA,EACd,eAAe,OAAO;AACpB,WAAO,qBAAqB,OAAO,oBAAoB;AAAA,EACzD;AAAA,EACA,MAAM,MAAM;AACV,UAAM,YAAY,qBAAqB,KAAK,OAAO,oBAAoB;AACvE,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,IAAI,MAAM,2CAA2C,UAAU,IAAI,EAAE;AAAA,IAC7E;AACA,UAAM,QAAQ,UAAU;AACxB,UAAM,WAAWF,UAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,WAAWA,UAAS,KAAK,YAAY,GAAG;AAC9C,UAAM,QAAsB,CAAC,UAAU,UAAU,QAAQ;AACzD,UAAM,WAAW,gBAAgB;AACjC,UAAM,cAAc,mBAAmB,QAAQ;AAC/C,UAAM,mBAAmB,uBAAuB;AAChD,QAAI;AACJ,QAAI;AACF,cAAQG;AAAA,QACN,YAAY;AAAA,QACZ;AAAA,UACE,GAAG,YAAY;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AAAA,QACA,mBAAmB;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,UAAU,YAAY;AAAA,UACtB,OAAO,YAAY;AAAA,UACnB;AAAA,UACA,KAAK,gBAAgB,UAAU,WAAW;AAAA,QAC5C,CAAC;AAAA,MACH;AACA,gBAAU,eAAe,oCAAoC,iCAAiC,CAAC;AAAA,IACjG,UAAE;AACA,uBAAiB;AACjB,MAAAF,WAAU,QAAQ;AAClB,MAAAA,WAAU,QAAQ;AAAA,IACpB;AAEA,QAAI,CAAC,MAAM,KAAK;AACd,YAAM,IAAI;AAAA,QACR,6CAA6C,QAAQ;AAAA,MACvD;AAAA,IACF;AACA,UAAM,MAAM;AACZ,WAAO,EAAE,KAAK,MAAM,KAAK,MAAM;AAAA,EACjC;AACF;;;AD/MA,IAAM,UAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAI,mBAA0C;AAOvC,SAAS,sBAAsB,MAA+B;AACnE,MAAI,iBAAkB,QAAO;AAC7B,QAAM,WAAW,MAAM,KAAK;AAC5B,MAAI,UAAU;AACZ,UAAMG,YAAW,QAAQ,QAAQ;AACjC,QAAI,CAACA,WAAU;AACb,YAAM,IAAI,MAAM,4BAA4B,QAAQ,uBAAkB,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACzG;AACA,WAAOA;AAAA,EACT;AACA,QAAM,aAAa,gCAAgC,eAAe,EAAE,cAAc;AAClF,QAAM,WAAW,QAAQ,UAAU;AACnC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,4BAA4B,UAAU,uBAAkB,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC3G;AACA,SAAO;AACT;;;AGdA;AAFA,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAAC,cAAY,YAAAC,WAAU,aAAAC,kBAAiB;AAEhD,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;;;ACvB9B;AAUO,SAAS,iBAAiB,QAAsC;AACrE,SAAO,QAAQ,OAAO,sBAAsB,KAAK,CAAC;AACpD;AAsBO,SAAS,qBACd,QACA,OACA,QACM;AACN,SAAO,uBAAuB,OAAO;AACrC,SAAO,oBAAoB,OAAO;AAClC,MAAI,OAAO,uBAAuB,QAAW;AAC3C,WAAO,qBAAqB,OAAO;AAAA,EACrC;AACA,aAAW,OAAO,MAAM;AAC1B;;;AC3CA,SAAS,YAAY,OAA+B;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAQO,SAAS,8BAA8B,QAAsC;AAClF,MAAI,YAAY,OAAO,iBAAiB,EAAG,QAAO;AAClD,MAAI,OAAO,sBAAsB,WAAY,QAAO;AACpD,SAAO;AACT;AAGO,SAAS,yBAAyB,QAAsC;AAC7E,SAAO,iBAAiB,MAAM,KAAK,CAAC,8BAA8B,MAAM;AAC1E;;;AFEA;AACA;;;AG1BA;AADA,OAAOC,YAAU;;;ACuBjB,SAAS,SAAS,OAAgD;AAChE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEA,SAAS,SAAS,OAA+B;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEA,IAAM,oBAAoB,oBAAI,IAAmC;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,SAAS,mCACd,QACkC;AAClC,QAAMC,UAAS,SAAS,MAAM;AAC9B,MAAI,CAACA,SAAQ;AACX,WAAO,EAAE,cAAc,MAAM,cAAc,OAAO,QAAQ,KAAK;AAAA,EACjE;AACA,QAAM,UAAU,SAASA,QAAO,OAAO;AACvC,QAAM,SAAS,SAASA,QAAO,MAAM,KAAK,SAASA,QAAO,KAAK;AAC/D,QAAM,OAAO,SAASA,QAAO,IAAI;AACjC,QAAM,aAAa,SAASA,QAAO,UAAU;AAC7C,QAAM,aAAa,OAAO,SAAS,KAAK,MAAM,IAAI;AAClD,QAAM,mBAAmB,aAAa,SAAS,WAAW,MAAM,IAAI;AACpE,QAAM,eACH,YAAY,QAAQ,kBAAkB,IAAI,OAAO,KAClD,eAAe,qBACf,eAAe,UACf,qBAAqB;AACvB,SAAO;AAAA,IACL,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAAoD;AAC1F,SAAO,QAAQ;AACjB;;;ADpEA;AACA;;;AEPA,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;AAEnC,SAAS,qBAAqB,OAAiD;AAC7E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,SAAO,EAAE,SAAS,IAAI;AACxB;AAUO,SAAS,4BACd,QACS;AACT,QAAM,OAAO,OAAO,eAAe,IAAI,YAAY;AACnD,MAAI,IAAI,WAAW,sBAAsB,EAAG,QAAO;AACnD,MAAI,QAAQ,4BAA4B,IAAI,WAAW,gBAAgB,EAAG,QAAO;AACjF,MAAI,IAAI,WAAW,0BAA0B,KAAK,OAAO,cAAc;AACrE,UAAM,UAAU,qBAAqB,OAAO,WAAW;AACvD,QAAI,YAAY,aAAa,YAAY,SAAU,QAAO;AAAA,EAC5D;AACA,QAAM,SAAS,OAAO,SAAS,IAAI,YAAY;AAC/C,MAAI,MAAM,SAAS,kBAAkB,EAAG,QAAO;AAC/C,MACE,OAAO,iBACN,MAAM,WAAW,SAAS,KACzB,MAAM,SAAS,iBAAiB,KAChC,MAAM,SAAS,gBAAgB,IACjC;AACA,UAAM,UAAU,qBAAqB,OAAO,WAAW;AACvD,QAAI,YAAY,aAAa,YAAY,SAAU,QAAO;AAAA,EAC5D;AACA,SAAO;AACT;;;ACpCA,IAAM,mBAAmB;AAGzB,IAAM,uBAAuB,IAAI,IAAI,yBAAyB,CAAC;AAE/D,IAAM,2BAA2B;AAE1B,SAAS,0BAA0B,QAA4C;AACpF,SAAO,QAAQ,UAAU,yBAAyB,KAAK,MAAM,CAAC;AAChE;AAEA,SAASC,YAAW,OAA+B;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEA,SAAS,cAAc,UAAyD;AAC9E,MAAI,CAAC,UAAU,QAAS,QAAO;AAC/B,MAAI,SAAS,yBAAyB,MAAO,QAAO;AACpD,SAAOA,YAAW,SAAS,IAAI;AACjC;AAGO,SAAS,qBAAqB,OAA+B;AAClE,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,QAAM,OACJ,OAAO,UAAU,WACb,QACA,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,QAC1D,OAAQ,MAAgC,WAAW,EAAE,IACrD,KAAK,UAAU,KAAK;AAC5B,QAAM,IAAI,KAAK;AAAA,IACb;AAAA,EACF;AACA,SAAO,IAAIA,YAAW,EAAE,CAAC,CAAC,IAAI;AAChC;AAEO,SAAS,wBACd,cACA,SACA,MACe;AACf,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,KAAK,IAAI,cAAc,CAAC,YAAY,WAAW,GAAG,IAAI,QAAQ,CAAC;AAC7E,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,IAAI,OAAO,SAAS,MAAM,OAAO,KAAK,GAAG,EAAE;AACjD,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,uBACP,QACA,UACS;AACT,MAAI,SAAS,aAAa,SAAS,EAAG,QAAO;AAC7C,QAAM,UAAUA,YAAW,OAAO,WAAW,GAAG,YAAY;AAC5D,MAAI,WAAW,qBAAqB,IAAI,OAAO,EAAG,QAAO;AACzD,QAAM,OAAOA,YAAW,OAAO,WAAW,KAAK;AAC/C,MAAI,QAAQ,iBAAiB,KAAK,IAAI,EAAG,QAAO;AAChD,SAAO;AACT;AAEA,SAAS,eACP,UACA,SACS;AACT,MAAI,SAAS,aAAa,SAAS,EAAG,QAAO;AAC7C,QAAM,UAAUA,YAAW,SAAS,OAAO;AAC3C,MAAI,WAAW,SAAS,QAAQ,QAAQ,cAAc;AACpD,UAAM,QAAQ,wBAAwB,QAAQ,cAAc,SAAS,QAAQ,IAAI;AACjF,QAAI,UAAU,EAAG,QAAO;AACxB,QAAI,UAAU,QAAQ,QAAQ,EAAG,QAAO;AAAA,EAC1C;AACA,MAAIA,YAAW,SAAS,UAAU,EAAG,QAAO;AAC5C,MAAI,cAAc,SAAS,WAAW,EAAG,QAAO;AAChD,SAAO;AACT;AAMO,SAAS,2BAA2B,OAmBlB;AACvB,MAAI,CAAC,MAAM,YAAY;AACrB,WAAO,EAAE,UAAU,OAAO,QAAQ,iBAAiB;AAAA,EACrD;AAEA,MACE,4BAA4B;AAAA,IAC1B,OAAO,MAAM,aAAa;AAAA,IAC1B,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM;AAAA,EACrB,CAAC,GACD;AACA,WAAO,EAAE,UAAU,OAAO,QAAQ,qBAAqB;AAAA,EACzD;AAEA,QAAM,OAAOA,YAAW,MAAM,WAAW,KAAK;AAC9C,MAAI,QAAQ,iBAAiB,KAAK,IAAI,GAAG;AACvC,WAAO,EAAE,UAAU,OAAO,QAAQ,cAAc;AAAA,EAClD;AAEA,QAAM,YAAY,MAAM,UAAU;AAAA,IAChC,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,EACrB;AACA,MAAI,uBAAuB,WAAW,MAAM,QAAQ,GAAG;AACrD,WAAO,EAAE,UAAU,OAAO,QAAQ,kBAAkB;AAAA,EACtD;AAEA,MAAIA,YAAW,MAAM,SAAS,KAAKA,YAAW,MAAM,kBAAkB,GAAG;AACvE,WAAO,EAAE,UAAU,OAAO,QAAQ,kBAAkB;AAAA,EACtD;AAEA,QAAM,eAAeA,YAAW,MAAM,iBAAiB;AACvD,MAAI,cAAc;AAChB,WAAO,EAAE,UAAU,OAAO,QAAQ,mBAAmB;AAAA,EACvD;AAEA,QAAM,QACJA,YAAW,MAAM,KAAK,KACtBA,YAAW,MAAM,SAAS,KAC1BA,YAAW,MAAM,SAAS,KAAK;AACjC,MAAI,OAAO;AACT,WAAO,EAAE,UAAU,OAAO,QAAQ,iBAAiB;AAAA,EACrD;AAEA,QAAM,kBACJ,MAAM,QAAQ,MAAM,UAChB;AAAA,IACE,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,cAAc,MAAM,SAAS;AAAA,EAC/B,IACA;AAEN,MAAI,CAAC,eAAe,MAAM,UAAU,eAAe,GAAG;AACpD,WAAO,EAAE,UAAU,OAAO,QAAQ,kBAAkB;AAAA,EACtD;AAEA,SAAO,EAAE,UAAU,MAAM,UAAU,MAAM,SAAS;AACpD;AAEO,SAAS,iCACd,QAOA,QACmB;AACnB,SAAO;AAAA,IACL,cAAc,OAAO;AAAA,IACrB,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,YAAYA,YAAW,QAAQ,UAAU,KAAK,cAAc,OAAO,WAAW;AAAA,IAC9E,OAAOA,YAAW,QAAQ,KAAK,KAAK;AAAA,EACtC;AACF;;;AC7LA,SAAS,aAAAC,kBAAiB;;;ACInB,SAAS,qBAAqB,WAAkC;AACrE,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,MAAM,QAAQ,MAAM,gDAAgD;AAC1E,MAAI,IAAK,QAAO,mBAAmB,IAAI,CAAC,CAAC;AAEzC,QAAM,MAAM,QAAQ,MAAM,yDAAyD;AACnF,MAAI,IAAK,QAAO,mBAAmB,IAAI,CAAC,CAAC;AAEzC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,QAAQ,SAAS,KAAK,IAAI,UAAU,WAAW,OAAO,EAAE;AAC5E,QAAI,IAAI,SAAS,YAAY,MAAM,aAAc,QAAO;AACxD,UAAM,QAAQ,IAAI,SAAS,QAAQ,cAAc,EAAE,EAAE,MAAM,GAAG;AAC9D,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,UAAM,CAAC,OAAO,IAAI,IAAI;AACtB,QAAI,CAAC,SAAS,CAAC,KAAM,QAAO;AAC5B,WAAO,GAAG,KAAK,IAAI,KAAK,QAAQ,WAAW,EAAE,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,OAA8B;AACxD,QAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAC7C,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,QAAQ,MAAM,CAAC;AACrB,QAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,WAAW,EAAE;AAC3C,SAAO,SAAS,OAAO,GAAG,KAAK,IAAI,IAAI,KAAK;AAC9C;;;AD/BA;AAcA,SAAS,QAAQ,KAAa,KAAa,MAAgC;AACzE,MAAI;AACF,UAAM,MAAMC,WAAU,KAAK,MAAM,EAAE,KAAK,UAAU,OAAO,CAAC;AAC1D,WAAO;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI,UAAU,IAAI,KAAK;AAAA,MAChC,SAAS,IAAI,UAAU,IAAI,KAAK;AAAA,MAChC,OAAO,IAAI,QAAQ,IAAI,MAAM,UAAU;AAAA,IACzC;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,IAAM,uBAAsC;AAAA,EACjD,KAAK,CAAC,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,EACxC,IAAI,CAAC,KAAK,SAAS,QAAQ,MAAM,KAAK,IAAI;AAC5C;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,OAAO,KAAK;AAChE;AAEO,SAAS,kBAAkB,cAAsB,MAAoC;AAC1F,QAAM,SAAS,KAAK,IAAI,cAAc,CAAC,UAAU,WAAW,QAAQ,CAAC;AACrE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,qBAAqB,OAAO,MAAM;AAC3C;AAEO,SAAS,kBAAkB,cAAsB,MAAoC;AAC1F,QAAM,OAAO,KAAK,IAAI,cAAc,CAAC,aAAa,MAAM,CAAC;AACzD,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,SAAO,KAAK,OAAO,KAAK,KAAK;AAC/B;AAGO,SAAS,cACd,cACA,MACA,QACA,MACe;AACf,QAAM,SAAS,KAAK,GAAG,cAAc;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,OAAO,MAAM;AACrC,UAAM,MAAM,KAAK,CAAC,GAAG,KAAK,KAAK;AAC/B,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,SAAS,oBAAoB,OAMZ;AACtB,QAAM,EAAE,cAAc,QAAQ,eAAe,eAAe,KAAK,IAAI;AAErE,MAAI,eAAe;AACjB,UAAM,MAAM,KAAK,IAAI,cAAc,CAAC,OAAO,IAAI,CAAC;AAChD,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ,IAAI,UAAU,IAAI,UAAU,IAAI,SAAS;AAAA,MACnD;AAAA,IACF;AACA,UAAM,SAAS,KAAK,IAAI,cAAc,CAAC,UAAU,MAAM,aAAa,CAAC;AACrE,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ,OAAO,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,IAAI,cAAc,CAAC,QAAQ,MAAM,UAAU,MAAM,CAAC;AACpE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ,KAAK,UAAU,KAAK,UAAU,KAAK,SAAS;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,aAAa,kBAAkB,cAAc,IAAI,KAAK;AAC5D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AASO,SAAS,eAAe,OAQZ;AACjB,QAAM,WAAW,cAAc,MAAM,cAAc,MAAM,MAAM,MAAM,QAAQ,MAAM,IAAI;AACvF,MAAI,UAAU;AACZ,WAAO,EAAE,IAAI,MAAM,OAAO,UAAU,SAAS,MAAM;AAAA,EACrD;AAEA,QAAM,UAAU,MAAM,KAAK,GAAG,MAAM,cAAc;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,QAAQ,UAAU,QAAQ,UAAU,QAAQ,SAAS;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,MACJ,yBAAyB,QAAQ,MAAM,KACvC,cAAc,MAAM,cAAc,MAAM,MAAM,MAAM,QAAQ,MAAM,IAAI;AACxE,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,IAAI,OAAO,QAAQ,kDAAkD;AAAA,EAChF;AACA,SAAO,EAAE,IAAI,MAAM,OAAO,KAAK,SAAS,KAAK;AAC/C;AAEA,SAAS,yBAAyB,QAA+B;AAC/D,QAAM,OAAO,UAAU,MAAM;AAC7B,QAAM,IAAI,KAAK,MAAM,+BAA+B;AACpD,SAAO,IAAI,EAAE,CAAC,IAAI;AACpB;;;AEvLA,SAAS,YAAY,MAA8B;AACjD,QAAM,QAAQ,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC;AAClD,SAAO,MAAM,WAAW;AAC1B;AAEA,SAAS,eAAe,YAAoB,OAAuB;AACjE,SAAO,oBAAoB,UAAU,KAAK,KAAK;AACjD;AAEA,SAAS,cAAc,QAA4B,YAAoB,OAAuB;AAC5F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,mBAAmB,MAAM,OAAO;AAAA,IACzC,qBAAqB,UAAU,iBAAc,KAAK;AAAA,IAClD;AAAA,IACA;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,wBAAwB,OAKP;AACxB,MAAI,MAAM,SAAS,aAAa,WAAW,GAAG;AAC5C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,MAAM;AAAA,MACb,YACE,MAAM,SAAS,cACf,kBAAkB,MAAM,SAAS,cAAc,MAAM,IAAI,KACzD;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa,oBAAoB;AAAA,IACrC,cAAc,MAAM,SAAS;AAAA,IAC7B,QAAQ,MAAM,SAAS;AAAA,IACvB,eAAe,MAAM;AAAA,IACrB,eAAe;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,MAAI,CAAC,WAAW,IAAI;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,6BAA6B,WAAW,UAAU,wBAAwB;AAAA,MAClF,YACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,MAAM;AAAA,IACb,YAAY,WAAW,cAAc,MAAM,SAAS,cAAc;AAAA,IAClE,WAAW,WAAW;AAAA,IACtB,QAAQ,WAAW;AAAA,EACrB;AACF;AAOO,SAAS,qBACd,OACA,OAAsB,sBACC;AACvB,QAAM,YACJ,MAAM,aAAa,qBAAqB,MAAM,OAAO,WAAW,KAAK;AAEvE,QAAM,WAAW,iCAAiC,MAAM,QAAQ;AAAA,IAC9D,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAED,QAAM,UAAU,MAAM,IAAI,YAAY,KAAK,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;AAC1E,QAAM,cAAc,2BAA2B;AAAA,IAC7C,YAAY,MAAM,OAAO;AAAA,IACzB,aAAa,MAAM,OAAO;AAAA,IAC1B,aAAa,MAAM,OAAO;AAAA,IAC1B,OAAO;AAAA,IACP,WAAW,MAAM,OAAO;AAAA,IACxB,aAAa,MAAM,OAAO;AAAA,IAC1B,cAAc,MAAM,OAAO;AAAA,IAC3B,WAAW,MAAM,OAAO;AAAA,IACxB,mBAAmB,MAAM,OAAO;AAAA,IAChC;AAAA,IACA;AAAA,IACA,QAAQ,MAAM;AAAA,IACd;AAAA,EACF,CAAC;AAED,MAAI,CAAC,YAAY,UAAU;AACzB,QAAI,WAAW;AACb,aAAO,wBAAwB;AAAA,QAC7B;AAAA,QACA,OAAO;AAAA,QACP,eAAe,yCAAyC,MAAM,OAAO,IAAI;AAAA,QACzE;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAEA,MAAI,WAAW;AACb,WAAO,wBAAwB;AAAA,MAC7B;AAAA,MACA,OAAO;AAAA,MACP,eAAe,yCAAyC,MAAM,OAAO,IAAI;AAAA,MACzE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,YAAY,IAAI,GAAG;AACtB,UAAM,QAAQ,SAAS,aAAa;AACpC,UAAM,SAAS,QACX,GAAG,KAAK,0CACR;AACJ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,6BAA6B,MAAM;AAAA,MAC3C,YACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,OAAO,kBAAkB,SAAS,cAAc,IAAI;AAC1D,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,YACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,OAAO,mBAAmB,KAAK;AAC1D,MAAI,cAAc;AAChB,QAAIC,aAAY;AAChB,QAAIC,UAAS;AACb,QAAIC,cACF,SAAS,cAAc,kBAAkB,SAAS,cAAc,IAAI,KAAK;AAE3E,QAAI,SAAS,aAAa,SAAS,GAAG;AACpC,YAAMC,cAAa,oBAAoB;AAAA,QACrC,cAAc,SAAS;AAAA,QACvB,QAAQ,SAAS;AAAA,QACjB,eAAe,kCAAkC,YAAY;AAAA,QAC7D,eAAe;AAAA,QACf;AAAA,MACF,CAAC;AACD,UAAI,CAACA,YAAW,IAAI;AAClB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,6BAA6BA,YAAW,UAAU,wBAAwB;AAAA,UAClF,YAAY;AAAA,QACd;AAAA,MACF;AACA,MAAAH,aAAYG,YAAW;AACvB,MAAAF,UAASE,YAAW;AACpB,MAAAD,cAAaC,YAAW,cAAcD;AAAA,IACxC,OAAO;AACL,YAAM,WAAW,KAAK,IAAI,SAAS,cAAc,CAAC,QAAQ,MAAM,UAAU,SAAS,MAAM,CAAC;AAC1F,UAAI,SAAS,WAAW,KAAK,CAAC,sBAAsB,KAAK,SAAS,UAAU,SAAS,MAAM,GAAG;AAC5F,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,6BAA6B,SAAS,UAAU,SAAS,UAAU,iBAAiB;AAAA,UAC5F,YAAY;AAAA,QACd;AAAA,MACF;AACA,MAAAD,UAAS,SAAS,WAAW;AAAA,IAC/B;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAAC;AAAA,MACA,WAAAF;AAAA,MACA,QAAAC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,SAAS,cAAc,MAAM,SAAS,QAAQ,IAAI;AACjF,MAAI,UAAU;AACZ,WAAO,wBAAwB;AAAA,MAC7B;AAAA,MACA,OAAO;AAAA,MACP,eAAe,yCAAyC,MAAM,OAAO,IAAI;AAAA,MACzE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,SAAS,aAAa,SAAS;AAEhD,MAAI,YAAY;AAChB,MAAI,SAAS;AACb,MAAI,aAAa,SAAS,cAAc;AAExC,QAAM,aAAa,oBAAoB;AAAA,IACrC,cAAc,SAAS;AAAA,IACvB,QAAQ,SAAS;AAAA,IACjB,eAAe,wCAAwC,MAAM,OAAO,IAAI;AAAA,IACxE,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AACD,MAAI,YAAY,CAAC,WAAW,IAAI;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,6BAA6B,WAAW,UAAU,wBAAwB;AAAA,MAClF,YACE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,UAAM,WAAW,KAAK,IAAI,SAAS,cAAc,CAAC,QAAQ,MAAM,UAAU,SAAS,MAAM,CAAC;AAC1F,QAAI,SAAS,WAAW,KAAK,CAAC,sBAAsB,KAAK,SAAS,UAAU,SAAS,MAAM,GAAG;AAC5F,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,6BAA6B,SAAS,UAAU,SAAS,UAAU,SAAS,SAAS,iBAAiB;AAAA,QAC9G,YACE;AAAA,MACJ;AAAA,IACF;AACA,aAAS,SAAS,WAAW;AAAA,EAC/B,OAAO;AACL,gBAAY,WAAW;AACvB,aAAS,WAAW;AACpB,QAAI,CAAC,WAAW,IAAI;AAClB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,6BAA6B,WAAW,UAAU,iBAAiB;AAAA,QAC3E,YACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,eACE,WAAW,cAAc,cAAc,kBAAkB,SAAS,cAAc,IAAI,KAAK;AAE3F,QAAM,OAAO,MAAM,IAAI,MAAM,KAAK,KAAK;AACvC,QAAM,KAAK,eAAe;AAAA,IACxB,cAAc,SAAS;AAAA,IACvB;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,MAAM,KAAK,QAAQ,aAAa,EAAE;AAAA,IAClC,OAAO,eAAe,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK;AAAA,IAC3D,MAAM,cAAc,MAAM,OAAO,QAAQ,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK;AAAA,IAC9E;AAAA,EACF,CAAC;AAED,MAAI,CAAC,GAAG,MAAM,CAAC,GAAG,OAAO;AACvB,QAAI,0BAA0B,GAAG,MAAM,GAAG;AACxC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,YAAY,cAAc;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,aAAa;AACpC,UAAM,SAAS,QACX,GAAG,KAAK,+DACR;AACJ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,6BAA6B,MAAM,GAAG,GAAG,SAAS,KAAK,GAAG,MAAM,MAAM,EAAE;AAAA,MAChF,YACE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,GAAG;AAAA,IACV,YAAY,cAAc;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,SAAS,GAAG;AAAA,EACd;AACF;;;ANlSA;AAMA;;;AOfO,SAAS,wBAAwB,cAAkC;AACxE,SAAO,aAAa,OAAO,CAAC,SAAS;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,WAAW,QAAQ,WAAW,IAAI,IACpC,QAAQ,MAAM,CAAC,EAAE,KAAK,IACtB,QAAQ,SAAS,IACf,QAAQ,MAAM,CAAC,EAAE,KAAK,IACtB;AACN,WAAO,aAAa,kBAAkB,CAAC,SAAS,WAAW,eAAe;AAAA,EAC5E,CAAC;AACH;AAEO,SAAS,sBAAsB,MAAsB;AAC1D,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,QAAQ,WAAW,IAAI,EAAG,QAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC3D,MAAI,QAAQ,SAAS,KAAK,mBAAmB,KAAK,QAAQ,MAAM,GAAG,CAAC,CAAC,GAAG;AACtE,WAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,EAC/B;AACA,SAAO;AACT;;;ACXA,SAAS,WAAW,OAA0B;AAC5C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,IAAI,CAAC,SAAU,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI,EAAG,EAC3D,OAAO,OAAO;AACnB;AAEA,SAASG,UAAS,OAAgD;AAChE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEO,SAAS,kCAAkC,aAAgC;AAChF,QAAMC,UAASD,UAAS,WAAW;AACnC,MAAI,CAACC,QAAQ,QAAO,CAAC;AACrB,QAAM,SAASD,UAASC,QAAO,eAAe;AAC9C,QAAM,aAAa,WAAW,QAAQ,0BAA0B;AAChE,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO,WAAWA,QAAO,0BAA0B;AACrD;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,SAAS,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAC1E;AAEO,SAAS,qCACd,cACA,SACS;AACT,QAAM,WAAW,wBAAwB,YAAY;AACrD,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,aAAa,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC;AACvE,SAAO,SAAS,MAAM,CAAC,SAAS;AAC9B,UAAMC,SAAO,sBAAsB,sBAAsB,IAAI,CAAC;AAC9D,WAAO,WAAW,IAAIA,MAAI;AAAA,EAC5B,CAAC;AACH;;;AChBA,SAASC,YAAW,OAA+B;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,IAAI,MAAM,KAAK;AACrB,SAAO,EAAE,SAAS,IAAI;AACxB;AAEA,SAASC,YAAW,OAA0B;AAC5C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,IAAI,CAAC,SAAU,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI,EAAG,EAC3D,OAAO,OAAO;AACnB;AAEA,SAASC,gBAAe,OAAyB;AAC/C,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,EAAE,SAAS;AAC5D,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAe,EAAE,SAAS;AAC5E,SAAO;AACT;AAUA,SAAS,wBAAwB,OAAiD;AAChF,QAAM,aAAaC,YAAW,MAAM,0BAA0B;AAC9D,QAAM,aAAa,kCAAkC,MAAM,WAAW;AACtE,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;AACpD;AAEO,SAAS,gCACd,OACkC;AAClC,QAAM,WAAWA,YAAW,MAAM,YAAY;AAC9C,QAAM,gBAAgB,wBAAwB,QAAQ;AACtD,QAAM,UAAU,wBAAwB,KAAK;AAC7C,QAAM,mBACJ,cAAc,WAAW,KACzB,qCAAqC,UAAU,OAAO;AAExD,MAAIC,YAAW,MAAM,KAAK,GAAG;AAC3B,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,oBAAoB,cAAc;AAAA,QAClC,QAAQ,gBAAgB,cAAc,MAAM;AAAA,MAC9C;AAAA,IACF;AACA,WAAO,EAAE,SAAS,MAAM,OAAO,cAAc,oBAAoB,EAAE;AAAA,EACrE;AAEA,MAAIA,YAAW,MAAM,UAAU,GAAG;AAChC,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,oBAAoB,cAAc;AAAA,QAClC,QAAQ,gBAAgB,cAAc,MAAM;AAAA,MAC9C;AAAA,IACF;AACA,WAAO,EAAE,SAAS,MAAM,OAAO,kBAAkB,oBAAoB,EAAE;AAAA,EACzE;AAEA,MAAIA,YAAW,MAAM,kBAAkB,KAAKA,YAAW,MAAM,SAAS,GAAG;AACvE,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,oBAAoB,cAAc;AAAA,QAClC,QAAQ,gBAAgB,cAAc,MAAM;AAAA,MAC9C;AAAA,IACF;AACA,WAAO,EAAE,SAAS,MAAM,OAAO,kBAAkB,oBAAoB,EAAE;AAAA,EACzE;AAEA,MAAI,kBAAkB;AACpB,WAAO,EAAE,SAAS,MAAM,OAAO,SAAS,oBAAoB,EAAE;AAAA,EAChE;AAEA,MAAIC,gBAAe,MAAM,WAAW,GAAG;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,oBAAoB,cAAc;AAAA,MAClC,QAAQ,gBAAgB,cAAc,MAAM;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,oBAAoB,cAAc;AAAA,IAClC,QAAQ,gBAAgB,cAAc,MAAM;AAAA,EAC9C;AACF;;;ACpIA;AAEA;AACA;AAJA,OAAOC,YAAU;AAOjB,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAQM,SAAS,yBAAyB,QAAsC;AAC7E,SAAO;AAAA,IACL,OAAO,OAAO,yBAAyB,YAAY,OAAO,qBAAqB,KAAK;AAAA,EACtF;AACF;AAEA,SAAS,uBAAuB,aAAqC;AACnE,MAAI,OAAO,gBAAgB,UAAU;AACnC,UAAM,UAAU,YAAY,KAAK;AACjC,WAAO,QAAQ,SAAS,UAAU;AAAA,EACpC;AACA,MAAI,eAAe,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AACjF,UAAMC,UAAS;AACf,UAAM,UAAUA,QAAO,WAAWA,QAAO,gBAAgBA,QAAO;AAChE,QAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAG,QAAO,QAAQ,KAAK;AACvE,QAAI;AACF,aAAO,KAAK,UAAU,WAAW;AAAA,IACnC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,6BACd,QACoB;AACpB,QAAM,WAAW,OAAO,eAAe;AACvC,QAAM,UACJ,OAAO,OAAO,yBAAyB,WACnC,OAAO,uBACP,uBAAuB,QAAQ;AACrC,SAAO;AAAA,IACL,aAAa,YAAY,WAAW;AAAA,IACpC;AAAA,EACF;AACF;AAOO,SAAS,8BACd,QACA,QACA,MACM;AACN,MACE,yBAAyB,MAAM,KAC/B,OAAO,WAAW,UAClB,OAAO,sBAAsB,MAC7B;AACA;AAAA,EACF;AACA,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,QAAM,WAAW,6BAA6B,MAAM;AACpD,QAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,SAAO,uBAAuB;AAC9B,SAAO,qBAAqB;AAC5B,SAAO,SAAS;AAChB,MAAI,OAAQ,QAAO,sBAAsB;AACzC,aAAW,OAAO,OAAO,MAAM;AACjC;AAQA,SAAS,+BAA+B,cAA4C;AAClF,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,OAAO;AACb,QAAM,QAAQ,KAAK,UAAU,MAAM;AACnC,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,UAAU,OAAO,KAAK,OAAO,SAAU;AACzD,UAAM,SAAS,OAAO,KAAK,eAAe,WAAW,KAAK,WAAW,KAAK,IAAI;AAC9E,QAAI,OAAQ,KAAI,IAAI,KAAK,IAAI,MAAM;AAAA,EACrC;AACA,SAAO;AACT;AAOO,SAAS,2CACd,OACA,cAC+D;AAC/D,QAAM,iBAAiB,+BAA+B,YAAY;AAClE,MAAI,eAAe,SAAS,EAAG,QAAO,CAAC;AAEvC,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,SAAwE,CAAC;AAE/E,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,SAAS;AAAA,MACbD,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,UAAU,yBAAyB,MAAM,EAAG;AAEzD,UAAM,aAAa,eAAe,IAAI,OAAO,MAAM;AACnD,QAAI,CAAC,cAAc,eAAe,aAAa,CAAC,kBAAkB,IAAI,UAAU,GAAG;AACjF;AAAA,IACF;AAEA,UAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,kCAA8B,QAAQ,QAAQ;AAAA,MAC5C,QAAQ,cAAc,UAAU;AAAA,IAClC,CAAC;AACD,WAAO,KAAK,EAAE,QAAQ,MAAM,QAAQ,OAAO,QAAQ,WAAW,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;;;AVvHA;;;AWxBA;AADA,OAAOE,YAAU;AAGjB,IAAM,YAAY;AAClB,IAAM,iBAAiB;AAEvB,IAAM,0BAA0B,oBAAI,IAAI,CAAC,aAAa,MAAM,CAAC;AAE7D,IAAM,sBACJ;AAEK,SAAS,cAAc,OAAuB;AACnD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,UAAU,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,mBAAmB,KAAK,EAAE;AACxE,SAAO;AACT;AAEO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,eAAe,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,wBAAwB,IAAI,EAAE;AACjF,SAAO;AACT;AAEA,SAAS,OAAO,OAA6C;AAC3D,SAAO,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI;AACpD;AAMO,SAAS,wBAAwB,MAGtC;AACA,QAAM,SAAS,OAAO,KAAK,GAAG;AAC9B,QAAM,UAAU,OAAO,KAAK,IAAI;AAEhC,MAAI,CAAC,UAAU,wBAAwB,IAAI,MAAM,GAAG;AAClD,SAAK,yBAAyB,mBAAmB,GAAG;AAAA,EACtD;AACA,MAAI,CAAC,WAAW,wBAAwB,IAAI,OAAO,GAAG;AACpD,SAAK,+BAA+B,mBAAmB,GAAG;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,OAAO,cAAc,MAAM;AAAA,IAC3B,YAAY,mBAAmB,OAAO;AAAA,EACxC;AACF;AAGO,SAAS,oBAAoB,MAAgD;AAClF,QAAM,SAAS,OAAO,KAAK,GAAG;AAC9B,MAAI,CAAC,UAAU,wBAAwB,IAAI,MAAM,GAAG;AAClD,SAAK,8DAA8D;AAAA,EACrE;AACA,SAAO,cAAc,MAAM;AAC7B;AAEO,SAAS,aAAa,MAAsB;AACjD,QAAM,WAAWA,OAAK,QAAQ,IAAI;AAClC,MAAI,SAAS,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,wCAAwC;AACrF,SAAO;AACT;AAEO,SAAS,mBAAmB,UAAkB,YAAgC;AACnF,SAAO,WAAW,IAAI,CAAC,UAAU;AAC/B,UAAM,WAAWA,OAAK,QAAQ,UAAU,KAAK;AAC7C,UAAM,MAAMA,OAAK,SAAS,UAAU,QAAQ;AAC5C,QAAI,IAAI,WAAW,IAAI,KAAKA,OAAK,WAAW,GAAG,GAAG;AAChD,YAAM,IAAI,MAAM,4BAA4B,KAAK,EAAE;AAAA,IACrD;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,kBAAkB,OAAuB;AACvD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,QAAQ,IAAK,QAAO;AACjE,SAAO,KAAK,MAAM,KAAK;AACzB;;;AXrCA,eAAe,eAAe,KAAa,QAAgB,MAAwC;AACjG,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,4BAA4B,MAAM;AAAA,IAC3C,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,MAAI,SAAkB;AACtB,MAAI;AACF,aAAS,MAAM,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AACA,SAAO,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,OAAO;AAClD;AAEA,SAAS,oBAAoB,QAAqC;AAChE,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,MAAO,OAAmC;AAChD,QAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAG,QAAO,IAAI,KAAK;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAASC,UAAS,OAAgD;AAChE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEA,SAASC,UAAS,OAA+B;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEA,SAAS,qBAAqB,OAKnB;AACT,MAAI,MAAM,kBAAmB,QAAO,WAAW,MAAM,iBAAiB;AACtE,MAAI,MAAM,kBAAmB,QAAO,MAAM;AAC1C,MAAI,MAAM,qBAAsB,QAAO;AACvC,MAAI,MAAM,SAAU,QAAO;AAC3B,SAAO;AACT;AAEA,SAAS,iBAAiB,OAKR;AAChB,MAAI,MAAM,mBAAmB;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,sBAAsB,sBAAsB,MAAM,sBAAsB,4BAA4B;AAC5G,WAAO;AAAA,EACT;AACA,MAAI,MAAM,sBAAsB,mBAAmB;AACjD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,CAAC,MAAM,sBAAsB;AACjD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAASC,oCAAmC,QAAqC;AAC/E,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,kDAAkD,KAAK,IAAI,KAAK,yBAAyB,KAAK,IAAI;AAC3G;AAEA,SAAS,mBAAmB,OAIoC;AAC9D,MAAI,MAAM,MAAO,QAAO;AACxB,MAAI,MAAM,WAAY,QAAO;AAC7B,MAAI,MAAM,aAAa,SAAS,EAAG,QAAO;AAC1C,SAAO;AACT;AAMA,SAAS,yBAAyB,QAA6B,QAAkC;AAC/F,QAAM,UAAU,OAAO;AACvB,OAAK,WAAW,aAAgB,UAAU,QAAY;AACtD,MAAI,OAAQ,QAAO,oBAAoB;AAAA,MAClC,QAAO,OAAO;AACnB,aAAW,OAAO,OAAO,MAAM;AACjC;AAGA,SAAS,gCAAgC,QAAmC;AAC1E,MAAI,CAAC,OAAO,kBAAmB;AAC/B,SAAO,OAAO;AACd,aAAW,OAAO,OAAO,MAAM;AACjC;AAEA,SAAS,oBAAoB,KAA8B;AACzD,SAAO,MAAM,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,IAAI,CAAC;AACjE;AAEA,SAAS,uBACP,QACA,SACwB;AACxB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,EACjE;AACF;AAEA,eAAsB,kBACpB,MAUC;AACD,QAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,IAAI;AAC1D,QAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,MAAI,SAAS,oBAAoB,QAAQ,oBAAoB,GAAG,CAAC;AACjE,QAAM,aAAa,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI,OAAO,cAAc;AAClF,QAAM,UAAU,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,OAAO,WAAW;AACtE,MAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,WAAO,EAAE,IAAI,MAAM,SAAS,MAAM,QAAQ,sBAAsB;AAAA,EAClE;AAEA,MAAI,OAAO,WAAW;AACpB,WAAO,EAAE,IAAI,MAAM,SAAS,MAAM,QAAQ,oBAAoB;AAAA,EAChE;AAEA,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,IAAI,OAAO,QAAQ,oBAAoB;AAAA,EAClD;AAEA,QAAM,cAAc,KAAK,UAAU,QAAQ,KAAK,UAAU;AAC1D,MAAI,CAAC,eAAe,yBAAyB,MAAM,GAAG;AACpD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,eAAe,8BAA8B,MAAM,GAAG;AACzD,oCAAgC,MAAM;AAAA,EACxC;AAEA,QAAM,gBAAgB,KAAK,kBAAkB,QAAQ,KAAK,kBAAkB;AAC5E,MAAI,CAAC,iBAAiB,OAAO,cAAc,QAAQ;AACjD,UAAM,UAAU,qBAAqB,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC5D,QAAI,CAAC,QAAQ,IAAI;AACf,+BAAyB,QAAQ,QAAQ,MAAM;AAC/C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,mBAAmB;AAAA,MACrB;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,QAAQ,YAAY;AACvC,eAAS,oBAAoB,QAAQ,oBAAoB,GAAG,CAAC;AAC7D,eAAS,uBAAuB,QAAQ,OAAO;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,aACJ,OAAO,YAAY,yBAAyB,SAAS,OAAO,YAAY,OACpE,OAAO,YAAY,OACnB,OAAO;AAQb,MAAI,OAAO,YAAY;AACrB,UAAM,UAAU,gCAAgC;AAAA,MAC9C,cAAc,OAAO;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,OAAO,OAAO;AAAA,MACd;AAAA,MACA,4BAA4B,OAAO;AAAA,IACrC,CAAC;AACD,QAAI,CAAC,QAAQ,SAAS;AACpB,YAAMC,UAAS,QAAQ,UAAU,gCAAgC,QAAQ,KAAK;AAC9E,+BAAyB,QAAQA,OAAM;AACvC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAAA;AAAA,QACA,YACE;AAAA,QACF,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,iBAAiB,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAC3D,MAAI,SAAS,MAAM,8BAA8B,gBAAgB,WAAW,EAAE,SAAS,KAAK,CAAC;AAC7F,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AACvE,QAAM,gBAAkE,EAAE,GAAG,OAAO;AACpF,MAAI,OAAO,4BAA4B,QAAQ;AAC7C,kBAAc,6BAA6B,OAAO;AAAA,EACpD;AACA,QAAM,OAAO;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,OAAO;AAAA,IACd,YAAY,OAAO;AAAA,IACnB;AAAA,IACA,YAAY,OAAO,cAAc;AAAA,IACjC,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC5D,QAAQ,OAAO,aACX,EAAE,GAAG,eAAe,YAAY,OAAO,WAAW,IAClD;AAAA,IACJ,iBAAiB;AAAA,MACf,8BAA8B,OAAO,gCAAgC;AAAA,MACrE,2BAA2B,OAAO,6BAA6B;AAAA,MAC/D,sBAAsB,OAAO,wBAAwB;AAAA,MACrD,UACE,OAAO,6BACP,OAAO,OAAO,8BAA8B,YAC5C,cAAc,OAAO,6BACrB,OAAQ,OAAO,0BAAqD,aAAa,WAC5E,OAAO,0BAAmD,WAC3D;AAAA,MACN,aAAa,OAAO,eAAe;AAAA,MACnC,iBAAiB,OAAO,mBAAmB;AAAA,MAC3C,yBAAyB,OAAO,2BAA2B;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,SAAS,MAAM,eAAe,KAAK,QAAQ,IAAI;AASnD,OAAK,OAAO,WAAW,OAAO,OAAO,WAAW,QAAQ,CAAC,gBAAgB;AACvE,UAAM,YAAY,MAAM,mBAAmB,WAAW,EAAE,SAAS,KAAK,CAAC;AACvE,QAAI,aAAa,cAAc,QAAQ;AACrC,eAAS;AACT,eAAS,MAAM,eAAe,KAAK,QAAQ,IAAI;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,OAAO,IAAI;AACb,UAAM,UAAU,mCAAmC,OAAO,MAAM;AAChE,QAAI,CAAC,wBAAwB,OAAO,GAAG;AACrC,YAAMC,UACJ,QAAQ,WACP,QAAQ,eACL,+BAA+B,QAAQ,YAAY,KACnD;AACN,YAAMD,UAAS,mDAAmDC,OAAM;AACxE,+BAAyB,QAAQD,OAAM;AACvC,YAAME,OAA2B;AAAA,QAC/B,uBAAsB,oBAAI,KAAK,GAAE,YAAY;AAAA,QAC7C,mBAAmB;AAAA,QACnB,oBAAoB,OAAO;AAAA,MAC7B;AACA,2BAAqB,QAAQ,OAAO,OAAOA,IAAG;AAC9C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,YAAY,OAAO;AAAA,QACnB,UAAU,OAAO;AAAA,QACjB,QAAAF;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,6BAAyB,QAAQ,MAAS;AAC1C,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,MAA2B;AAAA,MAC/B,uBAAsB,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7C,mBAAmB;AAAA,MACnB,oBAAoB,OAAO;AAAA,IAC7B;AACA,yBAAqB,QAAQ,OAAO,OAAO,GAAG;AAC9C,kCAA8B,QAAQ,QAAQ,EAAE,QAAQ,qBAAqB,CAAC;AAC9E,UAAM,QAAQ,OAAO;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR,GAAI,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,IAC1C;AAAA,EACF;AAKA,QAAM,eAAe,OAAO,WAAW,OAAO,OAAO,WAAW;AAChE,QAAM,SAAS,oBAAoB,OAAO,MAAM,MAAM,eAAe,8BAA8B;AACnG,QAAM,SAAS,eACX,+BAA+B,OAAO,MAAM,MAAM,MAAM,KACxD,6BAA6B,OAAO,MAAM,MAAM,MAAM;AAC1D,2BAAyB,QAAQ,MAAM;AACvC,SAAO,EAAE,IAAI,OAAO,YAAY,OAAO,QAAQ,UAAU,OAAO,QAAQ,mBAAmB,KAAK;AAClG;AAEA,eAAsB,eAAe,MAAuD;AAC1F,MAAI;AACF,UAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,IAAI;AAC1D,UAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,UAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,UAAM,SAAS,oBAAoB,QAAQ,oBAAoB,GAAG,CAAC;AACnE,UAAM,aAAa,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI,OAAO,cAAc;AAClF,UAAM,UAAU,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,OAAO,WAAW;AACtE,QAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,cAAQ;AAAA,QACN,KAAK;AAAA,UACH;AAAA,YACE,QAAQ,OAAO;AAAA,YACf,OAAO,OAAO;AAAA,YACd,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,cAAc,OAAO;AAAA,YACrB,OAAO,OAAO;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW;AACpB,cAAQ;AAAA,QACN,KAAK;AAAA,UACH;AAAA,YACE,QAAQ,OAAO;AAAA,YACf,OAAO,OAAO;AAAA,YACd,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,oFAAoF;AAClG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,UACd,GAAI,OAAO,UAAU,EAAE,QAAQ,UAAU,IAAI,CAAC;AAAA,UAC9C,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,UACjD,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,UAC7D,GAAI,OAAO,oBAAoB,EAAE,mBAAmB,OAAO,kBAAkB,IAAI,CAAC;AAAA,UAClF;AAAA,UACA;AAAA,UACA,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,OAAO,GAAI,SAAQ,KAAK,CAAC;AAAA,EAChC,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA4B,MAAgB,OAAO,EAAE;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,aAAa,MAA8C;AACzE,QAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,IAAI;AAC1D,QAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,QAAM,SAAS,oBAAoB,QAAQ,oBAAoB,GAAG,CAAC;AACnE,YAAUG,OAAK,KAAK,OAAO,WAAW,kBAAkB,GAAG,MAAM;AACjE,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;AAEA,SAAS,iCAAiC,OAAuC;AAC/E,SAAO;AAAA,IACL,MAAM,4BAA4B,KAAK;AAAA,IACvC,SAAS,4BAA4B,KAAK;AAAA,IAC1C,SAAS,4BAA4B,KAAK;AAAA,IAC1C,MAAM,4BAA4B,KAAK;AAAA,IACvC,QAAQ,4BAA4B,KAAK;AAAA,IACzC,SAAS,2BAA2B,KAAK;AAAA,IACzC,YAAY,8BAA8B,KAAK;AAAA,IAC/C,YAAY,4BAA4B,KAAK;AAAA,EAC/C;AACF;AAEA,SAAS,cAAc,OAAyD;AAC9E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEA,SAAS,oBAAoB,MAA0E;AACrG,QAAM,UAA4C,CAAC;AACnD,MAAI,KAAK,YAAY,QAAQ,KAAK,YAAY,OAAQ,SAAQ,UAAU;AACxE,MAAI,KAAK,YAAY,QAAQ,KAAK,YAAY,OAAQ,SAAQ,UAAU;AACxE,QAAM,OAAO,cAAc,KAAK,QAAQ,KAAK,MAAM;AACnD,MAAI,KAAM,SAAQ,OAAO;AACzB,QAAM,SAAS,cAAc,KAAK,UAAU,KAAK,IAAI;AACrD,MAAI,OAAQ,SAAQ,SAAS;AAC7B,QAAM,SAAS,cAAc,KAAK,MAAM;AACxC,MAAI,OAAQ,SAAQ,SAAS;AAC7B,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAwB,SAAoD;AACxG,MAAI,QAAQ,SAAS;AACnB,UAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5E,UAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACnE,QAAI,EAAE,cAAc,aAAa,cAAc,qBAAqB,cAAc,WAAW,WAAW,YAAY;AAClH,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,QAAQ,SAAS;AACnB,QAAI,EAAE,OAAO,WAAW,aAAa,OAAO,cAAc,aAAa,OAAO,cAAc,oBAAoB;AAC9G,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,SAAS,YAAY,OAAO,WAAW,QAAQ,KAAM,QAAO;AAC/E,MAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,WAAW,QAAQ,OAAQ,QAAO;AACnF,MAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,WAAW,QAAQ,OAAQ,QAAO;AACnF,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAiB,MAAkD;AAC7F,QAAM,UAAU,oBAAoB,IAAI;AACxC,MAAI,OAAO,KAAK,OAAO,EAAE,WAAW,EAAG,QAAO;AAC9C,QAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,WAAW,qBAAqB,QAAQ,OAAO,CAAC;AACtF,QAAM,WAAqB;AAAA,IACzB,GAAG;AAAA,IACH,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QACb,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,QAAQ,EAAE,cAAc,MAAM,EAC3E,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IACtB;AAAA,IACA,eAAe;AAAA,EACjB;AACA,MAAI,MAAM,SAAS;AACjB,aAAS,UAAU;AAAA,MACjB,cAAc,QAAQ,SAAS,QAAQ;AAAA,MACvC,iBAAiB,QAAQ,SAAS,WAAW;AAAA,MAC7C,iBAAiB,QAAQ,SAAS,gBAAgB;AAAA,IACpD;AAAA,EACF;AACA,MAAI,MAAM,WAAY,UAAS,aAAa,uBAAuB,OAAO;AAC1E,SAAO;AACT;AAEO,SAAS,WAAW,MAA8C;AACvE,QAAM,QAAQ,oBAAoB,IAAI;AACtC,QAAM,eAAe,KAAK,SAAS,QAAQ,KAAK,SAAS;AACzD,QAAM,QAAQ,mBAAmB,eAAe,cAAc,KAAK,IAAI,qBAAqB,KAAK,GAAG,IAAI;AACxG,QAAM,gBAAgB,MAAM;AAC5B,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,YAAY,eAAe,SAAS;AAAA,QACpC,aAAa,MAAM;AAAA,QACnB,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,QACpE,GAAI,CAAC,eACD;AAAA,UACE,gBAAgB;AAAA,YACd,YAAY;AAAA,YACZ,0BAA0B;AAAA,YAC1B,wBAAwB,CAAC,UAAU,iBAAiB,eAAe,mBAAmB;AAAA,UACxF;AAAA,UACA,mBAAmB,iCAAiC,KAAK;AAAA,QAC3D,IACA,CAAC;AAAA,QACL,gBAAgB,MAAM;AAAA,QACtB,GAAI,aAAa,QAAQ,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,QACvD,GAAI,gBAAgB,QAAQ,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,QAChE,SAAS;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AA0BA,SAAS,sBAAsB,OAIZ;AACjB,QAAM,EAAE,KAAK,YAAY,OAAO,IAAI;AACpC,QAAM,SAAS,oBAAoB,QAAiB;AAAA,IAClD,MAAM,IAAI;AAAA,IACV,YAAY,IAAI;AAAA,EAClB,CAAC;AACD,QAAM,aACJ,OAAO,YAAY,yBAAyB,SAAS,OAAO,YAAY,OACpE,OAAO,YAAY,OACnB;AACN,QAAM,gBAAgB,0BAA0B;AAAA,IAC9C,OAAO,OAAO;AAAA,IACd,aAAa,OAAO;AAAA,IACpB,cAAc,OAAO;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB;AAAA,EACF,CAAC;AAKD,QAAM,aAAa,OAAO;AAC1B,QAAM,uBAAuB,OAAO,eAAe,YAAY,aAAa,aAAa;AACzF,QAAM,oBAAoBJ,oCAAmC,oBAAoB,IAC7E,SACA;AACJ,QAAM,cAAc,oBAAoB,YAAY,OAAO;AAC3D,QAAM,iBAAiB,oBAAoB,YAAY,OAAO,UAAU;AACxE,QAAM,qBAAqBF,UAAS,OAAO,kBAAkB;AAC7D,QAAM,iBAAiBA,UAAS,oBAAoB,IAAI;AACxD,QAAM,oBAAoBC,UAAS,oBAAoB,OAAO;AAC9D,QAAM,wBAAwBA,UAAS,oBAAoB,MAAM;AACjE,QAAM,qBAAqB,MAAM,QAAQ,oBAAoB,QAAQ,IACjE,mBAAmB,SAAS,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,IACnG,CAAC;AACL,QAAM,QAAQA,UAAS,gBAAgB,KAAK,KAAKA,UAAS,oBAAoB,KAAK;AACnF,QAAM,uBAAuBA,UAAS,OAAO,oBAAoB;AACjE,QAAM,iBAAiB,qBAAqB;AAAA,IAC1C,UAAU,uBAAuB,MAAM;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,aAAa,iBAAiB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,uBAAuB,MAAM;AAAA,EACzC,CAAC;AACD,QAAM,eAAe,mBAAmB;AAAA,IACtC,cAAc,OAAO;AAAA,IACrB;AAAA,IACA,OAAO,SAAS;AAAA,EAClB,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,iBAAiB,qBAAqB,OAAO,UAAU;AAAA,IACvD,gBAAgB,OAAO,cACnB,mBAAmB,qBAAqB,mBAAmB,YAC3D;AAAA,IACJ,0BAA0B,CAAC,OAAO,eAAe,CAAC,OAAO;AAAA,IACzD,cAAc,eAAe,cAAc,kBAAkB;AAAA,IAC7D,eAAe,eAAe,cAAc,cAAc,kBAAkB;AAAA,IAC5E,KAAK,OAAO;AAAA,IACZ,OAAO,OAAO;AAAA,IACd,aAAa,OAAO;AAAA,IACpB,gBAAgB,OAAO;AAAA,IACvB,oBAAoB,OAAO;AAAA,IAC3B,sBAAsB,OAAO;AAAA,IAC7B,kBAAkB,OAAO;AAAA,IACzB,kBAAkB,OAAO,aAAa;AAAA,IACtC,cAAc,OAAO;AAAA,IACrB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO,UAAU;AAAA,IACzB,QAAQ,OAAO,UAAU;AAAA,IACzB,8BACE,OAAO,OAAO,iCAAiC,WAC3C,OAAO,+BACP;AAAA,IACN,6BAA6B,MAAM;AACjC,YAAM,MAAM,OAAO;AACnB,UAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,YAAM,QAAS,IAA0C;AACzD,aAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS;AAAA,IAC/C,GAAG;AAAA,IACH,YAAY,OAAO,cAAc;AAAA,IACjC,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,IACzD,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,IAC3E,gBAAgB,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;AAAA,IACpF;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB;AAAA,IACA;AAAA,IACA,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C;AAAA,IACA,wBAAwB;AAAA,IACxB;AAAA,IACA,mBAAmB,qBAAqB;AAAA,IACxC,YAAY;AAAA,MACV,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB;AAAA,IACA,iBAAiB,OAAO,eAAe,OAAO;AAAA,IAC9C,eAAe,qBAAqB,OAAO,SAAS;AAAA,IACpD;AAAA,IACA,UAAU,OAAO,YAAY;AAAA,IAC7B,iBAAiB,OAAO,YAAY;AAAA,EACtC;AACF;AAEA,SAAS,uBAAuB,QAA0C;AACxE,QAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACnE,QAAM,uBACJ,OAAO,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,KAAK,EAAE,SAAS,IACrF,OAAO,oBACP;AACN,QAAM,oBAAoB,wBAAwB,CAACC,oCAAmC,oBAAoB;AAC1G,MAAI,kBAAmB,QAAO;AAC9B,MAAI,OAAO,OAAO,yBAAyB,YAAY,OAAO,qBAAqB,KAAK,EAAG,QAAO;AAClG,MAAI,OAAO,sBAAsB,eAAgB,QAAO;AACxD,SAAO,WAAW;AACpB;AAEA,SAAS,sBAAsB,YAAoB,QAAiD;AAClG,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,KAAK,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAM;AAAA,IACnD,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,IAC5D,QAAQ,OAAO,UAAU;AAAA,IACzB,QAAQ,OAAO,UAAU;AAAA,IACzB,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,IACzD,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,IAC3E,gBAAgB,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;AAAA,IACpF,gBAAgB,OAAO,uBAAuB,4BAA4B;AAAA,IAC1E,sBAAsB,OAAO,OAAO,yBAAyB,WAAW,OAAO,uBAAuB;AAAA,IACtG,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C,WAAW,OAAO,cAAc;AAAA,IAChC,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,QAAQ,SAA2B,KAAqC;AAC/E,QAAM,SAAiC,CAAC;AACxC,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAM,OAAO,GAAG;AACtB,UAAM,QAAQ,OAAO,QAAQ,YAAY,IAAI,KAAK,IAAI,MAAM;AAC5D,WAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,QAAiC;AACtE,MAAI,OAAO,cAAc,UAAW,QAAO;AAC3C,QAAM,SAAS,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AACrF,SACE,OAAO,SAAS,qBAAqB,KACrC,OAAO,SAAS,oCAAoC,KACpD,OAAO,SAAS,wCAAwC,KACxD,OAAO,SAAS,kBAAkB;AAEtC;AAEA,SAAS,uBAAuB,SAAoD;AAClF,QAAM,uBAAuB,QAAQ,OAAO,6BAA6B;AACzE,QAAM,aAAa,QAAQ,OAAO,CAAC,WAAW;AAC5C,QAAI,8BAA8B,MAAM,EAAG,QAAO;AAClD,UAAM,YAAY,OAAO;AACzB,WAAO,cAAc,qBAAqB,cAAc,aAAa,cAAc,WAAW,OAAO,WAAW;AAAA,EAClH,CAAC;AACD,SAAO;AAAA,IACL,iBAAiB,WAAW;AAAA,IAC5B,cAAc,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,SAAS,EAAE;AAAA,IACtE,cAAc,QAAQ,OAAO,CAAC,WAAW,OAAO,cAAc,SAAS,EAAE;AAAA,IACzE,YAAY,QAAQ,OAAO,CAAC,WAAW,OAAO,cAAc,OAAO,EAAE;AAAA,IACrE,qBAAqB,QAAQ,OAAO,CAAC,WAAW,OAAO,cAAc,iBAAiB,EAAE;AAAA,IACxF,WAAW,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,MAAM,EAAE;AAAA,IAChE,0BAA0B,qBAAqB;AAAA,IAC/C,sBAAsB,qBAAqB,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,YAAY;AAAA,MACvE,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,gBAAgB,OAAO;AAAA,IACzB,EAAE;AAAA,IACF,mBAAmB,WAAW,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,YAAY;AAAA,MAC1D,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,iBAAiB,OAAO;AAAA,MACxB,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,gBAAgB,OAAO;AAAA,MACvB,YAAY,OAAO;AAAA,IACrB,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,WAAW,KAAuB,SAA2B,SAA4B;AAChG,QAAM,QAAkB;AAAA,IACtB,OAAO,IAAI;AAAA,IACX,MAAM,IAAI;AAAA,IACV,QAAQ,gBAAgB,IAAI,QAAQ,OAAO;AAAA,IAC3C,MAAM,IAAI;AAAA,IACV,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,QAAQ,EAAE,cAAc,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IACxH;AAAA,EACF;AACA,MAAI,SAAS;AACX,UAAM,UAAU;AAAA,MACd,cAAc,QAAQ,SAAS,QAAQ;AAAA,MACvC,iBAAiB,QAAQ,SAAS,WAAW;AAAA,MAC7C,iBAAiB,QAAQ,SAAS,gBAAgB;AAAA,IACpD;AACA,UAAM,aAAa,uBAAuB,OAAO;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,QAAiC;AAClE,SAAO,OAAO,WAAW,UAAU,OAAO,cAAc;AAC1D;AAEO,SAAS,cAAc,OAAyB;AACrD,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAC3C,QAAM,UAAU,MAAM,IAAI,CAAC,SAAS;AAClC,UAAM,SAAS;AAAA,MACbI,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,QAAQ,MAAM,QAAQ,WAAW,WAAW,mBAAmB,iBAAiB,wBAAwB;AAAA,IACnH;AACA,WAAO,sBAAsB,EAAE,KAAK,YAAY,MAAM,OAAO,CAAC;AAAA,EAChE,CAAC;AACD,QAAM,QAAQ,WAAW,KAAK,SAAS,KAAK;AAC5C,YAAUA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,iBAAiB,GAAG,KAAK;AACnE,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAyB;AAC5D,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAC3C,QAAM,aAAa,MAAM,IAAI,CAAC,SAAS;AACrC,UAAM,SAAS;AAAA,MACbA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,QAAQ,MAAM,QAAQ,WAAW,WAAW,mBAAmB,iBAAiB,wBAAwB;AAAA,IACnH;AACA,QAAI,uBAAuB,MAAM,EAAG,QAAO,sBAAsB,MAAM,MAAM;AAC7E,WAAO,sBAAsB,EAAE,KAAK,YAAY,MAAM,OAAO,CAAC;AAAA,EAChE,CAAC;AACD,QAAM,UAAU,WAAW,OAAO,CAAC,WAAW,CAAC,0BAA0B,MAAM,CAAC;AAChF,QAAM,QAAQ,WAAW,KAAK,SAAS,IAAI;AAC3C,QAAM,SAAS,gBAAgB,IAAI,QAAQ,UAAU;AACrD,QAAM,UAAU;AAAA,IACd,GAAI,MAAM,WAAW,CAAC;AAAA,IACtB,kBAAkB,WAAW;AAAA,IAC7B,kBAAkB,QAAQ;AAAA,IAC1B,gCAAgC,WAAW,SAAS,QAAQ;AAAA,IAC5D,iBAAiB,QAAQ,YAAY,QAAQ;AAAA,IAC7C,oBAAoB,QAAQ,YAAY,WAAW;AAAA,EACrD;AACA,YAAUA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,yBAAyB,GAAG,KAAK;AAC3E,SAAO;AACT;AAEA,eAAsB,4BACpB,MACA,QACyC;AACzC,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,QAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,MAAI,CAAC,SAAS,CAAC,UAAW,QAAO;AACjC,QAAM,QAAQ,cAAc,KAAK;AACjC,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,MAAM,8BAA8B,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,WAAW;AAAA,IAC3G,SAAS;AAAA,EACX,CAAC;AACD,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AACvE,QAAM,MAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA,EAAE,WAAW,OAAO,QAAQ,UAAU,MAAM;AAAA,IAC5C,EAAE,WAAW,SAAS,KAAK;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,YAAY,IAAI;AAAA,IAChB,UAAU,IAAI;AAAA,IACd,eAAe,IAAI;AAAA,IACnB,oBAAoB,IAAI;AAAA,EAC1B;AACF;AAEA,SAAS,gCAAgC,OAAuC;AAC9E,SAAO;AAAA,IACL,MAAM,2BAA2B,KAAK;AAAA,IACtC,SAAS,uBAAuB,KAAK;AAAA,IACrC,SAAS,uBAAuB,KAAK;AAAA,IACrC,MAAM,uBAAuB,KAAK;AAAA,IAClC,QAAQ,uBAAuB,KAAK;AAAA,IACpC,aAAa,4BAA4B,KAAK;AAAA,IAC9C,YAAY,8BAA8B,KAAK;AAAA,IAC/C,YAAY,4BAA4B,KAAK;AAAA,IAC7C,aAAa,+BAA+B,KAAK;AAAA,EACnD;AACF;AAEO,SAAS,UAAU,MAA8C;AACtE,QAAM,QAAQ,oBAAoB,IAAI;AACtC,QAAM,eAAe,KAAK,SAAS,QAAQ,KAAK,SAAS;AACzD,QAAM,QAAQ,mBAAmB,eAAe,cAAc,KAAK,IAAI,qBAAqB,KAAK,GAAG,IAAI;AACxG,QAAM,aAAa,eAAe,SAAS;AAC3C,MAAI,CAAC,cAAc;AACjB,UAAM,iBAAiB;AAAA,MACrB,YAAY;AAAA,MACZ,0BAA0B;AAAA,MAC1B,qBAAqB,CAAC,eAAe,gBAAgB,eAAe,sBAAsB,qBAAqB;AAAA,MAC/G,wBAAwB,CAAC,UAAU,iBAAiB,eAAe,uBAAuB;AAAA,IAC5F;AACA,UAAM,oBAAoB,gCAAgC,KAAK;AAAA,EACjE;AACA,UAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C;AAEO,SAAS,WAAW,MAA8C;AACvE,QAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,IAAI;AAC1D,QAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,QAAM,MAAM,SAAS,OAAO,YAAY,OAAO,KAAK,SAAS,EAAE,CAAC;AAChE,MAAI,KAAK,QAAQ,QAAQ,KAAK,QAAQ,QAAQ;AAC5C,YAAQ,OAAO,MAAM,GAAG;AACxB;AAAA,EACF;AACA,aAAW,QAAQ,IAAI,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AAClD,UAAM,QAAQ,SAAS,IAAI;AAC3B,UAAM,UAAU,QAAQ,eAAe,KAAK,IAAI;AAChD,QAAI,QAAS,SAAQ,IAAI,OAAO;AAAA,EAClC;AACF;AAEO,SAAS,WAAW,MAA8C;AACvE,QAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,IAAI;AAC1D,QAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,MAAI,CAAC,WAAW,OAAO,GAAG,GAAG;AAC3B,YAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,cAAc,GAAG,MAAM,CAAC,CAAC;AACpG;AAAA,EACF;AACA,oBAAkB,OAAO,KAAM,SAAS;AACxC,UAAQ,IAAI;AACZ,MAAI,WAAW,OAAO,GAAG,GAAG;AAC1B,sBAAkB,OAAO,KAAM,SAAS;AACxC,YAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,eAAe,GAAG,MAAM,CAAC,CAAC;AACrG;AAAA,EACF;AACA,UAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,OAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,UAAU,GAAG,MAAM,CAAC,CAAC;AAClG;;;AH95BA;AASA,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,IAAI,KAAK,KAAK;AAO3C,IAAM,4BAA4B;AAClC,IAAM,8BAA8B;AAwBpC,SAAS,SAAS,KAAyD;AACzE,QAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,GAAG;AACzD,SAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,WAAW,IAAI,YAAY,OAAO,IAAI,SAAS,IAAI;AAAA,IACnD,QAAQ,OAAO,IAAI,MAAM,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI;AAAA,IAClE,YAAY,OAAO,IAAI,UAAU,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,IAAI;AAAA,IAC9E,kBACE,OAAO,IAAI,gBAAgB,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,IAAI;AAAA,IAChF,mBACE,OAAO,IAAI,iBAAiB,IAAI,IAAI,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,IAAI;AAAA,IAClF,SAAS,IAAI,UAAU,OAAO,IAAI,OAAO,IAAI;AAAA,IAC7C,QAAQ,IAAI,SAAS,OAAO,IAAI,MAAM,IAAI;AAAA,EAC5C;AACF;AAMA,eAAsB,mBACpB,KAC8B;AAC9B,QAAM,OAAO,SAAS,GAAG;AACzB,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,mBAAmB,KAAK,oBAAoB;AAClD,QAAM,oBAAoB,KAAK,qBAAqB;AAEpD,MAAI,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AAC3C,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,QAAQ;AACvC,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,yBAAyB,MAAM,GAAG;AACpC,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAIA,QAAM,UAAU,KAAK,IAAI;AAKzB,SAAO,MAAM;AACX,aAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AACvC,QAAI,yBAAyB,MAAM,GAAG;AACpC,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,SAAS,oBAAoB,MAAM;AACzC,QAAI,uBAAuB,MAAM,EAAG;AAGpC,QAAI,CAAC,WAAW,OAAO,GAAG,EAAG;AAC7B,QAAI,KAAK,IAAI,IAAI,UAAU,YAAY;AACrC,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,gCAAgC,UAAU;AAAA,MACpD;AAAA,IACF;AACA,YAAQ,MAAM;AAAA,EAChB;AAKA,MAAI;AACJ,MAAI;AACJ,WAAS,UAAU,GAAG,WAAW,kBAAkB,WAAW;AAC5D,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MACtD,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MAChD,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC/C,CAAC;AACD,qBAAiB,OAAO;AACxB,QAAI,OAAO,IAAI;AACb,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,SAAS;AAAA,QACT,YAAY,OAAO;AAAA,QACnB,UAAU;AAAA,MACZ;AAAA,IACF;AAOA,UAAM,eAAe,OAAO,eAAe,OAAO,OAAO,eAAe;AACxE,QAAI,cAAc;AAChB,mBAAa,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACjE,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,SAAS;AAAA,QACT,YAAY,OAAO;AAAA,QACnB,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,IACF;AACA,iBAAa,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACjE,QAAI,UAAU,iBAAkB,SAAQ,iBAAiB;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,QAAQ,cAAc;AAAA,EACxB;AACF;AAGA,eAAsB,sBAAsB,KAAsD;AAChG,MAAI;AACF,UAAM,UAAU,MAAM,mBAAmB,GAAG;AAC5C,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,QAAI,QAAQ,YAAY,kBAAkB,QAAQ,YAAY,aAAa;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAIA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAiC,MAAgB,OAAO,EAAE;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AA6BA,SAAS,wBAAgC;AAGvC,SAAOC,OAAK,KAAKC,eAAc,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,QAAQ;AACzE;AASO,SAAS,uBAAuB,MAAuD;AAC5F,QAAM,UAAU,KAAK,WAAW,sBAAsB;AACtD,MAAI,CAACC,aAAW,OAAO,EAAG,QAAO;AACjC,QAAM,UAAUF,OAAK,KAAK,KAAK,WAAW,mBAAmB;AAC7D,MAAI;AACJ,MAAI;AACF,YAAQG,UAAS,SAAS,GAAG;AAAA,EAC/B,QAAQ;AACN,YAAQ;AAAA,EACV;AACA,QAAM,QAA+B;AAAA,IACnC;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACA,QAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AACtD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA,KAAK;AAAA,EACP;AACA,MAAI,KAAK,UAAW,MAAK,KAAK,iBAAiB,KAAK,SAAS;AAC7D,MAAI,KAAK,QAAS,MAAK,KAAK,cAAc,KAAK,OAAO;AACtD,MAAI,KAAK,OAAQ,MAAK,KAAK,YAAY,KAAK,MAAM;AAClD,MAAI;AACF,UAAM,QAAQC;AAAA,MACZ;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,QACjB,UAAU;AAAA,QACV;AAAA,QACA,KAAK,QAAQ;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,UAAU,OAAW,CAAAC,WAAU,KAAK;AACxC,UAAM,MAAM;AACZ,WAAO,EAAE,KAAK,MAAM,KAAK,SAAS,QAAQ;AAAA,EAC5C,QAAQ;AACN,QAAI,UAAU,QAAW;AACvB,UAAI;AACF,QAAAA,WAAU,KAAK;AAAA,MACjB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AenUA;AAKO,SAAS,2BACd,MACA,cACA,QACM;AACN,MAAI,MAAM,CAAC,SAAS,UAAU,QAAQ,SAAS,GAAG,EAAE,cAAc,KAAK,CAAC;AACxE,QAAM,YAAY,UAAU,MAAM;AAClC,QAAM,QAAQ,WAAW,MAAM,CAAC,YAAY,OAAO,MAAM,QAAQ,cAAc,SAAS,CAAC;AACzF,MAAI,MAAM,WAAW,EAAG;AAExB,QAAM,WAAW,WAAW,MAAM,CAAC,YAAY,OAAO,MAAM,QAAQ,cAAc,MAAM,CAAC;AACzF,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,SACJ,MAAM,UACN,MAAM,UACN,SAAS,UACT,SAAS,UACT;AACF,UAAM,IAAI,MAAM,MAAM;AAAA,EACxB;AACF;;;ArBLA;AAEA;AAoCO,SAAS,mBAAmB,KAAuB,MAA+C;AAKvG,QAAM,UAAU,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AACnE,MAAI,CAAC,WAAW,YAAY,eAAe,YAAY,QAAQ;AAC7D,UAAM,IAAI,MAAM,+DAA+D,KAAK,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,EAC7G;AACA,QAAM,OAAO,SAAS,OAAO;AAC7B,MAAI,IAAI,UAAU,IAAI,EAAG,OAAM,IAAI,MAAM,gCAAgC,IAAI,EAAE,KAAK,IAAI,EAAE;AAC1F,MAAI,CAAC,KAAK,KAAM,OAAM,IAAI,MAAM,gCAAgC,IAAI,EAAE;AAMtE,QAAM,UACJ,KAAK,eAAe,KAAK,iBACrB;AAAA,IACE,UAAU,KAAK,YAAY;AAAA,IAC3B,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK,eAAe;AAAA,IAC1B,gBAAgB,KAAK,kBAAkB,KAAK;AAAA,EAC9C,IACA,oBAAoB;AAAA,IAClB,eAAe,KAAK;AAAA,IACpB,kBAAkB,KAAK;AAAA,IACvB,oCAAoC,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,EACnE,CAAC;AACP,QAAM,WAAW,sBAAsB,QAAQ,QAAQ;AACvD,MAAI,cAAc,QAAQ;AAC1B,MAAI,SAAS,gBAAgB;AAC3B,UAAM,YAAY,SAAS,eAAe,KAAK,KAAK;AACpD,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,IAAI;AAAA,QACR,wCAAwC,SAAS,IAAI,MAAM,UAAU,QAAQ,oCAAoC;AAAA,MACnH;AAAA,IACF;AACA,QAAI,UAAU,YAAY;AACxB,cAAQ,MAAM,gBAAgB,IAAI,KAAK,UAAU,IAAI,EAAE;AAAA,IACzD;AACA,kBAAc,UAAU;AAAA,EAC1B;AAEA,QAAM,EAAE,aAAa,IAAI,SAAS;AAClC,QAAM,YAAYC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,IAAI;AACjE,EAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,QAAM,eAAeD,OAAK,KAAK,cAAc,IAAI,IAAI,IAAI;AACzD,QAAM,eAAe,KAAK,oBAAoB,KAAK,KAAK;AACxD,QAAM,SAAS,gBAAgB,KAAK,UAAU,SAAS,IAAI,EAAE,IAAI,IAAI;AACrE,MAAIE,aAAW,YAAY,EAAG,OAAM,IAAI,MAAM,iCAAiC,YAAY,EAAE;AAE7F,MAAI,IAAI,MAAM,CAAC,SAAS,UAAU,SAAS,GAAG,EAAE,cAAc,KAAK,CAAC;AACpE,MAAI,cAAc;AAChB,+BAA2B,IAAI,MAAM,cAAc,YAAY;AAAA,EACjE,OAAO;AACL,QAAI,IAAI,MAAM,CAAC,YAAY,OAAO,MAAM,QAAQ,cAAc,IAAI,UAAU,GAAG,EAAE,YAAY,KAAK,CAAC;AAAA,EACrG;AAEA,QAAM,aAAaF,OAAK,KAAK,WAAW,cAAc;AACtD,QAAM,aAAaA,OAAK,KAAK,WAAW,YAAY;AACpD,QAAM,gBAAgBA,OAAK,KAAK,WAAW,iBAAiB;AAC5D,QAAM,SAAS,YAAY;AAAA,IACzB,MAAM,KAAK;AAAA,IACX,YAAY,KAAK,cAAc,CAAC;AAAA,IAChC;AAAA,IACA;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,2BAA2B,KAAK;AAAA,IAChC,uBACE,KAAK,+BACL,KAAK,sBAAsB,kBAC3B;AAAA,IACF,iBAAiB,KAAK;AAAA,IACtB,yBAAyB,KAAK;AAAA,IAC9B,OAAO;AAAA,IACP,mBAAmB,KAAK;AAAA,IACxB,oBAAoB,KAAK,uBAAuB,gBAAgB;AAAA,EAClE,CAAC;AAED,QAAM,oBAAoB,QAAQ,IAAI;AACtC,QAAM,uBAAuB,QAAQ,IAAI;AACzC,MAAI,KAAK,OAAQ,SAAQ,IAAI,yBAAyB,OAAO,KAAK,MAAM;AACxE,MAAI,KAAK,UAAW,SAAQ,IAAI,6BAA6B,OAAO,KAAK,SAAS;AAElF,MAAI;AACJ,MAAI;AACF,cAAU,SAAS,MAAM;AAAA,MACvB;AAAA,MACA,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,IAAI,MAAM,CAAC,YAAY,UAAU,WAAW,YAAY,GAAG,EAAE,cAAc,KAAK,CAAC;AACrF,QAAI,IAAI,MAAM,CAAC,UAAU,MAAM,MAAM,GAAG,EAAE,cAAc,KAAK,CAAC;AAC9D,UAAM;AAAA,EACR,UAAE;AACA,QAAI,sBAAsB,OAAW,QAAO,QAAQ,IAAI;AAAA,QACnD,SAAQ,IAAI,yBAAyB;AAC1C,QAAI,yBAAyB,OAAW,QAAO,QAAQ,IAAI;AAAA,QACtD,SAAQ,IAAI,6BAA6B;AAAA,EAChD;AAEA,QAAM,QAAQ,qBAAqB,QAAQ,OAAO,aAAa,SAAS,YAAY;AACpF,QAAM,SAAS,eAAe;AAC9B,QAAM,cAAc,mBAAmB,QAAQ,KAAK,MAAM;AAC1D,QAAM,YAAY,6BAA6B,EAAE;AACjD,QAAM,QAAQ,aAAa,YAAY,OAAO;AAC9C,QAAM,SAA8B;AAAA,IAClC;AAAA,IACA,OAAO,IAAI;AAAA,IACX,QAAQ;AAAA,IACR,KAAK,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK;AAAA,IACjB,GAAI,KAAK,YAAY,EAAE,WAAW,OAAO,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,SAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,IACrD,GAAI,KAAK,SAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,IACrD,GAAI,KAAK,+BACL,EAAE,8BAA8B,OAAO,KAAK,4BAA4B,EAAE,IAC1E,CAAC;AAAA,IACL,GAAI,KAAK,4BAA4B,EAAE,2BAA2B,KAAK,0BAA0B,IAAI,CAAC;AAAA,IACtG,GAAI,KAAK,uBAAuB,EAAE,sBAAsB,KAAK,qBAAqB,IAAI,CAAC;AAAA,IACvF,GAAI,KAAK,cAAc,EAAE,aAAa,OAAO,KAAK,WAAW,EAAE,IAAI,CAAC;AAAA,IACpE,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,KAAK,gBAAgB,IAAI,CAAC;AAAA,IACxE,GAAI,KAAK,0BAA0B,EAAE,yBAAyB,KAAK,wBAAwB,IAAI,CAAC;AAAA,IAChG,GAAI,KAAK,aAAa,EAAE,YAAY,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC;AAAA,IACjE,GAAI,KAAK,aAAa,EAAE,YAAY,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC;AAAA,IACjE,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,IAC9C,GAAI,CAAC,KAAK,aAAa,CAAC,KAAK,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IAC7D,aAAa,QAAQ;AAAA,IACrB,GAAI,QAAQ,iBAAiB,EAAE,gBAAgB,QAAQ,eAAe,IAAI,CAAC;AAAA,IAC3E,GAAI,QAAQ,qBAAqB,EAAE,oBAAoB,QAAQ,mBAAmB,IAAI,CAAC;AAAA,IACvF,GAAI,KAAK,cAAc,EAAE,aAAa,OAAO,KAAK,WAAW,EAAE,IAAI,CAAC;AAAA,IACpE,GAAI,KAAK,eAAe,EAAE,cAAc,OAAO,KAAK,YAAY,EAAE,IAAI,CAAC;AAAA,IACvE,GAAI,KAAK,YAAY,EAAE,WAAW,OAAO,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,YAAY,EAAE,WAAW,OAAO,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,oBAAoB,EAAE,mBAAmB,OAAO,KAAK,iBAAiB,EAAE,IAAI,CAAC;AAAA,IACtF,GAAI,KAAK,qBAAqB,EAAE,oBAAoB,OAAO,KAAK,kBAAkB,EAAE,IAAI,CAAC;AAAA,IACzF,SAAS,YAAY;AAAA,IACrB;AAAA,IACA;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,aAAW,IAAI,IAAI,MAAM;AACzB,MAAI,UAAU,EAAE,GAAI,IAAI,WAAW,CAAC,GAAI,CAAC,IAAI,GAAG,EAAE,WAAW,YAAYA,OAAK,KAAK,WAAW,aAAa,EAAE,EAAE;AAC/G,MAAI,SAAS;AACb,UAAQ,GAAG;AASX,MAAI,OAAO,aAAa,OAAO,QAAQ;AACrC,QAAI;AACJ,QAAI;AACF,uBAAiB,uBAAuB;AAAA,QACtC,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,QACA,WAAW,OAAO;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,OAAO;AAId,YAAM,SAAS,uCAAwC,MAAgB,OAAO;AAC9E,aAAO,oBAAoB;AAC3B,iBAAW,IAAI,IAAI,MAAM;AAAA,IAC3B;AAGA,QAAI,CAAC,gBAAgB;AACnB,YAAM,SAAS;AACf,aAAO,oBAAoB;AAC3B,aAAO,kCAAiC,oBAAI,KAAK,GAAE,YAAY;AAC/D,iBAAW,IAAI,IAAI,MAAM;AAAA,IAC3B,WAAW,eAAe,KAAK;AAC7B,aAAO,uBAAuB,eAAe;AAC7C,iBAAW,IAAI,IAAI,MAAM;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,YAAY,MAAuD;AACvF,QAAM,MAAM,QAAQ,OAAO,KAAK,GAAG,CAAC;AACpC,QAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AAChE,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,yCAAyC;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,cAAc,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI,MAAS;AAC5G,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,+BAA+B;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,cAAc,QAAQ,KAAK,aAAa,KAAK,MAAM;AACzD,QAAM,oBAAoB,KAAK,cAAc,QAAQ,KAAK,cAAc;AACxE,MAAI,CAAC,eAAe,CAAC,sBAAsB,KAAK,aAAa,KAAK,SAAS;AACzE,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,KAAK,SAAS,QAAQ,KAAK,SAAS;AACjD,MAAI;AACJ,MAAI;AACF,aAAS,mBAAmB,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,YAAY,KAAK,QAAQ,OAAO,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,MAC/F,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,MACzC,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,MAC5C,WAAW,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,MACrD,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,MAC5C,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AAAA,IACpD,CAAC;AACD,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,OAAO,IAAI;AAAA,UACX,QAAQ,OAAO;AAAA,UACf,KAAK,OAAO;AAAA,UACZ,QAAQ,OAAO;AAAA,UACf,cAAc,OAAO;AAAA,UACrB,WAAW,OAAO;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,wBAAyB,MAAgB,OAAO,EAAE;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,QAAQ,CAAC,OAAQ;AAMtB,QAAM,UAAU,MAAM,mBAAmB;AAAA,IACvC,KAAK,OAAO,KAAK,GAAG;AAAA,IACpB,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1D,GAAI,KAAK,UAAU,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,SAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,EACvD,CAAC;AACD,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,sBAAsB,GAAG,QAAQ,CAAC,CAAC;AACzE,MAAI,QAAQ,YAAY,aAAa;AACnC,YAAQ,WAAW;AAAA,EACrB;AACF;;;AsB3UA;AACA;AAEA;AAJA,OAAOG,YAAU;AAgBjB,SAAS,qBAAqB,QAG5B;AACA,QAAM,aAAa,MAAM,QAAQ,OAAO,UAAU,IAC9C,OAAO,WAAW,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAClE,CAAC;AACL,QAAM,mBAAmB,MAAM;AAAA,IAC5B,OAAgE;AAAA,EACnE,KAEO,OAAiE,oBAAoB,CAAC,GACvF,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAClD,CAAC;AACL,SAAO;AAAA,IACL,GAAI,WAAW,SAAS,EAAE,WAAW,IAAI,CAAC;AAAA,IAC1C,GAAI,iBAAiB,SAAS,EAAE,iBAAiB,IAAI,CAAC;AAAA,IACtD,GAAK,OAAsE,yBACvE,EAAE,wBAAwB,KAAK,IAC/B,CAAC;AAAA,EACP;AACF;AAGO,SAAS,+BAA+B,OAAyC;AACtF,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,MAAgC,CAAC;AACvC,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,SAAS;AAAA,MACbA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,UAAU,CAAC,sBAAsB,MAAM,EAAG;AACvD,QAAI,KAAK;AAAA,MACP,OAAO,IAAI;AAAA,MACX,YAAY;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,KAAK,OAAO;AAAA,MACZ,GAAG,qBAAqB,MAAM;AAAA,IAChC,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AlD5CA;;;AmDdA,SAAS,cAAAC,mBAAkB;AAGpB,SAAS,aAAa,MAAsB;AACjD,QAAM,aAAa,KAAK,QAAQ,SAAS,IAAI,EAAE,QAAQ;AACvD,SAAOA,YAAW,QAAQ,EAAE,OAAO,YAAY,MAAM,EAAE,OAAO,KAAK;AACrE;AAEO,SAAS,YAAY,SAAmD;AAC7E,MAAI,WAAW,KAAM,QAAO;AAC5B,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS,QAAO;AACrB,SAAOA,YAAW,QAAQ,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,KAAK;AAClE;;;ACbA;;;ACEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EAET,YAAY,MAA8B,SAAiB,YAAqB;AAC9E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,SAAS,oBAAoB,QAAgB,SAAmC;AACrF,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO,IAAI,iBAAiB,QAAQ,SAAS,MAAM;AAAA,EACrD;AACA,MAAI,UAAU,KAAK;AACjB,WAAO,IAAI,iBAAiB,UAAU,SAAS,MAAM;AAAA,EACvD;AACA,SAAO,IAAI,iBAAiB,aAAa,SAAS,MAAM;AAC1D;AAEO,SAAS,qBAAqB,KAAgC;AACnE,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,MAAI,yDAAyD,KAAK,OAAO,GAAG;AAC1E,WAAO,IAAI,iBAAiB,WAAW,OAAO;AAAA,EAChD;AACA,SAAO,IAAI,iBAAiB,qBAAqB,OAAO;AAC1D;AAEO,SAAS,mBAAmB,MAAuC;AACxE,SAAO,SAAS;AAClB;;;ADFA,SAAS,YAAY,QAAoD;AACvE,QAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,MAAI,OAAQ,SAAQ,gBAAgB,UAAU,MAAM;AACpD,SAAO;AACT;AAEA,eAAe,kBAAkB,KAAiC;AAChE,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,eACpB,MACA,QACA,OAAuB,CAAC,GACQ;AAChC,QAAM,OAAO,eAAe,KAAK,OAAO;AACxC,QAAM,SAAS,KAAK,UAAU,WAAW;AACzC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,MAAM,GAAG,IAAI,iBAAiB,mBAAmB,IAAI,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAEhG,MAAI;AACF,UAAM,MAAM,MAAM,QAAQ,KAAK,EAAE,QAAQ,OAAO,SAAS,YAAY,MAAM,EAAE,CAAC;AAC9E,UAAM,SAAS,MAAM,kBAAkB,GAAG;AAC1C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MACJ,OAAO,WAAW,YAAY,UAAU,WAAW,SAC/C,OAAQ,OAA8B,KAAK,IAC3C,oBAAoB,IAAI,MAAM;AACpC,YAAM,oBAAoB,IAAI,QAAQ,GAAG;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,eAAe,iBAAkB,OAAM;AAC3C,UAAM,qBAAqB,GAAG;AAAA,EAChC;AACF;AAEA,eAAsB,iBACpB,OACA,OAAuB,CAAC,GACK;AAC7B,QAAM,OAAO,eAAe,KAAK,OAAO;AACxC,QAAM,SAAS,KAAK,UAAU,WAAW;AACzC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,OAAO,MAAM;AAEnB,MAAI;AACF,QAAI,MAAM,cAAc,UAAU;AAChC,YAAMC,OAAM,GAAG,IAAI,iBAAiB,mBAAmB,IAAI,CAAC;AAC5D,YAAMC,QAAO;AAAA,QACX,OAAO,MAAM;AAAA,QACb,SAAS,MAAM,WAAW;AAAA,QAC1B,MAAM,MAAM,YAAY;AAAA,QACxB,YAAY,gBAAgB,KAAK;AAAA,QACjC,gBAAgB;AAAA,UACd,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM,WAAW;AAAA,UAC1B,eAAe,MAAM,iBAAiB;AAAA,UACtC,QAAQ,MAAM,UAAU;AAAA,UACxB,YAAY,gBAAgB,KAAK;AAAA,QACnC;AAAA,MACF;AACA,YAAMC,OAAM,MAAM,QAAQF,MAAK;AAAA,QAC7B,QAAQ;AAAA,QACR,SAAS,YAAY,MAAM;AAAA,QAC3B,MAAM,KAAK,UAAUC,KAAI;AAAA,MAC3B,CAAC;AACD,YAAME,UAAS,MAAM,kBAAkBD,IAAG;AAC1C,UAAI,CAACA,KAAI,IAAI;AACX,cAAM,MACJ,OAAOC,YAAW,YAAYA,WAAU,WAAWA,UAC/C,OAAQA,QAA8B,KAAK,IAC3C,uBAAuBD,KAAI,MAAM;AACvC,cAAM,oBAAoBA,KAAI,QAAQ,GAAG;AAAA,MAC3C;AACA,YAAME,OAAMD;AACZ,aAAO;AAAA,QACL,QAAQC,KAAI,KAAK;AAAA,QACjB,WAAWA,KAAI,QAAQ;AAAA,QACvB,eAAeA,KAAI,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACrB,QAAI,CAAC,OAAQ,OAAM,IAAI,iBAAiB,aAAa,uCAAuC;AAE5F,QAAI,MAAM,cAAc,mBAAmB;AACzC,YAAMJ,OAAM,GAAG,IAAI,iBAAiB,mBAAmB,IAAI,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAChG,YAAMC,QAAgC;AAAA,QACpC,OAAO,MAAM;AAAA,QACb,SAAS,MAAM,WAAW;AAAA,QAC1B,YAAY,gBAAgB,KAAK;AAAA,MACnC;AACA,YAAMC,OAAM,MAAM,QAAQF,MAAK;AAAA,QAC7B,QAAQ;AAAA,QACR,SAAS,YAAY,MAAM;AAAA,QAC3B,MAAM,KAAK,UAAUC,KAAI;AAAA,MAC3B,CAAC;AACD,YAAME,UAAS,MAAM,kBAAkBD,IAAG;AAC1C,UAAI,CAACA,KAAI,IAAI;AACX,cAAM,MACJ,OAAOC,YAAW,YAAYA,WAAU,WAAWA,UAC/C,OAAQA,QAA8B,KAAK,IAC3C,uBAAuBD,KAAI,MAAM;AACvC,cAAM,oBAAoBA,KAAI,QAAQ,GAAG;AAAA,MAC3C;AACA,YAAME,OAAMD;AACZ,aAAO;AAAA,QACL,QAAQC,KAAI;AAAA,QACZ,WAAWA,KAAI;AAAA,QACf,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,MAAM,GAAG,IAAI,iBAAiB,mBAAmB,IAAI,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAChG,UAAM,OAAO;AAAA,MACX,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,WAAW;AAAA,MAC1B,eAAe,MAAM,iBAAiB;AAAA,MACtC,QAAQ,MAAM,UAAU;AAAA,MACxB,YAAY,gBAAgB,KAAK;AAAA,MACjC,aAAa,MAAM,gBAAgB;AAAA,IACrC;AACA,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,SAAS,YAAY,MAAM;AAAA,MAC3B,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,UAAM,SAAS,MAAM,kBAAkB,GAAG;AAC1C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MACJ,OAAO,WAAW,YAAY,UAAU,WAAW,SAC/C,OAAQ,OAA8B,KAAK,IAC3C,uBAAuB,IAAI,MAAM;AACvC,YAAM,oBAAoB,IAAI,QAAQ,GAAG;AAAA,IAC3C;AACA,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,eAAe,IAAI,QAAQ;AAAA,IAC7B;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,iBAAkB,OAAM;AAC3C,UAAM,qBAAqB,GAAG;AAAA,EAChC;AACF;AAEA,SAAS,gBAAgB,OAAuD;AAC9E,QAAM,OAA8B,EAAE,GAAI,MAAM,cAAc,CAAC,EAAG;AAClE,MAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,MAAI,CAAC,OAAO,KAAK,IAAI,EAAE,OAAQ,QAAO,MAAM,cAAc;AAC1D,SAAO;AACT;;;AEhMA,SAAS,cAAAC,mBAAkB;AAIpB,SAAS,+BAA+B,OAAiC;AAC9E,QAAM,UAAU;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM,UAAU;AAAA,IACxB,UAAU,MAAM,YAAY;AAAA,IAC5B,OAAO,MAAM,MAAM,KAAK;AAAA,IACxB,aAAa,YAAY,MAAM,OAAO;AAAA,IACtC,UAAU,aAAa,MAAM,IAAI;AAAA,IACjC,eAAe,MAAM,eAAe,KAAK,KAAK;AAAA,IAC9C,aAAa,MAAM,eAAe;AAAA,EACpC;AACA,SAAOC,YAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,OAAO,GAAG,MAAM,EAAE,OAAO,KAAK;AAClF;;;ACjBA,SAAqB,aAAAC,kBAAiB;AACtC,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AAEV,SAAS,yBAAiC;AAC/C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAOA,OAAK,QAAQ,GAAG;AAChC,SAAOA,OAAK,KAAKD,UAAQ,GAAG,WAAW,OAAO;AAChD;AAEO,SAAS,gBAAwB;AACtC,SAAOC,OAAK,KAAK,uBAAuB,GAAG,aAAa;AAC1D;AAEO,SAAS,uBAA+B;AAC7C,SAAOA,OAAK,KAAK,uBAAuB,GAAG,qBAAqB;AAClE;AAEO,SAAS,uBAAkE;AAChF,QAAM,YAAY,cAAc;AAChC,QAAM,aAAa,qBAAqB;AACxC,EAAAF,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,EAAAA,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,SAAO,EAAE,WAAW,WAAW;AACjC;AAEO,SAAS,cAAc,UAA2B;AAIvD,MAAI,SAAS,WAAW,OAAO,KAAK,SAAS,WAAW,eAAe,EAAG,QAAO;AACjF,QAAM,WAAWE,OAAK,QAAQ,QAAQ;AACtC,SAAO,SAAS,WAAW,OAAO,KAAK,SAAS,WAAWA,OAAK,KAAK,QAAQ,SAAS,CAAC;AACzF;;;ACjCA;AAAA,EACE,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AAAA,OACK;AACP,OAAOC,YAAU;AACjB,SAAS,kBAAkB;AAM3B,IAAM,sBAAsB;AAErB,SAAS,kBAAoC;AAClD,QAAM,EAAE,UAAU,IAAI,qBAAqB;AAC3C,QAAM,QAAQC,aAAY,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AACtE,QAAM,QAA0B,CAAC;AACjC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,eAAeC,OAAK,KAAK,WAAW,IAAI,CAAC;AACtD,QAAI,QAAQ,KAAK,gBAAgB,SAAU,OAAM,KAAK,IAAI;AAAA,EAC5D;AACA,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AACpE;AAEO,SAAS,2BAA2B,KAAoC;AAC7E,aAAW,QAAQ,gBAAgB,GAAG;AACpC,QAAI,KAAK,mBAAmB,IAAK,QAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,eAAe,UAAyC;AACtE,MAAI,CAACC,aAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,WAAO,KAAK,MAAMC,eAAa,UAAU,MAAM,CAAC;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,MAA8B;AAC3D,QAAM,EAAE,UAAU,IAAI,qBAAqB;AAC3C,QAAM,WAAWF,OAAK,KAAK,WAAW,KAAK,QAAQ;AACnD,SAAOE,eAAa,UAAU,MAAM;AACtC;AAEO,SAAS,gBAAgB,OAAyB,MAItC;AACjB,QAAM,EAAE,UAAU,IAAI,qBAAqB;AAC3C,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,KAAK,KAAK,UAAU,MAAM,WAAW;AAC3C,QAAM,WAAW,KAAK,UAAU,YAAY,GAAG,EAAE;AACjD,QAAM,WAAWF,OAAK,KAAK,WAAW,GAAG,EAAE,OAAO;AAClD,QAAM,WAAWA,OAAK,KAAK,WAAW,QAAQ;AAE9C,MAAI,CAAC,KAAK,UAAU;AAClB,IAAAG,eAAc,UAAU,MAAM,MAAM,MAAM;AAAA,EAC5C;AAEA,QAAM,OAAuB;AAAA,IAC3B;AAAA,IACA,gBAAgB,+BAA+B,KAAK;AAAA,IACpD,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU;AAAA,IACjD,UAAU,MAAM,YAAY,KAAK,UAAU,YAAY;AAAA,IACvD,OAAO,MAAM;AAAA,IACb,SAAS,MAAM,WAAW;AAAA,IAC1B;AAAA,IACA,UAAU,aAAa,MAAM,IAAI;AAAA,IACjC,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,MAAM,SAAS;AAAA,IACtB,YAAY,MAAM,cAAc;AAAA,IAChC,eAAe,MAAM,iBAAiB;AAAA,IACtC,aAAa,MAAM,eAAe;AAAA,IAClC,WAAW,KAAK,UAAU,aAAa;AAAA,IACvC,WAAW;AAAA,IACX,aAAa,KAAK,UAAU,cAAc,MAAM,KAAK,WAAW,IAAI;AAAA,IACpE,YAAY,MAAM,cAAc,KAAK,UAAU,cAAc;AAAA,IAC7D,WAAW,KAAK;AAAA,IAChB,iBAAiB,KAAK;AAAA,IACtB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACpB;AAEA,EAAAA,eAAc,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC7E,SAAO;AACT;AAEO,SAAS,eAAe,MAA4B;AACzD,QAAM,EAAE,UAAU,IAAI,qBAAqB;AAC3C,QAAM,WAAWH,OAAK,KAAK,WAAW,GAAG,KAAK,EAAE,OAAO;AACvD,EAAAG,eAAc,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC/E;AAEO,SAAS,kBAAkB,MAA4B;AAC5D,QAAM,EAAE,WAAW,WAAW,IAAI,qBAAqB;AACvD,QAAM,UAAUH,OAAK,KAAK,WAAW,GAAG,KAAK,EAAE,OAAO;AACtD,QAAM,UAAUA,OAAK,KAAK,WAAW,KAAK,QAAQ;AAClD,QAAM,UAAUA,OAAK,KAAK,YAAY,GAAG,KAAK,EAAE,OAAO;AACvD,QAAM,UAAUA,OAAK,KAAK,YAAY,KAAK,QAAQ;AACnD,MAAIC,aAAW,OAAO,EAAG,YAAW,SAAS,OAAO;AACpD,MAAIA,aAAW,OAAO,EAAG,YAAW,SAAS,OAAO;AACtD;AAEO,SAAS,gBAAgB,MAA8D;AAC5F,QAAM,EAAE,UAAU,IAAI,qBAAqB;AAC3C,SAAO;AAAA,IACL,UAAUD,OAAK,KAAK,WAAW,GAAG,KAAK,EAAE,OAAO;AAAA,IAChD,UAAUA,OAAK,KAAK,WAAW,KAAK,QAAQ;AAAA,EAC9C;AACF;AAQO,SAAS,oBAAoB,MAAsB,MAAgC;AACxF,SAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd;AAAA,IACA,eAAe,KAAK,iBAAiB;AAAA,IACrC,QAAQ,KAAK,UAAU;AAAA,IACvB,OAAO,KAAK,SAAS;AAAA,IACrB,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK,eAAe;AAAA,IACjC,YAAY,KAAK;AAAA,EACnB;AACF;;;AChIA,eAAsB,mBACpB,MACA,aACA,OAAuB,CAAC,GACc;AACtC,QAAM,UAAU,MAAM,eAAe,MAAM,YAAY,QAAQ,IAAI;AACnE,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,QAAQ;AAExB,MAAI,KAAK,MAAM,KAAK,MAAM,YAAY,MAAM,KAAK,GAAG;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,MACA,6BAA6B,YAAY,KAAK,WAAW,KAAK,KAAK;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,sBAAsB,YAAY,YAAY,OAAO;AAC3D,QAAM,oBAAoB,YAAY,KAAK,OAAO;AAClD,MAAI,wBAAwB,mBAAmB;AAC7C,UAAM,IAAI,iBAAiB,uBAAuB,8BAA8B;AAAA,EAClF;AAEA,MAAI,YAAY,aAAa,KAAK,qBAAqB,YAAY,WAAW;AAC5E,UAAM,IAAI;AAAA,MACR;AAAA,MACA,uCAAuC,YAAY,SAAS,SAAS,KAAK,gBAAgB;AAAA,IAC5F;AAAA,EACF;AAEA,MAAI,YAAY,iBAAiB,MAAM;AACrC,QAAI,CAAC,WAAW,QAAQ,kBAAkB,YAAY,eAAe;AACnE,YAAM,IAAI;AAAA,QACR;AAAA,QACA,oCAAoC,YAAY,aAAa,SAAS,SAAS,iBAAiB,MAAM;AAAA,MACxG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,SAAS,QAAQ;AACrC,QAAM,iBAAiB,aAAa,WAAW;AAC/C,MAAI,YAAY,YAAY,mBAAmB,YAAY,UAAU;AACnE,UAAM,IAAI,iBAAiB,uBAAuB,gCAAgC;AAAA,EACpF;AAEA,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,kBAAkB,KAAK;AAAA,IACvB,eAAe,SAAS,iBAAiB;AAAA,IACzC,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,UAAU,YAAY,YAAY;AAAA,IAClC,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,EACjC;AACF;AAEO,SAAS,yBACd,OACA,OACqB;AACrB,SAAO;AAAA,IACL,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,SAAS,MAAM,WAAW;AAAA,IAC1B,MAAM,MAAM;AAAA,IACZ,UAAU,aAAa,MAAM,IAAI;AAAA,IACjC,WAAW,MAAM;AAAA,IACjB,eAAe,MAAM;AAAA,EACvB;AACF;;;ACrDA,IAAM,iBAAwC;AAC9C,IAAM,gBAAuC;AAC7C,IAAM,gBAAuC;AAE7C,eAAsB,YACpB,OACA,OAAwB,CAAC,GACG;AAC5B,MAAI,MAAM,gBAAgB,cAAc,MAAM,YAAY,GAAG;AAAA,EAE7D;AAEA,QAAM,iBAAiB,+BAA+B,KAAK;AAC3D,QAAM,iBAAiB,2BAA2B,cAAc;AAChE,MAAI,gBAAgB,kBAAkB;AACpC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU,eAAe;AAAA,MACzB,QAAQ,eAAe,iBAAiB;AAAA,MACxC,kBAAkB,eAAe;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,kBAAkB;AAC1B,WAAO,cAAc,OAAO,MAAM,iBAAiB,SAAS,MAAM,iBAAiB,MAAM,cAAc;AAAA,EACzG;AAEA,QAAM,UAAU,KAAK,aAAa;AAClC,QAAM,WAAW,KAAK,kBAAkB;AAExC,MAAI;AACF,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI;AACvC,UAAM,WAA6B,EAAE,GAAG,OAAO,QAAQ,MAAM,OAAO;AACpE,UAAM,cAAc,yBAAyB,UAAU,KAAK;AAC5D,UAAM,WAAW,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,gCAAgC,OAAO,WAAW;AAAA,MAClD;AAAA,IACF;AACA,QAAI,eAAgB,mBAAkB,cAAc;AACpD,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM,aAAa;AAAA,MAC9B,kBAAkB;AAAA,MAClB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,UACJ,eAAe,mBACX,MACA,IAAI,iBAAiB,qBAAqB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAEhG,QAAI,CAAC,mBAAmB,QAAQ,IAAI,GAAG;AACrC,YAAM,OAAO,gBAAgB,OAAO;AAAA,QAClC,WAAW,QAAQ;AAAA,QACnB,iBAAiB,QAAQ;AAAA,QACzB,UAAU,kBAAkB;AAAA,MAC9B,CAAC;AACD,YAAM,QAAQ,gBAAgB,IAAI;AAClC,YAAM,SAAS,iBAAiB,MAAM,QAAQ,OAAO;AACrD,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,UAAU,OAAO;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,cAAc,OAAO,QAAQ,SAAS,QAAQ,MAAM,cAAc;AAAA,EAC3E;AACF;AAEA,SAAS,gCACP,OACA,aACqB;AACrB,MAAI,MAAM,cAAc,mBAAmB;AACzC,WAAO,EAAE,GAAG,aAAa,MAAM,IAAI,UAAU,GAAG;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,cACP,OACA,SACA,MACA,UACmB;AACnB,QAAM,OAAO,gBAAgB,OAAO;AAAA,IAClC,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,UAAU,YAAY;AAAA,EACxB,CAAC;AACD,QAAM,QAAQ,gBAAgB,IAAI;AAElC,MAAI,KAAK,cAAc,KAAK,YAAY;AACtC,UAAM,SAAS,iBAAiB,MAAM,OAAO;AAC7C,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,MACX,gBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB,KAAK;AAAA,EACvB;AACF;AAEA,SAAS,iBAAiB,MAAsB,SAAiC;AAC/E,QAAM,SAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,iBAAe,MAAM;AACrB,SAAO;AACT;;;ACvJA,OAAOI,YAAU;AAEjB,eAAsB,gBACpB,OAA4C,CAAC,GAC7C,OAAwB,CAAC,GACG;AAC5B,QAAM,QAAQ,gBAAgB,EAAE;AAAA,IAAO,CAAC,SACtC,KAAK,WAAW,KAAK,OAAO,KAAK,WAAW;AAAA,EAC9C;AACA,QAAM,QAAQ,KAAK,OAAO,KAAK,MAAM,IAAI,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI;AAEpE,QAAM,SAA4B;AAAA,IAChC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,CAAC;AAAA,EACZ;AAEA,aAAW,QAAQ,OAAO;AACxB,WAAO,aAAa;AACpB,UAAM,OAAO,eAAe,IAAI;AAChC,UAAM,QAAQ,oBAAoB,MAAM,IAAI;AAC5C,UAAM,UAAU,MAAM,YAAY,OAAO,IAAI;AAE7C,QAAI,QAAQ,eAAe,2BAA2B;AACpD,aAAO,aAAa;AAAA,IACtB,WAAW,QAAQ,eAAe,2BAA2B;AAC3D,aAAO,UAAU;AAAA,IACnB,OAAO;AACL,aAAO,eAAe;AAAA,IACxB;AAEA,WAAO,QAAQ,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,UAAyC;AACtE,QAAM,WAAWA,OAAK,KAAK,cAAc,GAAG,GAAG,QAAQ,OAAO;AAC9D,SAAO,eAAe,QAAQ;AAChC;;;ACrDO,SAAS,6BAA6B,MAA8B;AACzE,QAAM,QAAQ,gBAAgB,IAAI;AAElC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,4CAA4C,KAAK,UAAU;AAAA,IAC3D,iBAAiB,KAAK,EAAE;AAAA,IACxB,KAAK,SAAS,eAAe,KAAK,MAAM,OAAO;AAAA,IAC/C,eAAe,MAAM,QAAQ;AAAA,IAC7B,aAAa,MAAM,QAAQ;AAAA,IAC3B;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,0BAA0B,MAIjC;AACP,QAAM,OACJ,KAAK,YAAY,OAAO,KAAK,aAAa,WACrC,KAAK,WACN;AACN,QAAM,WACH,OAAO,KAAK,4BAA4B,YAAY,KAAK,4BACzD,QAAQ,OAAO,KAAK,4BAA4B,WAAW,KAAK,0BAA0B;AAC7F,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL;AAAA,IACA,UACE,OAAO,KAAK,8BAA8B,WACtC,KAAK,4BACL,QAAQ,OAAO,KAAK,8BAA8B,WAChD,KAAK,4BACL;AAAA,IACR,UACE,OAAO,KAAK,4BAA4B,WACpC,KAAK,0BACL,QAAQ,OAAO,KAAK,4BAA4B,WAC9C,KAAK,0BACL;AAAA,EACV;AACF;;;AC3BA,eAAsB,sCACpB,OACsC;AACtC,QAAM,aAAa,GAAG,MAAM,OAAO,uBAAuB,mBAAmB,MAAM,SAAS,CAAC,UAAU,mBAAmB,MAAM,MAAM,CAAC;AACvI,MAAI;AACJ,MAAI;AACF,cAAU,MAAM;AAAA,MACd;AAAA,MACA,MAAM;AAAA,MACN;AAAA,QACE,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,MACtE;AAAA,MACA,EAAE,WAAW,MAAM,WAAW,SAAS,MAAM,QAAQ;AAAA,IACvD;AAAA,EACF,SAAS,QAAQ;AACf,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,iBAAiB,EAAE,IAAI,OAAO,OAAQ,OAAiB,QAAQ;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ;AACrB,QAAM,WAAW,QAAQ,OAAO,QAAQ,MAAM,OAAO;AACrD,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ,OAAO;AAAA,IACvB,iBAAiB,QAAQ,YAAY;AAAA,EACvC;AACF;;;ACnDA,SAAS,aAAAC,kBAAiB;;;ACA1B,SAAS,aAAAC,kBAAiB;AAanB,SAAS,+BAA0D;AACxE,MAAI,QAAQ,IAAI,cAAc,KAAK,KAAK,QAAQ,IAAI,UAAU,KAAK,GAAG;AACpE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAASA,WAAU,MAAM,CAAC,QAAQ,OAAO,GAAG;AAAA,IAChD,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,SACJ,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK,IACpD,OAAO,OAAO,KAAK,IACnB;AACN,WAAO,EAAE,QAAQ,WAAW,YAAY,OAAO,OAAO;AAAA,EACxD;AAEA,QAAM,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,OAAO,KAAK,IAAI;AACzE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,UAAQ,IAAI,WAAW;AACvB,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACF;;;AD3BA,IAAM,+BAA+B,oBAAI,IAAI,CAAC,WAAW,WAAW,SAAS,CAAC;AAC9E,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,WAAW,CAAC;AAgBzD,SAAS,SAAS,MAA2C;AAC3D,SAAO,MAAM,KAAK,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC;AACnD;AAGO,SAAS,cAAc,OAA8B;AAC1D,QAAM,IAAI,4CAA4C,KAAK,MAAM,KAAK,CAAC;AACvE,SAAO,IAAI,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK;AACjC;AAEA,SAAS,OAAO,MAAqB,KAAa,MAA0B;AAC1E,QAAM,MAAM,KAAK,GAAG,KAAK,IAAI;AAC7B,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,MAAM,IAAI,UAAU,IAAI,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;AAAA,EAC3E;AACA,SAAO,KAAK,MAAM,IAAI,UAAU,IAAI;AACtC;AAEA,SAAS,UAAUC,QAAwC;AACzD,SACG,OAAOA,OAAM,SAAS,YAAYA,OAAM,QACxC,OAAOA,OAAM,YAAY,YAAYA,OAAM,WAC3C,OAAOA,OAAM,iBAAiB,YAAYA,OAAM,gBACjD;AAEJ;AAEA,SAAS,eAAe,mBAA0C;AAChE,QAAM,SAAS,MAAM,QAAQ,iBAAiB,IAAI,oBAAoB,CAAC;AACvE,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAO,QAAQ;AACxB,UAAMA,SAAS,OAAO,OAAO,QAAQ,WAAW,MAAM,CAAC;AACvD,UAAM,aACJ,OAAOA,OAAM,eAAe,WAAWA,OAAM,WAAW,YAAY,IAAI;AAC1E,UAAM,SAAS,OAAOA,OAAM,WAAW,WAAWA,OAAM,OAAO,YAAY,IAAI;AAC/E,UAAM,QAAQ,OAAOA,OAAM,UAAU,WAAWA,OAAM,MAAM,YAAY,IAAI;AAC5E,QAAI,cAAc,6BAA6B,IAAI,UAAU,EAAG;AAChE,QAAI,YAAY;AACd,aAAO,KAAK,GAAG,UAAUA,MAAK,CAAC,IAAI,UAAU,EAAE;AAC/C;AAAA,IACF;AACA,QAAI,SAAS,6BAA6B,IAAI,KAAK,EAAG;AAItD,QAAI,SAAS,UAAU,aAAa,UAAU,YAAY;AACxD,aAAO,KAAK,GAAG,UAAUA,MAAK,CAAC,IAAI,KAAK,EAAE;AAC1C;AAAA,IACF;AACA,QAAI,UAAU,aAAa,UAAU,YAAY;AAC/C,cAAQ,KAAK,GAAG,UAAUA,MAAK,CAAC,IAAI,KAAK,EAAE;AAC3C;AAAA,IACF;AACA,QAAI,UAAU,WAAW,aAAa;AACpC,cAAQ,KAAK,GAAG,UAAUA,MAAK,CAAC,IAAI,MAAM,EAAE;AAC5C;AAAA,IACF;AACA,YAAQ,KAAK,GAAG,UAAUA,MAAK,CAAC,UAAU;AAAA,EAC5C;AACA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEA,SAAS,mBAAmB,mBAAmD;AAC7E,QAAM,SAAS,MAAM,QAAQ,iBAAiB,IAAI,oBAAoB,CAAC;AACvE,SAAO,OAAO,KAAK,CAAC,QAAQ;AAC1B,UAAMA,SAAS,OAAO,OAAO,QAAQ,WAAW,MAAM,CAAC;AACvD,UAAM,OACH,OAAOA,OAAM,SAAS,YAAYA,OAAM,QACxC,OAAOA,OAAM,YAAY,YAAYA,OAAM,WAC5C;AACF,UAAM,aACJ,OAAOA,OAAM,eAAe,WAAWA,OAAM,WAAW,YAAY,IAAI;AAC1E,UAAM,QAAQ,OAAOA,OAAM,UAAU,WAAWA,OAAM,MAAM,YAAY,IAAI;AAC5E,WAAO,WAAW,KAAK,IAAI,MAAM,eAAe,aAAa,UAAU;AAAA,EACzE,CAAC;AACH;AAaA,IAAM,wBACJ;AACF,IAAM,wBACJ;AACF,IAAM,gBAAgB;AACtB,IAAM,eACJ;AAGK,SAAS,sCAAsC,OAI1C;AAIV,QAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,MAAM,KAAK,IAAI;AACrE,QAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI;AAClE,QAAM,cAAc,cAAc,KAAK,KAAK,KAAK,aAAa,KAAK,IAAI;AACvE,QAAM,oBAAoB,sBAAsB,KAAK,IAAI;AACzD,QAAM,oBAAoB,sBAAsB,KAAK,IAAI;AACzD,SAAO,eAAe,qBAAqB,qBAAqB,MAAM,uBAAuB;AAC/F;AAEA,SAAS,2BAA2B,IAAoB;AACtD,QAAM,aAAa,sCAAsC;AAAA,IACvD,OAAO,GAAG;AAAA,IACV,MAAM,GAAG;AAAA,IACT,oBAAoB,mBAAmB,GAAG,iBAAiB;AAAA,EAC7D,CAAC;AACD,MAAI,WAAY;AAChB,QAAM,IAAI;AAAA,IACR,OAAO,GAAG,MAAM;AAAA,EAClB;AACF;AAEA,SAAS,mBAAmB,IAAoB;AAC9C,MAAI,GAAG,UAAU,OAAQ,OAAM,IAAI,MAAM,OAAO,GAAG,MAAM,OAAO,GAAG,KAAK,YAAY;AACpF,MAAI,GAAG,QAAS,OAAM,IAAI,MAAM,OAAO,GAAG,MAAM,mBAAmB;AACnE,MAAI,CAAC,mBAAmB,IAAI,GAAG,gBAAgB,GAAG;AAChD,UAAM,IAAI,MAAM,OAAO,GAAG,MAAM,wBAAwB,GAAG,gBAAgB,EAAE;AAAA,EAC/E;AACA,QAAM,SAAS,eAAe,GAAG,iBAAiB;AAClD,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,IAAI,MAAM,OAAO,GAAG,MAAM,wBAAwB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EACpF;AACA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,UAAM,IAAI,MAAM,OAAO,GAAG,MAAM,wBAAwB,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,EACrF;AACA,6BAA2B,EAAE;AAC/B;AAEA,SAAS,sBAAsB,IAA6B;AAC1D,MAAI;AACF,uBAAmB,EAAE;AACrB,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,WAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,EACxD;AACF;AAEA,SAAS,mBACP,MACA,KACA,MACA,QACM;AACN,MAAI,CAAC,QAAQ,KAAK,EAAG;AACrB,QAAM,UAAU,UAAU,SAAS,MAAM,EAAE;AAC3C,OAAK,GAAG,KAAK,CAAC,OAAO,MAAM,UAAU,SAAS,IAAI,aAAa,OAAO,EAAE,CAAC;AAC3E;AAEA,SAAS,YAAY,MAAqB,KAAa,MAAyC;AAC9F,MAAI,MAAM,KAAK,EAAG,QAAO,KAAK,KAAK;AACnC,QAAM,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,QAAQ,UAAU,eAAe,CAAC;AACpE,MAAI,IAAI,WAAW,EAAG,OAAM,IAAI,MAAM,IAAI,UAAU,+BAA+B;AACnF,QAAM,SAAS,KAAK,MAAM,IAAI,UAAU,IAAI;AAC5C,MAAI,CAAC,OAAO,cAAe,OAAM,IAAI,MAAM,+BAA+B;AAC1E,SAAO,OAAO;AAChB;AAEA,SAAS,sBAAsB,KAAa,QAAkC;AAC5E,MAAI,CAAC,QAAQ,KAAK,EAAG;AACrB,QAAM,OAAOC,WAAU,OAAO,CAAC,YAAY,QAAQ,aAAa,GAAG;AAAA,IACjE;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,QAAQ,OAAO,KAAK,UAAU,EAAE,EAAE,MAAM,OAAO;AACrD,MAAI,cAA6B;AACjC,MAAI,gBAA+B;AACnC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,WAAW,GAAG;AAChC,oBAAc,KAAK,MAAM,YAAY,MAAM,EAAE,KAAK;AAClD,sBAAgB;AAChB;AAAA,IACF;AACA,QAAI,KAAK,WAAW,SAAS,KAAK,aAAa;AAC7C,sBAAgB,KAAK,MAAM,UAAU,MAAM,EAAE,KAAK;AAClD,UAAI,cAAc,SAAS,IAAI,MAAM,EAAE,GAAG;AACxC,QAAAA,WAAU,OAAO,CAAC,YAAY,UAAU,WAAW,WAAW,GAAG;AAAA,UAC/D;AAAA,UACA,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,mBACpB,OACiC;AACjC,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,WAAW,MAAM,MAAM,KAAK;AAClC,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,mBAAmB;AAElD,QAAM,OAAO,6BAA6B;AAC1C,MAAI,CAAC,KAAK,YAAY;AACpB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,MAAM,KAAK;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,SAAS,MAAM,IAAI;AAAA,IACtB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ,CAAC;AAED,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU;AAChD,WAAO;AAAA,MACL,OAAO,OAAO,OAAO;AAAA,MACrB,SAAS;AAAA,MACT,aAAa,OAAO,aAAa,OAAO;AAAA,MACxC,QAAQ,OAAO,OAAO,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,iBAAiB,sBAAsB,MAAM;AACnD,MAAI,gBAAgB;AAClB,QAAI,MAAM,cAAc;AACtB,aAAO;AAAA,QACL,OAAO,OAAO,OAAO;AAAA,QACrB,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO,OAAO,OAAO;AAAA,MACrB,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ;AAChB,WAAO;AAAA,MACL,OAAO,OAAO,OAAO;AAAA,MACrB,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,OAAO,MAAM;AACnC,QAAM,WAAW,KAAK,GAAG,KAAK;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,SAAS,MAAM,IAAI;AAAA,IACtB;AAAA,EACF,CAAC;AACD,MAAI,SAAS,WAAW,GAAG;AAIzB,UAAM,QAAQ,gBAAgB,MAAM,KAAK,QAAQ,MAAM,IAAI;AAC3D,QAAI,OAAO;AACT,aAAO;AAAA,QACL,OAAO,MAAM,OAAO,OAAO,OAAO;AAAA,QAClC,SAAS;AAAA,QACT,aAAa,MAAM,aAAa,OAAO;AAAA,QACvC,QAAQ,OAAO,OAAO,MAAM;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO,OAAO,OAAO;AAAA,MACrB,SAAS;AAAA,MACT,QAAQ,SAAS,UAAU,SAAS,UAAU;AAAA,IAChD;AAAA,EACF;AAKA,MAAI,QAAyB,gBAAgB,MAAM,KAAK,QAAQ,MAAM,IAAI;AAC1E,MAAI,CAAC,OAAO;AAEV,YAAQ,gBAAgB,MAAM,KAAK,QAAQ,MAAM,IAAI;AAAA,EACvD;AAEA,MAAI;AACF,UAAM,OAAO,YAAY,MAAM,KAAK,MAAM,IAAI;AAC9C,uBAAmB,MAAM,KAAK,MAAM,OAAO,WAAW;AACtD,0BAAsB,KAAK,OAAO,WAAW;AAAA,EAC/C,QAAQ;AAAA,EAER;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,aAAa,OAAO,aAAa,OAAO;AAAA,IACxC,QAAQ,6BAA6B,OAAO,MAAM,GAAG,QAAQ,KAAK,mEAA8D;AAAA,EAClI;AACF;AAGA,SAAS,gBACP,MACA,KACA,QACA,MACiB;AACjB,MAAI;AACF,UAAM,OAAO,OAAO,MAAM,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,SAAS,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,KAAK,UAAU,YAAY,KAAK,WAAW,OAAO;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AElYA;AAIA,eAAsB,4BAA4B,OAOL;AAC3C,QAAM,SAAS,MAAM,8BAA8B,MAAM,QAAQ,MAAM,WAAW;AAAA,IAChF,SAAS,MAAM;AAAA,EACjB,CAAC;AACD,QAAM,SAAS,OAAO,MAAM,KAAK,EAAE;AACnC,QAAM,MAAM,GAAG,MAAM,OAAO,uBAAuB,mBAAmB,MAAM,SAAS,CAAC;AACtF,QAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC1C,QAAM,OAAO;AAAA,IACX,QAAQ;AAAA,IACR,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,YAAY,WAAW,MAAM;AAAA,IAC7B;AAAA,IACA,YAAY,MAAM,KAAK,cAAc;AAAA,IACrC,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,aAAa,MAAM;AAAA,MACnB,OAAO,MAAM,OAAO;AAAA,MACpB,SAAS,MAAM,OAAO;AAAA,MACtB,YAAY,MAAM,KAAK,cAAc;AAAA,IACvC;AAAA,IACA,iBAAiB;AAAA,EACnB;AAEA,QAAM,SAAS,MAAM,8BAA8B,KAAK,QAAQ,MAAM;AAAA,IACpE,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,EACjB,CAAC;AACD,SAAO,EAAE,IAAI,OAAO,IAAI,QAAQ,OAAO,OAAO;AAChD;;;ACxCO,SAAS,qCAA6C;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AjEoBO,IAAM,4BAA4B,KAAK,KAAK;AA6BnD,SAAS,wBACP,QACyC;AACzC,QAAM,MAAM,OAAO;AACnB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAgE;AAC7F,QAAM,MAAM,OAAO;AACnB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,SAAO;AACT;AAiBO,SAAS,yBACd,UACqC;AACrC,QAAM,MAAM,SAAS;AACrB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,QAAM,WACJ,OAAO,IAAI,8BAA8B,WAAW,IAAI,4BAA4B;AACtF,QAAM,cACJ,OAAO,IAAI,iCAAiC,WACxC,IAAI,+BACJ;AACN,QAAM,WACJ,IAAI,6BAA6B,OAAO,IAAI,8BAA8B,WACrE,IAAI,4BACL;AACN,QAAM,kBACJ,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB;AAClE,QAAM,cACJ,OAAO,IAAI,oBAAoB,YAC/B,IAAI,mBACJ,OAAQ,IAAI,gBAAmD,wBAAwB,WAClF,IAAI,gBAAmD,sBACxD;AACN,QAAM,kBACJ,IAAI,mBAAmB,OAAO,IAAI,oBAAoB,WACjD,IAAI,kBACL;AACN,QAAM,wBAAwB,IAAI,0BAA0B;AAC5D,QAAM,0BACJ,OAAO,IAAI,4BAA4B,WAAW,IAAI,0BAA0B;AAClF,QAAM,0BACJ,IAAI,2BAA2B,OAAO,IAAI,4BAA4B,WACjE,IAAI,0BACL;AACN,QAAM,uBAAuB,IAAI,yBAAyB;AAC1D,QAAM,uBACJ,IAAI,wBAAwB,OAAO,IAAI,yBAAyB,WAC3D,IAAI,uBACL;AACN,QAAM,8BACJ,OAAO,IAAI,gCAAgC,WACvC,IAAI,8BACJ,OAAO,sBAAsB,mBAAmB,WAC9C,qBAAqB,iBACrB;AACR,SAAO;AAAA,IACL,2BAA2B;AAAA,IAC3B,8BAA8B;AAAA,IAC9B,2BAA2B;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASC,sBAAqB,OAA+B;AAC3D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK,EAAE,YAAY;AACzC,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEO,SAAS,sBAAsB,MAA+B,WAA2B;AAC9F,QAAM,QAAQ;AAAA,IACZ,iBAAiB,KAAK,EAAE,KAAK,KAAK,KAAK;AAAA,IACvC;AAAA,IACA,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAAA,IAC9C;AAAA,IACA,4BAA4B,SAAS,YAAY,KAAK,EAAE,aAAa,KAAK,OAAO,cAAc,KAAK,QAAQ,GAC1G,KAAK,cAAc,iBAAiB,KAAK,WAAW,KAAK,EAC3D;AAAA,IACA;AAAA,EACF;AAEA,MAAI,KAAK,aAAa,eAAe;AACnC,UAAM,KAAK,IAAI,mCAAmC,CAAC;AAAA,EACrD;AAEA,QAAM,YAAY,0BAA0B,IAAI;AAChD,MAAI,WAAW,UAAU;AACvB,UAAM,OAAO,eAAe,UAAU,QAAQ;AAC9C,QAAI,MAAM;AACR,YAAM,KAAK,IAAI,6BAA6B,IAAI,CAAC;AAAA,IACnD,OAAO;AACL,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,4CAA4C,UAAU,QAAQ;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,uBAAuB,MAAqD;AACnF,QAAM,MAAM,oBAAI,IAAY;AAC5B,MAAI,KAAK,cAAc;AACrB,QAAI,IAAI,OAAO,KAAK,YAAY,CAAC;AACjC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,eAAe;AACtB,eAAW,SAAS,OAAO,KAAK,aAAa,EAAE,MAAM,GAAG,GAAG;AACzD,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,QAAS,KAAI,IAAI,OAAO;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,YAAY,MAAiF;AACjH,QAAM,WAAW,KAAK,aAAa,QAAQ,KAAK,aAAa;AAC7D,MAAI;AA4KF,QAASC,oBAAT,SAA0B,UAA4C;AACpE,UAAI,SAAS,mBAAmB,KAAM,QAAO;AAC7C,YAAM,OAAO,SAAS;AACtB,aAAO,MAAM,aAAa;AAAA,IAC5B;AAJS,2BAAAA;AA3KT,UAAM,MAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;AACrE,UAAM,YAAY,OAAO,SAAS,OAAO,KAAK,aAAa,EAAE,GAAG,eAAe,CAAC;AAChF,UAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,UAAM,SAAS,MAAM,8BAA8B,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,WAAW,EAAE,SAAS,KAAK,CAAC;AAC9H,UAAM,UAAU,KAAK,YAAY,QAAQ,KAAK,YAAY;AAC1D,UAAM,SAAS,CAAC;AAChB,UAAM,iBAAiB,6BAA6B,EAAE,OAAO,IAAI,GAAG,CAAC;AACrE,UAAM,aAAa,wBAAwB,IAAI,IAAI,eAAe,QAAQ;AAE1E,UAAM,iBAAiB,KAAK,WACxB,sBAAsB,EAAE,UAAU,OAAO,KAAK,QAAQ,EAAE,CAAC,IACzD,sBAAsB,EAAE,UAAU,IAAI,KAAK,CAAC;AAChD,UAAM,qBAAqB,0BAA0B,EAAE,OAAO,IAAI,GAAG,CAAC;AACtE,UAAM,iBAAiB,uBAAuB,IAAI;AAClD,UAAM,kBAAkB,eAAe,OAAO;AAC9C,UAAM,kBAAkB,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,SAAS,CAAC,IAAI;AAC1F,UAAM,2BAA2B,kBAAkB,KAAK,IAAI,iBAAiB,eAAe,IAAI,IAAI;AACpG,UAAM,eAAe,SACjB,2BACA,KAAK,IAAI,0BAA0B,mBAAmB,cAAc;AAExE,QAAI,CAAC,UAAU,gBAAgB,GAAG;AAChC,YAAMC,WAAU;AAAA,QACd,OAAO,IAAI;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ,mBAAmB,UAAU;AAAA,QACrC,cAAc;AAAA,MAChB;AACA,UAAI,SAAU,QAAO,EAAE,IAAI,MAAM,GAAGA,SAAQ;AAC5C,cAAQ,IAAI,KAAK,UAAUA,UAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,IACF;AAEA,UAAM,uBAAuB,+BAA+B,IAAI,EAAE;AAMlE,QAAI,KAAK,2BAA2B,QAAQ,KAAK,2BAA2B,QAAQ;AAClF,YAAM,iBAAiB,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAClF,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,EAAE,WAAW,QAAQ,OAAO,uBAAuB,KAAK;AAAA,UACxD,EAAE,WAAW,SAAS,KAAK;AAAA,QAC7B;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,iEAAkE,IAAc,OAAO,EAAE;AAAA,MACzG;AAAA,IACF;AAEA,UAAM,cAAc,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAC/E,UAAM,YAAY,CAAC,eAAgD;AAAA,MACjE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBACE,OAAO,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC,IAAI;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,sBAAsB,cAAc,IAAI,EAAE;AAAA,MAC1C,GAAI,KAAK,OAAO,EAAE,MAAM,8BAA8B,OAAO,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,MAC9E,GAAI,KAAK,WAAW,EAAE,UAAU,OAAO,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,MAC3D,GAAI,KAAK,WAAW,EAAE,UAAU,OAAO,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,MAC3D,GAAI,KAAK,eAAe,EAAE,cAAc,OAAO,KAAK,YAAY,EAAE,IAAI,CAAC;AAAA,MACvE,GAAI,CAAC,KAAK,gBAAgB,KAAK,gBAC3B;AAAA,QACE,eAAe,OAAO,KAAK,aAAa,EACrC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAAA,MACnB,IACA,CAAC;AAAA,IACP;AAEA,UAAM,kBAAkB,OAAO,cAAsB;AACnD,YAAM,WACH,MAAM,8BAA8B,aAAa,QAAQ,UAAU,SAAS,GAAG;AAAA,QAC9E;AAAA,QACA,SAAS;AAAA,MACX,CAAC,KAAM,EAAE,IAAI,OAAO,QAAQ,GAAG,UAAU,KAAK;AAChD,YAAM,eAAe,SAAS;AAC9B,aAAO,EAAE,UAAU,QAAQ,cAAc,OAAO;AAAA,IAClD;AAEA,UAAM,QAAQ,MAAM,gBAAgB,mBAAmB,SAAS,eAAe,CAAC;AAChF,QAAI,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,QAAQ;AACvC,YAAM,UAAU;AAAA,QACd,OAAO,IAAI;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,YAAY,MAAM,SAAS;AAAA,QAC3B,UAAU,MAAM,SAAS;AAAA,QACzB,eAAe,MAAM,SAAS,kBAAkB;AAAA,QAChD,oBAAoB,MAAM,SAAS;AAAA,MACrC;AACA,UAAI,SAAU,QAAO,EAAE,IAAI,OAAO,GAAG,QAAQ;AAC7C,cAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM;AACrB,QAAI,QAAQ;AACV,YAAMC,uBAAsB,wBAAwB,MAAM;AAC1D,YAAMC,qBAAoB,sBAAsB,MAAM;AACtD,YAAMF,WAAU;AAAA,QACd,OAAO,IAAI;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,YAAa,OAAO,QAAqE,IAAI,CAAC,OAAO;AAAA,UACnG,QAAQ,EAAE,KAAK;AAAA,UACf,OAAO,EAAE,KAAK;AAAA,UACd,QAAQ,EAAE;AAAA,QACZ,EAAE;AAAA,QACF,SAAU,OAAO,QAAyF;AAAA,UACxG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,YAAY,EAAE,YAAY,QAAQ,EAAE,OAAO;AAAA,QAC1E;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,QACrB,WAAW,OAAO;AAAA,QAClB,cAAc,OAAO,gBAAgB;AAAA,QACrC,qBAAqB,OAAO,uBAAuB;AAAA,QACnD,cAAcC,sBAAqB,iBAAiB;AAAA,QACpD,qBAAAA;AAAA,QACA,mBAAAC;AAAA,MACF;AACA,UAAI,SAAU,QAAO,EAAE,IAAI,MAAM,GAAGF,SAAQ;AAC5C,cAAQ,IAAI,KAAK,UAAUA,UAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,IACF;AAEA,UAAM,cAAc,uBAAuB;AAC3C,UAAM,WAA2C,CAAC;AAClD,UAAM,UAID,CAAC;AACN,QAAI,YAAY,OAAO,OAAO,SAAS,KAAK;AAE5C,mBAAe,kBACb,MACA,OACA,OACkB;AAClB,YAAM,UAAU,MAAM,sCAAsC;AAAA,QAC1D,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,OAAO,KAAK,EAAE;AAAA,QACtB;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AACD,eAAS,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,iBAAiB,QAAQ;AAAA,QACzB,GAAG;AAAA,MACL,CAAC;AACD,aAAO;AAAA,IACT;AAQA,mBAAe,iBAAiB,UAAqD;AACnF,YAAM,OAAO,SAAS;AACtB,YAAM,SAAS,OAAO,KAAK,EAAE;AAI7B,UAAI,mBAAmB,CAAC,eAAe,IAAI,MAAM,GAAG;AAClD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,YACE,wBAAwB,CAAC,GAAG,cAAc;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAI,CAAC,OAAO;AACV,eAAO,kBAAkB,MAAM,4BAA4B;AAAA,MAC7D;AACA,UAAI;AACF,cAAM,SAAS,MAAM,mBAAmB;AAAA,UACtC;AAAA,UACA,MAAM,cAAc,KAAK;AAAA,UACzB,KAAK,IAAI;AAAA,QACX,CAAC;AACD,cAAM,OAAO,MAAM,4BAA4B;AAAA,UAC7C,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO,IAAI;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,CAAC,KAAK,IAAI;AAGZ,iBAAO;AAAA,YACL;AAAA,YACA,wCAAwC,KAAK,MAAM;AAAA,YACnD,EAAE,QAAQ,MAAM,SAAS,OAAO,QAAQ;AAAA,UAC1C;AAAA,QACF;AACA,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,OAAO;AAAA,UAChB,kBAAkB,KAAK;AAAA,QACzB,CAAC;AACD,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,kBAAkB,MAAO,MAAgB,OAAO;AAAA,MACzD;AAAA,IACF;AAEA,mBAAe,2BAA2B,MAAiD;AACzF,YAAM,QAAQ;AACd,YAAM,UAAU,MAAM,sCAAsC;AAAA,QAC1D,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,OAAO,KAAK,EAAE;AAAA,QACtB;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AACD,eAAS,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT;AAAA,QACA,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,UAAU,QAAQ;AAAA,QAClB,iBAAiB,QAAQ;AAAA,MAC3B,CAAC;AACD,aAAO;AAAA,IACT;AAEA,mBAAe,aAAa,UAAqD;AAC/E,YAAM,OAAO,SAAS;AACtB,YAAM,iBAAiB,yBAAyB,QAAQ;AACxD,YAAM,SAAS,OAAO,KAAK,EAAE;AAC7B,UAAI,mBAAmB,CAAC,eAAe,IAAI,MAAM,GAAG;AAClD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,YACE,wBAAwB,CAAC,GAAG,cAAc;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AACA,YAAM,kBAAkBF,sBAAqB,KAAK,WAAW;AAC7D,UAAI,oBAAoB,CAAC,gBAAgB,yBAAyB,CAAC,eAAe,kBAAkB;AAClG,eAAO;AAAA,UACL;AAAA,UACA,oFAAoF,eAAe;AAAA,QACrG;AAAA,MACF;AACA,UAAI,qBAAqB,IAAI,IAAI,MAAM,GAAG;AACxC,eAAO,2BAA2B,IAAI;AAAA,MACxC;AACA,YAAM,UAAU,OAAO,KAAK,OAAO,KAAK;AACxC,UAAI,UAAU,YAAY,iBAAiB;AACzC,eAAO;AAAA,UACL;AAAA,UACA,gBAAgB,OAAO,sCAAsC,YAAY,eAAe;AAAA,QAC1F;AAAA,MACF;AACA,YAAM,OAAO,SAAS,KAAK,KAAK,EAAE,KAAK,KAAK,OAAO,EAAE;AACrD,YAAM,UAAU,oBAAoB;AAAA,QAClC,eAAe,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,QACjD,kBAAkB,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AAAA,QAC1D,oCAAoC,QAAQ,KAAK,QAAQ;AAAA,QACzD,MAAM,0BAA0B,IAAI;AAAA,MACtC,CAAC;AACD,UAAI;AACF,cAAM,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AACnD,cAAM,eAAe,mCAAmC;AAAA,UACtD,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,UACzC,aAAa,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAAA,UAC3D,aAAa,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAAA,UAC3D,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,UACzC,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,QAC9C,CAAC;AACD,cAAM,SAAS,mBAAmB,KAAK;AAAA,UACrC;AAAA,UACA,MAAM,sBAAsB,MAAM,SAAS;AAAA,UAC3C,YAAY,KAAK,QAAQ,OAAO,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,UAC/F,OAAO,QAAQ;AAAA,UACf,UAAU,QAAQ;AAAA,UAClB,aAAa,QAAQ;AAAA,UACrB,gBAAgB,QAAQ;AAAA,UACxB;AAAA,UACA,QAAQ,OAAO,KAAK,EAAE;AAAA,UACtB;AAAA,UACA,QAAQ,cAAc,kBAAkB;AAAA,UACxC,aAAa,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAAA,UAC3D,cAAc,KAAK,eAAe,OAAO,KAAK,YAAY,IAAI;AAAA,UAC9D,WAAW,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,UAC7C,WAAW,cAAc,gBAAgB,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,UAC3E,mBAAmB,cAAc;AAAA,UACjC,oBAAoB,cAAc,kBAAkB;AAAA,UACpD,2BAA2B,gBAAgB,6BAA6B;AAAA,UACxE,8BAA8B,gBAAgB,gCAAgC;AAAA,UAC9E,2BAA2B,gBAAgB,6BAA6B;AAAA,UACxE,sBAAsB,gBAAgB,wBAAwB;AAAA,UAC9D,6BAA6B,gBAAgB,+BAA+B;AAAA,UAC5E,iBAAiB,gBAAgB,mBAAmB;AAAA,UACpD,aAAa,gBAAgB,eAAe;AAAA,UAC5C,iBAAiB,gBAAgB,mBAAmB;AAAA,UACpD,yBAAyB,gBAAgB,2BAA2B;AAAA,UACpE,yBAAyB,gBAAgB,2BAA2B;AAAA,UACpE;AAAA,UACA,YAAY,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI;AAAA,UACxD,YAAY;AAAA,QACd,CAAC;AACD,iBAAS,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,UACT,QAAQ,OAAO;AAAA,UACf,KAAK,OAAO;AAAA,UACZ,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,UACd,UAAU,QAAQ;AAAA,UAClB,aAAa,QAAQ;AAAA,UACrB,8BAA8B,gBAAgB,gCAAgC;AAAA,UAC9E,4BAA4B,MAAM,QAAQ,gBAAgB,2BAA2B,SAAS,IACzF,eAAe,0BAA0B,UAAuB,SACjE;AAAA,UACJ,aAAa,gBAAgB,eAAe;AAAA,UAC5C,2BAA2B,gBAAgB,iBAAiB,sBAAsB;AAAA,QACpF,CAAC;AACD,YAAI,gBAAgB,8BAA8B;AAChD,kBAAQ;AAAA,YACN,mBAAmB,MAAM,oDAAoD,eAAe,4BAA4B;AAAA,UAC1H;AAAA,QACF;AACA,YAAI,gBAAgB,aAAa;AAC/B,kBAAQ;AAAA,YACN,mBAAmB,MAAM,mCAAmC,eAAe,WAAW;AAAA,UACxF;AAAA,QACF;AACA,YAAI,gBAAgB,sBAAsB;AACxC,kBAAQ;AAAA,YACN,mBAAmB,MAAM,sCAAsC,eAAe,yBAAyB,gBAAgB,MAAM;AAAA,UAC/H;AAAA,QACF;AACA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,kBAAkB,MAAO,MAAgB,OAAO;AAAA,MACzD;AAAA,IACF;AAUA,UAAM,qBAAqB,oBAAI,IAAY;AAC3C,mBAAe,qBAAqB,UAAqD;AACvF,YAAM,OAAO,SAAS;AACtB,YAAM,SAAS,OAAO,KAAK,EAAE;AAI7B,UAAI,mBAAmB,IAAI,MAAM,GAAG;AAClC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,WAAWC,kBAAiB,QAAQ,IACtC,MAAM,iBAAiB,QAAQ,IAC/B,MAAM,aAAa,QAAQ;AAC/B,UAAI,CAAC,SAAU,oBAAmB,IAAI,MAAM;AAC5C,aAAO;AAAA,IACT;AAEA,eAAW,YAAY,OAAO,SAA2C;AACvE,YAAM,qBAAqB,QAAQ;AAAA,IACrC;AACA,YAAQ;AAAA,MACN,GAAK,OAAO,WAIL,CAAC;AAAA,IACV;AAEA,QAAI,iBAAiB;AACnB,iBAAW,gBAAgB,SAAS;AAClC,cAAM,SAAS,OAAO,aAAa,KAAK,EAAE;AAC1C,YAAI,CAAC,eAAe,IAAI,MAAM,EAAG;AACjC,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,4BAA4B,aAAa,UAAU;AAAA,UAC1D,YAAY,aAAa;AAAA,UACzB,QAAQ,aAAa,UAAU;AAAA,UAC/B,wBAAwB,CAAC,GAAG,cAAc;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF;AASA,WAAO,CAAC,mBAAmB,SAAS,SAAS,cAAc;AACzD,YAAM,OAAO,MAAM,gBAAgB,CAAC;AACpC,UAAI,CAAC,KAAK,SAAS,MAAM,CAAC,KAAK,QAAQ;AACrC,iBAAS,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,OAAO;AAAA,UACP,YAAY,KAAK,SAAS;AAAA,UAC1B,UAAU,KAAK,SAAS;AAAA,QAC1B,CAAC;AACD;AAAA,MACF;AACA,mBAAa,OAAO,KAAK,OAAO,SAAS,KAAK;AAC9C,cAAQ,KAAK,GAAK,KAAK,OAAO,WAA4E,CAAC,CAAE;AAC7G,YAAM,UAAW,KAAK,OAAO,WAA8C,CAAC;AAC5E,UAAI,QAAQ,WAAW,EAAG;AAC1B,iBAAW,YAAY,SAAS;AAC9B,YAAI,SAAS,UAAU,aAAc;AACrC,cAAM,qBAAqB,QAAQ;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,UAAM,sBAAsB,wBAAwB,MAAM;AAC1D,UAAM,oBAAoB,sBAAsB,MAAM;AACtD,UAAM,eACJ,iBAAiB,MAChB,qBAAqB,iBAAiB,QACrC,OAAQ,OAAO,cAA8C,cAAc,IAAI;AAEnF,QAAI,gBAAgB,qBAAqB,SAAS;AAChD,YAAM,eACJ,oBAAoB,kBAAkB,0BAA0B;AAClE,YAAM,WACH,OAAO,2BACR,oBAAoB;AACtB,YAAM,eACJ,UAAU,cAAc,OACpB,kCAAkC,SAAS,UAAU,CAAC,YAAY,SAAS,WAAW,CAAC,KACvF,eAAe,IACb,0CACA;AACR,YAAM,YAAY,oBACd,iCAAiC,kBAAkB,WAAW,CAAC,aAAa,kBAAkB,YAAY,CAAC,KAC3G;AACJ,cAAQ;AAAA,QACN,cAAc,oBAAoB,OAAO,GAAG,eAAe,IAAI,4BAA4B,YAAY,KAAK,EAAE,GAAG,YAAY,GAAG,SAAS;AAAA,MAC3I;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd,OAAO,IAAI;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,QAC3B,QAAQ,EAAE,KAAK;AAAA,QACf,YAAY,EAAE;AAAA,MAChB,EAAE;AAAA,MACF;AAAA,MACA,cAAc,OAAO,gBAAgB;AAAA,MACrC,qBAAqB,OAAO,uBAAuB;AAAA,MACnD,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,IACvB;AACA,UAAM,eAAe,CAAC,YAAqC,CAAC,QAAQ,WAAW,QAAQ,aAAa;AACpG,QAAI,UAAU;AACZ,aAAO,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY,GAAG,GAAG,QAAQ;AAAA,IACxD;AACA,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,QAAI,SAAS,KAAK,YAAY,EAAG,SAAQ,KAAK,CAAC;AAAA,EACjD,SAAS,OAAO;AACd,QAAI,SAAU,QAAO,EAAE,IAAI,OAAO,OAAQ,MAAgB,QAAQ;AAClE,YAAQ,MAAM,wBAAyB,MAAgB,OAAO,EAAE;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AkE7rBA;AACA;AAcA;AAMA;AAQA;AAcA;;;AC/DA;AACA;AAHA,OAAOI,SAAQ;AAgCR,SAAS,iCACd,MACA,QASI,CAAC,GACuB;AAC5B,QAAM,WAAW,MAAM,WAAW,yBAAyB,eAAe,CAAC,GAAG,KAAK,EAAE,YAAY,KAAK;AACtG,QAAM,YAAY,MAAM,aAAaC,IAAG,SAAS;AACjD,QAAM,QAAQ,MAAM,SAAS,aAAa,SAAS,SAAS;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,MAAM,eAAe;AAAA,IAClC;AAAA,IACA,YAAY,MAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvD,eAAe,KAAK;AAAA,IACpB,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,sBAAsB,KAAK;AAAA,IAC3B,SAAS,KAAK;AAAA,IACd,gBAAgB,KAAK;AAAA,IACrB,cAAc,MAAM,gBAAgB;AAAA,IACpC,aAAa,MAAM,eAAe;AAAA,IAClC,QAAQ,KAAK;AAAA,IACb,GAAI,MAAM,YAAY,SAAS,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,EACrE;AACF;AAYO,SAAS,oBAAoB,OAAmC;AACrE,QAAM,MAA+B;AAAA,IACnC,IAAI,MAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvC,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,cAAc,MAAM,gBAAgB,CAAC;AAAA,IACrC,SAAS,MAAM,WAAW;AAAA,EAC5B;AACA,MAAI,MAAM,oBAAqB,KAAI,sBAAsB,MAAM;AAC/D,MAAI,MAAM,YAAY,OAAQ,KAAI,aAAa,MAAM;AACrD,SAAO,GAAG,KAAK,UAAU,GAAG,CAAC;AAAA;AAC/B;;;ADVA;AAUA;;;AEvFO,SAAS,yBAAyBC,OAG7B;AACV,MAAIA,MAAK,eAAe,sBAAuB,QAAO;AACtD,QAAM,SAASA,MAAK,UAAU;AAC9B,SACE,OAAO,SAAS,qBAAqB,KACrC,OAAO,SAAS,sBAAsB,KACtC,OAAO,SAAS,oBAAoB,KACpC,OAAO,SAAS,oBAAoB;AAExC;;;AF6EA;AAOA;;;AG5FO,IAAM,wBAAwB;AAa9B,IAAM,uCACX,oBAAI,IAAI;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASH,IAAM,kBAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,wBAAwB,MAAc,SAAS,KAAa;AAC1E,MAAI,MAAM,OAAO,QAAQ,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD,aAAW,WAAW,iBAAiB;AACrC,UAAM,IAAI,QAAQ,SAAS,YAAY;AAAA,EACzC;AACA,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO,GAAG,IAAI,MAAM,GAAG,MAAM,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgB,YAAgE;AACzG,QAAM,QAAkB,CAAC;AACzB,MAAI,iBAAiB,OAAO;AAC1B,UAAM,KAAK,MAAM,OAAO;AACxB,UAAM,KAAK,MAAM,IAAI;AAAA,EACvB,WAAW,OAAO,UAAU,UAAU;AACpC,UAAM,KAAK,KAAK;AAAA,EAClB,WAAW,SAAS,MAAM;AACxB,UAAM,KAAK,OAAO,KAAK,CAAC;AAAA,EAC1B;AACA,QAAM,SAAS;AACf,QAAM,OACJ,cACA,QAAQ,eACR,QAAQ,cACR;AACF,MAAI,QAAQ,MAAM;AAChB,UAAM,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC3B;AACA,SAAO,EAAE,UAAU,MAAM,KAAK,GAAG,EAAE,YAAY,GAAG,YAAY,KAAK;AACrE;AAEO,SAAS,yBACd,OACA,YAC4B;AAC5B,QAAM,EAAE,UAAU,YAAY,KAAK,IAAI,kBAAkB,OAAO,UAAU;AAC1E,QAAM,MACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,EAAE;AAEjG,MAAI,SAAS,OAAO,qDAAqD,KAAK,QAAQ,GAAG;AACvF,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,wBAAwB,OAAO,8BAA8B;AAAA,MACtE,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,SAAS,OAAO,SAAS,OAAO,iCAAiC,KAAK,QAAQ,GAAG;AACnF,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,wBAAwB,OAAO,uBAAuB;AAAA,MAC/D,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,SAAS,OAAO,uCAAuC,KAAK,QAAQ,GAAG;AACzE,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,wBAAwB,OAAO,cAAc;AAAA,MACtD,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MACE,SAAS,OACT,gGAAgG;AAAA,IAC9F;AAAA,EACF,GACA;AACA,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,wBAAwB,OAAO,yCAAyC;AAAA,MACjF,YAAY,QAAQ;AAAA,MACpB,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,qBAAqB,KAAK,QAAQ,GAAG;AACvC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,wBAAwB,OAAO,6CAA6C;AAAA,MACrF,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,0EAA0E,KAAK,QAAQ,GAAG;AAC5F,UAAM,WAAkC,2BAA2B,KAAK,QAAQ,IAC5E,iBACA;AACJ,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS;AAAA,QACP,QACG,aAAa,iBACV,2CACA;AAAA,MACR;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,uEAAuE,KAAK,QAAQ,GAAG;AACzF,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,wBAAwB,OAAO,iDAAiD;AAAA,MACzF,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS,wBAAwB,OAAO,wBAAwB;AAAA,IAChE,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF;AAEO,SAAS,8BAA8B,OAKnC;AACT,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM,kBAAkB,CAAC;AAClD,QAAM,WAAW,OAAO,MAAM,YAAY,EAAE,EAAE,YAAY;AAC1D,QAAMC,YAAW,OAAO,MAAM,YAAY,EAAE,EAAE,YAAY;AAC1D,MAAI,aAAa,yBAAyBA,cAAa,QAAQ;AAC7D,WAAO;AAAA,EACT;AACA,QAAM,MAAM,IAAI,mCAAmC,KAAK;AACxD,MAAI,CAAC,KAAK;AACR,WAAO,KAAK,IAAI,MAAM,CAAC;AAAA,EACzB;AACA,QAAM,SAAS,OAAO,SAAS,KAAK,EAAE;AACtC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,WAAO,KAAK,IAAI,MAAM,CAAC;AAAA,EACzB;AACA,SAAO,KAAK,IAAI,MAAM,MAAM;AAC9B;AAaA,IAAM,oBAA2D;AAAA,EAC/D,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX;AAEO,SAAS,+BAA+B,OAAwC;AACrF,QAAM,WAAW,MAAM,UAAU,KAAK,KAAK;AAC3C,QAAM,QAAQ,MAAM,OAAO,KAAK,KAAK;AACrC,QAAM,QAAQ,MAAM,SAAS,KAAK,KAAK;AACvC,QAAM,OAAO,kBAAkB,MAAM,UAAU,KAAK,kBAAkB;AACtE,QAAM,OAAO,MAAM,WAAW,aAAa;AAC3C,QAAM,QAAQ;AAAA,IACZ,gBAAM,KAAK,uBAAkB,IAAI;AAAA,IACjC;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,UAAU,KAAK;AAAA,IACf,kBAAkB,IAAI,UAAU,MAAM,QAAQ;AAAA,IAC9C,YAAY,MAAM,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,6BACd,SACA,QACQ;AACR,SAAO,0BAAgB,OAAO;AAAA;AAAA,EAA4B,MAAM;AAClE;;;ACrOO,SAAS,2BACd,OAC2B;AAC3B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gCACd,OAC2B;AAC3B,SAAO,2BAA2B,KAAK;AACzC;;;AC/BO,IAAM,6BAA6B,CAAC,OAAO,WAAW,SAAS;AAG/D,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AACF;AAGO,IAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF;;;ACZA,SAAS,cAAc,KAAkD;AACvE,QAAM,SAAS,OAAO,OAAO,KAAK,EAAE,YAAY;AAChD,MAAK,2BAAiD,SAAS,KAAK,GAAG;AACrE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,+BACd,MAAyB,QAAQ,KACR;AACzB,SAAO,cAAc,IAAI,gCAAgC;AAC3D;AAGO,SAAS,mCACd,MAAyB,QAAQ,KACxB;AACT,QAAM,MAAM,IAAI,oCAAoC,KAAK,EAAE,YAAY;AACvE,MAAI,CAAC,IAAK,QAAO,+BAA+B,GAAG,MAAM;AACzD,SAAO,QAAQ,OAAO,QAAQ,UAAU,QAAQ,SAAS,QAAQ;AACnE;;;ACzBA,SAAS,cAAAC,mBAAkB;AAE3B,SAASC,YAAW,OAAiD;AACnE,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,IAAI,MAAM,KAAK;AACrB,SAAO,EAAE,SAAS,IAAI;AACxB;AAGO,SAAS,qCAAqC,OAM1C;AACT,QAAM,UAAUA,YAAW,MAAM,SAAS,KAAK;AAC/C,QAAM,QAAQA,YAAW,MAAM,KAAK,KAAKA,YAAW,MAAM,MAAM,KAAK;AACrE,QAAM,SAASD,YAAW,QAAQ,EAC/B;AAAA,IACC;AAAA,MACEC,YAAW,MAAM,MAAM,KAAK;AAAA,MAC5BA,YAAW,MAAM,YAAY,KAAK;AAAA,MAClC,MAAM,YAAY;AAAA,IACpB,EAAE,KAAK,GAAG;AAAA,EACZ,EACC,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,SAAO,qBAAqB,OAAO,IAAI,MAAM;AAC/C;;;ACjBA,SAAS,gBACP,MACA,gBAC6B;AAC7B,MAAI,SAAS,aAAa,eAAgB,QAAO;AACjD,MAAI,SAAS,UAAW,QAAO;AAC/B,SAAO;AACT;AAMO,SAAS,4BACd,OACA,MAAyB,QAAQ,KACE;AACnC,QAAM,OAAO,+BAA+B,GAAG;AAC/C,QAAM,iBAAiB,mCAAmC,GAAG;AAC7D,QAAM,WAAW,gBAAgB,MAAM,cAAc;AACrD,QAAM,iBACJ,aAAa,yBACT,qCAAqC;AAAA,IACnC,WAAW,MAAM;AAAA,IACjB,QAAQ,MAAM;AAAA,IACd,cAAc,MAAM;AAAA,IACpB,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,EAChB,CAAC,IACD;AAEN,MAAI;AACJ,MAAI,SAAS,OAAO;AAClB,aAAS;AAAA,EACX,WAAW,aAAa,kBAAkB;AACxC,aAAS,iBAAiB,MAAM,MAAM;AAAA,EACxC,WAAW,aAAa,wBAAwB;AAC9C,aAAS,iBAAiB,MAAM,MAAM,0CAA0C,cAAc;AAAA,EAChG,OAAO;AACL,aAAS;AAAA,EACX;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B;AAAA,EACF;AACF;;;AC7DO,SAAS,cAAc,MAAc,QAAyB;AACnE,MAAI,MAAM;AACV,MAAI,OAAQ,OAAM,IAAI,MAAM,MAAM,EAAE,KAAK,mBAAmB;AAC5D,QAAM,IAAI,QAAQ,uBAAuB,yBAAyB;AAClE,QAAM,IAAI,QAAQ,sBAAsB,oBAAoB;AAC5D,SAAO;AACT;;;ATqMA;;;AU3MA,YAAY,QAAQ;AACpB,SAAS,WAAAC,iBAAe;AACxB,YAAYC,YAAU;AAGf,SAASC,gBAAe,UAA0B;AACvD,MAAI,SAAS,WAAW,IAAI,GAAG;AAC7B,WAAY,YAAKF,UAAQ,GAAG,SAAS,MAAM,CAAC,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAOO,SAAS,iCAAiC,UAK7C,CAAC,GAAa;AAChB,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,OACJ,QAAQ,YACP,IAAI,MAAM,KAAK,KAAK,IAAI,aAAa,KAAK,KAAKA,UAAQ;AAC1D,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AAEvB,QAAM,OAAO,CAAC,cAAsB;AAClC,UAAM,WAAgB,eAAQE,gBAAe,SAAS,CAAC;AACvD,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,SAAK,IAAI,QAAQ;AACjB,QAAI,KAAK,QAAQ;AAAA,EACnB;AAEA,QAAM,WAAW,IAAI,iBAAiB,KAAK;AAC3C,MAAI,SAAU,MAAK,QAAQ;AAE3B,MAAI,MAAM;AACV,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS,GAAG;AAC1C,SAAU,YAAK,KAAK,MAAM,CAAC;AAC3B,UAAM,SAAc,eAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AAEA,OAAU,YAAK,MAAM,WAAW,MAAM,CAAC;AAEvC,MAAI;AACF,UAAM,aAAkB,YAAK,MAAM,WAAW,aAAa;AAC3D,QAAO,cAAW,UAAU,GAAG;AAC7B,YAAM,SAAS,KAAK,MAAS,gBAAa,YAAY,MAAM,CAAC;AAG7D,YAAM,cAAc,OAAO,aAAa,KAAK;AAC7C,UAAI,aAAa;AACf,aAAU,YAAK,aAAa,MAAM,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;ACnEA,SAAS,cAAc,aAAAC,kBAAiB;AACxC,YAAYC,SAAQ;AACpB,YAAYC,YAAU;;;ACCf,SAAS,oBAAoB,KAAiC;AACnE,MAAI,CAAC,KAAK,KAAK,EAAG,QAAO;AACzB,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,GAAG;AACrB,UAAM,QAAQ,EAAE,YAAY,IAAI,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AACpE,WAAO,GAAG,EAAE,QAAQ,MAAM,IAAI;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADiBA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AACF;AAEA,IAAM,gBAAgB,CAAC,GAAG,mBAAmB;AAe7C,SAAS,aAAa,KAAwB,KAAiC;AAC7E,QAAM,QAAQ,IAAI,GAAG,GAAG,KAAK;AAC7B,SAAO,SAAS;AAClB;AAGO,SAAS,gCAAgC,SAE9C;AACA,MAAI,CAAI,eAAW,OAAO,EAAG,QAAO,CAAC;AACrC,QAAM,MAA+D,CAAC;AACtE,QAAM,UAAU,IAAI,IAAY,aAAa;AAC7C,aAAW,QAAW,iBAAa,SAAS,MAAM,EAAE,MAAM,IAAI,GAAG;AAC/D,UAAM,IAAI,KAAK,MAAM,0CAA0C;AAC/D,QAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAG;AAC9B,UAAM,MAAM,EAAE,CAAC;AACf,QAAI,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,KAAuD;AACpF,aAAW,OAAO,qBAAqB;AACrC,UAAM,QAAQ,aAAa,KAAK,GAAG;AACnC,QAAI,OAAO;AACT,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,QAAQ,OAAO,GAAG;AAAA,QAClB,MAAM,oBAAoB,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBACP,KACA,KAC+B;AAC/B,aAAW,WAAW,iCAAiC,EAAE,KAAK,IAAI,CAAC,GAAG;AACpE,UAAM,SAAS,gCAAgC,OAAO;AACtD,eAAW,OAAO,eAAe;AAC/B,YAAM,QAAQ,OAAO,GAAG,GAAG,KAAK;AAChC,UAAI,OAAO;AACT,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,QAAQ,YAAY,GAAG;AAAA,UACvB,MAAM,GAAG,oBAAoB,KAAK,CAAC,KAAU,gBAAS,OAAO,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,MAMnB;AAChB,QAAM,UAAU,QAAQ,aAAa,UAAU,aAAa;AAC5D,QAAM,OAAO;AAAA,IACX;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,KAAK,UAAW,MAAK,KAAK,gBAAgB,KAAK,SAAS;AAC5D,MAAI,KAAK,aAAc,MAAK,KAAK,mBAAmB,KAAK,YAAY;AACrE,MAAI,KAAK,SAAU,MAAK,KAAK,eAAe,KAAK,QAAQ;AACzD,MAAI,KAAK,OAAQ,MAAK,KAAK,UAAU;AAErC,MAAI;AACJ,MAAI;AACF,UAAM,SAASC,WAAU,SAAS,MAAM;AAAA,MACtC,UAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AACD,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,cAAU,OAAO,UAAU,IAAI,KAAK;AAAA,EACtC,QAAQ;AACN,QAAI;AACF,eAAS,aAAa,WAAW,MAAM;AAAA,QACrC,UAAU;AAAA,QACV,KAAK,QAAQ;AAAA,QACb,SAAS;AAAA,MACX,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,UAAM,YACH,OAAO,OAAO,mBAAmB,YAAY,OAAO,kBACpD,OAAO,OAAO,sBAAsB,YAAY,OAAO,qBACvD,OAAO,OAAO,qBAAqB,YAAY,OAAO;AACzD,QAAI,UAAW,QAAO;AAAA,EACxB,QAAQ;AAAA,EAER;AACA,MAAI,uBAAuB,KAAK,MAAM,EAAG,QAAO;AAChD,SAAO;AACT;AAEA,SAAS,mBACP,KACA,QAC+B;AAC/B,QAAM,SACJ,aAAa,KAAK,oBAAoB,KACtC,aAAa,KAAK,aAAa,KAC/B;AACF,QAAM,MAAM,OAAO;AAAA,IACjB;AAAA,IACA,WAAW,aAAa,KAAK,wBAAwB,KAAK,aAAa,KAAK,iBAAiB;AAAA,IAC7F,cAAc,aAAa,KAAK,2BAA2B,KAAK,aAAa,KAAK,oBAAoB;AAAA,IACtG,UAAU,aAAa,KAAK,uBAAuB,KAAK,aAAa,KAAK,gBAAgB;AAAA,IAC1F,QAAQ,aAAa,KAAK,oBAAoB,MAAM,OAAO,aAAa,KAAK,aAAa,MAAM;AAAA,EAClG,CAAC;AACD,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM,oBAAoB,GAAG;AAAA,EAC/B;AACF;AAOO,SAAS,6BACd,UAA4C,CAAC,GACZ;AACjC,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,SAAS,QAAQ,wBAAwB;AAC/C,QAAM,YAAkC,CAAC;AACzC,QAAM,oBAAoB,iCAAiC,EAAE,KAAK,IAAI,CAAC;AAEvE,QAAM,WAAW,mBAAmB,KAAK,MAAM;AAC/C,YAAU,KAAK,UAAU;AACzB,MAAI,SAAU,QAAO;AAErB,aAAW,OAAO,qBAAqB;AACrC,cAAU,KAAK,OAAO,GAAG,EAAwB;AAAA,EACnD;AACA,QAAM,UAAU,sBAAsB,GAAG;AACzC,MAAI,QAAS,QAAO;AAEpB,aAAW,OAAO,eAAe;AAC/B,cAAU,KAAK,YAAY,GAAG,EAAwB;AAAA,EACxD;AACA,QAAM,WAAW,oBAAoB,KAAK,GAAG;AAC7C,MAAI,SAAU,QAAO;AAErB,QAAM,mBACJ,kBAAkB,SAAS,IACvB,wBAAwB,kBAAkB,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,kBAAkB,SAAS,IAAI,WAAM,EAAE,MAC1G;AACN,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QACE,4SACA;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,iCACd,UAA4C,CAAC,GACrB;AACxB,QAAM,WAAW,6BAA6B,OAAO;AACrD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,SAAS,MAAM;AAAA,EACjC;AACA,UAAQ,IAAI,eAAe,SAAS;AACpC,UAAQ;AAAA,IACN,iCAAiC,SAAS,IAAI,aAAa,SAAS,MAAM;AAAA,EAC5E;AACA,SAAO;AACT;;;AElPA;AAEA;AAJA,SAAS,cAAAC,cAAY,aAAAC,kBAAiB;AACtC,OAAOC,YAAU;;;ACCjB;AACA;AAHA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,OAAOC,YAAU;;;ACDjB,OAAOC,YAAU;;;ACCjB;AACA;AACA;AACA;AAJA,OAAOC,YAAU;AAcV,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,wBAAwB,oBAAI,IAAI,CAAC,aAAa,UAAU,aAAa,MAAM,CAAC;AAMlF,SAAS,wBAAwB,KAAsC;AAC5E,QAAM,QAAQ,mBAAmB,GAAG;AACpC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,MAAI,uBAAuB;AAC3B,MAAI,oBAAoB;AACxB,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS;AAAA,MACbA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,oBAAoB,QAAQ;AAAA,MACzC,MAAM,IAAI;AAAA,MACV,YAAY,IAAI;AAAA,IAClB,CAAC;AACD,QAAI,OAAO,SAAS,CAAC,OAAO,aAAa;AACvC,iBAAW;AACX;AAAA,IACF;AAMA,QAAI,OAAO,OAAO,sBAAsB,YAAY,OAAO,mBAAmB;AAC5E,6BAAuB;AAAA,IACzB;AACA,QAAI,6BAA6B,MAAM,GAAG;AACxC,0BAAoB;AAAA,IACtB;AACA,QAAI,OAAO,eAAe,OAAO,UAAU,UAAU,OAAQ,aAAY;AAAA,EAC3E;AACA,MAAI,SAAU,QAAO;AACrB,MAAI,qBAAsB,QAAO;AACjC,MAAI,kBAAmB,QAAO;AAC9B,SAAO,YAAY,cAAc;AACnC;AAYO,SAAS,oBAAyC;AACvD,QAAM,YAAiC,CAAC;AACxC,aAAW,OAAO,eAAe,GAAG;AAClC,QAAI,CAAC,oBAAoB,IAAI,IAAI,MAAM,EAAG;AAC1C,UAAM,OAAO,wBAAwB,GAAG;AACxC,QAAI,CAAC,QAAQ,SAAS,IAAI,OAAQ;AAClC,UAAM,OAAO,IAAI;AACjB,QAAI,SAAS;AACb,YAAQ,GAAG;AACX,cAAU,KAAK,EAAE,OAAO,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,EAClD;AACA,SAAO;AACT;;;ADxFA;AACA;AACA;AACA;;;AEHA;AACA;AAHA,SAAS,cAAAC,cAAY,WAAW,eAAAC,cAAa,cAAc,cAAAC,aAAY,cAA2B;AAClG,OAAOC,YAAU;;;ACAjB;AACA;AAFA,OAAOC,YAAU;AAIjB,IAAM,cAAc,GAAGA,OAAK,GAAG,OAAOA,OAAK,GAAG,OAAOA,OAAK,GAAG;AAGtD,SAAS,qBAAqB,UAA2B;AAC9D,SAAO,SAAS,SAAS,WAAW;AACtC;AAMO,SAAS,qBAAqB,UAAkB,aAA6B;AAClF,MAAI,CAAC,qBAAqB,QAAQ,EAAG,QAAO;AAC5C,QAAM,OAAO,qBAAqB,WAAW;AAC7C,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,SAAS,GAAGA,OAAK,GAAG,OAAOA,OAAK,GAAG,OAAOA,OAAK,GAAG;AACxD,QAAM,MAAM,SAAS,QAAQ,MAAM;AACnC,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,OAAO,SAAS,MAAM,MAAM,OAAO,MAAM;AAC/C,SAAOA,OAAK,KAAK,SAAS,IAAI;AAChC;AAEO,SAAS,gBAAgB,aAAqB,OAAuB;AAC1E,SAAOA,OAAK,KAAK,eAAe,qBAAqB,WAAW,CAAC,GAAG,SAAS,KAAK,CAAC;AACrF;AAEO,SAAS,mBAAmB,aAAqB,OAAe,YAA4B;AACjG,SAAOA,OAAK,KAAK,gBAAgB,aAAa,KAAK,GAAG,WAAW,SAAS,UAAU,CAAC;AACvF;AAGO,SAAS,sBAAsB,aAAqB,OAAe,YAA4B;AACpG,QAAM,OAAO,qBAAqB,WAAW;AAC7C,SAAOA,OAAK,KAAK,MAAM,QAAQ,QAAQ,SAAS,KAAK,GAAG,WAAW,SAAS,UAAU,CAAC;AACzF;AAEO,SAAS,0BAA6C;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,WAMlC;AACA,SAAO;AAAA,IACL,gBAAgBA,OAAK,KAAK,WAAW,aAAa;AAAA,IAClD,YAAYA,OAAK,KAAK,WAAW,cAAc;AAAA,IAC/C,YAAYA,OAAK,KAAK,WAAW,YAAY;AAAA,IAC7C,eAAeA,OAAK,KAAK,WAAW,iBAAiB;AAAA,IACrD,gBAAgBA,OAAK,KAAK,WAAW,kBAAkB;AAAA,EACzD;AACF;AAGO,SAAS,sBAAsB,OAK3B;AACT,QAAM,YAAY,oBAAoB,mBAAmB,MAAM,aAAa,MAAM,OAAO,MAAM,UAAU,CAAC,EACvG;AACH,MAAI,MAAM,cAAc,CAAC,qBAAqB,MAAM,UAAU,GAAG;AAC/D,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;;;AChFA,SAAS,cAAAC,cAAY,aAAAC,YAAW,eAAAC,cAAa,cAAAC,aAAY,YAAAC,iBAAgB;AACzE,OAAOC,YAAU;;;ACAjB;AACA;AAKA;AAPA,OAAOC,YAAU;AA4BjB,SAAS,qBAAqB,OAAuB;AACnD,SAAOA,OAAK,QAAQ,gBAAgB,MAAM,KAAK,CAAC,CAAC;AACnD;AAEA,SAAS,eACP,OACA,QACA,mBAC4B;AAC5B,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO;AAAA,IACL,MAAM,qBAAqB,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,OAAkC,CAAC,GAA+B;AACnG,QAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,QAAM,SAAS,KAAK,UAAU,eAAe;AAE7C,QAAM,aAAa,eAAe,OAAO,aAAa,UAAU,IAAI;AACpE,MAAI,WAAY,QAAO;AAEvB,QAAM,iBAAiB,eAAe,IAAI,qBAAqB,oBAAoB,KAAK;AACxF,MAAI,eAAgB,QAAO;AAE3B,QAAM,iBAAiB,eAAe,IAAI,qBAAqB,oBAAoB,KAAK;AACxF,MAAI,eAAgB,QAAO;AAE3B,QAAM,aAAa,oBAAoB;AAAA,IACrC,KAAK,KAAK;AAAA,IACV,kBAAkB,KAAK;AAAA,EACzB,CAAC;AACD,MAAI,CAAC,WAAY,QAAO;AAExB,SAAO;AAAA,IACL,MAAM,WAAW;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,mBAAmB;AAAA,EACrB;AACF;AAEO,SAAS,mBAAmB,MAAc,UAA+C;AAC9F,QAAM,SAA2B;AAAA,IAC/B,GAAI,YAAY,eAAe;AAAA,IAC/B,aAAa,eAAeA,OAAK,QAAQ,IAAI,CAAC;AAAA,EAChD;AACA,iBAAe,MAAM;AACrB,SAAO;AACT;AAEO,SAAS,qBAAqB,MAOnC;AACA,QAAM,WAAW,MAAM,UAAU,eAAe;AAChD,QAAM,WAAW,mBAAmB,EAAE,GAAG,MAAM,QAAQ,SAAS,CAAC;AACjE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,SAAS,mBAAmB;AAC9B,WAAO,EAAE,IAAI,MAAM,UAAU,QAAQ,SAAS;AAAA,EAChD;AAEA,QAAM,SAAS,mBAAmB,SAAS,MAAM,QAAQ;AACzD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,EAAE,GAAG,UAAU,mBAAmB,MAAM,QAAQ,SAAS;AAAA,IACnE;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,UAIxC;AACA,SAAO;AAAA,IACL,aAAa,gBAAgB,SAAS,IAAI;AAAA,IAC1C,QAAQ,SAAS;AAAA,IACjB,mBAAmB,SAAS;AAAA,EAC9B;AACF;;;ADtHA;AACA;AACA;AAEA;AAGO,IAAM,gCAAgC,KAAK,KAAK;AAChD,IAAM,iCAAiC,KAAK,KAAK;AAyBjD,SAAS,yBAAyB,YAAoB,aAA8B;AACzF,QAAM,WAAWC,OAAK,QAAQ,UAAU;AACxC,QAAM,UAAUA,OAAK,QAAQ,eAAe,WAAW,CAAC;AACxD,QAAM,MAAMA,OAAK,SAAS,SAAS,QAAQ;AAC3C,SAAO,QAAQ,QAAQ,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,GAAG;AACtE;AAEA,SAAS,cAAc,SAA2B;AAChD,MAAI,CAACC,aAAW,OAAO,EAAG,QAAO,CAAC;AAClC,MAAI;AACF,WAAOC,aAAY,SAAS,EAAE,eAAe,KAAK,CAAC,EAChD,OAAO,CAAC,UAAU,MAAM,YAAY,KAAK,MAAM,SAAS,MAAM,EAC9D,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC9B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,sBAAsBC,SAA0B;AACvD,QAAM,aAAaH,OAAK,KAAKG,SAAQ,SAAS;AAC9C,MAAI,CAACF,aAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,WAAOC,aAAY,YAAY,EAAE,eAAe,KAAK,CAAC,EACnD,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC9B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,iBAAiBC,SAAwB;AAChD,SAAOH,OAAK,KAAKG,SAAQ,kBAAkB;AAC7C;AAEA,SAAS,kBAAkBA,SAAgB,YAA4B;AACrE,QAAM,OAAOH,OAAK,KAAK,iBAAiBG,OAAM,GAAG,SAAS,UAAU,CAAC;AACrE,MAAI,CAACF,aAAW,IAAI,EAAG,QAAO;AAC9B,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC;AAC9B;AAEA,SAAS,oBAAoB,QAAgB,KAAa,UAA2B;AACnF,MAAI,CAACA,aAAW,MAAM,EAAG,QAAO;AAChC,MAAI;AACF,UAAM,MAAM,MAAMG,UAAS,MAAM,EAAE;AACnC,WAAO,OAAO,SAAS,GAAG,KAAK,OAAO,KAAK,MAAM;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,mCACd,WACA,MAAM,KAAK,IAAI,GACf,WAAW,+BACF;AACT,MAAI,CAACH,aAAW,SAAS,EAAG,QAAO;AACnC,QAAM,YAAY,oBAAoB,SAAS;AAC/C,QAAM,SAAS;AAAA,IACb,UAAU;AAAA,IACV;AAAA,EACF;AACA,MAAI,QAAQ,WAAW,aAAa,WAAW,OAAO,GAAG,EAAG,QAAO;AACnE,QAAM,YAAY,eAAe,UAAU,aAAa;AACxD,MAAI,UAAU,iBAAiB;AAC7B,UAAM,MAAM,MAAM,KAAK,MAAM,UAAU,eAAe;AACtD,QAAI,OAAO,SAAS,GAAG,KAAK,OAAO,KAAK,MAAM,SAAU,QAAO;AAAA,EACjE;AACA,MAAI,oBAAoB,UAAU,YAAY,KAAK,QAAQ,EAAG,QAAO;AACrE,MAAI,oBAAoB,UAAU,eAAe,KAAK,QAAQ,EAAG,QAAO;AACxE,SAAO;AACT;AAEA,SAAS,2BAA2B,WAAmB,QAAiC,KAAqB;AAC3G,QAAM,uBACJ,OAAO,OAAO,yBAAyB,WAAW,KAAK,MAAM,OAAO,oBAAoB,IAAI;AAC9F,MAAI,OAAO,SAAS,oBAAoB,EAAG,QAAO,MAAM;AACxD,QAAM,wBAAwB,MAAM;AAClC,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,UAAM,OAAQ,IAA2B;AACzC,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,UAAM,YAAa,KAAiC;AACpD,WAAO,OAAO,cAAc,WAAW,KAAK,MAAM,SAAS,IAAI;AAAA,EACjE,GAAG;AACH,MAAI,OAAO,SAAS,oBAAoB,EAAG,QAAO,MAAM;AACxD,MAAI;AACF,WAAO,MAAMG,UAASJ,OAAK,KAAK,WAAW,aAAa,CAAC,EAAE;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gCACP,WACA,QACA,KACA,cACuC;AACvC,MAAI,mCAAmC,WAAW,GAAG,GAAG;AACtD,WAAO,EAAE,UAAU,OAAO,QAAQ,6CAA6C;AAAA,EACjF;AACA,QAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACnE,QAAM,oBACJ,OAAO,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,KAAK,EAAE,SAAS;AAC3F,MAAI,kBAAmB,QAAO,EAAE,UAAU,OAAO,QAAQ,gCAAgC;AACzF,QAAM,yBACJ,OAAO,OAAO,yBAAyB,YAAY,OAAO,sBAAsB;AAClF,MAAI,WAAW,UAAU,CAAC,wBAAwB;AAChD,WAAO,EAAE,UAAU,OAAO,QAAQ,oBAAoB,UAAU,SAAS,GAAG;AAAA,EAC9E;AACA,QAAM,MAAM,2BAA2B,WAAW,QAAQ,GAAG;AAC7D,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,cAAc;AAC/C,WAAO,EAAE,UAAU,OAAO,QAAQ,uDAAuD;AAAA,EAC3F;AACA,SAAO,EAAE,UAAU,MAAM,QAAQ,oCAAoC;AACvE;AAGO,SAAS,gCACdG,SACA,MAAM,KAAK,IAAI,GACf,WAAW,+BACF;AACT,aAAW,QAAQ,sBAAsBA,OAAM,GAAG;AAChD,QAAI,mCAAmCH,OAAK,KAAKG,SAAQ,WAAW,IAAI,GAAG,KAAK,QAAQ,GAAG;AACzF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAA0E;AACjF,QAAM,WAAW,mBAAmB;AACpC,SAAO;AAAA,IACL,MAAM,UAAU,QAAQ;AAAA,IACxB,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AACF;AAEA,SAAS,sBAAsB,aAAqB,OAAwC;AAC1F,QAAMA,UAASH,OAAK,KAAK,eAAe,WAAW,GAAG,SAAS,KAAK,CAAC;AACrE,MAAI,CAACC,aAAWE,OAAM,EAAG,QAAO;AAChC,QAAM,cAAc,sBAAsBA,OAAM;AAChD,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,MAAI;AACJ,MAAI;AACF,gBAAYC,UAASD,OAAM,EAAE,UAAU,YAAY;AAAA,EACrD,QAAQ;AACN,iBAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AAEA,QAAM,UAAuC,CAAC;AAC9C,aAAW,QAAQ,aAAa;AAC9B,UAAM,eAAe,mBAAmB,aAAa,OAAO,IAAI;AAChE,YAAQ,IAAI,IAAI;AAAA,MACd,WAAW;AAAA,MACX,YAAYH,OAAK,KAAK,cAAc,aAAa;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,YAAY,gCAAgCG,OAAM;AACxD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,GAAG,gBAAgB;AAAA,IACnB,QAAQ,YAAY,YAAY;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,yBAAyB,kBAAuD;AAC9F,QAAM,cAAc,qBAAqB,oBAAoB,mBAAmB,CAAC;AACjF,QAAM,UAAU,eAAe,WAAW;AAC1C,QAAM,WAA0C,CAAC;AAEjD,aAAW,SAAS,cAAc,OAAO,GAAG;AAC1C,UAAM,cAAcH,OAAK,KAAK,SAAS,OAAO,UAAU;AACxD,QAAIC,aAAW,WAAW,GAAG;AAC3B,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAEA,UAAM,cAAc,sBAAsB,aAAa,KAAK;AAC5D,QAAI,CAAC,aAAa;AAChB,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AAEA,YAAQ,WAAW;AACnB,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,gCAAgCD,OAAK,KAAK,SAAS,KAAK,CAAC,IAC7D,6DACA;AAAA,IACN,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAEO,SAAS,8BACd,kBACA,UAAmD,CAAC,GACvB;AAC7B,QAAM,cAAc,qBAAqB,oBAAoB,mBAAmB,CAAC;AACjF,QAAM,UAAU,eAAe,WAAW;AAC1C,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,WAA2C,CAAC;AAElD,2BAAyB,WAAW;AACpC,aAAW,SAAS,cAAc,OAAO,GAAG;AAC1C,UAAMG,UAASH,OAAK,KAAK,SAAS,KAAK;AACvC,UAAM,cAAcA,OAAK,KAAKG,SAAQ,UAAU;AAChD,UAAM,MAAM,SAAuC,aAAa,MAAS;AACzE,QAAI,CAAC,KAAK,GAAI;AACd,UAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG,GAAG,sBAAsBA,OAAM,CAAC,CAAC;AAC3F,QAAI,UAAU;AAEd,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAYH,OAAK,KAAKG,SAAQ,WAAW,SAAS,IAAI,CAAC;AAC7D,YAAM,iBAAiBH,OAAK,KAAK,WAAW,aAAa;AACzD,YAAM,SAAS,SAA8C,gBAAgB,MAAS;AACtF,UAAI,CAAC,QAAQ;AACX,cAAM,oBAAoBA,OAAK,KAAK,iBAAiBG,OAAM,GAAG,SAAS,IAAI,CAAC;AAC5E,YAAIF,aAAW,iBAAiB,MAAM,IAAI,QAAQ,SAAS,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,IAAI;AACvF,iBAAO,IAAI,QAAQ,SAAS,IAAI,CAAC;AACjC,iBAAO,IAAI,QAAQ,IAAI;AACvB,oBAAU;AACV,mBAAS,KAAK;AAAA,YACZ,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,aAAa;AAAA,UACf,CAAC;AACD;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,OAAO,IAAI,IAAI,QAAQ,MAAM,QAAQ,WAAW,QAAQ,sBAAsB,CAAC;AAC/F;AAAA,MACF;AACA,YAAM,cAAc,gCAAgC,WAAW,QAAQ,KAAK,YAAY;AACxF,UAAI,CAAC,YAAY,UAAU;AACzB,iBAAS,KAAK,EAAE,OAAO,IAAI,IAAI,QAAQ,MAAM,QAAQ,WAAW,QAAQ,YAAY,OAAO,CAAC;AAC5F;AAAA,MACF;AAEA,YAAM,cAAc,kBAAkBE,SAAQ,IAAI;AAClD,MAAAE,WAAUL,OAAK,QAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,MAAAM,YAAW,WAAW,WAAW;AACjC,aAAO,IAAI,QAAQ,SAAS,IAAI,CAAC;AACjC,aAAO,IAAI,QAAQ,IAAI;AACvB,gBAAU;AACV,eAAS,KAAK,EAAE,OAAO,IAAI,IAAI,QAAQ,MAAM,QAAQ,YAAY,QAAQ,YAAY,QAAQ,YAAY,CAAC;AAAA,IAC5G;AAEA,QAAI,QAAS,SAAQ,GAAG;AAAA,EAC1B;AAEA,SAAO,EAAE,SAAS,SAAS;AAC7B;AAGO,SAAS,6BAA6B,aAAqB,MAAM,KAAK,IAAI,GAAgB;AAC/F,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAAU,eAAe,WAAW;AAC1C,aAAW,SAAS,cAAc,OAAO,GAAG;AAC1C,UAAMH,UAASH,OAAK,KAAK,SAAS,KAAK;AACvC,QAAI,gCAAgCG,SAAQ,GAAG,GAAG;AAChD,WAAK,IAAI,GAAG,WAAW,KAAK,KAAK,EAAE;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;;;AFxTA;AAEA;AAqBA,SAAS,2BAA2B,aAAqB,OAA8B;AACrF,QAAM,YAAY,gBAAgB,aAAa,KAAK;AACpD,MAAI;AACJ,MAAI;AACF,WAAO,UAAU,SAAS;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAK,eAAe,EAAG,QAAO;AACnC,QAAM,eAAeI,OAAK,QAAQA,OAAK,QAAQ,SAAS,GAAG,aAAa,SAAS,CAAC;AAClF,MAAI,gCAAgC,YAAY,KAAK,gCAAgC,SAAS,GAAG;AAC/F,WAAO;AAAA,EACT;AACA,QAAM,UAAU,GAAG,SAAS,gBAAgB,KAAK,IAAI,CAAC;AACtD,EAAAC,YAAW,cAAc,OAAO;AAChC,SAAO,SAAS;AAChB,EAAAA,YAAW,SAAS,SAAS;AAC7B,SAAO;AACT;AAEA,SAAS,kBAAkB,OAGd;AACX,QAAM,QAAkB,CAAC;AACzB,aAAW,YAAY,wBAAwB,GAAG;AAChD,UAAM,OAAOD,OAAK,KAAK,MAAM,SAAS,QAAQ;AAC9C,UAAM,KAAKA,OAAK,KAAK,MAAM,OAAO,QAAQ;AAC1C,QAAI,CAACE,aAAW,IAAI,KAAKA,aAAW,EAAE,EAAG;AACzC,IAAAD,YAAW,MAAM,EAAE;AACnB,UAAM,KAAK,QAAQ;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAA6B,cAA+B;AAC1F,QAAM,YAAY,oBAAoB,YAAY;AAClD,MAAI,UAAU;AACd,MAAI,OAAO,cAAc,cAAc;AACrC,WAAO,YAAY;AACnB,cAAU;AAAA,EACZ;AACA,MAAI,OAAO,eAAe,UAAU,YAAY;AAC9C,WAAO,aAAa,UAAU;AAC9B,cAAU;AAAA,EACZ;AACA,MAAI,OAAO,eAAe,UAAU,YAAY;AAC9C,WAAO,aAAa,UAAU;AAC9B,cAAU;AAAA,EACZ;AACA,MAAI,OAAO,kBAAkB,UAAU,eAAe;AACpD,WAAO,gBAAgB,UAAU;AACjC,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAItB;AACT,QAAM,iBAAiB,OAAO,MAAM,YAAY,WAAW,WAAW,MAAM,WAAW,SAAS;AAChG,QAAM,iBACJ,MAAM,YAAY,aAAa,OAAO,MAAM,WAAW,cAAc,WAChE,MAAM,WAAW,UAAiC,QACnD;AACN,MAAI,mBAAmB,UAAU,mBAAmB,OAAQ,QAAO;AACnE,MAAI,MAAM,qBAAqB,MAAM,qBAAsB,QAAO;AAClE,MAAI,mBAAmB,UAAW,QAAO;AACzC,MAAI,mBAAmB,UAAW,QAAO;AACzC,SAAO,kBAAkB;AAC3B;AAEA,SAAS,8BAA8B,OAKR;AAC7B,QAAM,YAAY,oBAAoB,MAAM,YAAY;AACxD,QAAM,aAAa,SAA8C,UAAU,gBAAgB,MAAS;AACpG,QAAM,eAAeC,aAAW,UAAU,UAAU;AACpD,QAAM,kBAAkBA,aAAW,UAAU,aAAa;AAC1D,QAAM,eAAe,gBAAgB,mBAAmB,cAAc;AACtE,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,eAAe,eAAe,mBAAmB,UAAU,UAAU,IAAI,EAAE,aAAa,KAAK;AACnG,QAAM,YAAY,kBAAkB,eAAe,UAAU,aAAa,IAAI,eAAe,EAAE;AAC/F,QAAM,uBAAuB,iCAAiC,SAAS;AACvE,QAAM,SAAS,wBAAwB;AAAA,IACrC;AAAA,IACA,mBAAmB,aAAa;AAAA,IAChC;AAAA,EACF,CAAC;AAED,QAAM,SAA8B;AAAA,IAClC,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM,IAAI;AAAA,IACjB;AAAA,IACA,QAAQ,OAAO,YAAY,WAAW,WAAW,WAAW,SAAS,SAAS,MAAM,IAAI,EAAE,IAAI,MAAM,UAAU;AAAA,IAC9G,cACE,OAAO,YAAY,iBAAiB,WAChC,WAAW,eACXF,OAAK,KAAK,SAAS,EAAE,cAAc,MAAM,IAAI,IAAI,MAAM,UAAU;AAAA,IACvE,WAAW,MAAM;AAAA,IACjB,YAAY,UAAU;AAAA,IACtB,YAAY,UAAU;AAAA,IACtB,eAAe,UAAU;AAAA,IACzB,WAAW,OAAO,YAAY,cAAc,WAAW,WAAW,YAAY,MAAM,IAAI;AAAA,IACxF,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC,iBAAiB;AAAA,EACnB;AAEA,MAAI,OAAO,YAAY,WAAW,SAAU,QAAO,SAAS,WAAW;AACvE,MAAI,OAAO,YAAY,cAAc,SAAU,QAAO,YAAY,WAAW;AAC7E,MAAI,OAAO,YAAY,WAAW,SAAU,QAAO,SAAS,WAAW;AACvE,MAAI,OAAO,YAAY,QAAQ,SAAU,QAAO,MAAM,WAAW;AACjE,MAAI,aAAa,eAAe,sBAAsB;AACpD,WAAO,qBAAqB;AAAA,MAC1B,aAAa,aAAa,eAAe,wBAAwB;AAAA,MACjE,SAAS,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,yBAAuB,QAAQ,MAAM,YAAY;AACjD,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAuB,aAA8B;AACjF,MAAI,UAAU;AACd,QAAM,cAA2C,EAAE,GAAI,IAAI,WAAW,CAAC,EAAG;AAC1E,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,WAAW,GAAG;AACrD,UAAM,eAAe,mBAAmB,aAAa,IAAI,IAAI,IAAI;AACjE,UAAM,kBAAkBA,OAAK,KAAK,cAAc,aAAa;AAC7D,UAAM,SACJ,qBAAqB,IAAI,SAAS,KAClC,qBAAqB,IAAI,UAAU,KACnC,IAAI,cAAc,gBAClB,IAAI,eAAe;AACrB,QAAI,CAAC,OAAQ;AACb,gBAAY,IAAI,IAAI,EAAE,WAAW,cAAc,YAAY,gBAAgB;AAC3E,cAAU;AAAA,EACZ;AACA,MAAI,SAAS;AACX,QAAI,UAAU;AACd,YAAQ,GAAG;AAAA,EACb;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAKS;AACnC,QAAM,WAA6C,CAAC;AACpD,QAAM,eAAe,mBAAmB,MAAM,aAAa,MAAM,IAAI,IAAI,MAAM,UAAU;AACzF,QAAM,YAAY,sBAAsB,MAAM,aAAa,MAAM,IAAI,IAAI,MAAM,UAAU;AACzF,QAAM,qBAAqB,oBAAoB,YAAY;AAE3D,QAAM,QAAQ,kBAAkB,EAAE,SAAS,WAAW,OAAO,aAAa,CAAC;AAC3E,MAAI,MAAM,SAAS,GAAG;AACpB,aAAS,KAAK;AAAA,MACZ,OAAO,MAAM,IAAI;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ,SAAS,MAAM,KAAK,IAAI,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,sBAAsB;AAAA,IAC3C,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM,IAAI;AAAA,IACjB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,EACpB,CAAC;AAED,MAAI,SAAS,SAA0C,gBAAgB,MAAS;AAChF,MAAI,CAAC,UAAUE,aAAW,mBAAmB,cAAc,GAAG;AAC5D,aAAS,SAA0C,mBAAmB,gBAAgB,MAAS;AAAA,EACjG;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,cAAc,8BAA8B;AAAA,MAChD,KAAK,MAAM;AAAA,MACX,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,aAAa,MAAM;AAAA,IACrB,CAAC;AACD,QAAI,aAAa;AACf,iBAAW,MAAM,IAAI,IAAI,WAAW;AACpC,eAAS,KAAK;AAAA,QACZ,OAAO,MAAM,IAAI;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ,YAAY,mBAAmB;AAAA,MACzC,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,YAAYA,aAAW,YAAY;AACzC,UAAM,iBAAiB,wBAAwB,EAAE,KAAK,CAAC,MAAMA,aAAWF,OAAK,KAAK,cAAc,CAAC,CAAC,CAAC;AACnG,QAAI,aAAa,CAAC,gBAAgB;AAChC,YAAM,YAAiC;AAAA,QACrC,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM,IAAI;AAAA,QACjB,QAAQ;AAAA,QACR,QAAQ,SAAS,MAAM,IAAI,EAAE,IAAI,MAAM,UAAU;AAAA,QACjD,cAAcA,OAAK,KAAK,SAAS,EAAE,cAAc,MAAM,IAAI,IAAI,MAAM,UAAU;AAAA,QAC/E,WAAW;AAAA,QACX,YAAY,mBAAmB;AAAA,QAC/B,YAAY,mBAAmB;AAAA,QAC/B,eAAe,mBAAmB;AAAA,QAClC,WAAW,MAAM,IAAI;AAAA,QACrB,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,QACrC,iBAAiB;AAAA,MACnB;AACA,iBAAW,MAAM,IAAI,IAAI,SAAS;AAClC,eAAS,KAAK;AAAA,QACZ,OAAO,MAAM,IAAI;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ,UAAU,mBAAmB;AAAA,MACvC,CAAC;AACD,aAAO;AAAA,IACT;AAEA,aAAS,KAAK;AAAA,MACZ,OAAO,MAAM,IAAI;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,uBAAuB,QAAQ,YAAY,GAAG;AAChD,WAAO,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC7C,WAAO,kBAAkB,OAAO,mBAAmB;AACnD,eAAW,MAAM,IAAI,IAAI,MAAM;AAC/B,aAAS,KAAK;AAAA,MACZ,OAAO,MAAM,IAAI;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,OAAO;AACL,aAAS,KAAK;AAAA,MACZ,OAAO,MAAM,IAAI;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,KAAuB,aAA+B;AACnF,QAAM,aAAaA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,SAAS;AAC5D,MAAI,CAACE,aAAW,UAAU,EAAG,QAAO,CAAC;AACrC,QAAM,UAAU,IAAI,IAAI,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;AACtD,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAASC,aAAY,YAAY,EAAE,eAAe,KAAK,CAAC,GAAG;AACpE,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,QAAI,QAAQ,IAAI,MAAM,IAAI,EAAG;AAC7B,YAAQ,KAAK,MAAM,IAAI;AAAA,EACzB;AACA,SAAO;AACT;AASO,SAAS,0BAAyD;AACvE,QAAM,EAAE,YAAY,IAAI,SAAS;AACjC,QAAM,uBAAuB,yBAAyB,WAAW;AACjE,QAAM,WAA6C,CAAC;AAEpD,aAAW,OAAO,eAAe,GAAG;AAClC,UAAM,mBAAmB,2BAA2B,aAAa,IAAI,EAAE;AACvE,QAAI,kBAAkB;AACpB,eAAS,KAAK;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,2CAA2C,gBAAgB;AAAA,MACrE,CAAC;AAAA,IACH;AAEA,QAAI,qBAAqB,KAAK,WAAW,GAAG;AAC1C,eAAS,KAAK;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,IAAI,IAAI,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;AAC1D,eAAW,UAAU,sBAAsB,KAAK,WAAW,GAAG;AAC5D,kBAAY,IAAI,MAAM;AACtB,UAAI,UAAU;AAAA,QACZ,GAAI,IAAI,WAAW,CAAC;AAAA,QACpB,CAAC,MAAM,GAAG;AAAA,UACR,WAAW,mBAAmB,aAAa,IAAI,IAAI,MAAM;AAAA,UACzD,YAAYH,OAAK,KAAK,mBAAmB,aAAa,IAAI,IAAI,MAAM,GAAG,aAAa;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,GAAG;AACX,eAAS,KAAK;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,eAAW,QAAQ,aAAa;AAC9B,YAAM,MAAM,IAAI,UAAU,IAAI;AAC9B,eAAS;AAAA,QACP,GAAG,mBAAmB;AAAA,UACpB;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA,YAAY,KAAK;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,UAAU,qBAAqB;AACnD;AAGO,SAAS,6BAAmC;AACjD,QAAM,SAAS,wBAAwB;AACvC,QAAM,WAAW,OAAO,QAAQ,OAA+B,CAAC,KAAK,QAAQ;AAC3E,QAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;AAC3C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,QAAM,qBAAqB,OAAO,qBAAqB,KAAK,OAA+B,CAAC,KAAK,QAAQ;AACvG,QAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;AAC3C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,sBAAsB,EAAE,QAAQ,oBAAoB,SAAS,OAAO,qBAAqB,KAAK;AAAA,QAC9F,SAAS,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AI9YA;AACA;AACA;AACA;AACA;AACA;AAPA,SAAS,gBAAAI,qBAAoB;AAC7B,OAAOC,YAAU;AAsCjB,SAASC,gBAAe,KAA4B;AAClD,QAAM,IAAI,IAAI,KAAK,EAAE,MAAM,qDAAqD;AAChF,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,sBAAsB,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAChD;AAEA,SAAS,gBAAgB,KAA4B;AACnD,QAAM,IAAIA,gBAAe,GAAG,GAAG,MAAM,gBAAgB;AACrD,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,OAAO,SAAS,EAAE,CAAC,GAAI,EAAE;AACnC,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,yBAAyB,MAAwB;AACxD,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,SAAS,KAAK,SAAS,gEAAgE,GAAG;AACnG,UAAM,IAAI,OAAO,SAAS,MAAM,CAAC,GAAI,EAAE;AACvC,QAAI,OAAO,SAAS,CAAC,EAAG,KAAI,IAAI,CAAC;AAAA,EACnC;AACA,aAAW,SAAS,KAAK,SAAS,0BAA0B,GAAG;AAC7D,UAAM,IAAI,OAAO,SAAS,MAAM,CAAC,GAAI,EAAE;AACvC,QAAI,OAAO,SAAS,CAAC,EAAG,KAAI,IAAI,CAAC;AAAA,EACnC;AACA,aAAW,SAAS,KAAK,SAAS,uBAAuB,GAAG;AAC1D,UAAM,IAAI,OAAO,SAAS,MAAM,CAAC,GAAI,EAAE;AACvC,QAAI,OAAO,SAAS,CAAC,EAAG,KAAI,IAAI,CAAC;AAAA,EACnC;AACA,SAAO,CAAC,GAAG,GAAG;AAChB;AAEA,SAAS,8BAA8B,OAAoC;AACzE,MAAIC,UAAyC;AAC7C,MAAI,OAAO,UAAU,SAAU,CAAAA,UAAS,uCAAuC,KAAK;AAAA,WAC3E,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,EAAG,CAAAA,UAAS;AAC/E,MAAI,CAACA,QAAQ,QAAO,CAAC;AACrB,QAAM,MAAMA,QAAO,0BAA0BA,QAAO;AACpD,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,MAA0B,CAAC;AACjC,aAAW,QAAQ,KAAK;AACtB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG;AAC9D,UAAM,MAAM;AACZ,UAAM,QAAQD,gBAAe,OAAO,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;AAClE,UAAM,UAAU,OAAO,IAAI,WAAW,EAAE,EAAE,KAAK;AAC/C,QAAI,CAAC,SAAS,YAAY,SAAU;AACpC,QAAI,KAAK;AAAA,MACP;AAAA,MACA,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;AAAA,MAC/H,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACxD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAqE;AAC5F,MAAI;AACF,UAAM,OAAOF,cAAa,OAAO,CAAC,UAAU,SAAS,mBAAmB,GAAG;AAAA,MACzE,KAAK,MAAM;AAAA,MACX,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC,EAAE,KAAK;AACR,UAAM,YAAY,KAAK,MAAM,4CAA4C;AACzE,UAAM,WAAW,YAAY,CAAC;AAC9B,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,MAAMA;AAAA,MACV;AAAA,MACA,CAAC,MAAM,QAAQ,OAAO,MAAM,QAAQ,GAAG,UAAU,UAAU,UAAU,gCAAgC;AAAA,MACrG,EAAE,KAAK,MAAM,SAAS,UAAU,QAAQ,OAAO,CAAC,UAAU,QAAQ,QAAQ,EAAE;AAAA,IAC9E;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAM7B,WAAO;AAAA,MACL,OAAOE,gBAAe,OAAO,OAAO,sBAAsB,QAAQ,SAAS,MAAM,QAAQ,EAAE,KAAK,sBAAsB,QAAQ,SAAS,MAAM,QAAQ;AAAA,MACrJ,OAAO,OAAO,SAAS;AAAA,MACvB,UAAU,OAAO,YAAY;AAAA,MAC7B,aAAa,OAAO,aAAa,OAAO;AAAA,IAC1C;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,QAAsC;AAClE,QAAM,YAAY,eAAe,OAAO,aAAa;AACrD,SAAO,OAAO,oBAAoB,eAAe,iCAAiC,SAAS;AAC7F;AAEA,SAAS,0BAA0B,KAAuF;AACxH,QAAM,OAAO,oBAAI,IAA8B;AAC/C,QAAME,UAAS,aAAa,IAAI,EAAE;AAClC,aAAW,QAAQ,mBAAmB,GAAY,GAAG;AACnD,UAAM,SAAS;AAAA,MACbH,OAAK,KAAKG,SAAQ,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MAC1D;AAAA,IACF;AACA,QAAI,CAAC,OAAQ;AACb,eAAW,YAAY,8BAA8B,qBAAqB,MAAM,CAAC,GAAG;AAClF,YAAM,IAAI,gBAAgB,SAAS,KAAK;AACxC,UAAI,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAG,MAAK,IAAI,GAAG,QAAQ;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAA6B,mBAAsC;AAC7F,QAAM,YAAY,eAAe,OAAO,aAAa;AACrD,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY,iBAAiB;AAAA,EAC/B,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,SAAO,yBAAyB,IAAI;AACtC;AAEA,SAAS,0BAA0B,QAAsC;AACvE,SAAO,OAAO,cAAc,QAAQ,CAAC,OAAO,UAAU,CAAC,OAAO;AAChE;AAEO,SAAS,oCACd,UAA4C,CAAC,GACZ;AACjC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAA+C,CAAC;AACtD,QAAM,kBAAkB,oBAAI,IAAmC;AAE/D,aAAW,OAAO,eAAe,GAAG;AAClC,UAAM,aAAa,0BAA0B,GAAG;AAChD,UAAMA,UAAS,aAAa,IAAI,EAAE;AAClC,eAAW,QAAQ,mBAAmB,GAAG,GAAG;AAC1C,YAAM,aAAaH,OAAK,KAAKG,SAAQ,WAAW,SAAS,IAAI,GAAG,aAAa;AAC7E,YAAM,SAAS,SAA0C,YAAY,MAAS;AAC9E,UAAI,CAAC,UAAU,CAAC,0BAA0B,MAAM,EAAG;AACnD,YAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,UAAI,OAAO,UAAU,UAAU,kBAAmB;AAElD,UAAI,SAAkC;AACtC,iBAAW,YAAY,mBAAmB,QAAQ,OAAO,WAAW,GAAG;AACrE,iBAAS,WAAW,IAAI,QAAQ,KAAK;AACrC,YAAI,CAAC,QAAQ;AACX,gBAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,gBAAM,WAAW,GAAG,OAAO,IAAI,QAAQ;AACvC,gBAAM,OAAO,gBAAgB,IAAI,QAAQ,IACrC,gBAAgB,IAAI,QAAQ,KAAK,OACjC,SAAS,EAAE,SAAS,SAAS,CAAC;AAClC,cAAI,CAAC,gBAAgB,IAAI,QAAQ,EAAG,iBAAgB,IAAI,UAAU,IAAI;AACtE,cAAI,SAAS,KAAK,UAAU,YAAY,KAAK,WAAW;AACtD,qBAAS,EAAE,OAAO,KAAK,OAAO,aAAa,KAAK,eAAe,MAAM,QAAQ,2BAA2B;AAAA,UAC1G;AAAA,QACF;AACA,YAAI,OAAQ;AAAA,MACd;AACA,UAAI,CAAC,QAAQ;AACX,iBAAS,KAAK,EAAE,OAAO,IAAI,IAAI,QAAQ,MAAM,QAAQ,WAAW,QAAQ,wBAAwB,CAAC;AACjG;AAAA,MACF;AAEA,YAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,aAAO,SAAS;AAChB,aAAO,qBAAqB;AAAA,QAC1B,OAAO,OAAO;AAAA,QACd,SAAS,6CAA6C,OAAO,KAAK;AAAA,QAClE,aAAa;AAAA,UACX,SAAS,4DAA4D,OAAO,KAAK;AAAA,UACjF,wBAAwB;AAAA,YACtB;AAAA,cACE,OAAO,OAAO;AAAA,cACd,SAAS;AAAA,cACT,aAAa,OAAO,eAAe;AAAA,cACnC,QAAQ,OAAO,UAAU;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO,sBAAsB;AAC7B,aAAO,eAAe;AACtB,aAAO,kBAAkB;AACzB,iBAAW,IAAI,IAAI,MAAM;AACzB,eAAS,KAAK;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,aAAa,OAAO,eAAe;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,SAAS;AAC7B;;;AN3OO,IAAM,+BAA+B,KAAK,KAAK;AAiBtD,SAAS,yBAAkC;AACzC,SAAO,QAAQ,IAAI,4BAA4B;AACjD;AAOO,SAAS,wBAAqD;AACnE,QAAM,oBAAoB,wBAAwB;AAClD,MAAI,uBAAuB,GAAG;AAC5B,UAAMC,6BAA4B,oCAAoC;AACtE,UAAMC,yBAAwB,8BAA8B;AAC5D,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,eAAe,kBAAkB;AAAA,MACjC;AAAA,MACA,2BAAAD;AAAA,MACA,uBAAAC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAA0C,CAAC;AACjD,QAAM,MAAM,KAAK,IAAI;AAErB,aAAW,OAAO,eAAe,GAAG;AAClC,eAAW,QAAQ,mBAAmB,GAAG,GAAG;AAC1C,YAAM,aAAaC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAC3F,YAAM,SAAS,SAA0C,YAAY,MAAS;AAC9E,UAAI,CAAC,UAAU,OAAO,WAAW,WAAW;AAC1C,iBAAS,KAAK;AAAA,UACZ,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ,SAAS,oBAAoB,OAAO,MAAM,KAAK;AAAA,QACzD,CAAC;AACD;AAAA,MACF;AAEA,YAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,UAAI,OAAO,aAAa;AACtB,YAAI,OAAO,WAAW,WAAW;AAC/B,gBAAM,aACJ,OAAO,UAAU,UAAU,YACvB,YACA,OAAO,UAAU,UAAU,UAAU,OAAO,WAAW,SACrD,SACA;AACR,iBAAO,SAAS;AAChB,iBAAO,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC7C,iBAAO,kBAAkB;AACzB,qBAAW,IAAI,IAAI,MAAM;AACzB,mBAAS,KAAK;AAAA,YACZ,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,OAAO;AAAA,UACjB,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK,EAAE,OAAO,IAAI,IAAI,QAAQ,MAAM,QAAQ,WAAW,QAAQ,uBAAuB,CAAC;AAAA,QAClG;AACA;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,OAAO;AACjB,cAAM,aACJ,OAAO,UAAU,UAAU,YAAY,YAAY,OAAO,WAAW,SAAS,SAAS;AACzF,eAAO,SAAS;AAChB,eAAO,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC7C,eAAO,kBAAkB,OAAO,UAAU;AAC1C,mBAAW,IAAI,IAAI,MAAM;AACzB,iBAAS,KAAK;AAAA,UACZ,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ,OAAO,UAAU;AAAA,QAC3B,CAAC;AACD;AAAA,MACF;AAIA,UAAI,OAAO,UAAU,UAAU,WAAW,OAAO,OAAO,WAAW,OAAO,GAAG,GAAG;AAC9E,cAAM,OAAO,OAAO,kBAAkB,KAAK,MAAM,OAAO,eAAe,IAAI;AAC3E,cAAM,QAAQ,OAAO,iBAAiB,KAAK,MAAM,OAAO,cAAc,IAAI;AAC1E,cAAM,UACJ,CAAC,OAAO,SAAS,IAAI,KAAK,MAAM,OAAO;AACzC,cAAM,WAAW,OAAO,SAAS,KAAK,KAAK,MAAM,QAAQ;AACzD,YAAI,WAAW,UAAU;AACvB,4BAAkB,OAAO,KAAK,SAAS;AACvC,iBAAO,SAAS;AAChB,iBAAO,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC7C,iBAAO,kBAAkB,4BAA4B,OAAO,UAAU,MAAM;AAC5E,qBAAW,IAAI,IAAI,MAAM;AACzB,mBAAS,KAAK;AAAA,YACZ,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,OAAO,UAAU;AAAA,UAC3B,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAEA,eAAS,KAAK;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,OAAO,UAAU;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,4BAA4B,oCAAoC;AACtE,QAAM,wBAAwB,8BAA8B;AAC5D,SAAO,EAAE,SAAS,UAAU,eAAe,kBAAkB,GAAG,mBAAmB,2BAA2B,sBAAsB;AACtI;AAOO,SAAS,mBAAyB;AACvC,QAAM,SAAS,sBAAsB;AACrC,QAAM,eAAe,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE;AAChF,QAAM,cAAc,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,EAAE;AAC9E,QAAM,UAAU,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AACrE,QAAM,iBAAiB,OAAO,kBAAkB,QAAQ,OAA+B,CAAC,KAAK,QAAQ;AACnG,QAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;AAC3C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,QAAM,yBAAyB,OAAO,0BAA0B,QAAQ,OAA+B,CAAC,KAAK,QAAQ;AACnH,QAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;AAC3C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,QAAM,qBAAqB,OAAO,kBAAkB,qBAAqB,KAAK,OAE5E,CAAC,KAAK,QAAQ;AACd,QAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;AAC3C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,QAAM,gBAAgB,OAAO,sBAAsB,QAAQ,OAA+B,CAAC,KAAK,QAAQ;AACtG,QAAI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;AAC3C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,SAAS,EAAE,cAAc,aAAa,SAAS,OAAO,OAAO,QAAQ,OAAO;AAAA,QAC5E,mBAAmB;AAAA,UACjB,QAAQ;AAAA,UACR,OAAO,OAAO,kBAAkB,QAAQ;AAAA,UACxC,sBAAsB;AAAA,YACpB,QAAQ;AAAA,YACR,OAAO,OAAO,kBAAkB,qBAAqB,KAAK;AAAA,UAC5D;AAAA,QACF;AAAA,QACA,2BAA2B;AAAA,UACzB,QAAQ;AAAA,UACR,OAAO,OAAO,0BAA0B,QAAQ;AAAA,QAClD;AAAA,QACA,uBAAuB;AAAA,UACrB,QAAQ;AAAA,UACR,OAAO,OAAO,sBAAsB,QAAQ;AAAA,QAC9C;AAAA,QACA,eAAe,OAAO,cAAc;AAAA,QACpC,SAAS;AAAA,UACP,SAAS,OAAO;AAAA,UAChB,mBAAmB,OAAO,kBAAkB;AAAA,UAC5C,2BAA2B,OAAO,0BAA0B;AAAA,UAC5D,uBAAuB,OAAO,sBAAsB;AAAA,UACpD,sBAAsB,OAAO,kBAAkB,qBAAqB;AAAA,UACpE,eAAe,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AD7MA;AACA;AA8CA,SAAS,oBAAoB,eAA2C;AACtE,MAAI,CAAC,iBAAiB,CAACC,aAAW,aAAa,EAAG,QAAO;AACzD,MAAI;AACF,WAAOC,eAAa,eAAe,MAAM,EAAE,KAAK,EAAE;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,KAAuB,YAA2C;AACxF,QAAM,aAAaC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,UAAU,GAAG,aAAa;AACjG,QAAM,SAAS,SAA0C,YAAY,MAAS;AAC9E,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACrB;AAAA,EACF;AACA,QAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,QAAM,mBAAmB,oBAAoB,OAAO,aAAa,MAAM;AACvE,QAAM,qBAAqB,CAAC,OAAO,eAAe,CAAC,OAAO;AAC1D,QAAM,oBACJ,OAAO,OAAO,sBAAsB,YAAY,OAAO,kBAAkB,SAAS;AACpF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,cAAc,OAAO;AAAA,IACrB,WAAW,OAAO,UAAU;AAAA,IAC5B,iBAAiB,OAAO,UAAU;AAAA,IAClC;AAAA,IACA;AAAA,IACA,gBAAgB,6BAA6B,MAAM;AAAA,IACnD;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,OAIJ;AAC/B,MAAI,MAAM,kBAAkB,EAAG,QAAO;AACtC,MAAI,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAG,QAAO;AAC3D,MAAI,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,cAAc,EAAG,QAAO;AACxD,SAAO;AACT;AAEA,SAAS,sBACP,SACmD;AACnD,QAAM,OAAgD;AAAA,IACpD,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,IAAI;AAAA,EACN;AACA,MAAI,OAAgC;AACpC,MAAI;AACJ,aAAW,KAAK,SAAS;AACvB,UAAM,QAAQ,EAAE;AAChB,SAAK,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI,KAAK,IAAI;AAC3C,aAAO;AACP,eAAS,EAAE;AAAA,IACb;AAAA,EACF;AACA,SAAO,EAAE,WAAW,MAAM,iBAAiB,OAAO;AACpD;AAEA,SAAS,iBAAiB,KAA+B;AACvD,MAAI,OAAO;AACX,aAAW,QAAQ,mBAAmB,GAAG,GAAG;AAC1C,UAAM,aAAaA,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAC3F,UAAM,SAAS,SAA0C,YAAY,MAAS;AAC9E,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,QAAI,OAAO,SAAS,CAAC,OAAO,YAAa,SAAQ;AAAA,EACnD;AACA,SAAO;AACT;AAEO,SAAS,mBAAiC;AAC/C,wBAAsB;AACtB,SAAO,eAAe,EAAE,IAAI,CAAC,QAAQ;AACnC,UAAM,cAAc,mBAAmB,GAAG;AAC1C,UAAM,UAAU,YAAY,IAAI,CAAC,SAAS,eAAe,KAAK,IAAI,CAAC;AACnE,UAAM,0BAA0B,QAAQ,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC7F,UAAM,4BAA4B,QAAQ,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACjG,UAAM,wBAAwB,QAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACzF,UAAM,2BAA2B,QAAQ,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAC/F,UAAM,EAAE,WAAW,gBAAgB,IAAI,sBAAsB,OAAO;AACpE,UAAM,kBAAkB,iBAAiB,GAAG;AAC5C,UAAM,kBAAkB;AAAA,MACtB,IAAI;AAAA,MACJ,QAAQ,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,QAAQ,EAAE,aAAa,EAAE;AAAA,IACzE;AACA,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,MAAM,IAAI;AAAA,MACV,QAAQ,IAAI;AAAA,MACZ;AAAA,MACA,MAAM,IAAI;AAAA,MACV,WAAW,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,uBAAuB,4BAA4B,EAAE,KAAK,SAAS,gBAAgB,CAAC;AAAA,MACpF,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAGO,SAAS,cAAoB;AAClC,UAAQ,IAAI,KAAK,UAAU,iBAAiB,GAAG,MAAM,CAAC,CAAC;AACzD;;;AD5KA;AAIA,SAAS,qBAAqB,MAAgD;AAC5E,QAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AACpE,MAAI,SAAU,QAAO;AACrB,QAAM,WAAW,mBAAmB;AACpC,MAAI,SAAU,QAAO,SAAS;AAC9B,WAAS,IAAI,sEAAsE;AACnF,SAAO;AACT;AAUO,SAAS,UAAU,MAAwD;AAChF,QAAM,OAAO,aAAa,qBAAqB,IAAI,CAAC;AACpD,gBAAc,IAAI;AAClB,QAAM,KAAK,KAAK,KAAK,cAAc,OAAO,KAAK,EAAE,CAAC,IAAI,cAAc,OAAO,KAAK,QAAQ,KAAK,CAAC;AAC9F,QAAM,MAAM,aAAa,EAAE;AAC3B,MAAIC,aAAW,GAAG,EAAG,YAAW,uBAAuB,EAAE,EAAE;AAC3D,EAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAM,OAAO,OAAO,KAAK,QAAQ,aAAa;AAC9C,QAAM,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,EAAE,KAAK;AACvD,QAAM,MAAM;AAAA,IACV;AAAA,IACA,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,SAAS,CAAC;AAAA,EACZ;AACA,YAAUC,OAAK,KAAK,KAAK,UAAU,GAAG,GAAG;AACzC,QAAM,OAAuB,EAAE,OAAO,IAAI,QAAQ,KAAK,MAAM,MAAM,WAAW;AAC9E,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC,SAAO;AACT;AAEO,SAAS,WAAiB;AAC/B,cAAY;AACd;AAEA,SAAS,WAAW,SAAwB;AAC1C,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAChB;;;AS1DA;AAGO,SAAS,wBAAwB,SAAoC;AAC1E,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,iBAAiB;AAC9B,SAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,QAAQ,IAAI,WAAW,WAAW,KAAK;AAChF;AAEO,SAAS,qBAAqB,MAA8C;AACjF,QAAM,OAAO,OAAO,SAAS,OAAO,KAAK,QAAQ,EAAE,GAAG,QAAQ,CAAC;AAC/D,QAAM,MAAM,wBAAwB,IAAI;AACxC,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,QACA,QAAQ,KAAK,UAAU;AAAA,QACvB,iBAAiB,KAAK,mBAAmB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AtByNA;;;AuBlPA;AADA,OAAOC,YAAU;AAGjB;AACA;AACA;AAMA,eAAsB,SAAS,MAAiF;AAC9G,QAAM,WAAW,KAAK,aAAa,QAAQ,KAAK,aAAa;AAC7D,MAAI;AACF,UAAM,MAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;AACrE,UAAM,YAAY,OAAO,SAAS,OAAO,KAAK,aAAa,EAAE,GAAG,eAAe,CAAC;AAChF,UAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,UAAM,SAAS,MAAM,8BAA8B,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,WAAW,EAAE,SAAS,KAAK,CAAC;AAC9H,UAAM,WAAW,6BAA6B,EAAE,OAAO,IAAI,GAAG,CAAC,EAAE;AACjE,UAAM,oBAAoB,MAAM,4BAA4B,EAAE,KAAK,IAAI,IAAI,WAAW,GAAG,KAAK,GAAG,WAAW;AAE5G,UAAM,uBAAuD,CAAC;AAC9D,eAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,YAAM,SAAS;AAAA,QACbC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,QACxE;AAAA,MACF;AACA,UAAI,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,OAAO,OAAQ;AACrD,YAAM,SAAS,oBAAoB,MAAM;AACzC,UAAI,OAAO,MAAO;AAClB,UAAI,OAAO,eAAe,OAAO,qBAAsB;AAEvD,YAAM,aAAa,mCAAmC;AAAA,QACpD,OAAO,IAAI;AAAA,QACX,kBAAkB,OAAO,cAAc;AAAA,QACvC;AAAA,MACF,CAAC;AAED,YAAM,aAAa,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,OAAO,OAAO,MAAM,CAAC,CAAC;AACjI,UAAI;AACJ,UAAI;AACF,kBAAU,MAAM,8BAA8B,YAAY,QAAQ,EAAE,WAAW,WAAW,GAAG,EAAE,WAAW,SAAS,KAAK,CAAC;AAAA,MAC3H,SAAS,QAAQ;AACf,kBAAU,EAAE,IAAI,OAAO,OAAQ,OAAiB,QAAQ;AAAA,MAC1D;AACA,2BAAqB,KAAK;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,KAAK,OAAO;AAAA,QACZ,UAAU,QAAQ,OAAO,QAAS,QAAQ,UAAsC,OAAO;AAAA,QACvF,UAAU,QAAQ,YAAY;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAC3E,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,8BAA8B,SAAS,QAAQ;AAAA,QAC1D;AAAA,QACA,GAAI,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,YAAY,UAAa,KAAK,YAAY,OAC5E,EAAE,SAAS,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC,EAAE,IAC5C,CAAC;AAAA,MACP,GAAG,EAAE,WAAW,SAAS,KAAK,CAAC;AAAA,IACjC,SAAS,SAAS;AAChB,aAAO,EAAE,IAAI,OAAO,OAAQ,QAAkB,QAAQ;AAAA,IACxD;AAEA,UAAM,UAAU,EAAE,OAAO,IAAI,IAAI,WAAW,mBAAmB,sBAAsB,MAAM,KAAK,YAAY,KAAK;AACjH,QAAI,SAAU,QAAO,EAAE,IAAI,MAAM,GAAG,QAAQ;AAC5C,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,EAC9C,SAAS,OAAO;AACd,QAAI,SAAU,QAAO,EAAE,IAAI,OAAO,OAAQ,MAAgB,QAAQ;AAClE,YAAQ,MAAM,qBAAsB,MAAgB,OAAO,EAAE;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AvBoLA;AAQA;AAgBA;;;AwBrRA;AAFA,SAAS,cAAAC,cAAY,eAAAC,cAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;;;ACDjB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,cAAAC,cAAY,eAAAC,cAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;AAEjB,IAAM,wBAAwB;AAE9B,SAAS,qBAAqB,MAAc,YAAY,uBAAsC;AAC5F,MAAI,CAACH,aAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,MAAMD,cAAa,MAAM,CAAC,OAAO,IAAI,GAAG;AAAA,MAC5C,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC;AACD,UAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC;AACvC,UAAM,QAAQ,OAAO,KAAK;AAC1B,WAAO,OAAO,SAAS,KAAK,KAAK,SAAS,IAAI,QAAQ;AAAA,EACxD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,mBAAmB,MAAc,aAAa,KAAuB;AACnF,MAAI,CAACC,aAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,UAAU,qBAAqB,IAAI;AACzC,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,QAAQ;AACZ,MAAI,OAAO;AACX,QAAM,QAAkB,CAAC,IAAI;AAC7B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI;AACJ,QAAI;AACF,gBAAUC,aAAY,OAAO;AAAA,IAC/B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,SAAS;AAC1B,UAAI,SAAS,WAAY,QAAO;AAChC,YAAM,OAAOE,OAAK,KAAK,SAAS,IAAI;AACpC,UAAI;AACJ,UAAI;AACF,aAAKD,UAAS,IAAI;AAAA,MACpB,QAAQ;AACN;AAAA,MACF;AACA,UAAI,GAAG,YAAY,EAAG,OAAM,KAAK,IAAI;AAAA,UAChC,UAAS,GAAG;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;;;ADxBO,SAAS,uBAAuB,OAAoB,CAAC,GAA2B;AACrF,QAAM,cAAc,qBAAqB,KAAK,eAAe,mBAAmB,CAAC;AACjF,QAAM,eAAe,oBAAoB,WAAW;AACpD,QAAM,MAAM,KAAK,OAAO,KAAK,IAAI;AACjC,QAAM,YAAY,IAAI,KAAK,GAAG,EAAE,YAAY;AAE5C,MAAI,CAACE,aAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAA4B;AAChC,MAAI,WAAW;AACf,MAAI,cAAc;AAClB,MAAI,WAA0B;AAE9B,MAAI;AACJ,MAAI;AACF,cAAUC,aAAY,cAAc,EAAE,eAAe,KAAK,CAAC;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,SAAS;AAC9B,QAAI,CAAC,SAAS,YAAY,EAAG;AAC7B,gBAAY;AACZ,UAAM,UAAUC,OAAK,KAAK,cAAc,SAAS,IAAI;AACrD,QAAI;AACF,YAAM,KAAKC,UAAS,OAAO;AAC3B,iBAAW,aAAa,OAAO,GAAG,UAAU,KAAK,IAAI,UAAU,GAAG,OAAO;AAAA,IAC3E,QAAQ;AAAA,IAER;AACA,QAAI;AACF,iBAAW,eAAeF,aAAY,SAAS,EAAE,eAAe,KAAK,CAAC,GAAG;AACvE,YAAI,YAAY,YAAY,EAAG,gBAAe;AAAA,MAChD;AAAA,IACF,QAAQ;AAAA,IAER;AACA,QAAI,eAAe,QAAQ,KAAK,mBAAmB,MAAM;AACvD,YAAM,MAAM,KAAK,kBAAkB;AACnC,UAAI,OAAO,GAAG;AACZ,qBAAa;AAAA,MACf,OAAO;AACL,cAAM,WAAW,mBAAmB,SAAS,GAAG;AAChD,YAAI,aAAa,KAAM,cAAa;AAAA,YAC/B,eAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,aAAa,aAAa,OAAO,OAAO,IAAI,KAAK,QAAQ,EAAE,YAAY;AAAA,IACvE;AAAA,EACF;AACF;;;AEzGA;AAFA,OAAOG,YAAU;;;ACGjB;AAHA,OAAOC,YAAU;;;ACAjB;AACA;;;ACAO,IAAM,qCAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,uBAAuB,UAA2B;AAChE,QAAM,aAAa,SAAS,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAClE,MAAI,eAAe,kBAAkB,WAAW,WAAW,eAAe,EAAG,QAAO;AACpF,aAAW,OAAO,oCAAoC;AACpD,QAAI,eAAe,OAAO,WAAW,WAAW,GAAG,GAAG,GAAG,EAAG,QAAO;AAAA,EACrE;AACA,SAAO;AACT;;;ACjBO,SAASC,yBAAwB,cAAkC;AACxE,SAAO,aAAa,OAAO,CAAC,SAAS;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,WAAW,QAAQ,WAAW,IAAI,IACpC,QAAQ,MAAM,CAAC,EAAE,KAAK,IACtB,QAAQ,SAAS,IACf,QAAQ,MAAM,CAAC,EAAE,KAAK,IACtB;AACN,WAAO,CAAC,uBAAuB,QAAQ;AAAA,EACzC,CAAC;AACH;;;ACTO,SAAS,qBAAqB,aAAqC;AACxE,MAAI,OAAO,gBAAgB,UAAU;AACnC,UAAM,QAAQ,YAAY,MAAM,2CAA2C;AAC3E,WAAO,QAAQ,CAAC,KAAK;AAAA,EACvB;AACA,MAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,UAAM,MAAM;AACZ,eAAW,OAAO,CAAC,SAAS,UAAU,gBAAgB,GAAG;AACvD,YAAM,QAAQ,IAAI,GAAG;AACrB,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAG,QAAO,MAAM,KAAK;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AACT;AASO,SAAS,mBAAmB,QAAyC;AAC1E,QAAM,WAAW,OAAO,aAAa;AACrC,MAAI,aAAa,YAAY,aAAa,UAAU;AAClD,WAAOC,yBAAwB,OAAO,YAAY,EAAE,SAAS;AAAA,EAC/D;AACA,MAAI,qBAAqB,OAAO,WAAW,EAAG,QAAO;AACrD,MAAI,aAAa,WAAW,aAAa,WAAY,QAAO;AAC5D,MAAI,OAAO,aAAa,SAAS,KAAK,OAAO,YAAa,QAAO;AACjE,SAAO;AACT;;;AH5BA;AAGO,SAAS,sBAAsB,OAAgD;AACpF,MAAI,CAAC,MAAM,QAAQ;AACjB,UAAM,SAAS,oBAAoB,MAAM,QAAQ;AAAA,MAC/C,MAAM,MAAM,IAAI;AAAA,MAChB,YAAY,MAAM,IAAI;AAAA,IACxB,CAAC;AAAA,EACH;AACA,SAAO,MAAM;AACf;AAMO,SAAS,kCACd,OACA,gBACS;AACT,MAAI,MAAM,QAAQ;AAChB,WAAOC,yBAAwB,MAAM,OAAO,YAAY,EAAE,SAAS;AAAA,EACrE;AACA,QAAM,YAAY,iBACd,eAAe,UAAU,MAAM,YAAY,IAC3C,eAAe,MAAM,YAAY;AACrC,SAAOA,yBAAwB,SAAS,EAAE,SAAS;AACrD;AAEA,SAAS,0BAA0B,OAAiC;AAClE,QAAM,WAAW,MAAM,OAAO,oBAAoB;AAClD,MAAI,aAAa,UAAa,aAAa,KAAM,QAAO;AACxD,MAAI,MAAM,OAAO,WAAW;AAC1B,WAAO,EAAE,OAAO,MAAM,OAAO,UAAU;AAAA,EACzC;AACA,SAAO;AACT;AAMO,SAAS,2BACd,OACA,KACwB;AACxB,MAAI,MAAM,OAAQ,QAAO,MAAM;AAE/B,QAAM,SAAS,MAAM;AACrB,QAAM,yBACJ,OAAO,OAAO,yBAAyB,YAAY,OAAO,qBAAqB,KAAK,EAAE,SAAS;AACjG,QAAM,qBACJ,QAAQ,OAAO,UAAU,CAAC,QAAQ,UAAU,WAAW,UAAU,WAAW,EAAE,SAAS,OAAO,MAAM,CAAC,KACrG;AACF,QAAM,cAAc,0BAA0B,KAAK;AAEnD,MAAI,sBAAsB,CAAC,WAAW,OAAO,GAAG,GAAG;AACjD,UAAM,eAAe,KAAK,iBACtB,IAAI,eAAe,UAAU,MAAM,YAAY,IAC/C,eAAe,MAAM,YAAY;AACrC,UAAM,YAAY,MAAM,IAAI,YAAY,KAAK,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;AAC5E,UAAM,QAAQ,KAAK,aAAa,iBAAiB,MAAM,cAAc,SAAS;AAC9E,UAAM,cACJ,UAAU,IACN;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,IACA,mBAAmB,MAAM,cAAc;AAAA,MACrC,MAAM,MAAM,IAAI;AAAA,MAChB,YAAY,MAAM,IAAI;AAAA,IACxB,CAAC;AACP,UAAM,SAAS;AAAA,MACb,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ,OAAO,WAAW,yBAAyB,SAAS;AAAA,MAC5D,WAAW,EAAE,OAAO,yBAAyB,SAAS,QAAQ;AAAA,MAC9D,QAAQ,OAAO;AAAA,MACf,cAAc,MAAM;AAAA,MACpB,YAAY,OAAO;AAAA,MACnB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,gBAAgB,OAAO,wBAAwB;AAAA,MAC/C,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,sBAAsB;AAAA,MACtB,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBACE,OAAO,OAAO,sBAAsB,WAAW,OAAO,kBAAkB,KAAK,KAAK,OAAO;AAAA,MAC3F,OAAO,OAAO,qBAAqB,OAAO,aAAa,qBAAqB,WAAW;AAAA,IACzF;AACA,UAAM,SAAS;AACf,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,KAAK;AACpC;;;ADxGA;;;AKVA;;;ACDA;AAGA;AAGO,SAAS,wBACd,QACA,MAAM,KAAK,IAAI,GACf,WAAW,+BACF;AACT,QAAM,YAAY,eAAe,OAAO,aAAa;AACrD,MAAI,CAAC,UAAU,gBAAiB,QAAO;AACvC,QAAM,MAAM,MAAM,KAAK,MAAM,UAAU,eAAe;AACtD,SAAO,OAAO,SAAS,GAAG,KAAK,OAAO,KAAK,MAAM;AACnD;AAOO,SAAS,2BACd,QACA,MAAM,KAAK,IAAI,GACf,WAAW,+BACF;AACT,MAAI,WAAW,OAAO,GAAG,EAAG,QAAO;AACnC,SAAO,wBAAwB,QAAQ,KAAK,QAAQ;AACtD;;;ADdA,SAAS,kBACP,SACA,KACe;AACf,MAAI,IAAK,QAAO,IAAI,iBAAiB,OAAO,QAAQ,GAAG;AACvD,SAAO,wBAAwB,QAAQ,GAAG;AAC5C;AAGO,SAAS,oBAAoB,SAA0B,MAAM,KAAK,IAAI,GAAY;AACvF,SAAO,2BAA2B,QAAQ,QAAQ,GAAG;AACvD;AAMO,SAAS,iBACd,SACA,KACS;AACT,MAAI,sBAAsB,IAAI,QAAQ,IAAI,MAAM,EAAG,QAAO;AAC1D,SAAO,kBAAkB,SAAS,GAAG,MAAM;AAC7C;AAMO,SAAS,yBACd,SACA,KACA,MAAM,KAAK,IAAI,GACN;AACT,MAAI,oBAAoB,SAAS,GAAG,EAAG,QAAO;AAC9C,MAAI,sBAAsB,IAAI,QAAQ,IAAI,MAAM,EAAG,QAAO;AAC1D,MAAI,iBAAiB,SAAS,GAAG,EAAG,QAAO;AAC3C,QAAM,SAAS,sBAAsB,OAAO;AAC5C,MAAI,CAAC,uBAAuB,MAAM,GAAG;AAEnC,QAAI,CAAC,oBAAoB,SAAS,GAAG,EAAG,QAAO;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AE5DA;AAMA;AAUO,SAAS,uCACd,SACA,QACS;AACT,QAAM,UACJ,OAAO,QAAQ,OAAO,sBAAsB,WAAW,QAAQ,OAAO,kBAAkB,KAAK,IAAI;AACnG,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,oBAAoB,OAAO,EAAG,QAAO;AAEzC,QAAM,WAAW,UAAU,sBAAsB,OAAO;AACxD,MAAI,CAAC,uBAAuB,QAAQ,EAAG,QAAO;AAC9C,MAAI,mBAAmB,QAAQ,EAAG,QAAO;AACzC,MAAIC,yBAAwB,SAAS,YAAY,EAAE,SAAS,EAAG,QAAO;AAEtE,QAAM,UAAU,oBAAoB;AAAA,IAClC,aAAa,SAAS;AAAA,IACtB,cAAc,SAAS;AAAA,IACvB,aAAa,SAAS;AAAA,IACtB,OAAO,qBAAqB,SAAS,WAAW;AAAA,EAClD,CAAC;AACD,MAAI,QAAQ,QAAS,QAAO;AAE5B,SAAO;AACT;;;ACnCA;AAEA;AANA,SAAS,cAAAC,cAAY,aAAAC,YAAW,iBAAAC,sBAAqB;AACrD,OAAOC,YAAU;AAwBV,SAAS,mBACd,aACA,OACA,YACQ;AACR,SAAOA,OAAK,KAAK,aAAa,WAAW,SAAS,KAAK,GAAG,SAAS,UAAU,CAAC;AAChF;AAEO,SAAS,mBAAmB,OAIvB;AACV,SAAOH,aAAWG,OAAK,KAAK,mBAAmB,MAAM,aAAa,MAAM,OAAO,MAAM,UAAU,GAAG,eAAe,CAAC;AACpH;AAGO,SAAS,6BAA6B,OAMX;AAChC,QAAM,MAAM,mBAAmB,MAAM,aAAa,MAAM,QAAQ,OAAO,MAAM,QAAQ,UAAU;AAC/F,EAAAF,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAM,YAAYE,OAAK,KAAK,KAAK,eAAe;AAChD,MAAI,aAAa;AACjB,MAAIH,aAAW,MAAM,QAAQ,YAAY,GAAG;AAC1C,UAAM,OAAO,WAAW,MAAM,QAAQ,cAAc,CAAC,QAAQ,MAAM,CAAC;AACpE,UAAM,SAAS,WAAW,MAAM,QAAQ,cAAc,CAAC,QAAQ,UAAU,CAAC;AAC1E,UAAM,QAAQ,CAAC,KAAK,QAAQ,OAAO,MAAM,EAAE,OAAO,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI;AACpF,QAAI,MAAM,KAAK,GAAG;AAChB,MAAAE,eAAc,WAAW,MAAM,SAAS,IAAI,IAAI,QAAQ,GAAG,KAAK;AAAA,CAAI;AACpE,mBAAa;AAAA,IACf;AAAA,EACF;AACA,QAAME,UAAwC;AAAA,IAC5C,YAAY,IAAI,KAAK,MAAM,OAAO,KAAK,IAAI,CAAC,EAAE,YAAY;AAAA,IAC1D,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM,QAAQ;AAAA,IACrB,YAAY,MAAM,QAAQ;AAAA,IAC1B,cAAc,MAAM,QAAQ;AAAA,IAC5B,QAAQ,MAAM,QAAQ,OAAO;AAAA,IAC7B,WAAW,MAAM,QAAQ,OAAO;AAAA,IAChC,QAAQ,MAAM,QAAQ,OAAO;AAAA,IAC7B,mBAAmB,MAAM,QAAQ,OAAO;AAAA,IACxC,aAAa,MAAM,OAAO;AAAA,IAC1B,cAAc,MAAM,OAAO;AAAA,IAC3B,aAAa,MAAM,OAAO;AAAA,IAC1B,OAAO,MAAM,OAAO,SAAS;AAAA,IAC7B,GAAI,aAAa,EAAE,UAAU,IAAI,CAAC;AAAA,EACpC;AACA,EAAAF,eAAcC,OAAK,KAAK,KAAK,eAAe,GAAG,GAAG,KAAK,UAAUC,SAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AACrF,SAAOA;AACT;;;AR7BA,IAAM,gCAAgC,oBAAI,IAAuB;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,4BAA4B,OAOzB;AACV,MAAI,CAAC,8BAA8B,IAAI,MAAM,UAAU,EAAG,QAAO;AACjE,MAAI,oBAAoB,MAAM,SAAS,MAAM,GAAG,EAAG,QAAO;AAC1D,MACE,mBAAmB;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM,QAAQ;AAAA,IACrB,YAAY,MAAM,QAAQ;AAAA,EAC5B,CAAC,GACD;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,qBAAsB,QAAO;AACxC,+BAA6B;AAAA,IAC3B,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM;AAAA,IACd,KAAK,MAAM;AAAA,EACb,CAAC;AACD,SAAO;AACT;AAIA,SAAS,uBAAuB,OAAmC;AACjE,QAAM,EAAE,SAAS,gBAAgB,gBAAgB,uBAAuB,IAAI;AAC5E,MAAI,CAAC,QAAS,QAAO,iBAAiB,yBAAyB;AAC/D,MAAI,sBAAsB,IAAI,QAAQ,IAAI,MAAM,GAAG;AACjD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,iBAAiB,SAAS,MAAM,QAAQ,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,MACE,MAAM,YACN,uBAAuB,2BAA2B,SAAS,MAAM,QAAQ,CAAC,KAC1E,CAAC,oBAAoB,OAAO,GAC5B;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAASC,oBAAmB,OAA2B,SAAyC;AAC9F,MAAI,MAAM,aAAa,KAAK,EAAG,QAAOC,OAAK,QAAQ,MAAM,WAAW;AACpE,QAAM,YAAY,QAAQ,OAAO;AACjC,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,aAAa,GAAGA,OAAK,GAAG,OAAOA,OAAK,GAAG;AAC7C,QAAM,MAAM,UAAU,QAAQ,UAAU;AACxC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,UAAU,MAAM,GAAG,MAAM,WAAW,SAAS,CAAC;AACvD;AAEO,SAAS,oBAAoB,OAAqD;AACvF,QAAM,EAAE,SAAS,gBAAgB,gBAAgB,OAAO,cAAc,qBAAqB,IACzF;AACF,QAAM,MAAM,MAAM,OAAO,KAAK,IAAI;AAClC,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,eAAgB,QAAO;AAC5B,WAAO,gBAAgB;AAAA,EACzB;AAIA,QAAM,iBAAiB,uBAAuB,KAAK;AACnD,MAAI,kBAAkB,KAAK,CAAC,kBAAkB,kBAAkB,EAAG,QAAO;AAC1E,MAAI,iBAAiB,KAAK,QAAQ,eAAgB,QAAO;AACzD,MAAI,oBAAoB,SAAS,GAAG,EAAG,QAAO;AAE9C,QAAM,SAAS,2BAA2B,SAAS,MAAM,QAAQ;AACjE,QAAM,qBAAqBD,oBAAmB,OAAO,OAAO;AAE5D,QAAM,iBAAiB,CAAC,eAA4D;AAClF,QACE,sBACA,4BAA4B;AAAA,MAC1B;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,sBAAsB,MAAM,yBAAyB;AAAA,IACvD,CAAC,GACD;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,uCAAuC,SAAS,MAAM,GAAG;AAC3D,UAAM,UAAU,eAAe,oBAAoB;AACnD,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,MAAI,kCAAkC,SAAS,MAAM,UAAU,cAAc,GAAG;AAC9E,UAAM,UAAU,eAAe,gBAAgB;AAC/C,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,QAAM,QAAQ,MAAM,UAAU,aAAa,iBAAiB,MAAM,YAAY;AAC9E,MAAI,UAAU,QAAQ,UAAU,UAAa,QAAQ,GAAG;AACtD,UAAM,UAAU,eAAe,wBAAwB;AACvD,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,MAAI,yBAAyB,SAAS,MAAM,UAAU,GAAG,EAAG,QAAO;AACnE,MAAI,CAAC,uBAAuB,MAAM,EAAG,QAAO;AAC5C,MAAI,mBAAmB,MAAM,GAAG;AAC9B,UAAM,UAAU,eAAe,wBAAwB;AACvD,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,MAAIE,yBAAwB,OAAO,YAAY,EAAE,SAAS,GAAG;AAC3D,UAAM,UAAU,eAAe,gBAAgB;AAC/C,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,QAAM,UAAU,oBAAoB;AAAA,IAClC,aAAa,OAAO;AAAA,IACpB,cAAc,OAAO;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB,OAAO,qBAAqB,OAAO,WAAW;AAAA,EAChD,CAAC;AACD,MAAI,QAAQ,SAAS;AACnB,UAAM,UAAU,eAAe,iBAAiB;AAChD,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,MAAI,wBAAwB,MAAM,cAAc;AAC9C,UAAM,UAAU,qBAAqB;AAAA,MACnC,cAAc,MAAM;AAAA,MACpB,SAAS,QAAQ,OAAO;AAAA,MACxB,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IACnB,CAAC;AACD,QAAI,SAAS;AACX,aAAO,QAAQ,SAAS,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,IAAI,QAAQ;AAAA,IACvF;AAAA,EACF;AACA,SAAO;AACT;AAqBO,SAAS,2BAA2B,OAA4D;AACrG,QAAM,EAAE,SAAS,kBAAkB,OAAO,cAAc,qBAAqB,aAAa,IACxF;AACF,MAAI,CAAC,gBAAgB,QAAQ,iBAAkB,QAAO;AACtD,MAAI,oBAAoB,IAAID,OAAK,QAAQ,YAAY,CAAC,EAAG,QAAO;AAChE,MAAI,WAAW,oBAAoB,OAAO,EAAG,QAAO;AACpD,MAAI,WAAW,kCAAkC,SAAS,MAAM,cAAc,GAAG;AAC/E,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,sBAAsB,OAA4D;AAChG,SAAO,2BAA2B,KAAK;AACzC;;;ASrFO,IAAM,8BAA8B,IAAI,KAAK,KAAK;AAGlD,IAAM,2BAA2B,IAAI,KAAK,KAAK,KAAK;AAGpD,IAAM,oCAAoC;AAG1C,IAAM,iCAAiC,KAAK,KAAK;AAGjD,IAAM,gCAAgC;AAEtC,IAAM,kCAAkC;;;AClK/C,IAAM,oBAAoB,oBAAI,IAAuB;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,0BACd,SACA,OACqE;AACrE,QAAM,MAA2E,CAAC;AAClF,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,OAAO,CAACE,QAAc,QAA2B,WAAoB;AACzE,UAAM,MAAM,GAAGA,MAAI,KAAK,MAAM;AAC9B,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,gCAAiC;AACpE,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,EAAE,MAAAA,QAAM,QAAQ,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,EAC1D;AAEA,aAAWC,SAAQ,OAAO;AACxB,QAAI,CAAC,kBAAkB,IAAIA,MAAK,MAAM,EAAG;AACzC,SAAKA,MAAK,MAAMA,MAAK,QAAQA,MAAK,MAAM;AAAA,EAC1C;AACA,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,WAAW,CAAC,OAAO,WAAY;AAC3C,QAAI,CAAC,kBAAkB,IAAI,OAAO,UAAU,EAAG;AAC/C,SAAK,OAAO,MAAM,OAAO,UAAU;AAAA,EACrC;AAEA,SAAO;AACT;;;ACnCA,SAAS,cAAAC,cAAY,eAAAC,eAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;;;ACCjB;AACA;AAFA,OAAOC,YAAU;AAMjB;AAUA,SAASC,uBAAsB,QAA6B,KAAsB;AAChF,SAAO,2BAA2B,QAAQ,GAAG;AAC/C;AAGO,SAAS,4BACd,cACA,MAAM,KAAK,IAAI,GACc;AAC7B,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,QAAM,cAAc,oBAAI,IAAY;AAEpC,aAAW,eAAe,cAAc;AACtC,eAAW,OAAO,6BAA6B,WAAW,GAAG;AAC3D,UAAI,aAAa;AACjB,iBAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,cAAM,SAAS;AAAA,UACbC,OAAK,KAAK,eAAe,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,UACvF;AAAA,QACF;AACA,YAAI,CAAC,QAAQ,aAAc;AAC3B,cAAM,eAAeA,OAAK,QAAQ,OAAO,YAAY;AACrD,YAAI,CAACD,uBAAsB,QAAQ,GAAG,EAAG;AACzC,qBAAa;AACb,4BAAoB,IAAI,YAAY;AAAA,MACtC;AACA,UAAI,WAAY,aAAY,IAAI,GAAG,WAAW,KAAK,IAAI,EAAE,EAAE;AAAA,IAC7D;AACA,eAAW,OAAO,6BAA6B,WAAW,GAAG;AAC3D,kBAAY,IAAI,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,EAAE,qBAAqB,YAAY;AAC5C;AAGO,SAAS,oBACd,cACA,aACA,OACA,aACS;AACT,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,YAAY,IAAI,GAAG,WAAW,KAAK,KAAK,EAAE;AACnD;;;ADxDA;AAYA,SAAS,UAAU,QAAgB,KAAqB;AACtD,MAAI;AACF,UAAM,QAAQE,UAAS,MAAM,EAAE;AAC/B,WAAO,KAAK,IAAI,GAAG,MAAM,KAAK;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,aAAqB,OAAwC;AAClF,QAAM,UAAUC,OAAK,KAAK,aAAa,QAAQ,OAAO,UAAU;AAChE,MAAI,CAACC,aAAW,OAAO,EAAG,QAAO;AACjC,SAAO,SAAkC,SAAS,IAAI;AACxD;AAEA,SAAS,oBAAoB,SAA0B;AACrD,MAAI;AACF,UAAM,UAAUC,cAAY,OAAO;AACnC,WAAO,QAAQ,WAAW;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,wBAAwB,OAOX;AAC3B,QAAM,EAAE,aAAa,OAAO,SAAS,OAAO,qBAAqB,aAAa,IAAI;AAClF,MAAI,oBAAoB,SAAS,aAAa,OAAO,aAAa,WAAW,GAAG;AAC9E,WAAO;AAAA,EACT;AACA,MAAI,CAAC,oBAAoB,OAAO,EAAG,QAAO;AAC1C,QAAM,MAAM,cAAc,aAAa,KAAK;AAC5C,MAAI,OAAO,CAAC,sBAAsB,IAAI,IAAI,MAAM,GAAG;AACjD,QAAI,CAAC,wBAAwB,GAAG,EAAG,QAAO;AAAA,EAC5C;AACA,MAAI,sBAAsB,KAAK,QAAQ,oBAAqB,QAAO;AACnE,SAAO;AACT;AAGO,SAAS,gCACd,MACoB;AACpB,MAAI,CAACD,aAAW,KAAK,YAAY,EAAG,QAAO,CAAC;AAC5C,QAAM,aAAiC,CAAC;AACxC,MAAI;AACJ,MAAI;AACF,cAAUC,cAAY,KAAK,cAAc,EAAE,eAAe,KAAK,CAAC;AAAA,EAClE,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,aAAW,YAAY,SAAS;AAC9B,QAAI,CAAC,SAAS,YAAY,EAAG;AAC7B,UAAM,QAAQ,SAAS;AACvB,QAAI,KAAK,eAAe,UAAU,KAAK,YAAa;AACpD,UAAM,UAAUF,OAAK,KAAK,KAAK,cAAc,KAAK;AAClD,QAAI,CAAC,oBAAoB,OAAO,EAAG;AACnC,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,OAAO,UAAU,SAAS,KAAK,GAAG;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AE5FA;AADA,SAAS,cAAAG,cAAY,UAAAC,eAAc;;;ACAnC,SAAS,cAAAC,cAAY,UAAAC,eAAc;AAGnC;;;ACHA,SAAS,aAAAC,YAAW,eAAAC,qBAAmB;AAShC,SAAS,kBAAkB,YAA8C;AAC9E,MAAI;AACF,UAAM,KAAKD,WAAU,UAAU;AAC/B,UAAM,eAAe,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AAC/E,UAAM,eAAe,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AAC/E,UAAM,UACJ,iBAAiB,SAChB,GAAG,QAAQ,gBAAiB,iBAAiB,QAAQ,GAAG,QAAQ;AACnE,WAAO,EAAE,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,QAAQ;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,yBAAyB,YAAoB,aAAa,IAAa;AACrF,QAAM,OAAO,kBAAkB,UAAU;AACzC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,QAAS,QAAO;AACzB,MAAI;AACF,UAAM,QAAQC,cAAY,UAAU;AACpC,QAAI,UAAU;AACd,eAAW,QAAQ,OAAO;AACxB,UAAI,WAAW,WAAY;AAC3B,YAAM,QAAQ,GAAG,WAAW,QAAQ,OAAO,EAAE,CAAC,IAAI,IAAI;AACtD,YAAM,OAAO,kBAAkB,KAAK;AACpC,iBAAW;AACX,UAAI,MAAM,QAAS,QAAO;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;AC1CA,SAAS,aAAAC,kBAAiB;AAC1B,OAAOC,YAAU;;;ACDjB,OAAOC,YAAU;AAGjB,SAAS,6BACP,YACA,aACA,cACA,cAC0B;AAC1B,QAAM,WAAWA,OAAK,QAAQ,UAAU;AACxC,QAAM,SAAS,GAAGA,OAAK,GAAG,GAAG,YAAY;AACzC,QAAM,YAAY,SAAS,SAAS,MAAM,IAAI,WAAW;AACzD,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,MAAMA,OAAK,SAAS,cAAc,SAAS;AACjD,MAAI,IAAI,WAAW,IAAI,KAAKA,OAAK,WAAW,GAAG,EAAG,QAAO;AACzD,QAAM,QAAQ,IAAI,MAAMA,OAAK,GAAG;AAChC,MAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,MAAM,aAAc,QAAO;AACzE,MAAI,CAAC,SAAS,WAAWA,OAAK,QAAQ,WAAW,CAAC,EAAG,QAAO;AAC5D,SAAO;AACT;AAEO,SAAS,yBACd,YACA,aACA,cAC0B;AAC1B,SAAO,6BAA6B,YAAY,aAAa,cAAc,cAAc;AAC3F;AAEO,SAAS,uBACd,YACA,aACA,cAC0B;AAC1B,SAAO,6BAA6B,YAAY,aAAa,cAAc,OAAO;AACpF;AAEO,SAAS,wBACd,YACA,aACA,cAC0B;AAC1B,QAAM,WAAWA,OAAK,QAAQ,UAAU;AACxC,QAAM,UAAUA,OAAK,SAAS,cAAc,QAAQ;AACpD,MAAI,QAAQ,WAAW,IAAI,KAAKA,OAAK,WAAW,OAAO,EAAG,QAAO;AACjE,QAAM,QAAQ,QAAQ,MAAMA,OAAK,GAAG;AACpC,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,MAAI,CAAC,SAAS,WAAWA,OAAK,QAAQ,WAAW,CAAC,EAAG,QAAO;AAC5D,SAAO;AACT;AAEO,SAAS,4BACd,YACA,aACA,cACS;AACT,QAAM,WAAWA,OAAK,QAAQ,UAAU;AACxC,SACE,yBAAyB,UAAU,aAAa,YAAY,MAAM,QAClE,uBAAuB,UAAU,aAAa,YAAY,MAAM,QAChE,wBAAwB,UAAU,aAAa,YAAY,MAAM;AAErE;;;ADxDO,SAAS,+BAAsD;AACpE,QAAM,OAAO,QAAQ,IAAI,6BAA6B,QAAQ,KAAK,EAAE,YAAY;AACjF,MAAI,QAAQ,OAAO,QAAQ,WAAW,QAAQ,SAAS,QAAQ,KAAM,QAAO;AAC5E,MAAI,QAAQ,OAAO,QAAQ,UAAU,QAAQ,WAAW,QAAQ,MAAO,QAAO;AAC9E,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAiD;AAC9E,QAAM,MAAMC,WAAU,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG;AAAA,IAC7C,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AACD,SAAO;AAAA,IACL,IAAI,IAAI,WAAW;AAAA,IACnB,QAAQ,GAAG,IAAI,UAAU,EAAE,GAAG,IAAI,UAAU,EAAE,GAAG,KAAK;AAAA,EACxD;AACF;AAYO,SAAS,iCACd,YACA,aACA,cACyB;AACzB,MAAI,CAAC,4BAA4B,YAAY,aAAa,YAAY,GAAG;AACvE,WAAO,EAAE,IAAI,OAAO,OAAO,iDAAiD;AAAA,EAC9E;AACA,QAAM,eAAe,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AAC/E,QAAM,eAAe,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AAC/E,MAAI,iBAAiB,QAAQ,iBAAiB,MAAM;AAClD,WAAO,EAAE,IAAI,OAAO,OAAO,4CAA4C;AAAA,EACzE;AAEA,QAAM,QAAQ,sBAAsB;AAAA,IAClC;AAAA,IACA;AAAA,IACA,GAAG,YAAY,IAAI,YAAY;AAAA,IAC/BC,OAAK,QAAQ,UAAU;AAAA,EACzB,CAAC;AACD,MAAI,MAAM,IAAI;AACZ,WAAO,EAAE,IAAI,MAAM,QAAQ,gBAAgB;AAAA,EAC7C;AAEA,QAAM,KAAK,sBAAsB,CAAC,MAAM,OAAOA,OAAK,QAAQ,UAAU,CAAC,CAAC;AACxE,MAAI,GAAG,IAAI;AACT,WAAO,EAAE,IAAI,MAAM,QAAQ,UAAU;AAAA,EACvC;AAEA,QAAM,SAAS,MAAM,UAAU,GAAG,UAAU;AAC5C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,EACT;AACF;AAEO,IAAM,mCACX;;;AF9CF,SAAS,kBAAkB,OAAyB;AAClD,QAAM,OAAQ,OAA6C;AAC3D,SAAO,SAAS,YAAY,SAAS;AACvC;AAEO,SAAS,2BACd,WACA,SACA,OAAuC,CAAC,GACd;AAC1B,MAAI,CAACC,aAAW,UAAU,IAAI,GAAG;AAC/B,WAAO,EAAE,UAAU,OAAO,SAAS,MAAM,YAAY,mBAAmB;AAAA,EAC1E;AACA,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,UAAU,OAAO,SAAS,MAAM,YAAY,UAAU;AAAA,EACjE;AAEA,QAAM,cAAc,UAAU;AAC9B,QAAM,eAAe,cAAc,oBAAoB,WAAW,IAAI;AACtE,QAAM,cAAc,UAAU,SAAS,mBAAmB,UAAU,IAAI;AACxE,QAAM,gBAAgB,eAAe;AACrC,QAAM,aAAa,KAAK,cAAcC;AACtC,QAAM,uBAAuB,KAAK,wBAAwB;AAE1D,MAAI;AACF,eAAW,UAAU,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC3D,WAAO,EAAE,UAAU,MAAM,SAAS,OAAO,OAAO,cAAc;AAAA,EAChE,SAAS,OAAO;AACd,QAAI,CAAC,kBAAkB,KAAK,KAAK,CAAC,eAAe,CAAC,cAAc;AAC9D,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAQ,MAAgB;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,UAAU,qBAAqB,UAAU,IAAI;AACnD,UAAM,OAAO,6BAA6B;AAC1C,UAAM,sBAAsB,SAAS,WAAY,SAAS,UAAU;AACpE,QAAI,CAAC,qBAAqB;AACxB,aAAO,UACH;AAAA,QACE,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO,GAAI,MAAgB,OAAO,KAAK,gCAAgC;AAAA,MACzE,IACA;AAAA,QACE,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAQ,MAAgB;AAAA,MAC1B;AAAA,IACN;AAEA,UAAM,UAAU,iCAAiC,UAAU,MAAM,aAAa,YAAY;AAC1F,QAAI,QAAQ,MAAM,QAAQ,WAAW,WAAW;AAC9C,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,QACP,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,QAAQ,IAAI;AACd,UAAI;AACF,mBAAW,UAAU,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC3D,eAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO;AAAA,UACP,mBAAmB;AAAA,QACrB;AAAA,MACF,SAAS,YAAY;AACnB,eAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,OAAO,GAAI,WAAqB,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,OAAO,GAAI,MAAgB,OAAO,gCAAgC,QAAQ,KAAK,KAAK,gCAAgC;AAAA,IACtH;AAAA,EACF;AACF;;;ADvGA,SAAS,uBAAuB,WAAmD;AACjF,QAAM,cAAc,UAAU;AAC9B,MAAI,CAAC,eAAe,CAAC,yBAAyB,UAAU,MAAM,WAAW,EAAG,QAAO;AACnF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;AAEA,SAAS,sBAAsB,WAA6B,SAAiC;AAC3F,QAAM,eAAe,uBAAuB,SAAS;AACrD,MAAI,aAAc,QAAO;AACzB,QAAM,UAAU,2BAA2B,WAAW,OAAO;AAC7D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,QAAQ,SAAS,UAAU;AAAA,IAClC,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,IACpB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,WAA6B,SAAiC;AAC9F,SAAO,sBAAsB,WAAW,OAAO;AACjD;AAEO,SAAS,gBAAgB,WAA6B,SAAiC;AAC5F,SAAO,sBAAsB,WAAW,OAAO;AACjD;AAEO,SAAS,iBAAiB,WAA6B,SAAiC;AAC7F,SAAO,sBAAsB,WAAW,OAAO;AACjD;AAEO,SAAS,mBAAmB,WAA6B,SAAiC;AAC/F,QAAM,eAAe,uBAAuB,SAAS;AACrD,MAAI,aAAc,QAAO;AACzB,MAAI,CAACC,aAAW,UAAU,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,UAAU;AAAA,EAC/E;AACA,MAAI;AACF,UAAM,cAAc,UAAU,SAAS,mBAAmB,UAAU,IAAI;AACxE,IAAAC,QAAO,UAAU,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACvD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,eAAe,WAA6B,SAAiC;AAC3F,QAAM,eAAe,uBAAuB,SAAS;AACrD,MAAI,aAAc,QAAO;AACzB,MAAI,CAACD,aAAW,UAAU,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,UAAU;AAAA,EAC/E;AACA,QAAM,OAAO,UAAU;AACvB,MAAI;AACF,UAAM,cAAc,UAAU,SAAS,mBAAmB,UAAU,IAAI;AACxE,QAAI,MAAM;AACR,UAAI,MAAM,CAAC,YAAY,UAAU,WAAW,UAAU,IAAI,GAAG,EAAE,cAAc,KAAK,CAAC;AAAA,IACrF;AACA,QAAIA,aAAW,UAAU,IAAI,GAAG;AAC9B,MAAAC,QAAO,UAAU,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACzD;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;;;AK3HA,SAAS,cAAAC,cAAY,eAAAC,eAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;AAgBjB,SAASC,WAAU,QAAgB,KAAqB;AACtD,MAAI;AACF,UAAM,QAAQC,UAAS,MAAM,EAAE;AAC/B,WAAO,KAAK,IAAI,GAAG,MAAM,KAAK;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,OAAe,QAAyB;AAC5D,QAAM,MAAMC,OAAK,SAAS,QAAQ,KAAK;AACvC,SAAO,QAAQ,MAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,GAAG;AACrE;AAoDA,SAAS,6BACP,cACA,MACA,MACA,MACoB;AACpB,QAAM,MAA0B,CAAC;AACjC,aAAW,OAAO,oCAAoC;AACpD,QAAI,QAAQ,QAAS;AACrB,UAAM,SAASC,OAAK,KAAK,cAAc,GAAG;AAC1C,QAAI,CAACC,aAAW,MAAM,EAAG;AACzB,UAAM,WAAWD,OAAK,QAAQ,MAAM;AACpC,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,QAAI,CAAC,aAAa,UAAU,KAAK,WAAW,EAAG;AAC/C,SAAK,IAAI,QAAQ;AACjB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,OAAOE,WAAU,UAAU,KAAK,GAAG;AAAA,IACrC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAA8C;AACrF,QAAM,aAAiC,CAAC;AACxC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,QAAI,KAAK,eAAe,MAAM,UAAU,KAAK,YAAa;AAC1D,eAAW;AAAA,MACT,GAAG,6BAA6B,MAAM,cAAc,MAAM,MAAM;AAAA,QAC9D,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM,IAAI;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,kBAAkB,CAACD,aAAW,KAAK,YAAY,EAAG,QAAO;AAEnE,aAAW,YAAYE,cAAY,KAAK,cAAc,EAAE,eAAe,KAAK,CAAC,GAAG;AAC9E,QAAI,CAAC,SAAS,YAAY,EAAG;AAC7B,UAAM,UAAUH,OAAK,KAAK,KAAK,cAAc,SAAS,IAAI;AAC1D,eAAW,eAAeG,cAAY,SAAS,EAAE,eAAe,KAAK,CAAC,GAAG;AACvE,UAAI,CAAC,YAAY,YAAY,EAAG;AAChC,YAAM,eAAeH,OAAK,KAAK,SAAS,YAAY,IAAI;AACxD,iBAAW;AAAA,QACT,GAAG,6BAA6B,cAAc,MAAM,MAAM;AAAA,UACxD,OAAO,SAAS;AAAA,UAChB,QAAQ,YAAY;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,MAA8C;AAMnF,QAAM,iBAAiB,KAAK,iBAAiB,KAAK,KAAK;AACvD,QAAM,gBAAgB,KAAK;AAC3B,MAAI,CAAC,kBAAkB,CAAC,cAAe,QAAO,CAAC;AAE/C,QAAM,aAAiC,CAAC;AACxC,QAAM,OAAO,oBAAI,IAAY;AAE7B,MAAI,gBAAgB;AAClB,eAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,UAAI,KAAK,eAAe,MAAM,UAAU,KAAK,YAAa;AAC1D,YAAM,WAAW,MAAM;AACvB,UAAI,CAACC,aAAW,QAAQ,EAAG;AAC3B,UAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,WAAK,IAAI,QAAQ;AACjB,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM,IAAI;AAAA,QAChB,OAAOC,WAAU,UAAU,KAAK,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB,CAACD,aAAW,KAAK,YAAY,EAAG,QAAO;AAG7D,QAAM,eAAe,oBAAI,IAAY;AACrC,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,iBAAa,IAAID,OAAK,QAAQ,MAAM,YAAY,CAAC;AAAA,EACnD;AAEA,aAAW,YAAYG,cAAY,KAAK,cAAc,EAAE,eAAe,KAAK,CAAC,GAAG;AAC9E,QAAI,CAAC,SAAS,YAAY,EAAG;AAC7B,QAAI,KAAK,eAAe,SAAS,SAAS,KAAK,YAAa;AAC5D,UAAM,UAAUH,OAAK,KAAK,KAAK,cAAc,SAAS,IAAI;AAC1D,QAAI;AACJ,QAAI;AACF,sBAAgBG,cAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC9D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,eAAe,eAAe;AACvC,UAAI,CAAC,YAAY,YAAY,EAAG;AAChC,YAAM,eAAeH,OAAK,QAAQA,OAAK,KAAK,SAAS,YAAY,IAAI,CAAC;AACtE,UAAI,KAAK,IAAI,YAAY,EAAG;AAC5B,UAAI,aAAa,IAAI,YAAY,EAAG;AACpC,UAAI,CAAC,aAAa,cAAc,KAAK,WAAW,EAAG;AACnD,WAAK,IAAI,YAAY;AACrB,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,SAAS;AAAA,QAChB,QAAQ,YAAY;AAAA,QACpB,OAAOE,WAAU,cAAc,KAAK,GAAG;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACrNA,SAAS,cAAAE,cAAY,eAAAC,eAAa,YAAAC,kBAAgB;AAClD,OAAOC,YAAU;AAIjB,IAAM,wBAA6E;AAAA,EACjF,EAAE,SAAS,gBAAgB,MAAM,sBAAsB;AAAA,EACvD,EAAE,SAAS,SAAS,MAAM,oBAAoB;AAChD;AAYA,SAASC,WAAU,QAAgB,KAAqB;AACtD,MAAI;AACF,UAAM,QAAQF,WAAS,MAAM,EAAE;AAC/B,WAAO,KAAK,IAAI,GAAG,MAAM,KAAK;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASG,cAAa,OAAe,QAAyB;AAC5D,QAAM,MAAMF,OAAK,SAAS,QAAQ,KAAK;AACvC,SAAO,QAAQ,MAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,GAAG;AACrE;AAEA,SAASG,eACP,YACA,MACA,MACA,YACA,MACA,MACM;AACN,MAAI,CAACN,aAAW,UAAU,EAAG;AAC7B,QAAM,WAAWG,OAAK,QAAQ,UAAU;AACxC,MAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,MAAI,CAACE,cAAa,UAAU,KAAK,WAAW,EAAG;AAC/C,OAAK,IAAI,QAAQ;AACjB,aAAW,KAAK;AAAA,IACd;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,OAAOD,WAAU,UAAU,KAAK,GAAG;AAAA,EACrC,CAAC;AACH;AAEA,SAAS,6BACP,YACA,MACA,MACA,cACA,MACM;AACN,aAAW,SAAS,uBAAuB;AACzC,IAAAE,eAAc,YAAY,MAAM,MAAMH,OAAK,KAAK,cAAc,MAAM,OAAO,GAAG,MAAM,MAAM,IAAI;AAAA,EAChG;AACF;AAGO,SAAS,8BAA8B,MAAsD;AAClG,QAAM,aAAiC,CAAC;AACxC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,QAAI,KAAK,eAAe,MAAM,UAAU,KAAK,YAAa;AAC1D,iCAA6B,YAAY,MAAM,MAAM,MAAM,cAAc;AAAA,MACvE,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,KAAK,kBAAkB,CAACH,aAAW,KAAK,YAAY,EAAG,QAAO;AAEnE,aAAW,YAAYC,cAAY,KAAK,cAAc,EAAE,eAAe,KAAK,CAAC,GAAG;AAC9E,QAAI,CAAC,SAAS,YAAY,EAAG;AAC7B,QAAI,KAAK,eAAe,SAAS,SAAS,KAAK,YAAa;AAC5D,UAAM,UAAUE,OAAK,KAAK,KAAK,cAAc,SAAS,IAAI;AAC1D,QAAI;AACJ,QAAI;AACF,sBAAgBF,cAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC9D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,eAAe,eAAe;AACvC,UAAI,CAAC,YAAY,YAAY,EAAG;AAChC,YAAM,eAAeE,OAAK,KAAK,SAAS,YAAY,IAAI;AACxD,mCAA6B,YAAY,MAAM,MAAM,cAAc;AAAA,QACjE,OAAO,SAAS;AAAA,QAChB,QAAQ,YAAY;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACzGA;AAHA,SAAS,cAAAI,cAAY,YAAAC,kBAAgB;AACrC,OAAOC,YAAU;AAKjB,SAASC,WAAU,QAAgB,KAAqB;AACtD,MAAI;AACF,UAAM,QAAQF,WAAS,MAAM,EAAE;AAC/B,WAAO,KAAK,IAAI,GAAG,MAAM,KAAK;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASA,SAAS,uBAAuB,QAAqC;AACnE,QAAM,UAA+B,CAAC;AACtC,MAAI,UAAoC;AACxC,aAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AACrC,UAAM,QAAQ,KAAK,KAAK,GAAG;AAC3B,QAAI,QAAQ,YAAY;AACtB,UAAI,QAAS,SAAQ,KAAK,OAAO;AACjC,gBAAU,EAAE,MAAM,MAAM;AACxB;AAAA,IACF;AACA,QAAI,CAAC,QAAS;AACd,QAAI,QAAQ,SAAU,SAAQ,SAAS;AACvC,QAAI,QAAQ,OAAQ,SAAQ,OAAO;AACnC,QAAI,QAAQ,OAAQ,SAAQ,OAAO;AAAA,EACrC;AACA,MAAI,QAAS,SAAQ,KAAK,OAAO;AACjC,SAAO;AACT;AAEA,SAAS,oBAAoB,cAAsB,cAA+B;AAChF,QAAM,MAAMC,OAAK,SAASA,OAAK,QAAQ,YAAY,GAAGA,OAAK,QAAQ,YAAY,CAAC;AAChF,SAAO,QAAQ,MAAM,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,GAAG;AACpE;AAGA,IAAM,6CAA6C;AAO5C,SAAS,gCAAgC,MAA8C;AAC5F,MAAI,CAAC,KAAK,kBAAkB,CAACF,aAAW,KAAK,YAAY,EAAG,QAAO,CAAC;AAEpE,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,QAAI,MAAM,IAAI,KAAM,OAAM,IAAIE,OAAK,QAAQ,MAAM,IAAI,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,eAAe,oBAAI,IAAY;AACrC,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,iBAAa,IAAIA,OAAK,QAAQ,MAAM,YAAY,CAAC;AAAA,EACnD;AAEA,QAAM,aAAiC,CAAC;AACxC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,YAAY,OAAO;AAC5B,QAAI,qBAAqB;AACzB,QAAI;AACJ,QAAI;AACF,kBAAY,IAAI,UAAU,CAAC,YAAY,QAAQ,aAAa,GAAG,EAAE,cAAc,KAAK,CAAC;AAAA,IACvF,QAAQ;AACN;AAAA,IACF;AACA,UAAM,YAAY,uBAAuB,SAAS;AAClD,eAAW,MAAM,WAAW;AAC1B,UAAI,sBAAsB,2CAA4C;AACtE,YAAM,WAAWA,OAAK,QAAQ,GAAG,IAAI;AACrC,UAAI,aAAaA,OAAK,QAAQ,QAAQ,EAAG;AACzC,UAAI,CAAC,oBAAoB,UAAU,KAAK,YAAY,EAAG;AACvD,UAAI,aAAa,IAAI,QAAQ,EAAG;AAChC,UAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,UAAI,CAACF,aAAW,QAAQ,EAAG;AAE3B,YAAM,MAAME,OAAK,SAAS,KAAK,cAAc,QAAQ;AACrD,YAAM,QAAQ,IAAI,MAAMA,OAAK,GAAG;AAChC,YAAM,QAAQ,MAAM,CAAC;AACrB,YAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,WAAK,IAAI,QAAQ;AACjB,4BAAsB;AACtB,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,OAAOC,WAAU,UAAU,KAAK,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC5GA;AAQA;AATA,OAAOC,YAAU;AA4BV,SAAS,2BACd,OACA,aAC8B;AAC9B,QAAM,eAAeC,OAAK,QAAQ,WAAW;AAC7C,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAChC,UAAM,YAAY,MAAM,cAAcA,OAAK,QAAQ,MAAM,WAAW,IAAI;AACxE,QAAI,aAAa,cAAc,aAAc;AAC7C,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,aAAmD;AACtF,QAAM,QAAQ,oBAAI,IAA6B;AAC/C,aAAW,OAAO,6BAA6B,WAAW,GAAG;AAC3D,eAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,YAAM,aAAaA,OAAK;AAAA,QACtB,eAAe,aAAa,IAAI,EAAE;AAAA,QAClC;AAAA,QACA,SAAS,IAAI;AAAA,QACb;AAAA,MACF;AACA,YAAM,SAAS,SAA0C,YAAY,MAAS;AAC9E,UAAI,CAAC,QAAQ,aAAc;AAC3B,YAAM,IAAIA,OAAK,QAAQ,OAAO,YAAY,GAAG;AAAA,QAC3C;AAAA,QACA,cAAcA,OAAK,QAAQ,OAAO,YAAY;AAAA,QAC9C,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;;;ACvDA,SAAS,QAAQ,MAAuB;AACtC,QAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,SAAO,MAAM,OAAO,MAAM,UAAU,MAAM;AAC5C;AAEA,SAAS,MAAM,MAAc,UAA0B;AACrD,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,OAAO,GAAG;AACpB,SAAO,OAAO,SAAS,CAAC,KAAK,KAAK,IAAI,IAAI;AAC5C;AAwBO,SAAS,wBACd,UAAiC,CAAC,GACR;AAC1B,QAAM,UACJ,QAAQ,YAAY,QACnB,QAAQ,YAAY,SAAS,QAAQ,wBAAwB;AAChE,QAAMC,qBACJ,QAAQ,sBAAsB,SAAS,CAAC,QAAQ,8BAA8B;AAChF,QAAM,mBACJ,QAAQ,oBACR,MAAM,sCAAsC,2BAA2B;AACzE,QAAM,uBACJ,QAAQ,yBACP,QAAQ,qBAAqB,UAC5B,QAAQ,IAAI,sCAAsC;AACtD,QAAM,iBACJ,QAAQ,kBACR,MAAM,mCAAmC,CAAC;AAC5C,QAAM,yBACJ,QAAQ,0BACR,MAAM,4CAA4C,iCAAiC;AACrF,QAAM,sBACJ,QAAQ,uBACR,MAAM,yCAAyC,8BAA8B;AAC/E,QAAM,qBACJ,QAAQ,sBACR,MAAM,wCAAwC,6BAA6B;AAC7E,QAAM,iBACJ,QAAQ,mBAAmB,QAAQ,QAAQ,gCAAgC;AAC7E,QAAM,WAAW,QAAQ,0BAA0B,KAAK,QAAQ,IAAI,yBAAyB;AAC7F,QAAM,cAAc,WAChB,QAAQ,cACR,QAAQ,gBAAgB,QAAQ,IAAI,yBAAyB;AACjE,QAAM,eAAe,QAAQ,iBAAiB,SAAS,CAAC,QAAQ,qCAAqC;AACrG,QAAM,gBAAgB,MAAM,oCAAoC,GAAK;AACrE,QAAM,wBACJ,QAAQ,0BAA0B,SAC9B,QAAQ,wBACR,eACE,gBAAgB,IACd,gBACA,OACF;AACR,QAAM,aAAa,MAAM,iCAAiC,GAAK;AAC/D,QAAM,yBACJ,QAAQ,2BACP,OAAO,SAAS,UAAU,KAAK,aAAa,IAAI,KAAK,MAAM,UAAU,IAAI;AAE5E,SAAO;AAAA,IACL;AAAA,IACA,mBAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,iBAAiB,IAAI,iBAAiB;AAAA,IACtD,wBAAwB,0BAA0B,IAAI,yBAAyB;AAAA,IAC/E,qBAAqB,uBAAuB,IAAI,sBAAsB;AAAA,IACtE,oBACE,OAAO,SAAS,kBAAkB,KAAK,qBAAqB,IACxD,KAAK,MAAM,kBAAkB,IAC7B;AAAA,IACN;AAAA,IACA,aAAa,cAAc,OAAO,WAAW,IAAI;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGO,SAAS,gCAAgC,OAA0C;AACxF,QAAM,WAAW,QAAQ,IAAI,yBAAyB;AACtD,QAAM,eAAe,OAAO,QAAQ,IAAI,+BAA+B;AACvE,QAAM,iBAAiB,WACnB,OAAO,SAAS,YAAY,KAAK,eAAe,IAC9C,eACA,2BACF,OAAO,SAAS,YAAY,KAAK,eAAe,IAC9C,eACA;AACN,SAAO,wBAAwB;AAAA,IAC7B,aAAa,WAAW,SAAY;AAAA,IACpC;AAAA,IACA,wBAAwB,WAAW,oCAAoC;AAAA,IACvE,qBAAqB,WAAW,iCAAiC;AAAA,IACjE,gBAAgB,WAAW,OAAO;AAAA,IAClC,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,sBAAsB;AAAA,EACxB,CAAC;AACH;;;ACnIA;AAFA,SAAS,cAAAC,oBAAkB;AAC3B,OAAOC,YAAU;AAMjB;AAEA,IAAM,6BAA6B,KAAK,KAAK;AAkBtC,SAAS,2BACd,OAC0B;AAC1B,QAAM,MAAM,MAAM,OAAO,KAAK,IAAI;AAClC,QAAM,mBAAmB,MAAM,oBAAoB;AAEnD,MAAI,CAACC,aAAW,MAAM,YAAY,EAAG,QAAO;AAE5C,MAAI,MAAM,SAAS,MAAM,YAAY;AACnC,UAAM,YAAYC,OAAK;AAAA,MACrB,MAAM;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,MAAM;AAAA,IACR;AACA,UAAM,SAAS;AAAA,MACbA,OAAK,KAAK,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AACA,QACE,UACA,wBAAwB,QAAQ,KAAK,gBAAgB,GACrD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,SAASA,OAAK,KAAK,MAAM,cAAc,MAAM;AACnD,MAAI,CAACD,aAAW,MAAM,EAAG,QAAO;AAEhC,QAAM,YAAY,WAAW,MAAM,cAAc,CAAC,UAAU,aAAa,CAAC;AAC1E,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,QAAM,aAAa,UAAU,OAC1B,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,MAAIE,yBAAwB,UAAU,EAAE,SAAS,EAAG,QAAO;AAE3D,QAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,cAAc,WAAW,GAAG;AAC9B,UAAM,QAAQ,OAAO,cAAc,OAAO,KAAK,CAAC;AAChD,QAAI,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO;AAAA,EAClD;AAEA,QAAM,YAAY,WAAW,MAAM,cAAc;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,UAAU,WAAW,GAAG;AAE1B,QAAI,cAAc,WAAW,EAAG,QAAO;AACvC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO,UAAU,OAAO,KAAK,CAAC;AAChD,MAAI,OAAO,SAAS,SAAS,KAAK,YAAY,EAAG,QAAO;AAExD,SAAO;AACT;;;ACvFA;AAHA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AAIV,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACAA,OAAK,KAAKD,UAAQ,GAAG,aAAa,SAAS;AAC7C;AAEA,SAAS,QAAQ,MAAmB,OAAiB,WAAqC;AACxF,MAAI,CAAC,WAAW,KAAK,EAAG;AACxB,QAAM,WAAW,qBAAqB,UAAU,KAAK,CAAC;AACtD,MAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,OAAK,IAAI,QAAQ;AACjB,QAAM,KAAK,QAAQ;AACrB;AAMA,SAAS,yBAAyB,SAA+C;AAC/E,MAAI,QAAQ,iBAAiB,KAAM,QAAO,QAAQ;AAClD,MAAI,QAAQ,IAAI,WAAW,OAAQ,QAAO;AAC1C,SACE,QAAQ,IAAI,mCAAmC,OAC/C,CAAC,CAAC,KAAK,SAAS,IAAI,EAAE,UAAU,QAAQ,IAAI,kCAAkC,IAAI,YAAY,CAAC;AAEnG;AAEO,SAAS,wBACd,UAA6D,CAAC,GACpD;AACV,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAkB,CAAC;AAEzB,UAAQ,MAAM,OAAO,QAAQ,eAAe,mBAAmB,CAAC;AAEhE,QAAM,QAAQ,QAAQ,IAAI,4BAA4B,MAAM,GAAG,EAC5D,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,aAAW,aAAa,SAAS,CAAC,EAAG,SAAQ,MAAM,OAAO,SAAS;AAEnE,MAAI,yBAAyB,OAAO,GAAG;AACrC,eAAW,aAAa,+BAA+B;AACrD,YAAM,WAAWC,OAAK,QAAQ,SAAS;AACvC,UAAI,CAAC,KAAK,IAAI,QAAQ,KAAKF,aAAW,QAAQ,EAAG,SAAQ,MAAM,OAAO,QAAQ;AAAA,IAChF;AAAA,EACF;AAEA,SAAO;AACT;;;ACpDA;AAIA,SAASG,SAAQ,MAAuB;AACtC,QAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,SAAO,MAAM,OAAO,MAAM,UAAU,MAAM;AAC5C;AAEA,SAAS,UAAU,MAAc,UAA0B;AACzD,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,OAAO,GAAG;AACpB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AASO,SAAS,2BAA2B,QAA8B,CAAC,GAA6B;AACrG,QAAM,WAAW,MAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,wBAAwB,KAAK,KAAK;AACzF,QAAM,iBAAiB,UAAU,sCAAsC,EAAE;AACzE,QAAM,WAAW,sBAAsB;AAAA,IACrC,GAAG;AAAA,IACH;AAAA,IACA,oBAAoB,MAAM,sBAAsB;AAAA,EAClD,CAAC;AACD,MAAI,YAAY,CAAC,SAAS,MAAM,SAAS,eAAe;AASxD,QAAM,QAAQ,QAAQ,IAAI,oCAAoC,KAAK,EAAE,YAAY;AACjF,MAAI,UAAU,UAAU,UAAU,SAAS,UAAU,IAAK,aAAY;AAAA,WAC7D,UAAU,eAAe,UAAU,QAAQ,UAAU,IAAK,aAAY;AAE/E,SAAO,EAAE,UAAU,WAAW,eAAe;AAC/C;AAMO,SAAS,6BACd,WACA,UAC0B;AAC1B,MAAI,CAAC,SAAS,UAAW,QAAO;AAChC,QAAM,oBACJ,UAAU,WAAW,CAACA,SAAQ,oCAAoC;AACpE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,kBAAkB;AAAA;AAAA;AAAA;AAAA,IAIlB,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,gBAAgB,UAAU,iBAAiB,IAAI,UAAU,iBAAiB;AAAA,IAC1E,cAAc;AAAA,IACd,UAAU,SAAS;AAAA,EACrB;AACF;;;ACzEO,SAAS,oBAAoB,OAAe,QAAuB;AACxE,MAAI,QAAQ,IAAI,yBAAyB,IAAK;AAC9C,QAAM,SAAS,SAAS,KAAK,MAAM,KAAK;AACxC,UAAQ,MAAM,oBAAoB,KAAK,GAAG,MAAM,EAAE;AACpD;;;ACLA;AAGO,IAAM,qBAAN,MAAyB;AAAA,EACb,cAAc,oBAAI,IAA2B;AAAA,EAE9D,iBAAiB,cAAsB,OAAO,eAA8B;AAC1E,UAAM,MAAM,GAAG,YAAY,KAAK,IAAI;AACpC,QAAI,KAAK,YAAY,IAAI,GAAG,EAAG,QAAO,KAAK,YAAY,IAAI,GAAG,KAAK;AACnE,UAAM,SAAS,WAAW,cAAc,CAAC,YAAY,WAAW,GAAG,IAAI,QAAQ,CAAC;AAChF,QAAI,OAAO,WAAW,GAAG;AACvB,WAAK,YAAY,IAAI,KAAK,IAAI;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,OAAO,OAAO,OAAO,KAAK,CAAC;AACzC,UAAM,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ;AAChD,SAAK,YAAY,IAAI,KAAK,MAAM;AAChC,WAAO;AAAA,EACT;AACF;;;ACnBA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,cAAAC,oBAAkB;AAC3B,OAAOC,YAAU;AAIV,IAAM,+BAA+B;AAErC,SAAS,kBAAkB,KAAa,MAAkC;AAC/E,MAAI,CAACD,aAAWC,OAAK,KAAK,KAAK,MAAM,CAAC,GAAG;AACvC,WAAO,EAAE,QAAQ,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,iBAAiB;AAAA,EACzE;AACA,MAAI;AACF,UAAM,MAAMF,WAAU,OAAO,MAAM;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AACD,UAAM,WAAW,IAAI,OAAO,SAAS,SAAS,WAAW,MAAM;AAC/D,WAAO;AAAA,MACL,QAAQ,WAAW,OAAO,IAAI;AAAA,MAC9B,QAAQ,IAAI,UAAU;AAAA,MACtB,QAAQ,IAAI,UAAU;AAAA,MACtB,OAAO,WAAW,gBAAgB,IAAI,QAAQ,IAAI,MAAM,UAAU;AAAA,IACpE;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,cAAuC;AAC9E,QAAM,WAAW,kBAAkB,cAAc,CAAC,UAAU,SAAS,CAAC;AACtE,MAAI,SAAS,UAAU,iBAAkB,QAAO,CAAC;AACjD,MAAI,SAAS,UAAU,iBAAiB,SAAS,WAAW,EAAG,QAAO;AACtE,SAAO,SAAS,OACb,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;;;ACxCO,IAAM,wBAAN,MAA4B;AAAA,EAChB,QAAQ,oBAAI,IAAsB;AAAA,EAEnD,UAAU,cAAgC;AACxC,UAAM,WAAW;AACjB,UAAM,SAAS,KAAK,MAAM,IAAI,QAAQ;AACtC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,QAAQ,yBAAyB,QAAQ,KAAK,CAAC;AACrD,SAAK,MAAM,IAAI,UAAU,KAAK;AAC9B,WAAO;AAAA,EACT;AACF;;;ACVO,IAAM,0BAAN,MAA8B;AAAA,EAClB,QAAQ,oBAAI,IAA2B;AAAA,EAExD,OAAO,KAAsC;AAC3C,UAAM,SAAS,KAAK,MAAM,IAAI,IAAI,EAAE;AACpC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,UAAU,wBAAwB,GAAG;AAC3C,SAAK,MAAM,IAAI,IAAI,IAAI,OAAO;AAC9B,WAAO;AAAA,EACT;AACF;;;ACRA,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AA0B7B,SAAS,iBAAiB,SAAuF;AAC/G,QAAM,SAAqD,CAAC;AAC5D,aAAW,UAAU,SAAS;AAC5B,WAAO,OAAO,IAAI,KAAK,OAAO,OAAO,IAAI,KAAK,KAAK;AAAA,EACrD;AACA,SAAO;AACT;AAGO,SAAS,2BACd,SACA,UAAkE,CAAC,GAC5C;AACvB,QAAM,aAAa,QAAQ,oBAAoB;AAC/C,QAAM,WAAW,QAAQ,kBAAkB;AAE3C,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,WAAW,QAAQ;AAAA,IACnB,eAAe,QAAQ,cAAc;AAAA,IACrC,aAAa,QAAQ,QAAQ;AAAA,IAC7B,aAAa,iBAAiB,QAAQ,OAAO;AAAA,IAC7C,QAAQ,QAAQ;AAAA,IAChB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,oBAAoB,SAAS,EAAE,oBAAoB,QAAQ,mBAAmB,IAAI,CAAC;AAAA,IAC/F,GAAI,QAAQ,yBAAyB,OAAO,EAAE,uBAAuB,QAAQ,sBAAsB,IAAI,CAAC;AAAA,IACxG,eAAe,QAAQ,QAAQ,MAAM,GAAG,UAAU,EAAE,IAAI,CAAC,YAAY;AAAA,MACnE,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7D,GAAI,OAAO,SAAS,OAAO,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MACtD,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IACnD,EAAE;AAAA,IACF,aAAa,QAAQ,MAAM,MAAM,GAAG,QAAQ;AAAA,EAC9C;AACF;;;AhCnBA,SAAS,aAAa,UAAiC,CAAC,GAAG;AACzD,QAAM,cAAc,QAAQ,cACxB,qBAAqB,QAAQ,WAAW,IACxC,mBAAmB;AACvB,QAAM,YAAY,wBAAwB,EAAE,YAAY,CAAC;AACzD,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,SAAO,EAAE,aAAa,WAAW,IAAI;AACvC;AAEA,SAAS,mBAAmBG,OAAyE;AACnG,MAAI,OAAOA,UAAS,SAAU,QAAO,EAAE,QAAQA,MAAK;AACpD,SAAOA;AACT;AAEA,SAAS,WACP,OACA,WACA,QACA,QACM;AACN,QAAM,KAAK,EAAE,MAAM,WAAW,QAAQ,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC;AACvE;AAEA,SAAS,qBACP,WACA,cACA,cACkB;AAClB,MAAI,CAAC,gBAAgB,UAAU,SAAS,KAAM,QAAO;AACrD,SAAO,EAAE,GAAG,WAAW,OAAO,mBAAmB,UAAU,MAAM,YAAY,EAAE;AACjF;AAEA,SAAS,iBACP,SACA,OAC4C;AAC5C,QAAM,SAAqD,CAAC;AAC5D,aAAWA,SAAQ,OAAO;AACxB,WAAOA,MAAK,MAAM,KAAK,OAAOA,MAAK,MAAM,KAAK,KAAK;AAAA,EACrD;AACA,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,UAAU,KAAK,OAAO,OAAO,UAAU,KAAK,KAAK;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,WAA6B,SAAiC;AACjG,MAAI,UAAU,SAAS,oBAAqB,QAAO,gBAAgB,WAAW,OAAO;AACrF,SAAO,kBAAkB,WAAW,OAAO;AAC7C;AAEA,SAAS,4BACP,WACA,aACA,cAC0B;AAC1B,MAAI,UAAU,SAAS,qBAAqB;AAC1C,WAAO,uBAAuB,UAAU,MAAM,aAAa,YAAY;AAAA,EACzE;AACA,SAAO,yBAAyB,UAAU,MAAM,aAAa,YAAY;AAC3E;AAEA,SAAS,qBAAqB,WAAmD;AAC/E,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,QAAQ,WAAW;AAC5B,eAAW,CAAC,KAAK,KAAK,KAAK,qBAAqB,IAAI,EAAG,QAAO,IAAI,KAAK,KAAK;AAAA,EAC9E;AACA,SAAO;AACT;AAEA,SAAS,yBACP,WACA,cACQ;AACR,MAAI,UAAU,SAAS,UAAU,QAAQ;AACvC,WAAOC,OAAK,KAAK,cAAc,UAAU,OAAO,UAAU,MAAM;AAAA,EAClE;AACA,SAAOA,OAAK,QAAQ,UAAU,MAAM,IAAI;AAC1C;AAEO,SAAS,kBAAkB,UAAiC,CAAC,GAA0B;AAC5F,MAAI,YAAY,wBAAwB,OAAO;AAC/C,QAAM,eAAe,2BAA2B;AAChD,cAAY,6BAA6B,WAAW,YAAY;AAEhE,QAAM,QAAQ,aAAa,OAAO;AAClC,sBAAoB,QAAQ,GAAG,MAAM,UAAU,MAAM,kBAAkB;AACvE,QAAM,eAAe,4BAA4B,MAAM,WAAW,MAAM,GAAG;AAE3E,QAAM,gBAAgB,UAAU,oBAC5B,kBAAkB,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,IAC3E,CAAC;AACL,MAAI,cAAc,SAAS,GAAG;AAC5B,wBAAoB,YAAY,GAAG,cAAc,MAAM,+BAA+B;AAAA,EACxF;AAEA,sBAAoB,SAAS,yBAAyB;AACtD,QAAM,QAAQ,qBAAqB,MAAM,SAAS;AAClD,sBAAoB,SAAS,GAAG,MAAM,IAAI,sBAAsB;AAChE,QAAM,WAAW;AAAA,IACf,kBAAkB,IAAI,wBAAwB;AAAA,IAC9C,gBAAgB,IAAI,sBAAsB;AAAA,IAC1C,aAAa,IAAI,mBAAmB;AAAA,EACtC;AAEA,QAAM,QAAwC,CAAC;AAC/C,QAAM,UAA2B,CAAC;AAClC,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,aAAa,UAAU;AAE7B,QAAM,aAAa,MAAe,QAAQ,UAAU;AAEpD,aAAW,eAAe,MAAM,WAAW;AACzC,QAAI,WAAW,EAAG;AAClB,wBAAoB,QAAQ,WAAW;AACvC,UAAM,eAAeA,OAAK,KAAK,aAAa,WAAW;AACvD,UAAM,YAAY,2BAA2B,OAAO,WAAW;AAC/D,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,kBAAkB,UAAU;AAAA,MAC5B,gBAAgB,UAAU;AAAA,MAC1B,gBAAgB,UAAU;AAAA,MAC1B,aAAa,UAAU;AAAA,MACvB,OAAO;AAAA,MACP,KAAK,MAAM;AAAA,IACb;AAEA,UAAM,uBAAuB,UAAU,uBACnC,8BAA8B,QAAQ,IACtC,CAAC;AACL;AAAA,MACE;AAAA,MACA,UAAU,uBACN,GAAG,qBAAqB,MAAM,0BAA0B,WAAW,KACnE;AAAA,IACN;AACA,QAAI,sBAAsB;AAC1B,eAAW,OAAO,sBAAsB;AACtC,UAAI,WAAW,EAAG;AAClB,6BAAuB;AACvB,UAAI,sBAAsB,OAAO,GAAG;AAClC,4BAAoB,cAAc,GAAG,mBAAmB,IAAI,qBAAqB,MAAM,YAAY;AAAA,MACrG;AACA,YAAM,WAAWA,OAAK,QAAQ,IAAI,IAAI;AACtC,UAAI,eAAe,IAAI,QAAQ,EAAG;AAClC,qBAAe,IAAI,QAAQ;AAC3B,YAAM,YAA8B,EAAE,GAAG,KAAK,MAAM,SAAS;AAE7D,YAAM,WAAW,4BAA4B,WAAW,aAAa,YAAY;AACjF,UAAI,UAAU;AACZ,mBAAW,OAAO,UAAU,MAAM,QAAQ;AAC1C,gBAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,SAAS,CAAC;AACnF;AAAA,MACF;AACA,YAAM,eAAe,yBAAyB,WAAW,YAAY;AACrE,YAAM,UAAU,UAAU,IAAIA,OAAK,QAAQ,YAAY,CAAC,KAAK;AAC7D,YAAM,cAAc,2BAA2B;AAAA,QAC7C;AAAA,QACA,gBAAgB;AAAA,QAChB,kBAAkB,UAAU;AAAA,QAC5B,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,qBAAqB,aAAa;AAAA,QAClC,cAAc,UAAU;AAAA,QACxB,gBAAgB,SAAS;AAAA,MAC3B,CAAC;AACD,UAAI,aAAa;AACf,mBAAW,OAAO,UAAU,MAAM,WAAW;AAC7C,gBAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,YAAY,CAAC;AACtF;AAAA,MACF;AACA,cAAQ;AAAA,QACN;AAAA,UACE,qBAAqB,WAAW,UAAU,cAAc,UAAU,sBAAsB;AAAA,UACxF,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,qBAAsB,YAAW,OAAO,yBAAyB,QAAQ,GAAG;AACxF,UAAI,WAAW,EAAG;AAClB,YAAM,WAAWA,OAAK,QAAQ,IAAI,IAAI;AACtC,UAAI,eAAe,IAAI,QAAQ,EAAG;AAClC,qBAAe,IAAI,QAAQ;AAC3B,YAAM,YAA8B,EAAE,GAAG,KAAK,MAAM,SAAS;AAE7D,YAAM,WAAW,wBAAwB,UAAU,MAAM,aAAa,YAAY;AAClF,UAAI,UAAU;AACZ,mBAAW,OAAO,UAAU,MAAM,QAAQ;AAC1C,gBAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,SAAS,CAAC;AACnF;AAAA,MACF;AACA,YAAM,eAAe,yBAAyB,WAAW,YAAY;AACrE,YAAM,UAAU,UAAU,IAAIA,OAAK,QAAQ,YAAY,CAAC,KAAK;AAC7D,YAAM,cAAc,sBAAsB;AAAA,QACxC;AAAA,QACA,gBAAgB;AAAA,QAChB,kBAAkB,UAAU;AAAA,QAC5B,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,qBAAqB,aAAa;AAAA,QAClC,cAAc,UAAU;AAAA,QACxB,gBAAgB,SAAS;AAAA,MAC3B,CAAC;AACD,UAAI,aAAa;AACf,mBAAW,OAAO,UAAU,MAAM,WAAW;AAC7C,gBAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,YAAY,CAAC;AACtF;AAAA,MACF;AACA,cAAQ;AAAA,QACN;AAAA,UACE,qBAAqB,WAAW,UAAU,cAAc,UAAU,sBAAsB;AAAA,UACxF,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,qBAAqB;AAAA,MACzB,GAAG,uBAAuB,QAAQ;AAAA,MAClC,GAAG,gCAAgC,QAAQ;AAAA,IAC7C;AACA,wBAAoB,aAAa,GAAG,mBAAmB,MAAM,oBAAoB,WAAW,EAAE;AAC9F,UAAM,eAAe,oBAAI,IAAY;AACrC,QAAI,oBAAoB;AACxB,eAAW,OAAO,oBAAoB;AACpC,UAAI,WAAW,EAAG;AAClB,2BAAqB;AACrB,UAAI,oBAAoB,OAAO,GAAG;AAChC,4BAAoB,aAAa,GAAG,iBAAiB,IAAI,mBAAmB,MAAM,YAAY;AAAA,MAChG;AACA,YAAM,WAAWA,OAAK,QAAQ,IAAI,IAAI;AACtC,UAAI,aAAa,IAAI,QAAQ,EAAG;AAChC,mBAAa,IAAI,QAAQ;AACzB,YAAM,YAA8B,EAAE,GAAG,KAAK,MAAM,SAAS;AAC7D,YAAM,UAAU,UAAU,IAAIA,OAAK,QAAQ,UAAU,IAAI,CAAC,KAAK;AAC/D,YAAM,eAAe,UACjB,OACA,2BAA2B;AAAA,QACzB,cAAc,UAAU;AAAA,QACxB;AAAA,QACA,OAAO,UAAU;AAAA,QACjB,YAAY,UAAU;AAAA,QACtB,KAAK,MAAM;AAAA,MACb,CAAC;AACL,YAAM,YAAY,oBAAoB;AAAA,QACpC;AAAA,QACA,cAAcA,OAAK,QAAQ,UAAU,IAAI;AAAA,QACzC,gBAAgB,UAAU;AAAA,QAC1B,gBAAgB,UAAU;AAAA,QAC1B,wBAAwB,UAAU;AAAA,QAClC,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,sBAAsB,QAAQ;AAAA,QAC9B;AAAA,QACA,KAAK,MAAM;AAAA,QACX;AAAA,QACA,sBAAsB,UAAU;AAAA,MAClC,CAAC;AACD,UAAI,WAAW;AACb,cAAM,EAAE,QAAQ,aAAa,QAAQ,YAAY,IAAI,mBAAmB,SAAS;AACjF,mBAAW,OAAO,UAAU,MAAM,aAAa,WAAW;AAC1D,gBAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,YAAY,CAAC;AACtF;AAAA,MACF;AACA,cAAQ;AAAA,QACN;AAAA,UACE,qBAAqB,WAAW,UAAU,cAAc,UAAU,sBAAsB;AAAA,UACxF,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW,KAAK,UAAU,uBAAuB,GAAG;AACvD,iBAAW,OAAO,gCAAgC;AAAA,QAChD;AAAA,QACA;AAAA,QACA,qBAAqB,UAAU;AAAA,QAC/B,aAAa,UAAU;AAAA,QACvB;AAAA,QACA,KAAK,MAAM;AAAA,MACb,CAAC,GAAG;AACF,YAAI,WAAW,EAAG;AAClB,cAAM,WAAWA,OAAK,QAAQ,IAAI,IAAI;AACtC,YAAI,eAAe,IAAI,QAAQ,EAAG;AAClC,uBAAe,IAAI,QAAQ;AAC3B,cAAM,YAA8B,EAAE,GAAG,KAAK,MAAM,SAAS;AAC7D,cAAM,QAAQ,UAAU,SAASA,OAAK,SAAS,QAAQ;AACvD,cAAM,UAAU,wBAAwB;AAAA,UACtC;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,OAAO,UAAU;AAAA,UACjB,qBAAqB,UAAU;AAAA,UAC/B;AAAA,QACF,CAAC;AACD,YAAI,SAAS;AACX,qBAAW,OAAO,UAAU,MAAM,OAAO;AACzC,kBAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,QAAQ,CAAC;AAClF;AAAA,QACF;AACA,gBAAQ;AAAA,UACN;AAAA,YACE,qBAAqB,WAAW,UAAU,cAAc,UAAU,sBAAsB;AAAA,YACxF,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB;AACrB,MAAI,wBAAwB;AAC5B,MAAI,mBAAmB;AACvB,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,MAAO,mBAAkB,OAAO;AAC3C,QAAI,CAAC,OAAO,WAAW,CAAC,OAAO,YAAY,OAAO,MAAO,qBAAoB,OAAO;AACpF,QAAI,OAAO,UAAU;AACnB,sBAAgB;AAChB,sBAAgB,OAAO,SAAS;AAChC,UAAI,OAAO,SAAS,uBAAwB,0BAAyB;AAAA,IACvE,WAAW,OAAO,SAAS;AACzB,sBAAgB;AAChB,UAAI,OAAO,eAAe,aAAa,OAAO,MAAO,qBAAoB,OAAO;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,UAAU,UAAU,eACtB,uBAAuB;AAAA,IACrB,aAAa,MAAM;AAAA,IACnB,KAAK,MAAM;AAAA,IACX,gBAAgB,UAAU;AAAA,EAC5B,CAAC,IACD;AACJ;AAAA,IACE;AAAA,IACA,GAAG,QAAQ,MAAM,eAAe,YAAY,aAAa,YAAY;AAAA,EACvE;AAEA,QAAM,qBAAqB,0BAA0B,SAAS,KAAK;AACnE,QAAM,iBAAiB,2BAA2B;AAAA,IAChD,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,QAAQ,CAAC,UAAU;AAAA,IACnB,SAAS,UAAU;AAAA,IACnB,kBAAkB,UAAU;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,gBAAgB,UAAU;AAAA,IAC1B,cAAc,UAAU;AAAA,IACxB,UAAU,UAAU,WAChB;AAAA,MACE,IAAI,UAAU,SAAS;AAAA,MACvB,MAAM,UAAU,SAAS;AAAA,MACzB,WAAW,UAAU,SAAS;AAAA,MAC9B,aAAa,UAAU,SAAS;AAAA,MAChC,QAAQ,UAAU,SAAS;AAAA,IAC7B,IACA;AAAA,IACJ,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,YAAY;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,iBAAiB,SAAS,KAAK;AAAA,IAC9C;AAAA,IACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B,GAAI,mBAAmB,SAAS,IAAI,EAAE,mBAAmB,IAAI,CAAC;AAAA,IAC9D,GAAI,wBAAwB,IAAI,EAAE,sBAAsB,IAAI,CAAC;AAAA,EAC/D,CAAC;AAED,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,QAAQ,CAAC,UAAU;AAAA,IACnB,SAAS,UAAU;AAAA,IACnB,kBAAkB,UAAU;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,gBAAgB,UAAU;AAAA,IAC1B,cAAc,UAAU;AAAA,IACxB,UAAU,UAAU,WAChB;AAAA,MACE,IAAI,UAAU,SAAS;AAAA,MACvB,MAAM,UAAU,SAAS;AAAA,MACzB,WAAW,UAAU,SAAS;AAAA,MAC9B,aAAa,UAAU,SAAS;AAAA,MAChC,QAAQ,UAAU,SAAS;AAAA,IAC7B,IACA;AAAA,IACJ,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,YAAY;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,iBAAiB,SAAS,KAAK;AAAA,IAC9C;AAAA,IACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B,GAAI,mBAAmB,SAAS,IAAI,EAAE,mBAAmB,IAAI,CAAC;AAAA,IAC9D,GAAI,wBAAwB,IAAI,EAAE,sBAAsB,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AACF;AAGO,SAAS,0BAA0B,OAAuC;AAC/E,QAAM,YAAY,gCAAgC,KAAK;AACvD,SAAO,kBAAkB;AAAA,IACvB,SAAS,UAAU;AAAA,IACnB,mBAAmB,UAAU;AAAA,IAC7B,cAAc,UAAU;AAAA,IACxB,kBAAkB,UAAU;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,gBAAgB,UAAU;AAAA,IAC1B,aAAa,UAAU;AAAA,EACzB,CAAC;AACH;AAEO,SAAS,2BAAoC;AAClD,SAAO,QAAQ,IAAI,4BAA4B;AACjD;;;AiCleA;AAHA,SAAS,aAAAC,aAAW,oBAAoB;AAExC,SAAS,iBAAAC,sBAAqB;;;ACM9B;AACA;AACA;AAHA,OAAOC,SAAQ;AAKf,SAAS,wBAAwB,MAA4D;AAC3F,QAAM,OACH,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,YACxD,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,WACnD,QAAQ,IAAI,kBACZ,eAAe,EAAE;AACnB,SAAO,MAAM,kBAAkB,OAAO,GAAG,CAAC,IAAI;AAChD;AAQA,eAAe,oBAAoB,MAAc,QAAgD;AAC/F,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,iBAAiB;AAAA,IAC9C,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,EAC/C,CAAC;AACD,MAAI,CAAC,IAAI,GAAI,QAAO;AACpB,QAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI;AAI/C,MAAI,CAAC,MAAM,YAAa,QAAO;AAC/B,QAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,WAAW;AACnE,MAAI,OAAO,MAAM,MAAM,KAAM,QAAO,EAAE,IAAI,MAAM,IAAI,MAAM,MAAM,KAAK;AAErE,SAAO,EAAE,IAAI,IAAI,MAAM,KAAK,YAAY;AAC1C;AAEA,eAAsB,aAAa,MAAuD;AACxF,QAAM,OAAO,wBAAwB,IAAI;AACzC,MAAI,CAAC,MAAM;AACT,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,CAAC,WAAW,GAAG;AACjB,QAAI,OAAO,KAAK,WAAW,UAAU;AACnC,iBAAW,KAAK,MAAM;AAAA,IACxB,OAAO;AACL,YAAM,QAAQ,MAAM,eAAe,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC;AAChE,UAAI,CAAC,MAAM,GAAI,SAAQ,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,yCAAoC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM;AACtD,MAAI,CAAC,SAAS;AACZ,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,YAA8C;AAAA,IAClD,GAAG;AAAA,IACH,YAAY;AAAA,IACZ,aAAa,QAAQ;AAAA,IACrB,GAAI,QAAQ,KAAK,EAAE,WAAW,QAAQ,GAAG,IAAI,CAAC;AAAA;AAAA,IAE9C,GAAI,OAAO,KAAK,SAAS,WAAW,CAAC,IAAI,EAAE,cAAc,KAAK;AAAA,EAChE;AACA,QAAM,SAAS,SAAS;AAExB,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,+BAA0BA,IAAG,SAAS,CAAC,4BAA4B,QAAQ,IAAI,IAAI;AAC/F,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,2HAA2H;AACzI;;;AChFA;AADA,OAAOC,UAAQ;;;ACXf;;;ACAA;AACA;AACA;AACA,OAAOC,UAAQ;AAYf,SAAS,0BAA0B,OAAyB,SAAuB;AACjF,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAC5E;AAMO,SAAS,8BACd,SAA2B,eAAe,GAC1C,MAAyB,QAAQ,KACR;AACzB,QAAM,MAAM,mBAAmB,KAAK,MAAM;AAC1C,QAAM,MAAM,iBAAiB;AAAA,IAC3B;AAAA,IACA,eAAeA,KAAG,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AACD,QAAM,WAAW,CAAC,GAAG,IAAI,QAAQ;AACjC,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,IAAI,iBAAiB,KAAK,GAAG;AAC3D,aAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,sBAAsB;AAC5B,UAAM,SAAS,IAAI,kCAAkC,OAAO,IAAI,kCAAkC;AAClG,UAAM,MACJ;AACF,QAAI,OAAQ,QAAO,KAAK,GAAG;AAAA,QACtB,UAAS,KAAK,GAAG;AAAA,EACxB;AAEA,QAAM,KAAK,OAAO,WAAW;AAC7B,aAAW,WAAW,SAAU,2BAA0B,QAAQ,OAAO;AACzE,aAAW,SAAS,OAAQ,2BAA0B,SAAS,KAAK;AAEpE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,IAAI;AAAA,IACrB,sBAAsB,IAAI,wBAAwB,IAAI;AAAA,IACtD,SAAS,IAAI;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;;;ACxDA,SAAS,aAAAC,YAAW,gBAAAC,gBAAc,cAAAC,aAAY,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AASV,SAAS,oBAAoB,WAA2B;AAC7D,QAAM,OAAO,UAAU,QAAQ,mBAAmB,GAAG;AACrD,SAAOA,OAAK,KAAKD,UAAQ,GAAG,WAAW,oBAAoB,IAAI,OAAO;AACxE;AAGO,SAAS,qBAAqB,OAI5B;AACP,MAAI;AACF,UAAM,OAAO,oBAAoB,MAAM,SAAS;AAChD,IAAAJ,WAAUK,OAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACjD,UAAM,OAAwB;AAAA,MAC5B,aAAa,MAAM,OAAO,oBAAI,KAAK,GAAG,YAAY;AAAA,MAClD,KAAK,QAAQ;AAAA,MACb,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,IACnB;AACA,UAAM,MAAM,GAAG,IAAI,QAAQ,QAAQ,GAAG;AACtC,IAAAF,eAAc,KAAK,KAAK,UAAU,IAAI,GAAG,MAAM;AAC/C,IAAAD,YAAW,KAAK,IAAI;AAAA,EACtB,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,oBAAoB,WAA2C;AAC7E,MAAI;AACF,UAAM,MAAMD,eAAa,oBAAoB,SAAS,GAAG,MAAM;AAC/D,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,OAAO,QAAQ,eAAe,SAAU,QAAO;AACnD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,uBACd,MACA,SACA,QAAQ,KAAK,IAAI,GACR;AACT,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,WAAW,KAAK,MAAM,KAAK,UAAU;AAC3C,MAAI,OAAO,MAAM,QAAQ,EAAG,QAAO;AACnC,SAAO,QAAQ,WAAW;AAC5B;;;ACvEA,SAASK,SAAQ,MAAuB;AACtC,QAAM,MAAM,QAAQ,IAAI,IAAI,GAAG,KAAK,EAAE,YAAY;AAClD,SAAO,QAAQ,OAAO,QAAQ,UAAU,QAAQ,SAAS,QAAQ;AACnE;AAGO,SAAS,4BAAkC;AAChD,MAAI,QAAQ,aAAa,QAAS;AAClC,MAAIA,SAAQ,oCAAoC,EAAG;AAEnD,UAAQ;AAAA,IACN,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,UAAQ,KAAK,CAAC;AAChB;;;AChBA;AAHA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AAkBjB,SAASC,SAAQ,MAAc,cAAgC;AAC7D,QAAM,MAAM,QAAQ,IAAI,IAAI,GAAG,KAAK,EAAE,YAAY;AAClD,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,OAAO,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,MAAO,QAAO;AAC5E,MAAI,QAAQ,OAAO,QAAQ,UAAU,QAAQ,SAAS,QAAQ,KAAM,QAAO;AAC3E,SAAO;AACT;AAEA,SAAS,OAAO,MAAc,UAAkB,MAAM,GAAW;AAC/D,QAAM,IAAI,OAAO,QAAQ,IAAI,IAAI,CAAC;AAClC,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,IAAK,QAAO;AAC3C,SAAO,KAAK,MAAM,CAAC;AACrB;AAEO,SAAS,6BAAqC;AACnD,QAAM,WACJ,QAAQ,IAAI,wBAAwB,KAAK,KACzC,QAAQ,IAAI,0BAA0B,KAAK;AAC7C,MAAI,SAAU,QAAO;AACrB,SAAOD,OAAK,KAAKD,UAAQ,GAAG,WAAW,oBAAoB;AAC7D;AAEO,SAAS,2BAA2B,YAAY,2BAA2B,GAAW;AAC3F,QAAM,WAAW,QAAQ,IAAI,6BAA6B,KAAK;AAC/D,MAAI,SAAU,QAAO;AACrB,SAAO,GAAG,UAAU,QAAQ,YAAY,EAAE,CAAC;AAC7C;AAEO,SAAS,+BAA8C;AAC5D,QAAM,SAAS,eAAe;AAC9B,SACE,QAAQ,IAAI,gBAAgB,KAAK,KACjC,OAAO,YAAY,KAAK,KACxB,QAAQ,IAAI,2BAA2B,KAAK,KAC5C,QAAQ,IAAI,6BAA6B,KAAK,KAC9C;AAEJ;AAEO,SAAS,0BAAyC;AACvD,SACE,QAAQ,IAAI,oBAAoB,KAAK,KACrC,QAAQ,IAAI,sBAAsB,KAAK,KACvC,QAAQ,IAAI,uBAAuB,KAAK,KACxC;AAEJ;AAGO,SAAS,uBAAsC;AACpD,QAAM,YAAY,2BAA2B;AAC7C,QAAM,YAAY,2BAA2B,SAAS;AACtD,QAAM,cAAc,6BAA6B;AACjD,QAAM,SAAS,wBAAwB;AACvC,QAAM,aAAa,QAAQ,eAAe,MAAM;AAChD,QAAM,cAAcD,aAAW,SAAS;AACxC,QAAM,iBAAiB,eAAe,eAAeG,SAAQ,0BAA0B,KAAK;AAE5F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,GAAG,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA,aAAaA,SAAQ,4BAA4B,cAAc;AAAA,IAC/D,gBAAgB,OAAO,gCAAgC,KAAQ,GAAK;AAAA,IACpE,iBACE,QAAQ,IAAI,+BAA+B,KAAK,EAAE,YAAY,MAAM,SAChE,SACA;AAAA,IACN,mBAAmB,OAAO,qCAAqC,GAAG,CAAC;AAAA,IACnE,YAAY,OAAO,2BAA2B,GAAG,CAAC;AAAA,IAClD,gBAAgB,OAAO,gCAAgC,KAAQ,GAAK;AAAA,IACpE,iBAAiB,OAAO,iCAAiC,MAAS,GAAK;AAAA,EACzE;AACF;AAEO,SAAS,0BAA0B,MAAqB,qBAAqB,GAAY;AAC9F,SAAO,IAAI,eAAe,QAAQ,IAAI,eAAe,IAAI,MAAM;AACjE;;;AChGA,SAASC,mBAAkB,KAAqB;AAC9C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AAC/B;AAEA,eAAsB,kBAAkB,OAMZ;AAC1B,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,eAAe,MAAM,MAAM,KAAK,aAAa,WAAW,GAAG,IAC7D,MAAM,MAAM,KAAK,eACjB,IAAI,MAAM,MAAM,KAAK,YAAY;AACrC,QAAM,MAAM,GAAGA,mBAAkB,MAAM,OAAO,CAAC,GAAG,YAAY;AAC9D,QAAM,QAAQ,MAAM,SAAS,MAAM,MAAM,KAAK,aAAa;AAE3D,QAAM,OAAO;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA,WAAW,MAAM,MAAM,KAAK,OAAO;AAAA,IACnC,MAAM,MAAM,MAAM,KAAK;AAAA,IACvB,QAAQ,MAAM,MAAM,KAAK;AAAA,IACzB,GAAI,MAAM,MAAM,KAAK,YAAY,UAAa,EAAE,SAAS,MAAM,MAAM,KAAK,QAAQ;AAAA,EACpF;AAEA,QAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,IAC7B,QAAQ;AAAA,IACR,SAAS,4BAA4B,MAAM,MAAM;AAAA,IACjD,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,SAAkB;AACtB,MAAI;AACF,aAAS,MAAM,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AAEA,SAAO,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,MAAM,OAAO;AACxD;;;AC3CA;AADA,SAAS,aAAAC,YAAW,cAAAC,cAAY,YAAAC,WAAU,gBAAAC,gBAAc,cAAAC,aAAY,iBAAAC,sBAAqB;AAQzF,IAAM,gBAAgB,KAAK;AAE3B,SAAS,aAAa,UAA2C;AAC/D,MAAI,CAACJ,aAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,SAAS,KAAK,MAAME,eAAa,UAAU,MAAM,CAAC;AACxD,QAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,OAAO,OAAO,SAAU,QAAO;AAAA,EAC9E,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,UAA2B;AAC9C,QAAM,OAAO,aAAa,QAAQ;AAClC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,WAAW,KAAK,GAAG,EAAG,QAAO;AAClC,QAAM,OAAO,KAAK,MAAM,KAAK,EAAE;AAC/B,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,SAAO,KAAK,IAAI,IAAI,OAAO;AAC7B;AAEO,SAAS,uBAAuB,UAA0D;AAC/F,MAAIF,aAAW,QAAQ,KAAK,CAAC,YAAY,QAAQ,GAAG;AAClD,UAAM,OAAO,aAAa,QAAQ;AAClC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,eAAe,KAAK,GAAG,KAAK;AAAA,IAC7C;AAAA,EACF;AACA,MAAIA,aAAW,QAAQ,GAAG;AACxB,QAAI;AACF,MAAAG,YAAW,QAAQ;AAAA,IACrB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI;AACF,UAAM,KAAKF,UAAS,UAAU,IAAI;AAClC,IAAAG;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,KAAK,QAAQ,KAAK,KAAI,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,MACjE;AAAA,IACF;AACA,IAAAL,WAAU,EAAE;AACZ,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,aAAO,EAAE,UAAU,OAAO,QAAQ,qBAAqB;AAAA,IACzD;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,oBAAoB,UAAwB;AAC1D,MAAI;AACF,IAAAI,YAAW,QAAQ;AAAA,EACrB,QAAQ;AAAA,EAER;AACF;;;AClEA,IAAM,UACJ;AAEK,SAAS,iBAAiB,OAAwB;AACvD,SAAO,QAAQ,KAAK,MAAM,KAAK,CAAC;AAClC;AAEA,SAAS,UAAU,OAAe,KAAa,KAA0B;AACvE,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG;AACnC,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,CAAC,MAAO;AACZ,QAAI,UAAU,KAAK;AACjB,eAAS,IAAI,KAAK,KAAK,KAAK,IAAK,KAAI,IAAI,CAAC;AAC1C;AAAA,IACF;AACA,UAAM,YAAY,gBAAgB,KAAK,KAAK;AAC5C,UAAM,OAAO,YAAY,UAAU,CAAC,IAAK;AACzC,UAAM,OAAO,YAAY,KAAK,IAAI,GAAG,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI;AAC7D,QAAI,SAAS,KAAK;AAChB,eAAS,IAAI,KAAK,KAAK,KAAK,KAAK,KAAM,KAAI,IAAI,CAAC;AAChD;AAAA,IACF;AACA,UAAM,aAAa,gBAAgB,KAAK,IAAI;AAC5C,QAAI,YAAY;AACd,YAAM,QAAQ,KAAK,IAAI,KAAK,OAAO,WAAW,CAAC,CAAC,CAAC;AACjD,YAAM,MAAM,KAAK,IAAI,KAAK,OAAO,WAAW,CAAC,CAAC,CAAC;AAC/C,eAAS,IAAI,OAAO,KAAK,KAAK,KAAK,KAAM,KAAI,IAAI,CAAC;AAClD;AAAA,IACF;AACA,UAAM,IAAI,OAAO,IAAI;AACrB,QAAI,OAAO,UAAU,CAAC,KAAK,KAAK,OAAO,KAAK,IAAK,KAAI,IAAI,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAe,OAAe,KAAa,KAAsB;AACrF,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,YAAY,IAAK,QAAO;AAC5B,SAAO,UAAU,SAAS,KAAK,GAAG,EAAE,IAAI,KAAK;AAC/C;AAGO,SAAS,eAAe,MAAc,IAAmB;AAC9D,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,CAAC,MAAM,OAAO,MAAM,MAAM,IAAI,IAAI;AACxC,SACE,aAAa,MAAO,GAAG,cAAc,GAAG,GAAG,EAAE,KAC7C,aAAa,OAAQ,GAAG,YAAY,GAAG,GAAG,EAAE,KAC5C,aAAa,MAAO,GAAG,WAAW,GAAG,GAAG,EAAE,KAC1C,aAAa,MAAO,GAAG,YAAY,IAAI,GAAG,GAAG,EAAE,KAC/C,aAAa,MAAO,GAAG,UAAU,GAAG,GAAG,CAAC;AAE5C;AAEA,IAAM,wBAAwB,MAAM,KAAK;AAEzC,SAAS,oBAAoB,IAAgB;AAC3C,SAAO,IAAI;AAAA,IACT,KAAK;AAAA,MACH,GAAG,eAAe;AAAA,MAClB,GAAG,YAAY;AAAA,MACf,GAAG,WAAW;AAAA,MACd,GAAG,YAAY;AAAA,MACf,GAAG,cAAc;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,uBAAuB,MAAc,OAA0B;AAC7E,MAAI,CAAC,iBAAiB,IAAI,EAAG,QAAO;AACpC,MAAI,SAAS,oBAAoB,KAAK;AACtC,WAAS,IAAI,KAAK,OAAO,QAAQ,IAAI,GAAM;AAC3C,WAAS,IAAI,GAAG,IAAI,uBAAuB,KAAK;AAC9C,QAAI,eAAe,MAAM,MAAM,EAAG,QAAO;AACzC,aAAS,IAAI,KAAK,OAAO,QAAQ,IAAI,GAAM;AAAA,EAC7C;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,MAAmB,KAA0B;AAClF,MAAI,KAAK,iBAAiB,WAAW,KAAK,OAAO;AAC/C,UAAM,KAAK,KAAK,MAAM,KAAK,KAAK;AAChC,WAAO,OAAO,MAAM,EAAE,IAAI,OAAO,IAAI,KAAK,EAAE,EAAE,YAAY;AAAA,EAC5D;AACA,MAAI,KAAK,iBAAiB,UAAU,KAAK,MAAM;AAC7C,UAAM,OAAO,uBAAuB,KAAK,KAAK,KAAK,GAAG,GAAG;AACzD,WAAO,OAAO,KAAK,YAAY,IAAI;AAAA,EACrC;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAAmB,eAAoC;AAC9F,MAAI,KAAK,iBAAiB,UAAU,CAAC,KAAK,MAAM,KAAK,EAAG,QAAO;AAC/D,QAAM,OAAO,uBAAuB,KAAK,KAAK,KAAK,GAAG,aAAa;AACnE,SAAO,OAAO,KAAK,YAAY,IAAI;AACrC;;;ACtGA,SAAS,YAAYE,WAAU;AAQ/B,eAAe,iBAAiB,UAA0C;AACxE,MAAI;AACF,WAAO,MAAMC,IAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AACF;AAEO,SAAS,eAAe,KAAyC;AACtE,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,aACpB,YAAoB,2BAA2B,GACjB;AAC9B,QAAM,MAAM,MAAM,iBAAiB,SAAS;AAC5C,SAAO,eAAe,GAAG;AAC3B;AAEA,eAAe,eACb,WACA,SACe;AACf,QAAM,EAAE,OAAO,WAAW,OAAO,IAAI,MAAM,OAAO,kBAAkB;AACpE,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,aAAa;AAClD,QAAM,EAAE,SAAAC,SAAQ,IAAI,MAAM,OAAO,WAAW;AAC5C,QAAM,MAAMA,SAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,QAAM,MAAM,GAAG,SAAS,IAAID,aAAY,CAAC,EAAE,SAAS,KAAK,CAAC;AAC1D,QAAM,OAAO,KAAK,UAAU,EAAE,QAAQ,GAAyB,MAAM,CAAC;AACtE,QAAM,UAAU,KAAK,MAAM,MAAM;AACjC,QAAM,OAAO,KAAK,SAAS;AAC7B;AAGA,eAAsB,YACpB,OACA,YAAoB,2BAA2B,GAChC;AACf,QAAM,UAAU,MAAM,aAAa,SAAS;AAC5C,QAAM,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,uBAAuB,MAAM,kBAAkB;AACtF,MAAI,OAAO,EAAG,SAAQ,GAAG,IAAI;AAAA,MACxB,SAAQ,KAAK,KAAK;AACvB,QAAM,eAAe,WAAW,OAAO;AACzC;AAEA,eAAsB,2BACpB,YAAoB,2BAA2B,GAChB;AAC/B,QAAM,MAAM,MAAM,iBAAiB,SAAS;AAC5C,MAAI,QAAQ,KAAM,QAAO,EAAE,SAAS,MAAM;AAC1C,QAAM,eAAe,WAAW,CAAC,CAAC;AAClC,SAAO,EAAE,SAAS,KAAK;AACzB;;;ACnEA,SAAS,mBAAmB;AAC5B,SAAS,YAAYE,WAAU;AAC/B,OAAOC,YAAU;AAGjB,IAAM,QAA2B,EAAE,SAAS,GAAG,MAAM,CAAC,EAAE;AAExD,eAAeC,kBAAiB,UAA0C;AACxE,MAAI;AACF,WAAO,MAAMF,IAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AACF;AAEO,SAAS,mBAAmB,KAAuC;AACxE,MAAI,CAAC,IAAK,QAAO,EAAE,GAAG,OAAO,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE;AACrD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,QAAQ,YAAY,KAAK,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,MAAM;AAC5E,aAAO,EAAE,GAAG,OAAO,MAAM,CAAC,EAAE;AAAA,IAC9B;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,EAAE,GAAG,OAAO,MAAM,CAAC,EAAE;AAAA,EAC9B;AACF;AAEA,eAAsB,kBAAkB,WAA+C;AACrF,QAAM,MAAM,MAAME,kBAAiB,SAAS;AAC5C,SAAO,mBAAmB,GAAG;AAC/B;AAEA,eAAe,iBAAiB,WAAmB,OAAyC;AAC1F,QAAMF,IAAG,MAAMC,OAAK,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3D,QAAM,SAAS,YAAY,CAAC,EAAE,SAAS,KAAK;AAC5C,QAAM,MAAM,GAAG,SAAS,QAAQ,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM;AACnE,QAAMD,IAAG,UAAU,KAAK,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACrE,MAAI;AACF,UAAMA,IAAG,OAAO,KAAK,SAAS;AAAA,EAChC,SAAS,KAAK;AACZ,UAAM,OAAQ,IAA8B;AAC5C,QAAI,SAAS,WAAW,SAAS,YAAY,SAAS,SAAU,OAAM;AACtE,UAAMA,IAAG,OAAO,GAAG,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACrC;AACF;AAEA,eAAsB,kBACpB,WACA,OACe;AACf,QAAM,iBAAiB,WAAW,KAAK;AACzC;AAEO,SAAS,oBACd,OACA,oBACkB;AAClB,QAAM,WAAW,MAAM,KAAK,kBAAkB;AAC9C,MAAI,SAAU,QAAO;AACrB,QAAM,UAA4B;AAAA,IAChC;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACA,QAAM,KAAK,kBAAkB,IAAI;AACjC,SAAO;AACT;;;AC7CA,SAAS,WAAW,KAAuB,OAAwB;AACjE,MAAI,CAAC,IAAI,cAAe,QAAO;AAC/B,QAAM,QAAQ,KAAK,MAAM,IAAI,aAAa;AAC1C,SAAO,CAAC,OAAO,MAAM,KAAK,KAAK,QAAQ;AACzC;AAEA,SAAS,YAAY,KAAgC;AACnD,SAAO,QAAQ,IAAI,WAAW;AAChC;AAEA,SAAS,aAAa,KAAuB,KAAoB,OAAwB;AACvF,MAAI,IAAI,wBAAwB,EAAG,QAAO;AAC1C,MAAI,IAAI,sBAAsB,IAAI,WAAY,QAAO;AACrD,MAAI,CAAC,IAAI,cAAe,QAAO;AAC/B,QAAM,OAAO,KAAK,MAAM,IAAI,aAAa;AACzC,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,SAAO,QAAQ,QAAQ,IAAI;AAC7B;AAEA,SAAS,eACP,OACA,KACA,KACe;AACf,MAAI,IAAI,WAAY,QAAO,IAAI;AAC/B,QAAM,UAAU,uBAAuB,MAAM,MAAM,GAAG;AACtD,MAAI,aAAa;AACjB,SAAO;AACT;AAEA,SAAS,MACP,OACA,KACA,OACA,KACS;AACT,MAAI,MAAM,UAAU,YAAY,GAAG,KAAK,WAAW,KAAK,KAAK,EAAG,QAAO;AACvE,MAAI,CAAC,aAAa,KAAK,KAAK,KAAK,EAAG,QAAO;AAC3C,QAAM,SAAS,IAAI,aAAa,KAAK,MAAM,IAAI,UAAU,IAAI;AAC7D,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,SAAO,SAAS;AAClB;AAGA,SAAS,2BACP,OACA,KACA,KACM;AACN,MAAI,MAAM,KAAK,iBAAiB,OAAQ;AACxC,MAAI,aAAa,yBAAyB,MAAM,MAAM,GAAG;AAC3D;AAEA,eAAsB,kBACpB,OAKI,CAAC,GACoB;AACzB,QAAM,MAAM,KAAK,OAAO,qBAAqB;AAC7C,QAAM,MAAM,KAAK,OAAO,oBAAI,KAAK;AACjC,QAAM,QAAQ,IAAI,QAAQ;AAE1B,MAAI,CAAC,IAAI,aAAa;AACpB,WAAO,EAAE,SAAS,OAAO,SAAS,iBAAiB,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,EAAE;AAAA,EAC7G;AACA,MAAI,CAAC,IAAI,eAAe,CAAC,IAAI,QAAQ;AACnC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,OAAO,uBAAuB,IAAI,QAAQ;AAChD,MAAI,CAAC,KAAK,UAAU;AAClB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,KAAK,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,aAAa,IAAI,SAAS;AAChD,UAAM,WAAW,KAAK,kBAClB,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,OAAO,cAAc,KAAK,eAAe,IACtE;AAEJ,UAAM,QAA2B,MAAM,kBAAkB,IAAI,SAAS;AACtE,UAAM,aAAyE,CAAC;AAEhF,eAAW,SAAS,UAAU;AAC5B,YAAM,MAAM,oBAAoB,OAAO,MAAM,kBAAkB;AAC/D,qBAAe,OAAO,KAAK,GAAG;AAC9B,UAAI,MAAM,OAAO,KAAK,OAAO,GAAG,GAAG;AACjC,mBAAW,KAAK,EAAE,OAAO,IAAI,CAAC;AAAA,MAChC;AAAA,IACF;AAEA,eAAW,KAAK,CAAC,GAAG,MAAM;AACxB,YAAM,MAAM,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,KAAK;AAClD,YAAM,MAAM,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,KAAK;AAClD,aAAO,MAAM;AAAA,IACf,CAAC;AAED,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,QAAI,cAAc;AAClB,QAAI,gBAAgB,IAAI;AAExB,eAAW,EAAE,OAAO,IAAI,KAAK,YAAY;AACvC,UAAI,IAAI,oBAAoB,UAAU,MAAM,KAAK,iBAAiB,QAAQ;AACxE,cAAM,OAAO,KAAK,MAAM,IAAI,cAAc,EAAE;AAC5C,YAAI,CAAC,OAAO,MAAM,IAAI,KAAK,OAAO,QAAQ,IAAI,iBAAiB,GAAG;AAChE,cAAI,aAAa,yBAAyB,MAAM,MAAM,GAAG;AACzD;AACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,iBAAiB,GAAG;AACtB;AACA;AAAA,MACF;AAEA,UAAI,gBAAgB,IAAI,KAAK,QAAQ,IAAI,eAAe,EAAE,YAAY;AACtE,UAAI,gBAAgB,IAAI,YAAY;AACpC,iCAA2B,OAAO,KAAK,GAAG;AAE1C,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB;AAAA,UACrC;AAAA,UACA,SAAS,IAAI;AAAA,UACb,QAAQ,IAAI;AAAA,UACZ,SAAS,KAAK;AAAA,QAChB,CAAC;AACD,YAAI,gBAAgB;AACpB,YAAI,OAAO,IAAI;AACb,cAAI,cAAc,IAAI,YAAY;AAClC,cAAI,sBAAsB;AAC1B,cAAI,MAAM,KAAK,iBAAiB,SAAS;AACvC,gBAAI,cAAc,IAAI,YAAY;AAClC,gBAAI,aAAa;AAAA,UACnB;AACA;AACA;AAAA,QACF,OAAO;AACL,cAAI,uBAAuB;AAC3B;AAAA,QACF;AAAA,MACF,QAAQ;AACN,YAAI,gBAAgB;AACpB,YAAI,uBAAuB;AAC3B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAAkB,IAAI,WAAW,KAAK;AAE5C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,KAAK,WAAW;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,UAAE;AACA,wBAAoB,IAAI,QAAQ;AAAA,EAClC;AACF;;;AV3MA;;;AWNA,OAAOG,YAAU;AAEjB;;;ACAA,IAAM,yBAAyB;AAExB,SAAS,oBAAoB,QAAyB;AAC3D,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,eAAgB,OAAqC;AAC3D,MAAI,OAAO,iBAAiB,SAAU,QAAO;AAC7C,QAAM,WAAY,OAAuD;AACzE,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACrC,SAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3C;AAGO,SAAS,kBACd,MACkC;AAClC,QAAM,EAAE,WAAW,YAAY,GAAG,KAAK,IAAI;AAC3C,SAAO;AACT;AAMA,eAAsB,oBACpB,MACA,OACkC;AAClC,MAAI,SAAS,GAAG;AACd,WAAO,EAAE,IAAI,MAAM,SAAS,MAAM,QAAQ,YAAY,WAAW,GAAG,cAAc,EAAE;AAAA,EACtF;AAEA,QAAM,OAAO,kBAAkB,IAAI;AACnC,MAAI,KAAK,gBAAgB,KAAK,eAAe;AAC3C,UAAM,SAAS,MAAM,YAAY;AAAA,MAC/B,GAAG;AAAA,MACH,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW,OAAO,KAAK;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,MACL,GAAI,OAAO,WAAW,YAAY,WAAW,OAAO,SAAS,CAAC;AAAA,MAC9D,QAAQ,EAAE,OAAO;AAAA,MACjB,cAAc,oBAAoB,MAAM;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,eAAe,KAAK,IAAI,OAAO,sBAAsB;AAC3D,QAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,YAAY;AAEnD,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,GAAG;AAAA,IACH,SAAS;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW,OAAO,YAAY;AAAA,EAChC,CAAC;AAED,QAAM,gBAAgB,oBAAoB,MAAM;AAChD,QAAM,YAAY,cAAc,eAAe;AAC/C,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,MACL,GAAI,OAAO,WAAW,YAAY,WAAW,OAAO,SAAS,CAAC;AAAA,MAC9D,QAAQ,EAAE,OAAO;AAAA,MACjB,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,YAAY;AAAA,IAC7B,GAAG;AAAA,IACH,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW,OAAO,SAAS;AAAA,EAC7B,CAAC;AAED,QAAM,cAAc,oBAAoB,IAAI;AAC5C,SAAO;AAAA,IACL,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACvB,cAAc,gBAAgB;AAAA,IAC9B,IAAI;AAAA,EACN;AACF;;;ACjFO,SAAS,2BAA2B,cAAiC;AAC1E,MAAI,CAAC,gBAAgB,OAAO,iBAAiB,SAAU,QAAO,CAAC;AAC/D,QAAM,OAAO;AAGb,QAAM,MAAM,KAAK,UAAU,UAAU;AACrC,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,KAAK;AACvB,QAAI,OAAO,UAAU,SAAU;AAC/B,UAAM,KAAK,MAAM,KAAK;AACtB,QAAI,CAAC,MAAM,KAAK,IAAI,EAAE,EAAG;AACzB,SAAK,IAAI,EAAE;AACX,QAAI,KAAK,EAAE;AAAA,EACb;AACA,SAAO;AACT;;;ACIA,SAAS,yBAAyB,cAAqD;AACrF,QAAM,OAAO;AACb,QAAM,WAAW,KAAK,UAAU;AAChC,SAAO,YAAY,OAAO,aAAa,WAAW,WAAW;AAC/D;AAEA,SAAS,eAAe,OAA+B;AACrD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACjE,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AACtC;AAQO,SAAS,yBACd,cACA,cACgC;AAChC,QAAM,WAAW,yBAAyB,YAAY;AACtD,QAAM,UAAU,eAAe,UAAU,oBAAoB;AAC7D,QAAM,kBAAkB,eAAe,UAAU,eAAe;AAChE,QAAM,cAAc,eAAe,UAAU,WAAW;AACxD,QAAM,wBAAwB,eAAe,UAAU,qBAAqB,KAAK;AACjF,QAAM,sBAAsB,eAAe,UAAU,mBAAmB,KAAK;AAC7E,QAAM,kBAAkB,wBAAwB;AAChD,QAAM,aAAa,mBAAmB;AAEtC,MAAI,YAAY,aAAa;AAC7B,MAAI,eAAe,MAAM;AACvB,gBAAY,KAAK,IAAI,WAAW,UAAU;AAAA,EAC5C,WAAW,YAAY,MAAM;AAC3B,gBAAY,KAAK,IAAI,WAAW,OAAO;AAAA,EACzC;AAEA,MAAI,eAAe,QAAQ,YAAY,MAAM;AAC3C,gBAAY,KAAK,IAAI,WAAW,KAAK,IAAI,aAAa,gBAAgB,OAAO,CAAC;AAAA,EAChF;AAEA,QAAM,gBACJ,UAAU,kBAAkB,SAC1B,cAAc,KAAK,KACnB,aAAa,iBAAiB,KAC9B,aAAa,uBAAuB,KACpC,aAAa,gBAAgB,aAAa;AAE9C,MAAI,aAAa,iBAAiB,KAAK,cAAc,MAAM,iBAAiB,kBAAkB,IAAI;AAChG,UAAM,QAAQ,eAAe,kBAAkB,IAAI,kBAAkB;AACrE,gBAAY,KAAK,IAAI,aAAa,gBAAgB,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACtE;AAEA,QAAM,uBACJ,gBAAgB,QAAQ,oBAAoB,OAAO,KAAK,IAAI,GAAG,cAAc,eAAe,IAAI;AAElG,SAAO;AAAA,IACL,WAAW,KAAK,IAAI,GAAG,SAAS;AAAA,IAChC;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AH/EA;AAEA;AACA;AACA;AAEA;;;AIdA;AACA;AACA;AAHA,OAAOC,YAAU;;;ACAjB;AAaA,eAAsB,iBAAiB,MAQyB;AAC9D,QAAM,OAAO,eAAe,KAAK,OAAO;AACxC,QAAM,SAAS,MAAM,8BAA8B,KAAK,QAAQ,KAAK,WAAW,EAAE,SAAS,KAAK,CAAC;AACjG,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,KAAK,SAAS,CAAC,UAAU,mBAAmB,KAAK,MAAM,CAAC;AACrH,QAAM,MAAM,MAAM,8BAA8B,KAAK,QAAQ;AAAA,IAC3D,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK;AAAA,IACd,UAAU,KAAK;AAAA,EACjB,GAAG,EAAE,WAAW,KAAK,WAAW,SAAS,KAAK,CAAC;AAC/C,SAAO,EAAE,IAAI,IAAI,IAAI,QAAQ,IAAI,QAAQ,UAAU,IAAI,SAAS;AAClE;;;ADxBA,eAAsB,6BACpB,OACA,MACmF;AACnF,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,MAAI,CAAC,UAAW,QAAO,CAAC;AAExB,QAAM,WAAqF,CAAC;AAC5F,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,SAAS;AAAA,MACbC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,cAAc,CAAC,OAAO,OAAQ;AAE3C,UAAM,SAAS,oBAAoB,MAAM;AACzC,QAAI,CAAC,OAAO,iBAAkB;AAE9B,QAAI,OAAO,+BAA+B,OAAO,kBAAkB;AACjE,eAAS,KAAK,EAAE,QAAQ,MAAM,OAAO,qBAAqB,IAAI,MAAM,SAAS,KAAK,CAAC;AACnF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,iBAAiB;AAAA,MACjC;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,OAAO;AAAA,MACP,SAAS,OAAO;AAAA,MAChB,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,MAC/C,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,IAC9C,CAAC;AACD,QAAI,IAAI,IAAI;AACV,aAAO,6BAA6B,OAAO;AAC3C,iBAAW,IAAI,IAAI,MAAM;AAAA,IAC3B;AACA,aAAS,KAAK,EAAE,QAAQ,MAAM,OAAO,qBAAqB,IAAI,IAAI,GAAG,CAAC;AAAA,EACxE;AAEA,SAAO;AACT;;;AE/CA;AACA;AAMO,SAAS,uCAAuC,MAAyB,QAAQ,KAAc;AACpG,QAAM,SAAS,eAAe;AAG9B,SAAO,yBAAyB,QAAQ,GAAG,MAAM;AACnD;AAEO,SAAS,mCACd,aACA,MAAyB,QAAQ,KACb;AACpB,MAAI,CAAC,uCAAuC,GAAG,EAAG,QAAO;AACzD,SAAO,aAAa,wBAAwB;AAC9C;AAMA,eAAsB,iCACpB,WACA,MAC6C;AAC7C,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,MAAM,8BAA8B,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,WAAW,EAAE,SAAS,KAAK,CAAC;AAC9H,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAEvE,MAAI;AACF,UAAM,MAAM,MAAM,QAAQ,KAAK,MAAM;AACrC,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAO,IAAI;AACjB,UAAM,MAAM,MAAM,aAAa;AAC/B,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,aAAO,EAAE,sBAAsB,KAAK;AAAA,IACtC;AACA,UAAM,IAAI,OAAO,GAAG;AACpB,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO,EAAE,sBAAsB,KAAK;AACvE,WAAO,EAAE,sBAAsB,KAAK,MAAM,CAAC,EAAE;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ANxBA;AACA;;;AO1BA,SAAS,aAAAC,kBAAiB;AAG1B,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB,IAAI,OAAO;AAGjC,IAAM,mBAA8B,CAAC,KAAK,MAAM,SAAS;AAC9D,MAAI;AACF,UAAM,SAASA,WAAU,KAAK,MAAM;AAAA,MAClC,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,SAAS,MAAM,aAAa;AAAA,MAC5B,WAAW;AAAA,IACb,CAAC;AACD,WAAO;AAAA,MACL,IAAI,OAAO,WAAW;AAAA,MACtB,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,MAC5D,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,IAC9D;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,QAAQ,IAAI,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,EAC3F;AACF;AAGO,SAAS,WAAc,KAAgB,KAAa,MAA0B;AACnF,QAAM,SAAS,IAAI,KAAK,IAAI;AAC5B,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,OAAO,KAAK,EAAG,QAAO;AAChD,MAAI;AACF,WAAO,KAAK,MAAM,OAAO,MAAM;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACkBO,SAAS,oBAAoB,UAAkB,MAAc,SAAyB;AAC3F,SAAO,GAAG,QAAQ,IAAI,IAAI,IAAI,OAAO;AACvC;AAEO,SAAS,2BACd,SACsC;AACtC,QAAM,KAAK,QAAQ,YAAY,GAAG;AAClC,MAAI,MAAM,KAAK,OAAO,QAAQ,SAAS,EAAG,QAAO;AACjD,QAAM,OAAO,QAAQ,MAAM,GAAG,EAAE;AAChC,QAAM,MAAM,QAAQ,MAAM,KAAK,CAAC;AAChC,MAAI,CAAC,qBAAqB,KAAK,IAAI,KAAK,CAAC,oBAAoB,KAAK,GAAG,EAAG,QAAO;AAC/E,SAAO,EAAE,MAAM,IAAI;AACrB;AAGO,SAAS,kBACd,SACyC;AACzC,QAAM,IAAI,QACP,KAAK,EACL,MAAM,yEAAyE;AAClF,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,SAAS,OAAO,EAAE,CAAC,CAAC;AAC1B,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,EAAG,QAAO;AACpD,SAAO,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO;AAC9B;;;AChEA,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAE1B,SAAS,mBAAmB,KAAyB;AACnD,MAAI,QAAQ,IAAI,cAAc,KAAK,KAAK,QAAQ,IAAI,UAAU,KAAK,EAAG,QAAO;AAC7E,SAAO,IAAI,MAAM,CAAC,QAAQ,OAAO,CAAC,EAAE;AACtC;AAEA,SAASC,UAAS,OAAgD;AAChE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEA,SAAS,eAAe,OAAgD;AACtE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,IAAI,CAAC,QAAQA,UAAS,GAAG,CAAC,EAC1B,OAAO,CAAC,QAAwC,QAAQ,IAAI,EAC5D,MAAM,GAAG,eAAe,EACxB,IAAI,CAAC,SAAS;AAAA,IACb,SAAS,IAAI,WAAW;AAAA,IACxB,OAAO,IAAI,SAAS;AAAA,IACpB,YAAY,IAAI,cAAc;AAAA,IAC9B,aAAa,IAAI,eAAe;AAAA,EAClC,EAAE;AACN;AAEA,SAAS,oBACP,KACA,MACA,KACqE;AACrE,QAAM,SAAS,WAAoC,KAAK,MAAM;AAAA,IAC5D;AAAA,IACA,SAAS,IAAI,YAAY,GAAG;AAAA,EAC9B,CAAC;AACD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,EAAE,OAAO,OAAO,SAAS,MAAM,UAAU,eAAe,OAAO,QAAQ,EAAE;AAClF;AAEO,IAAM,yBAAkD;AAAA,EAC7D,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ,SAAS,KAAK;AACpB,UAAM,SAAS,kBAAkB,OAAO;AACxC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,OAAO,WAAoC,KAAK,MAAM;AAAA,MAC1D;AAAA,MACA,SAAS,OAAO,IAAI,UAAU,OAAO,MAAM;AAAA,IAC7C,CAAC;AACD,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,OAAOA,UAAS,KAAK,IAAI;AAC/B,UAAM,UAAU,OAAO,MAAM,QAAQ,WAAW,KAAK,MAAM;AAC3D,UAAM,OAAOA,UAAS,KAAK,IAAI;AAC/B,UAAM,gBAAgBA,UAASA,UAAS,MAAM,IAAI,GAAG,KAAK;AAC1D,UAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,MAAM,GAAG,cAAc,IAAI;AAElF,QAAI,YAA4C,CAAC;AACjD,QAAI,iBAA+E;AAAA,MACjF,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb;AACA,QAAI,SAAS;AACX,YAAM,OAAO,WAAqC,KAAK,MAAM;AAAA,QAC3D;AAAA,QACA,SAAS,OAAO,IAAI,YAAY,OAAO;AAAA,MACzC,CAAC;AACD,UAAI,MAAM,QAAQ,MAAM,UAAU,GAAG;AACnC,oBAAY,KAAK,WACd,IAAI,CAAC,QAAQA,UAAS,GAAG,CAAC,EAC1B,OAAO,CAAC,QAAwC,QAAQ,IAAI,EAC5D,MAAM,GAAG,cAAc,EACvB,IAAI,CAAC,SAAS;AAAA,UACb,MAAM,IAAI,QAAQ;AAAA,UAClB,QAAQ,IAAI,UAAU;AAAA,UACtB,YAAY,IAAI,cAAc;AAAA,QAChC,EAAE;AAAA,MACN;AACA,uBAAiB,oBAAoB,KAAK,OAAO,MAAM,OAAO,KAAK;AAAA,IACrE;AAEA,UAAM,cAAc,IAAI,MAAM;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,SAAS,OAAO,IAAI,UAAU,OAAO,MAAM;AAAA,MAC3C;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,eAAe,YAAY,KAC7B,YAAY,OACT,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,MAAM,GAAG,iBAAiB,IAC7B,CAAC;AAEL,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,UAAU,KAAK,YAAY;AAAA,QAC3B,OAAO,KAAK,SAAS;AAAA,QACrB;AAAA,QACA,MAAM,EAAE,OAAO,MAAM,SAAS,KAAK;AAAA,QACnC,OAAO,KAAK,SAAS;AAAA,QACrB,OAAO,KAAK,SAAS;AAAA,QACrB,QAAQ,KAAK,UAAU;AAAA,QACvB,WAAW,KAAK,aAAa;AAAA,QAC7B,kBAAkB,KAAK,oBAAoB;AAAA,QAC3C,WAAW,KAAK,aAAa;AAAA,QAC7B,iBAAiB,KAAK,mBAAmB;AAAA,QACzC,MAAM;AAAA,UACJ,KAAK;AAAA,UACL,KAAK,MAAM,OAAO;AAAA,UAClB,MAAM,EAAE,OAAO,EAAE,OAAO,eAAe,SAAS,KAAK,EAAE;AAAA,QACzD;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,2BAAoD;AAAA,EAC/D,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ,SAAS,KAAK;AACpB,UAAM,SAAS,2BAA2B,OAAO;AACjD,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,oBAAoB,KAAK,OAAO,MAAM,OAAO,GAAG;AAAA,EACzD;AACF;AAEO,IAAM,iCAA0D;AAAA,EACrE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ,SAAS,KAAK;AACpB,UAAM,SAAS,2BAA2B,OAAO;AACjD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,WAAW,WAAyC,KAAK,MAAM;AAAA,MACnE;AAAA,MACA,SAAS,OAAO,IAAI;AAAA,IACtB,CAAC;AACD,UAAM,gBACJ,OAAO,UAAU,mBAAmB,YAAY,SAAS,eAAe,KAAK,IACzE,SAAS,eAAe,KAAK,IAC7B;AACN,QAAI,CAAC,cAAe,QAAO;AAC3B,UAAM,UAAU,WAAiC,KAAK,MAAM;AAAA,MAC1D;AAAA,MACA,SAAS,OAAO,IAAI,YAAY,mBAAmB,aAAa,CAAC,MAAM,OAAO,GAAG;AAAA,IACnF,CAAC;AACD,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,gBAAgB,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAC5E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,kBAAkB,eAAe,kBAAkB;AAAA,IAChE;AAAA,EACF;AACF;;;AC3KA,IAAM,sBAAsB;AAC5B,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEb,IAAM,+BAAwD;AAAA,EACnE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY,KAAK;AACf,WAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;AAAA,EACnC;AAAA,EACA,QAAQ,SAAS,KAAK;AACpB,UAAM,SAAS,2BAA2B,OAAO;AACjD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,IAAI,UAAU;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,OAAO,GAAG;AAAA,IAC/B,CAAC;AACD,QAAI,CAAC,OAAO,GAAI,QAAO;AAEvB,UAAM,cAA4D,CAAC;AAEnE,eAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,GAAG;AAC5C,YAAM,MAAM,KAAK,MAAM,WAAW,IAAI,CAAC;AACvC,UAAI,CAAC,IAAK;AACV,YAAM,QAAQ,KAAK,MAAM,aAAa,IAAI,CAAC,GAAG,YAAY,KAAK;AAC/D,kBAAY,KAAK,EAAE,KAAK,MAAM,CAAC;AAC/B,UAAI,YAAY,UAAU,oBAAqB;AAAA,IACjD;AACA,WAAO,EAAE,OAAO,YAAY,SAAS,GAAG,YAAY;AAAA,EACtD;AACF;;;ACjCA,IAAM,WAAsC,CAAC;AAEtC,SAAS,0BAA0B,QAAuC;AAC/E,MAAI,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO,YAAY,EAAE,SAAS,OAAO,IAAI,EAAG;AACpF,WAAS,KAAK,MAAM;AACtB;AAEO,SAAS,qBACd,UACA,MACgC;AAChC,SAAO,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,SAAS,IAAI,KAAK;AAC7E;AAOO,SAAS,oCAA0C;AACxD,4BAA0B,sBAAsB;AAChD,4BAA0B,wBAAwB;AAClD,4BAA0B,8BAA8B;AACxD,4BAA0B,4BAA4B;AACxD;;;ACpBA,IAAM,gCAAgC;AACtC,IAAM,sBAAsB;AAcrB,SAAS,wBACd,QACA,OAKI,CAAC,GAC8B;AACnC,oCAAkC;AAClC,QAAM,MAAM,KAAK,OAAO;AACxB,QAAM,MAAM,KAAK,QAAQ,MAAM,oBAAI,KAAK;AACxC,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,WAAW,KAAK,IAAI,KAAK,KAAK,cAAc;AAElD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAAU,OAAO,OAAO,CAAC,MAAM;AACnC,UAAM,MAAM,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO;AAC7D,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AAID,QAAM,SACJ,QAAQ,SAAS,IACb,KAAK,MAAM,IAAI,EAAE,QAAQ,IAAI,GAAM,IAAI,QAAQ,SAC/C;AACN,QAAM,UAAU,QAAQ,IAAI,CAAC,GAAG,MAAM,SAAS,SAAS,KAAK,QAAQ,MAAM,CAAC;AAC5E,QAAM,SAAS,QAAQ,MAAM,GAAG,WAAW;AAE3C,QAAM,UAA6C;AAAA,IACjD,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,EACZ;AACA,QAAM,eAAe,oBAAI,IAAqB;AAE9C,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,IAAI,IAAI,UAAU;AACzB,cAAQ,QAAQ,KAAK,EAAE,GAAG,MAAM,QAAQ,mBAAmB,CAAC;AAC5D;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,KAAK,UAAU,KAAK,IAAI;AAC5D,QAAI,CAAC,QAAQ;AACX,cAAQ,QAAQ,KAAK,EAAE,GAAG,MAAM,QAAQ,YAAY,CAAC;AACrD;AAAA,IACF;AACA,UAAM,WAAW,GAAG,OAAO,QAAQ,IAAI,OAAO,IAAI;AAClD,QAAI,YAAY,aAAa,IAAI,QAAQ;AACzC,QAAI,cAAc,QAAW;AAC3B,kBAAY,OAAO,YAAY,GAAG;AAClC,mBAAa,IAAI,UAAU,SAAS;AAAA,IACtC;AACA,QAAI,CAAC,WAAW;AACd,cAAQ,QAAQ,KAAK,EAAE,GAAG,MAAM,QAAQ,uBAAuB,CAAC;AAChE;AAAA,IACF;AACA,YAAQ,aAAa;AACrB,UAAM,UAAU,OAAO,QAAQ,KAAK,SAAS,GAAG;AAChD,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,cAAQ,QAAQ,KAAK,EAAE,GAAG,MAAM,QAAQ,iBAAiB,CAAC;AAC1D;AAAA,IACF;AACA,YAAQ,aAAa;AACrB,YAAQ,MAAM,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd;AAAA,MACA,YAAY,IAAI,EAAE,YAAY;AAAA,MAC9B,kBAAkB,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACxGA;AACA;AAFA,OAAOC,YAAU;AAKjB,IAAM,cAAc;AAOpB,SAAS,eAAe,OAAuB;AAC7C,SAAOA,OAAK,KAAK,aAAa,KAAK,GAAG,WAAW;AACnD;AAEA,SAAS,iBAAiB,OAA8C;AACtE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,MAAoC,CAAC;AAC3C,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG;AAC3D,UAAM,MAAM;AACZ,UAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,SAAS,KAAK,IAAI;AAC1E,UAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,IAAI;AAC9D,UAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,QAAQ,KAAK,IAAI;AACvE,QAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAS;AACpC,QAAI,KAAK,EAAE,UAAU,MAAM,QAAQ,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,oCAAoC,OAA6C;AAC/F,QAAM,YAAY,SAAiC,eAAe,KAAK,GAAG,IAAI;AAC9E,SAAO,iBAAiB,WAAW,MAAM;AAC3C;AAEO,SAAS,8BACd,OACA,QACM;AACN,YAAU,eAAe,KAAK,GAAG;AAAA,IAC/B,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAChC;AAAA,EACF,CAA2B;AAC7B;AAGO,SAAS,8BACd,cACqC;AACrC,MAAI,CAAC,gBAAgB,OAAO,iBAAiB,YAAY,MAAM,QAAQ,YAAY,EAAG,QAAO;AAC7F,QAAM,SAAU,aAAyC;AACzD,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,SAAO,iBAAiB,MAAM;AAChC;;;AbEA,eAAsB,wBACpB,OACA,MAC4F;AAC5F,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,WAA8F,CAAC;AACrG,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,UAAM,SAAS;AAAA,MACbC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,MACxE;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,UAAU,OAAO,UAAW;AACzC,QAAI,yBAAyB,MAAM,GAAG;AACpC,eAAS,KAAK,EAAE,QAAQ,MAAM,IAAI,MAAM,QAAQ,OAAO,UAAU,MAAM,SAAS,KAAK,CAAC;AACtF;AAAA,IACF;AACA,UAAM,SAAS,oBAAoB,MAAM;AACzC,QAAI,CAAC,uBAAuB,MAAM,EAAG;AAQrC,UAAM,gBAAgB,0BAA0B;AAAA,MAC9C,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,aAAa,OAAO;AAAA,IACtB,CAAC;AAID,QAAI,CAAC,OAAO,cAAc,CAAC,OAAO,eAAe,CAAC,eAAe,YAAa;AAC9E,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,MACA,WAAW,OAAO,KAAK,aAAa,OAAO,aAAa,EAAE;AAAA,MAC1D,GAAG;AAAA,IACL,CAAC;AACD,aAAS,KAAK,EAAE,QAAQ,MAAM,IAAI,OAAO,IAAI,QAAQ,OAAO,UAAU,KAAK,CAAC;AAAA,EAC9E;AACA,SAAO;AACT;AAEA,eAAe,iBACb,WACA,OACA,cACA,MACA,gBACkB;AAClB,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,MAAM,8BAA8B,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,WAAW,EAAE,SAAS,KAAK,CAAC;AAC9H,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AACvE,QAAM,kBAAkB,MAAM,gCAAgC;AAC9D,QAAM,uBAAuB,+BAA+B,KAAK;AAOjE,MAAI,qBAAwE;AAC5E,MAAI;AACF,UAAM,iBAAiB,oCAAoC,KAAK;AAChE,yBACE,eAAe,SAAS,IAAI,wBAAwB,cAAc,IAAI;AAAA,EAC1E,QAAQ;AACN,yBAAqB;AAAA,EACvB;AAEA,QAAM,MAAM,MAAM,SAAS,KAAK,QAAQ;AAAA,IACtC;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,sBAAsB,cAAc,KAAK;AAAA,IACzC;AAAA,IACA,qBAAqB,iCAAiC,cAAc;AAAA,MAClE,cAAc;AAAA,MACd,SAAS,yBAAyB,eAAe,CAAC;AAAA,IACpD,CAAC;AAAA,IACD;AAAA,IACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC3C,gBAAgB,6BAA6B,EAAE,MAAM,CAAC;AAAA,IACtD;AAAA,IACA,GAAI,sBAAsB,mBAAmB,MAAM,SAAS,IACxD,EAAE,kBAAkB,mBAAmB,MAAM,IAC7C,CAAC;AAAA,EACP,CAAC;AACD,QAAM,aAAa,8BAA8B,IAAI,QAAQ;AAC7D,MAAI,YAAY;AACd,QAAI;AACF,oCAA8B,OAAO,UAAU;AAAA,IACjD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,YAAY,IAAI;AAAA,IAChB,UAAU,IAAI;AAAA,IACd,GAAI,qBACA;AAAA,MACE,kBAAkB;AAAA,QAChB,WAAW,mBAAmB;AAAA,QAC9B,WAAW,mBAAmB;AAAA,QAC9B,SAAS,mBAAmB,QAAQ;AAAA,MACtC;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;AAMA,eAAsB,gBAAgB,MAAqE;AACzG,QAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,CAAC;AAC9D,QAAM,YAAY,OAAO,SAAS,OAAO,KAAK,aAAa,EAAE,GAAG,eAAe,CAAC;AAChF,QAAM,UAAU,KAAK,YAAY,SAAS,KAAK,YAAY;AAE3D,YAAU,EAAE,KAAK,MAAM,CAAC;AAExB,QAAM,iBAAiB,MAAM,iCAAiC,WAAW,IAAI;AAC7E,QAAM,+BAA+B,mCAAmC,cAAc;AACtF,QAAM,eAAe,0BAA0B;AAAA,IAC7C;AAAA,IACA;AAAA,EACF,CAAC;AAKD,QAAM,iBAAiB,yBAAyB,IAAI,0BAA0B,KAAK,IAAI;AACvF,QAAM,eAAe,MAAM,iBAAiB,WAAW,OAAO,cAAc,MAAM,cAAc;AAChG,QAAM,oBAAoB,2CAA2C,OAAO,YAAY;AAExF,QAAM,eAAe,MAAM,sBAAsB,OAAO,IAAI;AAO5D,QAAM,mBAAmB,MAAM,wBAAwB,OAAO,IAAI;AAKlE,QAAM,uBAAuB,0BAA0B;AAAA,IACrD;AAAA,IACA;AAAA,EACF,CAAC;AAOD,QAAM,iBAAiB,sBAAsB;AAC7C,QAAM,mBAAmB,MAAM,6BAA6B,OAAO,IAAI;AAEvE,QAAM,kBAAkB,yBAAyB,sBAAsB,YAAY;AACnF,MAAI,YAAY,gBAAgB;AAEhC,QAAM,QAAQ,MAAM,SAAS,EAAE,KAAK,OAAO,WAAW,UAAU,MAAM,GAAG,KAAK,CAAC;AAE/E,MAAI,WAAoB;AACxB,MAAI,eAAe;AACnB,QAAM,qBAAqB,2BAA2B,YAAY;AAClE,MAAI,kBAAkB;AAEtB,MAAI,WAAW,kBAAkB,KAAK,mBAAmB,SAAS,GAAG;AACnE,UAAM,cAAc,KAAK,IAAI,iBAAiB,mBAAmB,MAAM;AACvE,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,QACE,GAAG;AAAA,QACH,KAAK;AAAA,QACL;AAAA,QACA,eAAe,mBAAmB,KAAK,GAAG;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAAe,oBAAoB,KAAK;AAC9C,oBAAgB;AAChB,sBAAkB,KAAK,IAAI,GAAG,kBAAkB,YAAY;AAC5D,eAAW,EAAE,oBAAoB,OAAO,aAAa;AAAA,EACvD;AAEA,MAAI,WAAW,kBAAkB,GAAG;AAClC,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,QACE,GAAG;AAAA,QACH,KAAK;AAAA,QACL;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAAe,oBAAoB,KAAK;AAC9C,oBAAgB;AAChB,eACE,YAAY,OAAO,aAAa,WAC5B,EAAE,GAAI,UAAsC,OAAO,aAAa,IAChE;AAAA,EACR,WAAW,CAAC,WAAW,aAAa,GAAG;AACrC,QAAI,CAAC,UAAU;AACb,iBAAW;AAAA,QACT,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,QAAQ,UAAU,qBAAqB,UAAU,4BAA4B;AAAA,QAC7E,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,GAAI,mBAAmB,SAAS,EAAE,oBAAoB,WAAW,KAAK,IAAI,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF,WAAW,YAAY,OAAO,aAAa,UAAU;AACnD,eAAW,EAAE,GAAI,UAAsC,cAAc,MAAM,aAAa;AAAA,EAC1F;AACA,QAAM,OACJ,CAAC,gBAAgB,iBACjB,cAAc,KACd,iBAAiB,WAAW,KAC5B,iBAAiB;AAEnB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;;;ActSA;AADA,OAAOC,UAAQ;;;ACCf,SAAS,gBAAAC,sBAAoB;AAC7B,SAAS,WAAAC,WAAS,gBAAgB;AAClC,OAAOC,YAAU;AACjB,SAAS,gBAAAC,qBAAoB;AAatB,SAAS,uBAAuB,KAAa,MAAc,KAAK,IAAI,GAAkB;AAC3F,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAM,QAAQ,KAAK,eAAe;AAClC,UAAM,YAAY,KAAK,eAAe;AACtC,QAAI,OAAO,UAAU,YAAY,CAAC,MAAO,QAAO;AAEhD,QAAI,OAAO,cAAc,YAAY,YAAY,MAAM,IAAQ,QAAO;AACtE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAoC;AAC3C,MAAI,SAAS,MAAM,UAAU;AAC3B,QAAI;AACF,YAAM,MAAMA;AAAA,QACV;AAAA,QACA,CAAC,yBAAyB,MAAM,2BAA2B,IAAI;AAAA,QAC/D,EAAE,UAAU,QAAQ,OAAO,CAAC,UAAU,QAAQ,QAAQ,EAAE;AAAA,MAC1D;AACA,aAAO,uBAAuB,IAAI,KAAK,CAAC;AAAA,IAC1C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI;AACF,UAAM,MAAMH,eAAaE,OAAK,KAAKD,UAAQ,GAAG,WAAW,mBAAmB,GAAG,MAAM;AACrF,WAAO,uBAAuB,GAAG;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iCACd,MAA0C,QAAQ,KAClD,OAAiC,CAAC,GACA;AAClC,QAAM,SAAS,IAAI,mBAAmB,KAAK;AAC3C,MAAI,OAAQ,QAAO,EAAE,MAAM,WAAW,KAAK,OAAO;AAElD,QAAM,WAAW,IAAI;AACrB,QAAM,UACJ,KAAK,eAAe,QAAQ,aAAa,OAAO,aAAa,UAAU,aAAa;AACtF,MAAI,SAAS;AACX,UAAM,QAAQ,mBAAmB;AACjC,QAAI,MAAO,QAAO,EAAE,MAAM,SAAS,MAAM;AAAA,EAC3C;AACA,SAAO;AACT;;;ACrDA,IAAM,uBAAuB;AAmBtB,SAAS,6BAAyD;AACvE,SAAO,EAAE,QAAQ,CAAC,GAAG,YAAY,MAAM,aAAa,GAAG,cAAc,EAAE;AACzE;AAGO,SAAS,mBAAmB,KAAiC,OAAwB;AAC1F,QAAM,IAAI;AAQV,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,UAAI,cAAc,EAAE,SAAS,OAAO,gBAAgB;AACpD,aAAO;AAAA,IACT,KAAK,uBAAuB;AAC1B,YAAM,MAAM,EAAE,SAAS,IAAI,OAAO;AAClC,UAAI,OAAO,GAAG,IAAI;AAAA,QAChB,MAAM,EAAE,eAAe,SAAS,aAAa,aAAa;AAAA,QAC1D,MAAM;AAAA,QACN,IAAI,EAAE,eAAe;AAAA,QACrB,MAAM,EAAE,eAAe;AAAA,QACvB,WAAW;AAAA,MACb;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,uBAAuB;AAC1B,YAAM,QAAQ,IAAI,OAAO,EAAE,SAAS,IAAI,OAAO,SAAS,CAAC;AACzD,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,EAAE,OAAO,SAAS,gBAAgB,EAAE,MAAM,MAAM;AAClD,cAAM,QAAQ,EAAE,MAAM;AACtB,eAAO,EAAE,MAAM;AAAA,MACjB;AACA,UAAI,EAAE,OAAO,SAAS,sBAAsB,EAAE,MAAM,cAAc;AAChE,cAAM,aAAa,EAAE,MAAM;AAAA,MAC7B;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,UAAI,EAAE,OAAO,YAAa,KAAI,aAAa,EAAE,MAAM;AACnD,UAAI,OAAO,EAAE,OAAO,kBAAkB,SAAU,KAAI,eAAe,EAAE,MAAM;AAC3E,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,mBAAmB,KAAmD;AACpF,QAAM,UAAqB,CAAC;AAC5B,aAAW,SAAS,IAAI,QAAQ;AAC9B,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,QAAiB,CAAC;AACtB,UAAI;AACF,gBAAQ,MAAM,YAAY,KAAK,MAAM,MAAM,SAAS,IAAI,CAAC;AAAA,MAC3D,QAAQ;AACN,gBAAQ,CAAC;AAAA,MACX;AACA,cAAQ,KAAK,EAAE,MAAM,YAAY,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,IACtF,WAAW,MAAM,MAAM;AACrB,cAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,IAAI,cAAc;AAAA,IAC/B,OAAO,EAAE,cAAc,IAAI,aAAa,eAAe,IAAI,aAAa;AAAA,EAC1E;AACF;AAIA,gBAAgB,cAAc,MAA2D;AACvF,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI;AACF,eAAS;AACP,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAI;AACJ,cAAQ,MAAM,OAAO,QAAQ,IAAI,OAAO,IAAI;AAC1C,cAAM,OAAO,OAAO,MAAM,GAAG,GAAG,EAAE,KAAK;AACvC,iBAAS,OAAO,MAAM,MAAM,CAAC;AAC7B,YAAI,CAAC,KAAK,WAAW,OAAO,EAAG;AAC/B,cAAM,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,YAAI,CAAC,WAAW,YAAY,SAAU;AACtC,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAEO,SAAS,oBAAoB,MAA0C,QAAQ,KAAa;AACjG,UAAQ,IAAI,oBAAoB,KAAK,KAAK,6BAA6B,QAAQ,OAAO,EAAE;AAC1F;AAEA,eAAsB,yBAAyB,OAMjB;AAC5B,QAAM,EAAE,OAAO,OAAO,QAAQ,IAAI;AAElC,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB;AACA,MAAI,SAAkB,QAAQ;AAC9B,MAAI,MAAM,SAAS,WAAW;AAC5B,YAAQ,WAAW,IAAI,MAAM;AAAA,EAC/B,OAAO;AACL,YAAQ,gBAAgB,UAAU,MAAM,KAAK;AAC7C,YAAQ,gBAAgB,IAAI;AAC5B,aAAS;AAAA,MACP,EAAE,MAAM,QAAQ,MAAM,qBAAqB;AAAA,MAC3C,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,MAAM,GAAG,oBAAoB,CAAC,gBAAgB;AAAA,IAC9D,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,MAAM,KAAK,UAAU;AAAA,MACnB;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,GAAI,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,SAAS,IAAI,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAC3F,GAAI,QAAQ,gBAAgB,SAAY,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,MAChF,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACxB,UAAM,SAAS,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC9C,UAAM,IAAI,MAAM,iCAAiC,IAAI,MAAM,GAAG,SAAS,WAAM,OAAO,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE;AAAA,EAC5G;AAEA,QAAM,MAAM,2BAA2B;AACvC,mBAAiB,SAAS,cAAc,IAAI,IAAI,GAAG;AACjD,UAAM,QAAQ,mBAAmB,KAAK,KAAK;AAC3C,QAAI,MAAO,OAAM,QAAQ,KAAK;AAAA,EAChC;AACA,SAAO,mBAAmB,GAAG;AAC/B;;;ACpMO,IAAM,uBAAuB;AAE7B,IAAM,eAAN,MAAmB;AAAA,EAKxB,YACmB,SACA,UAAkB,sBACnC;AAFiB;AACA;AAAA,EAChB;AAAA,EAPK,SAAS;AAAA,EACT,QAA+B;AAAA,EAC/B,SAAS;AAAA,EAOjB,KAAK,MAAoB;AACvB,QAAI,KAAK,UAAU,CAAC,KAAM;AAC1B,SAAK,UAAU;AACf,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,WAAW,MAAM;AAC5B,aAAK,QAAQ;AACb,aAAK,SAAS;AAAA,MAChB,GAAG,KAAK,OAAO;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,WAAiB;AACvB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM,OAAO,KAAK;AAClB,SAAK,SAAS;AACd,SAAK,QAAQ,IAAI;AAAA,EACnB;AAAA;AAAA,EAGA,QAAc;AACZ,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,QAAI,KAAK,OAAO;AACd,mBAAa,KAAK,KAAK;AACvB,WAAK,QAAQ;AAAA,IACf;AACA,SAAK,SAAS;AAAA,EAChB;AACF;;;AH5BA,IAAM,gBAAgB;AACtB,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,IAAI;AACjC,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAkB3B,eAAe,kBACb,YACA,QACA,KACwB;AACxB,QAAM,WAAW,IAAI,gCAAgC,KAAK;AAC1D,MAAI,SAAU,QAAO;AACrB,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,oBAAoB;AACvE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,WAAW,QAAQ,OAAO,EAAE,CAAC,4BAA4B;AAAA,MAClF,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,MAC7C,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI;AAC/C,WAAO,OAAO,MAAM,cAAc,YAAY,KAAK,UAAU,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI;AAAA,EAChG,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAGA,eAAsB,wBACpB,MAA0C,QAAQ,KAChB;AAClC,QAAM,SAAS,eAAe;AAC9B,QAAM,YAAY,OAAO,WAAW,KAAK;AACzC,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,aAAa,CAAC,OAAQ,QAAO;AAClC,QAAM,YAAY,MAAM,kBAAkB,OAAO,YAAY,QAAQ,GAAG;AACxE,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO;AAAA,IACL,WAAW,UAAU,QAAQ,OAAO,EAAE;AAAA,IACtC;AAAA,IACA;AAAA,IACA,OAAOG,KAAG,SAAS;AAAA,IACnB,OAAO,IAAI,mBAAmB,KAAK,KAAK,OAAO,cAAc,KAAK,KAAK;AAAA,IACvE,gBAAgB,OAAO,uBAAuB;AAAA,EAChD;AACF;AAQA,eAAe,UACb,QACA,YAC4C;AAC5C,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,sBAAsB;AAEzE,QAAM,WAAW,YAAY,MAAM;AACjC,QAAI,WAAW,EAAG,YAAW,MAAM;AAAA,EACrC,GAAG,GAAG;AACN,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,SAAS,uBAAuB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,OAAO,MAAM;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,OAAO,OAAO;AAAA,QACd,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,QAAI,IAAI,WAAW,IAAK,QAAO;AAC/B,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,IAAK,QAAO;AACrD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,EAAE;AAC/D,UAAM,OAAQ,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI;AAC/C,WAAO,MAAM,QAAQ;AAAA,EACvB,SAAS,KAAK;AACZ,QAAI,WAAW,EAAG,QAAO;AACzB,UAAM;AAAA,EACR,UAAE;AACA,iBAAa,KAAK;AAClB,kBAAc,QAAQ;AAAA,EACxB;AACF;AAEA,eAAe,WACb,QACA,QACA,QACkB;AAClB,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,SAAS,uBAAuB,mBAAmB,MAAM,CAAC,WAAW;AAAA,IACrG,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,MAAM;AAAA,IACxC;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,WAAW,OAAO,WAAW,OAAO,CAAC;AAAA,EAC9D,CAAC;AAED,SAAO,IAAI;AACb;AAGA,eAAsB,gBAAgB,QAA0B,MAAkC;AAChG,MAAI,MAAM;AACV,MAAI,aAAa;AACjB,QAAM,QAAQ,IAAI,gBAAgB;AAElC,QAAM,YAAY,CAAC,SAAiB;AAClC,QAAI,WAAY;AAChB,SAAK,WAAW,QAAQ,KAAK,QAAQ,CAAC,EAAE,KAAK,OAAO,MAAM,SAAS,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO;AACvF,UAAI,CAAC,IAAI;AACP,qBAAa;AACb,cAAM,MAAM;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,UAAU,IAAI,aAAa,SAAS;AAE1C,QAAM,QAAQ,iCAAiC,QAAQ,KAAK,EAAE,YAAY,OAAO,eAAe,CAAC;AACjG,MAAI,CAAC,OAAO;AACV,UAAM,WAAW,QAAQ,KAAK,QAAQ;AAAA,MACpC,EAAE,KAAK,GAAG,MAAM,SAAS,OAAO,uBAAuB;AAAA,IACzD,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,yBAAyB;AAAA,MAC7C;AAAA,MACA,OAAO,OAAO;AAAA,MACd,SAAS,KAAK;AAAA,MACd,SAAS,CAAC,SAAS,QAAQ,KAAK,IAAI;AAAA,MACpC,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,YAAQ,MAAM;AACd,QAAI,CAAC,YAAY;AACf,YAAM,WAAW,QAAQ,KAAK,QAAQ,CAAC,EAAE,KAAK,OAAO,MAAM,SAAS,QAAQ,CAAC,CAAC;AAAA,IAChF;AACA,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,kBAAkB,QAAQ,KAAK,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,EACrG,SAAS,KAAK;AACZ,YAAQ,MAAM;AACd,QAAI,CAAC,YAAY;AACf,YAAM,WAAW,QAAQ,KAAK,QAAQ;AAAA,QACpC,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,MACvF,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB;AACA,YAAQ;AAAA,MACN,KAAK,UAAU;AAAA,QACb,OAAO;AAAA,QACP,QAAQ,KAAK;AAAA,QACb,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAeC,OAAM,IAAY,YAA0C;AACzE,QAAM,OAAO;AACb,WAAS,SAAS,GAAG,SAAS,MAAM,CAAC,WAAW,GAAG,UAAU,MAAM;AACjE,UAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,EACjF;AACF;AAMA,eAAsB,iBAAiB,MAAoD;AAKzF,MAAI,SAAS,MAAM,wBAAwB;AAC3C,SAAO,CAAC,UAAU,CAAC,KAAK,WAAW,GAAG;AACpC,QAAI,CAAC,WAAW,KAAK,CAAC,eAAe,EAAE,WAAW,KAAK,EAAG;AAC1D,UAAMD,OAAM,sBAAsB,KAAK,UAAU;AACjD,QAAI,KAAK,WAAW,EAAG;AACvB,aAAS,MAAM,wBAAwB;AAAA,EACzC;AACA,MAAI,CAAC,UAAU,KAAK,WAAW,EAAG;AAElC,UAAQ;AAAA,IACN,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,MACP,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,gBAAgB,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,KAAK,WAAW,GAAG;AACzB,QAAI;AACF,YAAM,UAAU,MAAM,UAAU,QAAQ,KAAK,UAAU;AACvD,UAAI,YAAY,cAAc;AAC5B,gBAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAChE,cAAMA,OAAM,iBAAiB,KAAK,UAAU;AAC5C;AAAA,MACF;AACA,UAAI,QAAS,OAAM,gBAAgB,QAAQ,OAAO;AAAA,IAEpD,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,KAAK,UAAU;AAAA,UACb,OAAO;AAAA,UACP,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AAAA,MACH;AACA,YAAMA,OAAM,kBAAkB,KAAK,UAAU;AAAA,IAC/C;AAAA,EACF;AACA,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,uBAAuB,CAAC,CAAC;AACjE;;;AzBxPA,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB,IAAI;AAC7B,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAEtB,eAAe,mBAAmB,IAAY,YAA0C;AACtF,MAAI,YAAY;AAChB,SAAO,YAAY,KAAK,CAAC,WAAW,GAAG;AACrC,UAAM,OAAO,KAAK,IAAI,eAAe,SAAS;AAC9C,UAAM,aAAa,IAAI;AACvB,iBAAa;AAAA,EACf;AACF;AAEA,eAAsB,UAAU,MAAuD;AACrF,4BAA0B;AAE1B,QAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,CAAC;AAC9D,QAAM,YAAY,OAAO,SAAS,OAAO,KAAK,aAAa,eAAe,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC;AAC9G,QAAM,UAAU,KAAK,YAAY,SAAS,KAAK,YAAY;AAC3D,QAAM,aAAa,OAAO,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,UAAU,CAAC,IAAI;AACvF,MAAI,WAAW;AACf,MAAI,aAAa;AAEjB,UAAQ,GAAG,UAAU,MAAM;AACzB,eAAW;AAAA,EACb,CAAC;AACD,UAAQ,GAAG,WAAW,MAAM;AAC1B,eAAW;AAAA,EACb,CAAC;AAED,QAAM,WAAW,8BAA8B,eAAe,CAAC;AAC/D,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ;AAAA,MACN,KAAK,UAAU;AAAA,QACb,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ;AAAA,IACN,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,SAAS,IAAI;AAAA,MACtB,iBAAiB,SAAS;AAAA,MAC1B,sBAAsB,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,qBAAqB;AAOrC,QAAM,WAAW,iBAAiB,EAAE,YAAY,MAAM,SAAS,CAAC,EAAE,MAAM,CAAC,QAAQ;AAC/E,YAAQ;AAAA,MACN,KAAK,UAAU;AAAA,QACb,OAAO;AAAA,QACP,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,0BAA0B;AAE9B,SAAO,CAAC,UAAU;AAChB,QAAI;AAIF,2BAAqB,EAAE,WAAW,MAAM,CAAC;AAQzC,YAAM,aAAa,MAAM;AAAA,QACvB,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,QACpC;AAAA,MACF;AACA,UAAI,CAAC,WAAW,IAAI;AAClB,YAAI,CAAC,yBAAyB;AAC5B,oCAA0B;AAC1B,kBAAQ;AAAA,YACN,KAAK,UAAU;AAAA,cACb,OAAO;AAAA,cACP;AAAA,cACA,QAAQ,WAAW;AAAA,cACnB,QAAQ,gDAAgD,SAAS;AAAA,YACnE,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,mBAAmB,YAAY,MAAM,QAAQ;AACnD;AAAA,MACF;AACA,UAAI,yBAAyB;AAC3B,kCAA0B;AAC1B,gBAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,sCAAsC,UAAU,CAAC,CAAC;AAAA,MAC1F;AAEA,UAAI,QAAQ,aAAa;AACvB,cAAM,WAAW,MAAM,kBAAkB;AAAA,UACvC,KAAK;AAAA,UACL,iBAAiB;AAAA,QACnB,CAAC;AACD,YAAI,SAAS,YAAY,SAAS,QAAQ,KAAK,SAAS,SAAS,IAAI;AACnE,kBAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,oBAAoB,GAAG,SAAS,CAAC,CAAC;AAAA,QAC1E;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,gBAAgB,EAAE,KAAK,OAAO,WAAW,SAAS,GAAG,KAAK,CAAC;AAC9E,cAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,GAAG,KAAK,CAAC,CAAC;AAE/D,UAAI,KAAK,MAAM;AACb;AAAA,MACF,OAAO;AACL,qBAAa;AAAA,MACf;AAEA,YAAM,UAAU,cAAc,kBAAkB,mBAAmB;AACnE,YAAM,mBAAmB,SAAS,MAAM,QAAQ;AAAA,IAClD,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,qBAAqB,OAAQ,MAAgB,QAAQ,CAAC,CAAC;AAC7F,YAAM,mBAAmB,YAAY,MAAM,QAAQ;AAAA,IACrD;AAAA,EACF;AAEA,QAAM;AACN,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,OAAO,UAAU,CAAC,CAAC;AAC1E;;;A6BxIA;AADA,SAAS,SAAAE,cAAgC;AAMzC;AAEA,IAAM,mBAAmB,KAAK;AAC9B,IAAM,mBAAmB,IAAI;AAC7B,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB,IAAI;AAC3B,IAAM,mBAAmB,KAAK;AAC9B,IAAM,UAAU;AAET,SAAS,qBACd,MACA,MAAyB,QAAQ,KACzB;AACR,QAAM,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,MAAM,EAAE,IAAI;AACxE,MAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,EAAG,QAAO;AACtD,QAAM,UAAU,OAAO,SAAS,IAAI,0BAA0B,IAAI,EAAE;AACpE,MAAI,OAAO,SAAS,OAAO,KAAK,UAAU,EAAG,QAAO;AACpD,SAAO;AACT;AAUO,SAAS,sBACd,MACA,MAAyB,QAAQ,KACxB;AACT,MAAI,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB,OAAQ,QAAO;AACrE,MAAI,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB,OAAQ,QAAO;AACrE,MAAI,KAAK,eAAe,QAAS,QAAO;AACxC,QAAMC,YAAW,IAAI,4BAA4B,IAAI,KAAK,EAAE,YAAY;AACxE,MAAIA,aAAY,OAAOA,aAAY,WAAWA,aAAY,QAAQA,aAAY,OAAO;AACnF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,oBACd,qBACA,OAAO,iBACP,MAAM,gBACE;AACR,QAAM,MAAM,KAAK,IAAI,KAAK,IAAI,qBAAqB,CAAC,IAAI,GAAG,EAAE;AAC7D,SAAO,KAAK,IAAI,OAAO,KAAK,KAAK,GAAG;AACtC;AAGO,SAAS,oBACd,aACA,WACA,YAAY,kBACH;AACT,SAAO,YAAY,eAAe;AACpC;AAEA,SAAS,UAAU,OAAe,SAAkC,CAAC,GAAS;AAC5E,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAC9E;AAOO,SAAS,qBAAqB,MAAmC;AACtE,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,kBAAkB,QAAQ,oBAAoB,QAAQ,iBAAkB;AACpF,QAAI,QAAQ,cAAc;AAExB,UAAI,IAAI,IAAI,KAAK,UAAU,CAAC,KAAK,IAAI,CAAC,EAAG,WAAW,IAAI,EAAG,MAAK;AAChE;AAAA,IACF;AACA,QAAI,IAAI,WAAW,aAAa,KAAK,IAAI,WAAW,eAAe,EAAG;AACtE,QAAI,KAAK,GAAG;AAAA,EACd;AACA,MAAI,KAAK,gBAAgB;AACzB,SAAO;AACT;AAEA,eAAsB,gBACpB,MACA,UAA6B,QAAQ,KAAK,MAAM,CAAC,GAClC;AACf,QAAM,YAAY;AAAA,IAChB,SAAS,OAAO,KAAK,aAAa,eAAe,EAAE,aAAa,EAAE,GAAG,eAAe;AAAA,EACtF;AACA,QAAM,UAAU,qBAAqB,KAAK,OAA6B;AACvE,QAAM,YAAY,qBAAqB,OAAO;AAC9C,QAAM,WAAW,QAAQ,KAAK,CAAC;AAE/B,MAAI,WAAW;AACf,MAAI,QAA6B;AACjC,MAAI,sBAAsB;AAE1B,QAAM,OAAO,CAAC,WAA2B;AACvC,eAAW;AACX,cAAU,QAAQ,EAAE,OAAO,CAAC;AAC5B,QAAI,OAAO,IAAK,OAAM,KAAK,MAAM;AAAA,EACnC;AACA,UAAQ,GAAG,UAAU,MAAM,KAAK,QAAQ,CAAC;AACzC,UAAQ,GAAG,WAAW,MAAM,KAAK,SAAS,CAAC;AAE3C,YAAU,SAAS,EAAE,WAAW,SAAS,UAAU,CAAC;AAEpD,SAAO,CAAC,UAAU;AAChB,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,SAAS;AACb,QAAI,WAA0B;AAC9B,QAAI,aAAoC;AAExC,YAAQC,OAAM,QAAQ,UAAU,CAAC,UAAU,GAAG,SAAS,GAAG;AAAA,MACxD,OAAO;AAAA,MACP,KAAK,QAAQ;AAAA,IACf,CAAC;AACD,cAAU,iBAAiB,EAAE,KAAK,MAAM,OAAO,KAAK,CAAC;AAErD,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,eAAS;AACT,iBAAW;AACX,mBAAa;AAAA,IACf,CAAC;AAGD,WAAO,CAAC,UAAU,CAAC,UAAU;AAC3B,YAAM,aAAa,OAAO;AAC1B,UAAI,UAAU,SAAU;AACxB,UAAI,KAAK,IAAI,IAAI,YAAY,iBAAkB;AAC/C,YAAM,OAAO,oBAAoB,SAAS;AAG1C,YAAM,UAAU,QAAQ,KAAK,QAAQ,MAAM,MAAM,OAAO;AACxD,UAAI,WAAW,uBAAuB,SAAS,OAAO,GAAG;AACvD,kBAAU,kBAAkB;AAAA,UAC1B,KAAK,MAAM,OAAO;AAAA,UAClB,YAAY,QAAQ;AAAA,UACpB;AAAA,QACF,CAAC;AACD,cAAM,KAAK,SAAS;AACpB,cAAM,aAAa,aAAa;AAChC,YAAI,CAAC,OAAQ,OAAM,KAAK,SAAS;AACjC;AAAA,MACF;AACA,UAAI,CAAC,WAAW,KAAK,IAAI,IAAI,YAAY,UAAU,kBAAkB;AAEnE,kBAAU,yBAAyB,EAAE,KAAK,MAAM,OAAO,MAAM,QAAQ,CAAC;AACtE,cAAM,KAAK,SAAS;AACpB,cAAM,aAAa,aAAa;AAChC,YAAI,CAAC,OAAQ,OAAM,KAAK,SAAS;AACjC;AAAA,MACF;AAAA,IACF;AAGA,WAAO,CAAC,UAAU,CAAC,UAAU;AAC3B,YAAM,aAAa,OAAO;AAAA,IAC5B;AACA,QAAI,SAAU;AAEd,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,oBAAoB,WAAW,OAAO,EAAG,uBAAsB;AACnE,2BAAuB;AACvB,UAAM,UAAU,oBAAoB,mBAAmB;AACvD,cAAU,gBAAgB;AAAA,MACxB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU,UAAU;AAAA,MACpB;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,UAAM,aAAa,OAAO;AAAA,EAC5B;AAEA,YAAU,WAAW,EAAE,UAAU,CAAC;AACpC;;;A9BxLA;AAQO,SAAS,kBAAkB,MAA0B,MAA6B;AACvF,QAAM,aAAa,KAChB,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,sBAAsB,IAAI,EAAE,MAAM,CAAC,EACrE,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,aAAa,EAAE,CAAC;AACtE,SAAO,WAAW,CAAC,GAAG,MAAM;AAC9B;AAEA,eAAsB,SAAS,MAAuD;AACpF,4BAA0B;AAI1B,MAAI,SAAS,eAAe;AAC5B,MAAI,CAAC,WAAW,KAAK,CAAC,OAAO,WAAW,KAAK,GAAG;AAC9C,YAAQ,IAAI,iEAA4D;AACxE,UAAM,aAAa,IAAI;AACvB,aAAS,eAAe;AAAA,EAC1B;AAEA,QAAM,aACH,OAAO,KAAK,cAAc,WAAW,KAAK,UAAU,KAAK,IAAI,OAC9D,OAAO,WAAW,KAAK,KACvB;AACF,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,wFAAmF;AACjG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,MAAI,KAAK,cAAc,QAAQ,OAAO,uBAAuB,MAAM;AACjE,mBAAe,EAAE,GAAG,QAAQ,oBAAoB,KAAK,CAAC;AACtD,aAAS,eAAe;AACxB,YAAQ,IAAI,2FAA2F;AAAA,EACzG;AAEA,QAAM,QACH,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI,OACpD,OAAO,aAAa,KAAK,KACzB,mBAAmB,GAAG,QACtB;AACF,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,4FAAuF;AACrG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,QAAQ,OAAO,KAAK,QAAQ,YAAY,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAChF,MAAI,CAAC,OAAO;AACV,YAAQ,kBAAkB,eAAe,GAAG,IAAI,KAAK;AACrD,QAAI,OAAO;AACT,cAAQ,IAAI,iBAAiB,KAAK,QAAQ,IAAI,GAAG;AAAA,IACnD,OAAO;AACL,cAAQ,UAAU,EAAE,GAAG,MAAM,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,IACtD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAKC,KAAG,SAAS,CAAC,6BAAwB;AACtD,UAAQ,IAAI,kBAAkB,SAAS,EAAE;AACzC,UAAQ,IAAI,kBAAkB,IAAI,EAAE;AACpC,UAAQ,IAAI,kBAAkB,KAAK,EAAE;AACrC,UAAQ,IAAI,uEAAuE;AACnF,UAAQ,IAAI,EAAE;AAQd,QAAM,aAAa,EAAE,GAAG,MAAM,KAAK,OAAO,UAAU;AACpD,MAAI,sBAAsB,UAAU,GAAG;AACrC,UAAM,gBAAgB,YAAY,qBAAqB,OAAO,WAAW,IAAI,CAAC;AAC9E;AAAA,EACF;AACA,QAAM,UAAU,UAAU;AAC5B;AAOO,SAAS,qBACd,OACA,WACA,MACU;AACV,QAAM,OAAO,CAAC,UAAU,SAAS,OAAO,iBAAiB,SAAS;AAClE,MAAI,OAAO,KAAK,eAAe,YAAY,KAAK,WAAW,KAAK,GAAG;AACjE,SAAK,KAAK,iBAAiB,KAAK,WAAW,KAAK,CAAC;AAAA,EACnD;AACA,MAAI,KAAK,YAAY,SAAS,KAAK,YAAY,SAAS;AACtD,SAAK,KAAK,aAAa,OAAO;AAAA,EAChC;AACA,MAAI,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,KAAK,GAAG;AAC3D,SAAK,KAAK,cAAc,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC7C;AACA,SAAO;AACT;;;AFtHA;;;AiCNA;AACA;AAHA,SAAS,cAAAC,cAAY,UAAAC,eAAc;AACnC,OAAOC,YAAU;AAKjB,SAASC,uBAAsB,OAAuB;AACpD,QAAM,aAAa,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACvE,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG,KAAK,WAAW,SAAS,IAAI,GAAG;AAC1E,UAAM,IAAI,MAAM,gBAAgB,KAAK,EAAE;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAA6C;AAClE,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,KAAK,EAAG,QAAO,CAAC;AACpD,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AAEO,SAAS,2BAA2B,MAIzC;AACA,QAAM,EAAE,OAAO,WAAW,IAAI,wBAAwB,IAAI;AAC1D,QAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,QAAM,QAAQ;AAAA,IACZ,GAAG,cAAc,KAAK,IAAI;AAAA,IAC1B,GAAI,MAAM,QAAQ,KAAK,KAAK,IAAK,KAAK,QAAqB,CAAC;AAAA,EAC9D;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,IAAI,OAAO,SAAS,CAAC,GAAG,QAAQ,+BAA+B;AAAA,EAC1E;AAEA,QAAM,eAAeC,OAAK,QAAQ,OAAO,YAAY;AACrD,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,OAAO;AACvB,UAAM,MAAMD,uBAAsB,GAAG;AACrC,UAAM,MAAMC,OAAK,QAAQ,cAAc,GAAG;AAC1C,QAAI,CAAC,IAAI,WAAW,eAAeA,OAAK,GAAG,KAAK,QAAQ,cAAc;AACpE,aAAO,EAAE,IAAI,OAAO,SAAS,QAAQ,0BAA0B,GAAG,GAAG;AAAA,IACvE;AACA,QAAI,CAACC,aAAW,GAAG,GAAG;AACpB,aAAO,EAAE,IAAI,OAAO,SAAS,QAAQ,mBAAmB,GAAG,GAAG;AAAA,IAChE;AACA,IAAAC,QAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC5C,YAAQ,KAAK,GAAG;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM,QAAQ,OAAO,0BAA0B,IACzD,OAAO,2BAA2B,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAClF,CAAC;AACL,SAAO,6BAA6B,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;AACvE,aAAW,OAAO,OAAO,MAAM;AAE/B,QAAM,SAAS,oBAAoB,MAAM;AACzC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,GAAI,OAAO,aAAa,SAAS,EAAE,QAAQ,mCAAmC,IAAI,CAAC;AAAA,EACrF;AACF;AAEO,SAAS,qBAAqB,MAA8C;AACjF,QAAM,SAAS,2BAA2B,IAAI;AAC9C,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,MAAI,CAAC,OAAO,GAAI,SAAQ,KAAK,CAAC;AAChC;;;ACtEA;AADA,OAAOC,YAAU;;;ACCV,IAAM,iCAAiC,OAAO,OAAO;AAGrD,IAAM,kCAAkC,IAAI,OAAO,OAAO;AAG1D,IAAM,iCAAiC;AAGvC,IAAM,6BAA6B;AAGnC,IAAM,kCAAkC;;;ACN/C;;;ACLA,IAAM,mBAAmB;AAEzB,SAAS,iBAAiB,OAA2B,UAA0B;AAC7E,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO,KAAK,MAAM,CAAC;AACrB;AAGO,SAAS,4BAAoC;AAClD,SAAO,iBAAiB,QAAQ,IAAI,+BAA+B,8BAA8B;AACnG;AAOO,SAAS,8BAA8B,UAA6B,QAAQ,KAAwB;AACzG,QAAM,MAAM,EAAE,GAAG,QAAQ;AACzB,MAAI,QAAQ,IAAI,kCAAkC,KAAK;AACrD,WAAO;AAAA,EACT;AACA,QAAM,WAAW,IAAI,gBAAgB;AACrC,MAAI,iBAAiB,KAAK,QAAQ,GAAG;AACnC,WAAO;AAAA,EACT;AACA,QAAM,KAAK,0BAA0B;AACrC,QAAM,OAAO,wBAAwB,EAAE;AACvC,MAAI,eAAe,SAAS,KAAK,IAAI,GAAG,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK;AACpE,SAAO;AACT;AAEO,SAAS,sBAAsB,KAAK,0BAA0B,GAAW;AAC9E,SAAO,wBAAwB,EAAE;AACnC;;;ACrCA,SAAS,aAAAC,mBAAiB;AAe1B,IAAI;AAQG,SAAS,wBAAiC;AAC/C,MAAI,QAAQ,IAAI,8BAA8B,OAAO,QAAQ,IAAI,8BAA8B,QAAQ;AACrG,WAAO;AAAA,EACT;AACA,MAAI,0BAA0B,OAAW,QAAO;AAChD,MAAI,QAAQ,aAAa,SAAS;AAChC,4BAAwB;AACxB,WAAO;AAAA,EACT;AACA,QAAM,MAAMC,YAAU,eAAe,CAAC,WAAW,GAAG,EAAE,UAAU,QAAQ,OAAO,CAAC,UAAU,UAAU,MAAM,EAAE,CAAC;AAC7G,0BAAwB,IAAI,WAAW;AACvC,SAAO;AACT;AAMO,SAAS,oBAAoB,MAAoC;AACtE,QAAM,YAAY,KAAK,aAAa,QAAQ,IAAI,mCAAmC;AACnF,QAAM,gBACJ,KAAK,iBAAiB,QAAQ,IAAI,wCAAwC;AAC5E,QAAM,OAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,SAAS;AAAA,IACtB;AAAA,IACA,iBAAiB,aAAa;AAAA,EAChC;AACA,MAAI,KAAK,KAAK;AACZ,SAAK,KAAK,uBAAuB,KAAK,GAAG;AAAA,EAC3C;AACA,OAAK,KAAK,MAAM,GAAG,KAAK,OAAO;AAC/B,SAAO;AACT;;;AC1DA;AADA,SAAS,aAAAC,mBAAiB;AAM1B;AAeA,SAASC,aAAY,OAAgB,UAA0B;AAC7D,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO,KAAK,MAAM,CAAC;AACrB;AAEO,SAAS,4BACd,SAAS,eAAe,GACF;AACtB,QAAM,YAAY,QAAQ,IAAI,gCAC1BA,aAAY,QAAQ,IAAI,+BAA+B,8BAA8B,IACrF;AACJ,QAAM,aAAa,QAAQ,IAAI,iCAC3BA,aAAY,QAAQ,IAAI,gCAAgC,+BAA+B,IACvF;AACJ,SAAO;AAAA,IACL,qBACE,aAAaA,aAAY,OAAO,mBAAmB,8BAA8B;AAAA,IACnF,cAAc,cAAcA,aAAY,OAAO,iBAAiB,+BAA+B;AAAA,EACjG;AACF;AAGA,IAAI,eAAe;AAWZ,SAAS,qBAA2B;AACzC,kBAAgB;AAClB;AAEO,SAAS,mBAAyB;AACvC,iBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAC7C;AAOO,SAAS,qBACd,OAAuE,CAAC,GACjD;AACvB,QAAM,MAAM,EAAE,GAAG,4BAA4B,GAAG,GAAG,KAAK;AACxD,QAAM,oBAAoB,KAAK,qBAAqB,sBAAsB;AAC1E,QAAM,gBAAgB,IAAI,sBAAsB,IAAI;AACpD,QAAM,WAAW,qBAAqB;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,WACJ,OACA,6BAA6B,aAAa,4BAA4B,IAAI,mBAAmB,cAAc,IAAI,YAAY,WAAW,iBAAiB;AAAA,EAC7J;AACF;AAEO,SAASC,SAAQ,IAAkB;AACxC,MAAI,MAAM,EAAG;AACb,EAAAC,YAAU,QAAQ,UAAU,CAAC,MAAM,sBAAsB,KAAK,MAAM,EAAE,CAAC,uBAAuB,GAAG;AAAA,IAC/F,OAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,sBACd,WACA,SAAS,KACT,OAA6E,CAAC,GACvD;AACvB,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,SAAS;AACnD,MAAI,UAAU,qBAAqB;AAAA,IACjC,GAAG;AAAA,IACH,mBAAmB,KAAK,oBAAoB;AAAA,EAC9C,CAAC;AACD,SAAO,CAAC,QAAQ,YAAY,KAAK,IAAI,IAAI,UAAU;AACjD,IAAAD,SAAQ,KAAK,IAAI,QAAQ,WAAW,KAAK,IAAI,CAAC,CAAC;AAC/C,cAAU,qBAAqB;AAAA,MAC7B,GAAG;AAAA,MACH,mBAAmB,KAAK,oBAAoB;AAAA,IAC9C,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AChHA,SAAS,aAAAE,mBAAiB;;;ACW1B;AAXA;AAAA,EACE,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,OAAOC,YAAU;;;ACVjB,SAAS,aAAAC,mBAAiB;AAE1B,OAAOC,YAAU;AAGV,SAAS,+BAAuC;AACrD,SAAOC,OAAK,KAAK,uBAAuB,GAAG,oBAAoB;AACjE;AAEO,SAAS,4BAAoC;AAClD,SAAOA,OAAK,KAAK,6BAA6B,GAAG,OAAO;AAC1D;AAEO,SAAS,8BAAsC;AACpD,QAAM,MAAM,0BAA0B;AACtC,EAAAC,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,SAAO;AACT;;;ADFO,IAAM,sCAAsC,IAAI,KAAK;AAGrD,IAAM,4CAA4C;AAiBzD,SAASC,aAAY,OAAgB,UAA0B;AAC7D,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,QAAO;AAC1C,SAAO,KAAK,MAAM,CAAC;AACrB;AAEO,SAAS,iCAA0C;AACxD,QAAM,IAAI,QAAQ,IAAI,gCAAgC,KAAK,EAAE,YAAY;AACzE,SAAO,MAAM,OAAO,MAAM,UAAU,MAAM;AAC5C;AAEO,SAAS,wCAAgD;AAC9D,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAOA,aAAY,KAAK,yCAAyC;AAC1E,SAAO;AACT;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,QAAQ,KAAK;AACtB;AAEA,SAAS,aAAa,QAAgB,WAAW,0BAA0B,GAAW;AACpF,SAAOC,OAAK,KAAK,UAAU,GAAG,MAAM,OAAO;AAC7C;AAEA,SAAS,eAAe,UAAsD;AAC5E,MAAI,CAACC,aAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,SAAS,KAAK,MAAMC,eAAa,UAAU,MAAM,CAAC;AACxD,QACE,OAAO,OAAO,WAAW,YACzB,OAAO,OAAO,QAAQ,YACtB,OAAO,OAAO,eAAe,YAC7B,OAAO,OAAO,YAAY,UAC1B;AACA,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YACPC,SACA,UAAU,qCACD;AACT,MAAI,CAACA,QAAQ,QAAO;AACpB,MAAI,CAAC,WAAWA,QAAO,GAAG,EAAG,QAAO;AACpC,QAAM,OAAO,KAAK,MAAMA,QAAO,UAAU;AACzC,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,SAAO,KAAK,IAAI,IAAI,OAAO;AAC7B;AAEA,SAAS,iBAAiB,UAAkB,SAAuB;AACjE,QAAMA,UAAS,eAAe,QAAQ;AACtC,MAAI,CAAC,YAAYA,SAAQ,OAAO,EAAG;AACnC,MAAI;AACF,IAAAC,YAAW,QAAQ;AAAA,EACrB,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,eAAe,UAA0B;AAChD,EAAAC,YAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,SAAO;AACT;AAGO,SAAS,mCACd,OAAgD,CAAC,GACzC;AACR,QAAM,WAAW,eAAe,KAAK,YAAY,4BAA4B,CAAC;AAC9E,QAAM,UAAU,KAAK,WAAW;AAChC,MAAI,YAAY;AAChB,aAAW,QAAQC,cAAY,QAAQ,GAAG;AACxC,QAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,UAAM,WAAWN,OAAK,KAAK,UAAU,IAAI;AACzC,UAAM,SAASC,aAAW,QAAQ;AAClC,qBAAiB,UAAU,OAAO;AAClC,QAAI,UAAU,CAACA,aAAW,QAAQ,EAAG,cAAa;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,iCACd,OAAgD,CAAC,GAClB;AAC/B,QAAM,WAAW,KAAK,YAAY,4BAA4B;AAC9D,QAAM,UAAU,KAAK,WAAW;AAChC,qCAAmC,EAAE,UAAU,QAAQ,CAAC;AACxD,QAAM,SAAwC,CAAC;AAC/C,aAAW,QAAQK,cAAY,QAAQ,GAAG;AACxC,QAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,UAAMH,UAAS,eAAeH,OAAK,KAAK,UAAU,IAAI,CAAC;AACvD,QAAIG,WAAU,CAAC,YAAYA,SAAQ,OAAO,EAAG,QAAO,KAAKA,OAAM;AAAA,EACjE;AACA,SAAO;AACT;AAEO,SAAS,kCACd,OAAgD,CAAC,GACzC;AACR,SAAO,iCAAiC,IAAI,EAAE;AAChD;AAMO,SAAS,gCACd,SACA,OAAmE,CAAC,GACtC;AAC9B,MAAI,+BAA+B,GAAG;AACpC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,UAAU,sCAAsC;AAAA,MAChD,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,YAAY,4BAA4B;AAC9D,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,WAAW,KAAK,YAAY,sCAAsC;AACxE,qCAAmC,EAAE,UAAU,QAAQ,CAAC;AAExD,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,UAAM,SAAS,cAAc,KAAK;AAClC,UAAM,WAAW,aAAa,QAAQ,QAAQ;AAC9C,UAAM,WAAW,eAAe,QAAQ;AACxC,QAAI,YAAY,YAAY,UAAU,OAAO,GAAG;AAC9C,UAAI;AACF,QAAAC,YAAW,QAAQ;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF,WAAW,YAAY,CAAC,YAAY,UAAU,OAAO,GAAG;AACtD;AAAA,IACF;AAEA,UAAMD,UAAsC;AAAA,MAC1C;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAKI,UAAS,UAAU,IAAI;AAClC,MAAAC,eAAc,IAAI,KAAK,UAAUL,SAAQ,MAAM,CAAC,GAAG,MAAM;AACzD,MAAAM,WAAU,EAAE;AACZ,YAAMC,eAAc,kCAAkC,EAAE,UAAU,QAAQ,CAAC;AAC3E,aAAO;AAAA,QACL,UAAU;AAAA,QACV;AAAA,QACA,aAAAA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,UAAU;AACpD;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,cAAc,kCAAkC,EAAE,UAAU,QAAQ,CAAC;AAC3E,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ,mCAAmC,WAAW,IAAI,QAAQ;AAAA,EACpE;AACF;AAEO,SAAS,6BACd,QACA,OAA8B,CAAC,GACzB;AACN,MAAI,CAAC,OAAQ;AACb,QAAM,WAAW,aAAa,QAAQ,KAAK,YAAY,0BAA0B,CAAC;AAClF,MAAI;AACF,IAAAN,YAAW,QAAQ;AAAA,EACrB,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,4BACd,SACA,OAAmE,CAAC,GACtC;AAC9B,MAAI,+BAA+B,GAAG;AACpC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,UAAU,sCAAsC;AAAA,MAChD,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,WAAW,KAAK,YAAY,4BAA4B;AAC9D,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,WAAW,KAAK,YAAY,sCAAsC;AACxE,qCAAmC,EAAE,UAAU,QAAQ,CAAC;AACxD,QAAM,cAAc,kCAAkC,EAAE,UAAU,QAAQ,CAAC;AAC3E,QAAM,WAAW,cAAc;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ,WACJ,OACA,mCAAmC,WAAW,IAAI,QAAQ,wBAAwB,OAAO;AAAA,EAC/F;AACF;;;AEjQA,SAAS,aAAAO,mBAAiB;AAOnB,SAASC,SAAQ,IAAkB;AACxC,MAAI,MAAM,EAAG;AACb,EAAAC,YAAU,QAAQ,UAAU,CAAC,MAAM,sBAAsB,KAAK,MAAM,EAAE,CAAC,uBAAuB,GAAG;AAAA,IAC/F,OAAO;AAAA,EACT,CAAC;AACH;AAMO,SAAS,6BACd,SACA,WACA,SAAS,KACT,OAA8D,CAAC,GACL;AAC1D,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,SAAS;AACnD,MAAI,UAAU,gCAAgC,SAAS,IAAI;AAC3D,SAAO,CAAC,QAAQ,YAAY,KAAK,IAAI,IAAI,UAAU;AACjD,IAAAD,SAAQ,KAAK,IAAI,QAAQ,WAAW,KAAK,IAAI,CAAC,CAAC;AAC/C,cAAU,gCAAgC,SAAS,IAAI;AAAA,EACzD;AACA,SAAO;AACT;;;AC9BA;AADA,OAAOE,YAAU;AAGV,SAAS,2BAA2B,KAAsB;AAC/D,QAAM,eAAe,oBAAoB,mBAAmB,CAAC;AAC7D,QAAM,MAAMA,OAAK,SAAS,cAAcA,OAAK,QAAQ,GAAG,CAAC;AACzD,SAAO,IAAI,SAAS,KAAK,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,GAAG;AACxE;AAUO,SAAS,gCAAgC,KAA+C;AAC7F,MAAI,CAAC,2BAA2B,GAAG,EAAG,QAAO,EAAE,IAAI,KAAK;AACxD,QAAM,MAAM,OAAO,QAAQ,WAAW,aAAa,QAAQ,OAAO,IAAI;AACtE,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;;;AJ1BA,SAAS,QAAQ,KAAkC;AACjD,QAAM,MAAgB,CAAC;AACvB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,UAAU,OAAW;AACzB,QAAI,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AA0CA,SAAS,SACP,MACA,MACsD;AACtD,QAAM,MAAMC,YAAU,KAAK,CAAC,GAAI,KAAK,MAAM,CAAC,GAAG;AAAA,IAC7C,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAChC,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,SAAO;AAAA,IACL,UAAU,IAAI,UAAU;AAAA,IACxB,SAAS,IAAI,UAAU,IAAI,KAAK;AAAA,IAChC,SAAS,IAAI,UAAU,IAAI,KAAK;AAAA,EAClC;AACF;AAOO,SAAS,qBAAqB,OAA0D;AAC7F,QAAM,SAAS,MAAM,sBAAsB;AAC3C,QAAM,mBACJ,SAAS,IACL,6BAA6B,MAAM,SAAS,MAAM,IAClD,mCAAmC,MAAM,OAAO;AAEtD,MAAI,CAAC,iBAAiB,UAAU;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,iBAAiB,UAAU;AAAA,MACnC,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,iBAAiB,sBAAsB;AAAA,MACvC,WAAW,qBAAqB;AAAA,MAChC;AAAA,MACA,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,SAAS,iBAAiB;AAChC,QAAM,YACJ,SAAS,IAAI,sBAAsB,MAAM,IAAI,qBAAqB;AAEpE,MAAI,CAAC,UAAU,UAAU;AACvB,iCAA6B,MAAM;AACnC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,UAAU,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,iBAAiB,sBAAsB;AAAA,MACvC;AAAA,MACA;AAAA,MACA,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,gBAAgB,gCAAgC,MAAM,GAAG;AAC/D,MAAI,CAAC,cAAc,IAAI;AACrB,iCAA6B,MAAM;AACnC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,cAAc;AAAA,MACtB,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,iBAAiB,sBAAsB;AAAA,MACvC;AAAA,MACA;AAAA,MACA,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,MAAM,8BAA8B,EAAE,GAAG,QAAQ,KAAK,GAAG,MAAM,IAAI,CAAC;AAC1E,QAAM,kBAAkB,sBAAsB;AAC9C,QAAM,aAAa,sBAAsB;AAEzC,qBAAmB;AACnB,MAAI;AACF,QAAI;AACJ,QAAI,YAAY;AACd,YAAM,OAAO,oBAAoB;AAAA,QAC/B,KAAK,MAAM;AAAA,QACX,SAAS,CAAC,gBAAgB,GAAG,QAAQ,GAAG,GAAG,aAAa,OAAO,MAAM,OAAO;AAAA,MAC9E,CAAC;AACD,eAAS,SAAS,MAAM,EAAE,KAAK,MAAM,KAAK,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7E,OAAO;AACL,eAAS,SAAS,CAAC,MAAM,OAAO,GAAG;AAAA,QACjC,KAAK,MAAM;AAAA,QACX;AAAA,QACA,OAAO;AAAA,QACP,WAAW,MAAM;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,IAAI,OAAO,aAAa;AAAA,MACxB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM;AAAA,IACjB;AAAA,EACF,UAAE;AACA,qBAAiB;AACjB,iCAA6B,MAAM;AAAA,EACrC;AACF;AAEA,SAAS,mCAAmC,SAE1C;AACA,QAAM,WAAW,6BAA6B,SAAS,CAAC;AACxD,MAAI,SAAS,SAAU,QAAO;AAC9B,SAAO,EAAE,GAAG,4BAA4B,OAAO,GAAG,QAAQ,KAAK;AACjE;;;AKjLO,IAAM,kCAAkC,CAAC,qBAAqB,cAAc;AAiB5E,SAAS,yBACd,KACA,WAA8B,iCAC9B,OAA4D,CAAC,GACvC;AACtB,QAAM,QAA6B,CAAC;AACpC,MAAI,SAAS;AACb,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS,qBAAqB;AAAA,MAClC;AAAA,MACA;AAAA,MACA,oBAAoB,KAAK;AAAA,MACzB,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,UAAM,KAAK,EAAE,SAAS,OAAO,CAAC;AAC9B,QAAI,CAAC,OAAO,GAAI,UAAS;AAAA,EAC3B;AACA,SAAO,EAAE,QAAQ,MAAM;AACzB;;;AXlCA;AAaA,SAAS,iBAAiB,KAAsC;AAC9D,QAAM,MAAM,IAAI,QAAQ,GAAG;AAC3B,MAAI,OAAO,EAAG,OAAM,IAAI,MAAM,sBAAsB,GAAG,wBAAwB;AAC/E,SAAO,EAAE,MAAM,IAAI,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,MAAM,MAAM,CAAC,EAAE;AAC9D;AAEA,eAAsB,iBAAiB,MAAuD;AAC5F,QAAM,SAAS,SAAS,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,QAAW,MAAM;AACzE,QAAM,aACH,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI,eAAe,EAAE,cAAc;AAC5E,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,8DAA8D;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,SAAS,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,QAAW,MAAM;AAC3E,QAAM,SAAS,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,QAAQ;AAC/E,QAAM,WAAsC,CAAC;AAC7C,QAAM,cAAc,KAAK;AACzB,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,eAAW,QAAQ,YAAa,UAAS,KAAK,iBAAiB,OAAO,IAAI,CAAC,CAAC;AAAA,EAC9E,WAAW,OAAO,gBAAgB,UAAU;AAC1C,aAAS,KAAK,iBAAiB,WAAW,CAAC;AAAA,EAC7C;AAEA,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,MAAM,8BAA8B,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI,QAAW,WAAW,EAAE,SAAS,KAAK,CAAC;AAC9H,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAC3G,QAAM,MAAM,eAAe;AAC3B,QAAM,iBAAiB,gCAAgC,IAAI,gBAAgB,uBAAuB;AAClG,QAAM,WAAW,YAAY,cAAc;AAE3C,QAAM,mBACJ,KAAK,aAAa,QAAQ,KAAK,aAAa,SACxC,OACA,KAAK,aAAa,SAAS,KAAK,aAAa,UAC3C,QACA;AAER,QAAM,WACJ,qBACC,WAAW,WAAW,aAAa,iBAAiB,aAAa;AAEpE,QAAM,OAAgC;AAAA,IACpC,QAAQ,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,IACtC,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,IACzC,QAAQ,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,IACxC,cAAc,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI;AAAA,IAC1D;AAAA,IACA;AAAA,IACA,MAAM,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,IACtC,eAAe,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,IACzD,UAAU,SAAS,SAAS,WAAW;AAAA,IACvC,aAAa,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAAA,EAC7D;AACA,MAAI,aAAa,OAAW,MAAK,WAAW;AAE5C,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,4BAA4B,MAAM;AAAA,IAC3C,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,SAAkB;AACtB,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AACA,MAAI,CAAC,IAAI,IAAI;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,YAAY,IAAI,QAAQ,UAAU,OAAO,GAAG,MAAM,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;AAGO,SAAS,gBAAgB,MAA8C;AAC5E,QAAM,WAAW,SAAS,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI,QAAW,UAAU;AACvF,QAAM,MAAMC,OAAK,QAAQ,QAAQ;AACjC,QAAM,UAAU,yBAAyB,GAAG;AAC5C,QAAM,WAAW,KAAK,SAAS,QAAQ,KAAK,SAAS;AACrD,QAAM,UAAU,EAAE,QAAQ,QAAQ,QAAQ,UAAU,KAAK,OAAO,QAAQ,MAAM;AAC9E,MAAI,SAAU,SAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,MACrD,SAAQ,IAAI,QAAQ,SAAS,6BAA6B,0BAA0B;AACzF,MAAI,CAAC,QAAQ,OAAQ,SAAQ,KAAK,CAAC;AACrC;AAEA,eAAsB,WAAW,MAAuD;AACtF,QAAM,SAAS,SAAS,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,QAAW,MAAM;AACzE,QAAM,YAAY,KAAK,UAAU,QAAQ,KAAK,UAAU;AACxD,MAAI,WAAW;AACb,oBAAgB,IAAI;AACpB;AAAA,EACF;AACA,QAAM,OAAO,eAAe,EAAE;AAC9B,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,0EAA0E;AACxF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,MAAI,OAAQ,SAAQ,gBAAgB,UAAU,MAAM;AAEpD,QAAM,MAAM,GAAG,IAAI,iBAAiB,mBAAmB,IAAI,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAChG,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,cAAc,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AAAA,MACtD,QAAQ,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,MACxC,eAAe,KAAK,kBAAkB,QAAQ,KAAK,kBAAkB;AAAA,IACvE,CAAC;AAAA,EACH,CAAC;AAED,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,SAAkB;AACtB,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AACA,MAAI,CAAC,IAAI,IAAI;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,YAAY,IAAI,QAAQ,UAAU,OAAO,GAAG,MAAM,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;;;AYnJA,OAAOC,YAAU;AAEjB;AAEO,SAAS,oBAAoB,MAA8C;AAChF,QAAM,MAAMC,OAAK,QAAQ,SAAS,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI,QAAW,UAAU,CAAC;AAChG,QAAM,WAAW,KAAK,SAAS,QAAQ,KAAK,SAAS,UAAU,KAAK,aAAa,QAAQ,KAAK,aAAa;AAE3G,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAS,KAAK;AACpB,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAW,KAAK,OAAQ,UAAS,KAAK,OAAO,CAAC,CAAC;AAAA,EACjD,WAAW,OAAO,WAAW,UAAU;AACrC,aAAS,KAAK,MAAM;AAAA,EACtB;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,IACA,SAAS,SAAS,WAAW;AAAA,IAC7B;AAAA,MACE,oBAAoB,KAAK,qBAAqB,OAAO,KAAK,kBAAkB,IAAI;AAAA,MAChF,WAAW,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,UAAU;AAAA,IACV,OAAO,QAAQ,MAAM,IAAI,CAAC,OAAO;AAAA,MAC/B,SAAS,EAAE;AAAA,MACX,IAAI,EAAE,OAAO;AAAA,MACb,UAAU,EAAE,OAAO;AAAA,MACnB,UAAU,EAAE,OAAO;AAAA,MACnB,oBAAoB,EAAE,OAAO;AAAA,MAC7B,iBAAiB,EAAE,OAAO;AAAA,MAC1B,WAAW,EAAE,OAAO;AAAA,MACpB,kBAAkB,EAAE,OAAO;AAAA,MAC3B,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAG,GAAI;AAAA,IACvC,EAAE;AAAA,EACJ;AAEA,MAAI,UAAU;AACZ,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,EAC9C,OAAO;AACL,YAAQ,IAAI,QAAQ,SAAS,0BAA0B,uBAAuB;AAC9E,eAAW,QAAQ,QAAQ,OAAO;AAChC,cAAQ,IAAI,KAAK,KAAK,KAAK,WAAM,QAAG,IAAI,KAAK,OAAO,UAAU,KAAK,QAAQ,aAAa,KAAK,kBAAkB,GAAG;AAClH,UAAI,CAAC,KAAK,MAAM,KAAK,OAAQ,SAAQ,IAAI,OAAO,KAAK,OAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACA,UAAQ,KAAK,QAAQ,SAAS,IAAI,CAAC;AACrC;;;AClDA;AADA,SAAS,gBAAAC,sBAAoB;AAM7B;AAGA,IAAM,aAAqC,CAAC,UAAU,eAAe,iBAAiB;AACtF,IAAM,gBAA0C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,YAAY,MAAiF;AACpG,QAAM,WAAW,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AACzD,MAAI,UAAU;AACZ,WAAO,EAAE,MAAMC,eAAa,UAAU,MAAM,GAAG,cAAc,SAAS;AAAA,EACxE;AACA,QAAM,SAAS,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAC/C,MAAI,OAAQ,QAAO,EAAE,MAAM,OAAO;AAClC,QAAM,IAAI,MAAM,0CAA0C;AAC5D;AAEA,eAAsB,eAAe,MAAuD;AAC1F,QAAM,eAAe,SAAS,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI,QAAW,WAAW;AAC9F,MAAI,CAAC,WAAW,SAAS,YAAoC,GAAG;AAC9D,UAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE;AAAA,EACvD;AACA,QAAM,YAAY;AAClB,QAAM,MAAM,eAAe;AAC3B,QAAM,cAAc;AAAA,IAClB,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,IAAI;AAAA,IACpC;AAAA,EACF;AACA,QAAM,QAAQ,SAAS,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI,QAAW,OAAO;AAC3E,QAAM,EAAE,MAAM,aAAa,IAAI,YAAY,IAAI;AAE/C,MAAI,gBAAgB,cAAc,YAAY,GAAG;AAC/C,YAAQ;AAAA,MACN,KAAK,UAAU;AAAA,QACb,SACE;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,IAC/C,QAAQ,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,IACxC,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AAAA,IAClD,eAAe,KAAK,gBAAgB,OAAO,KAAK,aAAa,IAAI;AAAA,IACjE,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,IAC5C,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,IACzC,YAAY,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI;AAAA,IACxD,kBAAkB,sBAAsB,IAAI;AAAA,EAC9C;AAEA,QAAM,SAAS,MAAM,YAAY,KAAK;AACtC,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,MAAI,OAAO,eAAe,0BAA2B,SAAQ,KAAK,CAAC;AACrE;AAEA,SAAS,sBACP,MAC+D;AAC/D,QAAM,OAAO,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAC3D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,cAAc,SAAS,IAA8B,GAAG;AAC3D,UAAM,IAAI,MAAM,0BAA0B,IAAI,EAAE;AAAA,EAClD;AACA,QAAM,UAAU,KAAK,iBACjB,OAAO,KAAK,cAAc,IAC1B,sBAAsB,IAAI;AAC9B,SAAO,EAAE,MAAsC,QAAQ;AACzD;AAEA,eAAsB,oBAAmC;AACvD,QAAM,QAAQ,gBAAgB;AAC9B,UAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,CAAC,CAAC;AACrE;AAEA,eAAsB,mBAAmB,MAAuD;AAC9F,QAAM,MAAM,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAC1C,QAAM,WAAW,KAAK,KAAK,OAAO,KAAK,EAAE,IAAI;AAC7C,QAAM,SAAS,MAAM,gBAAgB,EAAE,KAAK,SAAS,CAAC;AACtD,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,MAAI,OAAO,SAAS,EAAG,SAAQ,KAAK,CAAC;AACvC;;;AC/FO,SAAS,cAAc,MAA8C;AAC1E,QAAM,UAAU,KAAK,YAAY,QAAQ,KAAK,YAAY;AAC1D,QAAM,eAAe,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB;AACzE,QAAM,eAAe,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB;AACzE,QAAM,UAAU,KAAK,YAAY,QAAQ,KAAK,YAAY;AAC1D,QAAM,sBAAsB,KAAK;AACjC,QAAM,uBAAuB,uBAAuB,QAAQ,wBAAwB;AACpF,QAAM,mBAAmB,uBAAuB,OAAO,mBAAmB,IAAI;AAC9E,QAAM,iBAAiB,KAAK,iBAAiB,OAAO,KAAK,cAAc,IAAI;AAC3E,QAAM,iBAAiB,KAAK,mBAAmB,QAAQ,KAAK,mBAAmB;AAC/E,QAAM,cAAc,KAAK,cAAc,OAAO,KAAK,WAAW,IAAI;AAElE,QAAM,UAAU,kBAAkB;AAAA,IAChC;AAAA,IACA,mBAAmB,CAAC;AAAA,IACpB;AAAA,IACA;AAAA,IACA,kBACE,qBAAqB,UAAa,OAAO,SAAS,gBAAgB,IAC9D,mBACA,uBACE,8BACA;AAAA,IACR,gBAAgB,OAAO,SAAS,cAAc,IAAI,iBAAiB;AAAA,IACnE;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW,QAAQ,gBAAgB;AACrC,YAAQ,IAAI,KAAK,UAAU,QAAQ,gBAAgB,MAAM,CAAC,CAAC;AAAA,EAC7D,OAAO;AACL,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,EAC9C;AAEA,MAAI,WAAW,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,QAAQ,WAAW,GAAG;AAChF,YAAQ,WAAW;AAAA,EACrB;AACF;;;ACxCA,IAAM,uBAAuB;AAEtB,SAAS,kBAAkB,MAA8B;AAC9D,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,GAAG,EAAG,QAAO;AACjE,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAAgB,WAAW,sBAA0C;AAClG,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,OAAO,MAAM,CAAC;AAC7E,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,UAAU,SAAU,QAAO;AACvC,SAAO,GAAG,QAAQ,MAAM,GAAG,WAAW,CAAC,EAAE,QAAQ,CAAC;AACpD;AAEO,SAAS,oBAAoB,QAAgC;AAClE,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,WAAW,KAAM,QAAO;AAC5B,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,SAAS,kBAAkB,IAAI;AACrC,QAAI,WAAW,KAAM,QAAO;AAAA,EAC9B;AACA,SAAO;AACT;;;AC3BO,SAAS,gCAAgC,SAAqD;AACnG,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,iCAA8B,QAAQ,KAAK,MAAM,QAAQ,MAAM,EAAE;AAE5E,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK;AACH,YAAM,KAAK,6DAA6D;AACxE,YAAM,KAAK,wEAAwE;AACnF,YAAM,KAAK,mGAA8F;AACzG;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ,sDAAsD,QAAQ,aAAa,UAAU,QAAQ,UAAU,MAAM,EAAE;AAAA,MACjH;AACA,UAAI,QAAQ,OAAQ,OAAM,KAAK,YAAY,QAAQ,MAAM,EAAE;AAC3D,YAAM,KAAK,uGAAuG;AAClH;AAAA,IACF,KAAK;AACH,YAAM,KAAK,2CAAsC,QAAQ,UAAU,+BAA+B,GAAG;AACrG,YAAM,KAAK,8FAA8F;AACzG;AAAA,IACF,KAAK;AACH,YAAM,KAAK,mCAA8B,QAAQ,UAAU,iCAAiC,GAAG;AAC/F,YAAM,KAAK,0FAA0F;AACrG;AAAA,IACF;AACE,YAAM,KAAK,YAAY,QAAQ,OAAO,EAAE;AAAA,EAC5C;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY,eAAe,OAAO,EAAE;AAC1E;;;AC9BO,SAAS,wBAAwB,MAAyF;AAC/H,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACxE,QAAM;AAAA,IACJ,YACI,6BAA0B,KAAK,KAAK,KAAK,SAAS,MAClD,6BAA0B,KAAK,KAAK;AAAA,EAC1C;AAEA,MAAI,CAAC,KAAK,QAAQ,QAAQ;AACxB,UAAM,KAAK,oCAAoC;AAC/C,WAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY,eAAe,IAAI,EAAE;AAAA,EACvE;AAEA,aAAW,QAAQ,KAAK,SAAS;AAC/B,UAAM,OAAO,KAAK,aAAa,WAAW,+BAA+B;AACzE,UAAM,WACJ,KAAK,aAAa,SAAS,SAAS,IAAI,KAAK,KAAK,aAAa,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM;AACtG,UAAM;AAAA,MACJ,UAAK,KAAK,MAAM,KAAK,KAAK,YAAY,KAAK,KAAK,MAAM,GAAG,KAAK,eAAe,WAAM,KAAK,YAAY,KAAK,EAAE,KAAK,IAAI,GAAG,QAAQ;AAAA,IACjI;AACA,QAAI,KAAK,YAAY;AACnB,YAAM,KAAK,iBAAiB,KAAK,UAAU,GAAG,KAAK,aAAa,YAAY,KAAK,UAAU,MAAM,EAAE,EAAE;AAAA,IACvG;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,eAAe,OAAO,CAAC,MAAM,EAAE,YAAY,eAAe,EAAE,EAAE,KAAK,CAAC;AAC3F,QAAM,UAAU,KAAK,eAAe,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,SAAS,KAAK,CAAC;AACxF,MAAI,UAAU,QAAQ;AACpB,UAAM;AAAA,MACJ,mBAAmB,UAAU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ;AAClB,UAAM;AAAA,MACJ,0BAA0B,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IAC3G;AAAA,EACF;AACA,MAAI,KAAK,cAAc,QAAQ,QAAQ;AACrC,UAAM,KAAK,2BAA2B,KAAK,aAAa,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAClG;AAEA,QAAM,UACJ,KAAK,QAAQ,SAAS,KACtB,KAAK,QAAQ,MAAM,CAAC,MAAM,EAAE,aAAa,gBAAgB,MACxD,KAAK,eAAe,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,SAAS,KAAK;AACxE,QAAM;AAAA,IACJ,UACI,4EACA;AAAA,EACN;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY,eAAe,IAAI,EAAE;AACvE;;;ACtDA,SAAS,OAAO,OAAgD;AAC9D,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAAS,IAAI,OAA+B;AAC1C,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAGO,SAAS,2BAA2B,MAAsC;AAC/E,QAAM,MAAM,OAAO,IAAI;AACvB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY,eAAe,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,IAAI,MAAM,KAAK;AAClC,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,UAAU,IAAI,IAAI,MAAM,MAAM;AACpC,QAAM,aAAa,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AACzE,QAAM,WAAW,OAAO,IAAI,QAAQ;AAEpC,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,gCAA6B,MAAM,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE,EAAE;AAE7E,MAAI,SAAS;AACX,UAAM,KAAK,2BAAsB,IAAI,IAAI,MAAM,KAAK,yBAAyB,GAAG;AAChF,UAAM,KAAK,+EAA+E;AAC1F,WAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY,eAAe,IAAI,EAAE;AAAA,EACvE;AAEA,QAAM,eAAe,IAAI,UAAU,OAAO;AAC1C,QAAM,UAAU,OAAO,UAAU,IAAI;AACrC,QAAM,aAAa,IAAI,SAAS,MAAM;AACtC,QAAM,QAAQ,IAAI,SAAS,KAAK,KAAK,IAAI,UAAU,KAAK;AAExD,MAAI,cAAc,cAAc,OAAO,aAAa,KAAK;AACvD,UAAM,KAAK,mDAAmD;AAC9D,QAAI,aAAc,OAAM,KAAK,YAAY,aAAa,QAAQ,MAAM,GAAG,CAAC,EAAE;AAC1E,QAAI,WAAY,OAAM,KAAK,wBAAwB,UAAU,EAAE;AAC/D,QAAI,MAAO,OAAM,KAAK,OAAO,KAAK,EAAE;AACpC,UAAM,KAAK,+DAA+D;AAAA,EAC5E,OAAO;AACL,UAAM;AAAA,MACJ,6BAA6B,cAAc,OAAO,UAAU,UAAU,MAAM,EAAE;AAAA,IAChF;AACA,UAAM,SAAS,IAAI,UAAU,MAAM,KAAK,IAAI,UAAU,KAAK;AAC3D,QAAI,OAAQ,OAAM,KAAK,YAAY,MAAM,EAAE;AAC3C,UAAM,KAAK,sEAAsE;AAAA,EACnF;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY,eAAe,IAAI,EAAE;AACvE;;;ACxDA,SAASC,KAAI,OAA+B;AAC1C,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAASC,QAAO,OAAgD;AAC9D,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAAS,kBAAkB,aAAqC;AAC9D,QAAM,KAAKA,QAAO,WAAW;AAC7B,MAAI,CAAC,GAAI,QAAO;AAChB,SAAOD,KAAI,GAAG,KAAK,KAAKA,KAAI,GAAG,EAAE;AACnC;AAEO,SAAS,yBAAyB,QAAwC;AAC/E,QAAM,MAAMC,QAAO,MAAM;AACzB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY,eAAe,MAAM;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,SAASD,KAAI,IAAI,MAAM,KAAKA,KAAI,IAAI,IAAI,KAAK;AACnD,QAAM,QAAQA,KAAI,IAAI,KAAK;AAC3B,QAAME,gBAAeF,KAAI,IAAI,MAAM,KAAK;AACxC,QAAM,QAAQ,IAAI,UAAU;AAC5B,QAAM,YAAYC,QAAO,IAAI,SAAS;AACtC,QAAM,iBAAiBD,KAAI,WAAW,KAAK,KAAKA,KAAI,IAAI,cAAc;AACtE,QAAM,kBAAkBA,KAAI,WAAW,MAAM,KAAKA,KAAI,IAAI,eAAe;AACzE,QAAM,SAASA,KAAI,IAAI,MAAM;AAC7B,QAAM,QAAQA,KAAI,IAAI,KAAK,KAAK,kBAAkB,IAAI,WAAW;AACjE,QAAM,SAASA,KAAI,IAAI,MAAM;AAC7B,QAAM,aAAaA,KAAI,IAAI,UAAU;AAErC,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,kBAAkB,MAAM,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE,EAAE;AAClE,QAAM,KAAK,YAAY,QAAQ,YAAY,SAAS,yBAAsBE,aAAY,EAAE;AACxF,MAAI,gBAAgB;AAClB,UAAM;AAAA,MACJ,kBACI,cAAc,cAAc,WAAM,eAAe,KACjD,cAAc,cAAc;AAAA,IAClC;AAAA,EACF;AACA,MAAI,OAAQ,OAAM,KAAK,iBAAiB,MAAM,EAAE;AAChD,MAAI,MAAO,OAAM,KAAK,OAAO,KAAK,EAAE;AACpC,MAAI,OAAQ,OAAM,KAAK,WAAW,MAAM,EAAE;AAC1C,MAAI,WAAY,OAAM,KAAK,WAAW,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE;AAE/D,MAAIA,kBAAiB,UAAUA,kBAAiB,UAAU;AACxD,UAAM;AAAA,MACJ,QACI,4FACA;AAAA,IACN;AAAA,EACF,WAAW,mBAAmB,aAAa,mBAAmB,mBAAmB;AAC/E,UAAM,KAAK,gGAAgG;AAAA,EAC7G,WAAW,OAAO;AAChB,UAAM,KAAK,+FAA+F;AAAA,EAC5G;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,YAAY,eAAe,MAAM,EAAE;AACzE;;;AC3DA,IAAM,UAAU;AAET,SAAS,kBAAkB,QAAuC;AACvE,MAAI,CAAC,OAAO,YAAY,KAAK,EAAG,QAAO,OAAO;AAC9C,SAAO,GAAG,OAAO,OAAO;AAAA;AAAA,EAAO,OAAO;AAAA,EAAK,OAAO,UAAU;AAC9D;AAEA,SAAS,cAAc,KAAsD;AAC3E,QAAM,QAAQ,CAAC,WAAW,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU;AAC3D,MAAI,IAAI,SAAU,OAAM,KAAK,+CAA+C;AAAA,WACnE,IAAI,MAAO,OAAM,KAAK,WAAW,IAAI,KAAK,EAAE;AAAA,WAC5C,IAAI,YAAY,KAAM,OAAM,KAAK,cAAc,IAAI,QAAQ,EAAE;AACtE,QAAM,UAAU,IAAI,OAAO,KAAK;AAChC,MAAI,QAAS,OAAM,KAAK,WAAW,QAAQ,MAAM,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE;AAC5E,QAAM,KAAK,yDAAyD;AACpE,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,SAAO;AAAA,IACL,SAAS,MAAM,KAAK,IAAI;AAAA,IACxB,YAAY,eAAe,UAAU,EAAE,QAAQ,IAAI,QAAQ,QAAQ,IAAI,OAAO,CAAC;AAAA,EACjF;AACF;AAEO,SAAS,0BAA0B,KAAsD;AAC9F,MAAI,CAAC,IAAI,GAAI,QAAO,cAAc,GAAG;AAErC,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,WAAW,MAAM;AACnB,UAAM,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK;AACvD,WAAO;AAAA,MACL,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI,MAAM;AAAA,EAAe,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,MAC5E,YAAY,eAAe,EAAE,QAAQ,IAAI,QAAQ,QAAQ,IAAI,OAAO,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,MAAI,IAAI,UAAU,YAAY,IAAI,WAAW,UAAU;AACrD,WAAO,yBAAyB,MAAM;AAAA,EACxC;AACA,MAAI,IAAI,UAAU,YAAY,IAAI,WAAW,YAAY;AACvD,WAAO,2BAA2B,MAAM;AAAA,EAC1C;AACA,MAAI,IAAI,UAAU,cAAc,IAAI,WAAW,UAAU,IAAI,WAAW,aAAa;AACnF,WAAO,wBAAwB,MAA2B;AAAA,EAC5D;AACA,MAAI,IAAI,UAAU,aAAa,IAAI,WAAW,iBAAiB;AAC7D,UAAM,MAAM;AACZ,QAAI,IAAI,WAAW,IAAI,UAAU,IAAI,OAAO;AAC1C,aAAO,gCAAgC,MAA6B;AAAA,IACtE;AACA,QAAI,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAC/B,aAAO;AAAA,QACL,SAAS;AAAA,UACP,sCAAmC,IAAI,SAAS,KAAK,MAAM,IAAI,UAAU,QAAQ;AAAA,UACjF,aAAc,IAAI,SAAsB,KAAK,IAAI,CAAC;AAAA,UAClD;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,QACX,YAAY,eAAe,MAAM;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,UAAU,SAAS,IAAI,WAAW,UAAU;AAClD,UAAM,UAAW,OAAmC;AACpD,QAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AAClD,aAAO,yBAAyB,QAAQ,CAAC,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,MACL,SAAS,2BAAyB,OAAmC,SAAS,KAAK,KAAK,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS,CAAC;AAAA,MACnI,YAAY,eAAe,MAAM;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI,MAAM;AAAA,IAC3C,YAAY,eAAe,MAAM;AAAA,EACnC;AACF;;;ACpFA,OAAOC,YAAU;AAEjB;AAEA;AACA;;;ACJA;AACA;AAYO,SAAS,qBAAqB,OAIN;AAC7B,QAAM,EAAE,QAAQ,QAAQ,UAAU,IAAI;AACtC,QAAM,aAAa,WAAW,cAAc;AAE5C,MAAI,OAAO,cAAc,WAAW;AAClC,QACE,UAAU,WAAW,aACrB,cACA,CAAC,4BAA4B,YAAY,OAAO,KAAK,GACrD;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,sBAAsB,UAAU,0BAA0B,OAAO,KAAK;AAAA,MAChF;AAAA,IACF;AACA,QAAI,UAAU,WAAW,aAAa,CAAC,OAAO,SAAS,CAAC,OAAO,aAAa;AAC1E,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,aAAa,CAAC,OAAO,SAAS,CAAC,OAAO,aAAa;AACvE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,UAAU,SAAS;AACtC,WAAO,EAAE,QAAQ,SAAS,QAAQ,OAAO,UAAU,OAAO;AAAA,EAC5D;AAEA,QAAM,OAAO,OAAO,kBAAkB,KAAK,MAAM,OAAO,eAAe,IAAI;AAC3E,MAAI,OAAO,SAAS,OAAO,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,UAAU;AACzE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,wBAAwB,KAAK,MAAM,WAAW,GAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,OAAO,OAAO,CAAC,WAAW,OAAO,GAAG,GAAG;AACzD,WAAO,EAAE,QAAQ,YAAY,QAAQ,wCAAwC;AAAA,EAC/E;AAEA,MAAI,WAAW,WAAW,aAAa,CAAC,OAAO,SAAS,OAAO,aAAa;AAC1E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,OAAO,UAAU,UAAU;AAAA,EACrC;AACF;;;ACzEA;AACA;AAHA,SAAS,cAAAC,cAAY,aAAAC,aAAW,eAAAC,eAAa,cAAAC,mBAAkB;AAC/D,OAAOC,YAAU;AAKjB,SAAS,cAAsB;AAC7B,QAAM,EAAE,YAAY,IAAI,gBAAgB;AACxC,QAAM,MAAMA,OAAK,KAAK,aAAa,UAAU;AAC7C,EAAAH,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,SAAO;AACT;AAEO,SAAS,aAAa,OAAe,YAA6B;AACvE,SAAO,aAAa,GAAG,SAAS,KAAK,CAAC,KAAK,SAAS,UAAU,CAAC,KAAK,SAAS,KAAK;AACpF;AAEA,SAAS,YAAY,WAA2B;AAC9C,SAAOG,OAAK,KAAK,YAAY,GAAG,GAAG,SAAS,OAAO;AACrD;AAEO,SAAS,mBAAmB,WAAqD;AACtF,SAAO,SAA2C,YAAY,SAAS,GAAG,MAAS;AACrF;AAEO,SAAS,mBAAmB,SAAqC;AACtE,YAAU,YAAY,QAAQ,SAAS,GAAG,OAAO;AACnD;AAEO,SAAS,qBAAqB,WAA4B;AAC/D,QAAM,OAAO,YAAY,SAAS;AAClC,MAAI,CAACJ,aAAW,IAAI,EAAG,QAAO;AAC9B,EAAAG,YAAW,IAAI;AACf,SAAO;AACT;AAEO,SAAS,sBAA0C;AACxD,QAAM,MAAM,YAAY;AACxB,MAAI,CAACH,aAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,UAA8B,CAAC;AACrC,aAAW,QAAQE,cAAY,GAAG,GAAG;AACnC,QAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,UAAM,UAAU;AAAA,MACdE,OAAK,KAAK,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AACA,QAAI,CAAC,SAAS,UAAW;AACzB,YAAQ,KAAK;AAAA,MACX,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb,OAAO,QAAQ,MAAM,WAAW,QAAQ,GAAG,IAAI;AAAA,MAC/C,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AACtE;;;AC3DA;AAaO,SAAS,8BAA8B,OAGnB;AACzB,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,WAAqB,CAAC;AAE5B,MAAI,OAAO,WAAW;AACpB,aAAS,KAAK,sCAAsC;AAAA,EACtD;AACA,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,QAAQ;AACvC,aAAS,KAAK,kCAAkC;AAAA,EAClD;AACA,MAAI,iBAAiB,MAAM,GAAG;AAC5B,aAAS,KAAK,iCAAiC;AAAA,EACjD;AACA,MAAI,OAAO,mBAAmB;AAC5B,aAAS,KAAK,OAAO,iBAAiB;AAAA,EACxC;AACA,MAAI,OAAO,oBAAoB,OAAO,OAAO;AAC3C,aAAS,KAAK,6BAA6B,OAAO,gBAAgB,EAAE;AAAA,EACtE;AACA,MAAI,OAAO,UAAU,UAAU,WAAW;AACxC,aAAS,KAAK,OAAO,UAAU,UAAU,0BAA0B;AAAA,EACrE;AACA,MAAI,6BAA6B,MAAM,GAAG;AACxC,aAAS,KAAK,OAAO,UAAU,UAAU,sBAAsB;AAAA,EACjE;AAEA,QAAM,mBAAmB,uBAAuB,MAAM;AACtD,MAAI;AACJ,MAAI,kBAAkB;AACpB,QAAI,OAAO,YAAa,kBAAiB;AAAA,aAChC,CAAC,OAAO,MAAO,kBAAiB;AAAA,QACpC,kBAAiB;AAAA,EACxB,OAAO;AACL,aAAS,KAAK,6CAA6C;AAAA,EAC7D;AAEA,QAAM,WAAW,oBAAoB,SAAS,WAAW;AACzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC5DA;AAQA,eAAsB,0BAA0B,OAKJ;AAC1C,QAAM,MAAM,oBAAI,IAA+B;AAC/C,QAAM,YAAY,MAAM,WAAW,KAAK;AACxC,MAAI,CAAC,aAAa,MAAM,QAAQ,WAAW,EAAG,QAAO;AAErD,QAAM,OAAO,eAAe,MAAM,OAAO;AACzC,MAAI;AACF,UAAM,SAAS,MAAM,8BAA8B,MAAM,QAAQ,WAAW,EAAE,SAAS,KAAK,CAAC;AAC7F,UAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAEvE,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,EAAE,SAAS,CAAC,GAAG,IAAI,IAAI,MAAM,OAAO,CAAC,EAAE;AAAA,MACvC,EAAE,WAAW,SAAS,KAAK;AAAA,IAC7B;AACA,QAAI,CAAC,IAAI,MAAM,CAAC,IAAI,YAAY,OAAO,IAAI,aAAa,SAAU,QAAO;AACzE,UAAM,OAAQ,IAAI,SAA6C;AAC/D,QAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO;AACjC,eAAW,OAAO,MAAM;AACtB,UAAI,KAAK,OAAQ,KAAI,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;AJfA,SAASC,cAAa,OAAe,MAA+C;AAClF,SAAO;AAAA,IACLC,OAAK,KAAK,aAAa,KAAK,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAAe,OAA0B;AAClE,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAC3C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,SAAS,KAAK;AAC7B,SAAO,MAAM,OAAO,CAAC,MAAM,SAAS,CAAC,MAAM,MAAM;AACnD;AAEA,SAAS,gBACP,QACA,YACmB;AACnB,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,QAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,QAAM,YAAY,OAAO,SAAS,WAAW,IAAI,OAAO,MAAM,KAAK,OAAO;AAC1E,QAAM,SAAS,qBAAqB,EAAE,QAAQ,QAAQ,UAAU,CAAC;AACjE,QAAM,eAAe,8BAA8B,EAAE,QAAQ,OAAO,CAAC;AACrE,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO;AAAA,IACrB,gBAAgB,OAAO,UAAU;AAAA,IACjC,iBAAiB,OAAO,UAAU;AAAA,IAClC,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,YAAY,WAAW,cAAc;AAAA,IACrC,YAAY,WAAW;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,eACpB,MAC4B;AAC5B,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,WAAS,OAAO,OAAO;AACvB,QAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAC9C,QAAM,YAAY,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAC5D,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,QAAQ,kBAAkB,OAAO,KAAK;AAC5C,QAAM,UAAiC,CAAC;AACxC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAASD,cAAa,OAAO,IAAI;AACvC,QAAI,OAAQ,SAAQ,KAAK,MAAM;AAAA,EACjC;AAEA,QAAM,oBACJ,aACA,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,OAAO,OAAO,YAAY,GAAG,KAAK,CAAC,KAChF;AAEF,QAAM,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,OAAqB,QAAQ,EAAE,CAAC;AACrF,QAAM,aAAa,MAAM,0BAA0B;AAAA,IACjD,WAAW;AAAA,IACX;AAAA,IACA,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,IAC/C,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,EAC9C,CAAC;AAED,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAE/D,MAAI;AACJ,MAAI,qBAAqB,KAAK,gBAAgB,SAAS,KAAK,gBAAgB,SAAS;AACnF,mBAAe,MAAM,sBAAsB,OAAO;AAAA,MAChD,GAAG;AAAA,MACH,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,gBAAoD,CAAC;AAC3D,QAAM,qBAAqB,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB;AAC/E,MAAI,oBAAoB;AACtB,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,aAAa,UAAU;AAC/B,sBAAc,KAAK;AAAA,UACjB,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,QAAQ,KAAK,aAAa,SAAS,KAAK,IAAI,KAAK;AAAA,QACnD,CAAC;AACD;AAAA,MACF;AACA,YAAM,UAAU,MAAM,mBAAmB;AAAA,QACvC,KAAK;AAAA,QACL,MAAM,KAAK;AAAA,QACX,GAAI,oBAAoB,EAAE,WAAW,kBAAkB,IAAI,CAAC;AAAA,QAC5D,GAAI,KAAK,UAAU,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,QACxD,GAAI,KAAK,SAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,MACvD,CAAC;AACD,oBAAc,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,SAAS,QAAQ;AAAA,QACjB,IAAI,QAAQ,YAAY;AAAA,QACxB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,MAA2D;AAC1F,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,WAAS,OAAO,OAAO;AACvB,QAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAC9C,QAAM,QAAQ,kBAAkB,OAAO,KAAK;AAC5C,QAAM,UAA+B,CAAC;AACtC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAASA,cAAa,OAAO,IAAI;AACvC,QAAI,CAAC,OAAQ;AACb,YAAQ,KAAK,gBAAgB,QAAQ,oBAAI,IAAI,CAAC,CAAC;AAAA,EACjD;AACA,SAAO,EAAE,OAAO,SAAS,eAAe,CAAC,EAAE;AAC7C;AAEO,SAAS,eAAmC;AACjD,SAAO,oBAAoB;AAC7B;AASO,SAAS,YAAY,MAI1B;AACA,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,WAAS,OAAO,OAAO;AACvB,QAAM,YAAY,aAAa,OAAO,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,MAAS;AAC/E,QAAM,UAAU,mBAAmB,SAAS;AAC5C,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,WAAW,SAAS,MAAM;AAAA,EACrC;AACA,MAAI,QAAQ,OAAO,WAAW,QAAQ,GAAG,GAAG;AAC1C,QAAI;AACF,cAAQ,KAAK,QAAQ,KAAK,SAAS;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,UAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC3C,qBAAmB,OAAO;AAC1B,uBAAqB,SAAS;AAC9B,SAAO,EAAE,WAAW,SAAS,MAAM,KAAK,QAAQ,IAAI;AACtD;AAEA,eAAsB,uBACpB,MACe;AACf,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,QAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnC,WAAS,OAAO,OAAO;AACvB,WAAS,MAAM,QAAQ;AACvB,QAAM,SAAS,WAAW,OAAO,IAAI;AACrC,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,QAAM,aAAa,8BAA8B,EAAE,QAAQ,OAAO,CAAC;AACnE,MAAI,CAAC,WAAW,UAAU;AACxB,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU,WAAW;AAAA,UACrB,kBAAkB,WAAW;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,UAAU,MAAM,mBAAmB;AAAA,IACvC,GAAG;AAAA,IACH,KAAK;AAAA,IACL;AAAA,EACF,CAAC;AACD,UAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,MAAI,QAAQ,YAAY,eAAe,QAAQ,YAAY,WAAW;AACpE,YAAQ,WAAW;AAAA,EACrB;AACF;;;AKlOA;AAEA,IAAME,mBAAkB;AACxB,IAAMC,wBAAuB,IAAI,KAAK,KAAK;AAE3C,eAAsB,eAAe,MAAuD;AAC1F,QAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,QAAM,SACJ,OAAO,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,IAAID;AAC9D,QAAM,aACJ,OAAO,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,UAAU,CAAC,IAAIC;AACtE,QAAM,UAAU,KAAK,IAAI;AAEzB,SAAO,KAAK,IAAI,IAAI,WAAW,YAAY;AACzC,UAAM,UAAU,YAAY,mBAAmB,SAAS,IAAI;AAC5D,QAAI,SAAS,UAAW;AAExB,UAAM,OAAO,MAAM,eAAe;AAAA,MAChC,GAAG;AAAA,MACH,cAAc,KAAK,gBAAgB;AAAA,MACnC,aAAa,KAAK,eAAe;AAAA,IACnC,CAAC;AACD,UAAM,SAAS,wBAAwB,EAAE,WAAW,OAAO,QAAQ,GAAG,KAAK,CAAC;AAC5E,YAAQ,IAAI,OAAO,OAAO;AAC1B,QAAI,OAAO,YAAY;AACrB,cAAQ,MAAM,wBAAwB,OAAO,UAAU,EAAE;AAAA,IAC3D;AAEA,UAAM,cACJ,KAAK,QAAQ,SAAS,KACtB,KAAK,QAAQ;AAAA,MACX,CAAC,MACC,EAAE,aAAa,qBACd,EAAE,aAAa,YACd,EAAE,aAAa,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,sBAAsB,CAAC;AAAA,IAC5E;AACF,QAAI,eAAe,KAAK,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,SAAS,GAAG;AACnF,UAAI,aAAa,SAAS;AACxB,gBAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC3C,2BAAmB,OAAO;AAAA,MAC5B;AACA;AAAA,IACF;AAEA,YAAQ,MAAM;AAAA,EAChB;AACF;;;AC7CA;AACA;AALA,SAAS,SAAAC,cAAa;AACtB,SAAS,aAAAC,YAAW,cAAAC,cAAY,YAAAC,iBAAgB;AAChD,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAwB9B,SAASC,yBAAgC;AAGvC,SAAOC,OAAK,KAAKC,eAAc,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,QAAQ;AACzE;AAEO,SAAS,oBAAoB,MAAuD;AACzF,QAAM,UAAU,KAAK,WAAWF,uBAAsB;AACtD,MAAI,CAACG,aAAW,OAAO,EAAG,QAAO;AAEjC,QAAM,YAAY,aAAa,KAAK,OAAO,KAAK,UAAU;AAC1D,QAAM,EAAE,YAAY,IAAI,gBAAgB;AACxC,QAAM,UAAUF,OAAK,KAAK,aAAa,YAAY,GAAG,SAAS,MAAM;AACrE,MAAI;AACJ,MAAI;AACF,YAAQG,UAAS,SAAS,GAAG;AAAA,EAC/B,QAAQ;AACN,YAAQ;AAAA,EACV;AAEA,QAAM,iBAAiB,KAAK,kBAAkB,QAAQ;AACtD,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,KAAK,WAAY,MAAK,KAAK,UAAU,KAAK,UAAU;AACxD,MAAI,KAAK,UAAW,MAAK,KAAK,iBAAiB,KAAK,SAAS;AAC7D,MAAI,KAAK,QAAS,MAAK,KAAK,cAAc,KAAK,OAAO;AACtD,MAAI,KAAK,OAAQ,MAAK,KAAK,YAAY,KAAK,MAAM;AAElD,QAAM,QAA+B;AAAA,IACnC;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,MAAI;AACF,UAAM,QAAQC;AAAA,MACZ;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,QACjB,UAAU;AAAA,QACV;AAAA,QACA,KAAK,QAAQ;AAAA,MACf,CAAC;AAAA,IACH;AACA,QAAI,UAAU,OAAW,CAAAC,WAAU,KAAK;AACxC,UAAM,MAAM;AAEZ,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,KAAK,MAAM;AAAA,MACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AACA,uBAAmB,OAAO;AAC1B,WAAO,EAAE,WAAW,KAAK,MAAM,KAAK,SAAS,QAAQ;AAAA,EACvD,QAAQ;AACN,QAAI,UAAU,QAAW;AACvB,UAAI;AACF,QAAAA,WAAU,KAAK;AAAA,MACjB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACnGA;AAEA,eAAsB,gBACpB,MAC6B;AAC7B,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,WAAS,OAAO,OAAO;AACvB,QAAM,aAAa,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AACnD,QAAM,YAAY,aAAa,OAAO,UAAU;AAChD,QAAM,WAAW,mBAAmB,SAAS;AAC7C,MAAI,UAAU,OAAO,CAAC,SAAS,WAAW;AACxC,WAAO,EAAE,WAAW,SAAS,UAAU,SAAS,OAAO,KAAK,SAAS,IAAI;AAAA,EAC3E;AAEA,QAAM,UAAU,oBAAoB;AAAA,IAClC;AAAA,IACA;AAAA,IACA,WAAW,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,IACrD,QAAQ,OAAO,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,IAAI;AAAA,IACpE,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,IAC/C,QAAQ,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,EAC9C,CAAC;AACD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ;AAAA,IACjB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,EACf;AACF;AAEA,eAAsB,iBAAiB,MAAuD;AAC5F,QAAM,QAAQ,OAAO,KAAK,OAAO,EAAE;AACnC,MAAI,OAAO;AACT,UAAM,OAAO,KAAK,SAAS,QAAQ,KAAK,SAAS,SAC7C,MAAM,eAAe,EAAE,GAAG,MAAM,cAAc,MAAM,CAAC,IACrD,iBAAiB,IAAI;AACzB,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,EACF;AACA,UAAQ,IAAI,KAAK,UAAU,EAAE,UAAU,aAAa,EAAE,GAAG,MAAM,CAAC,CAAC;AACnE;AAEO,SAAS,eAAe,MAA8C;AAC3E,UAAQ,IAAI,KAAK,UAAU,YAAY,IAAI,GAAG,MAAM,CAAC,CAAC;AACxD;AAEO,SAAS,iBAAuB;AACrC,UAAQ,IAAI,KAAK,UAAU,EAAE,UAAU,aAAa,EAAE,GAAG,MAAM,CAAC,CAAC;AACnE;AAEA,eAAsB,kBAAkB,MAAuD;AAC7F,QAAM,eAAe,IAAI;AAC3B;AAEA,eAAsB,eAAe,MAAuD;AAC1F,QAAM,OAAO,MAAM,eAAe,IAAI;AACtC,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;;;ACpDA;AACA;AACA;AACA;AAJA,OAAOC,YAAU;AAyBjB,SAAS,KACP,OACA,QACA,QACA,WACA,YACA,QACsB;AACtB,SAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,YAAY,QAAQ,WAAW,OAAO;AACnF;AASA,eAAsB,mBACpB,MACmC;AACnC,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,kBAAkB,KAAK,YAAY,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AACzE,QAAM,SAAS,KAAK,WAAW,QAAQ,KAAK,WAAW;AAEvD,QAAM,WAAmC,CAAC;AAC1C,QAAM,UAAkC,CAAC;AACzC,QAAM,SAAiC,CAAC;AAExC,aAAW,OAAO,eAAe,GAAG;AAClC,eAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,YAAM,aAAaC,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,aAAa;AAC3F,YAAM,SAAS,SAA0C,YAAY,MAAS;AAE9E,UAAI,CAAC,QAAQ;AACX,gBAAQ,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,qBAAqB,CAAC;AAClE;AAAA,MACF;AAEA,YAAM,SAAS,OAAO,UAAU;AAChC,YAAM,YAAY,OAAO,aAAa;AACtC,YAAM,aAAa,OAAO,cAAc;AAGxC,UAAI,CAAC,OAAO,cAAc,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY;AAC9D,gBAAQ;AAAA,UACN,KAAK,IAAI,IAAI,MAAM,QAAQ,WAAW,YAAY,sCAAsC;AAAA,QAC1F;AACA;AAAA,MACF;AAGA,UAAI,mBAAmB,cAAc,gBAAiB;AAItD,UAAI,OAAO,sBAAsB;AAC/B,gBAAQ;AAAA,UACN,KAAK,IAAI,IAAI,MAAM,QAAQ,WAAW,YAAY,6BAA6B;AAAA,QACjF;AACA;AAAA,MACF;AAEA,YAAM,SAAS,oBAAoB,MAAM;AAIzC,UAAI,OAAO,aAAa;AACtB,gBAAQ;AAAA,UACN,KAAK,IAAI,IAAI,MAAM,QAAQ,WAAW,YAAY,uDAAkD;AAAA,QACtG;AACA;AAAA,MACF;AAGA,UAAI,OAAO,OAAO;AAChB,gBAAQ;AAAA,UACN,KAAK,IAAI,IAAI,MAAM,QAAQ,WAAW,YAAY,+BAA+B;AAAA,QACnF;AACA;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,iBAAS,KAAK;AAAA,UACZ,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAKA,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,UACpC;AAAA,UACA,EAAE,SAAS,KAAK;AAAA,QAClB;AACA,cAAM,aAAa,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,MAAM,CAAC;AAClH,cAAM,UAAU,MAAM;AAAA,UACpB;AAAA,UACA;AAAA,UACA,EAAE,WAAW,WAAW;AAAA,UACxB,EAAE,WAAW,SAAS,KAAK;AAAA,QAC7B;AACA,cAAM,YACJ,QAAQ,OAAO,QACd,QAAQ,UAA6C,OAAO;AAE/D,YAAI,WAAW;AACb,mBAAS,KAAK;AAAA,YACZ,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,OAAO;AAEL,kBAAQ,KAAK;AAAA,YACX,OAAO,IAAI;AAAA,YACX,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ,+EAA+E,QAAQ,MAAM;AAAA,UACvG,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,eAAO,KAAK;AAAA,UACV,OAAO,IAAI;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAS,IAAc;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU,SAAS,OAAO;AAC7C;AAEA,eAAsB,sBACpB,MACe;AACf,QAAM,SAAS,MAAM,mBAAmB,IAAI;AAC5C,QAAM,UAAU;AAAA,IACd,IAAI,OAAO,OAAO,WAAW;AAAA,IAC7B,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO,SAAS;AAAA,IAC1B,SAAS,OAAO,QAAQ;AAAA,IACxB,QAAQ,OAAO,OAAO;AAAA,IACtB,SAAS;AAAA,EACX;AACA,UAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,MAAI,OAAO,OAAO,SAAS,EAAG,SAAQ,KAAK,CAAC;AAC9C;;;ACjNA;AACA;AAHA,OAAOC,YAAU;AACjB,SAAS,WAAAC,iBAAe;AAUxB,IAAMC,eAAcC,OAAK,KAAKC,UAAQ,GAAG,WAAW,aAAa;AAa1D,SAAS,kBAAkB,MAAkD;AAClF,QAAM,WAAW,eAAe;AAChC,QAAM,WAAW,mBAAmB,EAAE,GAAG,MAAM,QAAQ,SAAS,CAAC;AACjE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,YAAY,gBAAgBF,YAAW;AAAA,MACvC,UAAU;AAAA,MACV,QACE;AAAA,MAEF,aACE;AAAA,IAEJ;AAAA,EACF;AAEA,MAAI,SAAS,mBAAmB;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,YAAY,gBAAgBA,YAAW;AAAA,MACvC,UAAU,0BAA0B,QAAQ;AAAA,MAC5C,QAAQ,kBAAkB,QAAQ;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,SAAS,mBAAmB,SAAS,MAAM,QAAQ;AACzD,QAAM,YAAY,0BAA0B;AAAA,IAC1C,GAAG;AAAA,IACH,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACV,CAAC;AAED,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY,gBAAgBA,YAAW;AAAA,IACvC,UAAU;AAAA,IACV,QAAQ,kBAAkB,MAAM;AAAA,IAChC,aACE;AAAA,EACJ;AACF;AAEO,SAAS,wBAAwB,OAAO,OAAa;AAC1D,QAAM,SAAS,kBAAkB;AACjC,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,QAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AACnC;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,OAAO,UAAU,0CAA0C;AACzE,QAAI,OAAO,YAAa,SAAQ,MAAM,OAAO,WAAW;AACxD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,OAAO,kBAAkB;AAC3B,YAAQ;AAAA,MACN,4BAA4B,OAAO,UAAU,eAAe,SAAS,QAAQ,OAAO,UAAU;AAAA,IAChG;AACA;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,yBAAyB,OAAO,UAAU,eAAe,EAAE,OAAO,OAAO,UAAU;AAAA,EAErF;AACF;AAEO,SAAS,6BAA6B,UAG3C;AACA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,aACE;AAAA,IAEJ;AAAA,EACF;AACA,MAAI,CAAC,SAAS,mBAAmB;AAC/B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,aACE;AAAA,IAEJ;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,OAAO;AAC1B;;;AC1HA,OAAOG,YAAU;AAGjB;;;ACCA;AAJA,SAAS,YAAY,WAAW,cAAAC,cAAY,gBAAAC,sBAAoB;AAChE,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AACjB,SAAS,aAAAC,mBAAiB;AAI1B;AA0CA,SAAS,eAAe,KAAa,MAAoC;AACvE,MAAI;AACF,UAAM,MAAMC,YAAU,KAAK,MAAM,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,UAAU,IAAI,UAAU,IAAI,KAAK;AACvC,UAAM,UAAU,IAAI,UAAU,IAAI,KAAK;AACvC,UAAM,KAAK,IAAI,WAAW;AAC1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAA+C;AAClE,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,UAAU,KAAK,GAAG,OAAO,WAAM,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC;AACvE;AAEA,SAAS,WAAW,QAAyB;AAC3C,MAAI,CAACC,aAAW,MAAM,EAAG,QAAO;AAChC,MAAI;AACF,eAAW,QAAQ,UAAU,IAAI;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,+BAAsD;AAAA,EACjE,gBAAgB,MAAM;AAAA,EACtB,eAAe,CAAC,QAAQ,eAAe,QAAQ,aAAa,UAAU,UAAU,SAAS,CAAC,GAAG,CAAC;AAAA,EAC9F,eAAe,CAAC,QAAQ,eAAe,KAAK,CAAC,WAAW,CAAC;AAAA,EACzD,YAAY,MAAM,eAAe;AAAA,EACjC,gBAAgB,MAAMC,OAAK,KAAKC,UAAQ,GAAG,WAAW,aAAa;AAAA,EACnE,qBAAqB,MAAMD,OAAK,KAAKC,UAAQ,GAAG,WAAW,aAAa;AAAA,EACxE,iBAAiB,MAAM;AACrB,UAAM,WAAWD,OAAK,KAAKC,UAAQ,GAAG,WAAW,aAAa;AAC9D,QAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B;AACA,QAAI;AACF,YAAM,SAAS,KAAK,MAAMG,eAAa,UAAU,MAAM,CAAC;AAKxD,aAAO;AAAA,QACL,WAAW,QAAQ,OAAO,QAAQ,KAAK,CAAC;AAAA,QACxC,mBAAmB,YAAY,OAAO,WAAW;AAAA,QACjD,sBAAsB,OAAO;AAAA,MAC/B;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,aAAa,OAAO;AAAA,IAClB,cAAc,QAAQ,IAAI,gBAAgB,KAAK,KAAK;AAAA,IACpD,yBAAyB,QAAQ,IAAI,6BAA6B,KAAK,KAAK;AAAA,IAC5E,yBAAyB,YAAY,QAAQ,IAAI,mBAAmB;AAAA,IACpE,qBAAqB,QAAQ,QAAQ,IAAI,uBAAuB,KAAK,CAAC;AAAA,IACtE,oBAAoB,QAAQ,QAAQ,IAAI,sBAAsB,KAAK,CAAC;AAAA,IACpE,mBAAmB,QAAQ,IAAI,qBAAqB,KAAK,KAAK;AAAA,IAC9D,iBAAiB,QAAQ,IAAI,mBAAmB,KAAK,KAAK;AAAA,IAC1D,yBAAyB,QAAQ,IAAI,2BAA2B,KAAK,KAAK;AAAA,IAC1E,uBAAuB;AAAA,MACrB,QAAQ,IAAI,wBAAwB,KAAK,KACvC,QAAQ,IAAI,0BAA0B,KAAK;AAAA,IAC/C;AAAA,IACA,yBAAyB,0BAA0B;AAAA,IACnD,oBAAoB,QAAQ,QAAQ,IAAI,cAAc,KAAK,CAAC;AAAA,IAC5D,yBAAyB,MAAM;AAC7B,YAAM,IAAI,QAAQ,IAAI,0BAA0B,KAAK,EAAE,YAAY;AACnE,aAAO,MAAM,OAAO,MAAM,UAAU,MAAM;AAAA,IAC5C,GAAG;AAAA,EACL;AAAA,EACA,aAAa,MAAM,mBAAmB;AAAA,EACtC,2BAA2B,MAAMF,OAAK,KAAKC,UAAQ,GAAG,aAAa,SAAS;AAAA,EAC5E,YAAY,CAAC,WAAWF,aAAW,MAAM;AAAA,EACzC,cAAc,CAAC,WAAW,WAAW,MAAM;AAC7C;;;AClHA,SAAS,4BACP,KACA,KACS;AACT,SACE,IAAI,4BAA4B,mBAChC,IAAI,gCAAgC;AAExC;AAEA,SAAS,uBACP,KACA,KACS;AACT,SACE,IAAI,4BAA4B,iBAChC,IAAI,gCAAgC;AAExC;AAEA,SAAS,kBAAkB,KAA2C;AACpE,SAAO,QAAQ,IAAI,qBAAqB;AAC1C;AAEA,SAAS,iBACP,KACA,KACS;AACT,SAAO,IAAI,4BAA4B,YAAY,IAAI,gCAAgC;AACzF;AAEA,SAAS,MAAM,SAAmC;AAChD,SAAO;AACT;AAUO,SAAS,+BACd,KACA,KACa;AACb,QAAM,mBAAmB;AAAA,IACvB,mBAAmB,IAAI,2BAA2B;AAAA,IAClD,6BAA6B,IAAI,+BAA+B;AAAA,IAChE,uBAAuB,QAAQ,IAAI,qBAAqB;AAAA,IACxD,yBAAyB,QAAQ,IAAI,uBAAuB;AAAA,EAC9D;AAEA,QAAM,sBACJ,QAAQ,IAAI,WAAW,KAAK,CAAC,KAC7B,QAAQ,IAAI,YAAY,KAAK,CAAC,KAC9B,IAAI;AAEN,MAAI,iBAAiB,KAAK,GAAG,KAAK,CAAC,4BAA4B,KAAK,GAAG,GAAG;AACxE,UAAM,SACJ,IAAI,4BAA4B,WAC5B,kDACA;AACN,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,yCAAyC,MAAM;AAAA,MACxD,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,uBAAuB,KAAK,GAAG,KAAK,CAAC,4BAA4B,KAAK,GAAG,GAAG;AAC9E,QAAI,kBAAkB,GAAG,KAAK,IAAI,2BAA2B,qBAAqB;AAChF,aAAO,MAAM;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SACE;AAAA,QACF,SAAS;AAAA,UACP,GAAG;AAAA,UACH,cAAc;AAAA,UACd,yBAAyB;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SACJ,IAAI,4BAA4B,gBAC5B,uDACA;AACN,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,2CAA2C,MAAM;AAAA,MAC1D,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,kBAAkB,GAAG,GAAG;AAC1B,QAAI,IAAI,2BAA2B,qBAAqB;AACtD,aAAO,MAAM;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SACE;AAAA,QACF,SAAS;AAAA,UACP,GAAG;AAAA,UACH,cAAc;AAAA,UACd,yBAAyB;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,QAAkB,CAAC;AACzB,QAAI,IAAI,uBAAuB;AAC7B,YAAM,KAAK,2EAA2E;AAAA,IACxF;AACA,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,yCAAyC,MAAM,KAAK,IAAI,CAAC;AAAA,MAClE,aACE;AAAA,MAEF,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,IAAI,4BAA4B;AACvD,QAAM,iBAAiB,IAAI,gCAAgC;AAC3D,QAAM,eAAe,IAAI,4BAA4B;AACrD,QAAM,mBAAmB,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,IAAI,sBAAsB;AAE9F,QAAM,yBAAyB,oBAAoB,CAAC;AAEpD,QAAM,qBACJ,0BAA0B,IAAI,4BAA4B;AAE5D,MAAI,kBAAkB,CAAC,gBAAgB;AACrC,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,aACE;AAAA,MACF,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,uBAAuB,gBAAgB;AACzC,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,aACE;AAAA,MACF,SAAS;AAAA,QACP,mBAAmB,IAAI,2BAA2B;AAAA,QAClD,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,qBAAqB;AACvB,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,eACL,+FACA;AAAA,MACJ,SAAS;AAAA,QACP,mBAAmB,IAAI,2BAA2B;AAAA,QAClD,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB;AAClB,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,aACE;AAAA,MACF,SAAS,EAAE,mBAAmB,IAAI,2BAA2B,MAAM,iBAAiB;AAAA,IACtF,CAAC;AAAA,EACH;AAEA,MAAI,oBAAoB;AACtB,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,aACE;AAAA,MACF,SAAS;AAAA,QACP,mBAAmB,IAAI,2BAA2B;AAAA,QAClD,oBAAoB,IAAI,sBAAsB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,0BAA0B,IAAI,sBAAsB,CAAC,IAAI,yBAAyB;AACpF,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,SAAS;AAAA,QACP,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MACE,0BACA,CAAC,IAAI,sBACL,CAAC,IAAI,yBACL;AACA,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,aACE;AAAA,MAEF,SAAS;AAAA,QACP,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MACE,0BACA,CAAC,IAAI,sBACL,IAAI,2BACJ,IAAI,4BAA4B,YAChC,IAAI,4BAA4B,eAChC;AACA,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,qEAAqE,IAAI,uBAAuB;AAAA,MACzG,aACE;AAAA,MACF,SAAS;AAAA,QACP,mBAAmB,IAAI,2BAA2B;AAAA,QAClD,oBAAoB,IAAI,sBAAsB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,IAAI,yBAAyB;AAChC,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE;AAAA,MACF,SAAS,EAAE,mBAAmB,MAAM,cAAc,sCAAsC;AAAA,IAC1F,CAAC;AAAA,EACH;AAEA,SAAO,MAAM;AAAA,IACX,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS,6BAA6B,IAAI,uBAAuB;AAAA,IACjE,SAAS,EAAE,mBAAmB,IAAI,2BAA2B,KAAK;AAAA,EACpE,CAAC;AACH;;;AFtTA,SAASI,OAAM,SAAmC;AAChD,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAkE;AACzF,QAAM,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE;AAC3C,aAAW,WAAW,UAAU;AAC9B,eAAW,QAAQ,QAAQ,QAAQ;AACjC,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAA8C;AACtE,QAAM,iBAAiB,OAAO,eAAe;AAC7C,QAAM,QAAQ,OAAO,cAAc,QAAQ;AAC3C,QAAM,SAAS,MAAM,MAAM,MAAM,OAAO,SAAS;AACjD,QAAM,YAAY,SAAS,MAAM,OAAO,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI;AACpE,QAAM,iBAAiB,YAAY,gBAAgB,SAAS,IAAI;AAEhE,QAAM,SAAwB;AAAA,IAC5BA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,uBAAuB,cAAc;AAAA,MAC9C,SAAS,EAAE,SAAS,eAAe;AAAA,IACrC,CAAC;AAAA,IACDA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,SAAS,SAAS;AAAA,MAC1B,SAAS,SAAS,SAAS,cAAc,KAAK;AAAA,MAC9C,aAAa,SACT,SACA;AAAA,MACJ,SAAS,EAAE,MAAM,eAAe;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,MAAI,UAAU,WAAW;AACvB,UAAM,eAAe,OAAO,cAAc,SAAS;AACnD,UAAM,mBAAmB,aAAa,OAAO,QAAQ,eAAe,EAAE,EAAE,KAAK,KAAK;AAClF,UAAM,eAAe,aAAa,OAAO,CAAC,oBAAoB,qBAAqB;AACnF,WAAO;AAAA,MACLA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,eAAe,SAAS;AAAA,QAChC,SAAS,aAAa,MAAM,mBACxB,eACE,aAAa,gBAAgB,KAC7B,aAAa,gBAAgB,yBAAyB,cAAc,KACtE,aAAa,QACX,qCAAqC,aAAa,KAAK,MACvD,aAAa,UAAU;AAAA,QAC7B,aAAa,eACT,SACA;AAAA,QACJ,SAAS,EAAE,kBAAkB,gBAAgB,MAAM,eAAe;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,eAAe,OAAO,iBAAiB,OAAO;AAC7D;AAEA,SAAS,iBAAiB,QAA8C;AACtE,QAAM,aAAa,OAAO,eAAe;AACzC,QAAM,oBAAoB,gBAAgB,UAAU;AACpD,QAAM,SAAS,OAAO,WAAW,UAAU;AAC3C,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,SAAwB;AAAA,IAC5BA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,SAAS,SAAS;AAAA,MAC1B,SAAS,SAAS,SAAS,iBAAiB,KAAK,WAAW,iBAAiB;AAAA,MAC7E,aAAa,SAAS,SAAY;AAAA,MAClC,SAAS,EAAE,YAAY,kBAAkB;AAAA,IAC3C,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ;AACV,UAAM,aAAa,OAAO,YAAY,KAAK;AAC3C,UAAM,YAAY,OAAO,WAAW,KAAK;AACzC,UAAM,sBAAsB,mBAAmB,EAAE,OAAO,CAAC;AACzD,UAAM,YAAY,sBAAsB,0BAA0B,mBAAmB,IAAI;AACzF,UAAM,wBAAwB,6BAA6B,mBAAmB;AAC9E,WAAO;AAAA,MACLA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,aAAa,SAAS;AAAA,QAC9B,SAAS,cAAc;AAAA,QACvB,aAAa,aAAa,SAAY;AAAA,QACtC,SAAS,EAAE,YAAY,cAAc,KAAK;AAAA,MAC5C,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,YAAY,SAAS;AAAA,QAC7B,SAAS,aAAa;AAAA,QACtB,aAAa,YAAY,SAAY;AAAA,QACrC,SAAS,EAAE,WAAW,aAAa,MAAM,aAAa,OAAO,eAAe,KAAK;AAAA,MACnF,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,sBAAsB;AAAA,QAC9B,SAAS,sBACL,oBAAoB,oBAClB,GAAG,UAAW,WAAW,cACzB,GAAG,UAAW,WAAW,KAAK,oBAAoB,MAAM,8CAC1D;AAAA,QACJ,aAAa,sBAAsB;AAAA,QACnC,SAAS;AAAA,UACP,aAAa,WAAW,eAAe;AAAA,UACvC,QAAQ,WAAW,UAAU;AAAA,UAC7B,mBAAmB,WAAW,qBAAqB;AAAA,UACnD,aAAa,OAAO,cAAc,eAAe,OAAO,WAAW,IAAI;AAAA,QACzE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,eAAe,OAAO,2BAA2B,OAAO;AACvE;AAEA,SAAS,kBAAkB,QAA8C;AACvE,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,kBAAkB,OAAO,WAAW,KAAK;AAC/C,QAAM,QAAQ,OAAO,gBAAgB;AACrC,QAAM,MAAM,OAAO,YAAY;AAC/B,QAAM,WAAW,OAAO,oBAAoB;AAC5C,QAAM,kBAAkB,gBAAgB,QAAQ;AAEhD,QAAM,WAAW,IAAI;AACrB,QAAM,aAAa,MAAM;AACzB,QAAM,iBAAiB,MAAM;AAC7B,QAAM,cACJ,QAAQ,UAAU,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,mBAAmB;AACpF,QAAM,YAAY,QAAQ,UAAU,WAAW,OAAO,CAAC,KAAM,eAAe,YAAY,WAAW,OAAO;AAE1G,QAAM,SAAwB;AAAA,IAC5BA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,YAAY,SAAS;AAAA,MAC7B,SAAS,YACL,WACE,qDACA,oCAAoC,kBAAkB,mBAAmB,WAAW,KACtF;AAAA,MACJ,aAAa,YACT,SACA;AAAA,MACJ,SAAS;AAAA,QACP,QAAQ,WAAW,QAAQ,aAAa,gBAAgB;AAAA,QACxD,aAAa,aAAa,cAAc,aAAa;AAAA,QACrD,WAAW,mBAAmB,kBAAkB;AAAA,QAChD,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,IACDA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QACE,CAAC,cAAc,CAAC,mBAAmB,CAAC,kBAAkB,mBAAmB,kBACrE,SACA;AAAA,MACN,SACE,CAAC,cAAc,CAAC,iBACZ,wCACA,CAAC,kBACC,2EACA,mBAAmB,kBACjB,+CACA,sBAAsB,cAAc,oBAAoB,eAAe;AAAA,MACjF,aACE,cAAc,mBAAmB,kBAAkB,mBAAmB,kBAClE,8FACA;AAAA,MACN,SAAS,EAAE,qBAAqB,mBAAmB,MAAM,gBAAgB,kBAAkB,KAAK;AAAA,IAClG,CAAC;AAAA,IACDA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MAAM,aAAa,QAAQ,QAAQ,IAAI,gBAAgB,KAAK,CAAC,IAAI,SAAS;AAAA,MAClF,SAAS,MAAM,aAAa,QAAQ,IAAI,iBACpC,8DACA;AAAA,MACJ,aAAa,MAAM,aAAa,QAAQ,IAAI,iBAAiB,SAAY;AAAA,MACzE,SAAS,EAAE,iBAAiB,iBAAiB,WAAW,MAAM,aAAa,QAAQ,QAAQ,IAAI,cAAc,EAAE;AAAA,IACjH,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,IAAI,gBAAgB,OAAO,0BAA0B,OAAO;AACvE;AAEA,SAAS,2BAA2B,QAA8C;AAChF,QAAM,YAAY,OAAO,cAAc,QAAQ;AAC/C,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAc;AAAA,IAClB,QAAQ,IAAI,cAAc,KAAK,KAAK,QAAQ,IAAI,UAAU,KAAK;AAAA,EACjE;AACA,QAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,KAAK,CAAC;AAE5D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,MACNA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,eAAe,SAAS;AAAA,QAChC,SAAS,eACL,4BAA4B,UAAU,UAAU,SAAS,+CACzD;AAAA,QACJ,aAAa,eACT,uIACA;AAAA,QACJ,SAAS,EAAE,MAAM,eAAe,UAAU,UAAU,OAAO,KAAK;AAAA,MAClE,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,cAAc,SAAS;AAAA,QAC/B,SAAS,cACL,2EACA;AAAA,QACJ,aAAa,cACT,SACA;AAAA,MACN,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,cAAc,SAAS;AAAA,QAC/B,SAAS,cACL,oEACA;AAAA,QACJ,aAAa,cACT,SACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,QAA8C;AACvE,QAAM,cAAc,OAAO,YAAY;AACvC,QAAM,UAAUC,OAAK,KAAK,aAAa,MAAM;AAC7C,QAAM,eAAeA,OAAK,KAAK,aAAa,WAAW;AACvD,QAAM,qBAAqB,eAAe,WAAW;AACrD,QAAM,iBAAiB,eAAe,OAAO;AAC7C,QAAM,sBAAsB,eAAe,YAAY;AACvD,QAAM,aAAa,OAAO,WAAW,OAAO;AAC5C,QAAM,kBAAkB,OAAO,WAAW,YAAY;AAEtD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,MACND,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS,EAAE,aAAa,mBAAmB;AAAA,MAC7C,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,cAAc,OAAO,aAAa,OAAO,IAAI,SAAS,aAAa,SAAS;AAAA,QACpF,SAAS,aACL,OAAO,aAAa,OAAO,IACzB,YAAY,cAAc,KAC1B,4BAA4B,cAAc,KAC5C,iCAAiC,cAAc;AAAA,QACnD,aACE,cAAc,CAAC,OAAO,aAAa,OAAO,IACtC,sBAAsB,cAAc,oDACpC;AAAA,QACN,SAAS,EAAE,SAAS,gBAAgB,QAAQ,YAAY,UAAU,OAAO,aAAa,OAAO,EAAE;AAAA,MACjG,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,mBAAmB,OAAO,aAAa,YAAY,IAAI,SAAS;AAAA,QACxE,SAAS,kBACL,OAAO,aAAa,YAAY,IAC9B,YAAY,mBAAmB,KAC/B,4BAA4B,mBAAmB,KACjD,oCAAoC,mBAAmB;AAAA,QAC3D,aACE,mBAAmB,CAAC,OAAO,aAAa,YAAY,IAChD,sBAAsB,mBAAmB,MACzC;AAAA,QACN,SAAS,EAAE,cAAc,qBAAqB,QAAQ,iBAAiB,UAAU,OAAO,aAAa,YAAY,EAAE;AAAA,MACrH,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,QAA8C;AACxE,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,MAAM,OAAO,YAAY;AAC/B,QAAM,UAAU,IAAI,gBAAgB,OAAO,YAAY,KAAK,KAAK,IAAI;AACrE,QAAM,kBAAkB,CAAC,IAAI,gBAAgB,CAAC,OAAO,cAAc,QAAQ,IAAI,uBAAuB;AAEtG,QAAM,eAAe,IAAI,sBAAsB,IAAI;AACnD,QAAM,YAAY,IAAI,yBAAyB,WAAW,OAAO;AACjE,QAAM,QAAQ,OAAO,gBAAgB;AACrC,QAAM,cAAc,MAAM,mBAAmB,WAAW,OAAO;AAE/D,QAAM,SAAwB;AAAA,IAC5BA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,UAAW,kBAAkB,SAAS,SAAU;AAAA,MACxD,SAAS,UACL,kBACE,6CAA6C,OAAO,MACpD,UACF;AAAA,MACJ,aAAa,UACT,kBACE,qGACA,SACF;AAAA,MACJ,SAAS;AAAA,QACP,QAAQ,IAAI,eACR,mBACA,OAAO,aACL,sBACA,IAAI,0BACF,gCACA;AAAA,QACR,SAAS,WAAW;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,IACDA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,aAAa,cAAc,SAAS,eAAe,SAAS;AAAA,MACpE,SAAS,YACL,2EACA,cACE,gDACA,eACE,0FACA;AAAA,MACR,aACE,aAAa,cACT,SACA;AAAA,MACN,SAAS;AAAA,QACP,MAAM,aAAa,cAAc,WAAW,eAAe,yBAAyB;AAAA,QACpF,4BAA4B,CAAC,0BAA0B,yBAAyB;AAAA,MAClF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,IAAI,iBAAiB,OAAO,0BAA0B,OAAO;AACxE;AAEA,SAAS,uBAAuB,QAA8C;AAC5E,QAAM,MAAM,OAAO,YAAY;AAC/B,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,QAAQ,OAAO,gBAAgB;AACrC,QAAM,cAAc,OAAO,YAAY;AACvC,QAAM,aAAa,OAAO,0BAA0B;AACpD,QAAM,qBAAqB,eAAe,WAAW;AACrD,QAAM,oBAAoB,eAAe,UAAU;AACnD,QAAM,yBAAyB,IAAI,kBAAkB,eAAe,IAAI,eAAe,IAAI;AAC3F,QAAM,sBAAsB,gBAAgB,cAAc,OAAO,WAAW,UAAU;AACtF,QAAM,kBAAkB,OAAO,WAAW,KAAK;AAC/C,QAAM,WAAW,IAAI;AACrB,QAAM,aAAa,MAAM;AACzB,QAAM,iBAAiB,MAAM;AAC7B,QAAM,cACJ,QAAQ,UAAU,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,mBAAmB;AACpF,QAAM,uBACJ,QAAQ,UAAU,WAAW,OAAO,CAAC,KACpC,eAAe,QAAQ,YAAY,WAAW,OAAO,CAAC;AAEzD,QAAM,SAAwB;AAAA,IAC5BA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,sBAAsB,SAAS;AAAA,MACvC,SAAS,sBACL,0BAA0B,iBAAiB,KAC3C,IAAI,kBACF,sCAAsC,sBAAsB,MAC5D,SAAS,kBAAkB;AAAA,MACjC,aAAa,sBACT,2GACA,IAAI,kBACF,uDACA;AAAA,MACN,SAAS,EAAE,aAAa,oBAAoB,YAAY,mBAAmB,iBAAiB,uBAAuB;AAAA,IACrH,CAAC;AAAA,IACDA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,IAAI,sBAAsB,IAAI,0BAA0B,SAAS;AAAA,MACzE,SACE,IAAI,sBAAsB,IAAI,0BAC1B;AAAA,QACE,IAAI,qBAAqB,6BAA6B;AAAA,QACtD,IAAI,0BAA0B,oCAAoC;AAAA,MACpE,EACG,OAAO,OAAO,EACd,KAAK,IAAI,IACZ;AAAA,MACN,aACE,IAAI,sBAAsB,IAAI,0BAC1B,mGACA;AAAA,IACR,CAAC;AAAA,IACD,+BAA+B,KAAK;AAAA,MAClC,WAAW,mBAAmB;AAAA,MAC9B,YAAY,OAAO,YAAY,KAAK,KAAK,IAAI,gBAAgB;AAAA,MAC7D;AAAA,MACA,6BACE,OAAO,gCAAgC,YACvC,OAAO,gCAAgC,iBACvC,OAAO,gCAAgC,kBACnC,OAAO,8BACP;AAAA,IACR,CAAC;AAAA,IACDA,OAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,QACP,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,IAAI,qBAAqB,OAAO,gCAAgC,OAAO;AAClF;AAEO,SAAS,+BACd,SAAgC,8BACH;AAC7B,QAAM,WAAW;AAAA,IACf,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,IACvB,kBAAkB,MAAM;AAAA,IACxB,2BAA2B,MAAM;AAAA,IACjC,kBAAkB,MAAM;AAAA,IACxB,mBAAmB,MAAM;AAAA,IACzB,uBAAuB,MAAM;AAAA,EAC/B;AAEA,QAAM,SAAS,gBAAgB,QAAQ;AACvC,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,UAAU,QACZ,OAAO,OAAO,IACZ,cAAc,OAAO,IAAI,6FACzB,iFACF,GAAG,OAAO,IAAI;AAElB,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AGteO,SAAS,4BAA4B,OAAyC,CAAC,GAAS;AAC7F,MAAI;AACJ,MAAI,KAAK,yBAAyB,MAAM;AACtC,UAAM,cAAc,kBAAkB;AACtC,QAAI,CAAC,YAAY,IAAI;AACnB,cAAQ,MAAM,YAAY,UAAU,gCAAgC;AACpE,UAAI,YAAY,YAAa,SAAQ,MAAM,YAAY,WAAW;AAClE,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,YAAY,YAAY;AAC1B,wBAAkB,iCAA4B,YAAY,UAAU,eAAe,SAAS;AAAA,IAC9F,OAAO;AACL,wBAAkB,kCAAkC,YAAY,UAAU,eAAe,SAAS;AAAA,IACpG;AAAA,EACF;AAEA,QAAM,SAAS,+BAA+B;AAC9C,MAAI,iBAAiB;AACnB,WAAO,QAAQ,CAAC,GAAI,OAAO,SAAS,CAAC,GAAI,eAAe;AAAA,EAC1D;AACA,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,MAAI,CAAC,OAAO,OAAO;AACjB,YAAQ,WAAW;AAAA,EACrB;AACF;;;AC3BA;AAEA,eAAsB,4BACpB,MACe;AACf,QAAM,SAAS,eAAe;AAC9B,QAAM,aACH,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI,OAAO,cAAc;AAClE,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,8DAA8D;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,OAAO,UAAU;AACnF,QAAM,SAAS,MAAM;AAAA,IACnB,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,IACpC;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AAEA,QAAM,KAAK,IAAI,gBAAgB;AAC/B,MAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,EAAG,IAAG,IAAI,SAAS,KAAK,MAAM,KAAK,CAAC;AAC1F,MAAI,KAAK,SAAS,QAAQ,OAAO,KAAK,KAAK,EAAE,KAAK,GAAG;AACnD,UAAM,IAAI,OAAO,KAAK,KAAK;AAC3B,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,IAAG,IAAI,SAAS,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,EACxE;AACA,QAAM,SAAS,GAAG,SAAS,IAAI,IAAI,GAAG,SAAS,CAAC,KAAK;AACrD,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,qCAAqC,MAAM;AAElH,QAAM,MAAM,MAAM,QAAQ,KAAK,MAAM;AACrC,MAAI,CAAC,IAAI,IAAI;AACX,YAAQ,MAAM,uCAAuC,IAAI,MAAM,EAAE;AACjE,QAAI,IAAI,SAAU,SAAQ,MAAM,KAAK,UAAU,IAAI,UAAU,MAAM,CAAC,CAAC;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,KAAK,UAAU,IAAI,UAAU,MAAM,CAAC,CAAC;AACnD;;;ACrCA;;;ACiCO,IAAM,qCAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,wBACd,MAAyB,QAAQ,KACJ;AAC7B,SAAO;AAAA,IACL,yBAAyB,IAAI,2BAA2B,KAAK,KAAK;AAAA,IAClE,qBACE,IAAI,wBAAwB,KAAK,KAAK,IAAI,0BAA0B,KAAK,KAAK;AAAA,IAChF,kBAAkB;AAAA,MAChB,IAAI,oBAAoB,KAAK,KAAK,IAAI,sBAAsB,KAAK;AAAA,IACnE;AAAA,IACA,uBACE,IAAI,2BAA2B,KAAK,KACpC,IAAI,6BAA6B,KAAK,KACtC;AAAA,IACF,uBAAuB,IAAI,0BAA0B,KAAK,KAAK;AAAA,IAC/D,oBAAoB,QAAQ,IAAI,sBAAsB,KAAK,CAAC;AAAA,IAC5D,yBAAyB,IAAI,6BAA6B,KAAK,KAAK;AAAA,EACtE;AACF;AAEO,SAAS,uBACd,QACA,MAAmC,wBAAwB,GACnC;AACxB,QAAM,WAAqB,CAAC;AAC5B,MAAI,IAAI,4BAA4B,iBAAiB;AACnD,aAAS,KAAK,0DAA0D;AAAA,EAC1E;AACA,MAAI,IAAI,uBAAuB,IAAI,4BAA4B,eAAe;AAC5E,aAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,yBAAyB,CAAC,IAAI,qBAAqB;AACzD,aAAS,KAAK,kFAAkF;AAAA,EAClG;AACA,MAAI,OAAO,gCAAgC,iBAAiB;AAC1D,aAAS,KAAK,0EAA0E;AAAA,EAC1F;AAEA,SAAO;AAAA,IACL,IAAI,SAAS,WAAW;AAAA,IACxB;AAAA,IACA,WAAW;AAAA,IACX,6BAA6B,OAAO,+BAA+B;AAAA,IACnE,iBAAiB,CAAC,GAAG,kCAAkC;AAAA,IACvD,aAAa,CAAC,GAAG,8BAA8B;AAAA,EACjD;AACF;AAEO,SAAS,iCACd,QACkB;AAClB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AACF;;;ADhGA;AACA,OAAOE,YAAU;AACjB,SAAS,WAAAC,iBAAe;AAExB,IAAMC,eAAcF,OAAK,KAAKC,UAAQ,GAAG,WAAW,aAAa;AAE1D,SAAS,4BAA4B,OAAO,OAAa;AAC9D,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,uBAAuB,MAAM;AAC5C,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,YAAY,gBAAgBC,YAAW;AAAA,IACvC,0BAA0B,EAAE,6BAA6B,SAAkB;AAAA,EAC7E;AAEA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,QAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AACnC;AAAA,EACF;AAEA,UAAQ,IAAI,gDAAgD;AAC5D,UAAQ,IAAI,sBAAsB;AAClC,aAAW,QAAQ,mCAAoC,SAAQ,IAAI,OAAO,IAAI,EAAE;AAChF,UAAQ,IAAI,gBAAgB;AAC5B,aAAW,QAAQ,+BAAgC,SAAQ,IAAI,OAAO,IAAI,EAAE;AAC5E,UAAQ,IAAI,cAAc;AAC1B,UAAQ,IAAI,aAAa,QAAQ,UAAU,EAAE;AAC7C,UAAQ;AAAA,IACN,kCAAkC,OAAO,+BAA+B,SAAS;AAAA,EACnF;AACA,UAAQ;AAAA,IACN,gCAAgC,OAAO,UAAU,2BAA2B,SAAS;AAAA,EACvF;AACA,UAAQ;AAAA,IACN,6BAA6B,OAAO,UAAU,uBAAuB,SAAS;AAAA,EAChF;AACA,UAAQ;AAAA,IACN,wCAAwC,OAAO,UAAU,yBAAyB,SAAS;AAAA,EAC7F;AACA,MAAI,OAAO,SAAS,QAAQ;AAC1B,YAAQ,IAAI,aAAa;AACzB,eAAW,KAAK,OAAO,SAAU,SAAQ,IAAI,OAAO,CAAC,EAAE;AACvD,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,UAAQ,IAAI,8CAA8C;AAC5D;AAEO,SAAS,6BAA6B,OAAO,OAAa;AAC/D,QAAM,WAAW,eAAe;AAChC,QAAM,SAAS,uBAAuB,QAAQ;AAC9C,MAAI,CAAC,OAAO,IAAI;AACd,UAAMC,WAAU;AAAA,MACd,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,UAAU,OAAO;AAAA,MACjB,aAAa;AAAA,IACf;AACA,QAAI,MAAM;AACR,cAAQ,IAAI,KAAK,UAAUA,UAAS,MAAM,CAAC,CAAC;AAAA,IAC9C,OAAO;AACL,cAAQ,MAAM,+DAA0D;AACxE,iBAAW,KAAK,OAAO,SAAU,SAAQ,MAAM,OAAO,CAAC,EAAE;AAAA,IAC3D;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,iCAAiC,QAAQ;AACtD,iBAAe,IAAI;AAEnB,QAAM,UAAU;AAAA,IACd,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,YAAY,gBAAgBD,YAAW;AAAA,IACvC,6BAA6B;AAAA,IAC7B,QAAQ,kBAAkB,IAAI;AAAA,IAC9B,MACE;AAAA,EAEJ;AAEA,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,EACF;AAEA,UAAQ,IAAI,QAAQ,IAAI;AACxB,UAAQ,IAAI,aAAa,QAAQ,UAAU,EAAE;AAC/C;;;AE1EA,eAAsB,4BACpB,MAAqB,qBAAqB,GACT;AACjC,QAAM,OAAO,MAAM,aAAa,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC;AAC7D,QAAM,QAAQ,MAAM,kBAAkB,IAAI,SAAS,EAAE,MAAM,OAAO,EAAE,SAAS,GAAY,MAAM,CAAC,EAAE,EAAE;AACpG,QAAM,mBAAmB,QAAQ,IAAI,eAAe,IAAI,MAAM;AAC9D,QAAM,gBAAgB,0BAA0B,GAAG;AAEnD,MAAI,UAA6C;AACjD,MAAI,cAAe,WAAU;AAAA,WACpB,QAAQ,IAAI,cAAc,KAAK,EAAG,WAAU;AAErD,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,MACH,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,aAAa,IAAI;AAAA,MACjB,aAAa,IAAI;AAAA,MACjB,iBAAiB,IAAI;AAAA,MACrB,mBAAmB,IAAI;AAAA,MACvB,YAAY,IAAI;AAAA,IAClB;AAAA,IACA,UAAU,KAAK;AAAA,IACf,eAAe,OAAO,KAAK,MAAM,IAAI,EAAE;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AACF;;;AChDA,eAAsB,iBAAiB,MAA8B;AACnE,QAAM,SAAS,MAAM,4BAA4B;AACjD,MAAI,MAAM;AACR,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ,IAAI,wBAAwB,OAAO,OAAO,EAAE;AACpD,UAAQ,IAAI,YAAY,OAAO,IAAI,SAAS,KAAK,OAAO,QAAQ,QAAQ;AACxE,UAAQ,IAAI,iBAAiB,OAAO,IAAI,SAAS,KAAK,OAAO,aAAa,WAAW;AACrF,UAAQ,IAAI,mBAAmB,OAAO,IAAI,WAAW,EAAE;AACvD,UAAQ,IAAI,oBAAoB,OAAO,IAAI,eAAe,SAAS,EAAE;AACrE,UAAQ,IAAI,wBAAwB,OAAO,gBAAgB,EAAE;AAC7D,UAAQ,IAAI,2BAA2B,OAAO,aAAa,EAAE;AAC/D;AAEA,eAAsB,eACpB,MACe;AACf,QAAM,YACJ,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACxD,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,iBAAiB,aAAa;AAAA,EAChC,CAAC;AACD,MAAI,KAAK,SAAS,MAAM;AACtB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ;AAAA,IACN,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,MACP,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;;;ACpCA;;;ACCA;AAQA;AACA;AAVA,SAAS,cAAAE,oBAAkB;;;ACA3B,SAAS,cAAAC,mBAAkB;AAIpB,SAAS,4BAA4B,MAA2B;AACrE,QAAM,OAAO,KAAK,UAAU;AAAA,IAC1B,IAAI,KAAK;AAAA,IACT,MAAM,KAAK,QAAQ;AAAA,IACnB,OAAO,KAAK,SAAS;AAAA,IACrB,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK,aAAa;AAAA,EAC/B,CAAC;AACD,QAAM,MAAMA,YAAW,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACrE,SAAO,WAAW,GAAG;AACvB;;;ACfA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;;;ACDjB,SAAS,cAAAC,cAAY,aAAAC,aAAW,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AAEV,IAAM,0BAA0BA,OAAK,KAAKD,UAAQ,GAAG,WAAW,MAAM;AAUtE,SAAS,aAAa,SAAsC;AACjE,QAAM,MAAM,oBAAI,IAAoB;AACpC,aAAW,QAAQ,QAAQ,MAAM,OAAO,GAAG;AACzC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,KAAK,QAAQ,QAAQ,GAAG;AAC9B,QAAI,MAAM,EAAG;AACb,UAAM,MAAM,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AACtC,QAAI,QAAQ,QAAQ,MAAM,KAAK,CAAC,EAAE,KAAK;AACvC,QACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,QAAI,IAAI,KAAK,KAAK;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,iBACd,QACA,SAAS,yFACD;AACR,QAAM,QAAQ,CAAC,OAAO,QAAQ,GAAG,EAAE;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG;AACvF,UAAM,UACJ,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,IAC5D,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC,MACrD;AACN,UAAM,KAAK,GAAG,GAAG,IAAI,OAAO,EAAE;AAAA,EAChC;AACA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,YAAY,WAAW,yBAA8C;AACnF,MAAI,CAACJ,aAAW,QAAQ,EAAG,QAAO,oBAAI,IAAI;AAC1C,SAAO,aAAaE,eAAa,UAAU,MAAM,CAAC;AACpD;AAEO,SAAS,aACd,SACA,UAAwD,CAAC,GACrC;AACpB,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAWF,aAAW,QAAQ,IAAIE,eAAa,UAAU,MAAM,IAAI;AACzE,QAAM,MAAM,aAAa,QAAQ;AACjC,QAAM,cAAwB,CAAC;AAC/B,QAAM,cAAwB,CAAC;AAE/B,aAAW,OAAO,QAAQ,cAAc,CAAC,GAAG;AAC1C,QAAI,IAAI,OAAO,GAAG,EAAG,aAAY,KAAK,GAAG;AAAA,EAC3C;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,OAAW;AACzB,UAAM,OAAO,IAAI,IAAI,GAAG;AACxB,QAAI,IAAI,KAAK,KAAK;AAClB,QAAI,SAAS,MAAO,aAAY,KAAK,GAAG;AAAA,EAC1C;AAEA,QAAM,UAAU,aAAa,QAAQ;AACrC,MAAI,UAAU,QAAQ,SAAS,IAAI;AACnC,MAAI,CAAC,SAAS;AACZ,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK;AAC9B,UAAI,QAAQ,IAAI,GAAG,MAAM,OAAO;AAC9B,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc,iBAAiB,GAAG;AACxC,MAAI,SAAS;AACX,IAAAD,YAAUI,OAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,IAAAF,eAAc,UAAU,aAAa,EAAE,MAAM,IAAM,CAAC;AAAA,EACtD;AAEA,SAAO,EAAE,MAAM,UAAU,SAAS,aAAa,YAAY;AAC7D;;;ADvFO,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAE9B,IAAM,mCAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA+BO,SAAS,qBAAqB,OAA8C;AACjF,QAAM,YAAY,MAAM,WAAW,KAAK,KAAK,2BAA2B;AACxE,QAAM,cAAc,MAAM,aAAa,KAAK,KAAK;AACjD,QAAM,aAAaG,OAAK,KAAKC,UAAQ,GAAG,WAAW,aAAa;AAChE,QAAM,eAAe,uBAAuB,MAAM,SAAS;AAE3D,QAAM,gBAA0B,CAAC;AACjC,MAAI,CAAC,MAAM,YAAY,KAAK,EAAG,eAAc,KAAK,4DAAkD;AACpG,MAAI,CAAC,MAAM,WAAW,KAAK,EAAG,eAAc,KAAK,0DAAgD;AAEjG,QAAM,aAAqC;AAAA,IACzC,gBAAgB,MAAM;AAAA,IACtB,oBAAoB,MAAM;AAAA,IAC1B,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,EAC5B;AAEA,QAAM,cAAc,CAAC,4BAA4B,wBAAwB,6BAA6B;AAEtG,QAAM,gBAA2C;AAAA,IAC/C,6BAA6B;AAAA,IAC7B,YAAY,MAAM;AAAA,IAClB,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,qBAAqB,EAAE,oBAAoB,MAAM,mBAAmB,IAAI,CAAC;AAAA,EACrF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,kBAAkB,QAAQ,aAAa;AAAA,IACvC,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AE5EA,eAAe,SACb,KACA,QACA,OAAoB,CAAC,GACF;AACnB,SAAO,MAAM,KAAK;AAAA,IAChB,GAAG;AAAA,IACH,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,MAC/B,GAAI,KAAK;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,kBACpB,SACA,WACA,QACA,QAAgC,CAAC,GACL;AAC5B,QAAM,KAAK,IAAI,gBAAgB,KAAK;AACpC,QAAM,MAAM,GAAG,OAAO,uBAAuB,mBAAmB,SAAS,CAAC,mBAAmB,EAAE;AAC/F,QAAM,MAAM,MAAM,SAAS,KAAK,MAAM;AACtC,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,SAA+D;AACnE,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI;AAAA,MACR,+BAA+B,IAAI,MAAM,MAAM,QAAQ,SAAS,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,IACpF;AAAA,EACF;AACA,SAAO,QAAQ,SAAS,CAAC;AAC3B;AAEA,eAAsB,6BACpB,SACA,WACA,QACA,MACA,UAA+C,CAAC,GAO/C;AACD,QAAM,MAAM,GAAG,OAAO,uBAAuB,mBAAmB,SAAS,CAAC;AAC1E,QAAM,OAA+B,CAAC;AACtC,MAAI,KAAM,MAAK,OAAO;AACtB,MAAI,QAAQ,gBAAiB,MAAK,kBAAkB,QAAQ;AAC5D,QAAM,MAAM,MAAM,SAAS,KAAK,QAAQ;AAAA,IACtC,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,SAOO;AACX,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,aAAS;AAAA,EACX;AACA,MAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK;AAC3B,UAAM,IAAI;AAAA,MACR,2BAA2B,IAAI,MAAM,MAAM,QAAQ,SAAS,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,OAAO,OAAO,SAAS,uBAAuB,SAAS;AAAA,IACvD,WAAW,OAAO,aAAa;AAAA,IAC/B,eAAe,OAAO,iBAAiB,QAAQ;AAAA,IAC/C,kBAAkB,OAAO,oBAAoB,OAAO,IAAI,YAAY;AAAA,EACtE;AACF;AAEA,eAAsB,mBACpB,SACA,WACA,OACA,QACe;AACf,QAAM,MAAM,GAAG,OAAO,uBAAuB,mBAAmB,SAAS,CAAC,mBAAmB,mBAAmB,KAAK,CAAC;AACtH,QAAM,MAAM,MAAM,SAAS,KAAK,QAAQ,EAAE,QAAQ,QAAQ,MAAM,KAAK,CAAC;AACtE,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,IAAI,MAAM,cAAc,KAAK,YAAY,IAAI,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACrF;AACF;AAEO,SAAS,sBACd,WACA,MACA,YAAY,qBACC;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc;AAAA,IACd;AAAA,IACA,cAAc,uBAAuB,SAAS;AAAA,IAC9C,SAAS,EAAE,QAAQ,8BAA8B,UAAU;AAAA,IAC3D,QAAQ,EAAE,UAAU;AAAA,IACpB,aAAa;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,MAA4C;AACtF,SAAO,KAAK;AAAA,IACV,CAAC,QACC,IAAI,SAAS,cACb,IAAI,cAAc,uBAClB,IAAI,aAAa,YACjB,IAAI,WAAW;AAAA,EACnB;AACF;AAEO,SAAS,uBAAuB,MAAsD;AAC3F,SAAO,KAAK;AAAA,IACV,CAAC,QACC,IAAI,SAAS,cACb,IAAI,cAAc,uBAClB,IAAI,aAAa,iBACjB,IAAI,WAAW;AAAA,EACnB;AACF;AAEO,SAAS,iCAAiC,MAG/C;AACA,MAAI,uBAAuB,IAAI,EAAG,QAAO,EAAE,SAAS,KAAK;AACzD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QACE;AAAA,EAGJ;AACF;;;ACnKA,SAAS,eAAAC,oBAAmB;AAIrB,SAAS,qBAA6B;AAC3C,SAAOC,aAAY,EAAE,EAAE,SAAS,WAAW;AAC7C;AAEO,SAAS,4BACd,cAAc,yBACoE;AAClF,QAAM,cAAc,wBAAwB;AAC5C,MAAI,aAAa;AACf,WAAO,EAAE,QAAQ,aAAa,WAAW,OAAO,QAAQ,MAAM;AAAA,EAChE;AAEA,QAAM,OAAO,YAAY,WAAW;AACpC,QAAM,WAAW,KAAK,IAAI,oBAAoB,GAAG,KAAK;AACtD,MAAI,UAAU;AACZ,WAAO,EAAE,QAAQ,UAAU,WAAW,OAAO,QAAQ,WAAW;AAAA,EAClE;AAEA,SAAO,EAAE,QAAQ,mBAAmB,GAAG,WAAW,MAAM,QAAQ,YAAY;AAC9E;;;ACvBA,SAAS,cAAAC,cAAY,aAAAC,aAAW,iBAAAC,sBAAqB;AACrD,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAU;AACjB,SAAS,aAAAC,mBAAiB;AAGnB,IAAM,0BAA0B;AAShC,SAAS,4BAAoC;AAClD,SAAOC,OAAK,KAAKC,UAAQ,GAAG,WAAW,WAAW,MAAM;AAC1D;AAEO,SAAS,8BAA8B,OAA0C;AACtF,QAAM,YAAY,MAAM,WAAW,KAAK,KAAK;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,MAAM,WAAW;AAAA,IACpC,aAAa,SAAS,iBAAiB,MAAM,KAAK,kBAAkB,MAAM,SAAS;AAAA,IACnF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAWO,SAAS,yBACd,OACA,SACsB;AACtB,MAAI,CAAC,sBAAsB,GAAG;AAC5B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MACE,QAAQ,aAAa,UACjB,iHACA;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,0BAA0B;AAC1C,QAAM,WAAWD,OAAK,KAAK,SAAS,uBAAuB;AAC3D,QAAM,UAAU,8BAA8B,KAAK;AAEnD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AAEA,EAAAE,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,QAAM,UAAUC,aAAW,QAAQ;AACnC,EAAAC,eAAc,UAAU,SAAS,MAAM;AAEvC,QAAM,SAASC,YAAU,aAAa,CAAC,UAAU,eAAe,GAAG,EAAE,UAAU,OAAO,CAAC;AACvF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM,SAAS,QAAQ,+CAA+C,OAAO,UAAU,OAAO,MAAM;AAAA,IACtG;AAAA,EACF;AAEA,QAAM,SAASA,YAAU,aAAa,CAAC,UAAU,UAAU,SAAS,uBAAuB,GAAG;AAAA,IAC5F,UAAU;AAAA,EACZ,CAAC;AAED,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA,SAAS,CAAC,WAAW;AAAA,IACrB,SAAS,OAAO,WAAW;AAAA,IAC3B,SAAS,OAAO,WAAW;AAAA,IAC3B,MACE,OAAO,WAAW,IACd,uBAAuB,uBAAuB,KAC9C,SAAS,QAAQ,uBAAuB,OAAO,UAAU,OAAO,MAAM;AAAA,EAC9E;AACF;;;AChHA,SAAS,cAAAC,oBAAkB;AAoB3B,eAAsB,kBAAkB,OAGH;AACnC,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,SAA4B,CAAC;AACnC,QAAM,MAAM,qBAAqB;AACjC,QAAM,SAAS,MAAM,4BAA4B,GAAG;AACpD,QAAM,UAAU,YAAY,WAAW;AAEvC,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,QAAQ,MAAM,OAAO,WAAW,KAAK,CAAC;AAAA,IAC1C,SAAS,MAAM,OAAO,YAClB,yBAAyB,MAAM,OAAO,SAAS,MAC/C;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,QAAQ,MAAM,OAAO,YAAY,KAAK,KAAK,IAAI,WAAW;AAAA,IAC9D,SAAS,IAAI,cACT,2BAA2B,IAAI,WAAW,MAC1C;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,MAAM,OAAO,gCAAgC;AAAA,IACjD,SAAS,+BAA+B,MAAM,OAAO,+BAA+B,SAAS;AAAA,IAC7F,aAAa;AAAA,EACf,CAAC;AAED,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,QAAQ,IAAI,MAAM;AAAA,IACtB,SAAS,IAAI,SAAS,+BAA+B;AAAA,IACrD,aAAa;AAAA,EACf,CAAC;AAED,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAIC,aAAW,WAAW,KAAK,QAAQ,QAAQ,IAAI,oBAAoB,CAAC;AAAA,IACxE,SAASA,aAAW,WAAW,IAC3B,2BAA2B,QAAQ,IAAI,WACvC;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAIA,aAAW,IAAI,SAAS;AAAA,IAC5B,SAASA,aAAW,IAAI,SAAS,IAC7B,uBAAuB,IAAI,SAAS,MACpC,uBAAuB,IAAI,SAAS;AAAA,IACxC,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,MAAM,aAAa,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC;AAC7D,QAAM,WAAW,KAAK,KAAK,CAAC,MAAM,EAAE,KAAK,cAAc,mBAAmB;AAC1E,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,QAAQ,QAAQ;AAAA,IACpB,SAAS,WACL,kCAAkC,SAAS,kBAAkB,MAC7D;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,OAAO;AAAA,IACX,SAAS,OAAO,gBACZ,wDACA,gBAAgB,OAAO,OAAO,iBAAiB,OAAO,IAAI,WAAW;AAAA,IACzE,aACE;AAAA,EACJ,CAAC;AAED,QAAM,iBACJ,QAAQ,IAAI,0BAA0B,KACtC,QAAQ,IAAI,sBAAsB,KAClC,QAAQ,IAAI,6BAA6B;AAC3C,SAAO,KAAK;AAAA,IACV,IAAI;AAAA,IACJ,IAAI,CAAC;AAAA,IACL,SAAS,iBACL,gEACA;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,KAAK,OAAO,MAAM,CAAC,MAAM,EAAE,EAAE;AACnC,SAAO,EAAE,IAAI,OAAO;AACtB;;;APxFA;AAuCA,SAAS,mBAAmB,QAA0B,UAAkC;AACtF,MAAI,UAAU,KAAK,EAAG,QAAO,SAAS,KAAK;AAC3C,MAAI,OAAO,oBAAoB,KAAK,EAAG,QAAO,OAAO,mBAAmB,KAAK;AAC7E,QAAM,UAAU,SAAS,EAAE;AAC3B,MAAI,CAACC,aAAW,OAAO,EAAG,QAAO;AACjC,QAAM,OAAO,eAAe,EAAE;AAAA,IAC5B,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,SAAS,IAAI,KAAK,MAAM,EAAE,SAAS;AAAA,EAC5D;AACA,SAAO,KAAK,CAAC,GAAG,MAAM;AACxB;AAEA,eAAsB,eAAe,OAA2B,CAAC,GAA+B;AAC9F,QAAM,UAAU,KAAK,YAAY;AACjC,QAAM,WAAW,eAAe;AAChC,QAAM,aAAa;AAAA,IACjB,KAAK,YAAY,KAAK,KACpB,SAAS,YAAY,KAAK,KAC1B,QAAQ,IAAI,gBAAgB,KAAK,KACjC;AAAA,EACJ;AACA,QAAM,YACJ,KAAK,WAAW,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,QAAQ,IAAI,oBAAoB,KAAK,KAAK;AAEpG,QAAM,mBAAmB,4BAA4B;AACrD,QAAM,OAAO,qBAAqB;AAAA,IAChC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,YAAY,iBAAiB;AAAA,IAC7B,oBAAoB,KAAK,OAAO,KAAK,KAAK,SAAS;AAAA,IACnD,gBAAgB,KAAK,mBAAmB;AAAA,EAC1C,CAAC;AAED,QAAM,WAAW,CAAC,GAAG,KAAK,aAAa;AACvC,QAAM,SAA4B;AAAA,IAChC,IAAI;AAAA,IACJ,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,iBAAiB,iBAAiB;AAAA,IAClC,YAAY,gBAAgB,KAAK,UAAU;AAAA,IAC3C,kBAAkB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,SAAS,OAAQ,QAAO;AAE5B,MAAI,SAAS;AACX,UAAM,WAAW,aAAa,KAAK,YAAY;AAAA,MAC7C,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,IACnB,CAAC;AACD,WAAO,UAAU;AAAA,MACf,MAAM,gBAAgB,SAAS,IAAI;AAAA,MACnC,SAAS,SAAS;AAAA,MAClB,aAAa,SAAS;AAAA,IACxB;AAEA,UAAM,aAA+B,EAAE,GAAG,UAAU,GAAG,KAAK,cAAc;AAC1E,UAAM,QAAQ,mBAAmB,YAAY,KAAK,KAAK;AACvD,QAAI,MAAO,YAAW,qBAAqB;AAC3C,mBAAe,UAAU;AAEzB,YAAQ,IAAI,iBAAiB;AAC7B,YAAQ,IAAI,qBAAqB,iBAAiB;AAClD,YAAQ,IAAI,yBAAyB,KAAK;AAC1C,YAAQ,IAAI,2BAA2B;AAEvC,UAAM,YAAY,MAAM,2BAA2B,KAAK,SAAS;AACjE,WAAO,mBAAmB,UAAU,WAAWA,aAAW,KAAK,SAAS;AAExE,UAAM,SAAS,WAAW;AAC1B,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,QAAQ,MAAM,sBAAsB,WAAW,EAAE,SAAS,YAAY,OAAO,CAAC;AACpF,wBAAgB,WAAW,KAAK;AAAA,MAClC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,UAAI,CAAC,QAAQ;AACX,eAAO,WAAW,EAAE,OAAO,yDAAyD;AACpF,iBAAS,KAAK,gFAAsE;AAAA,MACtF,OAAO;AACL,YAAI;AACF,gBAAM,SAAS,MAAM,6BAA6B,YAAY,WAAW,QAAQ,QAAW;AAAA,YAC1F,iBAAiB;AAAA,UACnB,CAAC;AACD,gBAAM,OAAO,sBAAsB,WAAW,OAAO,eAAe,OAAO,SAAS;AACpF,gBAAM,QAA2B;AAAA,YAC/B,oBAAoB,4BAA4B,IAAI;AAAA,YACpD;AAAA,YACA,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,YACrC,QAAQ;AAAA,UACV;AACA,gBAAM,YAAY,OAAO,KAAK,SAAS;AACvC,iBAAO,WAAW;AAAA,YAChB,aAAa,OAAO,IAAI;AAAA,YACxB,UAAU,OAAO,oBAAoB,OAAO,IAAI;AAAA,YAChD,yBAAyB,MAAM;AAAA,UACjC;AAEA,gBAAM,UAAU,MAAM,kBAAkB,YAAY,WAAW,MAAM;AACrE,gBAAM,YAAY,4BAA4B,OAAO;AACrD,gBAAM,cAAc;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,gBAAM,UAAoB,CAAC;AAC3B,cAAI,UAAU,QAAQ;AACpB,gBAAI,KAAK,sBAAsB;AAC7B,oBAAM,cAAc,iCAAiC,OAAO;AAC5D,kBAAI,CAAC,YAAY,SAAS;AACxB,yBAAS,KAAK,YAAY,MAAO;AAAA,cACnC,OAAO;AACL,2BAAW,OAAO,WAAW;AAC3B,wBAAM,mBAAmB,YAAY,WAAW,IAAI,IAAI,MAAM;AAC9D,0BAAQ,KAAK,IAAI,EAAE;AAAA,gBACrB;AAAA,cACF;AAAA,YACF,OAAO;AACL,uBAAS;AAAA,gBACP,GAAG,UAAU,MAAM;AAAA,cAGrB;AAAA,YACF;AAAA,UACF;AACA,iBAAO,iBAAiB;AAAA,YACtB,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,UAAU,QAAQ,EAAE,OAAO,EAAE;AAAA,YAClF;AAAA,YACA;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,iBAAO,WAAW,EAAE,OAAQ,IAAc,QAAQ;AAClD,mBAAS,KAAK,iCAAkC,IAAc,OAAO,EAAE;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,gBAAgB;AACvB,YAAMC,SAAQ,mBAAmB,EAAE,GAAG,UAAU,GAAG,KAAK,cAAc,GAAG,KAAK,KAAK;AACnF,UAAI,CAACA,QAAO;AACV,eAAO,UAAU;AAAA,UACf,WAAW,KAAK;AAAA,UAChB,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AACA,iBAAS,KAAK,gEAA2D;AAAA,MAC3E,OAAO;AACL,YAAI;AACF,kBAAQA,MAAK;AAAA,QACf,QAAQ;AACN,mBAAS,KAAK,eAAeA,MAAK,YAAY;AAAA,QAChD;AACA,eAAO,UAAU;AAAA,UACf,EAAE,aAAa,KAAK,aAAa,WAAW,OAAOA,OAAO;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,gBAAgB,SAAS,WAAW,GAAG;AAC/C,YAAM,OAAO,MAAM,kBAAkB,EAAE,iBAAiB,UAAU,CAAC;AACnE,aAAO,WAAW,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAC3D,UAAI,KAAK,SAAS,GAAG;AACnB,iBAAS,KAAK,sBAAsB,KAAK,MAAM,0DAAqD;AAAA,MACtG;AAAA,IACF,WAAW,KAAK,cAAc;AAC5B,aAAO,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,KAAK;AAAA,IACzD;AAEA,WAAO,SAAS,MAAM,kBAAkB;AAAA,MACtC,QAAQ,eAAe;AAAA,MACvB,aAAa,KAAK;AAAA,IACpB,CAAC;AACD,WAAO,WAAW;AAClB,WAAO,KAAK,SAAS,WAAW,MAAM,OAAO,QAAQ,MAAM;AAAA,EAC7D,OAAO;AACL,WAAO,KAAK,SAAS,WAAW;AAAA,EAClC;AAEA,SAAO;AACT;;;AD5PA,SAAS,aAAa,OAAqC,cAAgC;AACzF,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,MAAO,QAAO;AAC5B,QAAM,IAAI,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY;AAC3C,MAAI,MAAM,OAAO,MAAM,WAAW,MAAM,QAAQ,MAAM,MAAO,QAAO;AACpE,MAAI,MAAM,OAAO,MAAM,UAAU,MAAM,SAAS,MAAM,KAAM,QAAO;AACnE,SAAO;AACT;AAEA,eAAsB,kBAAkB,MAAuD;AAC7F,QAAM,SAAS,KAAK,WAAW,QAAQ,KAAK,SAAS,MAAM;AAC3D,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,SAAS,SAAS,QAAQ,aAAa,KAAK,SAAS,IAAI;AAAA,IACzD,MAAM,KAAK,SAAS;AAAA,IACpB,gBAAgB,KAAK,mBAAmB,QAAQ,KAAK,iBAAiB,MAAM;AAAA,IAC5E,sBACE,KAAK,yBAAyB,QAAQ,KAAK,wBAAwB,MAAM;AAAA,IAC3E,cAAc,KAAK,iBAAiB,QAAQ,KAAK,eAAe,MAAM;AAAA,IACtE,cAAc,KAAK,iBAAiB,QAAQ,KAAK,gBAAgB,MAAM;AAAA,IACvE,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,IACjE,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IACpE,OAAO,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,EACnD,CAAC;AAED,MAAI,KAAK,SAAS,MAAM;AACtB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,QAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AACnC;AAAA,EACF;AAEA,UAAQ,IAAI,OAAO,SAAS,oCAAoC,uBAAuB;AACvF,UAAQ,IAAI,aAAa,OAAO,UAAU,EAAE;AAC5C,UAAQ,IAAI,eAAe,OAAO,KAAK,WAAW,EAAE;AACpD,UAAQ,IAAI,YAAY,OAAO,KAAK,SAAS,EAAE;AAC/C,MAAI,OAAO,gBAAiB,SAAQ,IAAI,oCAAoC;AAC5E,MAAI,OAAO,SAAS;AAClB,YAAQ;AAAA,MACN,gBAAgB,OAAO,QAAQ,UAAU,YAAY,WAAW,KAAK,OAAO,QAAQ,YAAY,KAAK,IAAI,KAAK,gBAAgB;AAAA,IAChI;AAAA,EACF;AACA,MAAI,OAAO,UAAU,aAAa;AAChC,YAAQ;AAAA,MACN,mBAAmB,OAAO,SAAS,WAAW,aAAa,OAAO,SAAS,QAAQ,UAAU,OAAO,SAAS,uBAAuB;AAAA,IACtI;AAAA,EACF,WAAW,OAAO,UAAU,OAAO;AACjC,YAAQ,IAAI,qBAAqB,OAAO,SAAS,KAAK,EAAE;AAAA,EAC1D;AACA,MAAI,OAAO,gBAAgB,MAAM,QAAQ;AACvC,YAAQ,IAAI,gCAAgC,OAAO,eAAe,MAAM,MAAM,EAAE;AAChF,eAAW,KAAK,OAAO,eAAe,OAAO;AAC3C,cAAQ,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG;AAAA,IAC3C;AACA,QAAI,OAAO,eAAe,QAAQ,QAAQ;AACxC,cAAQ,IAAI,cAAc,OAAO,eAAe,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACtE;AAAA,EACF;AACA,MAAI,OAAO,SAAS;AAClB,YAAQ,IAAI,cAAc,OAAO,QAAQ,SAAS,OAAO,QAAQ,UAAU,YAAY,cAAc,EAAE;AAAA,EACzG;AACA,MAAI,OAAO,YAAY,CAAC,OAAO,SAAS,SAAS;AAC/C,YAAQ,IAAI,sBAAsB,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,MAAM,EAAE;AAAA,EAC5F;AACA,UAAQ,IAAI,+BAA+B;AAC3C,aAAW,QAAQ,OAAO,KAAK,gBAAiB,SAAQ,IAAI,OAAO,IAAI,EAAE;AACzE,MAAI,OAAO,SAAS,QAAQ;AAC1B,YAAQ,IAAI,aAAa;AACzB,eAAW,KAAK,OAAO,SAAU,SAAQ,IAAI,OAAO,CAAC,EAAE;AACvD,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,UAAQ,IAAI,iEAA4D;AAC1E;AAEA,eAAsB,iBAAiB,MAAuD;AAC5F,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,MAAM,kBAAkB,EAAE,OAAO,CAAC;AACjD,MAAI,KAAK,SAAS,MAAM;AACtB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,QAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AACnC;AAAA,EACF;AACA,UAAQ,IAAI,uBAAuB,OAAO,KAAK,SAAS,MAAM;AAAA,CAAI;AAClE,aAAWC,UAAS,OAAO,QAAQ;AACjC,UAAM,OAAOA,OAAM,KAAK,OAAO;AAC/B,YAAQ,IAAI,MAAM,IAAI,KAAKA,OAAM,EAAE,KAAKA,OAAM,OAAO,EAAE;AACvD,QAAI,CAACA,OAAM,MAAMA,OAAM,YAAa,SAAQ,IAAI,mBAAcA,OAAM,WAAW,EAAE;AAAA,EACnF;AACA,MAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AACrC;;;AS5FA;AADA,OAAOC,UAAQ;AAIf;AACA;AACA;AACA;;;ACLO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB,CAAC,kBAAkB;AACrC;;;ACRA,SAAS,aAAAC,mBAAiB;AAC1B,OAAOC,YAAU;AAmBV,SAAS,kBACd,UACA,UACA,SAC+B;AAC/B,QAAM,SAASC,OAAK,KAAK,UAAU,6BAA6B,UAAU;AAC1E,QAAM,OAAO,CAAC,QAAQ,OAAO,QAAQ,GAAG,GAAG,6BAA6B,cAAc;AACtF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,QAAQ,EAAE,MAAM,WAAW,UAAU,QAAQ,UAAU;AAAA,MACvD,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ,iBAAiB,KAAK,KAAK,GAAG,CAAC;AAAA,MACvC,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,SAASC,YAAU,QAAQ,MAAM;AAAA,IACrC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,SAAS,KAAK,KAAK;AAAA,EACrB,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,EAAE,MAAM,WAAW,UAAU,QAAQ,0BAA0B;AAAA,IACvE,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO,UAAU;AAAA,IACzB,QAAQ,OAAO,UAAU;AAAA,EAC3B;AACF;AAEO,SAAS,iCAAiC,MAAgD;AAC/F,QAAM,WAAW,KAAK,WAAW,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI;AAChE,MAAI,SAAU,QAAOD,OAAK,QAAQ,QAAQ;AAC1C,QAAM,WAAW,mBAAmB;AACpC,SAAO,UAAU,QAAQ,QAAQ,IAAI;AACvC;;;AFhCA,eAAsB,6BACpB,MACsC;AACtC,QAAM,YAAY,OAAO,SAAS,OAAO,KAAK,aAAa,EAAE,GAAG,eAAe,CAAC;AAChF,QAAM,WAAW,OAAO,KAAK,QAAQ,6BAA6B,WAAW,EAAE,KAAK;AACpF,QAAM,QAAQ,KAAK,UAAU,QAAQ,KAAK,UAAU;AACpD,QAAM,UAAU,KAAK,YAAY,QAAQ,KAAK,YAAY;AAC1D,QAAM,QAAQ,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAE5C,QAAM,eAAe,0BAA0B;AAAA,IAC7C,OAAO,SAAS;AAAA,EAClB,CAAC;AACD,QAAM,cAAc;AAAA,IAClB,GAAG,iCAAiC,cAAc;AAAA,MAChD,cAAc;AAAA,MACd,SAAS,yBAAyB,eAAe,CAAC;AAAA,MAClD,WAAWE,KAAG,SAAS;AAAA,IACzB,CAAC;AAAA,IACD,iBAAiB,aAAa;AAAA,IAC9B,qBAAqB,aAAa;AAAA,IAClC,sBAAsB,aAAa;AAAA,IACnC,sBAAsB,aAAa,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,uBAAuB;AAAA,IAC5F,mBAAmB,aAAa;AAAA,EAClC;AAEA,QAAM,OAAO,eAAe,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI,MAAS;AAC3E,QAAM,SAAS,MAAM;AAAA,IACnB,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,IACpC;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AACA,QAAM,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAEvE,QAAM,MAAM,MAAM,SAAS,KAAK,QAAQ;AAAA,IACtC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,IAAI;AACxB,QAAM,gBAA8D,CAAC;AACrE,QAAM,WAAW,iCAAiC,IAAI;AAEtD,QAAM,UAAU,MAAM,QAAS,aAA4C,YAAY,IACjF,YAEC,eACH,CAAC;AAEL,QAAM,cAAc,YAAY;AAEhC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS,aAAa,OAAO,OAAO,aAAa,UAAU;AACpE,YAAM,UAAU,kBAAkB,OAAO,UAAU,UAAU,OAAO;AACpE,oBAAc,KAAK;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,MACpB,CAAC;AACD,UAAI,WAAW,QAAQ,UAAU;AAC/B,cAAM,SAAS,QAAQ,aAAa;AACpC,cAAM,QACJ,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,IAClD,OAAO,MAAM,KAAK,IAClB,sBAAsB,QAAQ,SAAS,OAAO,QAAQ;AAC5D,YAAI;AACF,gBAAM;AAAA,YACJ,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAAA,YAC3D;AAAA,YACA,EAAE,MAAM,UAAU,OAAO,aAAa,OAAO;AAAA,UAC/C;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AACA;AAAA,IACF;AACA,kBAAc,KAAK;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AGlHA,eAAsB,eACpB,MACA,cACe;AACf,QAAM,OAAO,OAAO,gBAAgB,KAAK,QAAQ,EAAE,EAAE,KAAK;AAC1D,MAAI,SAAS,sBAAsB;AACjC,YAAQ,MAAM,iBAAiB,QAAQ,QAAQ,EAAE;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,6BAA6B,IAAI;AACtD,MAAI,KAAK,SAAS,QAAQ,KAAK,SAAS,QAAQ;AAC9C,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,MACA,QAAQ,OAAO,IAAI;AAAA,MACnB,SAAS,OAAO,KAAK;AAAA,MACrB,WAAW,OAAO,OAAO;AAAA,MACzB,iBAAiB,OAAO,cAAc,MAAM;AAAA,IAC9C,EAAE,KAAK,GAAG;AAAA,EACZ;AACA,aAAW,OAAO,OAAO,eAAe;AACtC,YAAQ,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,YAAY,GAAG,aAAa,IAAI,QAAQ,EAAE;AAAA,EAC9F;AACF;;;AtFiCA,SAAS,WAAW,KAAsB;AACxC,SAAO,QAAQ,UAAU,QAAQ,YAAY,QAAQ;AACvD;AAEA,SAAS,eAAe,OAAgB,QAAwB;AAC9D,QAAM,MAAM,CAAC,OAAO,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpD,UAAQ,MAAM,oBAAoB,OAAO,QAAQ,EAAE;AACnD,QAAM,CAAC;AACT;AAEO,SAAS,MAAM,OAAO,GAAU;AACrC,QAAM,MAAM,SAAS,IAAI,QAAQ,MAAM,QAAQ;AAC/C;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACA,UAAQ,KAAK,IAAI;AACnB;AAEA,eAAsB,KAAK,OAAO,QAAQ,KAAK,MAAM,CAAC,GAAkB;AACtE,MAAI,qBAAqB,MAAM,YAAY,KAAK,QAAQ,EAAG;AAC3D,MAAI,KAAK,WAAW,KAAK,WAAW,KAAK,CAAC,CAAE,EAAG,QAAO,MAAM,CAAC;AAE7D,QAAM,QAAQ,KAAK,MAAM;AACzB,MAAI;AACJ,MAAI;AAEJ,MACE,UAAU,SACV,UAAU,YACV,UAAU,UACV,UAAU,YACV,UAAU,aACV,UAAU,aACV,UAAU,YACV,UAAU,YACV,UAAU,eACV,UAAU,UACV,UAAU,UACV,UAAU,SACV;AACA,aAAS,KAAK,MAAM;AACpB,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AAEA,MAAK,UAAU,WAAW,MAAM,KAAM,KAAK,KAAK,UAAU,EAAG,QAAO,MAAM,CAAC;AAE3E,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,EAAE,SAAS,aAAa,IAAI,SAAS;AAC3C,EAAAC,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,EAAAA,YAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAE3C,MAAI,UAAU,UAAU;AACtB,8BAA0B;AAAA,EAC5B;AAEA,MAAI,uCAAuC,OAAO,MAAM,GAAG;AACzD,QAAI;AACJ,UAAM,QAAQ,KAAK,MAAM,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI;AACnD,QAAI,OAAO;AACT,UAAI;AACF,mBAAW,QAAQ,KAAK,EAAE;AAAA,MAC5B,QAAQ;AACN,mBAAW;AAAA,MACb;AAAA,IACF;AACA,UAAM,uCAAuC;AAAA,MAC3C;AAAA,MACA,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAEA,MAAI,UAAU,QAAS,QAAO,KAAM,MAAM,SAAS,IAAI;AACvD,MAAI,UAAU,YAAa,QAAO,KAAM,MAAM,aAAa,IAAI;AAC/D,MAAI,UAAU,QAAS,QAAO,KAAM,MAAM,SAAS,IAAI;AACvD,MAAI,UAAU,SAAU,QAAO,UAAU,IAAI;AAC7C,MAAI,UAAU,YAAY,WAAW,aAAc,QAAO,KAAM,MAAM,qBAAqB,IAAI;AAC/F,MAAI,UAAU,QAAS,QAAO,KAAM,MAAM,SAAS,IAAI;AACvD,MAAI,UAAU,UAAU;AAKtB,QAAI,sBAAsB,IAAI,GAAG;AAC/B,aAAO,KAAM,MAAM,gBAAgB,IAAI;AAAA,IACzC;AACA,WAAO,KAAM,MAAM,UAAU,IAAI;AAAA,EACnC;AACA,MAAI,UAAU,UAAU,WAAW,WAAY,QAAO,KAAM,MAAM,iBAAiB,IAAI;AACvF,MAAI,UAAU,UAAU,WAAW,SAAU,QAAO,KAAM,MAAM,WAAW,IAAI;AAC/E,MAAI,UAAU,aAAa,WAAW,SAAU,QAAO,oBAAoB,IAAI;AAC/E,MAAI,UAAU,UAAU,WAAW,UAAW,QAAO,KAAM,MAAM,eAAe,IAAI;AACpF,MAAI,UAAU,UAAU,WAAW,UAAU;AAC3C,UAAM,eAAe,KAAK,MAAM;AAChC,QAAI,iBAAiB,OAAQ,QAAO,KAAM,MAAM,kBAAkB;AAClE,QAAI,iBAAiB,QAAS,QAAO,KAAM,MAAM,mBAAmB,UAAU,IAAI,CAAC;AACnF,mBAAe,QAAQ,UAAU,gBAAgB,EAAE,GAAG,KAAK,CAAC;AAAA,EAC9D;AACA,MAAI,UAAU,UAAW,QAAO,cAAc,IAAI;AAClD,MAAI,UAAU,YAAY,WAAW,uBAAuB;AAC1D,WAAO,wBAAwB,KAAK,SAAS,IAAI;AAAA,EACnD;AACA,MAAI,UAAU,YAAY,WAAW,mBAAoB,QAAO,4BAA4B,IAAI;AAChG,MAAI,UAAU,eAAe,WAAW,iBAAiB;AACvD,WAAO,4BAA4B,KAAK,SAAS,IAAI;AAAA,EACvD;AACA,MAAI,UAAU,eAAe,WAAW,kBAAkB;AACxD,WAAO,6BAA6B,KAAK,SAAS,IAAI;AAAA,EACxD;AACA,MAAI,UAAU,UAAU,WAAW,WAAW;AAC5C,WAAO,KAAM,MAAM,kBAAkB,IAAI;AAAA,EAC3C;AACA,MAAI,UAAU,UAAU,WAAW,UAAU;AAC3C,WAAO,KAAM,MAAM,iBAAiB,IAAI;AAAA,EAC1C;AACA,MAAI,UAAU,UAAU,WAAW,UAAU;AAC3C,WAAO,KAAM,MAAM,iBAAiB,KAAK,SAAS,IAAI;AAAA,EACxD;AACA,MAAI,UAAU,UAAU,WAAW,QAAQ;AACzC,WAAO,KAAM,MAAM,eAAe,IAAI;AAAA,EACxC;AACA,MAAI,UAAU,UAAU,WAAW,QAAQ;AACzC,UAAM,WAAW,KAAK,MAAM;AAC5B,WAAO,KAAM,MAAM,eAAe,UAAU,IAAI,GAAG,QAAQ;AAAA,EAC7D;AACA,MAAI,UAAU,WAAW,WAAW,YAAY;AAC9C,WAAO,KAAM,MAAM,4BAA4B,IAAI;AAAA,EACrD;AAEA,MAAI,UAAU,SAAS,WAAW,SAAU,QAAO,KAAK,UAAU,IAAI;AACtE,MAAI,UAAU,SAAS,WAAW,OAAQ,QAAO,SAAS;AAC1D,MAAI,UAAU,SAAS,WAAW,UAAW,QAAO,qBAAqB,IAAI;AAC7E,MAAI,UAAU,SAAS,WAAW,SAAU,QAAO,UAAU,IAAI;AACjE,MAAI,UAAU,SAAS,WAAW,WAAY,QAAO,KAAM,MAAM,YAAY,IAAI;AACjF,MAAI,UAAU,SAAS,WAAW,QAAS,QAAO,KAAM,MAAM,SAAS,IAAI;AAC3E,MAAI,UAAU,SAAS,WAAW,YAAa,QAAO,iBAAiB;AACvE,MAAI,UAAU,SAAS,WAAW,UAAW,QAAO,KAAM,MAAM,sBAAsB,IAAI;AAC1F,MAAI,UAAU,YAAY,WAAW,QAAS,QAAO,KAAM,MAAM,YAAY,IAAI;AACjF,MAAI,UAAU,YAAY,WAAW,OAAQ,QAAO,WAAW,IAAI;AACnE,MAAI,UAAU,YAAY,WAAW,SAAU,QAAO,aAAa,IAAI;AACvE,MAAI,UAAU,YAAY,WAAW,OAAQ,QAAO,WAAW,IAAI;AACnE,MAAI,UAAU,YAAY,WAAW,OAAQ,QAAO,WAAW,IAAI;AACnE,MAAI,UAAU,YAAY,WAAW,WAAY,QAAO,KAAM,MAAM,eAAe,IAAI;AACvF,MAAI,UAAU,YAAY,WAAW,qBAAsB,QAAO,qBAAqB,IAAI;AAC3F,MAAI,UAAU,YAAY,WAAW,gBAAiB,QAAO,KAAM,MAAM,sBAAsB,IAAI;AAEnG,MAAI,UAAU,aAAa,WAAW,SAAS;AAC7C,UAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AACA,MAAI,UAAU,aAAa,WAAW,SAAU,QAAO,KAAM,MAAM,iBAAiB,IAAI;AACxF,MAAI,UAAU,aAAa,WAAW,OAAQ,QAAO,eAAe,IAAI;AACxE,MAAI,UAAU,aAAa,WAAW,OAAQ,QAAO,eAAe;AACpE,MAAI,UAAU,aAAa,WAAW,OAAQ,QAAO,KAAM,MAAM,eAAe,IAAI;AACpF,MAAI,UAAU,aAAa,WAAW,gBAAiB,QAAO,KAAM,MAAM,uBAAuB,IAAI;AACrG,MAAI,UAAU,aAAa,WAAW,WAAY,QAAO,KAAM,MAAM,kBAAkB,IAAI;AAE3F,iBAAe,OAAO,MAAM;AAC9B;AAEA,IAAM,aACJ,QAAQ,KAAK,CAAC,KACd,aAAa,OAAO,QAAQ,KAAK,CAAC,CAAC,MAAM,aAAa,OAAOC,eAAc,YAAY,GAAG,CAAC;AAE7F,IAAI,YAAY;AACd,OAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;;;AuFzRA,IAAM,aAAa;AAenB,SAAS,aAAa,UAAyC;AAC7D,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,QAAS,QAAO;AACpB,SAAO,QAAQ,IAAI,cAAc,KAAK,KAAK;AAC7C;AAEA,SAAS,cAAc,OAA0C;AAC/D,UAAQ,SAAS,IAAI,KAAK,EAAE,YAAY;AAC1C;AAEA,SAAS,yBAAyB,KAA6B;AAC7D,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,KAAK,EAAG,QAAO;AACnD,QAAM,UAAU,IAAI,KAAK;AACzB,SAAO,QAAQ,WAAW,MAAM,IAAI,UAAU,WAAW,OAAO;AAClE;AAMA,eAAsB,4BACpB,mBACA,UAAyC,CAAC,GACH;AACvC,QAAM,SAAS,kBAAkB,KAAK;AACtC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,IAAI,OAAO,YAAY,MAAM,YAAY,MAAM,OAAO,+BAA+B;AAAA,EAChG;AAEA,QAAM,QAAQ,aAAa,QAAQ,KAAK;AACxC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,QAAQ,KAAK,KAAK,QAAQ,IAAI,gBAAgB,KAAK;AAC1E,QAAM,YAAY,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AACrE,QAAM,YAAY,QAAQ,aAAa;AAEvC,MAAI;AACF,UAAM,MAAM,MAAM,UAAU,GAAG,UAAU,oBAAoB,mBAAmB,MAAM,CAAC,GAAG,SAAS,IAAI;AAAA,MACrG,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,IAC9C,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,OAAO,cAAc,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAM7B,UAAM,aAAa,cAAc,KAAK,cAAc,KAAK,KAAK;AAC9D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,YAAY,cAAc;AAAA,MAC1B,YAAY,yBAAyB,KAAK,GAAG;AAAA,MAC7C,OAAO;AAAA,IACT;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,IAC9C;AAAA,EACF;AACF;AAEO,SAAS,oCACd,YACA,eACgC;AAChC,QAAM,QAAQ,cAAc,UAAU;AACtC,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,WAAW,UAAU,WAAY,QAAO;AACtD,MAAI,UAAU,cAAc,UAAU,YAAY,UAAU,eAAgB,QAAO;AACnF,SAAO,gBAAgB,aAAa;AACtC;;;ACzFA,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAGX,SAAS,0BAA0B,QAAyB;AACjE,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,eAAe,KAAK,OAAO,EAAG,QAAO;AACzC,MAAI,UAAU,KAAK,OAAO,EAAG,QAAO;AACpC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,QAAQ,WAAW,MAAM,IAAI,UAAU,WAAW,OAAO,EAAE;AAC/E,WAAO,eAAe,KAAK,IAAI,QAAQ;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,KAAyB;AAC5C,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,IAAI,IAAI,OAAO;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,yBAAyB,KAAyB;AACzD,QAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACpD,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,eAAe,MAAM,MAAM,SAAS,CAAC,GAAG,KAAK;AACnD,MAAI,CAAC,gBAAgB,iBAAiB,cAAe,QAAO;AAC5D,SAAO;AACT;AAGA,SAAS,wBAAwB,KAAyB;AACxD,QAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACpD,QAAM,MAAM,MAAM,QAAQ,aAAa;AACvC,MAAI,MAAM,KAAK,OAAO,MAAM,SAAS,EAAG,QAAO;AAC/C,QAAM,eAAe,MAAM,MAAM,CAAC,GAAG,KAAK;AAC1C,SAAO,gBAAgB;AACzB;AAMO,SAAS,kBAAkB,KAAkC;AAClE,QAAM,QAA6B;AAAA,IACjC,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,cAAc;AAAA,EAChB;AAEA,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,mBAAmB,KAAK,OAAO,GAAG;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,MAAM,YAAY,OAAO;AAC/B,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,eAAe,KAAK,IAAI,QAAQ,GAAG;AACrC,UAAM,UAAU,IAAI;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,IAAI,aAAa,gBAAgB,IAAI,SAAS,SAAS,aAAa,GAAG;AACzE,UAAM,eACJ,wBAAwB,GAAG,KAAK,yBAAyB,GAAG;AAC9D,UAAM,gBACJ,gBAAgB,UAAU,KAAK,YAAY,IAAI,eAAe;AAChE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,KAAsB;AACzD,SAAO,kBAAkB,GAAG,EAAE,SAAS;AACzC;;;AC/FA,IAAM,oBAAoB;AAEnB,SAAS,2BAA2B,OAAmC;AAC5E,QAAM,QAAQ,OAAO,UAAU,WAAW,MAAM,KAAK,EAAE,YAAY,IAAI;AACvE,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACT;AAEO,SAAS,sBAAsB,SAA2B;AAC/D,QAAM,QAAQ,OAAO,YAAY,WAAW,QAAQ,KAAK,IAAI;AAC7D,SAAO,QAAQ,SAAS,kBAAkB,KAAK,KAAK,CAAC;AACvD;AAEO,SAAS,wBACd,UACkC;AAClC,QAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AACnD,QAAM,aAAa,KAAK,OAAO,CAAC,QAAQ,sBAAsB,IAAI,OAAO,CAAC;AAC1E,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,QAAM,QAAQ,CAAC,UAAqC;AAClD,QAAI,UAAU,aAAa,UAAU,QAAS,QAAO;AACrD,QAAI,UAAU,UAAW,QAAO;AAChC,QAAI,UAAU,UAAW,QAAO;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,OAAqC;AACzC,MAAI,YAAY;AAChB,aAAW,OAAO,YAAY;AAC5B,UAAM,WAAW,MAAM,2BAA2B,IAAI,KAAK,CAAC;AAC5D,QAAI,WAAW,WAAW;AACxB,aAAO;AACP,kBAAY;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YACJ,OAAO,KAAK,eAAe,YAAY,KAAK,WAAW,KAAK,IACxD,KAAK,WAAW,KAAK,IACrB;AACN,QAAM,aAAa,YAAY,kBAAkB,SAAS,IAAI;AAE9D,SAAO;AAAA,IACL,SAAS,OAAO,KAAK,WAAW,QAAQ,EAAE,KAAK;AAAA,IAC/C,OAAO,2BAA2B,KAAK,KAAK;AAAA,IAC5C;AAAA,IACA,aACE,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,KAAK,IAC1D,KAAK,YAAY,KAAK,IACtB;AAAA,IACN,cAAc,YAAY,gBAAgB;AAAA,IAC1C,YAAY,YAAY,cAAc;AAAA,IACtC,cAAc,YAAY,SAAS,cAAc,YAAY;AAAA,EAC/D;AACF;;;ACjCA,SAAS,yBAAyB,OAAgD;AAChF,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,aAAa,UAAU,QAAS,QAAO;AACrD,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,MAAM,OAAO,OAAO,EAAE,KAAK,IAAI;AACxC;AAKO,SAAS,2BAA2B,QAIzC;AACA,QAAM,UAAU,OAAO,WAAW,WAAW,OAAO,KAAK,IAAI;AAC7D,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,MAAM,YAAY,MAAM,QAAQ,qBAAqB;AAAA,EACxE;AAEA,QAAM,aAAa,kBAAkB,OAAO;AAC5C,MAAI,WAAW,iBAAiB,0BAA0B,WAAW,aAAa,GAAG;AACnF,WAAO,EAAE,QAAQ,WAAW,eAAe,YAAY,QAAQ,KAAK;AAAA,EACtE;AAEA,MAAI,WAAW,SAAS,aAAa;AACnC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,WAAW,eACf,+EACA;AAAA,IACN;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,MAAM,YAAY,QAAQ,0BAA0B;AACvE;AAEO,SAAS,+BACd,UACA,UAAmC,CAAC,GACd;AACtB,QAAM,aAAa,QAAQ,eAAc,oBAAI,KAAK,GAAE,YAAY;AAChE,QAAM,MAAM,wBAAwB,QAAQ;AAE5C,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,SAAS;AAAA,MACT;AAAA,MACA,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,SAAS,yBAAyB,IAAI,KAAK;AACjD,QAAM,aAAa,IAAI,cAAc,IAAI;AACzC,QAAM,gBAAgB,IAAI,cAAc,IAAI;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,gBAAgB;AAAA,MACvB,UAAU,IAAI,OAAO,IAAI,IAAI,KAAK;AAAA,MAClC,IAAI,eAAe;AAAA,MACnB,IAAI,eAAe,8CAA8C;AAAA,IACnE,CAAC;AAAA,IACD;AAAA,IACA,gBAAgB;AAAA,IAChB,eACE,IAAI,gBAAgB,IAAI,UAAU,YAC9B,wCACA,IAAI,eACF,sCACA;AAAA,IACR,aAAa,IAAI;AAAA,IACjB,eAAe,IAAI;AAAA,EACrB;AACF;AAiBA,eAAsB,sBACpB,OAC+B;AAC/B,QAAM,aAAa,MAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC9D,QAAM,OAAO,+BAA+B,MAAM,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC;AAChF,QAAM,MAAM,wBAAwB,MAAM,YAAY,CAAC,CAAC;AAExD,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,IAAI,UAAU,WAAW;AAC3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,eAAe,IAAI,eACf,wCACA;AAAA,IACN;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,cAAc;AACvB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,OAAO,IAAI,2BAA2B,IAAI,SAAS;AACnE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,eAAe,UAAU;AAAA,MACzB,SAAS,gBAAgB;AAAA,QACvB,KAAK,WAAW;AAAA,QAChB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,cAAc;AACtC,QAAM,WAAW,MAAM,UAAU,MAAM;AACvC,QAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AAExC,MAAI,CAAC,SAAS,MAAM,SAAS,OAAO,SAAS,cAAc,GAAG;AAC5D,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,eAAe,KAAK;AAAA,MACpB,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa,IAAI;AAAA,MACjB,eAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO;AAAA,MACL,QAAQ,IAAI,UAAU,YAAY,aAAa;AAAA,MAC/C,YAAY,KAAK;AAAA,MACjB,eAAe,OAAO,WAAW,MAAM,IAAI,SAAS,KAAK;AAAA,MACzD,SAAS,gBAAgB;AAAA,QACvB,qBAAqB,MAAM;AAAA,QAC3B,SAAS,SAAS;AAAA,MACpB,CAAC;AAAA,MACD,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa,IAAI;AAAA,MACjB,eAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,IAAI,UAAU;AAAA,EAChB;AACA,QAAM,aACJ,SAAS,eACR,OAAO,WAAW,MAAM,IAAI,SAAS,KAAK;AAE7C,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,eAAe,cAAc,KAAK;AAAA,IAClC,SAAS,gBAAgB;AAAA,MACvB,cAAc,MAAM,IAAI,SAAS,cAAc,SAAS;AAAA,MACxD,WAAW,UAAU,kBAAkB;AAAA,IACzC,CAAC;AAAA,IACD,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,aAAa,IAAI;AAAA,IACjB,eAAe,IAAI;AAAA,EACrB;AACF;",
6
- "names": ["existsSync", "readFileSync", "resolve", "path", "existsSync", "readFileSync", "homedir", "path", "fileURLToPath", "readFileSync", "existsSync", "readFileSync", "path", "statfsSync", "path", "existsSync", "homedir", "path", "existsSync", "readdirSync", "statSync", "path", "runDir", "existsSync", "readdirSync", "path", "embedded", "existsSync", "readFileSync", "entry", "tail", "existsSync", "readFileSync", "tidy", "oneLine", "trimOrNull", "hasFinalResult", "tryParseJsonObject", "record", "trimOrNull", "hasFinalResult", "record", "reconciliation", "tail", "record", "readFileSync", "os", "path", "positiveInt", "os", "resolve", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "path", "os", "runDeviceLogin", "existsSync", "readFileSync", "path", "normalize", "ok", "summary", "homedir", "path", "homedir", "path", "taskString", "unique", "existsSync", "homedir", "path", "statSync", "spawnSync", "homedir", "path", "existsSync", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "existsSync", "homedir", "path", "homedir", "path", "existsSync", "existsSync", "homedir", "path", "homedir", "path", "existsSync", "existsSync", "readFileSync", "homedir", "path", "path", "homedir", "readFileSync", "existsSync", "taskString", "selection", "closeSync", "existsSync", "openSync", "spawn", "closeSync", "openSync", "spawn", "openSync", "spawn", "closeSync", "existsSync", "spawn", "openSync", "closeSync", "taskString", "positiveInt", "path", "trimOrNull", "trimOrNull", "os", "os", "trimOrNull", "trimOrNull", "os", "path", "existsSync", "mkdirSync", "path", "trimOrNull", "normalizePrUrl", "closeSync", "existsSync", "mkdirSync", "openSync", "statSync", "spawn", "os", "path", "existsSync", "readdirSync", "path", "existsSync", "path", "os", "mkdirSync", "openSync", "closeSync", "statSync", "spawn", "provider", "spawn", "existsSync", "openSync", "closeSync", "path", "fileURLToPath", "path", "record", "trimOrNull", "spawnSync", "spawnSync", "committed", "pushed", "headCommit", "pushResult", "asRecord", "record", "path", "trimOrNull", "stringList", "hasFinalResult", "stringList", "trimOrNull", "hasFinalResult", "path", "record", "path", "asRecord", "asString", "isSkippedTerminalCompletionBlocker", "reason", "detail", "ack", "path", "path", "fileURLToPath", "existsSync", "openSync", "spawn", "closeSync", "path", "mkdirSync", "existsSync", "path", "createHash", "url", "body", "res", "parsed", "row", "createHash", "createHash", "mkdirSync", "homedir", "path", "existsSync", "readFileSync", "readdirSync", "writeFileSync", "unlinkSync", "path", "readdirSync", "path", "existsSync", "readFileSync", "writeFileSync", "path", "spawnSync", "spawnSync", "check", "spawnSync", "normalizePersonaSlug", "isLandPrDecision", "summary", "admissionExhaustion", "dispatchSkipDrain", "os", "os", "skip", "platform", "createHash", "trimOrNull", "homedir", "path", "expandHomePath", "spawnSync", "fs", "path", "spawnSync", "existsSync", "mkdirSync", "path", "existsSync", "readFileSync", "path", "path", "path", "existsSync", "readdirSync", "renameSync", "path", "path", "existsSync", "mkdirSync", "readdirSync", "renameSync", "statSync", "path", "path", "path", "existsSync", "readdirSync", "runDir", "statSync", "mkdirSync", "renameSync", "path", "renameSync", "existsSync", "readdirSync", "execFileSync", "path", "normalizePrUrl", "record", "runDir", "localPrAttentionReconcile", "terminalWorkerArchive", "path", "existsSync", "readFileSync", "path", "existsSync", "mkdirSync", "path", "path", "path", "existsSync", "readdirSync", "statSync", "path", "execFileSync", "existsSync", "readdirSync", "statSync", "path", "existsSync", "readdirSync", "path", "statSync", "path", "path", "materialWorktreeChanges", "materialWorktreeChanges", "materialWorktreeChanges", "materialWorktreeChanges", "existsSync", "mkdirSync", "writeFileSync", "path", "record", "resolveHarnessRoot", "path", "materialWorktreeChanges", "path", "skip", "existsSync", "readdirSync", "statSync", "path", "path", "isActiveHarnessWorker", "path", "statSync", "path", "existsSync", "readdirSync", "existsSync", "rmSync", "existsSync", "rmSync", "lstatSync", "readdirSync", "spawnSync", "path", "path", "spawnSync", "path", "existsSync", "rmSync", "existsSync", "rmSync", "existsSync", "readdirSync", "statSync", "path", "pathAgeMs", "statSync", "path", "path", "existsSync", "pathAgeMs", "readdirSync", "existsSync", "readdirSync", "statSync", "path", "pathAgeMs", "isPathInside", "pushCandidate", "existsSync", "statSync", "path", "pathAgeMs", "path", "path", "finalizeStaleRuns", "existsSync", "path", "existsSync", "path", "materialWorktreeChanges", "existsSync", "homedir", "path", "envFlag", "spawnSync", "existsSync", "path", "skip", "path", "mkdirSync", "fileURLToPath", "os", "os", "os", "mkdirSync", "readFileSync", "renameSync", "writeFileSync", "homedir", "path", "envFlag", "existsSync", "homedir", "path", "envFlag", "trimTrailingSlash", "closeSync", "existsSync", "openSync", "readFileSync", "unlinkSync", "writeFileSync", "fs", "fs", "randomBytes", "dirname", "fs", "path", "readFileIfExists", "path", "path", "path", "spawnSync", "asRecord", "path", "path", "os", "readFileSync", "homedir", "path", "execFileSync", "os", "sleep", "resolve", "spawn", "envFlag", "spawn", "os", "existsSync", "rmSync", "path", "normalizeRelativePath", "path", "existsSync", "rmSync", "path", "spawnSync", "spawnSync", "spawnSync", "positiveInt", "sleepMs", "spawnSync", "spawnSync", "closeSync", "existsSync", "mkdirSync", "openSync", "readdirSync", "readFileSync", "unlinkSync", "writeFileSync", "path", "mkdirSync", "path", "path", "mkdirSync", "positiveInt", "path", "existsSync", "readFileSync", "record", "unlinkSync", "mkdirSync", "readdirSync", "openSync", "writeFileSync", "closeSync", "activeSlots", "spawnSync", "sleepMs", "spawnSync", "path", "spawnSync", "path", "path", "path", "readFileSync", "readFileSync", "str", "record", "workerStatus", "path", "existsSync", "mkdirSync", "readdirSync", "unlinkSync", "path", "workerRecord", "path", "DEFAULT_POLL_MS", "DEFAULT_MAX_TOTAL_MS", "spawn", "closeSync", "existsSync", "openSync", "path", "fileURLToPath", "resolveDefaultCliPath", "path", "fileURLToPath", "existsSync", "openSync", "spawn", "closeSync", "path", "path", "path", "homedir", "CONFIG_FILE", "path", "homedir", "path", "existsSync", "readFileSync", "homedir", "path", "spawnSync", "spawnSync", "existsSync", "path", "homedir", "readFileSync", "check", "path", "path", "homedir", "CONFIG_FILE", "payload", "existsSync", "createHash", "homedir", "path", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "path", "path", "homedir", "randomBytes", "randomBytes", "existsSync", "mkdirSync", "writeFileSync", "homedir", "path", "spawnSync", "path", "homedir", "mkdirSync", "existsSync", "writeFileSync", "spawnSync", "existsSync", "existsSync", "existsSync", "runId", "check", "os", "spawnSync", "path", "path", "spawnSync", "os", "mkdirSync", "fileURLToPath"]
7
- }