@kynver-app/runtime 0.1.59 → 0.1.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../src/config.ts", "../src/default-repo-discovery.ts", "../src/git.ts", "../src/util.ts", "../src/worker-env.ts", "../src/path-values.ts", "../src/dispatch.ts", "../src/callback-headers.ts", "../src/callbacks.ts", "../src/disk-gate.ts", "../src/wsl-host.ts", "../src/resource-gate.ts", "../src/bounded-build/meminfo.ts", "../src/run-store.ts", "../src/paths.ts", "../src/heartbeat.ts", "../src/stream.ts", "../src/shell-command-outcome.ts", "../src/exit-classify.ts", "../src/exited-salvage.ts", "../src/landing-gate.ts", "../src/landing-contract-gate.ts", "../src/status.ts", "../src/model-routing-task-enrich.ts", "../src/providers/claude.ts", "../src/providers/model-preflight.ts", "../src/model-routing.ts", "../src/retry-limits.ts", "../src/lease-renewal.ts", "../src/supervisor.ts", "../src/prompt.ts", "../src/providers/cursor.ts", "../src/providers/cursor-windows.ts", "../src/providers/registry.ts", "../src/auto-complete.ts", "../src/completion-ack.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/plan-persist/body-hash.ts", "../src/plan-persist/errors.ts", "../src/plan-persist/agentos-api.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/sweep.ts", "../src/worktree.ts", "../src/default-repo.ts", "../src/validate.ts", "../src/discard-disposable.ts", "../src/pipeline-tick.ts", "../src/pipeline-dispatch.ts", "../src/stale-reconcile.ts", "../src/finalize.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/cleanup.ts", "../src/cleanup-run-liveness.ts", "../src/cleanup-guards-helpers.ts", "../src/cleanup-guards.ts", "../src/cleanup-execute.ts", "../src/cleanup-dir-size.ts", "../src/cleanup-scan.ts", "../src/cleanup-worktree-index.ts", "../src/cleanup-types.ts", "../src/cleanup-retention-config.ts", "../src/cleanup-orphan-safety.ts", "../src/harness-storage-snapshot.ts", "../src/installed-package-versions.ts", "../src/daemon.ts", "../src/plan-progress.ts", "../src/bounded-build/constants.ts", "../src/bounded-build/node-options.ts", "../src/bounded-build/systemd-wrap.ts", "../src/bounded-build/admission.ts", "../src/bounded-build/exec.ts", "../src/harness-verify.ts", "../src/harness-verify-cli.ts", "../src/plan-persist-cli.ts", "../src/cleanup-cli.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/package-version.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"],
4
- "sourcesContent": ["#!/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 { dispatchRun } from \"./dispatch.js\";\r\nimport { getPaths } 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 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 { 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 { reconcileRunsCli } from \"./stale-reconcile.js\";\r\nimport { runRuntimeTakeoverDoctorCli } from \"./doctor/runtime-takeover-cli.js\";\r\nimport { runCommandCenterContractCli } from \"./command-center-contract-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\",\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] [--repo PATH] [--discover-repo] [--max-workers N] [--provider claude|cursor]\",\r\n \" kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS]\",\r\n \" kynver run create [--repo /path/repo] [--name name] [--base origin/main]\",\r\n \" kynver run list\",\r\n \" kynver run status --run RUN_ID\",\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 /]\",\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 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 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] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans] [--skip-finalize]\",\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 \" 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 doctor runtime-takeover\",\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 === \"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 === \"login\") return void (await runLogin(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\") return void (await runDaemon(args));\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 === \"doctor\" && action === \"runtime-takeover\") return runRuntimeTakeoverDoctorCli();\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 createRun(args);\r\n if (scope === \"run\" && action === \"list\") return listRuns();\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 === \"worker\" && action === \"start\") return void (await startWorker(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", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } 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\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 /** Max concurrent workers on this machine. Omit to auto-size from RAM. */\r\n maxConcurrentWorkers?: number;\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\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\nexport async function resolveCallbackSecretWithMint(\r\n argsSecret?: string,\r\n agentOsId?: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string> {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return 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 token;\r\n } catch (error) {\r\n failConfig(`runner credential mint failed: ${(error as Error).message}`);\r\n }\r\n }\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 * 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 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 config: KynverUserConfig = normalizeConfigPaths({\r\n ...existing,\r\n ...inferSetupFields(existing, args),\r\n ...(maxWorkersRaw ? { maxConcurrentWorkers: Math.max(1, Math.floor(Number(maxWorkersRaw))) } : {}),\r\n workerProvider: typeof args.provider === \"string\" ? args.provider : existing.workerProvider || \"claude\",\r\n });\r\n saveUserConfig(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 note:\r\n runnerCredentialNote ??\r\n \"Set worker limit once with --max-workers N (or omit to auto-size from RAM). 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) failConfig(\"kynver login requires --api-key or KYNVER_API_KEY\");\r\n saveApiKey(apiKey);\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 { 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 = [\"Kynver\", \"repos/Kynver\", \"code/Kynver\", \"projects/Kynver\"] 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 { spawnSync } from \"node:child_process\";\r\nimport { fail } 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(\"git\", args, { cwd, encoding: \"utf8\" });\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(\"git\", args, { cwd, encoding: \"utf8\" });\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 { 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\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 { 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 return resolved\r\n .replace(/^\\/home\\/[^/]+(?=\\/|$)/, \"~\")\r\n .replace(/^\\/Users\\/[^/]+(?=\\/|$)/, \"~\");\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 path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.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 { buildRunBoard } from \"./worker-ops.js\";\r\nimport { isPidAlive, required, safeSlug } from \"./util.js\";\r\nimport { readJson } from \"./util.js\";\r\nimport {\r\n extractPlanOutboxFromTask,\r\n formatPlanOutboxHandoffBlock,\r\n loadOutboxById,\r\n} from \"./plan-persist/index.js\";\r\nimport type {\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\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 personaMarkdown: string | null;\r\n personaSlug: string | null;\r\n personaEvidence: PersonaContextEvidenceSnapshot | null;\r\n personaInjectionReady: 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 memoryQualityCapture =\r\n ctx.memoryQualityCapture && typeof ctx.memoryQualityCapture === \"object\"\r\n ? (ctx.memoryQualityCapture as HarnessMemoryQualityCaptureSnapshot)\r\n : null;\r\n return {\r\n instructionPolicyMarkdown: markdown,\r\n instructionPolicyFingerprint: fingerprint,\r\n instructionPolicyEvidence: evidence,\r\n memoryQualityCapture,\r\n personaMarkdown,\r\n personaSlug,\r\n personaEvidence,\r\n personaInjectionReady,\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 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\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 leaseOwner = `kynver-harness:${run.id}`;\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 requestedStarts = Number(args.maxStarts) > 0 ? Math.floor(Number(args.maxStarts)) : 1;\r\n const cappedStarts = dryRun\r\n ? requestedStarts\r\n : Math.min(requestedStarts, runnerResourceGate.slotsAvailable);\r\n\r\n const activeHarnessWorkers: Array<{\r\n runId: string;\r\n workerName: string;\r\n taskId: string;\r\n pid?: number;\r\n }> = [];\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 || !isPidAlive(worker.pid)) continue;\r\n activeHarnessWorkers.push({\r\n runId: run.id,\r\n workerName: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n });\r\n }\r\n\r\n const dispatchUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/dispatch-next`;\r\n const body: Record<string, unknown> = {\r\n agentOsId,\r\n dryRun,\r\n maxStarts: cappedStarts,\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 harnessBoardSnapshot: buildRunBoard(run.id),\r\n ...(args.lane ? { lane: String(args.lane) } : {}),\r\n executor: args.executor ? String(args.executor) : \"harness\",\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n ...(args.targetTaskId ? { targetTaskId: String(args.targetTaskId) } : {}),\r\n };\r\n\r\n const dispatch = await postJsonWithCredentialRefresh(dispatchUrl, secret, body, { agentOsId, baseUrl: base });\r\n const responseBody = dispatch.response as { ok?: boolean; result?: Record<string, unknown> } | null;\r\n if (!dispatch.ok || !responseBody?.result) {\r\n const failure = {\r\n runId: run.id,\r\n agentOsId,\r\n action: \"dispatch\",\r\n httpStatus: dispatch.status,\r\n response: dispatch.response,\r\n authRefreshed: dispatch.refreshedAuth === true,\r\n authRefreshFailure: 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 = responseBody.result;\r\n if (dryRun) {\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 };\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 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 retryLimits = readHarnessRetryLimits();\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n for (const decision of result.started as Array<Record<string, unknown>>) {\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 const expectedPersona = normalizePersonaSlug(task.personaSlug);\r\n if (expectedPersona && (!harnessContext?.personaInjectionReady || !harnessContext.personaMarkdown)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: `persona_injection_required: missing anchored context-envelope persona block for \"${expectedPersona}\"`,\r\n });\r\n continue;\r\n }\r\n if (hasLiveWorkerForTask(run.id, taskId)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: \"duplicate_dispatch_prevented: live local worker already owns this task\",\r\n });\r\n continue;\r\n }\r\n const attempt = Number(task.attempt) || 1;\r\n if (attempt > retryLimits.maxTaskAttempts) {\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: `task attempt ${attempt} exceeds KYNVER_MAX_TASK_ATTEMPTS (${retryLimits.maxTaskAttempts})`,\r\n });\r\n continue;\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 task: enrichTaskForModelRouting(task),\r\n });\r\n try {\r\n const planId = task.planId ? String(task.planId) : undefined;\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 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: task.prUrl ? String(task.prUrl) : 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 personaMarkdown: harnessContext?.personaMarkdown ?? null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaEvidence: harnessContext?.personaEvidence ?? null,\r\n leaseOwner,\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 } catch (error) {\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(task.id))}/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 outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: (error as Error).message,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n releaseResponse: release.response ?? release,\r\n });\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: outcomes.filter((o) => o.started).length,\r\n outcomes,\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n skipReason: d.skipReason,\r\n })),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n };\r\n if (pipeline) {\r\n return { ok: !outcomes.some((o) => !o.started), ...summary };\r\n }\r\n console.log(JSON.stringify(summary, null, 2));\r\n if (outcomes.some((o) => !o.started)) 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\nexport async function postJson(url: string, secret: string, body: unknown): Promise<PostJsonResult> {\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 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 const res = await fetch(url, {\r\n method: \"GET\",\r\n headers: buildHarnessCallbackHeaders(secret),\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", "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, 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 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 { listRunRecords, loadRun, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\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 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}\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}\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) {\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 envCap = process.env.KYNVER_MAX_WORKERS ? positiveInt(process.env.KYNVER_MAX_WORKERS, 0) || null : null;\r\n const configuredMaxWorkers =\r\n configuredMaxWorkersOverride !== undefined\r\n ? configuredMaxWorkersOverride\r\n : envCap ??\r\n (config.maxConcurrentWorkers !== undefined && config.maxConcurrentWorkers !== null\r\n ? positiveInt(config.maxConcurrentWorkers, 0) || null\r\n : null);\r\n return { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers };\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\nfunction isActiveHarnessWorker(worker: HarnessWorkerRecord): boolean {\r\n const status = computeWorkerStatus(worker);\r\n return status.alive && !status.finalResult && status.attention.state !== \"done\";\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 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 || !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 { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers } = resolveResourceConfig(\r\n input.config,\r\n input.configuredMaxWorkersOverride,\r\n );\r\n\r\n const totalMemBytes = input.totalMemBytes ?? os.totalmem();\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 = computeAutoMaxWorkers(totalMemBytes, { perWorkerMemBytes, memReserveBytes, memUtilization });\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 let reason: string | null = null;\r\n if (slotsAvailable <= 0) {\r\n 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 autoCap,\r\n capacityWorkers: capacityFromTotal,\r\n maxConcurrentWorkers,\r\n activeWorkers,\r\n slotsAvailable,\r\n reason,\r\n };\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, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths, 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 if (!existsSync(runsDir)) return [];\r\n const runs: HarnessRunRecord[] = [];\r\n for (const entry of readdirSync(runsDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue;\r\n const run = readJson<HarnessRunRecord | undefined>(\r\n path.join(runsDir, entry.name, \"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 { runsDir } = getPaths();\r\n return runDirPath(runsDir, safeSlug(id));\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\n/** Canonical harness root for CLI/workers. Server mirror: agent-os.harness-root.ts */\r\nexport function resolveHarnessRoot(): string {\r\n const env = process.env.KYNVER_HARNESS_ROOT || process.env.OPUS_HARNESS_ROOT;\r\n if (env) return resolveUserPath(env);\r\n const configured = loadUserConfig().harnessRoot?.trim();\r\n if (configured) return resolveUserPath(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 getHarnessPaths() {\r\n const harnessRoot = resolveHarnessRoot();\r\n return {\r\n harnessRoot,\r\n runsDir: path.join(harnessRoot, \"runs\"),\r\n worktreesDir: path.join(harnessRoot, \"worktrees\"),\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, readFileSync } from \"node:fs\";\r\nimport { safeJson } from \"./util.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 heartbeatBlocker: string | null;\r\n timestampAnomalies: ParsedHeartbeatTimestampAnomaly[];\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): string | null {\r\n if (!isTerminalHeartbeatPhase(heartbeat.lastHeartbeatPhase)) return null;\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 heartbeatBlocker: null,\r\n timestampAnomalies: [],\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 result.heartbeatBlocker = row.blocker ? String(row.blocker) : null;\r\n }\r\n return result;\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\") 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 === \"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", "// 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. Reserve \"command failed\" for ENOLOCK, network\r\n// errors, invalid JSON, and other tool failures.\r\n\r\nexport type ShellCommandOutcomeKind = \"success\" | \"audit_findings\" | \"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\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\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 (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", "// 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", "// Runtime mirror of server landing-contract gate (Dalton landing-only / target PRs).\r\n\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}\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\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 parseReconciliation(finalResult: unknown): TargetPrReconciliation[] {\r\n if (!finalResult || typeof finalResult !== \"object\" || Array.isArray(finalResult)) return [];\r\n const record = finalResult as Record<string, unknown>;\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\nfunction workerPrUrls(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 pr = normalizePrUrl(String((finalResult as Record<string, unknown>).prUrl ?? \"\"));\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 (!contract.landingOnly && contract.targetPrUrls.length === 0) {\r\n return { blocked: false };\r\n }\r\n if (!hasFinalResult(finalResult)) return { blocked: false };\r\n\r\n const reconciliation = parseReconciliation(finalResult);\r\n const byUrl = new Map(reconciliation.map((r) => [r.prUrl, r]));\r\n const targetSet = new Set(\r\n contract.targetPrUrls.map((u) => normalizePrUrl(u) ?? u).filter(Boolean),\r\n );\r\n const workerPrs = workerPrUrls(snapshot, finalResult);\r\n\r\n if (contract.landingOnly) {\r\n for (const pr of workerPrs) {\r\n if (targetSet.size > 0 && !targetSet.has(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 = 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} from \"./landing-contract-gate.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 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}\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 leaseOwner?: 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 /** 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 /** 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}\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}\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 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}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.completionBlocker) {\r\n return { state: \"blocked\", reason: input.completionBlocker };\r\n }\r\n if (input.finalResult) {\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 // 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 resolveFinalResult(\r\n worker: HarnessWorkerRecord,\r\n parsedFinalResult: unknown,\r\n heartbeat: ReturnType<typeof parseHeartbeat>,\r\n): unknown {\r\n if (parsedFinalResult) return parsedFinalResult;\r\n const ackSnapshot = worker.completionSnapshot?.finalResult;\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 attention = computeAttention({\r\n alive,\r\n finalResult,\r\n firstEventAt: parsed.firstEventAt,\r\n stdoutBytes,\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,\r\n });\r\n const workerStatusLabel =\r\n completionBlocker || 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 };\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", "/** Enrich dispatch task metadata with `roleLane` when the board row omits it. */\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\nconst PERSONA_DEFAULT_LANE: Record<string, string> = {\r\n ghost: \"system\",\r\n astra: \"plan_author\",\r\n rhea: \"implementer\",\r\n mnemo: \"implementer\",\r\n sentinel: \"deep_reviewer\",\r\n pixel: \"implementer\",\r\n schema: \"implementer\",\r\n atlas: \"runtime_verifier\",\r\n bridge: \"implementer\",\r\n catalyst: \"implementer\",\r\n dalton: \"implementer\",\r\n lorentz: \"report_reviewer\",\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 if (persona && PERSONA_DEFAULT_LANE[persona]) {\r\n const base = PERSONA_DEFAULT_LANE[persona];\r\n if (persona === \"lorentz\" && (combined.includes(\"deep\") || combined.includes(\"security\"))) {\r\n return \"deep_reviewer\";\r\n }\r\n return base;\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 { 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\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 { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { CLAUDE_DEFAULT_MODEL } from \"./providers/claude.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`). */\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}\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 \"claude\";\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 return \"claude\";\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 (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\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\r\n // Landing / merge hygiene \u2192 Haiku on Claude.\r\n if (ref.includes(\"landing\") || title.startsWith(\"land:\") || title.includes(\" merge\")) {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"lane:landing\",\r\n };\r\n }\r\n\r\n // Reviews \u2014 Sonnet unless explicitly deep/security.\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 { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:deep_review\" };\r\n }\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"lane:review\" };\r\n }\r\n\r\n // Planning / strategy \u2192 Opus when the lane truly needs it.\r\n if (isOpusLane(ref, title) || roleLane === \"plan_author\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:planning\" };\r\n }\r\n\r\n if (priority === \"critical\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"priority:critical\" };\r\n }\r\n if (priority === \"high\") {\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"priority:high\" };\r\n }\r\n if (priority === \"low\") {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"priority:low\",\r\n };\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 task?: Record<string, unknown>;\r\n}): ModelRoutingDecision {\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) return providerAlias;\r\n\r\n return {\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\r\n if (input.task && Object.keys(input.task).length > 0) {\r\n const inferred = inferModelRoutingFromTask(input.task);\r\n return {\r\n ...inferred,\r\n requestedModel: inferred.model,\r\n };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\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/** 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", "/** 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 3). */\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, 3),\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\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 leaseOwner = `kynver-harness:${runId}`;\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 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 { leaseOwner, leaseDurationMs },\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", "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 { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type {\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\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 personaMarkdown?: string | null;\r\n personaSlug?: string | null;\r\n personaEvidence?: PersonaContextEvidenceSnapshot | null;\r\n leaseOwner?: 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}\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 || \"claude\",\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 });\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 branch = 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 git(run.repo, [\"worktree\", \"add\", \"-b\", branch, worktreePath, run.baseCommit], { throwError: true });\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 personaMarkdown: opts.personaMarkdown,\r\n model: launchModel,\r\n });\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 }\r\n\r\n const model = resolveModelFallback(started.model, launchModel, provider.defaultModel);\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.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\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 ...(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 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", "export 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 /** When set, Haiku/compact models get a shorter harness instruction block. */\r\n model?: 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: run `node scripts/agent-os-pr-merge-gate.mjs --pr <url> --agent-os-id <id>` (or `verify-pr-local.mjs --from-pr` + `collect-pr-vercel-evidence.mjs` + 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).\",\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`) and Vercel preview evidence before GitHub Actions.\",\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/vercel payloads.\",\r\n \"- Request the final Actions run only when local + Vercel are 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 ];\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.\",\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.\",\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.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 \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport { spawn, type StdioOptions } from \"node:child_process\";\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\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\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 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 closeSync(stdoutFd);\r\n closeSync(stderrFd);\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", "import { loadUserConfig } from \"../config.js\";\r\nimport { claudeProvider } from \"./claude.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 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 configured = (name || loadUserConfig().workerProvider || \"claude\").trim();\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", "// 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 { hasCompletionAck } from \"./completion-ack.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\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 return {\r\n run: String(raw.run || \"\"),\r\n name: String(raw.name || \"\"),\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 (hasCompletionAck(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 (hasCompletionAck(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\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 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 hasCompletionAck,\r\n persistCompletionAck,\r\n type CompletionAckFields,\r\n} from \"./completion-ack.js\";\r\nimport { persistCompletionAcknowledged } from \"./worker-lifecycle.js\";\r\nimport {\r\n isPidAlive,\r\n killWorkerProcess,\r\n readJson,\r\n required,\r\n safeJson,\r\n safeSlug,\r\n sleepMs,\r\n tailFile,\r\n writeJson,\r\n} from \"./util.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 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\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 worker = loadWorker(String(args.run), String(args.name));\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 (!agentOsId) {\r\n return { ok: false, reason: \"missing agentOsId\" };\r\n }\r\n if (!isFinishedWorkerStatus(status)) {\r\n return { ok: true, skipped: true, reason: \"worker-not-finished\" };\r\n }\r\n\r\n const forceReplay = args.force === true || args.force === \"true\";\r\n if (!forceReplay && hasCompletionAck(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\r\n if (worker.localOnly) {\r\n return { ok: true, skipped: true, reason: \"local-only-worker\" };\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 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 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 = applyPrHandoffToStatus(status, handoff);\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 startedAt: worker.startedAt,\r\n finishedAt: status.lastActivityAt || new Date().toISOString(),\r\n status: 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 },\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 worker = loadWorker(String(args.run), String(args.name));\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 (!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 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\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 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 worker = loadWorker(String(args.run), String(args.name));\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\nexport function buildRunBoard(runId: string): Record<string, unknown> {\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 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 completionBlocker = typeof rawBlocker === \"string\" && rawBlocker ? rawBlocker : undefined;\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 const board = {\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 writeJson(path.join(runDirectory(run.id), \"last-board.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\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const board = buildRunBoard(String(args.run));\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 worker = loadWorker(String(args.run), String(args.name));\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 worker = loadWorker(String(args.run), String(args.name));\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\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]);\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 taskStatus = task ? asString(task.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 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\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([\"lorentz\", \"sentinel\"]);\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}): 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 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\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 baseRef,\r\n exec,\r\n worker: input.worker,\r\n snapshot,\r\n });\r\n\r\n if (!requirement.required) {\r\n return { ok: true, prUrl: prUrlHint ?? undefined };\r\n }\r\n\r\n if (prUrlHint) {\r\n return { ok: true, prUrl: prUrlHint };\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 existing = findOpenPrUrl(snapshot.worktreePath, repo, snapshot.branch, exec);\r\n if (existing) {\r\n return {\r\n ok: true,\r\n prUrl: existing,\r\n headCommit: snapshot.headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined,\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\nexport function completionSnapshotFromStatus(\r\n status: RawHarnessWorkerStatus,\r\n): CompletionSnapshot {\r\n const summary =\r\n typeof status.lastHeartbeatSummary === \"string\" ? status.lastHeartbeatSummary : null;\r\n return {\r\n finalResult: status.finalResult ?? 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 { 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 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 { 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 { 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 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 { publishHarnessBoardSnapshot } from \"./worker-ops.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 leaseOwner = `kynver-harness:${run.id}`;\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<Record<string, unknown>>(\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 as never);\r\n if (status.alive) continue;\r\n if (status.finalResult || worker.completionReportedAt) continue;\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, leaseOwner, 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, 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 { listRunIds, readJson, 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 function createRun(args: Record<string, string | boolean>): void {\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 console.log(JSON.stringify({ runId: id, runDir: dir, repo, base, baseCommit }, null, 2));\r\n}\r\n\r\nexport function listRuns(): void {\r\n const { runsDir } = getPaths();\r\n const rows = listRunIds(runsDir)\r\n .map((id) => readJson<Record<string, unknown>>(path.join(runDirectory(id), \"run.json\"), undefined))\r\n .filter(Boolean)\r\n .map((run) => ({\r\n id: run!.id,\r\n name: run!.name,\r\n status: run!.status,\r\n repo: run!.repo,\r\n createdAt: run!.createdAt,\r\n }));\r\n console.log(JSON.stringify(rows, null, 2));\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 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 path from \"node:path\";\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\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\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 { 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\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 worker = loadWorker(String(args.run), String(args.name));\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 } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { runPipelineDispatch } from \"./pipeline-dispatch.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 { 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 { hasCompletionAck } from \"./completion-ack.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { fetchWorkspaceRuntimePreferences } from \"./workspace-runtime-config.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\n\r\nexport interface PipelineTickResult {\r\n runId: string;\r\n agentOsId: string;\r\n execute: boolean;\r\n resourceGate: 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 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 (hasCompletionAck(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): 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 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 packageVersions,\r\n });\r\n return { ok: res.ok, httpStatus: res.status, response: res.response };\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 resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride: workspacePrefs?.maxConcurrentWorkers,\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 operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args);\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 // 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 harnessCleanup = isPipelineCleanupEnabled() ? runPipelineHarnessCleanup(runId) : undefined;\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, args);\r\n\r\n let maxStarts = resourceGate.slotsAvailable;\r\n const tickBody = operatorTick as { response?: { dispatch?: { recommendedMaxStarts?: number } } };\r\n const advised = tickBody.response?.dispatch?.recommendedMaxStarts;\r\n if (typeof advised === \"number\") {\r\n maxStarts = Math.min(maxStarts, Math.max(0, advised));\r\n }\r\n\r\n const sweep = await sweepRun({ run: runId, agentOsId, pipeline: true, ...args });\r\n\r\n let dispatch: unknown = null;\r\n if (execute && maxStarts > 0) {\r\n dispatch = await runPipelineDispatch(\r\n {\r\n ...args,\r\n run: runId,\r\n agentOsId,\r\n },\r\n maxStarts,\r\n );\r\n } else {\r\n dispatch = {\r\n ok: true,\r\n skipped: true,\r\n reason: execute ? resourceGate.reason ?? \"no slots or queued work\" : \"execute disabled\",\r\n maxStarts: 0,\r\n };\r\n }\r\n\r\n const startedCount = (dispatch as { startedCount?: number })?.startedCount ?? 0;\r\n const idle = maxStarts === 0 && completedWorkers.length === 0 && startedCount === 0;\r\n\r\n return {\r\n runId,\r\n agentOsId,\r\n execute,\r\n resourceGate,\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 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\nfunction 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 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", "import path from \"node:path\";\r\nimport { finalizeStaleRuns, type RunFinalizeResult } from \"./finalize.js\";\r\nimport { listRunRecords, runDirectory, saveWorker } from \"./run-store.js\";\r\nimport { computeWorkerStatus, STALE_MS, type HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, killWorkerProcess, readJson, safeSlug } from \"./util.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}\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 if (staleReconcileDisabled()) {\r\n return { workers: [], finalizedRuns: finalizeStaleRuns() };\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 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 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 return { workers: outcomes, finalizedRuns: finalizeStaleRuns() };\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 console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n workers: { markedExited, killedStale, skipped, total: result.workers.length },\r\n finalizedRuns: result.finalizedRuns.length,\r\n details: { workers: result.workers, finalizedRuns: result.finalizedRuns },\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 { 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 = Object.keys(run.workers || {});\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 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 } from \"./config.js\";\r\n\r\nexport interface WorkspaceRuntimePreferences {\r\n maxConcurrentWorkers: number | null;\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 path from \"node:path\";\r\nimport { resolveUserPath } from \"./path-values.js\";\r\nimport { getHarnessPaths, 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 { skipNodeModulesRemoval, skipWorktreeRemoval, type WorktreeGuardSkip } from \"./cleanup-guards.js\";\r\nimport { removeNodeModules, removeWorktree, isHarnessNodeModulesPath } from \"./cleanup-execute.js\";\r\nimport { scanNodeModulesCandidates, scanWorktreeCandidates } from \"./cleanup-scan.js\";\r\nimport { buildWorktreeIndex } 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\n\r\nfunction resolvePaths(options: HarnessCleanupOptions = {}) {\r\n const harnessRoot = options.harnessRoot\r\n ? resolveUserPath(options.harnessRoot)\r\n : resolveHarnessRoot();\r\n const { worktreesDir } = options.harnessRoot\r\n ? { worktreesDir: path.join(harnessRoot, \"worktrees\") }\r\n : getHarnessPaths();\r\n const now = options.now ?? Date.now();\r\n return { harnessRoot, worktreesDir, 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(candidate: CleanupCandidate, accountBytes: boolean): CleanupCandidate {\r\n if (!accountBytes || candidate.bytes != null) return candidate;\r\n return { ...candidate, bytes: directorySizeBytes(candidate.path) };\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\nexport function runHarnessCleanup(options: HarnessCleanupOptions = {}): HarnessCleanupSummary {\r\n const retention = resolveHarnessRetention(options);\r\n const paths = resolvePaths(options);\r\n const finalizedRuns = retention.finalizeStaleRuns\r\n ? finalizeStaleRuns().map((f) => ({ runId: f.runId, from: f.from, to: f.to }))\r\n : [];\r\n const index = buildWorktreeIndex();\r\n const scanOpts = {\r\n harnessRoot: paths.harnessRoot,\r\n worktreesDir: paths.worktreesDir,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n includeOrphans: retention.includeOrphans,\r\n runIdFilter: retention.runIdFilter,\r\n index,\r\n now: paths.now,\r\n };\r\n const skips: HarnessCleanupSummary[\"skips\"] = [];\r\n const actions: CleanupAction[] = [];\r\n\r\n for (const raw of scanNodeModulesCandidates(scanOpts)) {\r\n const candidate = attachCandidateBytes(raw, retention.accountBytes);\r\n const pathSkip = isHarnessNodeModulesPath(candidate.path, paths.harnessRoot, paths.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 = path.resolve(candidate.path, \"..\");\r\n const indexed = index.get(worktreePath) ?? null;\r\n const guardReason = skipNodeModulesRemoval({\r\n indexed,\r\n includeOrphans: retention.includeOrphans,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n ageMs: candidate.ageMs,\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(removeNodeModules(candidate, retention.execute));\r\n }\r\n\r\n for (const raw of scanWorktreeCandidates(scanOpts)) {\r\n const candidate = attachCandidateBytes(raw, retention.accountBytes);\r\n const indexed = index.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: paths.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 ageMs: candidate.ageMs,\r\n orphanSafety,\r\n worktreeRemovalGuard: options.worktreeRemovalGuard,\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(removeWorktree(candidate, retention.execute));\r\n }\r\n\r\n let candidateBytes = 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 } 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({ harnessRoot: paths.harnessRoot, now: paths.now })\r\n : undefined;\r\n\r\n return {\r\n harnessRoot: paths.harnessRoot,\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 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 };\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 { deriveTerminalRunStatus, TERMINAL_RUN_STATUSES } from \"./finalize.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\n\r\n/** True when the worker process is still live or marked running in worker.json. */\r\nexport function isWorkerProcessLive(indexed: IndexedWorktree): boolean {\r\n if (indexed.status.alive) return true;\r\n if (indexed.worker.status === \"running\") return true;\r\n return false;\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(indexed: IndexedWorktree): boolean {\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) return false;\r\n return deriveTerminalRunStatus(indexed.run) !== 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(indexed: IndexedWorktree): boolean {\r\n if (isWorkerProcessLive(indexed)) return true;\r\n if (indexed.worker.completionBlocker) return true;\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) return false;\r\n if (isRunStaleActive(indexed)) return false;\r\n if (!isFinishedWorkerStatus(indexed.status)) return true;\r\n return deriveTerminalRunStatus(indexed.run) === null;\r\n}\r\n", "/** Strip generated install 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 pathPart !== \"node_modules\" && !pathPart.startsWith(\"node_modules/\");\r\n });\r\n}\r\n", "import 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 type { RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport { isWorkerProcessLive, runBlocksWorktreeRemoval } from \"./cleanup-run-liveness.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\n\r\nexport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\n\r\nfunction 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/** Blocks whole-worktree removal when commits are not landed or tree is dirty. */\r\nexport function isPrOrUnmergedWork(status: RawHarnessWorkerStatus): boolean {\r\n if (prUrlFromFinalResult(status.finalResult)) return true;\r\n const relation = status.gitAncestry?.relation;\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\r\n/** `node_modules` can be reinstalled from git when porcelain is clean, even with an open PR branch. */\r\nfunction hasUnrestorableWorktreeChanges(status: RawHarnessWorkerStatus): boolean {\r\n if (materialWorktreeChanges(status.changedFiles).length > 0) return true;\r\n if (status.gitAncestry?.relation === \"diverged\") return true;\r\n return false;\r\n}\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 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}\r\n\r\nexport type WorktreeGuardSkip = CleanupSkipReason | { reason: CleanupSkipReason; detail?: string };\r\n\r\nexport function skipWorktreeRemoval(input: WorktreeGuardInput): WorktreeGuardSkip | null {\r\n const { indexed, includeOrphans, worktreesAgeMs, ageMs, orphanSafety, worktreeRemovalGuard } =\r\n input;\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 if (worktreesAgeMs <= 0 && !includeOrphans) return \"worktrees_disabled\";\r\n if (worktreesAgeMs > 0 && ageMs < worktreesAgeMs) return \"below_age_threshold\";\r\n if (isWorkerProcessLive(indexed)) return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (runBlocksWorktreeRemoval(indexed)) return \"run_still_active\";\r\n if (!isFinishedWorkerStatus(indexed.status)) return \"run_still_active\";\r\n if (isPrOrUnmergedWork(indexed.status)) return \"pr_or_unmerged_commits\";\r\n if (materialWorktreeChanges(indexed.status.changedFiles).length > 0) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked) return \"landing_blocked\";\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 function skipNodeModulesRemoval(input: NodeModulesGuardInput): CleanupSkipReason | null {\r\n const { indexed, includeOrphans, nodeModulesAgeMs, ageMs } = input;\r\n if (ageMs < nodeModulesAgeMs) return \"below_age_threshold\";\r\n if (!indexed) return includeOrphans ? null : \"orphan_without_flag\";\r\n if (isWorkerProcessLive(indexed)) return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (!isFinishedWorkerStatus(indexed.status)) return \"run_still_active\";\r\n if (hasUnrestorableWorktreeChanges(indexed.status)) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked && materialWorktreeChanges(indexed.status.changedFiles).length > 0) {\r\n return \"landing_blocked\";\r\n }\r\n return null;\r\n}\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport type { CleanupAction, CleanupCandidate, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\n\r\nexport function removeNodeModules(candidate: CleanupCandidate, execute: boolean): CleanupAction {\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 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\nexport function isHarnessNodeModulesPath(\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 nm = resolved.endsWith(`${path.sep}node_modules`) ? resolved : null;\r\n if (!nm) return \"path_outside_harness\";\r\n const rel = path.relative(worktreesDir, nm);\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] !== \"node_modules\") return \"path_outside_harness\";\r\n if (!resolved.startsWith(path.resolve(harnessRoot))) return \"path_outside_harness\";\r\n return null;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/**\r\n * Best-effort directory size. Returns null when entry cap is exceeded (huge trees).\r\n */\r\nexport function directorySizeBytes(root: string, maxEntries = 50_000): number | null {\r\n if (!existsSync(root)) return 0;\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 { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate } from \"./cleanup-types.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\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 path from \"node:path\";\r\nimport { listRunRecords, loadWorker, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord, type RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface IndexedWorktree {\r\n worktreePath: string;\r\n runId: string;\r\n workerName: string;\r\n run: HarnessRunRecord;\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n}\r\n\r\nexport function buildWorktreeIndex(): Map<string, IndexedWorktree> {\r\n const index = new Map<string, IndexedWorktree>();\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 if (!worker?.worktreePath) continue;\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n index.set(path.resolve(worker.worktreePath), {\r\n worktreePath: path.resolve(worker.worktreePath),\r\n runId: run.id,\r\n workerName: name,\r\n run,\r\n worker,\r\n status,\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", "export type CleanupActionKind = \"remove_node_modules\" | \"remove_worktree\";\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 /** 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 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 dryRun: boolean;\r\n execute: boolean;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\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}\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 (default), estimate candidate bytes in dry-run summaries. */\r\n accountBytes?: 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 /** 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", "import {\r\n DEFAULT_NODE_MODULES_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 nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n runIdFilter?: string;\r\n accountBytes: boolean;\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 worktreesAgeMs =\r\n options.worktreesAgeMs ??\r\n envMs(\"KYNVER_CLEANUP_WORKTREES_AGE_MS\", 0);\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\r\n return {\r\n execute,\r\n finalizeStaleRuns,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs: worktreesAgeMs > 0 ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n runIdFilter: runIdFilter ? String(runIdFilter) : undefined,\r\n accountBytes,\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 finalizeStaleRuns: true,\r\n accountBytes: true,\r\n });\r\n}\r\n", "import { existsSync, statSync } 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 type { CleanupSkipReason } from \"./cleanup-types.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 heartbeatPath = path.join(\r\n input.harnessRoot,\r\n \"runs\",\r\n input.runId,\r\n \"workers\",\r\n input.workerName,\r\n \"heartbeat.jsonl\",\r\n );\r\n try {\r\n const mtime = statSync(heartbeatPath).mtimeMs;\r\n if (now - mtime < heartbeatFreshMs) return \"active_worker\";\r\n } catch {\r\n // No heartbeat \u2014 fine, orphan is fully detached.\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 // No upstream and no origin/main reference reachable \u2014 be conservative.\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, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { 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 = opts.harnessRoot ?? resolveHarnessRoot();\r\n const worktreesDir = path.join(harnessRoot, \"worktrees\");\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 { readFile } from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\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\nexport async function collectInstalledPackageVersions(\r\n observedAt: string = new Date().toISOString(),\r\n): Promise<InstalledPackageVersionMap> {\r\n const roots = moduleRoots();\r\n const out: InstalledPackageVersionMap = {};\r\n for (const packageName of MANAGED_PACKAGES) {\r\n for (const root of roots) {\r\n const packageJsonPath = path.join(root, packageName, \"package.json\");\r\n const version = await readVersion(packageJsonPath);\r\n if (!version) continue;\r\n out[packageName] = { version, observedAt, path: packageJsonPath };\r\n break;\r\n }\r\n }\r\n return out;\r\n}\r\n", "import { loadUserConfig } from \"./config.js\";\r\nimport { required, sleepMs } from \"./util.js\";\r\nimport { runPipelineTick } from \"./pipeline-tick.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\n\r\nexport async function runDaemon(args: Record<string, string | boolean>): Promise<void> {\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 console.error(JSON.stringify({ event: \"daemon_start\", runId, agentOsId, execute, intervalMs }));\r\n\r\n while (!stopping) {\r\n try {\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 sleepMs(backoff);\r\n } catch (error) {\r\n console.error(JSON.stringify({ event: \"daemon_tick_error\", error: (error as Error).message }));\r\n sleepMs(intervalMs);\r\n }\r\n }\r\n\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 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\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 provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : undefined;\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", "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. Does not serialize \u2014 parallel builds proceed when\r\n * the host has headroom.\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 assessBuildAdmission,\r\n registerBuildEnd,\r\n registerBuildStart,\r\n waitForBuildAdmission,\r\n type BuildAdmissionVerdict,\r\n} from \"./admission.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 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 NODE_OPTIONS heap cap, optional\r\n * systemd-run memory scope, and RAM-aware admission (parallel-safe).\r\n */\r\nexport function runBoundedBuildCheck(input: RunBoundedBuildCheckInput): BoundedBuildExecResult {\r\n const waitMs = input.waitForAdmissionMs ?? 600_000;\r\n const admission =\r\n waitMs > 0 ? waitForBuildAdmission(waitMs) : assessBuildAdmission();\r\n\r\n if (!admission.admitted) {\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 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 command: input.command,\r\n };\r\n } finally {\r\n registerBuildEnd();\r\n }\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 with memory-bounded subprocess execution.\r\n * Parallel worktrees remain allowed \u2014 each call admits by MemAvailable at start.\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 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 nodeModulesAgeMs = args.nodeModulesAgeMs\r\n ? Number(args.nodeModulesAgeMs)\r\n : DEFAULT_NODE_MODULES_AGE_MS;\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 nodeModulesAgeMs: Number.isFinite(nodeModulesAgeMs) ? nodeModulesAgeMs : DEFAULT_NODE_MODULES_AGE_MS,\r\n worktreesAgeMs: Number.isFinite(worktreesAgeMs) ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n harnessRoot,\r\n });\r\n\r\n console.log(JSON.stringify(summary, null, 2));\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", "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 { 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\nfunction expectedLeaseOwner(runId: string): string {\r\n return `kynver-harness:${runId}`;\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 const expectedOwner = expectedLeaseOwner(worker.runId);\r\n\r\n if (worker.dispatched && taskLease) {\r\n if (taskLease.status === \"running\" && leaseOwner && leaseOwner !== expectedOwner) {\r\n return {\r\n health: \"orphaned\",\r\n reason: `task lease held by ${leaseOwner}, expected ${expectedOwner}`,\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 { 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 console.log(JSON.stringify({ monitorId, phase: \"tick\", ...tick }));\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", "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 path from \"node:path\";\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 let defaultRepoRemediation: string | undefined;\r\n if (!resolvedDefaultRepo) {\r\n defaultRepoRemediation =\r\n \"Run `kynver setup` from a Kynver checkout (auto-discovers repo) or `kynver setup --repo /path/to/Kynver`.\";\r\n } else if (!resolvedDefaultRepo.persistedInConfig) {\r\n defaultRepoRemediation =\r\n \"Run `kynver setup` (no --repo) to persist discovered defaultRepo in ~/.kynver/config.json.\";\r\n }\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: resolvedDefaultRepo ? \"pass\" : \"warn\",\r\n summary: resolvedDefaultRepo\r\n ? `${formatted!.defaultRepo} (${resolvedDefaultRepo.source}${resolvedDefaultRepo.persistedInConfig ? \"\" : \", not persisted\"})`\r\n : \"Not set (pass --repo on `kynver run create` or run `kynver setup` to auto-discover)\",\r\n remediation: defaultRepoRemediation,\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 assessVercelCli(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const version = probes.vercelVersion();\r\n const whoami = probes.vercelWhoami();\r\n const installed = version.ok;\r\n\r\n return {\r\n id: \"vercel_cli\",\r\n label: \"Vercel CLI\",\r\n checks: [\r\n check({\r\n id: \"vercel_installed\",\r\n label: \"Vercel CLI installed\",\r\n status: installed ? \"pass\" : \"warn\",\r\n summary: installed ? version.stdout || \"vercel CLI found\" : version.error ?? \"vercel not found on PATH\",\r\n remediation: installed ? undefined : \"Install Vercel CLI (`npm i -g vercel`) for deploy evidence and env pulls.\",\r\n details: { stderr: version.stderr || null },\r\n }),\r\n check({\r\n id: \"vercel_authenticated\",\r\n label: \"Vercel CLI authenticated\",\r\n status: !installed ? \"warn\" : whoami.ok ? \"pass\" : \"warn\",\r\n summary: !installed\r\n ? \"Skipped \u2014 Vercel CLI not installed\"\r\n : whoami.ok\r\n ? `Authenticated as ${whoami.stdout}`\r\n : whoami.stderr || whoami.error || \"Not logged in\",\r\n remediation:\r\n installed && !whoami.ok ? \"Run `vercel login` and link the Kynver project if needed.\" : undefined,\r\n details: { account: whoami.ok ? whoami.stdout : null },\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 assessVercelCli(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 { 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 openclaw-cron bridge (`OPENCLAW_CRON_STORE_PATH`). */\r\n openclawCronStorePath?: 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 vercelVersion(): CommandProbeResult;\r\n vercelWhoami(): CommandProbeResult;\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(process.env.OPENCLAW_CRON_STORE_PATH?.trim()),\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 vercelVersion: () => captureCommand(\"vercel\", [\"--version\"]),\r\n vercelWhoami: () => captureCommand(\"vercel\", [\"whoami\"]),\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 openclaw-cron bridge (`OPENCLAW_CRON_STORE_PATH`). */\r\n openclawCronStorePath?: 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 hasLocalOpenClawDependency(\r\n env: RuntimeTakeoverSchedulerEnv,\r\n ctx: RuntimeTakeoverSchedulerContext,\r\n): boolean {\r\n return (\r\n env.kynverSchedulerProvider === \"kynver-cron\" ||\r\n env.kynverSchedulerProvider === \"openclaw-cron\" ||\r\n ctx.deploymentSchedulerProvider === \"kynver-cron\" ||\r\n ctx.deploymentSchedulerProvider === \"openclaw-cron\" ||\r\n Boolean(env.openclawCronStorePath)\r\n );\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 */\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 };\r\n\r\n if (hasQstashCutover(env, ctx) && !hasLocalOpenClawDependency(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 (hasLocalOpenClawDependency(env, ctx)) {\r\n const parts: string[] = [];\r\n if (env.kynverSchedulerProvider === \"openclaw-cron\") {\r\n parts.push(\"KYNVER_SCHEDULER_PROVIDER=openclaw-cron\");\r\n }\r\n if (ctx.deploymentSchedulerProvider === \"openclaw-cron\") {\r\n parts.push(\"deploymentSchedulerProvider=openclaw-cron in config\");\r\n }\r\n if (env.openclawCronStorePath) {\r\n parts.push(\"OPENCLAW_CRON_STORE_PATH set (local cron bridge)\");\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: `OpenClaw local cron still active (${parts.join(\"; \")})`,\r\n remediation:\r\n \"On the Kynver deployment: set KYNVER_SCHEDULER_PROVIDER=qstash with QSTASH_TOKEN configured. \" +\r\n \"On user runners: unset KYNVER_SCHEDULER_PROVIDER and OPENCLAW_CRON_STORE_PATH; set deploymentSchedulerProvider to qstash in ~/.kynver/config.json after Vercel env is updated.\",\r\n details: schedulerDetails,\r\n });\r\n }\r\n\r\n const runnerOpenclaw = env.kynverSchedulerProvider === \"openclaw-cron\";\r\n const runnerQstash = env.kynverSchedulerProvider === \"qstash\";\r\n const hostedDeployment = Boolean(env.qstashTokenPresent) || Boolean(env.kynverHostedDeployment);\r\n const daemonDispatchReady =\r\n Boolean(ctx.agentOsId?.trim()) &&\r\n Boolean(ctx.apiBaseUrl?.trim()) &&\r\n ctx.hasScopedRunnerToken;\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 deploymentNeedsQstash =\r\n hostedSchedulerProcess &&\r\n !env.qstashTokenPresent &&\r\n env.kynverSchedulerProvider !== \"qstash\";\r\n const deploymentOpenclaw =\r\n hostedSchedulerProcess && env.kynverSchedulerProvider === \"openclaw-cron\";\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. 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. 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 || deploymentNeedsQstash) {\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: deploymentOpenclaw\r\n ? \"Hosted deployment has KYNVER_SCHEDULER_PROVIDER=openclaw-cron \u2014 AgentOS scheduled ticks should use QStash\"\r\n : env.kynverSchedulerProvider\r\n ? `Hosted deployment without QSTASH_TOKEN (KYNVER_SCHEDULER_PROVIDER=${env.kynverSchedulerProvider}) \u2014 scheduler may fall back to openclaw-cron`\r\n : \"KYNVER_SCHEDULER_PROVIDER unset on hosted deployment; without QSTASH_TOKEN the server may fall back to openclaw-cron\",\r\n remediation:\r\n \"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server. 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 (hostedDeployment && 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 (!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 { assessRuntimeTakeoverReadiness } from \"./runtime-takeover.js\";\r\n\r\nexport function runRuntimeTakeoverDoctorCli(): void {\r\n const report = assessRuntimeTakeoverReadiness();\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"],
5
- "mappings": "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",
3
+ "sources": ["../src/cli.ts", "../src/config.ts", "../src/default-repo-discovery.ts", "../src/git.ts", "../src/util.ts", "../src/worker-env.ts", "../src/path-values.ts", "../src/dispatch.ts", "../src/callback-headers.ts", "../src/callbacks.ts", "../src/disk-gate.ts", "../src/wsl-host.ts", "../src/resource-gate.ts", "../src/bounded-build/meminfo.ts", "../src/run-store.ts", "../src/paths.ts", "../src/heartbeat.ts", "../src/stream.ts", "../src/shell-command-outcome.ts", "../src/exit-classify.ts", "../src/exited-salvage.ts", "../src/landing-gate.ts", "../src/landing-contract-gate.ts", "../src/status.ts", "../src/model-routing-task-enrich.ts", "../src/providers/claude.ts", "../src/providers/model-preflight.ts", "../src/model-routing.ts", "../src/retry-limits.ts", "../src/lease-renewal.ts", "../src/supervisor.ts", "../src/prompt.ts", "../src/providers/cursor.ts", "../src/providers/cursor-windows.ts", "../src/providers/registry.ts", "../src/auto-complete.ts", "../src/completion-ack.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/plan-persist/body-hash.ts", "../src/plan-persist/errors.ts", "../src/plan-persist/agentos-api.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/sweep.ts", "../src/worktree.ts", "../src/default-repo.ts", "../src/validate.ts", "../src/discard-disposable.ts", "../src/pipeline-tick.ts", "../src/pipeline-dispatch.ts", "../src/pipeline-max-starts.ts", "../src/stale-reconcile.ts", "../src/finalize.ts", "../src/plan-progress-daemon-sync.ts", "../src/plan-progress-sync.ts", "../src/workspace-runtime-config.ts", "../src/cleanup.ts", "../src/cleanup-run-liveness.ts", "../src/cleanup-guards-helpers.ts", "../src/cleanup-guards.ts", "../src/cleanup-execute.ts", "../src/cleanup-dir-size.ts", "../src/cleanup-scan.ts", "../src/cleanup-worktree-index.ts", "../src/cleanup-types.ts", "../src/cleanup-retention-config.ts", "../src/cleanup-orphan-safety.ts", "../src/harness-storage-snapshot.ts", "../src/installed-package-versions.ts", "../src/daemon.ts", "../src/plan-progress.ts", "../src/bounded-build/constants.ts", "../src/bounded-build/node-options.ts", "../src/bounded-build/systemd-wrap.ts", "../src/bounded-build/admission.ts", "../src/bounded-build/exec.ts", "../src/harness-verify.ts", "../src/harness-verify-cli.ts", "../src/plan-persist-cli.ts", "../src/cleanup-cli.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/package-version.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"],
4
+ "sourcesContent": ["#!/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 { dispatchRun } from \"./dispatch.js\";\r\nimport { getPaths } 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 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 { 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 { reconcileRunsCli } from \"./stale-reconcile.js\";\r\nimport { runRuntimeTakeoverDoctorCli } from \"./doctor/runtime-takeover-cli.js\";\r\nimport { runCommandCenterContractCli } from \"./command-center-contract-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\",\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] [--repo PATH] [--discover-repo] [--max-workers N] [--provider claude|cursor]\",\r\n \" kynver daemon --run RUN_ID --agent-os-id AOS_ID [--execute] [--interval-ms MS]\",\r\n \" kynver run create [--repo /path/repo] [--name name] [--base origin/main]\",\r\n \" kynver run list\",\r\n \" kynver run status --run RUN_ID\",\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 /]\",\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 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 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] [--node-modules-age-ms MS] [--worktrees-age-ms MS] [--harness-root PATH] [--include-orphans] [--skip-finalize]\",\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 \" 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 doctor runtime-takeover\",\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 === \"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 === \"login\") return void (await runLogin(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\") return void (await runDaemon(args));\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 === \"doctor\" && action === \"runtime-takeover\") return runRuntimeTakeoverDoctorCli();\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 createRun(args);\r\n if (scope === \"run\" && action === \"list\") return listRuns();\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 === \"worker\" && action === \"start\") return void (await startWorker(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", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } 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\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 /** Max concurrent workers on this machine. Omit to auto-size from RAM. */\r\n maxConcurrentWorkers?: number;\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\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\nexport async function resolveCallbackSecretWithMint(\r\n argsSecret?: string,\r\n agentOsId?: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<string> {\r\n const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);\r\n if (configured) return 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 token;\r\n } catch (error) {\r\n failConfig(`runner credential mint failed: ${(error as Error).message}`);\r\n }\r\n }\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 * 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 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 config: KynverUserConfig = normalizeConfigPaths({\r\n ...existing,\r\n ...inferSetupFields(existing, args),\r\n ...(maxWorkersRaw ? { maxConcurrentWorkers: Math.max(1, Math.floor(Number(maxWorkersRaw))) } : {}),\r\n workerProvider: typeof args.provider === \"string\" ? args.provider : existing.workerProvider || \"claude\",\r\n });\r\n saveUserConfig(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 note:\r\n runnerCredentialNote ??\r\n \"Set worker limit once with --max-workers N (or omit to auto-size from RAM). 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) failConfig(\"kynver login requires --api-key or KYNVER_API_KEY\");\r\n saveApiKey(apiKey);\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 { 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 = [\"Kynver\", \"repos/Kynver\", \"code/Kynver\", \"projects/Kynver\"] 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 { spawnSync } from \"node:child_process\";\r\nimport { fail } 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(\"git\", args, { cwd, encoding: \"utf8\" });\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(\"git\", args, { cwd, encoding: \"utf8\" });\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 { 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\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 { 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 return resolved\r\n .replace(/^\\/home\\/[^/]+(?=\\/|$)/, \"~\")\r\n .replace(/^\\/Users\\/[^/]+(?=\\/|$)/, \"~\");\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 path from \"node:path\";\r\nimport { resolveBaseUrl, resolveCallbackSecretWithMint } from \"./config.js\";\r\nimport { postJsonWithCredentialRefresh } from \"./callbacks.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 { buildRunBoard } from \"./worker-ops.js\";\r\nimport { isPidAlive, required, safeSlug } from \"./util.js\";\r\nimport { readJson } from \"./util.js\";\r\nimport {\r\n extractPlanOutboxFromTask,\r\n formatPlanOutboxHandoffBlock,\r\n loadOutboxById,\r\n} from \"./plan-persist/index.js\";\r\nimport type {\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\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 personaMarkdown: string | null;\r\n personaSlug: string | null;\r\n personaEvidence: PersonaContextEvidenceSnapshot | null;\r\n personaInjectionReady: 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 memoryQualityCapture =\r\n ctx.memoryQualityCapture && typeof ctx.memoryQualityCapture === \"object\"\r\n ? (ctx.memoryQualityCapture as HarnessMemoryQualityCaptureSnapshot)\r\n : null;\r\n return {\r\n instructionPolicyMarkdown: markdown,\r\n instructionPolicyFingerprint: fingerprint,\r\n instructionPolicyEvidence: evidence,\r\n memoryQualityCapture,\r\n personaMarkdown,\r\n personaSlug,\r\n personaEvidence,\r\n personaInjectionReady,\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 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\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 leaseOwner = `kynver-harness:${run.id}`;\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 requestedStarts = Number(args.maxStarts) > 0 ? Math.floor(Number(args.maxStarts)) : 1;\r\n const cappedStarts = dryRun\r\n ? requestedStarts\r\n : Math.min(requestedStarts, runnerResourceGate.slotsAvailable);\r\n\r\n const activeHarnessWorkers: Array<{\r\n runId: string;\r\n workerName: string;\r\n taskId: string;\r\n pid?: number;\r\n }> = [];\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 || !isPidAlive(worker.pid)) continue;\r\n activeHarnessWorkers.push({\r\n runId: run.id,\r\n workerName: name,\r\n taskId: worker.taskId,\r\n pid: worker.pid,\r\n });\r\n }\r\n\r\n const dispatchUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/dispatch-next`;\r\n const body: Record<string, unknown> = {\r\n agentOsId,\r\n dryRun,\r\n maxStarts: cappedStarts,\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 harnessBoardSnapshot: buildRunBoard(run.id),\r\n ...(args.lane ? { lane: String(args.lane) } : {}),\r\n executor: args.executor ? String(args.executor) : \"harness\",\r\n ...(args.diskPath ? { diskPath: String(args.diskPath) } : {}),\r\n ...(args.targetTaskId ? { targetTaskId: String(args.targetTaskId) } : {}),\r\n };\r\n\r\n const dispatch = await postJsonWithCredentialRefresh(dispatchUrl, secret, body, { agentOsId, baseUrl: base });\r\n const responseBody = dispatch.response as { ok?: boolean; result?: Record<string, unknown> } | null;\r\n if (!dispatch.ok || !responseBody?.result) {\r\n const failure = {\r\n runId: run.id,\r\n agentOsId,\r\n action: \"dispatch\",\r\n httpStatus: dispatch.status,\r\n response: dispatch.response,\r\n authRefreshed: dispatch.refreshedAuth === true,\r\n authRefreshFailure: 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 = responseBody.result;\r\n if (dryRun) {\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 };\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 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 retryLimits = readHarnessRetryLimits();\r\n const outcomes: Array<Record<string, unknown>> = [];\r\n for (const decision of result.started as Array<Record<string, unknown>>) {\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 const expectedPersona = normalizePersonaSlug(task.personaSlug);\r\n if (expectedPersona && (!harnessContext?.personaInjectionReady || !harnessContext.personaMarkdown)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: `persona_injection_required: missing anchored context-envelope persona block for \"${expectedPersona}\"`,\r\n });\r\n continue;\r\n }\r\n if (hasLiveWorkerForTask(run.id, taskId)) {\r\n outcomes.push({\r\n taskId,\r\n started: false,\r\n error: \"duplicate_dispatch_prevented: live local worker already owns this task\",\r\n });\r\n continue;\r\n }\r\n const attempt = Number(task.attempt) || 1;\r\n if (attempt > retryLimits.maxTaskAttempts) {\r\n outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: `task attempt ${attempt} exceeds KYNVER_MAX_TASK_ATTEMPTS (${retryLimits.maxTaskAttempts})`,\r\n });\r\n continue;\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 task: enrichTaskForModelRouting(task),\r\n });\r\n try {\r\n const planId = task.planId ? String(task.planId) : undefined;\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 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: task.prUrl ? String(task.prUrl) : 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 personaMarkdown: harnessContext?.personaMarkdown ?? null,\r\n personaSlug: harnessContext?.personaSlug ?? expectedPersona,\r\n personaEvidence: harnessContext?.personaEvidence ?? null,\r\n leaseOwner,\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 } catch (error) {\r\n const releaseUrl = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/tasks/${encodeURIComponent(String(task.id))}/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 outcomes.push({\r\n taskId: task.id,\r\n started: false,\r\n error: (error as Error).message,\r\n released: release.ok === true || (release.response as Record<string, unknown>)?.ok === true,\r\n releaseResponse: release.response ?? release,\r\n });\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: outcomes.filter((o) => o.started).length,\r\n outcomes,\r\n skipped: (result.skipped as Array<{ task: Record<string, unknown>; skipReason: string }>).map((d) => ({\r\n taskId: d.task.id,\r\n skipReason: d.skipReason,\r\n })),\r\n diskGate: result.diskGate,\r\n resourceGate: result.resourceGate,\r\n };\r\n if (pipeline) {\r\n return { ok: !outcomes.some((o) => !o.started), ...summary };\r\n }\r\n console.log(JSON.stringify(summary, null, 2));\r\n if (outcomes.some((o) => !o.started)) 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\nexport async function postJson(url: string, secret: string, body: unknown): Promise<PostJsonResult> {\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 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 const res = await fetch(url, {\r\n method: \"GET\",\r\n headers: buildHarnessCallbackHeaders(secret),\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", "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, 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 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 { listRunRecords, loadRun, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\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 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}\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}\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) {\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 envCap = process.env.KYNVER_MAX_WORKERS ? positiveInt(process.env.KYNVER_MAX_WORKERS, 0) || null : null;\r\n const configuredMaxWorkers =\r\n configuredMaxWorkersOverride !== undefined\r\n ? configuredMaxWorkersOverride\r\n : envCap ??\r\n (config.maxConcurrentWorkers !== undefined && config.maxConcurrentWorkers !== null\r\n ? positiveInt(config.maxConcurrentWorkers, 0) || null\r\n : null);\r\n return { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers };\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\nfunction isActiveHarnessWorker(worker: HarnessWorkerRecord): boolean {\r\n const status = computeWorkerStatus(worker);\r\n return status.alive && !status.finalResult && status.attention.state !== \"done\";\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 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 || !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 { perWorkerMemBytes, memReserveBytes, memUtilization, configuredMaxWorkers } = resolveResourceConfig(\r\n input.config,\r\n input.configuredMaxWorkersOverride,\r\n );\r\n\r\n const totalMemBytes = input.totalMemBytes ?? os.totalmem();\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 = computeAutoMaxWorkers(totalMemBytes, { perWorkerMemBytes, memReserveBytes, memUtilization });\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 let reason: string | null = null;\r\n if (slotsAvailable <= 0) {\r\n 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 autoCap,\r\n capacityWorkers: capacityFromTotal,\r\n maxConcurrentWorkers,\r\n activeWorkers,\r\n slotsAvailable,\r\n reason,\r\n };\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, readdirSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { getHarnessPaths, 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 if (!existsSync(runsDir)) return [];\r\n const runs: HarnessRunRecord[] = [];\r\n for (const entry of readdirSync(runsDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) continue;\r\n const run = readJson<HarnessRunRecord | undefined>(\r\n path.join(runsDir, entry.name, \"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 { runsDir } = getPaths();\r\n return runDirPath(runsDir, safeSlug(id));\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\n/** Canonical harness root for CLI/workers. Server mirror: agent-os.harness-root.ts */\r\nexport function resolveHarnessRoot(): string {\r\n const env = process.env.KYNVER_HARNESS_ROOT || process.env.OPUS_HARNESS_ROOT;\r\n if (env) return resolveUserPath(env);\r\n const configured = loadUserConfig().harnessRoot?.trim();\r\n if (configured) return resolveUserPath(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 getHarnessPaths() {\r\n const harnessRoot = resolveHarnessRoot();\r\n return {\r\n harnessRoot,\r\n runsDir: path.join(harnessRoot, \"runs\"),\r\n worktreesDir: path.join(harnessRoot, \"worktrees\"),\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, readFileSync } from \"node:fs\";\r\nimport { safeJson } from \"./util.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 heartbeatBlocker: string | null;\r\n timestampAnomalies: ParsedHeartbeatTimestampAnomaly[];\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): string | null {\r\n if (!isTerminalHeartbeatPhase(heartbeat.lastHeartbeatPhase)) return null;\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 heartbeatBlocker: null,\r\n timestampAnomalies: [],\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 result.heartbeatBlocker = row.blocker ? String(row.blocker) : null;\r\n }\r\n return result;\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\") 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 === \"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", "// 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. Reserve \"command failed\" for ENOLOCK, network\r\n// errors, invalid JSON, and other tool failures.\r\n\r\nexport type ShellCommandOutcomeKind = \"success\" | \"audit_findings\" | \"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\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\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 (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", "// 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", "// Runtime mirror of server landing-contract gate (Dalton landing-only / target PRs).\r\n\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}\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\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 parseReconciliation(finalResult: unknown): TargetPrReconciliation[] {\r\n if (!finalResult || typeof finalResult !== \"object\" || Array.isArray(finalResult)) return [];\r\n const record = finalResult as Record<string, unknown>;\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\nfunction workerPrUrls(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 pr = normalizePrUrl(String((finalResult as Record<string, unknown>).prUrl ?? \"\"));\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 (!contract.landingOnly && contract.targetPrUrls.length === 0) {\r\n return { blocked: false };\r\n }\r\n if (!hasFinalResult(finalResult)) return { blocked: false };\r\n\r\n const reconciliation = parseReconciliation(finalResult);\r\n const byUrl = new Map(reconciliation.map((r) => [r.prUrl, r]));\r\n const targetSet = new Set(\r\n contract.targetPrUrls.map((u) => normalizePrUrl(u) ?? u).filter(Boolean),\r\n );\r\n const workerPrs = workerPrUrls(snapshot, finalResult);\r\n\r\n if (contract.landingOnly) {\r\n for (const pr of workerPrs) {\r\n if (targetSet.size > 0 && !targetSet.has(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 = 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} from \"./landing-contract-gate.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 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}\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 leaseOwner?: 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 /** 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 /** 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}\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}\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 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}): WorkerAttention {\r\n const now = Date.now();\r\n if (input.completionBlocker) {\r\n return { state: \"blocked\", reason: input.completionBlocker };\r\n }\r\n if (input.finalResult) {\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 // 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 resolveFinalResult(\r\n worker: HarnessWorkerRecord,\r\n parsedFinalResult: unknown,\r\n heartbeat: ReturnType<typeof parseHeartbeat>,\r\n): unknown {\r\n if (parsedFinalResult) return parsedFinalResult;\r\n const ackSnapshot = worker.completionSnapshot?.finalResult;\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 attention = computeAttention({\r\n alive,\r\n finalResult,\r\n firstEventAt: parsed.firstEventAt,\r\n stdoutBytes,\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,\r\n });\r\n const workerStatusLabel =\r\n completionBlocker || 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 };\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", "/** Enrich dispatch task metadata with `roleLane` when the board row omits it. */\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\nconst PERSONA_DEFAULT_LANE: Record<string, string> = {\r\n ghost: \"system\",\r\n astra: \"plan_author\",\r\n rhea: \"implementer\",\r\n mnemo: \"implementer\",\r\n sentinel: \"deep_reviewer\",\r\n pixel: \"implementer\",\r\n schema: \"implementer\",\r\n atlas: \"runtime_verifier\",\r\n bridge: \"implementer\",\r\n catalyst: \"implementer\",\r\n dalton: \"implementer\",\r\n lorentz: \"report_reviewer\",\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 if (persona && PERSONA_DEFAULT_LANE[persona]) {\r\n const base = PERSONA_DEFAULT_LANE[persona];\r\n if (persona === \"lorentz\" && (combined.includes(\"deep\") || combined.includes(\"security\"))) {\r\n return \"deep_reviewer\";\r\n }\r\n return base;\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 { 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\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 { loadUserConfig, type KynverUserConfig } from \"./config.js\";\r\nimport { CLAUDE_DEFAULT_MODEL } from \"./providers/claude.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`). */\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}\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 \"claude\";\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 return \"claude\";\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 (\r\n ref.includes(\"cursor\") ||\r\n ref.includes(\"codex\") ||\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\r\n // Landing / merge hygiene \u2192 Haiku on Claude.\r\n if (ref.includes(\"landing\") || title.startsWith(\"land:\") || title.includes(\" merge\")) {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"lane:landing\",\r\n };\r\n }\r\n\r\n // Reviews \u2014 Sonnet unless explicitly deep/security.\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 { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:deep_review\" };\r\n }\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"lane:review\" };\r\n }\r\n\r\n // Planning / strategy \u2192 Opus when the lane truly needs it.\r\n if (isOpusLane(ref, title) || roleLane === \"plan_author\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"lane:planning\" };\r\n }\r\n\r\n if (priority === \"critical\") {\r\n return { model: \"claude-opus-4-7\", provider: \"claude\", rule: \"priority:critical\" };\r\n }\r\n if (priority === \"high\") {\r\n return { model: \"claude-sonnet-4-6\", provider: \"claude\", rule: \"priority:high\" };\r\n }\r\n if (priority === \"low\") {\r\n return {\r\n model: \"claude-haiku-4-5-20251001\",\r\n provider: \"claude\",\r\n rule: \"priority:low\",\r\n };\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 task?: Record<string, unknown>;\r\n}): ModelRoutingDecision {\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) return providerAlias;\r\n\r\n return {\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\r\n if (input.task && Object.keys(input.task).length > 0) {\r\n const inferred = inferModelRoutingFromTask(input.task);\r\n return {\r\n ...inferred,\r\n requestedModel: inferred.model,\r\n };\r\n }\r\n\r\n const model = resolveGlobalDefaultModel();\r\n return {\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/** 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", "/** 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 3). */\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, 3),\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\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 leaseOwner = `kynver-harness:${runId}`;\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 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 { leaseOwner, leaseDurationMs },\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", "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 { resolveWorkerProvider } from \"./providers/registry.js\";\r\nimport type { HarnessRunRecord } from \"./run-store.js\";\r\nimport type {\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\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 personaMarkdown?: string | null;\r\n personaSlug?: string | null;\r\n personaEvidence?: PersonaContextEvidenceSnapshot | null;\r\n leaseOwner?: 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}\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 || \"claude\",\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 });\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 branch = 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 git(run.repo, [\"worktree\", \"add\", \"-b\", branch, worktreePath, run.baseCommit], { throwError: true });\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 personaMarkdown: opts.personaMarkdown,\r\n model: launchModel,\r\n });\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 }\r\n\r\n const model = resolveModelFallback(started.model, launchModel, provider.defaultModel);\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.leaseOwner ? { leaseOwner: String(opts.leaseOwner) } : {}),\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 ...(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 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", "export 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 /** When set, Haiku/compact models get a shorter harness instruction block. */\r\n model?: 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: run `node scripts/agent-os-pr-merge-gate.mjs --pr <url> --agent-os-id <id>` (or `verify-pr-local.mjs --from-pr` + `collect-pr-vercel-evidence.mjs` + 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).\",\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`) and Vercel preview evidence before GitHub Actions.\",\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/vercel payloads.\",\r\n \"- Request the final Actions run only when local + Vercel are 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 ];\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.\",\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.\",\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.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 \"Task:\",\r\n input.task,\r\n ].join(\"\\n\");\r\n}\r\n", "import { closeSync, existsSync, openSync } from \"node:fs\";\r\nimport { spawn, type StdioOptions } from \"node:child_process\";\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\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\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 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 closeSync(stdoutFd);\r\n closeSync(stderrFd);\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", "import { loadUserConfig } from \"../config.js\";\r\nimport { claudeProvider } from \"./claude.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 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 configured = (name || loadUserConfig().workerProvider || \"claude\").trim();\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", "// 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 { hasCompletionAck } from \"./completion-ack.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\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 return {\r\n run: String(raw.run || \"\"),\r\n name: String(raw.name || \"\"),\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 (hasCompletionAck(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 (hasCompletionAck(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\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 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 hasCompletionAck,\r\n persistCompletionAck,\r\n type CompletionAckFields,\r\n} from \"./completion-ack.js\";\r\nimport { persistCompletionAcknowledged } from \"./worker-lifecycle.js\";\r\nimport {\r\n isPidAlive,\r\n killWorkerProcess,\r\n readJson,\r\n required,\r\n safeJson,\r\n safeSlug,\r\n sleepMs,\r\n tailFile,\r\n writeJson,\r\n} from \"./util.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 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\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 worker = loadWorker(String(args.run), String(args.name));\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 (!agentOsId) {\r\n return { ok: false, reason: \"missing agentOsId\" };\r\n }\r\n if (!isFinishedWorkerStatus(status)) {\r\n return { ok: true, skipped: true, reason: \"worker-not-finished\" };\r\n }\r\n\r\n const forceReplay = args.force === true || args.force === \"true\";\r\n if (!forceReplay && hasCompletionAck(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\r\n if (worker.localOnly) {\r\n return { ok: true, skipped: true, reason: \"local-only-worker\" };\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 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 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 = applyPrHandoffToStatus(status, handoff);\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 startedAt: worker.startedAt,\r\n finishedAt: status.lastActivityAt || new Date().toISOString(),\r\n status: 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 },\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 worker = loadWorker(String(args.run), String(args.name));\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 (!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 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\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 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 worker = loadWorker(String(args.run), String(args.name));\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\nexport function buildRunBoard(runId: string): Record<string, unknown> {\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 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 completionBlocker = typeof rawBlocker === \"string\" && rawBlocker ? rawBlocker : undefined;\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 const board = {\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 writeJson(path.join(runDirectory(run.id), \"last-board.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\nexport function runStatus(args: Record<string, string | boolean>): void {\r\n const board = buildRunBoard(String(args.run));\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 worker = loadWorker(String(args.run), String(args.name));\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 worker = loadWorker(String(args.run), String(args.name));\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\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]);\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 taskStatus = task ? asString(task.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 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\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([\"lorentz\", \"sentinel\"]);\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}): 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 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\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 baseRef,\r\n exec,\r\n worker: input.worker,\r\n snapshot,\r\n });\r\n\r\n if (!requirement.required) {\r\n return { ok: true, prUrl: prUrlHint ?? undefined };\r\n }\r\n\r\n if (prUrlHint) {\r\n return { ok: true, prUrl: prUrlHint };\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 existing = findOpenPrUrl(snapshot.worktreePath, repo, snapshot.branch, exec);\r\n if (existing) {\r\n return {\r\n ok: true,\r\n prUrl: existing,\r\n headCommit: snapshot.headCommit ?? resolveHeadCommit(snapshot.worktreePath, exec) ?? undefined,\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\nexport function completionSnapshotFromStatus(\r\n status: RawHarnessWorkerStatus,\r\n): CompletionSnapshot {\r\n const summary =\r\n typeof status.lastHeartbeatSummary === \"string\" ? status.lastHeartbeatSummary : null;\r\n return {\r\n finalResult: status.finalResult ?? 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 { 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 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 { 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 { 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 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 { publishHarnessBoardSnapshot } from \"./worker-ops.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 leaseOwner = `kynver-harness:${run.id}`;\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<Record<string, unknown>>(\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 as never);\r\n if (status.alive) continue;\r\n if (status.finalResult || worker.completionReportedAt) continue;\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, leaseOwner, 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, 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 { listRunIds, readJson, 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 function createRun(args: Record<string, string | boolean>): void {\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 console.log(JSON.stringify({ runId: id, runDir: dir, repo, base, baseCommit }, null, 2));\r\n}\r\n\r\nexport function listRuns(): void {\r\n const { runsDir } = getPaths();\r\n const rows = listRunIds(runsDir)\r\n .map((id) => readJson<Record<string, unknown>>(path.join(runDirectory(id), \"run.json\"), undefined))\r\n .filter(Boolean)\r\n .map((run) => ({\r\n id: run!.id,\r\n name: run!.name,\r\n status: run!.status,\r\n repo: run!.repo,\r\n createdAt: run!.createdAt,\r\n }));\r\n console.log(JSON.stringify(rows, null, 2));\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 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 path from \"node:path\";\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\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\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 { 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\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 worker = loadWorker(String(args.run), String(args.name));\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 } from \"./config.js\";\r\nimport { postJson } from \"./callbacks.js\";\r\nimport { runPipelineDispatch } from \"./pipeline-dispatch.js\";\r\nimport { resolvePipelineMaxStarts } 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 { 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 { hasCompletionAck } from \"./completion-ack.js\";\r\nimport type { HarnessWorkerRecord } from \"./status.js\";\r\nimport { fetchWorkspaceRuntimePreferences } from \"./workspace-runtime-config.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\n\r\nexport interface PipelineTickResult {\r\n runId: string;\r\n agentOsId: string;\r\n execute: boolean;\r\n resourceGate: 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 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 (hasCompletionAck(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): 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 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 packageVersions,\r\n });\r\n return { ok: res.ok, httpStatus: res.status, response: res.response };\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 resourceGate = observeRunnerResourceGate({\r\n runId,\r\n configuredMaxWorkersOverride: workspacePrefs?.maxConcurrentWorkers,\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 operatorTick = await postOperatorTick(agentOsId, runId, resourceGate, args);\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 // 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 harnessCleanup = isPipelineCleanupEnabled() ? runPipelineHarnessCleanup(runId) : undefined;\r\n const planProgressSync = await syncActiveWorkerPlanProgress(runId, args);\r\n\r\n const maxStartsAdvice = resolvePipelineMaxStarts(resourceGate, 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 if (execute && maxStarts > 0) {\r\n dispatch = await runPipelineDispatch(\r\n {\r\n ...args,\r\n run: runId,\r\n agentOsId,\r\n },\r\n maxStarts,\r\n );\r\n } else {\r\n dispatch = {\r\n ok: true,\r\n skipped: true,\r\n reason: execute ? resourceGate.reason ?? \"no slots or queued work\" : \"execute disabled\",\r\n maxStarts: 0,\r\n };\r\n }\r\n\r\n const startedCount = (dispatch as { startedCount?: number })?.startedCount ?? 0;\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 leaseRenewal,\r\n completedWorkers,\r\n staleReconcile,\r\n harnessCleanup,\r\n planProgressSync,\r\n completionAckSync,\r\n operatorTick,\r\n sweep,\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\nfunction 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 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", "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}\r\n\r\nexport interface ResolvePipelineMaxStartsResult {\r\n maxStarts: number;\r\n underutilized: boolean;\r\n advisedStarts: number | null;\r\n boardAdvancedThisTick: 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\n/**\r\n * Merge runner slot budget with server dispatch-floor advice from the operator tick.\r\n * Never collapse to zero starts when the server reports underutilization with capacity.\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 =\r\n typeof dispatch?.recommendedMaxStarts === \"number\"\r\n ? Math.max(0, dispatch.recommendedMaxStarts)\r\n : null;\r\n\r\n let maxStarts = resourceGate.slotsAvailable;\r\n if (advised !== null) {\r\n maxStarts = Math.min(maxStarts, advised);\r\n }\r\n\r\n const underutilized = dispatch?.underutilized === true;\r\n const boardAdvancedThisTick =\r\n typeof dispatch?.boardAdvancedThisTick === \"number\" ? dispatch.boardAdvancedThisTick : 0;\r\n\r\n if (underutilized && resourceGate.slotsAvailable > 0 && maxStarts === 0) {\r\n const ready =\r\n dispatch?.actionableReady ??\r\n dispatch?.queuedTasks ??\r\n (boardAdvancedThisTick > 0 ? boardAdvancedThisTick : 1);\r\n maxStarts = Math.min(resourceGate.slotsAvailable, Math.max(1, ready));\r\n }\r\n\r\n return {\r\n maxStarts: Math.max(0, maxStarts),\r\n underutilized,\r\n advisedStarts: advised,\r\n boardAdvancedThisTick,\r\n };\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 { computeWorkerStatus, STALE_MS, type HarnessWorkerRecord } from \"./status.js\";\r\nimport { isPidAlive, killWorkerProcess, readJson, safeSlug } from \"./util.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}\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 if (staleReconcileDisabled()) {\r\n return { workers: [], finalizedRuns: finalizeStaleRuns() };\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 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 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 return { workers: outcomes, finalizedRuns: finalizeStaleRuns() };\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 console.log(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n workers: { markedExited, killedStale, skipped, total: result.workers.length },\r\n finalizedRuns: result.finalizedRuns.length,\r\n details: { workers: result.workers, finalizedRuns: result.finalizedRuns },\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 { 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 = Object.keys(run.workers || {});\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 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 } from \"./config.js\";\r\n\r\nexport interface WorkspaceRuntimePreferences {\r\n maxConcurrentWorkers: number | null;\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 path from \"node:path\";\r\nimport { resolveUserPath } from \"./path-values.js\";\r\nimport { getHarnessPaths, 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 { skipNodeModulesRemoval, skipWorktreeRemoval, type WorktreeGuardSkip } from \"./cleanup-guards.js\";\r\nimport { removeNodeModules, removeWorktree, isHarnessNodeModulesPath } from \"./cleanup-execute.js\";\r\nimport { scanNodeModulesCandidates, scanWorktreeCandidates } from \"./cleanup-scan.js\";\r\nimport { buildWorktreeIndex } 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\n\r\nfunction resolvePaths(options: HarnessCleanupOptions = {}) {\r\n const harnessRoot = options.harnessRoot\r\n ? resolveUserPath(options.harnessRoot)\r\n : resolveHarnessRoot();\r\n const { worktreesDir } = options.harnessRoot\r\n ? { worktreesDir: path.join(harnessRoot, \"worktrees\") }\r\n : getHarnessPaths();\r\n const now = options.now ?? Date.now();\r\n return { harnessRoot, worktreesDir, 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(candidate: CleanupCandidate, accountBytes: boolean): CleanupCandidate {\r\n if (!accountBytes || candidate.bytes != null) return candidate;\r\n return { ...candidate, bytes: directorySizeBytes(candidate.path) };\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\nexport function runHarnessCleanup(options: HarnessCleanupOptions = {}): HarnessCleanupSummary {\r\n const retention = resolveHarnessRetention(options);\r\n const paths = resolvePaths(options);\r\n const finalizedRuns = retention.finalizeStaleRuns\r\n ? finalizeStaleRuns().map((f) => ({ runId: f.runId, from: f.from, to: f.to }))\r\n : [];\r\n const index = buildWorktreeIndex();\r\n const scanOpts = {\r\n harnessRoot: paths.harnessRoot,\r\n worktreesDir: paths.worktreesDir,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n worktreesAgeMs: retention.worktreesAgeMs,\r\n includeOrphans: retention.includeOrphans,\r\n runIdFilter: retention.runIdFilter,\r\n index,\r\n now: paths.now,\r\n };\r\n const skips: HarnessCleanupSummary[\"skips\"] = [];\r\n const actions: CleanupAction[] = [];\r\n\r\n for (const raw of scanNodeModulesCandidates(scanOpts)) {\r\n const candidate = attachCandidateBytes(raw, retention.accountBytes);\r\n const pathSkip = isHarnessNodeModulesPath(candidate.path, paths.harnessRoot, paths.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 = path.resolve(candidate.path, \"..\");\r\n const indexed = index.get(worktreePath) ?? null;\r\n const guardReason = skipNodeModulesRemoval({\r\n indexed,\r\n includeOrphans: retention.includeOrphans,\r\n nodeModulesAgeMs: retention.nodeModulesAgeMs,\r\n ageMs: candidate.ageMs,\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(removeNodeModules(candidate, retention.execute));\r\n }\r\n\r\n for (const raw of scanWorktreeCandidates(scanOpts)) {\r\n const candidate = attachCandidateBytes(raw, retention.accountBytes);\r\n const indexed = index.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: paths.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 ageMs: candidate.ageMs,\r\n orphanSafety,\r\n worktreeRemovalGuard: options.worktreeRemovalGuard,\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(removeWorktree(candidate, retention.execute));\r\n }\r\n\r\n let candidateBytes = 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 } 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({ harnessRoot: paths.harnessRoot, now: paths.now })\r\n : undefined;\r\n\r\n return {\r\n harnessRoot: paths.harnessRoot,\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 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 };\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 { deriveTerminalRunStatus, TERMINAL_RUN_STATUSES } from \"./finalize.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport type { IndexedWorktree } from \"./cleanup-worktree-index.js\";\r\n\r\n/** True when the worker process is still live or marked running in worker.json. */\r\nexport function isWorkerProcessLive(indexed: IndexedWorktree): boolean {\r\n if (indexed.status.alive) return true;\r\n if (indexed.worker.status === \"running\") return true;\r\n return false;\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(indexed: IndexedWorktree): boolean {\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) return false;\r\n return deriveTerminalRunStatus(indexed.run) !== 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(indexed: IndexedWorktree): boolean {\r\n if (isWorkerProcessLive(indexed)) return true;\r\n if (indexed.worker.completionBlocker) return true;\r\n if (TERMINAL_RUN_STATUSES.has(indexed.run.status)) return false;\r\n if (isRunStaleActive(indexed)) return false;\r\n if (!isFinishedWorkerStatus(indexed.status)) return true;\r\n return deriveTerminalRunStatus(indexed.run) === null;\r\n}\r\n", "/** Strip generated install 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 pathPart !== \"node_modules\" && !pathPart.startsWith(\"node_modules/\");\r\n });\r\n}\r\n", "import 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 type { RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { isFinishedWorkerStatus } from \"./status.js\";\r\nimport { isWorkerProcessLive, runBlocksWorktreeRemoval } from \"./cleanup-run-liveness.js\";\r\nimport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\n\r\nexport { materialWorktreeChanges } from \"./cleanup-guards-helpers.js\";\r\n\r\nfunction 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/** Blocks whole-worktree removal when commits are not landed or tree is dirty. */\r\nexport function isPrOrUnmergedWork(status: RawHarnessWorkerStatus): boolean {\r\n if (prUrlFromFinalResult(status.finalResult)) return true;\r\n const relation = status.gitAncestry?.relation;\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\r\n/** `node_modules` can be reinstalled from git when porcelain is clean, even with an open PR branch. */\r\nfunction hasUnrestorableWorktreeChanges(status: RawHarnessWorkerStatus): boolean {\r\n if (materialWorktreeChanges(status.changedFiles).length > 0) return true;\r\n if (status.gitAncestry?.relation === \"diverged\") return true;\r\n return false;\r\n}\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 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}\r\n\r\nexport type WorktreeGuardSkip = CleanupSkipReason | { reason: CleanupSkipReason; detail?: string };\r\n\r\nexport function skipWorktreeRemoval(input: WorktreeGuardInput): WorktreeGuardSkip | null {\r\n const { indexed, includeOrphans, worktreesAgeMs, ageMs, orphanSafety, worktreeRemovalGuard } =\r\n input;\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 if (worktreesAgeMs <= 0 && !includeOrphans) return \"worktrees_disabled\";\r\n if (worktreesAgeMs > 0 && ageMs < worktreesAgeMs) return \"below_age_threshold\";\r\n if (isWorkerProcessLive(indexed)) return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (runBlocksWorktreeRemoval(indexed)) return \"run_still_active\";\r\n if (!isFinishedWorkerStatus(indexed.status)) return \"run_still_active\";\r\n if (isPrOrUnmergedWork(indexed.status)) return \"pr_or_unmerged_commits\";\r\n if (materialWorktreeChanges(indexed.status.changedFiles).length > 0) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked) return \"landing_blocked\";\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 function skipNodeModulesRemoval(input: NodeModulesGuardInput): CleanupSkipReason | null {\r\n const { indexed, includeOrphans, nodeModulesAgeMs, ageMs } = input;\r\n if (ageMs < nodeModulesAgeMs) return \"below_age_threshold\";\r\n if (!indexed) return includeOrphans ? null : \"orphan_without_flag\";\r\n if (isWorkerProcessLive(indexed)) return \"active_worker\";\r\n if (indexed.worker.completionBlocker) return \"completion_blocked\";\r\n if (!isFinishedWorkerStatus(indexed.status)) return \"run_still_active\";\r\n if (hasUnrestorableWorktreeChanges(indexed.status)) return \"dirty_worktree\";\r\n const landing = assessWorkerLanding({\r\n finalResult: indexed.status.finalResult,\r\n changedFiles: indexed.status.changedFiles,\r\n gitAncestry: indexed.status.gitAncestry,\r\n prUrl: prUrlFromFinalResult(indexed.status.finalResult),\r\n });\r\n if (landing.blocked && materialWorktreeChanges(indexed.status.changedFiles).length > 0) {\r\n return \"landing_blocked\";\r\n }\r\n return null;\r\n}\r\n", "import { existsSync, rmSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { git } from \"./git.js\";\r\nimport type { CleanupAction, CleanupCandidate, CleanupSkipReason } from \"./cleanup-types.js\";\r\nimport { directorySizeBytes } from \"./cleanup-dir-size.js\";\r\n\r\nexport function removeNodeModules(candidate: CleanupCandidate, execute: boolean): CleanupAction {\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 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\nexport function isHarnessNodeModulesPath(\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 nm = resolved.endsWith(`${path.sep}node_modules`) ? resolved : null;\r\n if (!nm) return \"path_outside_harness\";\r\n const rel = path.relative(worktreesDir, nm);\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] !== \"node_modules\") return \"path_outside_harness\";\r\n if (!resolved.startsWith(path.resolve(harnessRoot))) return \"path_outside_harness\";\r\n return null;\r\n}\r\n", "import { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\n/**\r\n * Best-effort directory size. Returns null when entry cap is exceeded (huge trees).\r\n */\r\nexport function directorySizeBytes(root: string, maxEntries = 50_000): number | null {\r\n if (!existsSync(root)) return 0;\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 { existsSync, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport type { CleanupCandidate } from \"./cleanup-types.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\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 path from \"node:path\";\r\nimport { listRunRecords, loadWorker, runDirectory, type HarnessRunRecord } from \"./run-store.js\";\r\nimport { computeWorkerStatus, type HarnessWorkerRecord, type RawHarnessWorkerStatus } from \"./status.js\";\r\nimport { readJson, safeSlug } from \"./util.js\";\r\n\r\nexport interface IndexedWorktree {\r\n worktreePath: string;\r\n runId: string;\r\n workerName: string;\r\n run: HarnessRunRecord;\r\n worker: HarnessWorkerRecord;\r\n status: RawHarnessWorkerStatus;\r\n}\r\n\r\nexport function buildWorktreeIndex(): Map<string, IndexedWorktree> {\r\n const index = new Map<string, IndexedWorktree>();\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 if (!worker?.worktreePath) continue;\r\n const status = computeWorkerStatus(worker, { base: run.base, baseCommit: run.baseCommit });\r\n index.set(path.resolve(worker.worktreePath), {\r\n worktreePath: path.resolve(worker.worktreePath),\r\n runId: run.id,\r\n workerName: name,\r\n run,\r\n worker,\r\n status,\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", "export type CleanupActionKind = \"remove_node_modules\" | \"remove_worktree\";\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 /** 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 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 dryRun: boolean;\r\n execute: boolean;\r\n nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\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}\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 (default), estimate candidate bytes in dry-run summaries. */\r\n accountBytes?: 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 /** 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", "import {\r\n DEFAULT_NODE_MODULES_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 nodeModulesAgeMs: number;\r\n worktreesAgeMs: number;\r\n includeOrphans: boolean;\r\n runIdFilter?: string;\r\n accountBytes: boolean;\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 worktreesAgeMs =\r\n options.worktreesAgeMs ??\r\n envMs(\"KYNVER_CLEANUP_WORKTREES_AGE_MS\", 0);\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\r\n return {\r\n execute,\r\n finalizeStaleRuns,\r\n nodeModulesAgeMs,\r\n worktreesAgeMs: worktreesAgeMs > 0 ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n runIdFilter: runIdFilter ? String(runIdFilter) : undefined,\r\n accountBytes,\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 finalizeStaleRuns: true,\r\n accountBytes: true,\r\n });\r\n}\r\n", "import { existsSync, statSync } 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 type { CleanupSkipReason } from \"./cleanup-types.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 heartbeatPath = path.join(\r\n input.harnessRoot,\r\n \"runs\",\r\n input.runId,\r\n \"workers\",\r\n input.workerName,\r\n \"heartbeat.jsonl\",\r\n );\r\n try {\r\n const mtime = statSync(heartbeatPath).mtimeMs;\r\n if (now - mtime < heartbeatFreshMs) return \"active_worker\";\r\n } catch {\r\n // No heartbeat \u2014 fine, orphan is fully detached.\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 // No upstream and no origin/main reference reachable \u2014 be conservative.\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, readdirSync, statSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { 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 = opts.harnessRoot ?? resolveHarnessRoot();\r\n const worktreesDir = path.join(harnessRoot, \"worktrees\");\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 { readFile } from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\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\nexport async function collectInstalledPackageVersions(\r\n observedAt: string = new Date().toISOString(),\r\n): Promise<InstalledPackageVersionMap> {\r\n const roots = moduleRoots();\r\n const out: InstalledPackageVersionMap = {};\r\n for (const packageName of MANAGED_PACKAGES) {\r\n for (const root of roots) {\r\n const packageJsonPath = path.join(root, packageName, \"package.json\");\r\n const version = await readVersion(packageJsonPath);\r\n if (!version) continue;\r\n out[packageName] = { version, observedAt, path: packageJsonPath };\r\n break;\r\n }\r\n }\r\n return out;\r\n}\r\n", "import { loadUserConfig } from \"./config.js\";\r\nimport { required, sleepMs } from \"./util.js\";\r\nimport { runPipelineTick } from \"./pipeline-tick.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\n\r\nexport async function runDaemon(args: Record<string, string | boolean>): Promise<void> {\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 console.error(JSON.stringify({ event: \"daemon_start\", runId, agentOsId, execute, intervalMs }));\r\n\r\n while (!stopping) {\r\n try {\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 sleepMs(backoff);\r\n } catch (error) {\r\n console.error(JSON.stringify({ event: \"daemon_tick_error\", error: (error as Error).message }));\r\n sleepMs(intervalMs);\r\n }\r\n }\r\n\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 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\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 provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : undefined;\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", "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. Does not serialize \u2014 parallel builds proceed when\r\n * the host has headroom.\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 assessBuildAdmission,\r\n registerBuildEnd,\r\n registerBuildStart,\r\n waitForBuildAdmission,\r\n type BuildAdmissionVerdict,\r\n} from \"./admission.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 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 NODE_OPTIONS heap cap, optional\r\n * systemd-run memory scope, and RAM-aware admission (parallel-safe).\r\n */\r\nexport function runBoundedBuildCheck(input: RunBoundedBuildCheckInput): BoundedBuildExecResult {\r\n const waitMs = input.waitForAdmissionMs ?? 600_000;\r\n const admission =\r\n waitMs > 0 ? waitForBuildAdmission(waitMs) : assessBuildAdmission();\r\n\r\n if (!admission.admitted) {\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 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 command: input.command,\r\n };\r\n } finally {\r\n registerBuildEnd();\r\n }\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 with memory-bounded subprocess execution.\r\n * Parallel worktrees remain allowed \u2014 each call admits by MemAvailable at start.\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 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 nodeModulesAgeMs = args.nodeModulesAgeMs\r\n ? Number(args.nodeModulesAgeMs)\r\n : DEFAULT_NODE_MODULES_AGE_MS;\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 nodeModulesAgeMs: Number.isFinite(nodeModulesAgeMs) ? nodeModulesAgeMs : DEFAULT_NODE_MODULES_AGE_MS,\r\n worktreesAgeMs: Number.isFinite(worktreesAgeMs) ? worktreesAgeMs : 0,\r\n includeOrphans,\r\n harnessRoot,\r\n });\r\n\r\n console.log(JSON.stringify(summary, null, 2));\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", "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 { 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\nfunction expectedLeaseOwner(runId: string): string {\r\n return `kynver-harness:${runId}`;\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 const expectedOwner = expectedLeaseOwner(worker.runId);\r\n\r\n if (worker.dispatched && taskLease) {\r\n if (taskLease.status === \"running\" && leaseOwner && leaseOwner !== expectedOwner) {\r\n return {\r\n health: \"orphaned\",\r\n reason: `task lease held by ${leaseOwner}, expected ${expectedOwner}`,\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 { 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 console.log(JSON.stringify({ monitorId, phase: \"tick\", ...tick }));\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", "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 path from \"node:path\";\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 let defaultRepoRemediation: string | undefined;\r\n if (!resolvedDefaultRepo) {\r\n defaultRepoRemediation =\r\n \"Run `kynver setup` from a Kynver checkout (auto-discovers repo) or `kynver setup --repo /path/to/Kynver`.\";\r\n } else if (!resolvedDefaultRepo.persistedInConfig) {\r\n defaultRepoRemediation =\r\n \"Run `kynver setup` (no --repo) to persist discovered defaultRepo in ~/.kynver/config.json.\";\r\n }\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: resolvedDefaultRepo ? \"pass\" : \"warn\",\r\n summary: resolvedDefaultRepo\r\n ? `${formatted!.defaultRepo} (${resolvedDefaultRepo.source}${resolvedDefaultRepo.persistedInConfig ? \"\" : \", not persisted\"})`\r\n : \"Not set (pass --repo on `kynver run create` or run `kynver setup` to auto-discover)\",\r\n remediation: defaultRepoRemediation,\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 assessVercelCli(probes: RuntimeTakeoverProbes): DoctorSection {\r\n const version = probes.vercelVersion();\r\n const whoami = probes.vercelWhoami();\r\n const installed = version.ok;\r\n\r\n return {\r\n id: \"vercel_cli\",\r\n label: \"Vercel CLI\",\r\n checks: [\r\n check({\r\n id: \"vercel_installed\",\r\n label: \"Vercel CLI installed\",\r\n status: installed ? \"pass\" : \"warn\",\r\n summary: installed ? version.stdout || \"vercel CLI found\" : version.error ?? \"vercel not found on PATH\",\r\n remediation: installed ? undefined : \"Install Vercel CLI (`npm i -g vercel`) for deploy evidence and env pulls.\",\r\n details: { stderr: version.stderr || null },\r\n }),\r\n check({\r\n id: \"vercel_authenticated\",\r\n label: \"Vercel CLI authenticated\",\r\n status: !installed ? \"warn\" : whoami.ok ? \"pass\" : \"warn\",\r\n summary: !installed\r\n ? \"Skipped \u2014 Vercel CLI not installed\"\r\n : whoami.ok\r\n ? `Authenticated as ${whoami.stdout}`\r\n : whoami.stderr || whoami.error || \"Not logged in\",\r\n remediation:\r\n installed && !whoami.ok ? \"Run `vercel login` and link the Kynver project if needed.\" : undefined,\r\n details: { account: whoami.ok ? whoami.stdout : null },\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 assessVercelCli(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 { 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 openclaw-cron bridge (`OPENCLAW_CRON_STORE_PATH`). */\r\n openclawCronStorePath?: 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 vercelVersion(): CommandProbeResult;\r\n vercelWhoami(): CommandProbeResult;\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(process.env.OPENCLAW_CRON_STORE_PATH?.trim()),\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 vercelVersion: () => captureCommand(\"vercel\", [\"--version\"]),\r\n vercelWhoami: () => captureCommand(\"vercel\", [\"whoami\"]),\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 openclaw-cron bridge (`OPENCLAW_CRON_STORE_PATH`). */\r\n openclawCronStorePath?: 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 hasLocalOpenClawDependency(\r\n env: RuntimeTakeoverSchedulerEnv,\r\n ctx: RuntimeTakeoverSchedulerContext,\r\n): boolean {\r\n return (\r\n env.kynverSchedulerProvider === \"kynver-cron\" ||\r\n env.kynverSchedulerProvider === \"openclaw-cron\" ||\r\n ctx.deploymentSchedulerProvider === \"kynver-cron\" ||\r\n ctx.deploymentSchedulerProvider === \"openclaw-cron\" ||\r\n Boolean(env.openclawCronStorePath)\r\n );\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 */\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 };\r\n\r\n if (hasQstashCutover(env, ctx) && !hasLocalOpenClawDependency(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 (hasLocalOpenClawDependency(env, ctx)) {\r\n const parts: string[] = [];\r\n if (env.kynverSchedulerProvider === \"openclaw-cron\") {\r\n parts.push(\"KYNVER_SCHEDULER_PROVIDER=openclaw-cron\");\r\n }\r\n if (ctx.deploymentSchedulerProvider === \"openclaw-cron\") {\r\n parts.push(\"deploymentSchedulerProvider=openclaw-cron in config\");\r\n }\r\n if (env.openclawCronStorePath) {\r\n parts.push(\"OPENCLAW_CRON_STORE_PATH set (local cron bridge)\");\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: `OpenClaw local cron still active (${parts.join(\"; \")})`,\r\n remediation:\r\n \"On the Kynver deployment: set KYNVER_SCHEDULER_PROVIDER=qstash with QSTASH_TOKEN configured. \" +\r\n \"On user runners: unset KYNVER_SCHEDULER_PROVIDER and OPENCLAW_CRON_STORE_PATH; set deploymentSchedulerProvider to qstash in ~/.kynver/config.json after Vercel env is updated.\",\r\n details: schedulerDetails,\r\n });\r\n }\r\n\r\n const runnerOpenclaw = env.kynverSchedulerProvider === \"openclaw-cron\";\r\n const runnerQstash = env.kynverSchedulerProvider === \"qstash\";\r\n const hostedDeployment = Boolean(env.qstashTokenPresent) || Boolean(env.kynverHostedDeployment);\r\n const daemonDispatchReady =\r\n Boolean(ctx.agentOsId?.trim()) &&\r\n Boolean(ctx.apiBaseUrl?.trim()) &&\r\n ctx.hasScopedRunnerToken;\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 deploymentNeedsQstash =\r\n hostedSchedulerProcess &&\r\n !env.qstashTokenPresent &&\r\n env.kynverSchedulerProvider !== \"qstash\";\r\n const deploymentOpenclaw =\r\n hostedSchedulerProcess && env.kynverSchedulerProvider === \"openclaw-cron\";\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. 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. 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 || deploymentNeedsQstash) {\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: deploymentOpenclaw\r\n ? \"Hosted deployment has KYNVER_SCHEDULER_PROVIDER=openclaw-cron \u2014 AgentOS scheduled ticks should use QStash\"\r\n : env.kynverSchedulerProvider\r\n ? `Hosted deployment without QSTASH_TOKEN (KYNVER_SCHEDULER_PROVIDER=${env.kynverSchedulerProvider}) \u2014 scheduler may fall back to openclaw-cron`\r\n : \"KYNVER_SCHEDULER_PROVIDER unset on hosted deployment; without QSTASH_TOKEN the server may fall back to openclaw-cron\",\r\n remediation:\r\n \"Set QSTASH_TOKEN and KYNVER_SCHEDULER_PROVIDER=qstash on the Kynver server. 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 (hostedDeployment && 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 (!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 { assessRuntimeTakeoverReadiness } from \"./runtime-takeover.js\";\r\n\r\nexport function runRuntimeTakeoverDoctorCli(): void {\r\n const report = assessRuntimeTakeoverReadiness();\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"],
5
+ "mappings": ";;;AACA,SAAS,aAAAA,YAAW,oBAAoB;AAExC,SAAS,iBAAAC,sBAAqB;;;ACH9B,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;;;ACFjB,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AACjB,SAAS,qBAAqB;;;ACH9B,SAAS,iBAAiB;;;ACA1B,SAAS,YAAY,WAAW,cAAc,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,MAAM,aAAa,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,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,OAAO,aAAa,MAAM,MAAM;AACtC,SAAO,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI;AACjD;AAEO,SAAS,cAAc,MAAkC;AAC9D,SAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,GAAG,MAAM,IAAI;AAC3D;AAEO,SAAS,WAAW,SAA2B;AACpD,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO,CAAC;AAClC,SAAO,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC,EAChD,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,UAAU,MAAM,IAAI;AAC9B;AAEO,SAAS,QAAQ,IAAkB;AACxC,UAAQ,KAAK,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE;AACjE;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;;;ACtIO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAoB,IAAI,IAAY,yBAAyB;AAGnE,IAAM,qBAAqB,CAAC,WAAW,UAAU;AAE1C,SAAS,wBAAwB,KAAsB;AAC5D,MAAI,kBAAkB,IAAI,GAAG,EAAG,QAAO;AACvC,SAAO,mBAAmB,KAAK,CAAC,WAAW,IAAI,SAAS,MAAM,CAAC;AACjE;AAMO,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;;;AFlDO,SAAS,IAAI,KAAa,MAAgB,UAAsB,CAAC,GAAW;AACjF,QAAM,MAAM,UAAU,OAAO,MAAM,EAAE,KAAK,UAAU,OAAO,CAAC;AAC5D,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,UAAU,OAAO,MAAM,EAAE,KAAK,UAAU,OAAO,CAAC;AAC5D,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;;;AG9KA,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,SAAO,SACJ,QAAQ,0BAA0B,GAAG,EACrC,QAAQ,2BAA2B,GAAG;AAC3C;AAGO,SAAS,gBAAgB,OAAuB;AACrD,SAAO,eAAe,KAAK;AAC7B;;;AJhBA,IAAM,uBAAuB,CAAC,UAAU,gBAAgB,eAAe,iBAAiB;AAExF,SAAS,gBAAgB,UAAiC;AACxD,QAAM,UAAUC,MAAK,KAAK,UAAU,cAAc;AAClD,MAAI,CAACC,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,gBAAgBF,MAAK,QAAQ,QAAQ;AAC3C,MAAI,CAACC,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,SAASD,MAAK,QAAQ,IAAI,IAAI;AAC5C;AAEA,SAAS,0BAA0B,YAAoB,YAAY,KAAoB;AACrF,MAAI,MAAMA,MAAK,QAAQ,cAAc,SAAS,CAAC;AAC/C,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,UAAM,UAAUA,MAAK,KAAK,KAAK,cAAc;AAC7C,QAAIC,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,SAASF,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,OAAOG,SAAQ;AACrB,aAAW,OAAO,sBAAsB;AACtC,kBAAc,MAAM,YAAY,gBAAgBH,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;;;ADzEA,IAAM,aAAaI,MAAK,KAAKC,SAAQ,GAAG,SAAS;AACjD,IAAM,cAAcD,MAAK,KAAK,YAAY,aAAa;AACvD,IAAM,mBAAmBA,MAAK,KAAK,YAAY,aAAa;AASrD,SAAS,iBAAmC;AACjD,MAAI,CAACE,YAAW,WAAW,EAAG,QAAO,CAAC;AACtC,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,aAAa,MAAM,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,eAAe,QAAgC;AAC7D,EAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,EAAAC,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;AAEA,SAAS,sBAA6C;AACpD,MAAI,CAACH,YAAW,gBAAgB,EAAG,QAAO,CAAC;AAC3C,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,kBAAkB,MAAM,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,oBAAoB,QAAqC;AAChE,EAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,EAAAC,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;AAWA,eAAsB,8BACpB,YACA,WACA,MACiB;AACjB,QAAM,aAAa,gCAAgC,YAAY,SAAS;AACxE,MAAI,WAAY,QAAO;AAEvB,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;AAAA,IACT,SAAS,OAAO;AACd,iBAAW,kCAAmC,MAAgB,OAAO,EAAE;AAAA,IACzE;AAAA,EACF;AAEA;AAAA,IACE;AAAA,EACF;AACF;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,gBACJ,OAAO,KAAK,eAAe,WACvB,KAAK,aACL,OAAO,KAAK,yBAAyB,WACnC,KAAK,uBACL;AACR,QAAM,SAA2B,qBAAqB;AAAA,IACpD,GAAG;AAAA,IACH,GAAG,iBAAiB,UAAU,IAAI;AAAA,IAClC,GAAI,gBAAgB,EAAE,sBAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,IAChG,gBAAgB,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW,SAAS,kBAAkB;AAAA,EACjG,CAAC;AACD,iBAAe,MAAM;AAErB,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,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,CAAC,OAAQ,YAAW,mDAAmD;AAC3E,aAAW,MAAM;AACjB,UAAQ,IAAI,KAAK,UAAU,EAAE,IAAI,MAAM,iBAAiB,gBAAgB,gBAAgB,EAAE,GAAG,MAAM,CAAC,CAAC;AACvG;;;AM/ZA,OAAOC,YAAU;;;ACCV,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;;;ACqCA,eAAsB,SAAS,KAAa,QAAgB,MAAwC;AAClG,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,4BAA4B,MAAM;AAAA,IAC3C,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,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,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,4BAA4B,MAAM;AAAA,EAC7C,CAAC;AACD,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;;;ACnGA,SAAS,cAAAC,mBAAkB;;;ACA3B,SAAS,cAAAC,aAAY,gBAAAC,eAAc,kBAAkB;AAe9C,IAAM,mCAAmC,KAAK,OAAO,OAAO;AAI5D,IAAM,uCAAuC,KAAK,OAAO,OAAO;AAEhE,IAAM,yBAAyB;AAuB/B,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;;;ADlJA,IAAM,0BAA0B,KAAK,OAAO,OAAO;AACnD,IAAM,8BAA8B,KAAK,OAAO,OAAO;AACvD,IAAM,2BAA2B;AACjC,IAAM,gCAAgC;AAc/B,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,QAAQC,YAAWD,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;;;AE5EA,OAAOE,SAAQ;;;ACAf,SAAS,gBAAAC,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;;;ADrBA,OAAOC,WAAU;;;AEFjB,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;AACxC,OAAOC,WAAU;;;ACDjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AAKjB,IAAM,cAAcC,MAAK,KAAKC,SAAQ,GAAG,aAAa,SAAS;AAGxD,SAAS,qBAA6B;AAC3C,QAAM,MAAM,QAAQ,IAAI,uBAAuB,QAAQ,IAAI;AAC3D,MAAI,IAAK,QAAO,gBAAgB,GAAG;AACnC,QAAM,aAAa,eAAe,EAAE,aAAa,KAAK;AACtD,MAAI,WAAY,QAAO,gBAAgB,UAAU;AACjD,QAAM,aAAaD,MAAK,KAAKC,SAAQ,GAAG,WAAW,SAAS;AAC5D,MAAIC,YAAW,UAAU,EAAG,QAAO;AACnC,MAAIA,YAAW,WAAW,EAAG,QAAO;AACpC,SAAO;AACT;AAEO,SAAS,kBAAkB;AAChC,QAAM,cAAc,mBAAmB;AACvC,SAAO;AAAA,IACL;AAAA,IACA,SAASF,MAAK,KAAK,aAAa,MAAM;AAAA,IACtC,cAAcA,MAAK,KAAK,aAAa,WAAW;AAAA,EAClD;AACF;AAEO,SAAS,OAAO,SAAiB,IAAoB;AAC1D,SAAOA,MAAK,KAAK,SAAS,SAAS,EAAE,CAAC;AACxC;;;ADfO,SAAS,WAAW;AACzB,SAAO,gBAAgB;AACzB;AAEO,SAAS,QAAQ,IAA8B;AACpD,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,SAAO,SAA2BG,MAAK,KAAK,OAAW,SAAS,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC;AAC5F;AAOO,SAAS,iBAAqC;AACnD,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,MAAI,CAACC,YAAW,OAAO,EAAG,QAAO,CAAC;AAClC,QAAM,OAA2B,CAAC;AAClC,aAAW,SAASC,aAAY,SAAS,EAAE,eAAe,KAAK,CAAC,GAAG;AACjE,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAM,MAAM;AAAA,MACVF,MAAK,KAAK,SAAS,MAAM,MAAM,UAAU;AAAA,MACzC;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,IACLA,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,QAAQ,IAAI,SAAS;AAC7B,SAAO,OAAW,SAAS,SAAS,EAAE,CAAC;AACzC;;;AElEA,SAAS,cAAAG,aAAY,gBAAAC,qBAAoB;AAkBzC,IAAM,2BAA2B;AAG1B,SAAS,yBAAyB,OAA2C;AAClF,SAAO,UAAU;AACnB;AAOO,SAAS,iCAAiC,WAA2C;AAC1F,MAAI,CAAC,yBAAyB,UAAU,kBAAkB,EAAG,QAAO;AACpE,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,kBAAkB;AAAA,IAClB,oBAAoB,CAAC;AAAA,EACvB;AACA,MAAI,CAACC,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,WAAO,mBAAmB,IAAI,UAAU,OAAO,IAAI,OAAO,IAAI;AAAA,EAChE;AACA,SAAO;AACT;;;ACxEA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;;;AC4BzC,IAAM,eAAe;AAErB,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;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,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;;;AD5LA,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,UAAW;AAChC,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,CAACC,YAAW,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;AAOO,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,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;;;AE7LA,IAAM,mBAAqC;AAAA,EACzC;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAGA,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;;;AC/DA,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;;;AC3EA,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;;;AC3CA,SAASC,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,oBAAoB,aAAgD;AAC3E,MAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,EAAG,QAAO,CAAC;AAC3F,QAAM,SAAS;AACf,QAAM,MAAM,OAAO,0BAA0B,OAAO;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,UAAUA,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;AAEA,SAAS,aAAa,UAAiC,aAAgC;AACrF,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,UAAM,KAAK,eAAe,OAAQ,YAAwC,SAAS,EAAE,CAAC;AACtF,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,MAAI,CAAC,SAAS,eAAe,SAAS,aAAa,WAAW,GAAG;AAC/D,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AACA,MAAI,CAACC,gBAAe,WAAW,EAAG,QAAO,EAAE,SAAS,MAAM;AAE1D,QAAM,iBAAiB,oBAAoB,WAAW;AACtD,QAAM,QAAQ,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7D,QAAM,YAAY,IAAI;AAAA,IACpB,SAAS,aAAa,IAAI,CAAC,MAAM,eAAe,CAAC,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,EACzE;AACA,QAAM,YAAY,aAAa,UAAU,WAAW;AAEpD,MAAI,SAAS,aAAa;AACxB,eAAW,MAAM,WAAW;AAC1B,UAAI,UAAU,OAAO,KAAK,CAAC,UAAU,IAAI,EAAE,GAAG;AAC5C,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,eAAe,MAAM,KAAK;AACtC,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;;;ACvIO,IAAM,cAAc;AACpB,IAAM,WAAW;AA2JjB,SAAS,iBAAiB,OAgBb;AAClB,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,MAAM,mBAAmB;AAC3B,WAAO,EAAE,OAAO,WAAW,QAAQ,MAAM,kBAAkB;AAAA,EAC7D;AACA,MAAI,MAAM,aAAa;AACrB,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;AAIhB,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,mBACP,QACA,mBACA,WACS;AACT,MAAI,kBAAmB,QAAO;AAC9B,QAAM,cAAc,OAAO,oBAAoB;AAC/C,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,YAAY,iBAAiB;AAAA,IACjC;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,UAAU;AAAA,IAC5B,WAAW,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,oBACJ,qBAAqB,UAAU,UAAU,YACrC,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,EACF;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;;;AXnYO,IAAM,+BAA+B,MAAM,OAAO;AAGlD,IAAM,4BAA4B,IAAI,OAAO,OAAO;AAGpD,IAAM,0BAA0B;AAGhC,IAAM,2BAA2B;AA4BxC,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;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,SAAS,QAAQ,IAAI,qBAAqB,YAAY,QAAQ,IAAI,oBAAoB,CAAC,KAAK,OAAO;AACzG,QAAM,uBACJ,iCAAiC,SAC7B,+BACA,WACC,OAAO,yBAAyB,UAAa,OAAO,yBAAyB,OAC1E,YAAY,OAAO,sBAAsB,CAAC,KAAK,OAC/C;AACV,SAAO,EAAE,mBAAmB,iBAAiB,gBAAgB,qBAAqB;AACpF;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;AAEA,SAAS,sBAAsB,QAAsC;AACnE,QAAM,SAAS,oBAAoB,MAAM;AACzC,SAAO,OAAO,SAAS,CAAC,OAAO,eAAe,OAAO,UAAU,UAAU;AAC3E;AAGA,SAAS,yBAAyB,KAA+B;AAC/D,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG;AACjD,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,EAAE,mBAAmB,iBAAiB,gBAAgB,qBAAqB,IAAI;AAAA,IACnF,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB,MAAM,iBAAiBC,IAAG,SAAS;AACzD,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,sBAAsB,eAAe,EAAE,mBAAmB,iBAAiB,eAAe,CAAC;AAC3G,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,MAAI,SAAwB;AAC5B,MAAI,kBAAkB,GAAG;AACvB,QAAI,iBAAiB,sBAAsB;AACzC,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,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AYrLA,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;AAEA,IAAM,uBAA+C;AAAA,EACnD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AACX;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,MAAI,WAAW,qBAAqB,OAAO,GAAG;AAC5C,UAAM,OAAO,qBAAqB,OAAO;AACzC,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;;;AClFA,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;AAOO,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;;;ADzIO,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;;;AErDO,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAapC,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,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,MACE,IAAI,SAAS,QAAQ,KACrB,IAAI,SAAS,OAAO,KACpB,IAAI,SAAS,UAAU,KACvB,IAAI,SAAS,SAAS,KACtB,aAAa,iBACb,aAAa,sBACb;AACA,WAAO,EAAE,UAAU,UAAU,MAAM,sBAAsB;AAAA,EAC3D;AAGA,MAAI,IAAI,SAAS,SAAS,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,SAAS,QAAQ,GAAG;AACpF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAAA,EACF;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,OAAO,mBAAmB,UAAU,UAAU,MAAM,mBAAmB;AAAA,IAClF;AACA,WAAO,EAAE,OAAO,qBAAqB,UAAU,UAAU,MAAM,cAAc;AAAA,EAC/E;AAGA,MAAI,WAAW,KAAK,KAAK,KAAK,aAAa,eAAe;AACxD,WAAO,EAAE,OAAO,mBAAmB,UAAU,UAAU,MAAM,gBAAgB;AAAA,EAC/E;AAEA,MAAI,aAAa,YAAY;AAC3B,WAAO,EAAE,OAAO,mBAAmB,UAAU,UAAU,MAAM,oBAAoB;AAAA,EACnF;AACA,MAAI,aAAa,QAAQ;AACvB,WAAO,EAAE,OAAO,qBAAqB,UAAU,UAAU,MAAM,gBAAgB;AAAA,EACjF;AACA,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,QAAQ,0BAA0B;AACxC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,uBAAuB,KAAK;AAAA,IACtC,MAAM;AAAA,EACR;AACF;AAGO,SAAS,oBAAoB,OAIX;AACvB,MAAI,MAAM,eAAe,KAAK,GAAG;AAC/B,UAAMC,SAAQ,MAAM,cAAc,KAAK;AACvC,UAAM,gBAAgB,4BAA4BA,QAAO,MAAM,gBAAgB;AAC/E,QAAI,cAAe,QAAO;AAE1B,WAAO;AAAA,MACL,OAAAA;AAAA,MACA,UAAU,MAAM,kBAAkB,KAAK,KAAK,uBAAuBA,MAAK;AAAA,MACxE,MAAM;AAAA,MACN,gBAAgBA;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,EAAE,SAAS,GAAG;AACpD,UAAM,WAAW,0BAA0B,MAAM,IAAI;AACrD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,QAAQ,0BAA0B;AACxC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,MAAM,kBAAkB,KAAK,KAAK,uBAAuB,KAAK;AAAA,IACxE,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB;AACF;AAGO,SAAS,qBACd,cACA,aACA,iBACQ;AACR,SAAO,gBAAgB,eAAe,mBAAmB,0BAA0B,KAAK;AAC1F;;;ACrMA,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;;;ACpBA,OAAOC,WAAU;AAejB,SAAS,aAAa,OAAe,MAA+C;AAClF,SAAO;AAAA,IACLC,MAAK,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,aAAa,kBAAkB,KAAK;AAE1C,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,MAAM,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,OAAO,MAAM,CAAC;AAClH,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,EAAE,YAAY,gBAAgB;AAAA,MAC9B,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;;;ACnGA,SAAS,cAAAC,cAAY,aAAAC,kBAAiB;AACtC,OAAOC,YAAU;;;ACDV,SAAS,YAAY,OAajB;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,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,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;AAAA,IACA,MAAM;AAAA,EACR,EAAE,KAAK,IAAI;AACb;;;AC1FA,SAAS,aAAAC,YAAW,cAAAC,cAAY,YAAAC,iBAAgB;AAChD,SAAS,SAAAC,cAAgC;AACzC,OAAOC,YAAU;;;ACFjB,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;AACxC,OAAOC,WAAU;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,MAAK,KAAK,WAAW,UAAU;AACpD,MAAI,CAACF,YAAW,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,MAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EAC9C;AAEA,SAAO;AACT;AAEO,SAAS,4BAA4B,WAInC;AACP,QAAM,OACJ,WAAW,KAAK,KAChBA,MAAK,KAAK,QAAQ,IAAI,gBAAgB,IAAI,cAAc;AAE1D,QAAM,aAAaA,MAAK,KAAK,MAAM,UAAU;AAC7C,QAAM,cAAcA,MAAK,KAAK,MAAM,UAAU;AAC9C,MAAIF,YAAW,UAAU,KAAKA,YAAW,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,MAAK,KAAK,YAAY,UAAU;AAChD,QAAM,UAAUA,MAAK,KAAK,YAAY,UAAU;AAChD,MAAI,CAACF,YAAW,OAAO,KAAK,CAACA,YAAW,OAAO,EAAG,QAAO;AAEzD,SAAO,EAAE,SAAS,SAAS,WAAW;AACxC;;;AD/CA,IAAM,uBAAuB;AAU7B,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;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,WAAWC,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,QAAQC;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,QACE,GAAG,YAAY;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AAAA,MACA,mBAAmB;AAAA,QACjB,KAAK,KAAK;AAAA,QACV,UAAU,YAAY;AAAA,QACtB,OAAO,YAAY;AAAA,QACnB;AAAA,QACA,KAAK,gBAAgB,UAAU,WAAW;AAAA,MAC5C,CAAC;AAAA,IACH;AACA,IAAAC,WAAU,QAAQ;AAClB,IAAAA,WAAU,QAAQ;AAElB,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;;;AE3IA,IAAM,UAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAI,mBAA0C;AAOvC,SAAS,sBAAsB,MAA+B;AACnE,MAAI,iBAAkB,QAAO;AAC7B,QAAM,cAAc,QAAQ,eAAe,EAAE,kBAAkB,UAAU,KAAK;AAC9E,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;;;ACLA,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAAC,cAAY,YAAAC,WAAU,aAAAC,kBAAiB;AAEhD,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;;;ACbvB,SAAS,iBAAiB,QAAsC;AACrE,SAAO,QAAQ,OAAO,sBAAsB,KAAK,CAAC;AACpD;AAEO,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;;;AC1BA,OAAOC,YAAU;;;ACiBjB,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;AACF,CAAC;AAOM,SAAS,mCACd,QACkC;AAClC,QAAM,SAAS,SAAS,MAAM;AAC9B,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,cAAc,MAAM,cAAc,OAAO,QAAQ,KAAK;AAAA,EACjE;AACA,QAAM,UAAU,SAAS,OAAO,OAAO;AACvC,QAAM,SAAS,SAAS,OAAO,MAAM,KAAK,SAAS,OAAO,KAAK;AAC/D,QAAM,OAAO,SAAS,OAAO,IAAI;AACjC,QAAM,aAAa,OAAO,SAAS,KAAK,MAAM,IAAI;AAClD,QAAM,eACH,YAAY,QAAQ,kBAAkB,IAAI,OAAO,KAClD,eAAe,qBACf,eAAe;AACjB,SAAO;AAAA,IACL,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAAoD;AAC1F,SAAO,QAAQ;AACjB;;;AC7DA,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;;;ACrCA,IAAM,mBAAmB;AAGzB,IAAM,uBAAuB,oBAAI,IAAI,CAAC,WAAW,UAAU,CAAC;AAE5D,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,OAiBlB;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,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;;;ACrLA,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;;;ADjBA,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;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;AAAA,IACA;AAAA,IACA,QAAQ,MAAM;AAAA,IACd;AAAA,EACF,CAAC;AAED,MAAI,CAAC,YAAY,UAAU;AACzB,WAAO,EAAE,IAAI,MAAM,OAAO,aAAa,OAAU;AAAA,EACnD;AAEA,MAAI,WAAW;AACb,WAAO,EAAE,IAAI,MAAM,OAAO,UAAU;AAAA,EACtC;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,WAAW,cAAc,SAAS,cAAc,MAAM,SAAS,QAAQ,IAAI;AACjF,MAAI,UAAU;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,YAAY,SAAS,cAAc,kBAAkB,SAAS,cAAc,IAAI,KAAK;AAAA,IACvF;AAAA,EACF;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;;;ACrMO,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,SAASC,UAAS,OAAgD;AAChE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEO,SAAS,kCAAkC,aAAgC;AAChF,QAAM,SAASA,UAAS,WAAW;AACnC,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,SAASA,UAAS,OAAO,eAAe;AAC9C,QAAM,aAAa,WAAW,QAAQ,0BAA0B;AAChE,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO,WAAW,OAAO,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;;;ACrIA,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;AAEO,SAAS,6BACd,QACoB;AACpB,QAAM,UACJ,OAAO,OAAO,yBAAyB,WAAW,OAAO,uBAAuB;AAClF,SAAO;AAAA,IACL,aAAa,OAAO,eAAe,WAAW;AAAA,IAC9C;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,MACbC,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;;;AVhFA,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,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;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,SAAS,WAAW,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,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,WAAW;AACd,WAAO,EAAE,IAAI,OAAO,QAAQ,oBAAoB;AAAA,EAClD;AACA,MAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,WAAO,EAAE,IAAI,MAAM,SAAS,MAAM,QAAQ,sBAAsB;AAAA,EAClE;AAEA,QAAM,cAAc,KAAK,UAAU,QAAQ,KAAK,UAAU;AAC1D,MAAI,CAAC,eAAe,iBAAiB,MAAM,GAAG;AAC5C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,OAAO,WAAW;AACpB,WAAO,EAAE,IAAI,MAAM,SAAS,MAAM,QAAQ,oBAAoB;AAAA,EAChE;AAEA,QAAM,aACJ,OAAO,YAAY,yBAAyB,SAAS,OAAO,YAAY,OACpE,OAAO,YAAY,OACnB,OAAO;AACb,QAAM,UAAU,gCAAgC;AAAA,IAC9C,cAAc,OAAO;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB,OAAO,OAAO;AAAA,IACd;AAAA,IACA,4BAA4B,OAAO;AAAA,EACrC,CAAC;AACD,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAMC,UAAS,QAAQ,UAAU,gCAAgC,QAAQ,KAAK;AAC9E,6BAAyB,QAAQA,OAAM;AACvC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAAA;AAAA,MACA,YACE;AAAA,MACF,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,gBAAgB,KAAK,kBAAkB,QAAQ,KAAK,kBAAkB;AAC5E,MAAI,CAAC,iBAAiB,OAAO,cAAc,QAAQ;AACjD,UAAMC,WAAU,qBAAqB,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC5D,QAAI,CAACA,SAAQ,IAAI;AACf,+BAAyB,QAAQA,SAAQ,MAAM;AAC/C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQA,SAAQ;AAAA,QAChB,YAAYA,SAAQ;AAAA,QACpB,mBAAmB;AAAA,MACrB;AAAA,IACF;AACA,QAAIA,SAAQ,SAASA,SAAQ,YAAY;AACvC,eAAS,uBAAuB,QAAQA,QAAO;AAAA,IACjD;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,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC5D,QAAQ;AAAA,IACR,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,IAC7C;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,YAAMF,UAAS,mDAAmDE,OAAM;AACxE,+BAAyB,QAAQF,OAAM;AACvC,YAAMG,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,QAAAH;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,SAAS,WAAW,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,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,WAAW;AACd,cAAQ,MAAM,oFAAoF;AAClG,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,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;AAEA,UAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,YAAQ;AAAA,MACN,KAAK;AAAA,QACH;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,UACd;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,SAAS,WAAW,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,QAAM,MAAM,QAAQ,OAAO,KAAK;AAChC,QAAM,SAAS,oBAAoB,QAAQ,oBAAoB,GAAG,CAAC;AACnE,YAAUI,OAAK,KAAK,OAAO,WAAW,kBAAkB,GAAG,MAAM;AACjE,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;AAEO,SAAS,cAAc,OAAwC;AACpE,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,QAAQ,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAC3C,QAAM,UAAU,MAAM,IAAI,CAAC,SAAS;AAClC,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,UAAM,SAAS,oBAAoB,QAAiB;AAAA,MAClD,MAAM,IAAI;AAAA,MACV,YAAY,IAAI;AAAA,IAClB,CAAC;AACD,UAAM,aACJ,OAAO,YAAY,yBAAyB,SAAS,OAAO,YAAY,OACpE,OAAO,YAAY,OACnB;AACN,UAAM,gBAAgB,0BAA0B;AAAA,MAC9C,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB;AAAA,IACF,CAAC;AAKD,UAAM,aAAa,OAAO;AAC1B,UAAM,oBAAoB,OAAO,eAAe,YAAY,aAAa,aAAa;AACtF,UAAM,cAAc,oBAAoB,YAAY,OAAO;AAC3D,UAAM,iBAAiB,oBAAoB,YAAY,OAAO,UAAU;AACxE,UAAM,qBAAqBN,UAAS,OAAO,kBAAkB;AAC7D,UAAM,iBAAiBA,UAAS,oBAAoB,IAAI;AACxD,UAAM,oBAAoBC,UAAS,oBAAoB,OAAO;AAC9D,UAAM,wBAAwBA,UAAS,oBAAoB,MAAM;AACjE,UAAM,qBAAqB,MAAM,QAAQ,oBAAoB,QAAQ,IACjE,mBAAmB,SAAS,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,IACnG,CAAC;AACL,UAAM,QAAQA,UAAS,gBAAgB,KAAK,KAAKA,UAAS,oBAAoB,KAAK;AACnF,UAAM,uBAAuBA,UAAS,OAAO,oBAAoB;AACjE,UAAM,iBAAiB,qBAAqB;AAAA,MAC1C,UAAU,uBAAuB,MAAM;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,aAAa,iBAAiB;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,uBAAuB,MAAM;AAAA,IACzC,CAAC;AACD,UAAM,eAAe,mBAAmB;AAAA,MACtC,cAAc,OAAO;AAAA,MACrB;AAAA,MACA,OAAO,SAAS;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,iBAAiB,qBAAqB,OAAO,UAAU;AAAA,MACvD,gBAAgB,OAAO,cACnB,mBAAmB,qBAAqB,mBAAmB,YAC3D;AAAA,MACJ,0BAA0B,CAAC,OAAO,eAAe,CAAC,OAAO;AAAA,MACzD,cAAc,eAAe,cAAc,kBAAkB;AAAA,MAC7D,eAAe,eAAe,cAAc,cAAc,kBAAkB;AAAA,MAC5E,KAAK,OAAO;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,gBAAgB,OAAO;AAAA,MACvB,oBAAoB,OAAO;AAAA,MAC3B,sBAAsB,OAAO;AAAA,MAC7B,kBAAkB,OAAO;AAAA,MACzB,kBAAkB,OAAO,aAAa;AAAA,MACtC,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO,UAAU;AAAA,MACzB,QAAQ,OAAO,UAAU;AAAA,MACzB,8BACE,OAAO,OAAO,iCAAiC,WAC3C,OAAO,+BACP;AAAA,MACN,6BAA6B,MAAM;AACjC,cAAM,MAAM,OAAO;AACnB,YAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,cAAM,QAAS,IAA0C;AACzD,eAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS;AAAA,MAC/C,GAAG;AAAA,MACH,YAAY,OAAO,cAAc;AAAA,MACjC,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,MACzD,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,MAC3E,gBAAgB,OAAO,OAAO,mBAAmB,WAAW,OAAO,iBAAiB;AAAA,MACpF;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA,mBAAmB,OAAO,qBAAqB;AAAA,MAC/C;AAAA,MACA,wBAAwB;AAAA,MACxB;AAAA,MACA,mBAAmB,qBAAqB;AAAA,MACxC,YAAY;AAAA,QACV,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,MAClB;AAAA,MACA,iBAAiB,OAAO,eAAe,OAAO;AAAA,MAC9C,eAAe,qBAAqB,OAAO,SAAS;AAAA,MACpD;AAAA,MACA,UAAU,OAAO,YAAY;AAAA,MAC7B,iBAAiB,OAAO,YAAY;AAAA,IACtC;AAAA,EACF,CAAC;AACD,QAAM,QAAQ;AAAA,IACZ,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,YAAUK,OAAK,KAAK,aAAa,IAAI,EAAE,GAAG,iBAAiB,GAAG,KAAK;AACnE,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;AAEO,SAAS,UAAU,MAA8C;AACtE,QAAM,QAAQ,cAAc,OAAO,KAAK,GAAG,CAAC;AAC5C,UAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C;AAEO,SAAS,WAAW,MAA8C;AACvE,QAAM,SAAS,WAAW,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,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,SAAS,WAAW,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,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;;;AFviBA,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,IAAI,KAAK,KAAK;AAO3C,IAAM,4BAA4B;AAClC,IAAM,8BAA8B;AAwBpC,SAAS,SAAS,KAAyD;AACzE,SAAO;AAAA,IACL,KAAK,OAAO,IAAI,OAAO,EAAE;AAAA,IACzB,MAAM,OAAO,IAAI,QAAQ,EAAE;AAAA,IAC3B,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,iBAAiB,MAAM,GAAG;AAC5B,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,iBAAiB,MAAM,GAAG;AAC5B,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;;;ALpRO,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,EACzB,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,SAAS,KAAK,UAAU,SAAS,IAAI,EAAE,IAAI,IAAI;AACrD,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,IAAI,MAAM,CAAC,YAAY,OAAO,MAAM,QAAQ,cAAc,IAAI,UAAU,GAAG,EAAE,YAAY,KAAK,CAAC;AAEnG,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,iBAAiB,KAAK;AAAA,IACtB,OAAO;AAAA,EACT,CAAC;AAED,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;AAEA,QAAM,QAAQ,qBAAqB,QAAQ,OAAO,aAAa,SAAS,YAAY;AACpF,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,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,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,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;;;AkB5RA,SAAS,kBAAkB;AAGpB,SAAS,aAAa,MAAsB;AACjD,QAAM,aAAa,KAAK,QAAQ,SAAS,IAAI,EAAE,QAAQ;AACvD,SAAO,WAAW,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,SAAO,WAAW,QAAQ,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,KAAK;AAClE;;;ACXO,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;;;ACFA,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,YAAMG,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;;;AChMA,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,gBAAe;AACxB,OAAOC,YAAU;AAEV,SAAS,yBAAiC;AAC/C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAOA,OAAK,QAAQ,GAAG;AAChC,SAAOA,OAAK,KAAKD,SAAQ,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;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,cAAa,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,cAAa,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;;;AlDpBO,IAAM,4BAA4B,KAAK,KAAK;AAa5C,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,uBACJ,IAAI,wBAAwB,OAAO,IAAI,yBAAyB,WAC3D,IAAI,uBACL;AACN,SAAO;AAAA,IACL,2BAA2B;AAAA,IAC3B,8BAA8B;AAAA,IAC9B,2BAA2B;AAAA,IAC3B;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,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,eAAsB,YAAY,MAAiF;AACjH,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,UAAU,KAAK,YAAY,QAAQ,KAAK,YAAY;AAC1D,UAAM,SAAS,CAAC;AAChB,UAAM,aAAa,kBAAkB,IAAI,EAAE;AAE3C,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,kBAAkB,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,SAAS,CAAC,IAAI;AAC1F,UAAM,eAAe,SACjB,kBACA,KAAK,IAAI,iBAAiB,mBAAmB,cAAc;AAE/D,UAAM,uBAKD,CAAC;AACN,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,QAAQ,UAAU,CAAC,WAAW,OAAO,GAAG,EAAG;AAChD,2BAAqB,KAAK;AAAA,QACxB,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ,OAAO;AAAA,QACf,KAAK,OAAO;AAAA,MACd,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC;AAC/E,UAAM,OAAgC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,iBACE,OAAO,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC,IAAI;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,MACA,sBAAsB,cAAc,IAAI,EAAE;AAAA,MAC1C,GAAI,KAAK,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,MAC/C,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AAAA,MAClD,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,IACzE;AAEA,UAAM,WAAW,MAAM,8BAA8B,aAAa,QAAQ,MAAM,EAAE,WAAW,SAAS,KAAK,CAAC;AAC5G,UAAM,eAAe,SAAS;AAC9B,QAAI,CAAC,SAAS,MAAM,CAAC,cAAc,QAAQ;AACzC,YAAM,UAAU;AAAA,QACd,OAAO,IAAI;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB,eAAe,SAAS,kBAAkB;AAAA,QAC1C,oBAAoB,SAAS;AAAA,MAC/B;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,aAAa;AAC5B,QAAI,QAAQ;AACV,YAAMC,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,MACpB;AACA,UAAI,SAAU,QAAO,EAAE,IAAI,MAAM,GAAGA,SAAQ;AAC5C,cAAQ,IAAI,KAAK,UAAUA,UAAS,MAAM,CAAC,CAAC;AAC5C;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,gBAAgB,GAAG;AAChC,YAAMA,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,cAAc,uBAAuB;AAC3C,UAAM,WAA2C,CAAC;AAClD,eAAW,YAAY,OAAO,SAA2C;AACvE,YAAM,OAAO,SAAS;AACtB,YAAM,iBAAiB,yBAAyB,QAAQ;AACxD,YAAM,SAAS,OAAO,KAAK,EAAE;AAC7B,YAAM,kBAAkBF,sBAAqB,KAAK,WAAW;AAC7D,UAAI,oBAAoB,CAAC,gBAAgB,yBAAyB,CAAC,eAAe,kBAAkB;AAClG,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,oFAAoF,eAAe;AAAA,QAC5G,CAAC;AACD;AAAA,MACF;AACA,UAAI,qBAAqB,IAAI,IAAI,MAAM,GAAG;AACxC,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AACD;AAAA,MACF;AACA,YAAM,UAAU,OAAO,KAAK,OAAO,KAAK;AACxC,UAAI,UAAU,YAAY,iBAAiB;AACzC,iBAAS,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,UACT,OAAO,gBAAgB,OAAO,sCAAsC,YAAY,eAAe;AAAA,QACjG,CAAC;AACD;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,MAAM,0BAA0B,IAAI;AAAA,MACtC,CAAC;AACD,UAAI;AACF,cAAM,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AACnD,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,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,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,UAC7C,2BAA2B,gBAAgB,6BAA6B;AAAA,UACxE,8BAA8B,gBAAgB,gCAAgC;AAAA,UAC9E,2BAA2B,gBAAgB,6BAA6B;AAAA,UACxE,sBAAsB,gBAAgB,wBAAwB;AAAA,UAC9D,iBAAiB,gBAAgB,mBAAmB;AAAA,UACpD,aAAa,gBAAgB,eAAe;AAAA,UAC5C,iBAAiB,gBAAgB,mBAAmB;AAAA,UACpD;AAAA,UACA,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;AAAA,MACF,SAAS,OAAO;AACd,cAAM,aAAa,GAAG,IAAI,uBAAuB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,OAAO,KAAK,EAAE,CAAC,CAAC;AAC3H,YAAI;AACJ,YAAI;AACF,oBAAU,MAAM,8BAA8B,YAAY,QAAQ,EAAE,WAAW,WAAW,GAAG,EAAE,WAAW,SAAS,KAAK,CAAC;AAAA,QAC3H,SAAS,QAAQ;AACf,oBAAU,EAAE,IAAI,OAAO,OAAQ,OAAiB,QAAQ;AAAA,QAC1D;AACA,iBAAS,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,UACT,OAAQ,MAAgB;AAAA,UACxB,UAAU,QAAQ,OAAO,QAAS,QAAQ,UAAsC,OAAO;AAAA,UACvF,iBAAiB,QAAQ,YAAY;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd,OAAO,IAAI;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,cAAc,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MAChD;AAAA,MACA,SAAU,OAAO,QAAyE,IAAI,CAAC,OAAO;AAAA,QACpG,QAAQ,EAAE,KAAK;AAAA,QACf,YAAY,EAAE;AAAA,MAChB,EAAE;AAAA,MACF,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,IACvB;AACA,QAAI,UAAU;AACZ,aAAO,EAAE,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,GAAG,QAAQ;AAAA,IAC7D;AACA,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,QAAI,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAG,SAAQ,KAAK,CAAC;AAAA,EACtD,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;;;AmD7WA,OAAOG,YAAU;AAQjB,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,aAAa,kBAAkB,IAAI,EAAE;AAC3C,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,MAAe;AAClD,UAAI,OAAO,MAAO;AAClB,UAAI,OAAO,eAAe,OAAO,qBAAsB;AAEvD,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,YAAY,mBAAmB,sBAAsB,MAAM,KAAK,YAAY,KAAK;AAC7H,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;;;AClEA,SAAS,cAAAC,cAAY,aAAAC,kBAAiB;AACtC,OAAOC,YAAU;;;ACDjB,OAAOC,YAAU;AA4BjB,SAAS,qBAAqB,OAAuB;AACnD,SAAOC,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;AAyCO,SAAS,0BAA0B,UAIxC;AACA,SAAO;AAAA,IACL,aAAa,gBAAgB,SAAS,IAAI;AAAA,IAC1C,QAAQ,SAAS;AAAA,IACjB,mBAAmB,SAAS;AAAA,EAC9B;AACF;;;ACzHA,OAAOC,YAAU;AAEjB,IAAM,YAAY;AAGX,SAAS,cAAc,OAAuB;AACnD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,UAAU,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,mBAAmB,KAAK,EAAE;AACxE,SAAO;AACT;AAQO,SAAS,aAAa,MAAsB;AACjD,QAAM,WAAWC,OAAK,QAAQ,IAAI;AAClC,MAAI,SAAS,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,wCAAwC;AACrF,SAAO;AACT;;;AFZA,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;AAEO,SAAS,UAAU,MAA8C;AACtE,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,UAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,KAAK,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC;AACzF;AAEO,SAAS,WAAiB;AAC/B,QAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,QAAM,OAAO,WAAW,OAAO,EAC5B,IAAI,CAAC,OAAO,SAAkCA,OAAK,KAAK,aAAa,EAAE,GAAG,UAAU,GAAG,MAAS,CAAC,EACjG,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AAAA,IACb,IAAI,IAAK;AAAA,IACT,MAAM,IAAK;AAAA,IACX,QAAQ,IAAK;AAAA,IACb,MAAM,IAAK;AAAA,IACX,WAAW,IAAK;AAAA,EAClB,EAAE;AACJ,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAEA,SAAS,WAAW,SAAwB;AAC1C,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAChB;;;AG3DA,SAAS,cAAAC,cAAY,cAAc;AACnC,OAAOC,YAAU;AAGjB,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,SAAS,WAAW,OAAO,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;AAC7D,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,WAAO,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;;;ACpEA,OAAOC,YAAU;;;ACEjB,IAAM,yBAAyB;AAE/B,SAAS,oBAAoB,QAAyB;AACpD,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,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;;;ACnDA,SAAS,yBAAyB,cAAqD;AACrF,QAAM,OAAO;AACb,QAAM,WAAW,KAAK,UAAU;AAChC,SAAO,YAAY,OAAO,aAAa,WAAW,WAAW;AAC/D;AAMO,SAAS,yBACd,cACA,cACgC;AAChC,QAAM,WAAW,yBAAyB,YAAY;AACtD,QAAM,UACJ,OAAO,UAAU,yBAAyB,WACtC,KAAK,IAAI,GAAG,SAAS,oBAAoB,IACzC;AAEN,MAAI,YAAY,aAAa;AAC7B,MAAI,YAAY,MAAM;AACpB,gBAAY,KAAK,IAAI,WAAW,OAAO;AAAA,EACzC;AAEA,QAAM,gBAAgB,UAAU,kBAAkB;AAClD,QAAM,wBACJ,OAAO,UAAU,0BAA0B,WAAW,SAAS,wBAAwB;AAEzF,MAAI,iBAAiB,aAAa,iBAAiB,KAAK,cAAc,GAAG;AACvE,UAAM,QACJ,UAAU,mBACV,UAAU,gBACT,wBAAwB,IAAI,wBAAwB;AACvD,gBAAY,KAAK,IAAI,aAAa,gBAAgB,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,WAAW,KAAK,IAAI,GAAG,SAAS;AAAA,IAChC;AAAA,IACA,eAAe;AAAA,IACf;AAAA,EACF;AACF;;;AC5DA,OAAOC,YAAU;;;ACAjB,OAAOC,YAAU;AAaV,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,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAC3C,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,MACbC,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;;;ADlFO,IAAM,+BAA+B,KAAK,KAAK;AActD,SAAS,yBAAkC;AACzC,SAAO,QAAQ,IAAI,4BAA4B;AACjD;AAOO,SAAS,wBAAqD;AACnE,MAAI,uBAAuB,GAAG;AAC5B,WAAO,EAAE,SAAS,CAAC,GAAG,eAAe,kBAAkB,EAAE;AAAA,EAC3D;AAEA,QAAM,WAA0C,CAAC;AACjD,QAAM,MAAM,KAAK,IAAI;AAErB,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;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,SAAO,EAAE,SAAS,UAAU,eAAe,kBAAkB,EAAE;AACjE;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,UAAQ;AAAA,IACN,KAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,SAAS,EAAE,cAAc,aAAa,SAAS,OAAO,OAAO,QAAQ,OAAO;AAAA,QAC5E,eAAe,OAAO,cAAc;AAAA,QACpC,SAAS,EAAE,SAAS,OAAO,SAAS,eAAe,OAAO,cAAc;AAAA,MAC1E;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AEvJA,OAAOC,YAAU;;;ACajB,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;;;AErCA,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;;;ACjCA,OAAOC,YAAU;;;ACKV,SAAS,oBAAoB,SAAmC;AACrE,MAAI,QAAQ,OAAO,MAAO,QAAO;AACjC,MAAI,QAAQ,OAAO,WAAW,UAAW,QAAO;AAChD,SAAO;AACT;AAMO,SAAS,iBAAiB,SAAmC;AAClE,MAAI,sBAAsB,IAAI,QAAQ,IAAI,MAAM,EAAG,QAAO;AAC1D,SAAO,wBAAwB,QAAQ,GAAG,MAAM;AAClD;AAMO,SAAS,yBAAyB,SAAmC;AAC1E,MAAI,oBAAoB,OAAO,EAAG,QAAO;AACzC,MAAI,QAAQ,OAAO,kBAAmB,QAAO;AAC7C,MAAI,sBAAsB,IAAI,QAAQ,IAAI,MAAM,EAAG,QAAO;AAC1D,MAAI,iBAAiB,OAAO,EAAG,QAAO;AACtC,MAAI,CAAC,uBAAuB,QAAQ,MAAM,EAAG,QAAO;AACpD,SAAO,wBAAwB,QAAQ,GAAG,MAAM;AAClD;;;AC9BO,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,aAAa,kBAAkB,CAAC,SAAS,WAAW,eAAe;AAAA,EAC5E,CAAC;AACH;;;ACDA,SAAS,qBAAqB,aAAqC;AACjE,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;AAGO,SAAS,mBAAmB,QAAyC;AAC1E,MAAI,qBAAqB,OAAO,WAAW,EAAG,QAAO;AACrD,QAAM,WAAW,OAAO,aAAa;AACrC,MAAI,aAAa,WAAW,aAAa,WAAY,QAAO;AAC5D,MAAI,OAAO,aAAa,SAAS,KAAK,OAAO,YAAa,QAAO;AACjE,SAAO;AACT;AAGA,SAAS,+BAA+B,QAAyC;AAC/E,MAAIC,yBAAwB,OAAO,YAAY,EAAE,SAAS,EAAG,QAAO;AACpE,MAAI,OAAO,aAAa,aAAa,WAAY,QAAO;AACxD,SAAO;AACT;AAmBO,SAAS,oBAAoB,OAAqD;AACvF,QAAM,EAAE,SAAS,gBAAgB,gBAAgB,OAAO,cAAc,qBAAqB,IACzF;AACF,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,eAAgB,QAAO;AAC5B,WAAO,gBAAgB;AAAA,EACzB;AAIA,MAAI,kBAAkB,KAAK,CAAC,eAAgB,QAAO;AACnD,MAAI,iBAAiB,KAAK,QAAQ,eAAgB,QAAO;AACzD,MAAI,oBAAoB,OAAO,EAAG,QAAO;AACzC,MAAI,QAAQ,OAAO,kBAAmB,QAAO;AAC7C,MAAI,yBAAyB,OAAO,EAAG,QAAO;AAC9C,MAAI,CAAC,uBAAuB,QAAQ,MAAM,EAAG,QAAO;AACpD,MAAI,mBAAmB,QAAQ,MAAM,EAAG,QAAO;AAC/C,MAAIA,yBAAwB,QAAQ,OAAO,YAAY,EAAE,SAAS,EAAG,QAAO;AAC5E,QAAM,UAAU,oBAAoB;AAAA,IAClC,aAAa,QAAQ,OAAO;AAAA,IAC5B,cAAc,QAAQ,OAAO;AAAA,IAC7B,aAAa,QAAQ,OAAO;AAAA,IAC5B,OAAO,qBAAqB,QAAQ,OAAO,WAAW;AAAA,EACxD,CAAC;AACD,MAAI,QAAQ,QAAS,QAAO;AAC5B,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;AASO,SAAS,uBAAuB,OAAwD;AAC7F,QAAM,EAAE,SAAS,gBAAgB,kBAAkB,MAAM,IAAI;AAC7D,MAAI,QAAQ,iBAAkB,QAAO;AACrC,MAAI,CAAC,QAAS,QAAO,iBAAiB,OAAO;AAC7C,MAAI,oBAAoB,OAAO,EAAG,QAAO;AACzC,MAAI,QAAQ,OAAO,kBAAmB,QAAO;AAC7C,MAAI,CAAC,uBAAuB,QAAQ,MAAM,EAAG,QAAO;AACpD,MAAI,+BAA+B,QAAQ,MAAM,EAAG,QAAO;AAC3D,QAAM,UAAU,oBAAoB;AAAA,IAClC,aAAa,QAAQ,OAAO;AAAA,IAC5B,cAAc,QAAQ,OAAO;AAAA,IAC7B,aAAa,QAAQ,OAAO;AAAA,IAC5B,OAAO,qBAAqB,QAAQ,OAAO,WAAW;AAAA,EACxD,CAAC;AACD,MAAI,QAAQ,WAAWA,yBAAwB,QAAQ,OAAO,YAAY,EAAE,SAAS,GAAG;AACtF,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC1HA,SAAS,cAAAC,cAAY,UAAAC,eAAc;AACnC,OAAOC,YAAU;;;ACDjB,SAAS,cAAAC,cAAY,eAAAC,cAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;AAKV,SAAS,mBAAmB,MAAc,aAAa,KAAuB;AACnF,MAAI,CAACH,aAAW,IAAI,EAAG,QAAO;AAC9B,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;;;AD3BO,SAAS,kBAAkB,WAA6B,SAAiC;AAC9F,MAAI,CAACE,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,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;AAEO,SAAS,yBACd,YACA,aACA,cAC0B;AAC1B,QAAM,WAAWC,OAAK,QAAQ,UAAU;AACxC,QAAM,KAAK,SAAS,SAAS,GAAGA,OAAK,GAAG,cAAc,IAAI,WAAW;AACrE,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,MAAMA,OAAK,SAAS,cAAc,EAAE;AAC1C,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,eAAgB,QAAO;AAC3E,MAAI,CAAC,SAAS,WAAWA,OAAK,QAAQ,WAAW,CAAC,EAAG,QAAO;AAC5D,SAAO;AACT;;;AE1FA,SAAS,cAAAC,cAAY,eAAAC,cAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;AAejB,SAAS,UAAU,QAAgB,KAAqB;AACtD,MAAI;AACF,UAAM,QAAQD,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;AAEO,SAAS,0BAA0B,MAA8C;AACtF,QAAM,aAAiC,CAAC;AACxC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,QAAI,KAAK,eAAe,MAAM,UAAU,KAAK,YAAa;AAC1D,UAAM,KAAKA,OAAK,KAAK,MAAM,cAAc,cAAc;AACvD,QAAI,CAACH,aAAW,EAAE,EAAG;AACrB,UAAM,WAAWG,OAAK,QAAQ,EAAE;AAChC,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,SAAK,IAAI,QAAQ;AACjB,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM,IAAI;AAAA,MAChB,OAAO,UAAU,UAAU,KAAK,GAAG;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,KAAK,kBAAkB,CAACH,aAAW,KAAK,YAAY,EAAG,QAAO;AAEnE,aAAW,YAAYC,aAAY,KAAK,cAAc,EAAE,eAAe,KAAK,CAAC,GAAG;AAC9E,QAAI,CAAC,SAAS,YAAY,EAAG;AAC7B,UAAM,UAAUE,OAAK,KAAK,KAAK,cAAc,SAAS,IAAI;AAC1D,eAAW,eAAeF,aAAY,SAAS,EAAE,eAAe,KAAK,CAAC,GAAG;AACvE,UAAI,CAAC,YAAY,YAAY,EAAG;AAChC,YAAM,eAAeE,OAAK,KAAK,SAAS,YAAY,IAAI;AACxD,YAAM,KAAKA,OAAK,KAAK,cAAc,cAAc;AACjD,UAAI,CAACH,aAAW,EAAE,EAAG;AACrB,YAAM,WAAWG,OAAK,QAAQ,EAAE;AAChC,UAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,UAAI,CAAC,aAAa,UAAU,KAAK,WAAW,EAAG;AAC/C,WAAK,IAAI,QAAQ;AACjB,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,SAAS;AAAA,QAChB,QAAQ,YAAY;AAAA,QACpB,OAAO,UAAU,UAAU,KAAK,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;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,CAACH,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,OAAO,UAAU,UAAU,KAAK,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB,CAACA,aAAW,KAAK,YAAY,EAAG,QAAO;AAG7D,QAAM,eAAe,oBAAI,IAAY;AACrC,aAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AACvC,iBAAa,IAAIG,OAAK,QAAQ,MAAM,YAAY,CAAC;AAAA,EACnD;AAEA,aAAW,YAAYF,aAAY,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,aAAY,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,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,OAAO,UAAU,cAAc,KAAK,GAAG;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACrJA,OAAOC,YAAU;AAcV,SAAS,qBAAmD;AACjE,QAAM,QAAQ,oBAAI,IAA6B;AAC/C,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;AAC9E,UAAI,CAAC,QAAQ,aAAc;AAC3B,YAAM,SAAS,oBAAoB,QAAQ,EAAE,MAAM,IAAI,MAAM,YAAY,IAAI,WAAW,CAAC;AACzF,YAAM,IAAIA,OAAK,QAAQ,OAAO,YAAY,GAAG;AAAA,QAC3C,cAAcA,OAAK,QAAQ,OAAO,YAAY;AAAA,QAC9C,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;;;AC6EO,IAAM,8BAA8B,IAAI,KAAK,KAAK;AAGlD,IAAM,2BAA2B,IAAI,KAAK,KAAK,KAAK;;;AC3G3D,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;AAaO,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,iBACJ,QAAQ,kBACR,MAAM,mCAAmC,CAAC;AAC5C,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;AAErG,SAAO;AAAA,IACL;AAAA,IACA,mBAAAA;AAAA,IACA;AAAA,IACA,gBAAgB,iBAAiB,IAAI,iBAAiB;AAAA,IACtD;AAAA,IACA,aAAa,cAAc,OAAO,WAAW,IAAI;AAAA,IACjD;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,mBAAmB;AAAA,IACnB,cAAc;AAAA,EAChB,CAAC;AACH;;;AC/EA,SAAS,cAAAC,cAAY,YAAAC,iBAAgB;AACrC,OAAOC,YAAU;AAKjB,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,gBAAgBC,OAAK;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AACA,QAAI;AACF,YAAM,QAAQC,UAAS,aAAa,EAAE;AACtC,UAAI,MAAM,QAAQ,iBAAkB,QAAO;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,SAASD,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,MAAIG,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;;;ACpFA,SAAS,cAAAC,cAAY,eAAAC,cAAa,YAAAC,iBAAgB;AAClD,OAAOC,YAAU;AA8BV,SAAS,uBAAuB,OAAoB,CAAC,GAA2B;AACrF,QAAM,cAAc,KAAK,eAAe,mBAAmB;AAC3D,QAAM,eAAeC,OAAK,KAAK,aAAa,WAAW;AACvD,QAAM,MAAM,KAAK,OAAO,KAAK,IAAI;AACjC,QAAM,YAAY,IAAI,KAAK,GAAG,EAAE,YAAY;AAE5C,MAAI,CAACC,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,UAAUF,OAAK,KAAK,cAAc,SAAS,IAAI;AACrD,QAAI;AACF,YAAM,KAAKG,UAAS,OAAO;AAC3B,iBAAW,aAAa,OAAO,GAAG,UAAU,KAAK,IAAI,UAAU,GAAG,OAAO;AAAA,IAC3E,QAAQ;AAAA,IAER;AACA,QAAI;AACF,iBAAW,eAAeD,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;;;AXvFA,SAAS,aAAa,UAAiC,CAAC,GAAG;AACzD,QAAM,cAAc,QAAQ,cACxB,gBAAgB,QAAQ,WAAW,IACnC,mBAAmB;AACvB,QAAM,EAAE,aAAa,IAAI,QAAQ,cAC7B,EAAE,cAAcE,OAAK,KAAK,aAAa,WAAW,EAAE,IACpD,gBAAgB;AACpB,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,SAAO,EAAE,aAAa,cAAc,IAAI;AAC1C;AAEA,SAAS,mBAAmB,MAAyE;AACnG,MAAI,OAAO,SAAS,SAAU,QAAO,EAAE,QAAQ,KAAK;AACpD,SAAO;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,qBAAqB,WAA6B,cAAyC;AAClG,MAAI,CAAC,gBAAgB,UAAU,SAAS,KAAM,QAAO;AACrD,SAAO,EAAE,GAAG,WAAW,OAAO,mBAAmB,UAAU,IAAI,EAAE;AACnE;AAEA,SAAS,iBACP,SACA,OAC4C;AAC5C,QAAM,SAAqD,CAAC;AAC5D,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,MAAM,KAAK,OAAO,KAAK,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;AAEO,SAAS,kBAAkB,UAAiC,CAAC,GAA0B;AAC5F,QAAM,YAAY,wBAAwB,OAAO;AACjD,QAAM,QAAQ,aAAa,OAAO;AAClC,QAAM,gBAAgB,UAAU,oBAC5B,kBAAkB,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,IAC3E,CAAC;AACL,QAAM,QAAQ,mBAAmB;AACjC,QAAM,WAAW;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,kBAAkB,UAAU;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,gBAAgB,UAAU;AAAA,IAC1B,aAAa,UAAU;AAAA,IACvB;AAAA,IACA,KAAK,MAAM;AAAA,EACb;AACA,QAAM,QAAwC,CAAC;AAC/C,QAAM,UAA2B,CAAC;AAElC,aAAW,OAAO,0BAA0B,QAAQ,GAAG;AACrD,UAAM,YAAY,qBAAqB,KAAK,UAAU,YAAY;AAClE,UAAM,WAAW,yBAAyB,UAAU,MAAM,MAAM,aAAa,MAAM,YAAY;AAC/F,QAAI,UAAU;AACZ,iBAAW,OAAO,UAAU,MAAM,QAAQ;AAC1C,cAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,SAAS,CAAC;AACnF;AAAA,IACF;AACA,UAAM,eAAeA,OAAK,QAAQ,UAAU,MAAM,IAAI;AACtD,UAAM,UAAU,MAAM,IAAI,YAAY,KAAK;AAC3C,UAAM,cAAc,uBAAuB;AAAA,MACzC;AAAA,MACA,gBAAgB,UAAU;AAAA,MAC1B,kBAAkB,UAAU;AAAA,MAC5B,OAAO,UAAU;AAAA,IACnB,CAAC;AACD,QAAI,aAAa;AACf,iBAAW,OAAO,UAAU,MAAM,WAAW;AAC7C,cAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,YAAY,CAAC;AACtF;AAAA,IACF;AACA,YAAQ,KAAK,kBAAkB,WAAW,UAAU,OAAO,CAAC;AAAA,EAC9D;AAEA,aAAW,OAAO,uBAAuB,QAAQ,GAAG;AAClD,UAAM,YAAY,qBAAqB,KAAK,UAAU,YAAY;AAClE,UAAM,UAAU,MAAM,IAAIA,OAAK,QAAQ,UAAU,IAAI,CAAC,KAAK;AAC3D,UAAM,eAAe,UACjB,OACA,2BAA2B;AAAA,MACzB,cAAc,UAAU;AAAA,MACxB,aAAa,MAAM;AAAA,MACnB,OAAO,UAAU;AAAA,MACjB,YAAY,UAAU;AAAA,MACtB,KAAK,MAAM;AAAA,IACb,CAAC;AACL,UAAM,YAAY,oBAAoB;AAAA,MACpC;AAAA,MACA,cAAcA,OAAK,QAAQ,UAAU,IAAI;AAAA,MACzC,gBAAgB,UAAU;AAAA,MAC1B,gBAAgB,UAAU;AAAA,MAC1B,OAAO,UAAU;AAAA,MACjB;AAAA,MACA,sBAAsB,QAAQ;AAAA,IAChC,CAAC;AACD,QAAI,WAAW;AACb,YAAM,EAAE,QAAQ,aAAa,QAAQ,YAAY,IAAI,mBAAmB,SAAS;AACjF,iBAAW,OAAO,UAAU,MAAM,aAAa,WAAW;AAC1D,cAAQ,KAAK,EAAE,GAAG,WAAW,UAAU,OAAO,SAAS,MAAM,YAAY,YAAY,CAAC;AACtF;AAAA,IACF;AACA,YAAQ,KAAK,eAAe,WAAW,UAAU,OAAO,CAAC;AAAA,EAC3D;AAEA,MAAI,iBAAiB;AACrB,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;AAAA,IAClC,WAAW,OAAO,SAAS;AACzB,sBAAgB;AAChB,UAAI,OAAO,eAAe,aAAa,OAAO,MAAO,qBAAoB,OAAO;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,UAAU,UAAU,eACtB,uBAAuB,EAAE,aAAa,MAAM,aAAa,KAAK,MAAM,IAAI,CAAC,IACzE;AAEJ,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,QAAQ,CAAC,UAAU;AAAA,IACnB,SAAS,UAAU;AAAA,IACnB,kBAAkB,UAAU;AAAA,IAC5B,gBAAgB,UAAU;AAAA,IAC1B,gBAAgB,UAAU;AAAA,IAC1B,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,EAC/B;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;;;AYxMA,SAAS,gBAAgB;AACzB,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;AAEjB,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,OAAOD,SAAQ;AACrB,QAAM,iBACJ,KAAK,QAAQ,IAAI,wBAAwB,KACzC,KAAK,QAAQ,IAAI,iBAAiB,KAClCC,OAAK,KAAK,MAAM,aAAa,KAAK;AACpC,QAAM,gBACJ,KAAK,QAAQ,IAAI,sBAAsB,KACvC,KAAK,QAAQ,IAAI,8BAA8B,MAC9C,KAAK,QAAQ,IAAI,iBAAiB,IAC/BA,OAAK,KAAK,KAAK,QAAQ,IAAI,iBAAiB,GAAI,OAAO,cAAc,IACrEA,OAAK,KAAK,MAAM,eAAe,OAAO,cAAc;AAE1D,SAAO,OAAO;AAAA,IACZA,OAAK,KAAK,gBAAgB,OAAO,cAAc;AAAA,IAC/CA,OAAK,KAAK,gBAAgB,cAAc;AAAA,IACxC,cAAc,SAAS,cAAc,IAAI,gBAAgBA,OAAK,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;AAEA,eAAsB,gCACpB,cAAqB,oBAAI,KAAK,GAAE,YAAY,GACP;AACrC,QAAM,QAAQ,YAAY;AAC1B,QAAM,MAAkC,CAAC;AACzC,aAAW,eAAe,kBAAkB;AAC1C,eAAW,QAAQ,OAAO;AACxB,YAAM,kBAAkBA,OAAK,KAAK,MAAM,aAAa,cAAc;AACnE,YAAM,UAAU,MAAM,YAAY,eAAe;AACjD,UAAI,CAAC,QAAS;AACd,UAAI,WAAW,IAAI,EAAE,SAAS,YAAY,MAAM,gBAAgB;AAChE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ApB/BA,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,iBAAiB,MAAM,GAAG;AAC5B,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,MACkB;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,MAAM,MAAM,SAAS,KAAK,QAAQ;AAAA,IACtC;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,sBAAsB,cAAc,KAAK;AAAA,IACzC;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,EAAE,IAAI,IAAI,IAAI,YAAY,IAAI,QAAQ,UAAU,IAAI,SAAS;AACtE;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,eAAe,0BAA0B;AAAA,IAC7C;AAAA,IACA,8BAA8B,gBAAgB;AAAA,EAChD,CAAC;AAKD,QAAM,eAAe,MAAM,iBAAiB,WAAW,OAAO,cAAc,IAAI;AAChF,QAAM,oBAAoB,2CAA2C,OAAO,YAAY;AAExF,QAAM,eAAe,MAAM,sBAAsB,OAAO,IAAI;AAO5D,QAAM,mBAAmB,MAAM,wBAAwB,OAAO,IAAI;AAOlE,QAAM,iBAAiB,sBAAsB;AAC7C,QAAM,iBAAiB,yBAAyB,IAAI,0BAA0B,KAAK,IAAI;AACvF,QAAM,mBAAmB,MAAM,6BAA6B,OAAO,IAAI;AAEvE,QAAM,kBAAkB,yBAAyB,cAAc,YAAY;AAC3E,MAAI,YAAY,gBAAgB;AAEhC,QAAM,QAAQ,MAAM,SAAS,EAAE,KAAK,OAAO,WAAW,UAAU,MAAM,GAAG,KAAK,CAAC;AAE/E,MAAI,WAAoB;AACxB,MAAI,WAAW,YAAY,GAAG;AAC5B,eAAW,MAAM;AAAA,MACf;AAAA,QACE,GAAG;AAAA,QACH,KAAK;AAAA,QACL;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,eAAW;AAAA,MACT,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ,UAAU,aAAa,UAAU,4BAA4B;AAAA,MACrE,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,eAAgB,UAAwC,gBAAgB;AAC9E,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;AAAA,EACF;AACF;;;AqBhMA,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB,IAAI;AAC7B,IAAM,kBAAkB;AAExB,eAAsB,UAAU,MAAuD;AACrF,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,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,gBAAgB,OAAO,WAAW,SAAS,WAAW,CAAC,CAAC;AAE9F,SAAO,CAAC,UAAU;AAChB,QAAI;AACF,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,cAAQ,OAAO;AAAA,IACjB,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,qBAAqB,OAAQ,MAAgB,QAAQ,CAAC,CAAC;AAC7F,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AAEA,UAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,OAAO,UAAU,CAAC,CAAC;AAC1E;;;AC7CA,OAAOC,YAAU;;;ACCV,IAAM,iCAAiC,OAAO,OAAO;AAGrD,IAAM,kCAAkC,IAAI,OAAO,OAAO;AAG1D,IAAM,iCAAiC;AAGvC,IAAM,6BAA6B;AAGnC,IAAM,kCAAkC;;;ACX/C,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,kBAAiB;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,WAAU,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;;;AC3DA,SAAS,aAAAC,kBAAiB;AAqB1B,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,WAAU,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,kBAAiB;AAE1B,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;AAiCA,SAAS,SACP,MACA,MACsD;AACtD,QAAM,MAAMC,WAAU,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;AAMO,SAAS,qBAAqB,OAA0D;AAC7F,QAAM,SAAS,MAAM,sBAAsB;AAC3C,QAAM,YACJ,SAAS,IAAI,sBAAsB,MAAM,IAAI,qBAAqB;AAEpE,MAAI,CAAC,UAAU,UAAU;AACvB,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,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,SAAS,MAAM;AAAA,IACjB;AAAA,EACF,UAAE;AACA,qBAAiB;AAAA,EACnB;AACF;;;ACrHO,IAAM,kCAAkC,CAAC,qBAAqB,cAAc;AAgB5E,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;;;ANxBA,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,WAAW,IAAI,iBAAiB,YAAY,IAAI,cAAc,KAAK;AAEzE,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;;;AO9IA,OAAOC,YAAU;AAIV,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,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,SAAS,gBAAAC,qBAAoB;AAS7B,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,cAAa,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,mBAAmB,KAAK,mBAC1B,OAAO,KAAK,gBAAgB,IAC5B;AACJ,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,kBAAkB,OAAO,SAAS,gBAAgB,IAAI,mBAAmB;AAAA,IACzE,gBAAgB,OAAO,SAAS,cAAc,IAAI,iBAAiB;AAAA,IACnE;AAAA,IACA;AAAA,EACF,CAAC;AAED,UAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAE5C,MAAI,WAAW,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,QAAQ,WAAW,GAAG;AAChF,YAAQ,WAAW;AAAA,EACrB;AACF;;;AC3BA,OAAOC,YAAU;;;ACSjB,SAAS,mBAAmB,OAAuB;AACjD,SAAO,kBAAkB,KAAK;AAChC;AAMO,SAAS,qBAAqB,OAIN;AAC7B,QAAM,EAAE,QAAQ,QAAQ,UAAU,IAAI;AACtC,QAAM,aAAa,WAAW,cAAc;AAC5C,QAAM,gBAAgB,mBAAmB,OAAO,KAAK;AAErD,MAAI,OAAO,cAAc,WAAW;AAClC,QAAI,UAAU,WAAW,aAAa,cAAc,eAAe,eAAe;AAChF,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,sBAAsB,UAAU,cAAc,aAAa;AAAA,MACrE;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;;;AC3EA,SAAS,cAAAC,cAAY,aAAAC,YAAW,eAAAC,cAAa,cAAAC,mBAAkB;AAC/D,OAAOC,YAAU;AAKjB,SAAS,cAAsB;AAC7B,QAAM,EAAE,YAAY,IAAI,gBAAgB;AACxC,QAAM,MAAMC,OAAK,KAAK,aAAa,UAAU;AAC7C,EAAAC,WAAU,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,SAAOD,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,CAACE,aAAW,IAAI,EAAG,QAAO;AAC9B,EAAAC,YAAW,IAAI;AACf,SAAO;AACT;AAEO,SAAS,sBAA0C;AACxD,QAAM,MAAM,YAAY;AACxB,MAAI,CAACD,aAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,UAA8B,CAAC;AACrC,aAAW,QAAQE,aAAY,GAAG,GAAG;AACnC,QAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,UAAM,UAAU;AAAA,MACdJ,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;;;AC9CO,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;;;ACpDA,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,SAASK,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;;;AKjOA,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,YAAQ,IAAI,KAAK,UAAU,EAAE,WAAW,OAAO,QAAQ,GAAG,KAAK,CAAC,CAAC;AAEjE,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;;;AC5CA,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;;;ACjGA,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;;;ACvEA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,SAAS,mBAAmB,WAA2B;AACrD,MAAI,MAAM,QAAQA,eAAc,SAAS,CAAC;AAC1C,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,QAAIF,aAAW,KAAK,KAAK,cAAc,CAAC,EAAG,QAAO;AAClD,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,QAAM,IAAI,MAAM,gCAAgC,QAAQE,eAAc,SAAS,CAAC,CAAC,EAAE;AACrF;AAEO,SAAS,sBAAsB,YAAoB,YAAY,KAAa;AACjF,QAAM,UAAU,KAAK,mBAAmB,SAAS,GAAG,cAAc;AAClE,QAAM,MAAM,KAAK,MAAMD,eAAa,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;;;AC3CA,OAAOE,YAAU;;;ACAjB,SAAS,YAAY,WAAW,cAAAC,cAAY,gBAAAC,sBAAoB;AAChE,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;AACjB,SAAS,aAAAC,kBAAiB;AA8C1B,SAAS,eAAe,KAAa,MAAoC;AACvE,MAAI;AACF,UAAM,MAAMC,WAAU,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,SAAQ,GAAG,WAAW,aAAa;AAAA,EACnE,qBAAqB,MAAMD,OAAK,KAAKC,SAAQ,GAAG,WAAW,aAAa;AAAA,EACxE,iBAAiB,MAAM;AACrB,UAAM,WAAWD,OAAK,KAAKC,SAAQ,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,QAAQ,QAAQ,IAAI,0BAA0B,KAAK,CAAC;AAAA,IAC3E,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,SAAQ,GAAG,aAAa,SAAS;AAAA,EAC5E,YAAY,CAAC,WAAWF,aAAW,MAAM;AAAA,EACzC,cAAc,CAAC,WAAW,WAAW,MAAM;AAAA,EAC3C,eAAe,MAAM,eAAe,UAAU,CAAC,WAAW,CAAC;AAAA,EAC3D,cAAc,MAAM,eAAe,UAAU,CAAC,QAAQ,CAAC;AACzD;;;AClHA,SAAS,2BACP,KACA,KACS;AACT,SACE,IAAI,4BAA4B,iBAChC,IAAI,4BAA4B,mBAChC,IAAI,gCAAgC,iBACpC,IAAI,gCAAgC,mBACpC,QAAQ,IAAI,qBAAqB;AAErC;AAEA,SAAS,iBACP,KACA,KACS;AACT,SAAO,IAAI,4BAA4B,YAAY,IAAI,gCAAgC;AACzF;AAEA,SAAS,MAAM,SAAmC;AAChD,SAAO;AACT;AAQO,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,EAC1D;AAEA,MAAI,iBAAiB,KAAK,GAAG,KAAK,CAAC,2BAA2B,KAAK,GAAG,GAAG;AACvE,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,2BAA2B,KAAK,GAAG,GAAG;AACxC,UAAM,QAAkB,CAAC;AACzB,QAAI,IAAI,4BAA4B,iBAAiB;AACnD,YAAM,KAAK,yCAAyC;AAAA,IACtD;AACA,QAAI,IAAI,gCAAgC,iBAAiB;AACvD,YAAM,KAAK,qDAAqD;AAAA,IAClE;AACA,QAAI,IAAI,uBAAuB;AAC7B,YAAM,KAAK,kDAAkD;AAAA,IAC/D;AACA,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,qCAAqC,MAAM,KAAK,IAAI,CAAC;AAAA,MAC9D,aACE;AAAA,MAEF,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,IAAI,4BAA4B;AACvD,QAAM,eAAe,IAAI,4BAA4B;AACrD,QAAM,mBAAmB,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,IAAI,sBAAsB;AAC9F,QAAM,sBACJ,QAAQ,IAAI,WAAW,KAAK,CAAC,KAC7B,QAAQ,IAAI,YAAY,KAAK,CAAC,KAC9B,IAAI;AAEN,QAAM,yBAAyB,oBAAoB,CAAC;AAEpD,QAAM,wBACJ,0BACA,CAAC,IAAI,sBACL,IAAI,4BAA4B;AAClC,QAAM,qBACJ,0BAA0B,IAAI,4BAA4B;AAE5D,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,sBAAsB,uBAAuB;AAC/C,WAAO,MAAM;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,qBACL,mHACA,IAAI,0BACF,qEAAqE,IAAI,uBAAuB,sDAChG;AAAA,MACN,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,oBAAoB,IAAI,sBAAsB,CAAC,IAAI,yBAAyB;AAC9E,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,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;;;AF7MA,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,QAAI;AACJ,QAAI,CAAC,qBAAqB;AACxB,+BACE;AAAA,IACJ,WAAW,CAAC,oBAAoB,mBAAmB;AACjD,+BACE;AAAA,IACJ;AACA,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,SAAS;AAAA,QACvC,SAAS,sBACL,GAAG,UAAW,WAAW,KAAK,oBAAoB,MAAM,GAAG,oBAAoB,oBAAoB,KAAK,iBAAiB,MACzH;AAAA,QACJ,aAAa;AAAA,QACb,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,gBAAgB,QAA8C;AACrE,QAAM,UAAU,OAAO,cAAc;AACrC,QAAM,SAAS,OAAO,aAAa;AACnC,QAAM,YAAY,QAAQ;AAE1B,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,MACNA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,YAAY,SAAS;AAAA,QAC7B,SAAS,YAAY,QAAQ,UAAU,qBAAqB,QAAQ,SAAS;AAAA,QAC7E,aAAa,YAAY,SAAY;AAAA,QACrC,SAAS,EAAE,QAAQ,QAAQ,UAAU,KAAK;AAAA,MAC5C,CAAC;AAAA,MACDA,OAAM;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ,CAAC,YAAY,SAAS,OAAO,KAAK,SAAS;AAAA,QACnD,SAAS,CAAC,YACN,4CACA,OAAO,KACL,oBAAoB,OAAO,MAAM,KACjC,OAAO,UAAU,OAAO,SAAS;AAAA,QACvC,aACE,aAAa,CAAC,OAAO,KAAK,8DAA8D;AAAA,QAC1F,SAAS,EAAE,SAAS,OAAO,KAAK,OAAO,SAAS,KAAK;AAAA,MACvD,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,gBAAgB,MAAM;AAAA,IACtB,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;;;AG3dO,SAAS,8BAAoC;AAClD,QAAM,SAAS,+BAA+B;AAC9C,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,MAAI,CAAC,OAAO,OAAO;AACjB,YAAQ,WAAW;AAAA,EACrB;AACF;;;ACLA,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;;;A5GKA,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,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,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,EAAAE,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,EAAAA,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAE3C,MAAI,UAAU,QAAS,QAAO,KAAM,MAAM,SAAS,IAAI;AACvD,MAAI,UAAU,YAAY,WAAW,aAAc,QAAO,KAAM,MAAM,qBAAqB,IAAI;AAC/F,MAAI,UAAU,QAAS,QAAO,KAAM,MAAM,SAAS,IAAI;AACvD,MAAI,UAAU,SAAU,QAAO,KAAM,MAAM,UAAU,IAAI;AACzD,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,mBAAoB,QAAO,4BAA4B;AAC5F,MAAI,UAAU,WAAW,WAAW,YAAY;AAC9C,WAAO,KAAM,MAAM,4BAA4B,IAAI;AAAA,EACrD;AAEA,MAAI,UAAU,SAAS,WAAW,SAAU,QAAO,UAAU,IAAI;AACjE,MAAI,UAAU,SAAS,WAAW,OAAQ,QAAO,SAAS;AAC1D,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,YAAY,WAAW,QAAS,QAAO,KAAM,MAAM,YAAY,IAAI;AACjF,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;",
6
6
  "names": ["mkdirSync", "fileURLToPath", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "path", "existsSync", "readFileSync", "homedir", "path", "path", "path", "existsSync", "readFileSync", "homedir", "path", "homedir", "existsSync", "readFileSync", "mkdirSync", "writeFileSync", "path", "statfsSync", "existsSync", "readFileSync", "path", "path", "statfsSync", "os", "readFileSync", "path", "existsSync", "readdirSync", "path", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "path", "existsSync", "readdirSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "existsSync", "readFileSync", "tidy", "oneLine", "trimOrNull", "hasFinalResult", "trimOrNull", "hasFinalResult", "tail", "path", "os", "taskString", "model", "positiveInt", "path", "path", "existsSync", "mkdirSync", "path", "closeSync", "existsSync", "openSync", "spawn", "path", "existsSync", "readdirSync", "path", "existsSync", "path", "openSync", "spawn", "closeSync", "spawn", "existsSync", "openSync", "closeSync", "path", "fileURLToPath", "path", "trimOrNull", "spawnSync", "spawnSync", "asRecord", "path", "trimOrNull", "stringList", "hasFinalResult", "stringList", "trimOrNull", "hasFinalResult", "path", "path", "asRecord", "asString", "reason", "handoff", "detail", "ack", "path", "path", "fileURLToPath", "existsSync", "openSync", "spawn", "closeSync", "path", "mkdirSync", "existsSync", "url", "body", "res", "parsed", "row", "createHash", "createHash", "mkdirSync", "homedir", "path", "existsSync", "readFileSync", "readdirSync", "writeFileSync", "path", "readdirSync", "path", "existsSync", "readFileSync", "writeFileSync", "path", "normalizePersonaSlug", "path", "summary", "path", "path", "existsSync", "mkdirSync", "path", "path", "path", "path", "path", "existsSync", "mkdirSync", "path", "existsSync", "path", "normalizeRelativePath", "path", "existsSync", "path", "path", "path", "path", "path", "path", "path", "path", "materialWorktreeChanges", "materialWorktreeChanges", "existsSync", "rmSync", "path", "existsSync", "readdirSync", "statSync", "path", "existsSync", "rmSync", "path", "existsSync", "readdirSync", "statSync", "path", "path", "path", "finalizeStaleRuns", "existsSync", "statSync", "path", "existsSync", "path", "statSync", "materialWorktreeChanges", "existsSync", "readdirSync", "statSync", "path", "path", "existsSync", "readdirSync", "statSync", "path", "homedir", "path", "path", "path", "spawnSync", "spawnSync", "spawnSync", "positiveInt", "sleepMs", "spawnSync", "spawnSync", "spawnSync", "path", "path", "path", "readFileSync", "readFileSync", "path", "existsSync", "mkdirSync", "readdirSync", "unlinkSync", "path", "path", "mkdirSync", "existsSync", "unlinkSync", "readdirSync", "workerRecord", "path", "DEFAULT_POLL_MS", "DEFAULT_MAX_TOTAL_MS", "spawn", "closeSync", "existsSync", "openSync", "path", "fileURLToPath", "resolveDefaultCliPath", "path", "fileURLToPath", "existsSync", "openSync", "spawn", "closeSync", "existsSync", "readFileSync", "fileURLToPath", "path", "existsSync", "readFileSync", "homedir", "path", "spawnSync", "spawnSync", "existsSync", "path", "homedir", "readFileSync", "check", "path", "mkdirSync", "fileURLToPath"]
7
7
  }