abtars 0.1.0-alpha.7 → 0.1.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,10 +3,10 @@
3
3
  import {
4
4
  showHintOnce,
5
5
  update
6
- } from "./chunk-FFIA7XZJ.js";
6
+ } from "./chunk-CIRADQXS.js";
7
7
  import {
8
8
  install
9
- } from "./chunk-W3CIMH27.js";
9
+ } from "./chunk-RQ55NZI5.js";
10
10
  import {
11
11
  acquireLock,
12
12
  activate,
@@ -1036,7 +1036,7 @@ Next: cd into the abtars repo and run 'abtars update' to build and activate.
1036
1036
  process.stdout.write(`
1037
1037
  \u2500\u2500 Running 'abtars update' \u2500\u2500
1038
1038
  `);
1039
- const { update: update2 } = await import("./update-W6766DCT.js");
1039
+ const { update: update2 } = await import("./update-I3IYKKLH.js");
1040
1040
  const updRc = await update2({ source: "local", fromLocal: true, allowAbmindMismatch: false });
1041
1041
  if (updRc !== 0) {
1042
1042
  process.stderr.write(`
@@ -1328,7 +1328,7 @@ function printUsage() {
1328
1328
  `abtars \u2014 install/update CLI (#158)
1329
1329
 
1330
1330
  Usage:
1331
- abtars install [--force] [--mode=simple|supervised|supervised-daemon] [--restore <backup.zip>]
1331
+ abtars install [--force] [--mode=simple|supervised] [--restore <backup.zip>]
1332
1332
  abtars uninstall [--yes]
1333
1333
  abtars update [--source local|npm|github] [--from-local]
1334
1334
  abtars rollback [--to <version>]
@@ -1354,7 +1354,7 @@ async function main(argv) {
1354
1354
  restore: typeof flags.get("restore") === "string" ? flags.get("restore") : void 0,
1355
1355
  force: flags.get("force") === true,
1356
1356
  dryRun: flags.get("dry-run") === true,
1357
- mode: flags.get("mode") === "simple" ? "simple" : flags.get("mode") === "supervised" ? "supervised" : flags.get("mode") === "supervised-daemon" ? "supervised-daemon" : void 0
1357
+ mode: flags.get("mode") === "simple" ? "simple" : flags.get("mode") === "supervised" ? "supervised" : void 0
1358
1358
  });
1359
1359
  case "uninstall":
1360
1360
  return await uninstall({ yes: flags.get("yes") === true });
@@ -1397,6 +1397,10 @@ async function main(argv) {
1397
1397
  const { start: startCmd } = await import("./start-4IWBKLWO.js");
1398
1398
  return await startCmd();
1399
1399
  }
1400
+ case "daemon": {
1401
+ const { daemon: daemonCmd } = await import("./daemon-5AXPZBSH.js");
1402
+ return await daemonCmd(argv.slice(1));
1403
+ }
1400
1404
  case "logs": {
1401
1405
  const { logs } = await import("./logs-EK4HYRKR.js");
1402
1406
  return await logs();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cli/commands/doctor.ts", "../src/cli/commands/uninstall.ts", "../src/cli/commands/stop.ts", "../src/cli/commands/backup.ts", "../src/cli/commands/onboard.ts", "../src/cli/commands/rollback.ts", "../src/cli/commands/status.ts", "../src/cli/abtars.ts"],
4
- "sourcesContent": ["/**\n * `abtars doctor` \u2014 thin TS wrapper around scripts/doctor.sh.\n *\n * Per plan v7 Ag2-review round 2: don't port bash-native diagnostic logic\n * to TS. scripts/doctor.sh does pgrep/filesystem/lock inspection well;\n * rewriting duplicates platform detection. Wrapper spawns doctor.sh\n * (installed by the migration into $AB/scripts/), captures exit status +\n * output, pretty-prints, and returns the status.\n *\n * Fallback: if $AB/scripts/doctor.sh isn't present (pre-install, or flat\n * layout pre-migration), execs the repo's scripts/doctor.sh from cwd.\n */\n\nimport { spawn } from 'node:child_process';\nimport { stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { packagePaths } from '../deploy-lib-import.js';\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function doctor(args: readonly string[] = []): Promise<number> {\n const paths = packagePaths('abtars');\n const installed = join(paths.home, 'scripts', 'doctor.sh');\n const repo = join(process.cwd(), 'scripts', 'doctor.sh');\n const candidate = (await pathExists(installed)) ? installed : (await pathExists(repo)) ? repo : null;\n\n if (candidate === null) {\n process.stderr.write(\n `doctor.sh not found (looked in ${installed} and ${repo}).\\n` +\n `Run from an abtars checkout or after 'abtars install'.\\n`,\n );\n return 2;\n }\n\n return new Promise<number>((resolve) => {\n const child = spawn(candidate, [...args], { stdio: 'inherit', env: process.env });\n child.on('exit', (code) => resolve(code ?? 1));\n child.on('error', (err) => {\n process.stderr.write(`doctor.sh spawn failed: ${err.message}\\n`);\n resolve(1);\n });\n });\n}\n", "/**\n * abtars uninstall \u2014 stop everything, remove ~/.abtars/ and CLI symlinks.\n *\n * Destructive. Requires typing \"uninstall\" to confirm (or --yes flag).\n */\n\nimport { existsSync, readdirSync, unlinkSync, readlinkSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { stop } from \"./stop.js\";\n\nfunction abtarsHome(): string {\n return process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n}\n\nfunction binDir(): string {\n return join(process.env[\"HOME\"] ?? \"\", \".local\", \"bin\");\n}\n\nasync function confirm(): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(\"\u26A0\uFE0F This will DELETE ~/.abtars/ entirely. Type 'uninstall' to confirm: \", (answer) => {\n rl.close();\n resolve(answer.trim() === \"uninstall\");\n });\n });\n}\n\nfunction removeSymlinks(): string[] {\n const dir = binDir();\n if (!existsSync(dir)) return [];\n const home = abtarsHome();\n const removed: string[] = [];\n for (const entry of readdirSync(dir)) {\n if (!entry.startsWith(\"abtars\")) continue;\n const full = join(dir, entry);\n try {\n const target = readlinkSync(full);\n if (target.includes(home) || target.includes(\".abtars\")) {\n unlinkSync(full);\n removed.push(entry);\n }\n } catch { /* not a symlink or already gone */ }\n }\n return removed;\n}\n\nfunction unloadLaunchd(): void {\n if (process.platform !== \"darwin\") return;\n const plist = join(process.env[\"HOME\"] ?? \"\", \"Library\", \"LaunchAgents\", \"com.abtars.watchdog.plist\");\n if (!existsSync(plist)) return;\n try {\n const { execSync } = require(\"node:child_process\");\n execSync(`launchctl bootout gui/$(id -u) \"${plist}\" 2>/dev/null`, { stdio: \"ignore\" });\n unlinkSync(plist);\n } catch { /* already unloaded or missing */ }\n}\n\nexport async function uninstall(opts: { yes?: boolean }): Promise<number> {\n const home = abtarsHome();\n\n if (!existsSync(home)) {\n process.stdout.write(\"Nothing to uninstall \u2014 ~/.abtars/ does not exist.\\n\");\n return 0;\n }\n\n if (!opts.yes) {\n const confirmed = await confirm();\n if (!confirmed) {\n process.stdout.write(\"Aborted.\\n\");\n return 1;\n }\n }\n\n // 1. Stop bridge + watchdog\n await stop({ force: true });\n\n // 2. Unload launchd plist\n unloadLaunchd();\n\n // 3. Remove CLI symlinks\n const removed = removeSymlinks();\n\n // 4. Remove ~/.abtars/\n rmSync(home, { recursive: true, force: true });\n\n // 5. Summary\n process.stdout.write(`\\n\u2713 Uninstalled abtars\\n`);\n process.stdout.write(` Removed: ${home}/\\n`);\n if (removed.length > 0) {\n process.stdout.write(` Symlinks removed: ${removed.join(\", \")}\\n`);\n }\n process.stdout.write(`\\n Source repo (~/abtars/) is untouched.\\n`);\n return 0;\n}\n", "/**\n * abtars stop \u2014 kill watchdog (if running) then bridge (#372).\n *\n * Ordering matters: watchdog dies first so it doesn't respawn the bridge\n * we're about to kill. Each process gets SIGTERM \u2192 5s grace \u2192 SIGKILL.\n *\n * Lock files (verified against live install):\n * ~/.abtars/watchdog.lock = {\"pid\": number, \"lastCheck\": epoch-ms}\n * ~/.abtars/bridge.lock = {\"pid\": number, \"lastHeartbeat\": ..., ...}\n * Both are separate files; no watchdog PID is embedded in bridge.lock.\n *\n * Supervised-daemon mode: refuses without --force (systemd/launchd would\n * respawn immediately). Mirrors the pattern in restart.ts for --cold.\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nfunction abtarsHome(): string {\n return process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n}\n\nfunction readJsonField(file: string, field: string): unknown {\n try {\n const data = JSON.parse(readFileSync(file, \"utf-8\"));\n return data[field];\n } catch { return undefined; }\n}\n\nfunction pidAlive(pid: number): boolean {\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\n/** Linux-only guard: verify cmdline contains expected substring. Mac has no /proc \u2014 returns true. */\nfunction pidLooksLike(pid: number, needles: string[]): boolean {\n try {\n const cmdline = readFileSync(`/proc/${pid}/cmdline`, \"utf-8\");\n return needles.some(n => cmdline.includes(n));\n } catch { return true; /* /proc unavailable \u2014 trust the lock */ }\n}\n\ntype KillResult = \"killed\" | \"forced\" | \"gone\" | \"stale\" | \"not-running\";\n\nasync function killGracefully(pid: number, needles: string[]): Promise<KillResult> {\n if (!pidAlive(pid)) return \"not-running\";\n if (!pidLooksLike(pid, needles)) return \"stale\";\n\n try { process.kill(pid, \"SIGTERM\"); } catch { return \"not-running\"; }\n\n // 10 \u00D7 500ms poll = 5s grace per process\n for (let i = 0; i < 10; i++) {\n await new Promise(r => setTimeout(r, 500));\n if (!pidAlive(pid)) return \"killed\";\n }\n\n // Force kill\n try { process.kill(pid, \"SIGKILL\"); } catch { /* already gone */ }\n await new Promise(r => setTimeout(r, 500));\n return pidAlive(pid) ? \"not-running\" : \"forced\";\n}\n\nfunction removeLock(path: string): void {\n try { if (existsSync(path)) unlinkSync(path); }\n catch (err) { logAndSwallow(\"stop\", \"op\", err); }\n}\n\nexport async function stop(opts: { force?: boolean }): Promise<number> {\n const home = abtarsHome();\n const manifestPath = join(home, \"manifest.json\");\n const watchdogLock = join(home, \"watchdog.lock\");\n const bridgeLock = join(home, \"bridge.lock\");\n const force = opts.force ?? false;\n\n // Supervised-daemon refusal\n const installMode = readJsonField(manifestPath, \"installMode\") as string | undefined;\n if (installMode === \"supervised-daemon\" && !force) {\n process.stderr.write(`Bridge runs under supervised-daemon \u2014 use supervisor stop (supervisor will respawn if you kill the process directly).\\n`);\n if (process.platform === \"darwin\") {\n process.stderr.write(` sudo -k launchctl bootout system/com.abtars.daemon\\n`);\n } else {\n process.stderr.write(` sudo -k systemctl stop abtars\\n`);\n }\n process.stderr.write(`\\nUse 'abtars stop --force' to kill the process anyway (supervisor will respawn).\\n`);\n return 1;\n }\n\n // 1) Unload supervisor service (prevent respawn) then kill watchdog\n if (force && process.platform === \"darwin\") {\n try { execFileSync(\"launchctl\", [\"bootout\", `gui/${process.getuid!()}`, join(homedir(), \"Library\", \"LaunchAgents\", \"com.abtars.watchdog.plist\")], { timeout: 5000 }); }\n catch { /* already unloaded or not present */ }\n }\n\n const wdPid = readJsonField(watchdogLock, \"pid\") as number | undefined;\n let wdResult: KillResult = \"not-running\";\n let wdPidActual: number | undefined;\n if (wdPid && wdPid > 0) {\n wdPidActual = wdPid;\n wdResult = await killGracefully(wdPid, [\"watchdog.sh\"]);\n if (wdResult === \"killed\" || wdResult === \"forced\") {\n removeLock(watchdogLock);\n } else if (wdResult === \"stale\") {\n process.stdout.write(`\u26A0\uFE0F watchdog.lock PID ${wdPid} is not watchdog.sh \u2014 stale lock, removing\\n`);\n removeLock(watchdogLock);\n }\n }\n\n // 2) Bridge second\n const brPid = readJsonField(bridgeLock, \"pid\") as number | undefined;\n let brResult: KillResult = \"not-running\";\n let brPidActual: number | undefined;\n if (brPid && brPid > 0) {\n brPidActual = brPid;\n brResult = await killGracefully(brPid, [\"abtars\", \"main.js\", \"bundle\"]);\n if (brResult === \"killed\" || brResult === \"forced\") {\n removeLock(bridgeLock);\n } else if (brResult === \"stale\") {\n process.stdout.write(`\u26A0\uFE0F bridge.lock PID ${brPid} is not abtars \u2014 stale lock, removing\\n`);\n removeLock(bridgeLock);\n }\n }\n\n // 3) Summary + exit code\n const wdMsg = formatResult(\"Watchdog\", wdResult, wdPidActual);\n const brMsg = formatResult(\"Bridge\", brResult, brPidActual);\n\n if (wdResult === \"not-running\" && brResult === \"not-running\") {\n process.stdout.write(`Nothing to stop \u2014 neither watchdog nor bridge running.\\n`);\n return 0;\n }\n\n process.stdout.write(`\uD83D\uDED1 ${wdMsg}\\n ${brMsg}\\n`);\n\n if (force && process.platform === \"darwin\") {\n process.stdout.write(` LaunchAgent unloaded. To restart: launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist\\n`);\n }\n\n // Return 0 if nothing's still alive; 1 if we left something running\n const allDown =\n (wdResult === \"not-running\" || wdResult === \"killed\" || wdResult === \"forced\" || wdResult === \"stale\") &&\n (brResult === \"not-running\" || brResult === \"killed\" || brResult === \"forced\" || brResult === \"stale\");\n return allDown ? 0 : 1;\n}\n\nfunction formatResult(label: string, result: KillResult, pid: number | undefined): string {\n switch (result) {\n case \"killed\": return `${label} stopped (PID ${pid}, SIGTERM)`;\n case \"forced\": return `${label} stopped (PID ${pid}, SIGKILL)`;\n case \"stale\": return `${label} lock was stale (PID ${pid} not ours)`;\n case \"not-running\": return `${label} was not running`;\n case \"gone\": return `${label} kill failed \u2014 PID ${pid} still alive`;\n }\n}\n", "/**\n * `abtars backup` \u2014 orchestrates abmind encrypted backup + abtars config zip.\n * Produces two files in ~/.backup-abtars/:\n * abtars-YYYY-MM-DD.zip \u2014 config, skills, workspace (plaintext)\n * abmind-YYYY-MM-DD.abm \u2014 encrypted memory (via abmind backup)\n */\n\nimport { existsSync, mkdirSync, readdirSync, statSync, renameSync, unlinkSync, copyFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { abtarsHome } from \"../../paths.js\";\n\nconst AB_SAVE = [\"config\", \"secret\", \"tasks\", \"logo\", \"workspace\", \"skills/custom\", \"skills/self\"];\nconst DEFAULT_PRUNE_DAYS = 7;\n\nexport async function backup(outputDir?: string, pruneDays?: number): Promise<number> {\n const abHome = abtarsHome();\n const date = new Date().toISOString().slice(0, 10);\n const destDir = outputDir ?? join(dirname(abHome), \".backup-abtars\");\n mkdirSync(destDir, { recursive: true });\n\n // 1. Run abmind backup (encrypted .abm)\n const abmindPaths = [\n join(dirname(abHome), \".abmind\", \"lib\", \"node_modules\", \"abmind\", \"dist\", \"cli\", \"abmind-backup.js\"),\n join(dirname(abHome), \"workspace\", \"ab\", \"abmind\", \"dist\", \"cli\", \"abmind-backup.js\"),\n ];\n const abmindBin = abmindPaths.find(p => existsSync(p));\n let abmResult: ReturnType<typeof spawnSync>;\n if (abmindBin) {\n abmResult = spawnSync(\"node\", [abmindBin], { encoding: \"utf-8\", env: { ...process.env } });\n } else {\n abmResult = spawnSync(\"abmind\", [\"backup\"], { encoding: \"utf-8\", env: { ...process.env } });\n }\n\n if (abmResult.status !== 0) {\n process.stderr.write(`\u26A0\uFE0F abmind backup failed: ${abmResult.stderr || abmResult.stdout}\\n`);\n return 1;\n }\n\n // Find the .abm file produced (latest in ~/.abmind/backups/)\n const abmindBackupsDir = join(dirname(abHome), \".abmind\", \"backups\");\n let abmFile: string | undefined;\n if (existsSync(abmindBackupsDir)) {\n const abmFiles = readdirSync(abmindBackupsDir)\n .filter(f => f.endsWith(\".abm\"))\n .sort()\n .reverse();\n if (abmFiles.length > 0) abmFile = abmFiles[0];\n }\n\n if (abmFile) {\n const src = join(abmindBackupsDir, abmFile);\n const dest = join(destDir, `abmind-${date}.abm`);\n renameSync(src, dest);\n const size = (statSync(dest).size / 1024).toFixed(0);\n process.stdout.write(`\u2713 abmind-${date}.abm (${size}KB, encrypted)\\n`);\n } else {\n process.stderr.write(`\u26A0\uFE0F abmind backup produced no .abm file\\n`);\n }\n\n // 2. Zip abtars config (plaintext \u2014 not sensitive)\n const files: Array<{ absPath: string; zipPath: string }> = [];\n for (const dir of AB_SAVE) {\n const abs = join(abHome, dir);\n if (existsSync(abs)) collectDir(abs, dir, files);\n }\n\n if (files.length === 0) {\n process.stderr.write(\"Nothing to zip from abtars.\\n\");\n return 1;\n }\n\n const tmpDir = join(process.env[\"TMPDIR\"] ?? \"/tmp\", `abtars-backup-${Date.now()}`);\n mkdirSync(tmpDir, { recursive: true });\n for (const f of files) {\n const dest = join(tmpDir, f.zipPath);\n mkdirSync(dirname(dest), { recursive: true });\n copyFileSync(f.absPath, dest);\n }\n\n const zipPath = join(destDir, `abtars-${date}.zip`);\n const has7z = spawnSync(\"which\", [\"7z\"], { encoding: \"utf-8\" }).status === 0;\n\n let zipOk: boolean;\n if (has7z) {\n const r = spawnSync(\"7z\", [\"a\", zipPath.replace(/\\.zip$/, \".7z\"), \".\"], { cwd: tmpDir, encoding: \"utf-8\" });\n zipOk = r.status === 0;\n } else {\n const r = spawnSync(\"zip\", [\"-r\", zipPath, \".\"], { cwd: tmpDir, encoding: \"utf-8\" });\n zipOk = r.status === 0;\n }\n\n spawnSync(\"rm\", [\"-rf\", tmpDir]);\n\n if (!zipOk) {\n process.stderr.write(`\u26A0\uFE0F zip/7z failed\\n`);\n return 1;\n }\n\n const actualZip = has7z ? zipPath.replace(/\\.zip$/, \".7z\") : zipPath;\n const sizeMb = (statSync(actualZip).size / 1024 / 1024).toFixed(1);\n process.stdout.write(`\u2713 ${actualZip.split(\"/\").pop()} (${sizeMb}MB, ${files.length} files)\\n`);\n\n // 3. Prune old backups\n const maxAge = (pruneDays ?? DEFAULT_PRUNE_DAYS) * 86_400_000;\n const now = Date.now();\n for (const f of readdirSync(destDir)) {\n if (!(f.startsWith(\"abtars-\") || f.startsWith(\"abmind-\"))) continue;\n if (!(f.endsWith(\".zip\") || f.endsWith(\".7z\") || f.endsWith(\".abm\"))) continue;\n const fPath = join(destDir, f);\n try {\n if (now - statSync(fPath).mtimeMs > maxAge) {\n unlinkSync(fPath);\n process.stdout.write(` \uD83D\uDDD1 pruned ${f}\\n`);\n }\n } catch { /* skip */ }\n }\n\n return 0;\n}\n\nfunction collectDir(dir: string, prefix: string, out: Array<{ absPath: string; zipPath: string }>): void {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const abs = join(dir, entry.name);\n const rel = `${prefix}/${entry.name}`;\n if (entry.isDirectory()) {\n collectDir(abs, rel, out);\n } else if (entry.isFile()) {\n out.push({ absPath: abs, zipPath: rel });\n }\n }\n}\n", "/**\n * `abtars onboard` \u2014 first-time interactive configuration wizard\n * (plan #158 Phase 3, subsumes ticket #153).\n *\n * Two modes:\n * - Interactive (default): @clack/prompts wizard asks for bot token,\n * chat ID, transport provider, etc. Writes config/.env + config/users.json.\n * - Non-interactive: --non-interactive --accept-risk with explicit flags\n * for every choice. Fails if any required flag is missing.\n *\n * Scope (kept minimal \u2014 plan caps at ~200 LOC):\n * Prompts cover: Telegram bot token + primary chat ID, default transport\n * provider (openrouter | anthropic | openai), default model, optional\n * Discord a2a channel.\n *\n * Out of scope for Phase 3:\n * - Channel allowlist/users.json multi-user editing (#67 / #204)\n * - Skills configuration (each skill's .env key)\n * - Transport provider credentials beyond DEFAULT_PROVIDER (operator\n * edits config/.env directly post-onboard)\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { packagePaths, readManifest } from '../deploy-lib-import.js';\nimport { showHintOnce } from '../../components/hints.js';\n\nexport interface OnboardOptions {\n readonly nonInteractive: boolean;\n readonly acceptRisk: boolean;\n readonly telegramToken?: string;\n readonly telegramChatId?: string;\n readonly defaultProvider?: string;\n readonly defaultModel?: string;\n readonly discordA2aChannel?: string;\n readonly force: boolean;\n}\n\ntype ProviderChoice = 'openrouter' | 'anthropic' | 'openai' | 'ollama' | 'kiro' | 'gemini';\n\nconst VALID_PROVIDERS: readonly ProviderChoice[] = ['openrouter', 'anthropic', 'openai', 'ollama', 'kiro', 'gemini'];\n\n/** Map onboard choice \u2192 transport.json provider name */\nconst PROVIDER_TRANSPORT_NAME: Record<ProviderChoice, string> = {\n openrouter: 'openrouter',\n anthropic: 'anthropic',\n openai: 'openai',\n ollama: 'ollama',\n kiro: 'kiro',\n gemini: 'gemini',\n};\nconst DEFAULT_MODELS: Record<ProviderChoice, string> = {\n openrouter: 'google/gemini-2.5-flash',\n anthropic: 'claude-sonnet-4-5-20250929',\n openai: 'gpt-4o',\n ollama: 'kimi-k2.5:cloud',\n kiro: 'claude-sonnet-4.6',\n gemini: 'gemini-2.5-flash',\n};\n\n/** Providers that use an API key + HTTP endpoint (can validate via /v1/models). */\nconst API_PROVIDERS: ReadonlySet<ProviderChoice> = new Set(['openrouter', 'anthropic', 'openai', 'ollama']);\n\nconst PROVIDER_ENDPOINT: Record<string, string> = {\n openrouter: 'https://openrouter.ai/api/v1',\n anthropic: 'https://api.anthropic.com/v1',\n openai: 'https://api.openai.com/v1',\n ollama: 'http://localhost:11434/v1',\n};\n\nconst PROVIDER_API_KEY_ENV: Record<ProviderChoice, string> = {\n openrouter: 'OPENROUTER_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n ollama: 'OLLAMA_API_KEY',\n kiro: 'KIRO_API_KEY',\n gemini: 'GEMINI_API_KEY',\n};\n\ninterface WizardAnswers {\n readonly installMode: \"simple\" | \"supervised\" | \"supervised-daemon\";\n readonly userName: string;\n readonly passphrase: string;\n readonly telegramToken: string;\n readonly telegramChatId: string;\n readonly discordBotToken: string;\n readonly discordAppId: string;\n readonly discordA2aChannel: string;\n readonly defaultProvider: ProviderChoice;\n readonly defaultModel: string;\n readonly providerApiKey: string;\n readonly hailMaryModel: string;\n readonly bedTime: string;\n readonly wakeTime: string;\n readonly groqApiKey: string;\n readonly embeddingEnabled: boolean;\n readonly securityMode: string;\n readonly trustMode: boolean;\n}\n\nasync function runInteractive(existing: WizardAnswers | null): Promise<WizardAnswers | null> {\n // Dynamic import \u2014 @clack/prompts is the only dep introduced in Phase 3;\n // keep it off the critical path for Phase 1-2 subcommands.\n const { intro, outro, text, select, confirm, isCancel, cancel } = await import('@clack/prompts');\n\n intro('abtars onboard \u2014 first-time setup');\n const noteEmpty = 'press Enter to skip';\n\n // 1. Deployment mode \u2014 set by `abtars install --mode=X`, read from manifest\n const { packagePaths: pp, readManifest: rm } = await import(\"../deploy-lib-import.js\");\n const mfPaths = pp('abtars');\n const mf = await rm(mfPaths.manifest);\n const installMode = mf?.installMode ?? 'supervised';\n\n // 1c. User name (for personal greeting)\n const userName = await text({\n message: 'Your name',\n placeholder: 'your name',\n initialValue: existing?.userName ?? '',\n });\n if (isCancel(userName)) { cancel('Cancelled.'); return null; }\n\n // 1d. Passphrase \u2014 moved to `abmind install` (#716)\n const passphrase = '';\n\n // 2. Security mode\n const securityMode = await select({\n message: 'Security mode \u2014 restrict agent file/command access?',\n options: [\n { value: 'guardrails', label: 'guardrails \u2014 path guard + command blocklist (recommended)' },\n { value: 'off', label: 'off \u2014 no restrictions (legacy)' },\n ],\n initialValue: existing?.securityMode ?? 'guardrails',\n });\n if (isCancel(securityMode)) { cancel('Cancelled.'); return null; }\n\n // 3. Trust mode\n const trustMode = await confirm({\n message: 'Trust mode \u2014 auto-approve agent permission requests? (recommended for personal use)',\n initialValue: true,\n });\n if (isCancel(trustMode)) { cancel('Cancelled.'); return null; }\n\n // 4-5. Telegram (optional)\n const telegramToken = await text({\n message: `Telegram bot token (@BotFather \u2192 /mybots \u2192 API Token, ${noteEmpty})`,\n placeholder: '123456789:ABCdefGHI...',\n initialValue: existing?.telegramToken,\n validate: (v) => (!v || v.trim() === '' || v.includes(':')) ? undefined : 'expected format \"<id>:<secret>\" or empty',\n });\n if (isCancel(telegramToken)) { cancel('Cancelled.'); return null; }\n\n // Auto-detect chat ID: ask user to send /start to the bot\n let detectedChatId = existing?.telegramChatId ?? '';\n if (telegramToken && telegramToken.trim() && !detectedChatId) {\n const botUrl = `https://api.telegram.org/bot${telegramToken.trim()}`;\n try {\n // Clear any stale webhook/updates so getUpdates works fresh\n await fetch(`${botUrl}/deleteWebhook?drop_pending_updates=true`);\n } catch { /* best effort */ }\n process.stdout.write('\\nSend /start to your bot on Telegram now... (waiting 30s)\\n');\n try {\n const res = await fetch(`${botUrl}/getUpdates?timeout=30&allowed_updates=[\"message\"]`);\n const data = await res.json() as { result?: Array<{ message?: { chat?: { id?: number } } }> };\n const id = data.result?.find(u => u.message?.chat?.id)?.message?.chat?.id;\n if (id) {\n detectedChatId = String(id);\n process.stdout.write(`\u2713 Detected your chat ID: ${detectedChatId}\\n`);\n } else {\n process.stdout.write('\u26A0 No message received \u2014 enter manually below.\\n');\n }\n } catch { process.stdout.write('\u26A0 Could not reach Telegram API \u2014 enter manually below.\\n'); }\n }\n\n const telegramChatId = await text({\n message: `Your Telegram user ID (${noteEmpty})`,\n placeholder: '123456789',\n initialValue: detectedChatId,\n validate: (v) => (!v || v.trim() === '' || /^-?\\d+$/.test(v.trim())) ? undefined : 'expected numeric user ID or empty',\n });\n if (isCancel(telegramChatId)) { cancel('Cancelled.'); return null; }\n\n // 4-6. Discord (all optional)\n const discordBotToken = await text({\n message: `Discord bot token (${noteEmpty})`,\n placeholder: 'MTIzNDU2...',\n initialValue: existing?.discordBotToken,\n });\n if (isCancel(discordBotToken)) { cancel('Cancelled.'); return null; }\n\n const discordAppId = await text({\n message: `Discord app ID (${noteEmpty})`,\n placeholder: '987654321098765432',\n initialValue: existing?.discordAppId,\n validate: (v) => (!v || v.trim() === '' || /^\\d{10,20}$/.test(v.trim())) ? undefined : 'expected Discord snowflake or empty',\n });\n if (isCancel(discordAppId)) { cancel('Cancelled.'); return null; }\n\n const discordA2aChannel = await text({\n message: `Discord allowed channel ID (${noteEmpty})`,\n placeholder: '987654321098765432',\n initialValue: existing?.discordA2aChannel,\n validate: (v) => (!v || v.trim() === '' || /^\\d{10,20}$/.test(v.trim())) ? undefined : 'expected Discord snowflake or empty',\n });\n if (isCancel(discordA2aChannel)) { cancel('Cancelled.'); return null; }\n\n // 7. Provider\n const defaultProvider = await select<ProviderChoice>({\n message: 'Default transport provider',\n options: [\n { value: 'openrouter', label: 'openrouter \u2014 many models via API key' },\n { value: 'anthropic', label: 'anthropic \u2014 Claude API (direct)' },\n { value: 'openai', label: 'openai \u2014 GPT API (direct)' },\n { value: 'ollama', label: 'ollama \u2014 local/cloud Ollama endpoint' },\n { value: 'kiro', label: 'kiro \u2014 Kiro CLI (free or paid; tier via model)' },\n { value: 'gemini', label: 'gemini \u2014 Gemini CLI (free or paid; tier via model)' },\n ],\n initialValue: existing?.defaultProvider ?? 'kiro',\n });\n if (isCancel(defaultProvider)) { cancel('Cancelled.'); return null; }\n\n // 8. Default model\n const defaultModel = await text({\n message: `Default model (for ${defaultProvider})`,\n placeholder: DEFAULT_MODELS[defaultProvider],\n initialValue: existing?.defaultModel ?? DEFAULT_MODELS[defaultProvider],\n });\n if (isCancel(defaultModel)) { cancel('Cancelled.'); return null; }\n\n // 9. API key \u2014 every provider now has an env var; always ask, allow skip\n const apiKeyEnv = PROVIDER_API_KEY_ENV[defaultProvider];\n let providerApiKey = existing?.providerApiKey ?? '';\n {\n const v = await text({\n message: `${apiKeyEnv} (${noteEmpty})`,\n placeholder: existing?.providerApiKey ? '(keep existing)' : 'sk-or-v1-... or leave blank',\n initialValue: existing?.providerApiKey,\n });\n if (isCancel(v)) { cancel('Cancelled.'); return null; }\n providerApiKey = String(v ?? '').trim() || existing?.providerApiKey || '';\n }\n\n // 10. Availability check\n const modelStr = String(defaultModel).trim() || DEFAULT_MODELS[defaultProvider];\n if (API_PROVIDERS.has(defaultProvider) && providerApiKey) {\n const check = await confirm({ message: 'Check availability (GET /v1/models)?', initialValue: true });\n if (isCancel(check)) { cancel('Cancelled.'); return null; }\n if (check) {\n const endpoint = PROVIDER_ENDPOINT[defaultProvider] ?? '';\n const result = await checkModelAvailability(endpoint, providerApiKey, modelStr);\n process.stdout.write(result.ok ? `\u2713 ${modelStr} available on ${defaultProvider}\\n` : `\u26A0\uFE0F ${result.message}\\n`);\n }\n }\n\n // 11. Ultimate fallback (hailMary)\n const hailMary = await text({\n message: `Ultimate fallback model \u2014 hailMary (${noteEmpty}; uses same provider + key as above)`,\n placeholder: 'google/gemini-2.5-flash',\n initialValue: existing?.hailMaryModel ?? 'google/gemini-2.5-flash',\n });\n if (isCancel(hailMary)) { cancel('Cancelled.'); return null; }\n const hailMaryModel = String(hailMary ?? '').trim();\n\n if (hailMaryModel && API_PROVIDERS.has(defaultProvider) && providerApiKey) {\n const check = await confirm({ message: `Check hailMary availability (${hailMaryModel})?`, initialValue: true });\n if (isCancel(check)) { cancel('Cancelled.'); return null; }\n if (check) {\n const endpoint = PROVIDER_ENDPOINT[defaultProvider] ?? '';\n const result = await checkModelAvailability(endpoint, providerApiKey, hailMaryModel);\n process.stdout.write(result.ok ? `\u2713 ${hailMaryModel} available\\n` : `\u26A0\uFE0F ${result.message}\\n`);\n }\n }\n\n // 12. Sleep schedule + voice + trust mode\n const bedTime = await text({\n message: `Bed time HH:MM \u2014 daily sleep trigger (${noteEmpty} for default 0:30)`,\n placeholder: '0:30',\n initialValue: existing?.bedTime,\n validate: (v) => (!v || /^\\d{1,2}:\\d{2}$/.test(v.trim())) ? undefined : 'expected H:MM format',\n });\n if (isCancel(bedTime)) { cancel('Cancelled.'); return null; }\n\n const wakeTime = await text({\n message: `Wake time HH:MM (${noteEmpty} for default 7:00)`,\n placeholder: '7:00',\n initialValue: existing?.wakeTime,\n validate: (v) => (!v || /^\\d{1,2}:\\d{2}$/.test(v.trim())) ? undefined : 'expected H:MM format',\n });\n if (isCancel(wakeTime)) { cancel('Cancelled.'); return null; }\n\n const groqApiKey = await text({\n message: `GROQ_API_KEY for voice-note transcription (${noteEmpty})`,\n placeholder: existing?.groqApiKey ? '(keep existing)' : 'gsk_...',\n initialValue: existing?.groqApiKey,\n });\n if (isCancel(groqApiKey)) { cancel('Cancelled.'); return null; }\n\n // 12b. Embeddings \u2014 handled by `abmind install`, not here\n const embeddingEnabled = false;\n\n // 13. Summary + confirmation\n const mask = (s: string): string => s ? (s.length > 8 ? `${s.slice(0, 4)}\u2026${s.slice(-4)}` : '***') : '(skipped)';\n const lines = [\n '',\n '\u2500\u2500 Summary \u2500\u2500',\n ` Deployment mode: ${installMode}`,\n ` Your name: ${String(userName ?? '') || '(skipped)'}`,\n ` Telegram token: ${mask(String(telegramToken ?? ''))}`,\n ` Telegram chat ID: ${String(telegramChatId ?? '') || '(skipped)'}`,\n ` Discord bot token: ${mask(String(discordBotToken ?? ''))}`,\n ` Discord app ID: ${String(discordAppId ?? '') || '(skipped)'}`,\n ` Discord channel ID: ${String(discordA2aChannel ?? '') || '(skipped)'}`,\n ` Provider: ${defaultProvider}`,\n ` Default model: ${modelStr}`,\n ` ${apiKeyEnv}: ${mask(providerApiKey)}`,\n ` hailMary model: ${hailMaryModel || '(skipped)'}`,\n ` Bed time: ${String(bedTime ?? '') || '(default 0:30)'}`,\n ` Wake time: ${String(wakeTime ?? '') || '(default 7:00)'}`,\n ` GROQ_API_KEY: ${mask(String(groqApiKey ?? ''))}`,\n ` Embeddings: ${embeddingEnabled ? 'enabled' : 'disabled'}`,\n ` Trust mode: ${trustMode ? 'true (auto-approve)' : 'false (prompt user)'}`,\n '',\n ];\n process.stdout.write(lines.join('\\n'));\n\n const ok = await confirm({ message: 'Looks good? Write config?', initialValue: true });\n if (isCancel(ok) || !ok) { cancel('Cancelled \u2014 no files written.'); return null; }\n\n outro('Writing config\u2026');\n\n return {\n installMode: installMode as \"simple\" | \"supervised\" | \"supervised-daemon\",\n userName: String(userName ?? '').trim(),\n passphrase: String(passphrase ?? ''),\n telegramToken: String(telegramToken ?? '').trim(),\n telegramChatId: String(telegramChatId ?? '').trim(),\n discordBotToken: String(discordBotToken ?? '').trim(),\n discordAppId: String(discordAppId ?? '').trim(),\n discordA2aChannel: String(discordA2aChannel ?? '').trim(),\n defaultProvider: defaultProvider as ProviderChoice,\n defaultModel: modelStr,\n providerApiKey,\n hailMaryModel,\n bedTime: String(bedTime ?? '').trim(),\n wakeTime: String(wakeTime ?? '').trim(),\n groqApiKey: String(groqApiKey ?? '').trim() || existing?.groqApiKey || '',\n embeddingEnabled: false,\n securityMode: String(securityMode ?? 'guardrails'),\n trustMode: trustMode === true,\n };\n}\n\n/** Ping GET <endpoint>/models with the API key. Returns ok=true if the model ID is listed. */\nasync function checkModelAvailability(endpoint: string, apiKey: string, model: string): Promise<{ ok: boolean; message: string }> {\n try {\n const res = await fetch(`${endpoint}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(8000),\n });\n if (!res.ok) return { ok: false, message: `provider returned ${res.status}` };\n const json = await res.json() as { data?: Array<{ id: string }> };\n const ids = (json.data ?? []).map(m => m.id);\n return ids.includes(model)\n ? { ok: true, message: 'available' }\n : { ok: false, message: `\"${model}\" not found in provider's model list` };\n } catch (err) {\n return { ok: false, message: `check failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n\nfunction validateNonInteractive(opts: OnboardOptions): WizardAnswers | string {\n if (!opts.acceptRisk) {\n return '--non-interactive requires --accept-risk (you are bypassing safety prompts)';\n }\n const provider = (opts.defaultProvider ?? 'openrouter') as ProviderChoice;\n if (!VALID_PROVIDERS.includes(provider)) {\n return `--default-provider must be one of: ${VALID_PROVIDERS.join(', ')}`;\n }\n return {\n installMode: 'supervised',\n userName: '',\n passphrase: '',\n telegramToken: opts.telegramToken ?? '',\n telegramChatId: opts.telegramChatId ?? '',\n discordBotToken: '',\n discordAppId: '',\n discordA2aChannel: opts.discordA2aChannel ?? '',\n defaultProvider: provider,\n defaultModel: opts.defaultModel ?? DEFAULT_MODELS[provider],\n providerApiKey: '',\n hailMaryModel: '',\n bedTime: '',\n wakeTime: '',\n groqApiKey: '',\n embeddingEnabled: false,\n securityMode: 'guardrails',\n trustMode: true,\n };\n}\n\nasync function readExisting(envPath: string): Promise<WizardAnswers | null> {\n try {\n const content = await readFile(envPath, 'utf-8');\n const kv = new Map<string, string>();\n for (const line of content.split('\\n')) {\n const m = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);\n if (m && m[1] !== undefined && m[2] !== undefined) kv.set(m[1], m[2]);\n }\n const provider = (kv.get('DEFAULT_PROVIDER') ?? 'openrouter') as ProviderChoice;\n if (!VALID_PROVIDERS.includes(provider)) return null;\n const apiKeyEnv = PROVIDER_API_KEY_ENV[provider];\n return {\n installMode: 'simple',\n userName: kv.get('USER_DISPLAY_NAME') ?? '',\n passphrase: '',\n telegramToken: kv.get('TELEGRAM_BOT_TOKEN') ?? '',\n telegramChatId: kv.get('MAIN_CHAT_ID') ?? '',\n discordBotToken: kv.get('DISCORD_BOT_TOKEN') ?? '',\n discordAppId: kv.get('DISCORD_APP_ID') ?? '',\n discordA2aChannel: kv.get('DISCORD_A2A_CHANNEL_ID') ?? '',\n defaultProvider: provider,\n defaultModel: kv.get('DEFAULT_MODEL') ?? DEFAULT_MODELS[provider],\n providerApiKey: apiKeyEnv ? (kv.get(apiKeyEnv) ?? '') : '',\n hailMaryModel: '',\n bedTime: kv.get('BED_TIME') ?? '',\n wakeTime: kv.get('WAKE_TIME') ?? '',\n groqApiKey: kv.get('GROQ_API_KEY') ?? '',\n embeddingEnabled: kv.get('EMBEDDING_ENABLED') === 'true',\n securityMode: kv.get('SECURITY_MODE') ?? 'guardrails',\n trustMode: kv.get('TRUST_MODE') === 'true',\n };\n } catch {\n return null;\n }\n}\n\nfunction mergeEnvContent(existing: string, answers: WizardAnswers): string {\n const owned = new Set([\n 'MAIN_CHAT_ID',\n 'DISCORD_APP_ID', 'DISCORD_A2A_CHANNEL_ID',\n 'DEFAULT_PROVIDER', 'DEFAULT_MODEL',\n 'BED_TIME', 'WAKE_TIME', 'HEARTBEAT_INTERVAL_SEC', 'EMBEDDING_ENABLED', 'TRUST_MODE',\n ]);\n const keptLines: string[] = [];\n for (const line of existing.split('\\n')) {\n const m = line.match(/^([A-Z_][A-Z0-9_]*)=/);\n if (m && m[1] !== undefined && owned.has(m[1])) continue;\n keptLines.push(line);\n }\n while (keptLines.length > 0 && keptLines[keptLines.length - 1] === '') keptLines.pop();\n\n const newBlock = [\n '',\n '# --- abtars onboard-managed ---',\n `DEFAULT_PROVIDER=${answers.defaultProvider}`,\n `DEFAULT_MODEL=${answers.defaultModel}`,\n ];\n if (answers.telegramChatId) newBlock.push(`MAIN_CHAT_ID=${answers.telegramChatId}`);\n else if (answers.discordA2aChannel) newBlock.push(`MAIN_CHAT_ID=${answers.discordA2aChannel}`);\n if (answers.discordAppId) newBlock.push(`DISCORD_APP_ID=${answers.discordAppId}`);\n if (answers.discordA2aChannel) newBlock.push(`DISCORD_A2A_CHANNEL_ID=${answers.discordA2aChannel}`);\n if (answers.bedTime) newBlock.push(`BED_TIME=${answers.bedTime}`);\n if (answers.wakeTime) newBlock.push(`WAKE_TIME=${answers.wakeTime}`);\n newBlock.push(`HEARTBEAT_INTERVAL_SEC=300`);\n newBlock.push(`EMBEDDING_ENABLED=${answers.embeddingEnabled ? 'true' : 'false'}`);\n newBlock.push(`SECURITY_MODE=${answers.securityMode}`);\n newBlock.push(`TRUST_MODE=${answers.trustMode ? 'true' : 'false'}`);\n\n return [...keptLines, ...newBlock, ''].join('\\n');\n}\n\nexport async function onboard(opts: OnboardOptions): Promise<number> {\n const paths = packagePaths('abtars');\n\n // Install log (#718)\n const { initInstallLog, logInstall, logInstallHeader } = await import(\"../install-log.js\");\n initInstallLog(paths.home);\n logInstallHeader(\"onboard\");\n const _origWrite = process.stdout.write.bind(process.stdout);\n process.stdout.write = ((chunk: any, ...args: any[]) => {\n if (typeof chunk === \"string\" && (chunk.startsWith(\"\u2713\") || chunk.startsWith(\"\u26A0\") || chunk.startsWith(\"\u2022\"))) logInstall(chunk.trimEnd());\n return _origWrite(chunk, ...args);\n }) as typeof process.stdout.write;\n\n const manifest = await readManifest(paths.manifest);\n if (!manifest) {\n process.stderr.write(\n `Not installed yet. Run 'abtars install' first.\\n(Manifest not found at ${paths.manifest}.)\\n`,\n );\n return 2;\n }\n\n const envPath = join(paths.config, '.env');\n const existing = await readExisting(envPath);\n const secretDir = join(paths.home, 'secret');\n const { existsSync: secretExists } = await import('node:fs');\n const hasSecretToken = secretExists(join(secretDir, 'TELEGRAM_BOT_TOKEN')) || secretExists(join(secretDir, 'DISCORD_BOT_TOKEN'));\n const hasUserConfig = existing !== null && (existing.telegramToken || existing.discordBotToken || hasSecretToken);\n if (hasUserConfig && !opts.force) {\n showHintOnce(\"onboard-reoffer\", \"Re-running onboard overwrites config. Use --force to confirm, or edit ~/.abtars/config/.env directly.\");\n if (opts.nonInteractive) {\n process.stderr.write(`config/.env already configured. Re-run with --force to overwrite.\\n`);\n return 3;\n }\n }\n\n let answers: WizardAnswers | null;\n if (opts.nonInteractive) {\n const result = validateNonInteractive(opts);\n if (typeof result === 'string') {\n process.stderr.write(`error: ${result}\\n`);\n return 4;\n }\n answers = result;\n } else {\n answers = await runInteractive(existing);\n if (answers === null) return 1;\n }\n\n // Read current .env to preserve operator-added lines.\n let currentContent = '';\n try {\n currentContent = await readFile(envPath, 'utf-8');\n } catch {\n // File doesn't exist yet \u2014 install should have seeded it, but guard anyway.\n currentContent = '';\n }\n\n const next = mergeEnvContent(currentContent, answers);\n await writeFile(envPath, next, { mode: 0o600 });\n process.stdout.write(`\\n\u2713 Wrote ${envPath}\\n`);\n\n // Write secrets to ~/.abtars/secret/ (boot auto-encrypts on first start)\n const secretDirPath = join(paths.home, 'secret');\n await mkdir(secretDirPath, { recursive: true });\n const secrets: Array<[string, string]> = [];\n if (answers.telegramToken) secrets.push(['TELEGRAM_BOT_TOKEN', answers.telegramToken]);\n if (answers.discordBotToken) secrets.push(['DISCORD_BOT_TOKEN', answers.discordBotToken]);\n if (answers.providerApiKey) {\n const providerKeyName = PROVIDER_API_KEY_ENV[answers.defaultProvider];\n if (providerKeyName) secrets.push([providerKeyName, answers.providerApiKey]);\n }\n if (answers.groqApiKey) secrets.push(['GROQ_API_KEY', answers.groqApiKey]);\n for (const [name, value] of secrets) {\n await writeFile(join(secretDirPath, name), value, { mode: 0o600 });\n }\n if (secrets.length > 0) process.stdout.write(`\u2713 ${secrets.length} secrets \u2192 ${secretDirPath}\\n`);\n\n // Write install mode to manifest\n const { writeManifest } = await import('../deploy-lib-import.js');\n const mf = await readManifest(paths.manifest);\n if (mf) await writeManifest(paths.manifest, { ...mf, installMode: answers.installMode });\n process.stdout.write(`\u2713 install mode: ${answers.installMode}\\n`);\n\n // Write transport.json with selected provider + model\n {\n const transportPath = join(paths.config, 'transport.json');\n let tc: Record<string, unknown> = {};\n try {\n tc = JSON.parse(await readFile(transportPath, 'utf-8'));\n } catch (err) { logAndSwallow(\"onboard\", \"op\", err); }\n\n // Seed providers and agents if not already present\n if (!tc[\"providers\"]) {\n tc[\"providers\"] = {\n \"kiro\": { \"transport\": \"acp\", \"cli\": \"kiro-cli\" },\n \"ollama\": { \"transport\": \"api\", \"endpoint\": \"http://localhost:11434/v1\" },\n \"openrouter\": { \"transport\": \"api\", \"endpoint\": \"https://openrouter.ai/api/v1\", \"apiKeyEnv\": \"OPENROUTER_API_KEY\" },\n };\n }\n if (!tc[\"agents\"]) {\n const provName = PROVIDER_TRANSPORT_NAME[answers.defaultProvider] ?? answers.defaultProvider;\n tc[\"agents\"] = {\n \"professor\": { \"model\": answers.defaultModel, \"provider\": provName },\n \"dreamy\": { \"model\": answers.defaultModel, \"provider\": provName },\n \"browsie\": { \"model\": answers.defaultModel, \"provider\": provName },\n \"coding\": { \"model\": answers.defaultModel, \"provider\": provName },\n };\n }\n if (answers.hailMaryModel) {\n const provName = PROVIDER_TRANSPORT_NAME[answers.defaultProvider] ?? answers.defaultProvider;\n tc[\"hailMary\"] = { model: answers.hailMaryModel, provider: provName };\n }\n\n await writeFile(transportPath, JSON.stringify(tc, null, 2) + '\\n', { mode: 0o600 });\n process.stdout.write(`\u2713 transport.json \u2192 ${transportPath}\\n`);\n }\n\n // Write users.json (always \u2014 onboard has the real chat ID)\n {\n const usersPath = join(paths.config, 'users.json');\n const userId = answers.userName.toLowerCase().replace(/[^a-z0-9]/g, '') || 'user';\n const platforms: Record<string, unknown> = {};\n if (answers.telegramChatId) platforms[\"telegram\"] = parseInt(answers.telegramChatId, 10) || answers.telegramChatId;\n if (answers.discordAppId) platforms[\"discord\"] = answers.discordAppId;\n const users = {\n users: [{\n userId,\n displayName: answers.userName || userId,\n role: \"master\",\n maxClass: 3,\n tools: [\"all\"],\n platforms,\n allowedChats: [],\n }],\n };\n await writeFile(usersPath, JSON.stringify(users, null, 2) + '\\n', { mode: 0o600 });\n process.stdout.write(`\u2713 users.json \u2192 ${usersPath}\\n`);\n }\n\n // Seed abmind user_profile.md \u2014 only if abmind is already installed\n if (answers.userName) {\n const abmindHome = process.env['ABMIND_HOME'] ?? join(dirname(paths.home), '.abmind');\n const profileDir = join(abmindHome, 'memory', 'core');\n const { existsSync: profileExists } = await import('node:fs');\n if (profileExists(profileDir)) {\n const profilePath = join(profileDir, 'user_profile.md');\n if (!profileExists(profilePath)) {\n await writeFile(profilePath, `# User Profile\\n\\nName: ${answers.userName}\\n`, { mode: 0o600 });\n process.stdout.write(`\u2713 user_profile.md \u2192 ${profilePath}\\n`);\n }\n }\n }\n\n // Initialize passphrase-based encryption (#607)\n if (answers.passphrase && answers.userName) {\n try {\n const { deriveFromPassphrase, writeKeyVerify } = await import(\"abmind\");\n const { writeToKeyring } = await import(\"abmind\");\n const key = deriveFromPassphrase(answers.passphrase, answers.userName);\n writeKeyVerify(key);\n const stored = writeToKeyring(answers.passphrase);\n process.stdout.write(`\u2713 Encryption key derived from passphrase${stored ? \" (stored in keyring)\" : \"\"}\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 Key init failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Seed default tasks (#383) \u2014 morning greeting + midnight backup\n if (answers.telegramChatId) {\n await seedDefaultTasks(answers.telegramChatId, paths.home);\n }\n\n // Seed default agent-api rules\n const agentsDir = join(paths.home, 'agents');\n const agentRulesPath = join(agentsDir, 'default.md');\n const { existsSync: agentRulesExists } = await import('node:fs');\n if (!agentRulesExists(agentRulesPath)) {\n await mkdir(agentsDir, { recursive: true });\n const bundledPath = join(dirname(fileURLToPath(import.meta.url)), 'agents', 'default.md');\n const fallbackPath = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'agents', 'default.md');\n let content = '# Agent-to-Agent API\\n\\n<!-- See docs for configuration -->\\n';\n try { content = (await readFile(bundledPath, 'utf-8')); } catch {\n try { content = (await readFile(fallbackPath, 'utf-8')); } catch { /* use default */ }\n }\n await writeFile(agentRulesPath, content);\n process.stdout.write(`\u2713 agents/default.md \u2192 ${agentRulesPath}\\n`);\n }\n\n process.stdout.write(`\\n\uD83D\uDCA1 To edit providers, agents, hailMary, fallback chains \u2014 edit:\\n ${join(paths.config, 'transport.json')}\\n Docs: https://aksika.github.io/abtars/\\n`);\n\n // Skip the build+start automation in non-interactive mode (scripts expect to do it themselves)\n if (opts.nonInteractive) {\n process.stdout.write(`\\nNext: 'abtars update' to build, then start the bridge.\\n`);\n return 0;\n }\n\n // \u2500\u2500 Auto-run: abtars update \u2500\u2500\n // Only auto-update if we're inside the abtars repo (git repo with package.json)\n const { existsSync } = await import('node:fs');\n const inRepo = existsSync(join(process.cwd(), '.git')) && existsSync(join(process.cwd(), 'package.json'));\n if (!inRepo) {\n process.stdout.write(`\\nNext: cd into the abtars repo and run 'abtars update' to build and activate.\\n`);\n return 0;\n }\n process.stdout.write(`\\n\u2500\u2500 Running 'abtars update' \u2500\u2500\\n`);\n const { update } = await import('./update.js');\n const updRc = await update({ source: 'local', fromLocal: true, allowAbmindMismatch: false });\n if (updRc !== 0) {\n process.stderr.write(`\\n\u26A0\uFE0F 'abtars update' exited with code ${updRc}. Fix and re-run manually.\\n`);\n return updRc;\n }\n\n // \u2500\u2500 abmind install (optional \u2014 only if abmind is available) \u2500\u2500\n try {\n const { spawnSync } = await import('node:child_process');\n const which = spawnSync('which', ['abmind'], { encoding: 'utf-8' });\n if (which.status === 0) {\n process.stdout.write(`\\n\u2500\u2500 Running 'abmind install' \u2500\u2500\\n`);\n const r = spawnSync('abmind', ['install'], { stdio: 'inherit' });\n if (r.status !== 0) process.stdout.write(`\u26A0 abmind install exited with code ${r.status}\\n`);\n } else {\n process.stdout.write(`\\n\u2139\uFE0F abmind not installed. Run 'npm install -g abmind && abmind install' later to enable persistent memory.\\n`);\n }\n } catch { /* abmind not available \u2014 skip silently */ }\n\n // \u2500\u2500 Start commands \u2014 print + ask to run \u2500\u2500\n const { confirm } = await import('@clack/prompts');\n const startCmds: string[] = [];\n if (answers.installMode === 'simple') {\n startCmds.push('abtars start');\n } else {\n if (process.platform === 'darwin') {\n startCmds.push(`launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist`);\n } else if (process.platform === 'linux') {\n startCmds.push(`systemctl --user daemon-reload`);\n startCmds.push(`systemctl --user enable --now abtars-watchdog`);\n }\n }\n\n process.stdout.write(`\\n\u2500\u2500 Start the bridge \u2500\u2500\\n`);\n const { spawn } = await import('node:child_process');\n if (startCmds.length > 0) {\n for (const cmd of startCmds) process.stdout.write(` \u2192 ${cmd}\\n`);\n const run = await confirm({ message: `Enable and start the watchdog service?`, initialValue: true });\n if (run === true) {\n for (const cmd of startCmds) {\n await new Promise<void>((resolve) => {\n const child = spawn('bash', ['-lc', cmd], { stdio: 'inherit' });\n child.on('exit', () => resolve());\n });\n }\n } else {\n process.stdout.write(` \u2192 skipped (run manually)\\n`);\n }\n }\n\n process.stdout.write(`\\n\u2713 Onboarding complete.\\n`);\n return 0;\n}\n\n// \u2500\u2500 Default task seeding (#383) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface TaskTemplateEntry {\n readonly id?: string;\n readonly title?: string;\n readonly message: string;\n readonly schedule: string;\n readonly type: \"task\" | \"reminder\";\n readonly executor: \"agent\" | \"script\";\n readonly maxRunsPerDay?: number;\n}\n\n/**\n * Seed default tasks (#383) via `abtars-task add` \u2014 skipped if tasks.json\n * already exists. Called from onboard after .env is persisted so chatId\n * is available.\n */\nasync function seedDefaultTasks(chatId: string, abtarsHome: string): Promise<void> {\n const { existsSync } = await import('node:fs');\n const tasksJson = join(abtarsHome, 'state', 'tasks.json');\n if (existsSync(tasksJson)) {\n process.stdout.write(`\u2022 tasks.json exists \u2014 skipping default-task seed\\n`);\n return;\n }\n\n const { fileURLToPath } = await import('node:url');\n const here = dirname(fileURLToPath(import.meta.url));\n // onboard.ts is at src/cli/commands/onboard.ts or dist/cli/commands/onboard.js\n // tasks.default.json lives at repo root \u2014 three levels up.\n const candidates = [\n join(here, '..', '..', '..', 'tasks.default.json'),\n join(here, '..', '..', 'tasks.default.json'),\n ];\n let templatePath: string | null = null;\n for (const p of candidates) {\n if (existsSync(p)) { templatePath = p; break; }\n }\n if (!templatePath) {\n process.stdout.write(`\u2022 tasks.default.json not found \u2014 skipping default-task seed\\n`);\n return;\n }\n\n let template: TaskTemplateEntry[];\n try {\n const raw = await readFile(templatePath, 'utf-8');\n template = JSON.parse(raw) as TaskTemplateEntry[];\n } catch (err) {\n process.stdout.write(`\u2022 Failed to read tasks.default.json: ${err instanceof Error ? err.message : String(err)}\\n`);\n return;\n }\n\n const { spawnSync } = await import('node:child_process');\n let seeded = 0;\n for (const entry of template) {\n const args = [\n 'add',\n '--schedule', entry.schedule,\n '--message', entry.message,\n '--chat-id', chatId,\n '--type', entry.type,\n '--executor', entry.executor,\n ];\n if (entry.id) args.push('--id', entry.id);\n if (entry.title) args.push('--title', entry.title);\n if (entry.maxRunsPerDay) args.push('--max-runs-per-day', String(entry.maxRunsPerDay));\n const result = spawnSync('abtars-task', args, {\n encoding: 'utf-8',\n env: { ...process.env, ABTARS_HOME: abtarsHome },\n });\n if (result.status === 0) {\n seeded++;\n } else {\n const err = result.error?.message ?? result.stderr?.trim() ?? result.stdout?.trim() ?? `exit ${result.status}`;\n process.stdout.write(` \u26A0\uFE0F failed to seed task \"${entry.message.slice(0, 40)}\": ${err}\\n`);\n }\n }\n if (seeded > 0) {\n process.stdout.write(`\u2713 seeded ${seeded} default task${seeded === 1 ? '' : 's'}\\n`);\n }\n}\n", "/**\n * `abtars rollback [--to vX.Y.Z]` \u2014 flip `current` to a prior release.\n *\n * Default target: the most recently prior release (manifest.priorReleases[0]).\n * Validates target exists and has compatible package-lock hash.\n */\n\nimport { hostname } from 'node:os';\nimport {\n acquireLock,\n activate,\n emptyManifest,\n packagePaths,\n readManifest,\n releaseExists,\n writeManifest,\n type PriorRelease,\n} from '../deploy-lib-import.js';\n\nexport interface RollbackOptions {\n readonly to?: string;\n}\n\nexport async function rollback(opts: RollbackOptions): Promise<number> {\n const paths = packagePaths('abtars');\n const manifest = await readManifest(paths.manifest);\n if (!manifest || !manifest.version) {\n process.stderr.write(`No active release; nothing to roll back.\\n`);\n return 2;\n }\n if (manifest.priorReleases.length === 0 && opts.to === undefined) {\n process.stderr.write(`No prior releases recorded; nothing to roll back to.\\n`);\n return 2;\n }\n\n const target: string = opts.to ?? manifest.priorReleases[0]!.version;\n if (target === manifest.version) {\n process.stdout.write(`Already at ${target}; no-op.\\n`);\n return 0;\n }\n\n if (!(await releaseExists(paths.releases, target))) {\n const available = [manifest.version, ...manifest.priorReleases.map((r: PriorRelease) => r.version)];\n process.stderr.write(\n `Target release '${target}' does not exist in ${paths.releases}.\\nAvailable: ${available.join(', ')}\\n` +\n `If pruned, rebuild from the target's git SHA with 'abtars update' instead.\\n`,\n );\n return 2;\n }\n\n // Dep compatibility: warn if package-lock hashes differ. We still allow\n // the rollback \u2014 the shared node_modules/ may or may not work, that's\n // the operator's call. Block only if current and target both have hashes\n // and they differ.\n const targetRecord: PriorRelease | null =\n target === manifest.version\n ? {\n version: manifest.version,\n commit: manifest.commit,\n activatedAt: manifest.activatedAt,\n packageLockHash: manifest.packageLockHash,\n }\n : manifest.priorReleases.find((r: PriorRelease) => r.version === target) ?? null;\n if (\n manifest.packageLockHash &&\n targetRecord?.packageLockHash &&\n manifest.packageLockHash !== targetRecord.packageLockHash\n ) {\n process.stderr.write(\n `v${manifest.version} pinned different deps than v${target} (package-lock hashes differ).\\n` +\n `Rollback via symlink is unsafe. Instead:\\n` +\n ` git checkout ${targetRecord.commit ?? '<commit-from-manifest>'}\\n` +\n ` abtars update --from-local\\n` +\n `This rebuilds node_modules/ to match the target release.\\n`,\n );\n return 3;\n }\n\n const release = await acquireLock(paths.lock, `rollback --to ${target}`);\n try {\n await activate(paths.current, target);\n process.stdout.write(`\u2713 current -> releases/${target}\\n`);\n\n // Update manifest: move current version \u2192 priorReleases[0], lift target out.\n const newPrior: PriorRelease = {\n version: manifest.version,\n commit: manifest.commit,\n activatedAt: manifest.activatedAt,\n packageLockHash: manifest.packageLockHash,\n };\n const remainingPriors = manifest.priorReleases.filter((r: PriorRelease) => r.version !== target);\n await writeManifest(paths.manifest, {\n ...manifest,\n version: target,\n commit: targetRecord?.commit ?? null,\n packageLockHash: targetRecord?.packageLockHash ?? null,\n activatedAt: new Date().toISOString(),\n priorReleases: [newPrior, ...remainingPriors],\n });\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n process.stdout.write(`\\nRollback complete: ${target}\\n`);\n // Touch unused imports to satisfy strict verifier (no-op).\n void emptyManifest;\n void hostname;\n return 0;\n } finally {\n await release();\n }\n}\n", "/**\n * `abtars status` \u2014 print manifest + lock state.\n * Read-only. Exit code 0 on healthy install, 1 otherwise.\n */\n\nimport { inspectLock, packagePaths, readCurrent, readManifest, type PriorRelease } from '../deploy-lib-import.js';\n\nexport async function status(): Promise<number> {\n const paths = packagePaths('abtars');\n const manifest = await readManifest(paths.manifest);\n const current = await readCurrent(paths.current);\n const lock = await inspectLock(paths.lock);\n\n if (!manifest) {\n process.stdout.write(\n `abtars: not installed (no manifest at ${paths.manifest})\\n` +\n `Run 'abtars install' to set up.\\n`,\n );\n return 1;\n }\n\n const lines = [\n `abtars status`,\n ` home: ${paths.home}`,\n ` version: ${manifest.version || '(unset \u2014 run update)'}`,\n ` commit: ${manifest.commit ?? '(unknown)'}`,\n ` branch: ${manifest.branch ?? '(unknown)'}`,\n ` source: ${manifest.source}`,\n ` activated: ${manifest.activatedAt}`,\n ` current ->: ${current ?? '(missing)'}`,\n ` host: ${manifest.host}`,\n ` prior: ${manifest.priorReleases.length > 0 ? manifest.priorReleases.map((r: PriorRelease) => r.version).join(', ') : '(none)'}`,\n ];\n if (lock.held) {\n lines.push(\n ` lock: HELD by pid ${lock.content.pid} (${lock.content.cmd})${lock.stale ? ' \u2014 STALE' : ''}`,\n );\n } else {\n lines.push(` lock: not held`);\n }\n process.stdout.write(`${lines.join('\\n')}\\n`);\n\n // Surface mismatch between manifest version and current symlink target.\n if (current !== null && manifest.version !== '' && current !== manifest.version) {\n process.stderr.write(\n `\\nWarning: current symlink points at '${current}' but manifest says '${manifest.version}'.\\n` +\n `Re-run 'abtars update' or 'abtars rollback' to reconcile.\\n`,\n );\n return 1;\n }\n return 0;\n}\n", "/**\n * abtars CLI top-level dispatcher (#158 Phase 1b).\n *\n * Subcommands:\n * install [--upgrade] [--force]\n * update [--source local|npm|github] [--from-local]\n * rollback [--to <version>]\n * status\n *\n * Phase 2 will add: reset, doctor, onboard, migrate.\n * Phase 1 install intentionally does NOT run onboard \u2014 operator seeds\n * config/ from examples only; interactive onboard is Phase 3.\n */\n\nprocess.umask(0o077); // #441: all runtime files 600, dirs 700\nimport { doctor } from './commands/doctor.js';\nimport { install } from './commands/install.js';\nimport { uninstall } from './commands/uninstall.js';\nimport { backup } from './commands/backup.js';\nimport { onboard } from './commands/onboard.js';\nimport { rollback } from './commands/rollback.js';\nimport { restart } from './commands/restart.js';\nimport { status } from './commands/status.js';\nimport { stop } from './commands/stop.js';\nimport { update } from './commands/update.js';\n\ntype Args = {\n readonly command: string;\n readonly flags: ReadonlyMap<string, string | boolean>;\n};\n\nfunction parseArgs(argv: readonly string[]): Args {\n const command = argv[0] ?? '';\n const flags = new Map<string, string | boolean>();\n for (let i = 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === undefined) continue;\n if (a.startsWith('--')) {\n const eqIdx = a.indexOf('=');\n if (eqIdx > 2) {\n flags.set(a.slice(2, eqIdx), a.slice(eqIdx + 1));\n } else {\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith('--')) {\n flags.set(a.slice(2), next);\n i++;\n } else {\n flags.set(a.slice(2), true);\n }\n }\n }\n }\n return { command, flags };\n}\n\nfunction printUsage(): void {\n process.stdout.write(\n `abtars \u2014 install/update CLI (#158)\n\nUsage:\n abtars install [--force] [--mode=simple|supervised|supervised-daemon] [--restore <backup.zip>]\n abtars uninstall [--yes]\n abtars update [--source local|npm|github] [--from-local]\n abtars rollback [--to <version>]\n abtars backup\n abtars restore <file.zip|.7z>\n abtars doctor [<args passed to doctor.sh>...]\n abtars onboard [--non-interactive --accept-risk --telegram-token ... --telegram-chat-id ...]\n abtars restart [--cold]\n abtars start\n abtars stop [--force]\n abtars status\n abtars logs\n abtars config\n`,\n );\n}\n\nexport async function main(argv: readonly string[]): Promise<number> {\n const { command, flags } = parseArgs(argv);\n\n try {\n switch (command) {\n case 'install':\n return await install({\n restore: typeof flags.get('restore') === 'string' ? (flags.get('restore') as string) : undefined,\n force: flags.get('force') === true,\n dryRun: flags.get('dry-run') === true,\n mode: flags.get('mode') === 'simple' ? 'simple' : flags.get('mode') === 'supervised' ? 'supervised' : flags.get('mode') === 'supervised-daemon' ? 'supervised-daemon' : undefined,\n });\n case 'uninstall':\n return await uninstall({ yes: flags.get('yes') === true });\n case 'update':\n return await update({\n source: (flags.get('source') as 'local' | 'npm' | 'github' | undefined) ?? 'local',\n fromLocal: flags.get('from-local') === true,\n allowAbmindMismatch: flags.get('allow-abmind-mismatch') === true,\n });\n case 'rollback':\n return await rollback({\n to: typeof flags.get('to') === 'string' ? (flags.get('to') as string) : undefined,\n });\n case 'backup':\n return await backup(typeof flags.get('output') === 'string' ? (flags.get('output') as string) : undefined);\n case 'restore': {\n const { restore } = await import('./commands/restore.js');\n return await restore(argv[1] ?? '');\n }\n case 'doctor':\n // Pass remaining --flags through to doctor.sh. Primitive pass-through:\n // anything after 'doctor' except recognized flags goes to the script.\n return await doctor(argv.slice(1).filter((a) => a !== ''));\n case 'onboard':\n return await onboard({\n nonInteractive: flags.get('non-interactive') === true,\n acceptRisk: flags.get('accept-risk') === true,\n telegramToken: typeof flags.get('telegram-token') === 'string' ? (flags.get('telegram-token') as string) : undefined,\n telegramChatId: typeof flags.get('telegram-chat-id') === 'string' ? (flags.get('telegram-chat-id') as string) : undefined,\n defaultProvider: typeof flags.get('default-provider') === 'string' ? (flags.get('default-provider') as string) : undefined,\n defaultModel: typeof flags.get('default-model') === 'string' ? (flags.get('default-model') as string) : undefined,\n discordA2aChannel: typeof flags.get('discord-a2a-channel') === 'string' ? (flags.get('discord-a2a-channel') as string) : undefined,\n force: flags.get('force') === true,\n });\n case 'status':\n return await status();\n case 'restart':\n return await restart({ cold: flags.get('cold') === true });\n case 'stop':\n return await stop({ force: flags.get('force') === true });\n case 'start': {\n const { start: startCmd } = await import('./commands/start.js');\n return await startCmd();\n }\n case 'logs': {\n const { logs } = await import('./commands/logs.js');\n return await logs();\n }\n case 'config': {\n const { configShow } = await import('./commands/config-show.js');\n return await configShow();\n }\n case 'passwd': {\n const { passwd } = await import('./commands/passwd.js');\n return await passwd();\n }\n case '':\n case 'help':\n case '--help':\n case '-h':\n printUsage();\n return 0;\n default:\n process.stderr.write(`unknown subcommand: ${command}\\n\\n`);\n printUsage();\n return 2;\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`error: ${msg}\\n`);\n return 1;\n }\n}\n\n// Direct-run guard: works when invoked as `node dist/cli/abtars.js` AND\n// as `abtars` (npm-installed bin). Not executed under vitest.\nconst isDirectRun =\n typeof process.argv[1] === 'string' &&\n (process.argv[1].endsWith('abtars.js') ||\n process.argv[1].endsWith('abtars-cli.js') ||\n process.argv[1].endsWith('abtars') ||\n process.argv[1].endsWith('abtars.ts'));\n\nif (isDirectRun && process.env['VITEST'] === undefined) {\n void main(process.argv.slice(2)).then((code) => process.exit(code));\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * `abtars doctor` \u2014 thin TS wrapper around scripts/doctor.sh.\n *\n * Per plan v7 Ag2-review round 2: don't port bash-native diagnostic logic\n * to TS. scripts/doctor.sh does pgrep/filesystem/lock inspection well;\n * rewriting duplicates platform detection. Wrapper spawns doctor.sh\n * (installed by the migration into $AB/scripts/), captures exit status +\n * output, pretty-prints, and returns the status.\n *\n * Fallback: if $AB/scripts/doctor.sh isn't present (pre-install, or flat\n * layout pre-migration), execs the repo's scripts/doctor.sh from cwd.\n */\n\nimport { spawn } from 'node:child_process';\nimport { stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { packagePaths } from '../deploy-lib-import.js';\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function doctor(args: readonly string[] = []): Promise<number> {\n const paths = packagePaths('abtars');\n const installed = join(paths.home, 'scripts', 'doctor.sh');\n const repo = join(process.cwd(), 'scripts', 'doctor.sh');\n const candidate = (await pathExists(installed)) ? installed : (await pathExists(repo)) ? repo : null;\n\n if (candidate === null) {\n process.stderr.write(\n `doctor.sh not found (looked in ${installed} and ${repo}).\\n` +\n `Run from an abtars checkout or after 'abtars install'.\\n`,\n );\n return 2;\n }\n\n return new Promise<number>((resolve) => {\n const child = spawn(candidate, [...args], { stdio: 'inherit', env: process.env });\n child.on('exit', (code) => resolve(code ?? 1));\n child.on('error', (err) => {\n process.stderr.write(`doctor.sh spawn failed: ${err.message}\\n`);\n resolve(1);\n });\n });\n}\n", "/**\n * abtars uninstall \u2014 stop everything, remove ~/.abtars/ and CLI symlinks.\n *\n * Destructive. Requires typing \"uninstall\" to confirm (or --yes flag).\n */\n\nimport { existsSync, readdirSync, unlinkSync, readlinkSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { stop } from \"./stop.js\";\n\nfunction abtarsHome(): string {\n return process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n}\n\nfunction binDir(): string {\n return join(process.env[\"HOME\"] ?? \"\", \".local\", \"bin\");\n}\n\nasync function confirm(): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(\"\u26A0\uFE0F This will DELETE ~/.abtars/ entirely. Type 'uninstall' to confirm: \", (answer) => {\n rl.close();\n resolve(answer.trim() === \"uninstall\");\n });\n });\n}\n\nfunction removeSymlinks(): string[] {\n const dir = binDir();\n if (!existsSync(dir)) return [];\n const home = abtarsHome();\n const removed: string[] = [];\n for (const entry of readdirSync(dir)) {\n if (!entry.startsWith(\"abtars\")) continue;\n const full = join(dir, entry);\n try {\n const target = readlinkSync(full);\n if (target.includes(home) || target.includes(\".abtars\")) {\n unlinkSync(full);\n removed.push(entry);\n }\n } catch { /* not a symlink or already gone */ }\n }\n return removed;\n}\n\nfunction unloadLaunchd(): void {\n if (process.platform !== \"darwin\") return;\n const plist = join(process.env[\"HOME\"] ?? \"\", \"Library\", \"LaunchAgents\", \"com.abtars.watchdog.plist\");\n if (!existsSync(plist)) return;\n try {\n const { execSync } = require(\"node:child_process\");\n execSync(`launchctl bootout gui/$(id -u) \"${plist}\" 2>/dev/null`, { stdio: \"ignore\" });\n unlinkSync(plist);\n } catch { /* already unloaded or missing */ }\n}\n\nexport async function uninstall(opts: { yes?: boolean }): Promise<number> {\n const home = abtarsHome();\n\n if (!existsSync(home)) {\n process.stdout.write(\"Nothing to uninstall \u2014 ~/.abtars/ does not exist.\\n\");\n return 0;\n }\n\n if (!opts.yes) {\n const confirmed = await confirm();\n if (!confirmed) {\n process.stdout.write(\"Aborted.\\n\");\n return 1;\n }\n }\n\n // 1. Stop bridge + watchdog\n await stop({ force: true });\n\n // 2. Unload launchd plist\n unloadLaunchd();\n\n // 3. Remove CLI symlinks\n const removed = removeSymlinks();\n\n // 4. Remove ~/.abtars/\n rmSync(home, { recursive: true, force: true });\n\n // 5. Summary\n process.stdout.write(`\\n\u2713 Uninstalled abtars\\n`);\n process.stdout.write(` Removed: ${home}/\\n`);\n if (removed.length > 0) {\n process.stdout.write(` Symlinks removed: ${removed.join(\", \")}\\n`);\n }\n process.stdout.write(`\\n Source repo (~/abtars/) is untouched.\\n`);\n return 0;\n}\n", "/**\n * abtars stop \u2014 kill watchdog (if running) then bridge (#372).\n *\n * Ordering matters: watchdog dies first so it doesn't respawn the bridge\n * we're about to kill. Each process gets SIGTERM \u2192 5s grace \u2192 SIGKILL.\n *\n * Lock files (verified against live install):\n * ~/.abtars/watchdog.lock = {\"pid\": number, \"lastCheck\": epoch-ms}\n * ~/.abtars/bridge.lock = {\"pid\": number, \"lastHeartbeat\": ..., ...}\n * Both are separate files; no watchdog PID is embedded in bridge.lock.\n *\n * Supervised-daemon mode: refuses without --force (systemd/launchd would\n * respawn immediately). Mirrors the pattern in restart.ts for --cold.\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nfunction abtarsHome(): string {\n return process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n}\n\nfunction readJsonField(file: string, field: string): unknown {\n try {\n const data = JSON.parse(readFileSync(file, \"utf-8\"));\n return data[field];\n } catch { return undefined; }\n}\n\nfunction pidAlive(pid: number): boolean {\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\n/** Linux-only guard: verify cmdline contains expected substring. Mac has no /proc \u2014 returns true. */\nfunction pidLooksLike(pid: number, needles: string[]): boolean {\n try {\n const cmdline = readFileSync(`/proc/${pid}/cmdline`, \"utf-8\");\n return needles.some(n => cmdline.includes(n));\n } catch { return true; /* /proc unavailable \u2014 trust the lock */ }\n}\n\ntype KillResult = \"killed\" | \"forced\" | \"gone\" | \"stale\" | \"not-running\";\n\nasync function killGracefully(pid: number, needles: string[]): Promise<KillResult> {\n if (!pidAlive(pid)) return \"not-running\";\n if (!pidLooksLike(pid, needles)) return \"stale\";\n\n try { process.kill(pid, \"SIGTERM\"); } catch { return \"not-running\"; }\n\n // 10 \u00D7 500ms poll = 5s grace per process\n for (let i = 0; i < 10; i++) {\n await new Promise(r => setTimeout(r, 500));\n if (!pidAlive(pid)) return \"killed\";\n }\n\n // Force kill\n try { process.kill(pid, \"SIGKILL\"); } catch { /* already gone */ }\n await new Promise(r => setTimeout(r, 500));\n return pidAlive(pid) ? \"not-running\" : \"forced\";\n}\n\nfunction removeLock(path: string): void {\n try { if (existsSync(path)) unlinkSync(path); }\n catch (err) { logAndSwallow(\"stop\", \"op\", err); }\n}\n\nexport async function stop(opts: { force?: boolean }): Promise<number> {\n const home = abtarsHome();\n const manifestPath = join(home, \"manifest.json\");\n const watchdogLock = join(home, \"watchdog.lock\");\n const bridgeLock = join(home, \"bridge.lock\");\n const force = opts.force ?? false;\n\n // Supervised-daemon refusal\n const installMode = readJsonField(manifestPath, \"installMode\") as string | undefined;\n if (installMode === \"supervised-daemon\" && !force) {\n process.stderr.write(`Bridge runs under supervised-daemon \u2014 use supervisor stop (supervisor will respawn if you kill the process directly).\\n`);\n if (process.platform === \"darwin\") {\n process.stderr.write(` sudo -k launchctl bootout system/com.abtars.daemon\\n`);\n } else {\n process.stderr.write(` sudo -k systemctl stop abtars\\n`);\n }\n process.stderr.write(`\\nUse 'abtars stop --force' to kill the process anyway (supervisor will respawn).\\n`);\n return 1;\n }\n\n // 1) Unload supervisor service (prevent respawn) then kill watchdog\n if (force && process.platform === \"darwin\") {\n try { execFileSync(\"launchctl\", [\"bootout\", `gui/${process.getuid!()}`, join(homedir(), \"Library\", \"LaunchAgents\", \"com.abtars.watchdog.plist\")], { timeout: 5000 }); }\n catch { /* already unloaded or not present */ }\n }\n\n const wdPid = readJsonField(watchdogLock, \"pid\") as number | undefined;\n let wdResult: KillResult = \"not-running\";\n let wdPidActual: number | undefined;\n if (wdPid && wdPid > 0) {\n wdPidActual = wdPid;\n wdResult = await killGracefully(wdPid, [\"watchdog.sh\"]);\n if (wdResult === \"killed\" || wdResult === \"forced\") {\n removeLock(watchdogLock);\n } else if (wdResult === \"stale\") {\n process.stdout.write(`\u26A0\uFE0F watchdog.lock PID ${wdPid} is not watchdog.sh \u2014 stale lock, removing\\n`);\n removeLock(watchdogLock);\n }\n }\n\n // 2) Bridge second\n const brPid = readJsonField(bridgeLock, \"pid\") as number | undefined;\n let brResult: KillResult = \"not-running\";\n let brPidActual: number | undefined;\n if (brPid && brPid > 0) {\n brPidActual = brPid;\n brResult = await killGracefully(brPid, [\"abtars\", \"main.js\", \"bundle\"]);\n if (brResult === \"killed\" || brResult === \"forced\") {\n removeLock(bridgeLock);\n } else if (brResult === \"stale\") {\n process.stdout.write(`\u26A0\uFE0F bridge.lock PID ${brPid} is not abtars \u2014 stale lock, removing\\n`);\n removeLock(bridgeLock);\n }\n }\n\n // 3) Summary + exit code\n const wdMsg = formatResult(\"Watchdog\", wdResult, wdPidActual);\n const brMsg = formatResult(\"Bridge\", brResult, brPidActual);\n\n if (wdResult === \"not-running\" && brResult === \"not-running\") {\n process.stdout.write(`Nothing to stop \u2014 neither watchdog nor bridge running.\\n`);\n return 0;\n }\n\n process.stdout.write(`\uD83D\uDED1 ${wdMsg}\\n ${brMsg}\\n`);\n\n if (force && process.platform === \"darwin\") {\n process.stdout.write(` LaunchAgent unloaded. To restart: launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist\\n`);\n }\n\n // Return 0 if nothing's still alive; 1 if we left something running\n const allDown =\n (wdResult === \"not-running\" || wdResult === \"killed\" || wdResult === \"forced\" || wdResult === \"stale\") &&\n (brResult === \"not-running\" || brResult === \"killed\" || brResult === \"forced\" || brResult === \"stale\");\n return allDown ? 0 : 1;\n}\n\nfunction formatResult(label: string, result: KillResult, pid: number | undefined): string {\n switch (result) {\n case \"killed\": return `${label} stopped (PID ${pid}, SIGTERM)`;\n case \"forced\": return `${label} stopped (PID ${pid}, SIGKILL)`;\n case \"stale\": return `${label} lock was stale (PID ${pid} not ours)`;\n case \"not-running\": return `${label} was not running`;\n case \"gone\": return `${label} kill failed \u2014 PID ${pid} still alive`;\n }\n}\n", "/**\n * `abtars backup` \u2014 orchestrates abmind encrypted backup + abtars config zip.\n * Produces two files in ~/.backup-abtars/:\n * abtars-YYYY-MM-DD.zip \u2014 config, skills, workspace (plaintext)\n * abmind-YYYY-MM-DD.abm \u2014 encrypted memory (via abmind backup)\n */\n\nimport { existsSync, mkdirSync, readdirSync, statSync, renameSync, unlinkSync, copyFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { abtarsHome } from \"../../paths.js\";\n\nconst AB_SAVE = [\"config\", \"secret\", \"tasks\", \"logo\", \"workspace\", \"skills/custom\", \"skills/self\"];\nconst DEFAULT_PRUNE_DAYS = 7;\n\nexport async function backup(outputDir?: string, pruneDays?: number): Promise<number> {\n const abHome = abtarsHome();\n const date = new Date().toISOString().slice(0, 10);\n const destDir = outputDir ?? join(dirname(abHome), \".backup-abtars\");\n mkdirSync(destDir, { recursive: true });\n\n // 1. Run abmind backup (encrypted .abm)\n const abmindPaths = [\n join(dirname(abHome), \".abmind\", \"lib\", \"node_modules\", \"abmind\", \"dist\", \"cli\", \"abmind-backup.js\"),\n join(dirname(abHome), \"workspace\", \"ab\", \"abmind\", \"dist\", \"cli\", \"abmind-backup.js\"),\n ];\n const abmindBin = abmindPaths.find(p => existsSync(p));\n let abmResult: ReturnType<typeof spawnSync>;\n if (abmindBin) {\n abmResult = spawnSync(\"node\", [abmindBin], { encoding: \"utf-8\", env: { ...process.env } });\n } else {\n abmResult = spawnSync(\"abmind\", [\"backup\"], { encoding: \"utf-8\", env: { ...process.env } });\n }\n\n if (abmResult.status !== 0) {\n process.stderr.write(`\u26A0\uFE0F abmind backup failed: ${abmResult.stderr || abmResult.stdout}\\n`);\n return 1;\n }\n\n // Find the .abm file produced (latest in ~/.abmind/backups/)\n const abmindBackupsDir = join(dirname(abHome), \".abmind\", \"backups\");\n let abmFile: string | undefined;\n if (existsSync(abmindBackupsDir)) {\n const abmFiles = readdirSync(abmindBackupsDir)\n .filter(f => f.endsWith(\".abm\"))\n .sort()\n .reverse();\n if (abmFiles.length > 0) abmFile = abmFiles[0];\n }\n\n if (abmFile) {\n const src = join(abmindBackupsDir, abmFile);\n const dest = join(destDir, `abmind-${date}.abm`);\n renameSync(src, dest);\n const size = (statSync(dest).size / 1024).toFixed(0);\n process.stdout.write(`\u2713 abmind-${date}.abm (${size}KB, encrypted)\\n`);\n } else {\n process.stderr.write(`\u26A0\uFE0F abmind backup produced no .abm file\\n`);\n }\n\n // 2. Zip abtars config (plaintext \u2014 not sensitive)\n const files: Array<{ absPath: string; zipPath: string }> = [];\n for (const dir of AB_SAVE) {\n const abs = join(abHome, dir);\n if (existsSync(abs)) collectDir(abs, dir, files);\n }\n\n if (files.length === 0) {\n process.stderr.write(\"Nothing to zip from abtars.\\n\");\n return 1;\n }\n\n const tmpDir = join(process.env[\"TMPDIR\"] ?? \"/tmp\", `abtars-backup-${Date.now()}`);\n mkdirSync(tmpDir, { recursive: true });\n for (const f of files) {\n const dest = join(tmpDir, f.zipPath);\n mkdirSync(dirname(dest), { recursive: true });\n copyFileSync(f.absPath, dest);\n }\n\n const zipPath = join(destDir, `abtars-${date}.zip`);\n const has7z = spawnSync(\"which\", [\"7z\"], { encoding: \"utf-8\" }).status === 0;\n\n let zipOk: boolean;\n if (has7z) {\n const r = spawnSync(\"7z\", [\"a\", zipPath.replace(/\\.zip$/, \".7z\"), \".\"], { cwd: tmpDir, encoding: \"utf-8\" });\n zipOk = r.status === 0;\n } else {\n const r = spawnSync(\"zip\", [\"-r\", zipPath, \".\"], { cwd: tmpDir, encoding: \"utf-8\" });\n zipOk = r.status === 0;\n }\n\n spawnSync(\"rm\", [\"-rf\", tmpDir]);\n\n if (!zipOk) {\n process.stderr.write(`\u26A0\uFE0F zip/7z failed\\n`);\n return 1;\n }\n\n const actualZip = has7z ? zipPath.replace(/\\.zip$/, \".7z\") : zipPath;\n const sizeMb = (statSync(actualZip).size / 1024 / 1024).toFixed(1);\n process.stdout.write(`\u2713 ${actualZip.split(\"/\").pop()} (${sizeMb}MB, ${files.length} files)\\n`);\n\n // 3. Prune old backups\n const maxAge = (pruneDays ?? DEFAULT_PRUNE_DAYS) * 86_400_000;\n const now = Date.now();\n for (const f of readdirSync(destDir)) {\n if (!(f.startsWith(\"abtars-\") || f.startsWith(\"abmind-\"))) continue;\n if (!(f.endsWith(\".zip\") || f.endsWith(\".7z\") || f.endsWith(\".abm\"))) continue;\n const fPath = join(destDir, f);\n try {\n if (now - statSync(fPath).mtimeMs > maxAge) {\n unlinkSync(fPath);\n process.stdout.write(` \uD83D\uDDD1 pruned ${f}\\n`);\n }\n } catch { /* skip */ }\n }\n\n return 0;\n}\n\nfunction collectDir(dir: string, prefix: string, out: Array<{ absPath: string; zipPath: string }>): void {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const abs = join(dir, entry.name);\n const rel = `${prefix}/${entry.name}`;\n if (entry.isDirectory()) {\n collectDir(abs, rel, out);\n } else if (entry.isFile()) {\n out.push({ absPath: abs, zipPath: rel });\n }\n }\n}\n", "/**\n * `abtars onboard` \u2014 first-time interactive configuration wizard\n * (plan #158 Phase 3, subsumes ticket #153).\n *\n * Two modes:\n * - Interactive (default): @clack/prompts wizard asks for bot token,\n * chat ID, transport provider, etc. Writes config/.env + config/users.json.\n * - Non-interactive: --non-interactive --accept-risk with explicit flags\n * for every choice. Fails if any required flag is missing.\n *\n * Scope (kept minimal \u2014 plan caps at ~200 LOC):\n * Prompts cover: Telegram bot token + primary chat ID, default transport\n * provider (openrouter | anthropic | openai), default model, optional\n * Discord a2a channel.\n *\n * Out of scope for Phase 3:\n * - Channel allowlist/users.json multi-user editing (#67 / #204)\n * - Skills configuration (each skill's .env key)\n * - Transport provider credentials beyond DEFAULT_PROVIDER (operator\n * edits config/.env directly post-onboard)\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { packagePaths, readManifest } from '../deploy-lib-import.js';\nimport { showHintOnce } from '../../components/hints.js';\n\nexport interface OnboardOptions {\n readonly nonInteractive: boolean;\n readonly acceptRisk: boolean;\n readonly telegramToken?: string;\n readonly telegramChatId?: string;\n readonly defaultProvider?: string;\n readonly defaultModel?: string;\n readonly discordA2aChannel?: string;\n readonly force: boolean;\n}\n\ntype ProviderChoice = 'openrouter' | 'anthropic' | 'openai' | 'ollama' | 'kiro' | 'gemini';\n\nconst VALID_PROVIDERS: readonly ProviderChoice[] = ['openrouter', 'anthropic', 'openai', 'ollama', 'kiro', 'gemini'];\n\n/** Map onboard choice \u2192 transport.json provider name */\nconst PROVIDER_TRANSPORT_NAME: Record<ProviderChoice, string> = {\n openrouter: 'openrouter',\n anthropic: 'anthropic',\n openai: 'openai',\n ollama: 'ollama',\n kiro: 'kiro',\n gemini: 'gemini',\n};\nconst DEFAULT_MODELS: Record<ProviderChoice, string> = {\n openrouter: 'google/gemini-2.5-flash',\n anthropic: 'claude-sonnet-4-5-20250929',\n openai: 'gpt-4o',\n ollama: 'kimi-k2.5:cloud',\n kiro: 'claude-sonnet-4.6',\n gemini: 'gemini-2.5-flash',\n};\n\n/** Providers that use an API key + HTTP endpoint (can validate via /v1/models). */\nconst API_PROVIDERS: ReadonlySet<ProviderChoice> = new Set(['openrouter', 'anthropic', 'openai', 'ollama']);\n\nconst PROVIDER_ENDPOINT: Record<string, string> = {\n openrouter: 'https://openrouter.ai/api/v1',\n anthropic: 'https://api.anthropic.com/v1',\n openai: 'https://api.openai.com/v1',\n ollama: 'http://localhost:11434/v1',\n};\n\nconst PROVIDER_API_KEY_ENV: Record<ProviderChoice, string> = {\n openrouter: 'OPENROUTER_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n ollama: 'OLLAMA_API_KEY',\n kiro: 'KIRO_API_KEY',\n gemini: 'GEMINI_API_KEY',\n};\n\ninterface WizardAnswers {\n readonly installMode: \"simple\" | \"supervised\" | \"supervised-daemon\";\n readonly userName: string;\n readonly passphrase: string;\n readonly telegramToken: string;\n readonly telegramChatId: string;\n readonly discordBotToken: string;\n readonly discordAppId: string;\n readonly discordA2aChannel: string;\n readonly defaultProvider: ProviderChoice;\n readonly defaultModel: string;\n readonly providerApiKey: string;\n readonly hailMaryModel: string;\n readonly bedTime: string;\n readonly wakeTime: string;\n readonly groqApiKey: string;\n readonly embeddingEnabled: boolean;\n readonly securityMode: string;\n readonly trustMode: boolean;\n}\n\nasync function runInteractive(existing: WizardAnswers | null): Promise<WizardAnswers | null> {\n // Dynamic import \u2014 @clack/prompts is the only dep introduced in Phase 3;\n // keep it off the critical path for Phase 1-2 subcommands.\n const { intro, outro, text, select, confirm, isCancel, cancel } = await import('@clack/prompts');\n\n intro('abtars onboard \u2014 first-time setup');\n const noteEmpty = 'press Enter to skip';\n\n // 1. Deployment mode \u2014 set by `abtars install --mode=X`, read from manifest\n const { packagePaths: pp, readManifest: rm } = await import(\"../deploy-lib-import.js\");\n const mfPaths = pp('abtars');\n const mf = await rm(mfPaths.manifest);\n const installMode = mf?.installMode ?? 'supervised';\n\n // 1c. User name (for personal greeting)\n const userName = await text({\n message: 'Your name',\n placeholder: 'your name',\n initialValue: existing?.userName ?? '',\n });\n if (isCancel(userName)) { cancel('Cancelled.'); return null; }\n\n // 1d. Passphrase \u2014 moved to `abmind install` (#716)\n const passphrase = '';\n\n // 2. Security mode\n const securityMode = await select({\n message: 'Security mode \u2014 restrict agent file/command access?',\n options: [\n { value: 'guardrails', label: 'guardrails \u2014 path guard + command blocklist (recommended)' },\n { value: 'off', label: 'off \u2014 no restrictions (legacy)' },\n ],\n initialValue: existing?.securityMode ?? 'guardrails',\n });\n if (isCancel(securityMode)) { cancel('Cancelled.'); return null; }\n\n // 3. Trust mode\n const trustMode = await confirm({\n message: 'Trust mode \u2014 auto-approve agent permission requests? (recommended for personal use)',\n initialValue: true,\n });\n if (isCancel(trustMode)) { cancel('Cancelled.'); return null; }\n\n // 4-5. Telegram (optional)\n const telegramToken = await text({\n message: `Telegram bot token (@BotFather \u2192 /mybots \u2192 API Token, ${noteEmpty})`,\n placeholder: '123456789:ABCdefGHI...',\n initialValue: existing?.telegramToken,\n validate: (v) => (!v || v.trim() === '' || v.includes(':')) ? undefined : 'expected format \"<id>:<secret>\" or empty',\n });\n if (isCancel(telegramToken)) { cancel('Cancelled.'); return null; }\n\n // Auto-detect chat ID: ask user to send /start to the bot\n let detectedChatId = existing?.telegramChatId ?? '';\n if (telegramToken && telegramToken.trim() && !detectedChatId) {\n const botUrl = `https://api.telegram.org/bot${telegramToken.trim()}`;\n try {\n // Clear any stale webhook/updates so getUpdates works fresh\n await fetch(`${botUrl}/deleteWebhook?drop_pending_updates=true`);\n } catch { /* best effort */ }\n process.stdout.write('\\nSend /start to your bot on Telegram now... (waiting 30s)\\n');\n try {\n const res = await fetch(`${botUrl}/getUpdates?timeout=30&allowed_updates=[\"message\"]`);\n const data = await res.json() as { result?: Array<{ message?: { chat?: { id?: number } } }> };\n const id = data.result?.find(u => u.message?.chat?.id)?.message?.chat?.id;\n if (id) {\n detectedChatId = String(id);\n process.stdout.write(`\u2713 Detected your chat ID: ${detectedChatId}\\n`);\n } else {\n process.stdout.write('\u26A0 No message received \u2014 enter manually below.\\n');\n }\n } catch { process.stdout.write('\u26A0 Could not reach Telegram API \u2014 enter manually below.\\n'); }\n }\n\n const telegramChatId = await text({\n message: `Your Telegram user ID (${noteEmpty})`,\n placeholder: '123456789',\n initialValue: detectedChatId,\n validate: (v) => (!v || v.trim() === '' || /^-?\\d+$/.test(v.trim())) ? undefined : 'expected numeric user ID or empty',\n });\n if (isCancel(telegramChatId)) { cancel('Cancelled.'); return null; }\n\n // 4-6. Discord (all optional)\n const discordBotToken = await text({\n message: `Discord bot token (${noteEmpty})`,\n placeholder: 'MTIzNDU2...',\n initialValue: existing?.discordBotToken,\n });\n if (isCancel(discordBotToken)) { cancel('Cancelled.'); return null; }\n\n const discordAppId = await text({\n message: `Discord app ID (${noteEmpty})`,\n placeholder: '987654321098765432',\n initialValue: existing?.discordAppId,\n validate: (v) => (!v || v.trim() === '' || /^\\d{10,20}$/.test(v.trim())) ? undefined : 'expected Discord snowflake or empty',\n });\n if (isCancel(discordAppId)) { cancel('Cancelled.'); return null; }\n\n const discordA2aChannel = await text({\n message: `Discord allowed channel ID (${noteEmpty})`,\n placeholder: '987654321098765432',\n initialValue: existing?.discordA2aChannel,\n validate: (v) => (!v || v.trim() === '' || /^\\d{10,20}$/.test(v.trim())) ? undefined : 'expected Discord snowflake or empty',\n });\n if (isCancel(discordA2aChannel)) { cancel('Cancelled.'); return null; }\n\n // 7. Provider\n const defaultProvider = await select<ProviderChoice>({\n message: 'Default transport provider',\n options: [\n { value: 'openrouter', label: 'openrouter \u2014 many models via API key' },\n { value: 'anthropic', label: 'anthropic \u2014 Claude API (direct)' },\n { value: 'openai', label: 'openai \u2014 GPT API (direct)' },\n { value: 'ollama', label: 'ollama \u2014 local/cloud Ollama endpoint' },\n { value: 'kiro', label: 'kiro \u2014 Kiro CLI (free or paid; tier via model)' },\n { value: 'gemini', label: 'gemini \u2014 Gemini CLI (free or paid; tier via model)' },\n ],\n initialValue: existing?.defaultProvider ?? 'kiro',\n });\n if (isCancel(defaultProvider)) { cancel('Cancelled.'); return null; }\n\n // 8. Default model\n const defaultModel = await text({\n message: `Default model (for ${defaultProvider})`,\n placeholder: DEFAULT_MODELS[defaultProvider],\n initialValue: existing?.defaultModel ?? DEFAULT_MODELS[defaultProvider],\n });\n if (isCancel(defaultModel)) { cancel('Cancelled.'); return null; }\n\n // 9. API key \u2014 every provider now has an env var; always ask, allow skip\n const apiKeyEnv = PROVIDER_API_KEY_ENV[defaultProvider];\n let providerApiKey = existing?.providerApiKey ?? '';\n {\n const v = await text({\n message: `${apiKeyEnv} (${noteEmpty})`,\n placeholder: existing?.providerApiKey ? '(keep existing)' : 'sk-or-v1-... or leave blank',\n initialValue: existing?.providerApiKey,\n });\n if (isCancel(v)) { cancel('Cancelled.'); return null; }\n providerApiKey = String(v ?? '').trim() || existing?.providerApiKey || '';\n }\n\n // 10. Availability check\n const modelStr = String(defaultModel).trim() || DEFAULT_MODELS[defaultProvider];\n if (API_PROVIDERS.has(defaultProvider) && providerApiKey) {\n const check = await confirm({ message: 'Check availability (GET /v1/models)?', initialValue: true });\n if (isCancel(check)) { cancel('Cancelled.'); return null; }\n if (check) {\n const endpoint = PROVIDER_ENDPOINT[defaultProvider] ?? '';\n const result = await checkModelAvailability(endpoint, providerApiKey, modelStr);\n process.stdout.write(result.ok ? `\u2713 ${modelStr} available on ${defaultProvider}\\n` : `\u26A0\uFE0F ${result.message}\\n`);\n }\n }\n\n // 11. Ultimate fallback (hailMary)\n const hailMary = await text({\n message: `Ultimate fallback model \u2014 hailMary (${noteEmpty}; uses same provider + key as above)`,\n placeholder: 'google/gemini-2.5-flash',\n initialValue: existing?.hailMaryModel ?? 'google/gemini-2.5-flash',\n });\n if (isCancel(hailMary)) { cancel('Cancelled.'); return null; }\n const hailMaryModel = String(hailMary ?? '').trim();\n\n if (hailMaryModel && API_PROVIDERS.has(defaultProvider) && providerApiKey) {\n const check = await confirm({ message: `Check hailMary availability (${hailMaryModel})?`, initialValue: true });\n if (isCancel(check)) { cancel('Cancelled.'); return null; }\n if (check) {\n const endpoint = PROVIDER_ENDPOINT[defaultProvider] ?? '';\n const result = await checkModelAvailability(endpoint, providerApiKey, hailMaryModel);\n process.stdout.write(result.ok ? `\u2713 ${hailMaryModel} available\\n` : `\u26A0\uFE0F ${result.message}\\n`);\n }\n }\n\n // 12. Sleep schedule + voice + trust mode\n const bedTime = await text({\n message: `Bed time HH:MM \u2014 daily sleep trigger (${noteEmpty} for default 0:30)`,\n placeholder: '0:30',\n initialValue: existing?.bedTime,\n validate: (v) => (!v || /^\\d{1,2}:\\d{2}$/.test(v.trim())) ? undefined : 'expected H:MM format',\n });\n if (isCancel(bedTime)) { cancel('Cancelled.'); return null; }\n\n const wakeTime = await text({\n message: `Wake time HH:MM (${noteEmpty} for default 7:00)`,\n placeholder: '7:00',\n initialValue: existing?.wakeTime,\n validate: (v) => (!v || /^\\d{1,2}:\\d{2}$/.test(v.trim())) ? undefined : 'expected H:MM format',\n });\n if (isCancel(wakeTime)) { cancel('Cancelled.'); return null; }\n\n const groqApiKey = await text({\n message: `GROQ_API_KEY for voice-note transcription (${noteEmpty})`,\n placeholder: existing?.groqApiKey ? '(keep existing)' : 'gsk_...',\n initialValue: existing?.groqApiKey,\n });\n if (isCancel(groqApiKey)) { cancel('Cancelled.'); return null; }\n\n // 12b. Embeddings \u2014 handled by `abmind install`, not here\n const embeddingEnabled = false;\n\n // 13. Summary + confirmation\n const mask = (s: string): string => s ? (s.length > 8 ? `${s.slice(0, 4)}\u2026${s.slice(-4)}` : '***') : '(skipped)';\n const lines = [\n '',\n '\u2500\u2500 Summary \u2500\u2500',\n ` Deployment mode: ${installMode}`,\n ` Your name: ${String(userName ?? '') || '(skipped)'}`,\n ` Telegram token: ${mask(String(telegramToken ?? ''))}`,\n ` Telegram chat ID: ${String(telegramChatId ?? '') || '(skipped)'}`,\n ` Discord bot token: ${mask(String(discordBotToken ?? ''))}`,\n ` Discord app ID: ${String(discordAppId ?? '') || '(skipped)'}`,\n ` Discord channel ID: ${String(discordA2aChannel ?? '') || '(skipped)'}`,\n ` Provider: ${defaultProvider}`,\n ` Default model: ${modelStr}`,\n ` ${apiKeyEnv}: ${mask(providerApiKey)}`,\n ` hailMary model: ${hailMaryModel || '(skipped)'}`,\n ` Bed time: ${String(bedTime ?? '') || '(default 0:30)'}`,\n ` Wake time: ${String(wakeTime ?? '') || '(default 7:00)'}`,\n ` GROQ_API_KEY: ${mask(String(groqApiKey ?? ''))}`,\n ` Embeddings: ${embeddingEnabled ? 'enabled' : 'disabled'}`,\n ` Trust mode: ${trustMode ? 'true (auto-approve)' : 'false (prompt user)'}`,\n '',\n ];\n process.stdout.write(lines.join('\\n'));\n\n const ok = await confirm({ message: 'Looks good? Write config?', initialValue: true });\n if (isCancel(ok) || !ok) { cancel('Cancelled \u2014 no files written.'); return null; }\n\n outro('Writing config\u2026');\n\n return {\n installMode: installMode as \"simple\" | \"supervised\" | \"supervised-daemon\",\n userName: String(userName ?? '').trim(),\n passphrase: String(passphrase ?? ''),\n telegramToken: String(telegramToken ?? '').trim(),\n telegramChatId: String(telegramChatId ?? '').trim(),\n discordBotToken: String(discordBotToken ?? '').trim(),\n discordAppId: String(discordAppId ?? '').trim(),\n discordA2aChannel: String(discordA2aChannel ?? '').trim(),\n defaultProvider: defaultProvider as ProviderChoice,\n defaultModel: modelStr,\n providerApiKey,\n hailMaryModel,\n bedTime: String(bedTime ?? '').trim(),\n wakeTime: String(wakeTime ?? '').trim(),\n groqApiKey: String(groqApiKey ?? '').trim() || existing?.groqApiKey || '',\n embeddingEnabled: false,\n securityMode: String(securityMode ?? 'guardrails'),\n trustMode: trustMode === true,\n };\n}\n\n/** Ping GET <endpoint>/models with the API key. Returns ok=true if the model ID is listed. */\nasync function checkModelAvailability(endpoint: string, apiKey: string, model: string): Promise<{ ok: boolean; message: string }> {\n try {\n const res = await fetch(`${endpoint}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(8000),\n });\n if (!res.ok) return { ok: false, message: `provider returned ${res.status}` };\n const json = await res.json() as { data?: Array<{ id: string }> };\n const ids = (json.data ?? []).map(m => m.id);\n return ids.includes(model)\n ? { ok: true, message: 'available' }\n : { ok: false, message: `\"${model}\" not found in provider's model list` };\n } catch (err) {\n return { ok: false, message: `check failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n}\n\nfunction validateNonInteractive(opts: OnboardOptions): WizardAnswers | string {\n if (!opts.acceptRisk) {\n return '--non-interactive requires --accept-risk (you are bypassing safety prompts)';\n }\n const provider = (opts.defaultProvider ?? 'openrouter') as ProviderChoice;\n if (!VALID_PROVIDERS.includes(provider)) {\n return `--default-provider must be one of: ${VALID_PROVIDERS.join(', ')}`;\n }\n return {\n installMode: 'supervised',\n userName: '',\n passphrase: '',\n telegramToken: opts.telegramToken ?? '',\n telegramChatId: opts.telegramChatId ?? '',\n discordBotToken: '',\n discordAppId: '',\n discordA2aChannel: opts.discordA2aChannel ?? '',\n defaultProvider: provider,\n defaultModel: opts.defaultModel ?? DEFAULT_MODELS[provider],\n providerApiKey: '',\n hailMaryModel: '',\n bedTime: '',\n wakeTime: '',\n groqApiKey: '',\n embeddingEnabled: false,\n securityMode: 'guardrails',\n trustMode: true,\n };\n}\n\nasync function readExisting(envPath: string): Promise<WizardAnswers | null> {\n try {\n const content = await readFile(envPath, 'utf-8');\n const kv = new Map<string, string>();\n for (const line of content.split('\\n')) {\n const m = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);\n if (m && m[1] !== undefined && m[2] !== undefined) kv.set(m[1], m[2]);\n }\n const provider = (kv.get('DEFAULT_PROVIDER') ?? 'openrouter') as ProviderChoice;\n if (!VALID_PROVIDERS.includes(provider)) return null;\n const apiKeyEnv = PROVIDER_API_KEY_ENV[provider];\n return {\n installMode: 'simple',\n userName: kv.get('USER_DISPLAY_NAME') ?? '',\n passphrase: '',\n telegramToken: kv.get('TELEGRAM_BOT_TOKEN') ?? '',\n telegramChatId: kv.get('MAIN_CHAT_ID') ?? '',\n discordBotToken: kv.get('DISCORD_BOT_TOKEN') ?? '',\n discordAppId: kv.get('DISCORD_APP_ID') ?? '',\n discordA2aChannel: kv.get('DISCORD_A2A_CHANNEL_ID') ?? '',\n defaultProvider: provider,\n defaultModel: kv.get('DEFAULT_MODEL') ?? DEFAULT_MODELS[provider],\n providerApiKey: apiKeyEnv ? (kv.get(apiKeyEnv) ?? '') : '',\n hailMaryModel: '',\n bedTime: kv.get('BED_TIME') ?? '',\n wakeTime: kv.get('WAKE_TIME') ?? '',\n groqApiKey: kv.get('GROQ_API_KEY') ?? '',\n embeddingEnabled: kv.get('EMBEDDING_ENABLED') === 'true',\n securityMode: kv.get('SECURITY_MODE') ?? 'guardrails',\n trustMode: kv.get('TRUST_MODE') === 'true',\n };\n } catch {\n return null;\n }\n}\n\nfunction mergeEnvContent(existing: string, answers: WizardAnswers): string {\n const owned = new Set([\n 'MAIN_CHAT_ID',\n 'DISCORD_APP_ID', 'DISCORD_A2A_CHANNEL_ID',\n 'DEFAULT_PROVIDER', 'DEFAULT_MODEL',\n 'BED_TIME', 'WAKE_TIME', 'HEARTBEAT_INTERVAL_SEC', 'EMBEDDING_ENABLED', 'TRUST_MODE',\n ]);\n const keptLines: string[] = [];\n for (const line of existing.split('\\n')) {\n const m = line.match(/^([A-Z_][A-Z0-9_]*)=/);\n if (m && m[1] !== undefined && owned.has(m[1])) continue;\n keptLines.push(line);\n }\n while (keptLines.length > 0 && keptLines[keptLines.length - 1] === '') keptLines.pop();\n\n const newBlock = [\n '',\n '# --- abtars onboard-managed ---',\n `DEFAULT_PROVIDER=${answers.defaultProvider}`,\n `DEFAULT_MODEL=${answers.defaultModel}`,\n ];\n if (answers.telegramChatId) newBlock.push(`MAIN_CHAT_ID=${answers.telegramChatId}`);\n else if (answers.discordA2aChannel) newBlock.push(`MAIN_CHAT_ID=${answers.discordA2aChannel}`);\n if (answers.discordAppId) newBlock.push(`DISCORD_APP_ID=${answers.discordAppId}`);\n if (answers.discordA2aChannel) newBlock.push(`DISCORD_A2A_CHANNEL_ID=${answers.discordA2aChannel}`);\n if (answers.bedTime) newBlock.push(`BED_TIME=${answers.bedTime}`);\n if (answers.wakeTime) newBlock.push(`WAKE_TIME=${answers.wakeTime}`);\n newBlock.push(`HEARTBEAT_INTERVAL_SEC=300`);\n newBlock.push(`EMBEDDING_ENABLED=${answers.embeddingEnabled ? 'true' : 'false'}`);\n newBlock.push(`SECURITY_MODE=${answers.securityMode}`);\n newBlock.push(`TRUST_MODE=${answers.trustMode ? 'true' : 'false'}`);\n\n return [...keptLines, ...newBlock, ''].join('\\n');\n}\n\nexport async function onboard(opts: OnboardOptions): Promise<number> {\n const paths = packagePaths('abtars');\n\n // Install log (#718)\n const { initInstallLog, logInstall, logInstallHeader } = await import(\"../install-log.js\");\n initInstallLog(paths.home);\n logInstallHeader(\"onboard\");\n const _origWrite = process.stdout.write.bind(process.stdout);\n process.stdout.write = ((chunk: any, ...args: any[]) => {\n if (typeof chunk === \"string\" && (chunk.startsWith(\"\u2713\") || chunk.startsWith(\"\u26A0\") || chunk.startsWith(\"\u2022\"))) logInstall(chunk.trimEnd());\n return _origWrite(chunk, ...args);\n }) as typeof process.stdout.write;\n\n const manifest = await readManifest(paths.manifest);\n if (!manifest) {\n process.stderr.write(\n `Not installed yet. Run 'abtars install' first.\\n(Manifest not found at ${paths.manifest}.)\\n`,\n );\n return 2;\n }\n\n const envPath = join(paths.config, '.env');\n const existing = await readExisting(envPath);\n const secretDir = join(paths.home, 'secret');\n const { existsSync: secretExists } = await import('node:fs');\n const hasSecretToken = secretExists(join(secretDir, 'TELEGRAM_BOT_TOKEN')) || secretExists(join(secretDir, 'DISCORD_BOT_TOKEN'));\n const hasUserConfig = existing !== null && (existing.telegramToken || existing.discordBotToken || hasSecretToken);\n if (hasUserConfig && !opts.force) {\n showHintOnce(\"onboard-reoffer\", \"Re-running onboard overwrites config. Use --force to confirm, or edit ~/.abtars/config/.env directly.\");\n if (opts.nonInteractive) {\n process.stderr.write(`config/.env already configured. Re-run with --force to overwrite.\\n`);\n return 3;\n }\n }\n\n let answers: WizardAnswers | null;\n if (opts.nonInteractive) {\n const result = validateNonInteractive(opts);\n if (typeof result === 'string') {\n process.stderr.write(`error: ${result}\\n`);\n return 4;\n }\n answers = result;\n } else {\n answers = await runInteractive(existing);\n if (answers === null) return 1;\n }\n\n // Read current .env to preserve operator-added lines.\n let currentContent = '';\n try {\n currentContent = await readFile(envPath, 'utf-8');\n } catch {\n // File doesn't exist yet \u2014 install should have seeded it, but guard anyway.\n currentContent = '';\n }\n\n const next = mergeEnvContent(currentContent, answers);\n await writeFile(envPath, next, { mode: 0o600 });\n process.stdout.write(`\\n\u2713 Wrote ${envPath}\\n`);\n\n // Write secrets to ~/.abtars/secret/ (boot auto-encrypts on first start)\n const secretDirPath = join(paths.home, 'secret');\n await mkdir(secretDirPath, { recursive: true });\n const secrets: Array<[string, string]> = [];\n if (answers.telegramToken) secrets.push(['TELEGRAM_BOT_TOKEN', answers.telegramToken]);\n if (answers.discordBotToken) secrets.push(['DISCORD_BOT_TOKEN', answers.discordBotToken]);\n if (answers.providerApiKey) {\n const providerKeyName = PROVIDER_API_KEY_ENV[answers.defaultProvider];\n if (providerKeyName) secrets.push([providerKeyName, answers.providerApiKey]);\n }\n if (answers.groqApiKey) secrets.push(['GROQ_API_KEY', answers.groqApiKey]);\n for (const [name, value] of secrets) {\n await writeFile(join(secretDirPath, name), value, { mode: 0o600 });\n }\n if (secrets.length > 0) process.stdout.write(`\u2713 ${secrets.length} secrets \u2192 ${secretDirPath}\\n`);\n\n // Write install mode to manifest\n const { writeManifest } = await import('../deploy-lib-import.js');\n const mf = await readManifest(paths.manifest);\n if (mf) await writeManifest(paths.manifest, { ...mf, installMode: answers.installMode });\n process.stdout.write(`\u2713 install mode: ${answers.installMode}\\n`);\n\n // Write transport.json with selected provider + model\n {\n const transportPath = join(paths.config, 'transport.json');\n let tc: Record<string, unknown> = {};\n try {\n tc = JSON.parse(await readFile(transportPath, 'utf-8'));\n } catch (err) { logAndSwallow(\"onboard\", \"op\", err); }\n\n // Seed providers and agents if not already present\n if (!tc[\"providers\"]) {\n tc[\"providers\"] = {\n \"kiro\": { \"transport\": \"acp\", \"cli\": \"kiro-cli\" },\n \"ollama\": { \"transport\": \"api\", \"endpoint\": \"http://localhost:11434/v1\" },\n \"openrouter\": { \"transport\": \"api\", \"endpoint\": \"https://openrouter.ai/api/v1\", \"apiKeyEnv\": \"OPENROUTER_API_KEY\" },\n };\n }\n if (!tc[\"agents\"]) {\n const provName = PROVIDER_TRANSPORT_NAME[answers.defaultProvider] ?? answers.defaultProvider;\n tc[\"agents\"] = {\n \"professor\": { \"model\": answers.defaultModel, \"provider\": provName },\n \"dreamy\": { \"model\": answers.defaultModel, \"provider\": provName },\n \"browsie\": { \"model\": answers.defaultModel, \"provider\": provName },\n \"coding\": { \"model\": answers.defaultModel, \"provider\": provName },\n };\n }\n if (answers.hailMaryModel) {\n const provName = PROVIDER_TRANSPORT_NAME[answers.defaultProvider] ?? answers.defaultProvider;\n tc[\"hailMary\"] = { model: answers.hailMaryModel, provider: provName };\n }\n\n await writeFile(transportPath, JSON.stringify(tc, null, 2) + '\\n', { mode: 0o600 });\n process.stdout.write(`\u2713 transport.json \u2192 ${transportPath}\\n`);\n }\n\n // Write users.json (always \u2014 onboard has the real chat ID)\n {\n const usersPath = join(paths.config, 'users.json');\n const userId = answers.userName.toLowerCase().replace(/[^a-z0-9]/g, '') || 'user';\n const platforms: Record<string, unknown> = {};\n if (answers.telegramChatId) platforms[\"telegram\"] = parseInt(answers.telegramChatId, 10) || answers.telegramChatId;\n if (answers.discordAppId) platforms[\"discord\"] = answers.discordAppId;\n const users = {\n users: [{\n userId,\n displayName: answers.userName || userId,\n role: \"master\",\n maxClass: 3,\n tools: [\"all\"],\n platforms,\n allowedChats: [],\n }],\n };\n await writeFile(usersPath, JSON.stringify(users, null, 2) + '\\n', { mode: 0o600 });\n process.stdout.write(`\u2713 users.json \u2192 ${usersPath}\\n`);\n }\n\n // Seed abmind user_profile.md \u2014 only if abmind is already installed\n if (answers.userName) {\n const abmindHome = process.env['ABMIND_HOME'] ?? join(dirname(paths.home), '.abmind');\n const profileDir = join(abmindHome, 'memory', 'core');\n const { existsSync: profileExists } = await import('node:fs');\n if (profileExists(profileDir)) {\n const profilePath = join(profileDir, 'user_profile.md');\n if (!profileExists(profilePath)) {\n await writeFile(profilePath, `# User Profile\\n\\nName: ${answers.userName}\\n`, { mode: 0o600 });\n process.stdout.write(`\u2713 user_profile.md \u2192 ${profilePath}\\n`);\n }\n }\n }\n\n // Initialize passphrase-based encryption (#607)\n if (answers.passphrase && answers.userName) {\n try {\n const { deriveFromPassphrase, writeKeyVerify } = await import(\"abmind\");\n const { writeToKeyring } = await import(\"abmind\");\n const key = deriveFromPassphrase(answers.passphrase, answers.userName);\n writeKeyVerify(key);\n const stored = writeToKeyring(answers.passphrase);\n process.stdout.write(`\u2713 Encryption key derived from passphrase${stored ? \" (stored in keyring)\" : \"\"}\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 Key init failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Seed default tasks (#383) \u2014 morning greeting + midnight backup\n if (answers.telegramChatId) {\n await seedDefaultTasks(answers.telegramChatId, paths.home);\n }\n\n // Seed default agent-api rules\n const agentsDir = join(paths.home, 'agents');\n const agentRulesPath = join(agentsDir, 'default.md');\n const { existsSync: agentRulesExists } = await import('node:fs');\n if (!agentRulesExists(agentRulesPath)) {\n await mkdir(agentsDir, { recursive: true });\n const bundledPath = join(dirname(fileURLToPath(import.meta.url)), 'agents', 'default.md');\n const fallbackPath = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'agents', 'default.md');\n let content = '# Agent-to-Agent API\\n\\n<!-- See docs for configuration -->\\n';\n try { content = (await readFile(bundledPath, 'utf-8')); } catch {\n try { content = (await readFile(fallbackPath, 'utf-8')); } catch { /* use default */ }\n }\n await writeFile(agentRulesPath, content);\n process.stdout.write(`\u2713 agents/default.md \u2192 ${agentRulesPath}\\n`);\n }\n\n process.stdout.write(`\\n\uD83D\uDCA1 To edit providers, agents, hailMary, fallback chains \u2014 edit:\\n ${join(paths.config, 'transport.json')}\\n Docs: https://aksika.github.io/abtars/\\n`);\n\n // Skip the build+start automation in non-interactive mode (scripts expect to do it themselves)\n if (opts.nonInteractive) {\n process.stdout.write(`\\nNext: 'abtars update' to build, then start the bridge.\\n`);\n return 0;\n }\n\n // \u2500\u2500 Auto-run: abtars update \u2500\u2500\n // Only auto-update if we're inside the abtars repo (git repo with package.json)\n const { existsSync } = await import('node:fs');\n const inRepo = existsSync(join(process.cwd(), '.git')) && existsSync(join(process.cwd(), 'package.json'));\n if (!inRepo) {\n process.stdout.write(`\\nNext: cd into the abtars repo and run 'abtars update' to build and activate.\\n`);\n return 0;\n }\n process.stdout.write(`\\n\u2500\u2500 Running 'abtars update' \u2500\u2500\\n`);\n const { update } = await import('./update.js');\n const updRc = await update({ source: 'local', fromLocal: true, allowAbmindMismatch: false });\n if (updRc !== 0) {\n process.stderr.write(`\\n\u26A0\uFE0F 'abtars update' exited with code ${updRc}. Fix and re-run manually.\\n`);\n return updRc;\n }\n\n // \u2500\u2500 abmind install (optional \u2014 only if abmind is available) \u2500\u2500\n try {\n const { spawnSync } = await import('node:child_process');\n const which = spawnSync('which', ['abmind'], { encoding: 'utf-8' });\n if (which.status === 0) {\n process.stdout.write(`\\n\u2500\u2500 Running 'abmind install' \u2500\u2500\\n`);\n const r = spawnSync('abmind', ['install'], { stdio: 'inherit' });\n if (r.status !== 0) process.stdout.write(`\u26A0 abmind install exited with code ${r.status}\\n`);\n } else {\n process.stdout.write(`\\n\u2139\uFE0F abmind not installed. Run 'npm install -g abmind && abmind install' later to enable persistent memory.\\n`);\n }\n } catch { /* abmind not available \u2014 skip silently */ }\n\n // \u2500\u2500 Start commands \u2014 print + ask to run \u2500\u2500\n const { confirm } = await import('@clack/prompts');\n const startCmds: string[] = [];\n if (answers.installMode === 'simple') {\n startCmds.push('abtars start');\n } else {\n if (process.platform === 'darwin') {\n startCmds.push(`launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist`);\n } else if (process.platform === 'linux') {\n startCmds.push(`systemctl --user daemon-reload`);\n startCmds.push(`systemctl --user enable --now abtars-watchdog`);\n }\n }\n\n process.stdout.write(`\\n\u2500\u2500 Start the bridge \u2500\u2500\\n`);\n const { spawn } = await import('node:child_process');\n if (startCmds.length > 0) {\n for (const cmd of startCmds) process.stdout.write(` \u2192 ${cmd}\\n`);\n const run = await confirm({ message: `Enable and start the watchdog service?`, initialValue: true });\n if (run === true) {\n for (const cmd of startCmds) {\n await new Promise<void>((resolve) => {\n const child = spawn('bash', ['-lc', cmd], { stdio: 'inherit' });\n child.on('exit', () => resolve());\n });\n }\n } else {\n process.stdout.write(` \u2192 skipped (run manually)\\n`);\n }\n }\n\n process.stdout.write(`\\n\u2713 Onboarding complete.\\n`);\n return 0;\n}\n\n// \u2500\u2500 Default task seeding (#383) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface TaskTemplateEntry {\n readonly id?: string;\n readonly title?: string;\n readonly message: string;\n readonly schedule: string;\n readonly type: \"task\" | \"reminder\";\n readonly executor: \"agent\" | \"script\";\n readonly maxRunsPerDay?: number;\n}\n\n/**\n * Seed default tasks (#383) via `abtars-task add` \u2014 skipped if tasks.json\n * already exists. Called from onboard after .env is persisted so chatId\n * is available.\n */\nasync function seedDefaultTasks(chatId: string, abtarsHome: string): Promise<void> {\n const { existsSync } = await import('node:fs');\n const tasksJson = join(abtarsHome, 'state', 'tasks.json');\n if (existsSync(tasksJson)) {\n process.stdout.write(`\u2022 tasks.json exists \u2014 skipping default-task seed\\n`);\n return;\n }\n\n const { fileURLToPath } = await import('node:url');\n const here = dirname(fileURLToPath(import.meta.url));\n // onboard.ts is at src/cli/commands/onboard.ts or dist/cli/commands/onboard.js\n // tasks.default.json lives at repo root \u2014 three levels up.\n const candidates = [\n join(here, '..', '..', '..', 'tasks.default.json'),\n join(here, '..', '..', 'tasks.default.json'),\n ];\n let templatePath: string | null = null;\n for (const p of candidates) {\n if (existsSync(p)) { templatePath = p; break; }\n }\n if (!templatePath) {\n process.stdout.write(`\u2022 tasks.default.json not found \u2014 skipping default-task seed\\n`);\n return;\n }\n\n let template: TaskTemplateEntry[];\n try {\n const raw = await readFile(templatePath, 'utf-8');\n template = JSON.parse(raw) as TaskTemplateEntry[];\n } catch (err) {\n process.stdout.write(`\u2022 Failed to read tasks.default.json: ${err instanceof Error ? err.message : String(err)}\\n`);\n return;\n }\n\n const { spawnSync } = await import('node:child_process');\n let seeded = 0;\n for (const entry of template) {\n const args = [\n 'add',\n '--schedule', entry.schedule,\n '--message', entry.message,\n '--chat-id', chatId,\n '--type', entry.type,\n '--executor', entry.executor,\n ];\n if (entry.id) args.push('--id', entry.id);\n if (entry.title) args.push('--title', entry.title);\n if (entry.maxRunsPerDay) args.push('--max-runs-per-day', String(entry.maxRunsPerDay));\n const result = spawnSync('abtars-task', args, {\n encoding: 'utf-8',\n env: { ...process.env, ABTARS_HOME: abtarsHome },\n });\n if (result.status === 0) {\n seeded++;\n } else {\n const err = result.error?.message ?? result.stderr?.trim() ?? result.stdout?.trim() ?? `exit ${result.status}`;\n process.stdout.write(` \u26A0\uFE0F failed to seed task \"${entry.message.slice(0, 40)}\": ${err}\\n`);\n }\n }\n if (seeded > 0) {\n process.stdout.write(`\u2713 seeded ${seeded} default task${seeded === 1 ? '' : 's'}\\n`);\n }\n}\n", "/**\n * `abtars rollback [--to vX.Y.Z]` \u2014 flip `current` to a prior release.\n *\n * Default target: the most recently prior release (manifest.priorReleases[0]).\n * Validates target exists and has compatible package-lock hash.\n */\n\nimport { hostname } from 'node:os';\nimport {\n acquireLock,\n activate,\n emptyManifest,\n packagePaths,\n readManifest,\n releaseExists,\n writeManifest,\n type PriorRelease,\n} from '../deploy-lib-import.js';\n\nexport interface RollbackOptions {\n readonly to?: string;\n}\n\nexport async function rollback(opts: RollbackOptions): Promise<number> {\n const paths = packagePaths('abtars');\n const manifest = await readManifest(paths.manifest);\n if (!manifest || !manifest.version) {\n process.stderr.write(`No active release; nothing to roll back.\\n`);\n return 2;\n }\n if (manifest.priorReleases.length === 0 && opts.to === undefined) {\n process.stderr.write(`No prior releases recorded; nothing to roll back to.\\n`);\n return 2;\n }\n\n const target: string = opts.to ?? manifest.priorReleases[0]!.version;\n if (target === manifest.version) {\n process.stdout.write(`Already at ${target}; no-op.\\n`);\n return 0;\n }\n\n if (!(await releaseExists(paths.releases, target))) {\n const available = [manifest.version, ...manifest.priorReleases.map((r: PriorRelease) => r.version)];\n process.stderr.write(\n `Target release '${target}' does not exist in ${paths.releases}.\\nAvailable: ${available.join(', ')}\\n` +\n `If pruned, rebuild from the target's git SHA with 'abtars update' instead.\\n`,\n );\n return 2;\n }\n\n // Dep compatibility: warn if package-lock hashes differ. We still allow\n // the rollback \u2014 the shared node_modules/ may or may not work, that's\n // the operator's call. Block only if current and target both have hashes\n // and they differ.\n const targetRecord: PriorRelease | null =\n target === manifest.version\n ? {\n version: manifest.version,\n commit: manifest.commit,\n activatedAt: manifest.activatedAt,\n packageLockHash: manifest.packageLockHash,\n }\n : manifest.priorReleases.find((r: PriorRelease) => r.version === target) ?? null;\n if (\n manifest.packageLockHash &&\n targetRecord?.packageLockHash &&\n manifest.packageLockHash !== targetRecord.packageLockHash\n ) {\n process.stderr.write(\n `v${manifest.version} pinned different deps than v${target} (package-lock hashes differ).\\n` +\n `Rollback via symlink is unsafe. Instead:\\n` +\n ` git checkout ${targetRecord.commit ?? '<commit-from-manifest>'}\\n` +\n ` abtars update --from-local\\n` +\n `This rebuilds node_modules/ to match the target release.\\n`,\n );\n return 3;\n }\n\n const release = await acquireLock(paths.lock, `rollback --to ${target}`);\n try {\n await activate(paths.current, target);\n process.stdout.write(`\u2713 current -> releases/${target}\\n`);\n\n // Update manifest: move current version \u2192 priorReleases[0], lift target out.\n const newPrior: PriorRelease = {\n version: manifest.version,\n commit: manifest.commit,\n activatedAt: manifest.activatedAt,\n packageLockHash: manifest.packageLockHash,\n };\n const remainingPriors = manifest.priorReleases.filter((r: PriorRelease) => r.version !== target);\n await writeManifest(paths.manifest, {\n ...manifest,\n version: target,\n commit: targetRecord?.commit ?? null,\n packageLockHash: targetRecord?.packageLockHash ?? null,\n activatedAt: new Date().toISOString(),\n priorReleases: [newPrior, ...remainingPriors],\n });\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n process.stdout.write(`\\nRollback complete: ${target}\\n`);\n // Touch unused imports to satisfy strict verifier (no-op).\n void emptyManifest;\n void hostname;\n return 0;\n } finally {\n await release();\n }\n}\n", "/**\n * `abtars status` \u2014 print manifest + lock state.\n * Read-only. Exit code 0 on healthy install, 1 otherwise.\n */\n\nimport { inspectLock, packagePaths, readCurrent, readManifest, type PriorRelease } from '../deploy-lib-import.js';\n\nexport async function status(): Promise<number> {\n const paths = packagePaths('abtars');\n const manifest = await readManifest(paths.manifest);\n const current = await readCurrent(paths.current);\n const lock = await inspectLock(paths.lock);\n\n if (!manifest) {\n process.stdout.write(\n `abtars: not installed (no manifest at ${paths.manifest})\\n` +\n `Run 'abtars install' to set up.\\n`,\n );\n return 1;\n }\n\n const lines = [\n `abtars status`,\n ` home: ${paths.home}`,\n ` version: ${manifest.version || '(unset \u2014 run update)'}`,\n ` commit: ${manifest.commit ?? '(unknown)'}`,\n ` branch: ${manifest.branch ?? '(unknown)'}`,\n ` source: ${manifest.source}`,\n ` activated: ${manifest.activatedAt}`,\n ` current ->: ${current ?? '(missing)'}`,\n ` host: ${manifest.host}`,\n ` prior: ${manifest.priorReleases.length > 0 ? manifest.priorReleases.map((r: PriorRelease) => r.version).join(', ') : '(none)'}`,\n ];\n if (lock.held) {\n lines.push(\n ` lock: HELD by pid ${lock.content.pid} (${lock.content.cmd})${lock.stale ? ' \u2014 STALE' : ''}`,\n );\n } else {\n lines.push(` lock: not held`);\n }\n process.stdout.write(`${lines.join('\\n')}\\n`);\n\n // Surface mismatch between manifest version and current symlink target.\n if (current !== null && manifest.version !== '' && current !== manifest.version) {\n process.stderr.write(\n `\\nWarning: current symlink points at '${current}' but manifest says '${manifest.version}'.\\n` +\n `Re-run 'abtars update' or 'abtars rollback' to reconcile.\\n`,\n );\n return 1;\n }\n return 0;\n}\n", "/**\n * abtars CLI top-level dispatcher (#158 Phase 1b).\n *\n * Subcommands:\n * install [--upgrade] [--force]\n * update [--source local|npm|github] [--from-local]\n * rollback [--to <version>]\n * status\n *\n * Phase 2 will add: reset, doctor, onboard, migrate.\n * Phase 1 install intentionally does NOT run onboard \u2014 operator seeds\n * config/ from examples only; interactive onboard is Phase 3.\n */\n\nprocess.umask(0o077); // #441: all runtime files 600, dirs 700\nimport { doctor } from './commands/doctor.js';\nimport { install } from './commands/install.js';\nimport { uninstall } from './commands/uninstall.js';\nimport { backup } from './commands/backup.js';\nimport { onboard } from './commands/onboard.js';\nimport { rollback } from './commands/rollback.js';\nimport { restart } from './commands/restart.js';\nimport { status } from './commands/status.js';\nimport { stop } from './commands/stop.js';\nimport { update } from './commands/update.js';\n\ntype Args = {\n readonly command: string;\n readonly flags: ReadonlyMap<string, string | boolean>;\n};\n\nfunction parseArgs(argv: readonly string[]): Args {\n const command = argv[0] ?? '';\n const flags = new Map<string, string | boolean>();\n for (let i = 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === undefined) continue;\n if (a.startsWith('--')) {\n const eqIdx = a.indexOf('=');\n if (eqIdx > 2) {\n flags.set(a.slice(2, eqIdx), a.slice(eqIdx + 1));\n } else {\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith('--')) {\n flags.set(a.slice(2), next);\n i++;\n } else {\n flags.set(a.slice(2), true);\n }\n }\n }\n }\n return { command, flags };\n}\n\nfunction printUsage(): void {\n process.stdout.write(\n `abtars \u2014 install/update CLI (#158)\n\nUsage:\n abtars install [--force] [--mode=simple|supervised] [--restore <backup.zip>]\n abtars uninstall [--yes]\n abtars update [--source local|npm|github] [--from-local]\n abtars rollback [--to <version>]\n abtars backup\n abtars restore <file.zip|.7z>\n abtars doctor [<args passed to doctor.sh>...]\n abtars onboard [--non-interactive --accept-risk --telegram-token ... --telegram-chat-id ...]\n abtars restart [--cold]\n abtars start\n abtars stop [--force]\n abtars status\n abtars logs\n abtars config\n`,\n );\n}\n\nexport async function main(argv: readonly string[]): Promise<number> {\n const { command, flags } = parseArgs(argv);\n\n try {\n switch (command) {\n case 'install':\n return await install({\n restore: typeof flags.get('restore') === 'string' ? (flags.get('restore') as string) : undefined,\n force: flags.get('force') === true,\n dryRun: flags.get('dry-run') === true,\n mode: flags.get('mode') === 'simple' ? 'simple' : flags.get('mode') === 'supervised' ? 'supervised' : undefined,\n });\n case 'uninstall':\n return await uninstall({ yes: flags.get('yes') === true });\n case 'update':\n return await update({\n source: (flags.get('source') as 'local' | 'npm' | 'github' | undefined) ?? 'local',\n fromLocal: flags.get('from-local') === true,\n allowAbmindMismatch: flags.get('allow-abmind-mismatch') === true,\n });\n case 'rollback':\n return await rollback({\n to: typeof flags.get('to') === 'string' ? (flags.get('to') as string) : undefined,\n });\n case 'backup':\n return await backup(typeof flags.get('output') === 'string' ? (flags.get('output') as string) : undefined);\n case 'restore': {\n const { restore } = await import('./commands/restore.js');\n return await restore(argv[1] ?? '');\n }\n case 'doctor':\n // Pass remaining --flags through to doctor.sh. Primitive pass-through:\n // anything after 'doctor' except recognized flags goes to the script.\n return await doctor(argv.slice(1).filter((a) => a !== ''));\n case 'onboard':\n return await onboard({\n nonInteractive: flags.get('non-interactive') === true,\n acceptRisk: flags.get('accept-risk') === true,\n telegramToken: typeof flags.get('telegram-token') === 'string' ? (flags.get('telegram-token') as string) : undefined,\n telegramChatId: typeof flags.get('telegram-chat-id') === 'string' ? (flags.get('telegram-chat-id') as string) : undefined,\n defaultProvider: typeof flags.get('default-provider') === 'string' ? (flags.get('default-provider') as string) : undefined,\n defaultModel: typeof flags.get('default-model') === 'string' ? (flags.get('default-model') as string) : undefined,\n discordA2aChannel: typeof flags.get('discord-a2a-channel') === 'string' ? (flags.get('discord-a2a-channel') as string) : undefined,\n force: flags.get('force') === true,\n });\n case 'status':\n return await status();\n case 'restart':\n return await restart({ cold: flags.get('cold') === true });\n case 'stop':\n return await stop({ force: flags.get('force') === true });\n case 'start': {\n const { start: startCmd } = await import('./commands/start.js');\n return await startCmd();\n }\n case 'daemon': {\n const { daemon: daemonCmd } = await import('./commands/daemon.js');\n return await daemonCmd(argv.slice(1));\n }\n case 'logs': {\n const { logs } = await import('./commands/logs.js');\n return await logs();\n }\n case 'config': {\n const { configShow } = await import('./commands/config-show.js');\n return await configShow();\n }\n case 'passwd': {\n const { passwd } = await import('./commands/passwd.js');\n return await passwd();\n }\n case '':\n case 'help':\n case '--help':\n case '-h':\n printUsage();\n return 0;\n default:\n process.stderr.write(`unknown subcommand: ${command}\\n\\n`);\n printUsage();\n return 2;\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`error: ${msg}\\n`);\n return 1;\n }\n}\n\n// Direct-run guard: works when invoked as `node dist/cli/abtars.js` AND\n// as `abtars` (npm-installed bin). Not executed under vitest.\nconst isDirectRun =\n typeof process.argv[1] === 'string' &&\n (process.argv[1].endsWith('abtars.js') ||\n process.argv[1].endsWith('abtars-cli.js') ||\n process.argv[1].endsWith('abtars') ||\n process.argv[1].endsWith('abtars.ts'));\n\nif (isDirectRun && process.env['VITEST'] === undefined) {\n void main(process.argv.slice(2)).then((code) => process.exit(code));\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,YAAY;AAGrB,eAAe,WAAW,GAA6B;AACrD,MAAI;AACF,UAAM,KAAK,CAAC;AACZ,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,OAAO,OAA0B,CAAC,GAAoB;AAC1E,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,YAAY,KAAK,MAAM,MAAM,WAAW,WAAW;AACzD,QAAM,OAAO,KAAK,QAAQ,IAAI,GAAG,WAAW,WAAW;AACvD,QAAM,YAAa,MAAM,WAAW,SAAS,IAAK,YAAa,MAAM,WAAW,IAAI,IAAK,OAAO;AAEhG,MAAI,cAAc,MAAM;AACtB,YAAQ,OAAO;AAAA,MACb,kCAAkC,SAAS,QAAQ,IAAI;AAAA;AAAA;AAAA,IAEzD;AACA,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,QAAgB,CAAC,YAAY;AACtC,UAAM,QAAQ,MAAM,WAAW,CAAC,GAAG,IAAI,GAAG,EAAE,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC;AAChF,UAAM,GAAG,QAAQ,CAAC,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAC7C,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,cAAQ,OAAO,MAAM,2BAA2B,IAAI,OAAO;AAAA,CAAI;AAC/D,cAAQ,CAAC;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH;;;AC3CA,SAAS,cAAAA,aAAY,aAAa,cAAAC,aAAY,cAAc,cAAc;AAC1E,SAAS,QAAAC,aAAY;AACrB,SAAS,uBAAuB;;;ACOhC;AACA,SAAS,YAAY,cAAc,kBAAkB;AACrD,SAAS,oBAAoB;AAC7B,SAAS,QAAAC,aAAY;AACrB,SAAS,eAAe;AAExB,SAASC,cAAqB;AAC5B,SAAO,QAAQ,IAAI,aAAa,KAAKD,MAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,SAAS;AAChF;AAEA,SAAS,cAAc,MAAc,OAAwB;AAC3D,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,aAAa,MAAM,OAAO,CAAC;AACnD,WAAO,KAAK,KAAK;AAAA,EACnB,QAAQ;AAAE,WAAO;AAAA,EAAW;AAC9B;AAEA,SAAS,SAAS,KAAsB;AACtC,MAAI;AAAE,YAAQ,KAAK,KAAK,CAAC;AAAG,WAAO;AAAA,EAAM,QAAQ;AAAE,WAAO;AAAA,EAAO;AACnE;AAGA,SAAS,aAAa,KAAa,SAA4B;AAC7D,MAAI;AACF,UAAM,UAAU,aAAa,SAAS,GAAG,YAAY,OAAO;AAC5D,WAAO,QAAQ,KAAK,OAAK,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC9C,QAAQ;AAAE,WAAO;AAAA,EAA+C;AAClE;AAIA,eAAe,eAAe,KAAa,SAAwC;AACjF,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,MAAI,CAAC,aAAa,KAAK,OAAO,EAAG,QAAO;AAExC,MAAI;AAAE,YAAQ,KAAK,KAAK,SAAS;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAe;AAGpE,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,GAAG,CAAC;AACzC,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAAA,EAC7B;AAGA,MAAI;AAAE,YAAQ,KAAK,KAAK,SAAS;AAAA,EAAG,QAAQ;AAAA,EAAqB;AACjE,QAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,GAAG,CAAC;AACzC,SAAO,SAAS,GAAG,IAAI,gBAAgB;AACzC;AAEA,SAAS,WAAW,MAAoB;AACtC,MAAI;AAAE,QAAI,WAAW,IAAI,EAAG,YAAW,IAAI;AAAA,EAAG,SACvC,KAAK;AAAE,kBAAc,QAAQ,MAAM,GAAG;AAAA,EAAG;AAClD;AAEA,eAAsB,KAAK,MAA4C;AACrE,QAAM,OAAOC,YAAW;AACxB,QAAM,eAAeD,MAAK,MAAM,eAAe;AAC/C,QAAM,eAAeA,MAAK,MAAM,eAAe;AAC/C,QAAM,aAAaA,MAAK,MAAM,aAAa;AAC3C,QAAM,QAAQ,KAAK,SAAS;AAG5B,QAAM,cAAc,cAAc,cAAc,aAAa;AAC7D,MAAI,gBAAgB,uBAAuB,CAAC,OAAO;AACjD,YAAQ,OAAO,MAAM;AAAA,CAAyH;AAC9I,QAAI,QAAQ,aAAa,UAAU;AACjC,cAAQ,OAAO,MAAM;AAAA,CAAwD;AAAA,IAC/E,OAAO;AACL,cAAQ,OAAO,MAAM;AAAA,CAAmC;AAAA,IAC1D;AACA,YAAQ,OAAO,MAAM;AAAA;AAAA,CAAqF;AAC1G,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,QAAQ,aAAa,UAAU;AAC1C,QAAI;AAAE,mBAAa,aAAa,CAAC,WAAW,OAAO,QAAQ,OAAQ,CAAC,IAAIA,MAAK,QAAQ,GAAG,WAAW,gBAAgB,2BAA2B,CAAC,GAAG,EAAE,SAAS,IAAK,CAAC;AAAA,IAAG,QAChK;AAAA,IAAwC;AAAA,EAChD;AAEA,QAAM,QAAQ,cAAc,cAAc,KAAK;AAC/C,MAAI,WAAuB;AAC3B,MAAI;AACJ,MAAI,SAAS,QAAQ,GAAG;AACtB,kBAAc;AACd,eAAW,MAAM,eAAe,OAAO,CAAC,aAAa,CAAC;AACtD,QAAI,aAAa,YAAY,aAAa,UAAU;AAClD,iBAAW,YAAY;AAAA,IACzB,WAAW,aAAa,SAAS;AAC/B,cAAQ,OAAO,MAAM,kCAAwB,KAAK;AAAA,CAA8C;AAChG,iBAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,QAAQ,cAAc,YAAY,KAAK;AAC7C,MAAI,WAAuB;AAC3B,MAAI;AACJ,MAAI,SAAS,QAAQ,GAAG;AACtB,kBAAc;AACd,eAAW,MAAM,eAAe,OAAO,CAAC,UAAU,WAAW,QAAQ,CAAC;AACtE,QAAI,aAAa,YAAY,aAAa,UAAU;AAClD,iBAAW,UAAU;AAAA,IACvB,WAAW,aAAa,SAAS;AAC/B,cAAQ,OAAO,MAAM,gCAAsB,KAAK;AAAA,CAAyC;AACzF,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,QAAQ,aAAa,YAAY,UAAU,WAAW;AAC5D,QAAM,QAAQ,aAAa,UAAU,UAAU,WAAW;AAE1D,MAAI,aAAa,iBAAiB,aAAa,eAAe;AAC5D,YAAQ,OAAO,MAAM;AAAA,CAA0D;AAC/E,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM,aAAM,KAAK;AAAA,KAAQ,KAAK;AAAA,CAAI;AAEjD,MAAI,SAAS,QAAQ,aAAa,UAAU;AAC1C,YAAQ,OAAO,MAAM;AAAA,CAA0H;AAAA,EACjJ;AAGA,QAAM,WACH,aAAa,iBAAiB,aAAa,YAAY,aAAa,YAAY,aAAa,aAC7F,aAAa,iBAAiB,aAAa,YAAY,aAAa,YAAY,aAAa;AAChG,SAAO,UAAU,IAAI;AACvB;AAEA,SAAS,aAAa,OAAe,QAAoB,KAAiC;AACxF,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAe,aAAO,GAAG,KAAK,iBAAiB,GAAG;AAAA,IACvD,KAAK;AAAe,aAAO,GAAG,KAAK,iBAAiB,GAAG;AAAA,IACvD,KAAK;AAAe,aAAO,GAAG,KAAK,wBAAwB,GAAG;AAAA,IAC9D,KAAK;AAAe,aAAO,GAAG,KAAK;AAAA,IACnC,KAAK;AAAe,aAAO,GAAG,KAAK,2BAAsB,GAAG;AAAA,EAC9D;AACF;;;AD/IA,SAASE,cAAqB;AAC5B,SAAO,QAAQ,IAAI,aAAa,KAAKC,MAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,SAAS;AAChF;AAEA,SAAS,SAAiB;AACxB,SAAOA,MAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,UAAU,KAAK;AACxD;AAEA,eAAe,UAA4B;AACzC,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAAS,qFAA2E,CAAC,WAAW;AACjG,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,MAAM,WAAW;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,iBAA2B;AAClC,QAAM,MAAM,OAAO;AACnB,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,OAAOF,YAAW;AACxB,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,YAAY,GAAG,GAAG;AACpC,QAAI,CAAC,MAAM,WAAW,QAAQ,EAAG;AACjC,UAAM,OAAOC,MAAK,KAAK,KAAK;AAC5B,QAAI;AACF,YAAM,SAAS,aAAa,IAAI;AAChC,UAAI,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,SAAS,GAAG;AACvD,QAAAE,YAAW,IAAI;AACf,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,IACF,QAAQ;AAAA,IAAsC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,gBAAsB;AAC7B,MAAI,QAAQ,aAAa,SAAU;AACnC,QAAM,QAAQF,MAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,WAAW,gBAAgB,2BAA2B;AACpG,MAAI,CAACC,YAAW,KAAK,EAAG;AACxB,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,UAAQ,oBAAoB;AACjD,aAAS,mCAAmC,KAAK,iBAAiB,EAAE,OAAO,SAAS,CAAC;AACrF,IAAAC,YAAW,KAAK;AAAA,EAClB,QAAQ;AAAA,EAAoC;AAC9C;AAEA,eAAsB,UAAU,MAA0C;AACxE,QAAM,OAAOH,YAAW;AAExB,MAAI,CAACE,YAAW,IAAI,GAAG;AACrB,YAAQ,OAAO,MAAM,0DAAqD;AAC1E,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,KAAK;AACb,UAAM,YAAY,MAAM,QAAQ;AAChC,QAAI,CAAC,WAAW;AACd,cAAQ,OAAO,MAAM,YAAY;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,KAAK,EAAE,OAAO,KAAK,CAAC;AAG1B,gBAAc;AAGd,QAAM,UAAU,eAAe;AAG/B,SAAO,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAG7C,UAAQ,OAAO,MAAM;AAAA;AAAA,CAA0B;AAC/C,UAAQ,OAAO,MAAM,cAAc,IAAI;AAAA,CAAK;AAC5C,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,OAAO,MAAM,uBAAuB,QAAQ,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EACpE;AACA,UAAQ,OAAO,MAAM;AAAA;AAAA,CAA6C;AAClE,SAAO;AACT;;;AErFA;AAHA,SAAS,cAAAE,aAAY,WAAW,eAAAC,cAAa,UAAU,YAAY,cAAAC,aAAY,oBAAoB;AACnG,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,iBAAiB;AAG1B,IAAM,UAAU,CAAC,UAAU,UAAU,SAAS,QAAQ,aAAa,iBAAiB,aAAa;AACjG,IAAM,qBAAqB;AAE3B,eAAsB,OAAO,WAAoB,WAAqC;AACpF,QAAM,SAAS,WAAW;AAC1B,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACjD,QAAM,UAAU,aAAaA,MAAK,QAAQ,MAAM,GAAG,gBAAgB;AACnE,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAGtC,QAAM,cAAc;AAAA,IAClBA,MAAK,QAAQ,MAAM,GAAG,WAAW,OAAO,gBAAgB,UAAU,QAAQ,OAAO,kBAAkB;AAAA,IACnGA,MAAK,QAAQ,MAAM,GAAG,aAAa,MAAM,UAAU,QAAQ,OAAO,kBAAkB;AAAA,EACtF;AACA,QAAM,YAAY,YAAY,KAAK,OAAKH,YAAW,CAAC,CAAC;AACrD,MAAI;AACJ,MAAI,WAAW;AACb,gBAAY,UAAU,QAAQ,CAAC,SAAS,GAAG,EAAE,UAAU,SAAS,KAAK,EAAE,GAAG,QAAQ,IAAI,EAAE,CAAC;AAAA,EAC3F,OAAO;AACL,gBAAY,UAAU,UAAU,CAAC,QAAQ,GAAG,EAAE,UAAU,SAAS,KAAK,EAAE,GAAG,QAAQ,IAAI,EAAE,CAAC;AAAA,EAC5F;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,OAAO,MAAM,sCAA4B,UAAU,UAAU,UAAU,MAAM;AAAA,CAAI;AACzF,WAAO;AAAA,EACT;AAGA,QAAM,mBAAmBG,MAAK,QAAQ,MAAM,GAAG,WAAW,SAAS;AACnE,MAAI;AACJ,MAAIH,YAAW,gBAAgB,GAAG;AAChC,UAAM,WAAWC,aAAY,gBAAgB,EAC1C,OAAO,OAAK,EAAE,SAAS,MAAM,CAAC,EAC9B,KAAK,EACL,QAAQ;AACX,QAAI,SAAS,SAAS,EAAG,WAAU,SAAS,CAAC;AAAA,EAC/C;AAEA,MAAI,SAAS;AACX,UAAM,MAAME,MAAK,kBAAkB,OAAO;AAC1C,UAAM,OAAOA,MAAK,SAAS,UAAU,IAAI,MAAM;AAC/C,eAAW,KAAK,IAAI;AACpB,UAAM,QAAQ,SAAS,IAAI,EAAE,OAAO,MAAM,QAAQ,CAAC;AACnD,YAAQ,OAAO,MAAM,iBAAY,IAAI,SAAS,IAAI;AAAA,CAAkB;AAAA,EACtE,OAAO;AACL,YAAQ,OAAO,MAAM;AAAA,CAA0C;AAAA,EACjE;AAGA,QAAM,QAAqD,CAAC;AAC5D,aAAW,OAAO,SAAS;AACzB,UAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,QAAIH,YAAW,GAAG,EAAG,YAAW,KAAK,KAAK,KAAK;AAAA,EACjD;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,OAAO,MAAM,+BAA+B;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,SAASG,MAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAClF,YAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACrC,aAAW,KAAK,OAAO;AACrB,UAAM,OAAOA,MAAK,QAAQ,EAAE,OAAO;AACnC,cAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,iBAAa,EAAE,SAAS,IAAI;AAAA,EAC9B;AAEA,QAAM,UAAUA,MAAK,SAAS,UAAU,IAAI,MAAM;AAClD,QAAM,QAAQ,UAAU,SAAS,CAAC,IAAI,GAAG,EAAE,UAAU,QAAQ,CAAC,EAAE,WAAW;AAE3E,MAAI;AACJ,MAAI,OAAO;AACT,UAAM,IAAI,UAAU,MAAM,CAAC,KAAK,QAAQ,QAAQ,UAAU,KAAK,GAAG,GAAG,GAAG,EAAE,KAAK,QAAQ,UAAU,QAAQ,CAAC;AAC1G,YAAQ,EAAE,WAAW;AAAA,EACvB,OAAO;AACL,UAAM,IAAI,UAAU,OAAO,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,KAAK,QAAQ,UAAU,QAAQ,CAAC;AACnF,YAAQ,EAAE,WAAW;AAAA,EACvB;AAEA,YAAU,MAAM,CAAC,OAAO,MAAM,CAAC;AAE/B,MAAI,CAAC,OAAO;AACV,YAAQ,OAAO,MAAM;AAAA,CAAoB;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,QAAQ,QAAQ,UAAU,KAAK,IAAI;AAC7D,QAAM,UAAU,SAAS,SAAS,EAAE,OAAO,OAAO,MAAM,QAAQ,CAAC;AACjE,UAAQ,OAAO,MAAM,UAAK,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,MAAM,OAAO,MAAM,MAAM;AAAA,CAAW;AAG7F,QAAM,UAAU,aAAa,sBAAsB;AACnD,QAAM,MAAM,KAAK,IAAI;AACrB,aAAW,KAAKF,aAAY,OAAO,GAAG;AACpC,QAAI,EAAE,EAAE,WAAW,SAAS,KAAK,EAAE,WAAW,SAAS,GAAI;AAC3D,QAAI,EAAE,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,MAAM,GAAI;AACtE,UAAM,QAAQE,MAAK,SAAS,CAAC;AAC7B,QAAI;AACF,UAAI,MAAM,SAAS,KAAK,EAAE,UAAU,QAAQ;AAC1C,QAAAD,YAAW,KAAK;AAChB,gBAAQ,OAAO,MAAM,sBAAe,CAAC;AAAA,CAAI;AAAA,MAC3C;AAAA,IACF,QAAQ;AAAA,IAAa;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,QAAgB,KAAwD;AACvG,aAAW,SAASD,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAM,MAAME,MAAK,KAAK,MAAM,IAAI;AAChC,UAAM,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI;AACnC,QAAI,MAAM,YAAY,GAAG;AACvB,iBAAW,KAAK,KAAK,GAAG;AAAA,IAC1B,WAAW,MAAM,OAAO,GAAG;AACzB,UAAI,KAAK,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,IACzC;AAAA,EACF;AACF;;;AC7GA;AACA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,qBAAqB;AAiB9B,IAAM,kBAA6C,CAAC,cAAc,aAAa,UAAU,UAAU,QAAQ,QAAQ;AAGnH,IAAM,0BAA0D;AAAA,EAC9D,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACV;AACA,IAAM,iBAAiD;AAAA,EACrD,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACV;AAGA,IAAM,gBAA6C,oBAAI,IAAI,CAAC,cAAc,aAAa,UAAU,QAAQ,CAAC;AAE1G,IAAM,oBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAM,uBAAuD;AAAA,EAC3D,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACV;AAuBA,eAAe,eAAe,UAA+D;AAG3F,QAAM,EAAE,OAAO,OAAO,MAAM,QAAQ,SAAAC,UAAS,UAAU,OAAO,IAAI,MAAM,OAAO,oBAAgB;AAE/F,QAAM,wCAAmC;AACzC,QAAM,YAAY;AAGlB,QAAM,EAAE,cAAc,IAAI,cAAc,GAAG,IAAI,MAAM,OAAO,iCAAyB;AACrF,QAAM,UAAU,GAAG,QAAQ;AAC3B,QAAM,KAAK,MAAM,GAAG,QAAQ,QAAQ;AACpC,QAAM,cAAc,IAAI,eAAe;AAGvC,QAAM,WAAW,MAAM,KAAK;AAAA,IAC1B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc,UAAU,YAAY;AAAA,EACtC,CAAC;AACD,MAAI,SAAS,QAAQ,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAG7D,QAAM,aAAa;AAGnB,QAAM,eAAe,MAAM,OAAO;AAAA,IAChC,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,cAAc,OAAO,iEAA4D;AAAA,MAC1F,EAAE,OAAO,OAAO,OAAO,sCAAiC;AAAA,IAC1D;AAAA,IACA,cAAc,UAAU,gBAAgB;AAAA,EAC1C,CAAC;AACD,MAAI,SAAS,YAAY,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAGjE,QAAM,YAAY,MAAMA,SAAQ;AAAA,IAC9B,SAAS;AAAA,IACT,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAG9D,QAAM,gBAAgB,MAAM,KAAK;AAAA,IAC/B,SAAS,mEAAyD,SAAS;AAAA,IAC3E,aAAa;AAAA,IACb,cAAc,UAAU;AAAA,IACxB,UAAU,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,MAAM,MAAM,EAAE,SAAS,GAAG,IAAK,SAAY;AAAA,EAC5E,CAAC;AACD,MAAI,SAAS,aAAa,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAGlE,MAAI,iBAAiB,UAAU,kBAAkB;AACjD,MAAI,iBAAiB,cAAc,KAAK,KAAK,CAAC,gBAAgB;AAC5D,UAAM,SAAS,+BAA+B,cAAc,KAAK,CAAC;AAClE,QAAI;AAEF,YAAM,MAAM,GAAG,MAAM,0CAA0C;AAAA,IACjE,QAAQ;AAAA,IAAoB;AAC5B,YAAQ,OAAO,MAAM,8DAA8D;AACnF,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,MAAM,oDAAoD;AACrF,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,KAAK,KAAK,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM;AACvE,UAAI,IAAI;AACN,yBAAiB,OAAO,EAAE;AAC1B,gBAAQ,OAAO,MAAM,iCAA4B,cAAc;AAAA,CAAI;AAAA,MACrE,OAAO;AACL,gBAAQ,OAAO,MAAM,2DAAiD;AAAA,MACxE;AAAA,IACF,QAAQ;AAAE,cAAQ,OAAO,MAAM,oEAA0D;AAAA,IAAG;AAAA,EAC9F;AAEA,QAAM,iBAAiB,MAAM,KAAK;AAAA,IAChC,SAAS,0BAA0B,SAAS;AAAA,IAC5C,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,MAAM,MAAM,UAAU,KAAK,EAAE,KAAK,CAAC,IAAK,SAAY;AAAA,EACrF,CAAC;AACD,MAAI,SAAS,cAAc,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAGnE,QAAM,kBAAkB,MAAM,KAAK;AAAA,IACjC,SAAS,sBAAsB,SAAS;AAAA,IACxC,aAAa;AAAA,IACb,cAAc,UAAU;AAAA,EAC1B,CAAC;AACD,MAAI,SAAS,eAAe,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAEpE,QAAM,eAAe,MAAM,KAAK;AAAA,IAC9B,SAAS,mBAAmB,SAAS;AAAA,IACrC,aAAa;AAAA,IACb,cAAc,UAAU;AAAA,IACxB,UAAU,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,MAAM,MAAM,cAAc,KAAK,EAAE,KAAK,CAAC,IAAK,SAAY;AAAA,EACzF,CAAC;AACD,MAAI,SAAS,YAAY,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAEjE,QAAM,oBAAoB,MAAM,KAAK;AAAA,IACnC,SAAS,+BAA+B,SAAS;AAAA,IACjD,aAAa;AAAA,IACb,cAAc,UAAU;AAAA,IACxB,UAAU,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,MAAM,MAAM,cAAc,KAAK,EAAE,KAAK,CAAC,IAAK,SAAY;AAAA,EACzF,CAAC;AACD,MAAI,SAAS,iBAAiB,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAGtE,QAAM,kBAAkB,MAAM,OAAuB;AAAA,IACnD,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,cAAc,OAAO,4CAAuC;AAAA,MACrE,EAAE,OAAO,aAAa,OAAO,uCAAkC;AAAA,MAC/D,EAAE,OAAO,UAAU,OAAO,iCAA4B;AAAA,MACtD,EAAE,OAAO,UAAU,OAAO,4CAAuC;AAAA,MACjE,EAAE,OAAO,QAAQ,OAAO,sDAAiD;AAAA,MACzE,EAAE,OAAO,UAAU,OAAO,0DAAqD;AAAA,IACjF;AAAA,IACA,cAAc,UAAU,mBAAmB;AAAA,EAC7C,CAAC;AACD,MAAI,SAAS,eAAe,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAGpE,QAAM,eAAe,MAAM,KAAK;AAAA,IAC9B,SAAS,sBAAsB,eAAe;AAAA,IAC9C,aAAa,eAAe,eAAe;AAAA,IAC3C,cAAc,UAAU,gBAAgB,eAAe,eAAe;AAAA,EACxE,CAAC;AACD,MAAI,SAAS,YAAY,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAGjE,QAAM,YAAY,qBAAqB,eAAe;AACtD,MAAI,iBAAiB,UAAU,kBAAkB;AACjD;AACE,UAAM,IAAI,MAAM,KAAK;AAAA,MACnB,SAAS,GAAG,SAAS,KAAK,SAAS;AAAA,MACnC,aAAa,UAAU,iBAAiB,oBAAoB;AAAA,MAC5D,cAAc,UAAU;AAAA,IAC1B,CAAC;AACD,QAAI,SAAS,CAAC,GAAG;AAAE,aAAO,YAAY;AAAG,aAAO;AAAA,IAAM;AACtD,qBAAiB,OAAO,KAAK,EAAE,EAAE,KAAK,KAAK,UAAU,kBAAkB;AAAA,EACzE;AAGA,QAAM,WAAW,OAAO,YAAY,EAAE,KAAK,KAAK,eAAe,eAAe;AAC9E,MAAI,cAAc,IAAI,eAAe,KAAK,gBAAgB;AACxD,UAAM,QAAQ,MAAMA,SAAQ,EAAE,SAAS,wCAAwC,cAAc,KAAK,CAAC;AACnG,QAAI,SAAS,KAAK,GAAG;AAAE,aAAO,YAAY;AAAG,aAAO;AAAA,IAAM;AAC1D,QAAI,OAAO;AACT,YAAM,WAAW,kBAAkB,eAAe,KAAK;AACvD,YAAM,SAAS,MAAM,uBAAuB,UAAU,gBAAgB,QAAQ;AAC9E,cAAQ,OAAO,MAAM,OAAO,KAAK,UAAK,QAAQ,iBAAiB,eAAe;AAAA,IAAO,iBAAO,OAAO,OAAO;AAAA,CAAI;AAAA,IAChH;AAAA,EACF;AAGA,QAAM,WAAW,MAAM,KAAK;AAAA,IAC1B,SAAS,4CAAuC,SAAS;AAAA,IACzD,aAAa;AAAA,IACb,cAAc,UAAU,iBAAiB;AAAA,EAC3C,CAAC;AACD,MAAI,SAAS,QAAQ,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAC7D,QAAM,gBAAgB,OAAO,YAAY,EAAE,EAAE,KAAK;AAElD,MAAI,iBAAiB,cAAc,IAAI,eAAe,KAAK,gBAAgB;AACzE,UAAM,QAAQ,MAAMA,SAAQ,EAAE,SAAS,gCAAgC,aAAa,MAAM,cAAc,KAAK,CAAC;AAC9G,QAAI,SAAS,KAAK,GAAG;AAAE,aAAO,YAAY;AAAG,aAAO;AAAA,IAAM;AAC1D,QAAI,OAAO;AACT,YAAM,WAAW,kBAAkB,eAAe,KAAK;AACvD,YAAM,SAAS,MAAM,uBAAuB,UAAU,gBAAgB,aAAa;AACnF,cAAQ,OAAO,MAAM,OAAO,KAAK,UAAK,aAAa;AAAA,IAAiB,iBAAO,OAAO,OAAO;AAAA,CAAI;AAAA,IAC/F;AAAA,EACF;AAGA,QAAM,UAAU,MAAM,KAAK;AAAA,IACzB,SAAS,8CAAyC,SAAS;AAAA,IAC3D,aAAa;AAAA,IACb,cAAc,UAAU;AAAA,IACxB,UAAU,CAAC,MAAO,CAAC,KAAK,kBAAkB,KAAK,EAAE,KAAK,CAAC,IAAK,SAAY;AAAA,EAC1E,CAAC;AACD,MAAI,SAAS,OAAO,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAE5D,QAAM,WAAW,MAAM,KAAK;AAAA,IAC1B,SAAS,oBAAoB,SAAS;AAAA,IACtC,aAAa;AAAA,IACb,cAAc,UAAU;AAAA,IACxB,UAAU,CAAC,MAAO,CAAC,KAAK,kBAAkB,KAAK,EAAE,KAAK,CAAC,IAAK,SAAY;AAAA,EAC1E,CAAC;AACD,MAAI,SAAS,QAAQ,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAE7D,QAAM,aAAa,MAAM,KAAK;AAAA,IAC5B,SAAS,8CAA8C,SAAS;AAAA,IAChE,aAAa,UAAU,aAAa,oBAAoB;AAAA,IACxD,cAAc,UAAU;AAAA,EAC1B,CAAC;AACD,MAAI,SAAS,UAAU,GAAG;AAAE,WAAO,YAAY;AAAG,WAAO;AAAA,EAAM;AAG/D,QAAM,mBAAmB;AAGzB,QAAM,OAAO,CAAC,MAAsB,IAAK,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,SAAI,EAAE,MAAM,EAAE,CAAC,KAAK,QAAS;AACrG,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,0BAA0B,WAAW;AAAA,IACrC,0BAA0B,OAAO,YAAY,EAAE,KAAK,WAAW;AAAA,IAC/D,0BAA0B,KAAK,OAAO,iBAAiB,EAAE,CAAC,CAAC;AAAA,IAC3D,0BAA0B,OAAO,kBAAkB,EAAE,KAAK,WAAW;AAAA,IACrE,0BAA0B,KAAK,OAAO,mBAAmB,EAAE,CAAC,CAAC;AAAA,IAC7D,0BAA0B,OAAO,gBAAgB,EAAE,KAAK,WAAW;AAAA,IACnE,0BAA0B,OAAO,qBAAqB,EAAE,KAAK,WAAW;AAAA,IACxE,0BAA0B,eAAe;AAAA,IACzC,0BAA0B,QAAQ;AAAA,IAClC,KAAK,SAAS,YAAY,KAAK,cAAc,CAAC;AAAA,IAC9C,0BAA0B,iBAAiB,WAAW;AAAA,IACtD,0BAA0B,OAAO,WAAW,EAAE,KAAK,gBAAgB;AAAA,IACnE,0BAA0B,OAAO,YAAY,EAAE,KAAK,gBAAgB;AAAA,IACpE,0BAA0B,KAAK,OAAO,cAAc,EAAE,CAAC,CAAC;AAAA,IACxD,0BAA0B,mBAAmB,YAAY,UAAU;AAAA,IACnE,0BAA0B,YAAY,wBAAwB,qBAAqB;AAAA,IACnF;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC;AAErC,QAAM,KAAK,MAAMA,SAAQ,EAAE,SAAS,6BAA6B,cAAc,KAAK,CAAC;AACrF,MAAI,SAAS,EAAE,KAAK,CAAC,IAAI;AAAE,WAAO,oCAA+B;AAAG,WAAO;AAAA,EAAM;AAEjF,QAAM,sBAAiB;AAEvB,SAAO;AAAA,IACL;AAAA,IACA,UAAU,OAAO,YAAY,EAAE,EAAE,KAAK;AAAA,IACtC,YAAY,OAAO,cAAc,EAAE;AAAA,IACnC,eAAe,OAAO,iBAAiB,EAAE,EAAE,KAAK;AAAA,IAChD,gBAAgB,OAAO,kBAAkB,EAAE,EAAE,KAAK;AAAA,IAClD,iBAAiB,OAAO,mBAAmB,EAAE,EAAE,KAAK;AAAA,IACpD,cAAc,OAAO,gBAAgB,EAAE,EAAE,KAAK;AAAA,IAC9C,mBAAmB,OAAO,qBAAqB,EAAE,EAAE,KAAK;AAAA,IACxD;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS,OAAO,WAAW,EAAE,EAAE,KAAK;AAAA,IACpC,UAAU,OAAO,YAAY,EAAE,EAAE,KAAK;AAAA,IACtC,YAAY,OAAO,cAAc,EAAE,EAAE,KAAK,KAAK,UAAU,cAAc;AAAA,IACvE,kBAAkB;AAAA,IAClB,cAAc,OAAO,gBAAgB,YAAY;AAAA,IACjD,WAAW,cAAc;AAAA,EAC3B;AACF;AAGA,eAAe,uBAAuB,UAAkB,QAAgB,OAA0D;AAChI,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,WAAW;AAAA,MAC5C,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,MAC7C,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO,EAAE,IAAI,OAAO,SAAS,qBAAqB,IAAI,MAAM,GAAG;AAC5E,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,OAAO,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAK,EAAE,EAAE;AAC3C,WAAO,IAAI,SAAS,KAAK,IACrB,EAAE,IAAI,MAAM,SAAS,YAAY,IACjC,EAAE,IAAI,OAAO,SAAS,IAAI,KAAK,uCAAuC;AAAA,EAC5E,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,SAAS,iBAAiB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,GAAG;AAAA,EACnG;AACF;AAEA,SAAS,uBAAuB,MAA8C;AAC5E,MAAI,CAAC,KAAK,YAAY;AACpB,WAAO;AAAA,EACT;AACA,QAAM,WAAY,KAAK,mBAAmB;AAC1C,MAAI,CAAC,gBAAgB,SAAS,QAAQ,GAAG;AACvC,WAAO,sCAAsC,gBAAgB,KAAK,IAAI,CAAC;AAAA,EACzE;AACA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe,KAAK,iBAAiB;AAAA,IACrC,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB,KAAK,qBAAqB;AAAA,IAC7C,iBAAiB;AAAA,IACjB,cAAc,KAAK,gBAAgB,eAAe,QAAQ;AAAA,IAC1D,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AACF;AAEA,eAAe,aAAa,SAAgD;AAC1E,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,SAAS,OAAO;AAC/C,UAAM,KAAK,oBAAI,IAAoB;AACnC,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAChD,UAAI,KAAK,EAAE,CAAC,MAAM,UAAa,EAAE,CAAC,MAAM,OAAW,IAAG,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IACtE;AACA,UAAM,WAAY,GAAG,IAAI,kBAAkB,KAAK;AAChD,QAAI,CAAC,gBAAgB,SAAS,QAAQ,EAAG,QAAO;AAChD,UAAM,YAAY,qBAAqB,QAAQ;AAC/C,WAAO;AAAA,MACL,aAAa;AAAA,MACb,UAAU,GAAG,IAAI,mBAAmB,KAAK;AAAA,MACzC,YAAY;AAAA,MACZ,eAAe,GAAG,IAAI,oBAAoB,KAAK;AAAA,MAC/C,gBAAgB,GAAG,IAAI,cAAc,KAAK;AAAA,MAC1C,iBAAiB,GAAG,IAAI,mBAAmB,KAAK;AAAA,MAChD,cAAc,GAAG,IAAI,gBAAgB,KAAK;AAAA,MAC1C,mBAAmB,GAAG,IAAI,wBAAwB,KAAK;AAAA,MACvD,iBAAiB;AAAA,MACjB,cAAc,GAAG,IAAI,eAAe,KAAK,eAAe,QAAQ;AAAA,MAChE,gBAAgB,YAAa,GAAG,IAAI,SAAS,KAAK,KAAM;AAAA,MACxD,eAAe;AAAA,MACf,SAAS,GAAG,IAAI,UAAU,KAAK;AAAA,MAC/B,UAAU,GAAG,IAAI,WAAW,KAAK;AAAA,MACjC,YAAY,GAAG,IAAI,cAAc,KAAK;AAAA,MACtC,kBAAkB,GAAG,IAAI,mBAAmB,MAAM;AAAA,MAClD,cAAc,GAAG,IAAI,eAAe,KAAK;AAAA,MACzC,WAAW,GAAG,IAAI,YAAY,MAAM;AAAA,IACtC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,UAAkB,SAAgC;AACzE,QAAM,QAAQ,oBAAI,IAAI;AAAA,IACpB;AAAA,IACA;AAAA,IAAkB;AAAA,IAClB;AAAA,IAAoB;AAAA,IACpB;AAAA,IAAY;AAAA,IAAa;AAAA,IAA0B;AAAA,IAAqB;AAAA,EAC1E,CAAC;AACD,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,SAAS,MAAM,IAAI,GAAG;AACvC,UAAM,IAAI,KAAK,MAAM,sBAAsB;AAC3C,QAAI,KAAK,EAAE,CAAC,MAAM,UAAa,MAAM,IAAI,EAAE,CAAC,CAAC,EAAG;AAChD,cAAU,KAAK,IAAI;AAAA,EACrB;AACA,SAAO,UAAU,SAAS,KAAK,UAAU,UAAU,SAAS,CAAC,MAAM,GAAI,WAAU,IAAI;AAErF,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ,eAAe;AAAA,IAC3C,iBAAiB,QAAQ,YAAY;AAAA,EACvC;AACA,MAAI,QAAQ,eAAgB,UAAS,KAAK,gBAAgB,QAAQ,cAAc,EAAE;AAAA,WACzE,QAAQ,kBAAmB,UAAS,KAAK,gBAAgB,QAAQ,iBAAiB,EAAE;AAC7F,MAAI,QAAQ,aAAc,UAAS,KAAK,kBAAkB,QAAQ,YAAY,EAAE;AAChF,MAAI,QAAQ,kBAAmB,UAAS,KAAK,0BAA0B,QAAQ,iBAAiB,EAAE;AAClG,MAAI,QAAQ,QAAS,UAAS,KAAK,YAAY,QAAQ,OAAO,EAAE;AAChE,MAAI,QAAQ,SAAU,UAAS,KAAK,aAAa,QAAQ,QAAQ,EAAE;AACnE,WAAS,KAAK,4BAA4B;AAC1C,WAAS,KAAK,qBAAqB,QAAQ,mBAAmB,SAAS,OAAO,EAAE;AAChF,WAAS,KAAK,iBAAiB,QAAQ,YAAY,EAAE;AACrD,WAAS,KAAK,cAAc,QAAQ,YAAY,SAAS,OAAO,EAAE;AAElE,SAAO,CAAC,GAAG,WAAW,GAAG,UAAU,EAAE,EAAE,KAAK,IAAI;AAClD;AAEA,eAAsB,QAAQ,MAAuC;AACnE,QAAM,QAAQ,aAAa,QAAQ;AAGnC,QAAM,EAAE,gBAAgB,YAAY,iBAAiB,IAAI,MAAM,OAAO,2BAAmB;AACzF,iBAAe,MAAM,IAAI;AACzB,mBAAiB,SAAS;AAC1B,QAAM,aAAa,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;AAC3D,UAAQ,OAAO,QAAS,CAAC,UAAe,SAAgB;AACtD,QAAI,OAAO,UAAU,aAAa,MAAM,WAAW,QAAG,KAAK,MAAM,WAAW,QAAG,KAAK,MAAM,WAAW,QAAG,GAAI,YAAW,MAAM,QAAQ,CAAC;AACtI,WAAO,WAAW,OAAO,GAAG,IAAI;AAAA,EAClC;AAEA,QAAM,WAAW,MAAM,aAAa,MAAM,QAAQ;AAClD,MAAI,CAAC,UAAU;AACb,YAAQ,OAAO;AAAA,MACb;AAAA,yBAA0E,MAAM,QAAQ;AAAA;AAAA,IAC1F;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAUC,MAAK,MAAM,QAAQ,MAAM;AACzC,QAAM,WAAW,MAAM,aAAa,OAAO;AAC3C,QAAM,YAAYA,MAAK,MAAM,MAAM,QAAQ;AAC3C,QAAM,EAAE,YAAY,aAAa,IAAI,MAAM,OAAO,SAAS;AAC3D,QAAM,iBAAiB,aAAaA,MAAK,WAAW,oBAAoB,CAAC,KAAK,aAAaA,MAAK,WAAW,mBAAmB,CAAC;AAC/H,QAAM,gBAAgB,aAAa,SAAS,SAAS,iBAAiB,SAAS,mBAAmB;AAClG,MAAI,iBAAiB,CAAC,KAAK,OAAO;AAChC,iBAAa,mBAAmB,uGAAuG;AACvI,QAAI,KAAK,gBAAgB;AACvB,cAAQ,OAAO,MAAM;AAAA,CAAqE;AAC1F,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,KAAK,gBAAgB;AACvB,UAAM,SAAS,uBAAuB,IAAI;AAC1C,QAAI,OAAO,WAAW,UAAU;AAC9B,cAAQ,OAAO,MAAM,UAAU,MAAM;AAAA,CAAI;AACzC,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ,OAAO;AACL,cAAU,MAAM,eAAe,QAAQ;AACvC,QAAI,YAAY,KAAM,QAAO;AAAA,EAC/B;AAGA,MAAI,iBAAiB;AACrB,MAAI;AACF,qBAAiB,MAAM,SAAS,SAAS,OAAO;AAAA,EAClD,QAAQ;AAEN,qBAAiB;AAAA,EACnB;AAEA,QAAM,OAAO,gBAAgB,gBAAgB,OAAO;AACpD,QAAM,UAAU,SAAS,MAAM,EAAE,MAAM,IAAM,CAAC;AAC9C,UAAQ,OAAO,MAAM;AAAA,eAAa,OAAO;AAAA,CAAI;AAG7C,QAAM,gBAAgBA,MAAK,MAAM,MAAM,QAAQ;AAC/C,QAAM,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAmC,CAAC;AAC1C,MAAI,QAAQ,cAAe,SAAQ,KAAK,CAAC,sBAAsB,QAAQ,aAAa,CAAC;AACrF,MAAI,QAAQ,gBAAiB,SAAQ,KAAK,CAAC,qBAAqB,QAAQ,eAAe,CAAC;AACxF,MAAI,QAAQ,gBAAgB;AAC1B,UAAM,kBAAkB,qBAAqB,QAAQ,eAAe;AACpE,QAAI,gBAAiB,SAAQ,KAAK,CAAC,iBAAiB,QAAQ,cAAc,CAAC;AAAA,EAC7E;AACA,MAAI,QAAQ,WAAY,SAAQ,KAAK,CAAC,gBAAgB,QAAQ,UAAU,CAAC;AACzE,aAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,UAAM,UAAUA,MAAK,eAAe,IAAI,GAAG,OAAO,EAAE,MAAM,IAAM,CAAC;AAAA,EACnE;AACA,MAAI,QAAQ,SAAS,EAAG,SAAQ,OAAO,MAAM,UAAK,QAAQ,MAAM,mBAAc,aAAa;AAAA,CAAI;AAG/F,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,iCAAyB;AAChE,QAAM,KAAK,MAAM,aAAa,MAAM,QAAQ;AAC5C,MAAI,GAAI,OAAMA,eAAc,MAAM,UAAU,EAAE,GAAG,IAAI,aAAa,QAAQ,YAAY,CAAC;AACvF,UAAQ,OAAO,MAAM,wBAAmB,QAAQ,WAAW;AAAA,CAAI;AAG/D;AACE,UAAM,gBAAgBD,MAAK,MAAM,QAAQ,gBAAgB;AACzD,QAAI,KAA8B,CAAC;AACnC,QAAI;AACF,WAAK,KAAK,MAAM,MAAM,SAAS,eAAe,OAAO,CAAC;AAAA,IACxD,SAAS,KAAK;AAAE,oBAAc,WAAW,MAAM,GAAG;AAAA,IAAG;AAGrD,QAAI,CAAC,GAAG,WAAW,GAAG;AACpB,SAAG,WAAW,IAAI;AAAA,QAChB,QAAQ,EAAE,aAAa,OAAO,OAAO,WAAW;AAAA,QAChD,UAAU,EAAE,aAAa,OAAO,YAAY,4BAA4B;AAAA,QACxE,cAAc,EAAE,aAAa,OAAO,YAAY,gCAAgC,aAAa,qBAAqB;AAAA,MACpH;AAAA,IACF;AACA,QAAI,CAAC,GAAG,QAAQ,GAAG;AACjB,YAAM,WAAW,wBAAwB,QAAQ,eAAe,KAAK,QAAQ;AAC7E,SAAG,QAAQ,IAAI;AAAA,QACb,aAAa,EAAE,SAAS,QAAQ,cAAc,YAAY,SAAS;AAAA,QACnE,UAAU,EAAE,SAAS,QAAQ,cAAc,YAAY,SAAS;AAAA,QAChE,WAAW,EAAE,SAAS,QAAQ,cAAc,YAAY,SAAS;AAAA,QACjE,UAAU,EAAE,SAAS,QAAQ,cAAc,YAAY,SAAS;AAAA,MAClE;AAAA,IACF;AACA,QAAI,QAAQ,eAAe;AACzB,YAAM,WAAW,wBAAwB,QAAQ,eAAe,KAAK,QAAQ;AAC7E,SAAG,UAAU,IAAI,EAAE,OAAO,QAAQ,eAAe,UAAU,SAAS;AAAA,IACtE;AAEA,UAAM,UAAU,eAAe,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AAClF,YAAQ,OAAO,MAAM,gCAAsB,aAAa;AAAA,CAAI;AAAA,EAC9D;AAGA;AACE,UAAM,YAAYA,MAAK,MAAM,QAAQ,YAAY;AACjD,UAAM,SAAS,QAAQ,SAAS,YAAY,EAAE,QAAQ,cAAc,EAAE,KAAK;AAC3E,UAAM,YAAqC,CAAC;AAC5C,QAAI,QAAQ,eAAgB,WAAU,UAAU,IAAI,SAAS,QAAQ,gBAAgB,EAAE,KAAK,QAAQ;AACpG,QAAI,QAAQ,aAAc,WAAU,SAAS,IAAI,QAAQ;AACzD,UAAM,QAAQ;AAAA,MACZ,OAAO,CAAC;AAAA,QACN;AAAA,QACA,aAAa,QAAQ,YAAY;AAAA,QACjC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,OAAO,CAAC,KAAK;AAAA,QACb;AAAA,QACA,cAAc,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AACA,UAAM,UAAU,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AACjF,YAAQ,OAAO,MAAM,4BAAkB,SAAS;AAAA,CAAI;AAAA,EACtD;AAGA,MAAI,QAAQ,UAAU;AACpB,UAAM,aAAa,QAAQ,IAAI,aAAa,KAAKA,MAAKE,SAAQ,MAAM,IAAI,GAAG,SAAS;AACpF,UAAM,aAAaF,MAAK,YAAY,UAAU,MAAM;AACpD,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,OAAO,SAAS;AAC5D,QAAI,cAAc,UAAU,GAAG;AAC7B,YAAM,cAAcA,MAAK,YAAY,iBAAiB;AACtD,UAAI,CAAC,cAAc,WAAW,GAAG;AAC/B,cAAM,UAAU,aAAa;AAAA;AAAA,QAA2B,QAAQ,QAAQ;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC7F,gBAAQ,OAAO,MAAM,iCAAuB,WAAW;AAAA,CAAI;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,cAAc,QAAQ,UAAU;AAC1C,QAAI;AACF,YAAM,EAAE,sBAAsB,eAAe,IAAI,MAAM,OAAO,QAAQ;AACtE,YAAM,EAAE,eAAe,IAAI,MAAM,OAAO,QAAQ;AAChD,YAAM,MAAM,qBAAqB,QAAQ,YAAY,QAAQ,QAAQ;AACrE,qBAAe,GAAG;AAClB,YAAM,SAAS,eAAe,QAAQ,UAAU;AAChD,cAAQ,OAAO,MAAM,gDAA2C,SAAS,yBAAyB,EAAE;AAAA,CAAI;AAAA,IAC1G,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,2BAAsB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AAAA,IACjG;AAAA,EACF;AAGA,MAAI,QAAQ,gBAAgB;AAC1B,UAAM,iBAAiB,QAAQ,gBAAgB,MAAM,IAAI;AAAA,EAC3D;AAGA,QAAM,YAAYA,MAAK,MAAM,MAAM,QAAQ;AAC3C,QAAM,iBAAiBA,MAAK,WAAW,YAAY;AACnD,QAAM,EAAE,YAAY,iBAAiB,IAAI,MAAM,OAAO,SAAS;AAC/D,MAAI,CAAC,iBAAiB,cAAc,GAAG;AACrC,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,cAAcA,MAAKE,SAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,UAAU,YAAY;AACxF,UAAM,eAAeF,MAAKE,SAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,MAAM,MAAM,UAAU,YAAY;AACrG,QAAI,UAAU;AACd,QAAI;AAAE,gBAAW,MAAM,SAAS,aAAa,OAAO;AAAA,IAAI,QAAQ;AAC9D,UAAI;AAAE,kBAAW,MAAM,SAAS,cAAc,OAAO;AAAA,MAAI,QAAQ;AAAA,MAAoB;AAAA,IACvF;AACA,UAAM,UAAU,gBAAgB,OAAO;AACvC,YAAQ,OAAO,MAAM,mCAAyB,cAAc;AAAA,CAAI;AAAA,EAClE;AAEA,UAAQ,OAAO,MAAM;AAAA;AAAA,KAAyEF,MAAK,MAAM,QAAQ,gBAAgB,CAAC;AAAA;AAAA,CAA+C;AAGjL,MAAI,KAAK,gBAAgB;AACvB,YAAQ,OAAO,MAAM;AAAA;AAAA,CAA4D;AACjF,WAAO;AAAA,EACT;AAIA,QAAM,EAAE,YAAAG,YAAW,IAAI,MAAM,OAAO,SAAS;AAC7C,QAAM,SAASA,YAAWH,MAAK,QAAQ,IAAI,GAAG,MAAM,CAAC,KAAKG,YAAWH,MAAK,QAAQ,IAAI,GAAG,cAAc,CAAC;AACxG,MAAI,CAAC,QAAQ;AACX,YAAQ,OAAO,MAAM;AAAA;AAAA,CAAkF;AACvG,WAAO;AAAA,EACT;AACA,UAAQ,OAAO,MAAM;AAAA;AAAA,CAAmC;AACxD,QAAM,EAAE,QAAAI,QAAO,IAAI,MAAM,OAAO,sBAAa;AAC7C,QAAM,QAAQ,MAAMA,QAAO,EAAE,QAAQ,SAAS,WAAW,MAAM,qBAAqB,MAAM,CAAC;AAC3F,MAAI,UAAU,GAAG;AACf,YAAQ,OAAO,MAAM;AAAA,iDAA0C,KAAK;AAAA,CAA8B;AAClG,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,oBAAoB;AACvD,UAAM,QAAQA,WAAU,SAAS,CAAC,QAAQ,GAAG,EAAE,UAAU,QAAQ,CAAC;AAClE,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,OAAO,MAAM;AAAA;AAAA,CAAoC;AACzD,YAAM,IAAIA,WAAU,UAAU,CAAC,SAAS,GAAG,EAAE,OAAO,UAAU,CAAC;AAC/D,UAAI,EAAE,WAAW,EAAG,SAAQ,OAAO,MAAM,0CAAqC,EAAE,MAAM;AAAA,CAAI;AAAA,IAC5F,OAAO;AACL,cAAQ,OAAO,MAAM;AAAA;AAAA,CAAgH;AAAA,IACvI;AAAA,EACF,QAAQ;AAAA,EAA6C;AAGrD,QAAM,EAAE,SAAAN,SAAQ,IAAI,MAAM,OAAO,oBAAgB;AACjD,QAAM,YAAsB,CAAC;AAC7B,MAAI,QAAQ,gBAAgB,UAAU;AACpC,cAAU,KAAK,cAAc;AAAA,EAC/B,OAAO;AACL,QAAI,QAAQ,aAAa,UAAU;AACjC,gBAAU,KAAK,mFAAmF;AAAA,IACpG,WAAW,QAAQ,aAAa,SAAS;AACvC,gBAAU,KAAK,gCAAgC;AAC/C,gBAAU,KAAK,+CAA+C;AAAA,IAChE;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM;AAAA;AAAA,CAA4B;AACjD,QAAM,EAAE,OAAAO,OAAM,IAAI,MAAM,OAAO,oBAAoB;AACnD,MAAI,UAAU,SAAS,GAAG;AACxB,eAAW,OAAO,UAAW,SAAQ,OAAO,MAAM,YAAO,GAAG;AAAA,CAAI;AAChE,UAAM,MAAM,MAAMP,SAAQ,EAAE,SAAS,0CAA0C,cAAc,KAAK,CAAC;AACnG,QAAI,QAAQ,MAAM;AAChB,iBAAW,OAAO,WAAW;AAC3B,cAAM,IAAI,QAAc,CAAC,YAAY;AACnC,gBAAM,QAAQO,OAAM,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,OAAO,UAAU,CAAC;AAC9D,gBAAM,GAAG,QAAQ,MAAM,QAAQ,CAAC;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,cAAQ,OAAO,MAAM;AAAA,CAA8B;AAAA,IACrD;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM;AAAA;AAAA,CAA4B;AACjD,SAAO;AACT;AAmBA,eAAe,iBAAiB,QAAgBC,aAAmC;AACjF,QAAM,EAAE,YAAAJ,YAAW,IAAI,MAAM,OAAO,SAAS;AAC7C,QAAM,YAAYH,MAAKO,aAAY,SAAS,YAAY;AACxD,MAAIJ,YAAW,SAAS,GAAG;AACzB,YAAQ,OAAO,MAAM;AAAA,CAAoD;AACzE;AAAA,EACF;AAEA,QAAM,EAAE,eAAAK,eAAc,IAAI,MAAM,OAAO,UAAU;AACjD,QAAM,OAAON,SAAQM,eAAc,YAAY,GAAG,CAAC;AAGnD,QAAM,aAAa;AAAA,IACjBR,MAAK,MAAM,MAAM,MAAM,MAAM,oBAAoB;AAAA,IACjDA,MAAK,MAAM,MAAM,MAAM,oBAAoB;AAAA,EAC7C;AACA,MAAI,eAA8B;AAClC,aAAW,KAAK,YAAY;AAC1B,QAAIG,YAAW,CAAC,GAAG;AAAE,qBAAe;AAAG;AAAA,IAAO;AAAA,EAChD;AACA,MAAI,CAAC,cAAc;AACjB,YAAQ,OAAO,MAAM;AAAA,CAA+D;AACpF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,cAAc,OAAO;AAChD,eAAW,KAAK,MAAM,GAAG;AAAA,EAC3B,SAAS,KAAK;AACZ,YAAQ,OAAO,MAAM,6CAAwC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACjH;AAAA,EACF;AAEA,QAAM,EAAE,WAAAE,WAAU,IAAI,MAAM,OAAO,oBAAoB;AACvD,MAAI,SAAS;AACb,aAAW,SAAS,UAAU;AAC5B,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MAAc,MAAM;AAAA,MACpB;AAAA,MAAa,MAAM;AAAA,MACnB;AAAA,MAAa;AAAA,MACb;AAAA,MAAU,MAAM;AAAA,MAChB;AAAA,MAAc,MAAM;AAAA,IACtB;AACA,QAAI,MAAM,GAAI,MAAK,KAAK,QAAQ,MAAM,EAAE;AACxC,QAAI,MAAM,MAAO,MAAK,KAAK,WAAW,MAAM,KAAK;AACjD,QAAI,MAAM,cAAe,MAAK,KAAK,sBAAsB,OAAO,MAAM,aAAa,CAAC;AACpF,UAAM,SAASA,WAAU,eAAe,MAAM;AAAA,MAC5C,UAAU;AAAA,MACV,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAaE,YAAW;AAAA,IACjD,CAAC;AACD,QAAI,OAAO,WAAW,GAAG;AACvB;AAAA,IACF,OAAO;AACL,YAAM,MAAM,OAAO,OAAO,WAAW,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,OAAO,MAAM;AAC5G,cAAQ,OAAO,MAAM,uCAA6B,MAAM,QAAQ,MAAM,GAAG,EAAE,CAAC,MAAM,GAAG;AAAA,CAAI;AAAA,IAC3F;AAAA,EACF;AACA,MAAI,SAAS,GAAG;AACd,YAAQ,OAAO,MAAM,iBAAY,MAAM,gBAAgB,WAAW,IAAI,KAAK,GAAG;AAAA,CAAI;AAAA,EACpF;AACF;;;ACryBA,SAAS,gBAAgB;AAgBzB,eAAsB,SAAS,MAAwC;AACrE,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,WAAW,MAAM,aAAa,MAAM,QAAQ;AAClD,MAAI,CAAC,YAAY,CAAC,SAAS,SAAS;AAClC,YAAQ,OAAO,MAAM;AAAA,CAA4C;AACjE,WAAO;AAAA,EACT;AACA,MAAI,SAAS,cAAc,WAAW,KAAK,KAAK,OAAO,QAAW;AAChE,YAAQ,OAAO,MAAM;AAAA,CAAwD;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,SAAiB,KAAK,MAAM,SAAS,cAAc,CAAC,EAAG;AAC7D,MAAI,WAAW,SAAS,SAAS;AAC/B,YAAQ,OAAO,MAAM,cAAc,MAAM;AAAA,CAAY;AACrD,WAAO;AAAA,EACT;AAEA,MAAI,CAAE,MAAM,cAAc,MAAM,UAAU,MAAM,GAAI;AAClD,UAAM,YAAY,CAAC,SAAS,SAAS,GAAG,SAAS,cAAc,IAAI,CAAC,MAAoB,EAAE,OAAO,CAAC;AAClG,YAAQ,OAAO;AAAA,MACb,mBAAmB,MAAM,uBAAuB,MAAM,QAAQ;AAAA,aAAiB,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAErG;AACA,WAAO;AAAA,EACT;AAMA,QAAM,eACJ,WAAW,SAAS,UAChB;AAAA,IACE,SAAS,SAAS;AAAA,IAClB,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS;AAAA,IACtB,iBAAiB,SAAS;AAAA,EAC5B,IACA,SAAS,cAAc,KAAK,CAAC,MAAoB,EAAE,YAAY,MAAM,KAAK;AAChF,MACE,SAAS,mBACT,cAAc,mBACd,SAAS,oBAAoB,aAAa,iBAC1C;AACA,YAAQ,OAAO;AAAA,MACb,IAAI,SAAS,OAAO,gCAAgC,MAAM;AAAA;AAAA,iBAEtC,aAAa,UAAU,wBAAwB;AAAA;AAAA;AAAA;AAAA,IAGrE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,YAAY,MAAM,MAAM,iBAAiB,MAAM,EAAE;AACvE,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,MAAM;AACpC,YAAQ,OAAO,MAAM,8BAAyB,MAAM;AAAA,CAAI;AAGxD,UAAM,WAAyB;AAAA,MAC7B,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,aAAa,SAAS;AAAA,MACtB,iBAAiB,SAAS;AAAA,IAC5B;AACA,UAAM,kBAAkB,SAAS,cAAc,OAAO,CAAC,MAAoB,EAAE,YAAY,MAAM;AAC/F,UAAM,cAAc,MAAM,UAAU;AAAA,MAClC,GAAG;AAAA,MACH,SAAS;AAAA,MACT,QAAQ,cAAc,UAAU;AAAA,MAChC,iBAAiB,cAAc,mBAAmB;AAAA,MAClD,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,eAAe,CAAC,UAAU,GAAG,eAAe;AAAA,IAC9C,CAAC;AACD,YAAQ,OAAO,MAAM;AAAA,CAAsB;AAE3C,YAAQ,OAAO,MAAM;AAAA,qBAAwB,MAAM;AAAA,CAAI;AAEvD,SAAK;AACL,SAAK;AACL,WAAO;AAAA,EACT,UAAE;AACA,UAAM,QAAQ;AAAA,EAChB;AACF;;;ACtGA,eAAsB,SAA0B;AAC9C,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,WAAW,MAAM,aAAa,MAAM,QAAQ;AAClD,QAAM,UAAU,MAAM,YAAY,MAAM,OAAO;AAC/C,QAAM,OAAO,MAAM,YAAY,MAAM,IAAI;AAEzC,MAAI,CAAC,UAAU;AACb,YAAQ,OAAO;AAAA,MACb,yCAAyC,MAAM,QAAQ;AAAA;AAAA;AAAA,IAEzD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,oBAAoB,MAAM,IAAI;AAAA,IAC9B,oBAAoB,SAAS,WAAW,2BAAsB;AAAA,IAC9D,oBAAoB,SAAS,UAAU,WAAW;AAAA,IAClD,oBAAoB,SAAS,UAAU,WAAW;AAAA,IAClD,oBAAoB,SAAS,MAAM;AAAA,IACnC,oBAAoB,SAAS,WAAW;AAAA,IACxC,oBAAoB,WAAW,WAAW;AAAA,IAC1C,oBAAoB,SAAS,IAAI;AAAA,IACjC,oBAAoB,SAAS,cAAc,SAAS,IAAI,SAAS,cAAc,IAAI,CAAC,MAAoB,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,QAAQ;AAAA,EAC1I;AACA,MAAI,KAAK,MAAM;AACb,UAAM;AAAA,MACJ,gCAAgC,KAAK,QAAQ,GAAG,KAAK,KAAK,QAAQ,GAAG,IAAI,KAAK,QAAQ,kBAAa,EAAE;AAAA,IACvG;AAAA,EACF,OAAO;AACL,UAAM,KAAK,2BAA2B;AAAA,EACxC;AACA,UAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAG5C,MAAI,YAAY,QAAQ,SAAS,YAAY,MAAM,YAAY,SAAS,SAAS;AAC/E,YAAQ,OAAO;AAAA,MACb;AAAA,sCAAyC,OAAO,wBAAwB,SAAS,OAAO;AAAA;AAAA;AAAA,IAE1F;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACrCA,QAAQ,MAAM,EAAK;AAiBnB,SAAS,UAAU,MAA+B;AAChD,QAAM,UAAU,KAAK,CAAC,KAAK;AAC3B,QAAM,QAAQ,oBAAI,IAA8B;AAChD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,OAAW;AACrB,QAAI,EAAE,WAAW,IAAI,GAAG;AACtB,YAAM,QAAQ,EAAE,QAAQ,GAAG;AAC3B,UAAI,QAAQ,GAAG;AACb,cAAM,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA,MACjD,OAAO;AACL,cAAM,OAAO,KAAK,IAAI,CAAC;AACvB,YAAI,SAAS,UAAa,CAAC,KAAK,WAAW,IAAI,GAAG;AAChD,gBAAM,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI;AAC1B;AAAA,QACF,OAAO;AACL,gBAAM,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,aAAmB;AAC1B,UAAQ,OAAO;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBF;AACF;AAEA,eAAsB,KAAK,MAA0C;AACnE,QAAM,EAAE,SAAS,MAAM,IAAI,UAAU,IAAI;AAEzC,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO,MAAM,QAAQ;AAAA,UACnB,SAAS,OAAO,MAAM,IAAI,SAAS,MAAM,WAAY,MAAM,IAAI,SAAS,IAAe;AAAA,UACvF,OAAO,MAAM,IAAI,OAAO,MAAM;AAAA,UAC9B,QAAQ,MAAM,IAAI,SAAS,MAAM;AAAA,UACjC,MAAM,MAAM,IAAI,MAAM,MAAM,WAAW,WAAW,MAAM,IAAI,MAAM,MAAM,eAAe,eAAe;AAAA,QACxG,CAAC;AAAA,MACH,KAAK;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,MAC3D,KAAK;AACH,eAAO,MAAM,OAAO;AAAA,UAClB,QAAS,MAAM,IAAI,QAAQ,KAAgD;AAAA,UAC3E,WAAW,MAAM,IAAI,YAAY,MAAM;AAAA,UACvC,qBAAqB,MAAM,IAAI,uBAAuB,MAAM;AAAA,QAC9D,CAAC;AAAA,MACH,KAAK;AACH,eAAO,MAAM,SAAS;AAAA,UACpB,IAAI,OAAO,MAAM,IAAI,IAAI,MAAM,WAAY,MAAM,IAAI,IAAI,IAAe;AAAA,QAC1E,CAAC;AAAA,MACH,KAAK;AACH,eAAO,MAAM,OAAO,OAAO,MAAM,IAAI,QAAQ,MAAM,WAAY,MAAM,IAAI,QAAQ,IAAe,MAAS;AAAA,MAC3G,KAAK,WAAW;AACd,cAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,uBAAuB;AACxD,eAAO,MAAM,QAAQ,KAAK,CAAC,KAAK,EAAE;AAAA,MACpC;AAAA,MACA,KAAK;AAGH,eAAO,MAAM,OAAO,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,CAAC;AAAA,MAC3D,KAAK;AACH,eAAO,MAAM,QAAQ;AAAA,UACnB,gBAAgB,MAAM,IAAI,iBAAiB,MAAM;AAAA,UACjD,YAAY,MAAM,IAAI,aAAa,MAAM;AAAA,UACzC,eAAe,OAAO,MAAM,IAAI,gBAAgB,MAAM,WAAY,MAAM,IAAI,gBAAgB,IAAe;AAAA,UAC3G,gBAAgB,OAAO,MAAM,IAAI,kBAAkB,MAAM,WAAY,MAAM,IAAI,kBAAkB,IAAe;AAAA,UAChH,iBAAiB,OAAO,MAAM,IAAI,kBAAkB,MAAM,WAAY,MAAM,IAAI,kBAAkB,IAAe;AAAA,UACjH,cAAc,OAAO,MAAM,IAAI,eAAe,MAAM,WAAY,MAAM,IAAI,eAAe,IAAe;AAAA,UACxG,mBAAmB,OAAO,MAAM,IAAI,qBAAqB,MAAM,WAAY,MAAM,IAAI,qBAAqB,IAAe;AAAA,UACzH,OAAO,MAAM,IAAI,OAAO,MAAM;AAAA,QAChC,CAAC;AAAA,MACH,KAAK;AACH,eAAO,MAAM,OAAO;AAAA,MACtB,KAAK;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK,CAAC;AAAA,MAC3D,KAAK;AACH,eAAO,MAAM,KAAK,EAAE,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,CAAC;AAAA,MAC1D,KAAK,SAAS;AACZ,cAAM,EAAE,OAAO,SAAS,IAAI,MAAM,OAAO,qBAAqB;AAC9D,eAAO,MAAM,SAAS;AAAA,MACxB;AAAA,MACA,KAAK,UAAU;AACb,cAAM,EAAE,QAAQ,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACjE,eAAO,MAAM,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,MACtC;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,EAAE,KAAK,IAAI,MAAM,OAAO,oBAAoB;AAClD,eAAO,MAAM,KAAK;AAAA,MACpB;AAAA,MACA,KAAK,UAAU;AACb,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,2BAA2B;AAC/D,eAAO,MAAM,WAAW;AAAA,MAC1B;AAAA,MACA,KAAK,UAAU;AACb,cAAM,EAAE,OAAO,IAAI,MAAM,OAAO,sBAAsB;AACtD,eAAO,MAAM,OAAO;AAAA,MACtB;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,mBAAW;AACX,eAAO;AAAA,MACT;AACE,gBAAQ,OAAO,MAAM,uBAAuB,OAAO;AAAA;AAAA,CAAM;AACzD,mBAAW;AACX,eAAO;AAAA,IACX;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAQ,OAAO,MAAM,UAAU,GAAG;AAAA,CAAI;AACtC,WAAO;AAAA,EACT;AACF;AAIA,IAAM,cACJ,OAAO,QAAQ,KAAK,CAAC,MAAM,aAC1B,QAAQ,KAAK,CAAC,EAAE,SAAS,WAAW,KACnC,QAAQ,KAAK,CAAC,EAAE,SAAS,eAAe,KACxC,QAAQ,KAAK,CAAC,EAAE,SAAS,QAAQ,KACjC,QAAQ,KAAK,CAAC,EAAE,SAAS,WAAW;AAExC,IAAI,eAAe,QAAQ,IAAI,QAAQ,MAAM,QAAW;AACtD,OAAK,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,QAAQ,KAAK,IAAI,CAAC;AACpE;",
6
6
  "names": ["existsSync", "unlinkSync", "join", "join", "abtarsHome", "abtarsHome", "join", "existsSync", "unlinkSync", "existsSync", "readdirSync", "unlinkSync", "join", "dirname", "join", "confirm", "join", "writeManifest", "dirname", "existsSync", "update", "spawnSync", "spawn", "abtarsHome", "fileURLToPath"]
7
7
  }