abtars 0.1.0-alpha.21 → 0.1.0-alpha.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/_registry.generated-6GO2PAMD.js +36 -0
- package/bundle/_registry.generated-6GO2PAMD.js.map +7 -0
- package/bundle/abtars-browser.js +2 -2
- package/bundle/abtars-cli.js +4 -0
- package/bundle/abtars-cli.js.map +2 -2
- package/bundle/abtars.js +80 -71
- package/bundle/abtars.js.map +3 -3
- package/bundle/agent-api-rate-limit-C25WGSFF.js +39 -0
- package/bundle/agent-api-rate-limit-C25WGSFF.js.map +7 -0
- package/bundle/agent-registry-SYUFNSVB.js +19 -0
- package/bundle/agent-registry-SYUFNSVB.js.map +7 -0
- package/bundle/browser-5H2Q7GEC.js +19 -0
- package/bundle/browser-5H2Q7GEC.js.map +7 -0
- package/bundle/capability-ILW3D5HS.js +18 -0
- package/bundle/capability-ILW3D5HS.js.map +7 -0
- package/bundle/chunk-4KJ76TTE.js +73 -0
- package/bundle/chunk-4KJ76TTE.js.map +7 -0
- package/bundle/chunk-7STAQF5O.js +183 -0
- package/bundle/chunk-7STAQF5O.js.map +7 -0
- package/bundle/chunk-A5OJYQNU.js +645 -0
- package/bundle/chunk-A5OJYQNU.js.map +7 -0
- package/bundle/chunk-GBBTK6H2.js +94 -0
- package/bundle/chunk-GBBTK6H2.js.map +7 -0
- package/bundle/chunk-GZUQQWBZ.js +131 -0
- package/bundle/chunk-GZUQQWBZ.js.map +7 -0
- package/bundle/chunk-ITG6XGBS.js +414 -0
- package/bundle/chunk-ITG6XGBS.js.map +7 -0
- package/bundle/chunk-KFENC7BM.js +19 -0
- package/bundle/chunk-KFENC7BM.js.map +7 -0
- package/bundle/chunk-KSEIWT4T.js +759 -0
- package/bundle/chunk-KSEIWT4T.js.map +7 -0
- package/bundle/chunk-KWBGYWDO.js +216 -0
- package/bundle/chunk-KWBGYWDO.js.map +7 -0
- package/bundle/chunk-LKGDCU4A.js +3709 -0
- package/bundle/chunk-LKGDCU4A.js.map +7 -0
- package/bundle/chunk-OOKLEC6V.js +89 -0
- package/bundle/chunk-OOKLEC6V.js.map +7 -0
- package/bundle/chunk-OZ4IZFV4.js +126 -0
- package/bundle/chunk-OZ4IZFV4.js.map +7 -0
- package/bundle/chunk-PZE3J7ER.js +299 -0
- package/bundle/chunk-PZE3J7ER.js.map +7 -0
- package/bundle/chunk-Q62SXS73.js +224 -0
- package/bundle/chunk-Q62SXS73.js.map +7 -0
- package/bundle/chunk-RV54J75Q.js +15903 -0
- package/bundle/chunk-RV54J75Q.js.map +7 -0
- package/bundle/chunk-TOUZC6NR.js +215 -0
- package/bundle/chunk-TOUZC6NR.js.map +7 -0
- package/bundle/chunk-TYVI3ZWA.js +55 -0
- package/bundle/chunk-TYVI3ZWA.js.map +7 -0
- package/bundle/chunk-X5FBUA53.js +982 -0
- package/bundle/chunk-X5FBUA53.js.map +7 -0
- package/bundle/chunk-ZVDVNSXK.js +189 -0
- package/bundle/chunk-ZVDVNSXK.js.map +7 -0
- package/bundle/commands-WBJ6KTDC.js +33 -0
- package/bundle/commands-WBJ6KTDC.js.map +7 -0
- package/bundle/config-DQIGDX4W.js +20 -0
- package/bundle/config-DQIGDX4W.js.map +7 -0
- package/bundle/delegation-tools-6FICZQ5G.js +28 -0
- package/bundle/delegation-tools-6FICZQ5G.js.map +7 -0
- package/bundle/deps-HN6CEXA4.js +105 -0
- package/bundle/deps-HN6CEXA4.js.map +7 -0
- package/bundle/direct-api-transport-TRV45NO6.js +861 -0
- package/bundle/direct-api-transport-TRV45NO6.js.map +7 -0
- package/bundle/discord-adapter-C6XHJMMG.js +586 -0
- package/bundle/discord-adapter-C6XHJMMG.js.map +7 -0
- package/bundle/discord-adapter-Q3GANMYV.js +586 -0
- package/bundle/discord-adapter-Q3GANMYV.js.map +7 -0
- package/bundle/env-schema-XCPAJ6IZ.js +20 -0
- package/bundle/env-schema-XCPAJ6IZ.js.map +7 -0
- package/bundle/lazy-require-UFYFFX2R.js +18 -0
- package/bundle/lazy-require-UFYFFX2R.js.map +7 -0
- package/bundle/media-utils-MOE36VWY.js +4748 -0
- package/bundle/media-utils-MOE36VWY.js.map +7 -0
- package/bundle/message-pipeline-PND4JICD.js +35 -0
- package/bundle/message-pipeline-PND4JICD.js.map +7 -0
- package/bundle/meta.json +2354 -8668
- package/bundle/notification-U6F5ZBSG.js +14 -0
- package/bundle/notification-U6F5ZBSG.js.map +7 -0
- package/bundle/openrouter-credits-7XXO6QGQ.js +33 -0
- package/bundle/openrouter-credits-7XXO6QGQ.js.map +7 -0
- package/bundle/phase-transport-FEZ4SIJJ.js +23 -0
- package/bundle/phase-transport-FEZ4SIJJ.js.map +7 -0
- package/bundle/sleep-BPWX3FCN.js +20 -0
- package/bundle/sleep-BPWX3FCN.js.map +7 -0
- package/bundle/soul-bundle-BRIUDEQ2.js +15 -0
- package/bundle/soul-bundle-BRIUDEQ2.js.map +7 -0
- package/bundle/soul-loader-GBXJ7EBH.js +18 -0
- package/bundle/soul-loader-GBXJ7EBH.js.map +7 -0
- package/bundle/subagent-runtime-MDBO6LHS.js +13 -0
- package/bundle/subagent-runtime-MDBO6LHS.js.map +7 -0
- package/bundle/system-status-WAY63BYC.js +190 -0
- package/bundle/system-status-WAY63BYC.js.map +7 -0
- package/bundle/telegram-adapter-F2OS2FAM.js +1062 -0
- package/bundle/telegram-adapter-F2OS2FAM.js.map +7 -0
- package/bundle/telegram-adapter-FS6WU2HS.js +1062 -0
- package/bundle/telegram-adapter-FS6WU2HS.js.map +7 -0
- package/bundle/tool-registry-T7XLTI2Q.js +39 -0
- package/bundle/tool-registry-T7XLTI2Q.js.map +7 -0
- package/bundle/transport-config-G5NKQXPJ.js +58 -0
- package/bundle/transport-config-G5NKQXPJ.js.map +7 -0
- package/bundle/user-registry-NUVNEHJU.js +17 -0
- package/bundle/user-registry-NUVNEHJU.js.map +7 -0
- package/package.json +11 -12
package/bundle/abtars-cli.js.map
CHANGED
|
@@ -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/components/hints.ts", "../src/cli/commands/rollback.ts", "../src/cli/commands/status.ts", "../src/cli/commands/update.ts", "../src/cli/update-sources/local.ts", "../src/cli/update-sources/npm.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 const { existsSync } = await import('node:fs');\n const hasRelease = existsSync(join(paths.home, 'current'));\n if (!hasRelease) {\n process.stdout.write(`\\nNext: run 'abtars update' to stage the release, then start the bridge.\\n`);\n return 0;\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 * First-touch hint system \u2014 show a hint once, persist to manifest.\n * Output to stderr with \uD83D\uDCA1 prefix. Never corrupts manifest (atomic write).\n */\n\nimport { existsSync, readFileSync, writeFileSync, renameSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nfunction manifestPath(): string {\n const home = process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n return join(home, \"manifest.json\");\n}\n\nfunction readManifest(): Record<string, unknown> {\n const path = manifestPath();\n if (!existsSync(path)) return {};\n try { return JSON.parse(readFileSync(path, \"utf-8\")); }\n catch { return {}; }\n}\n\nfunction writeManifestAtomic(data: Record<string, unknown>): void {\n const path = manifestPath();\n const tmp = path + \".tmp\";\n writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\");\n renameSync(tmp, path);\n}\n\nexport function showHintOnce(id: string, text: string): void {\n const manifest = readManifest();\n const seen = (manifest[\"hintsSeen\"] as Record<string, string> | undefined) ?? {};\n if (seen[id]) return;\n\n process.stderr.write(`\\n\uD83D\uDCA1 ${text}\\n\\n`);\n\n seen[id] = new Date().toISOString();\n manifest[\"hintsSeen\"] = seen;\n writeManifestAtomic(manifest);\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 ` mode: ${manifest.installMode ?? 'supervised'}`,\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 const alive = (() => { try { process.kill(lock.content.pid, 0); return true; } catch { return false; } })();\n lines.push(\n ` bridge: ${alive ? '\u25CF running' : '\u2717 dead'} (pid ${lock.content.pid})${lock.stale ? ' \u2014 STALE' : ''}`,\n );\n } else {\n lines.push(` bridge: \u25CB stopped`);\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 update` \u2014 build current checkout, stage new release, flip symlink.\n *\n * Phase 1 implements --source local only. Other sources error with a\n * \"not yet supported\" stub (Phase 5 will add NpmSource).\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { hostname } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport { readFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { copyFile, mkdir, chmod, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { makeLocalBuildSource } from '../update-sources/local.js';\nimport { makeNpmSource } from '../update-sources/npm.js';\nimport type { SourceName } from '../update-sources/types.js';\nimport { acquireLock, activate, emptyManifest, hashFile, packagePaths, pruneReleases, readManifest, writeManifest, RETENTION, type PriorRelease } from '../deploy-lib-import.js';\nimport { showHintOnce } from '../../components/hints.js';\n\nfunction readJsonField(file: string, field: string): unknown {\n try { return JSON.parse(readFileSync(file, 'utf-8'))[field]; } catch { return undefined; }\n}\n\nexport interface UpdateOptions {\n readonly source: SourceName;\n readonly fromLocal: boolean;\n readonly allowAbmindMismatch: boolean;\n readonly repoRoot?: string;\n}\n\nexport async function update(opts: UpdateOptions): Promise<number> {\n if (opts.source !== 'local' && opts.source !== 'npm') {\n process.stderr.write(`--source ${opts.source} is not yet supported.\\nUse --source local (default) or --source npm.\\n`);\n return 2;\n }\n\n const paths = packagePaths('abtars');\n\n // Auto-migrate old flat layout (current/main.js without releases/) \u2192 create releases dir\n if (!existsSync(paths.releases) && existsSync(join(paths.home, 'current'))) {\n process.stdout.write('Migrating old layout \u2192 releases/...\\n');\n mkdirSync(paths.releases, { recursive: true });\n }\n const release = await acquireLock(paths.lock, `update --source ${opts.source}`);\n\n try {\n // Resolve source root: explicit > cwd (if git) > npm package (from argv[1])\n let repoRoot = opts.repoRoot ?? process.cwd();\n if (!opts.repoRoot && !existsSync(join(repoRoot, '.git'))) {\n // Not in a git checkout \u2014 try npm global package path\n const { realpathSync } = await import('node:fs');\n const scriptPath = realpathSync(process.argv[1] ?? '');\n const candidate = join(dirname(scriptPath), '..');\n if (existsSync(join(candidate, 'bundle'))) repoRoot = candidate;\n }\n const source = opts.source === 'npm'\n ? makeNpmSource('abtars')\n : makeLocalBuildSource({ repoRoot, allowStale: opts.fromLocal });\n if (opts.fromLocal) {\n showHintOnce(\"update-from-local\", \"Building from working copy (--from-local). To sync with remote first: git pull && abtars update\");\n }\n process.stdout.write(`Building from local checkout (${process.cwd()})...\\n`);\n const staged = await source.prepare({\n releasesDir: paths.releases,\n nodeModulesDir: paths.nodeModules,\n home: paths.home,\n allowStale: opts.fromLocal,\n });\n process.stdout.write(`\u2713 staged ${staged.version} at ${staged.stagedPath}\\n`);\n\n // Install external runtime deps at the release dir (#582)\n {\n const pkgPath = join(staged.stagedPath, \"package.json\");\n const { readFileSync, writeFileSync } = await import(\"node:fs\");\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const externals: Record<string, string> = { patchright: \"^1.59.4\", \"rettiwt-api\": \"^4.1.3\" };\n pkg.dependencies = { ...pkg.dependencies, ...externals };\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n const { execSync } = await import(\"node:child_process\");\n execSync(\"npm install --omit=dev --ignore-scripts 2>/dev/null\", { cwd: staged.stagedPath, timeout: 60_000 });\n process.stdout.write(`\u2713 external deps installed\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 external deps install failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Create stable entry point symlink (main.js \u2192 bundle or dist)\n {\n const { existsSync, unlinkSync, symlinkSync } = await import(\"node:fs\");\n const mainLink = join(staged.stagedPath, \"main.js\");\n try { unlinkSync(mainLink); } catch (err) { logAndSwallow(\"update\", \"op\", err); }\n const entry = existsSync(join(staged.stagedPath, \"bundle\", \"abtars.js\"))\n ? \"bundle/abtars.js\"\n : \"dist/main.js\";\n symlinkSync(entry, mainLink);\n }\n\n // Preserve abmind symlinks from old release (#722)\n const { existsSync: ex2, lstatSync, readlinkSync, symlinkSync: sl2, mkdirSync: mk2 } = await import(\"node:fs\");\n const oldNm = join(paths.home, \"current\", \"node_modules\");\n const preservedLinks: Array<{ name: string; target: string }> = [];\n if (ex2(oldNm)) {\n for (const name of [\"abmind\", \"better-sqlite3\"]) {\n const p = join(oldNm, name);\n try { if (ex2(p) && lstatSync(p).isSymbolicLink()) preservedLinks.push({ name, target: readlinkSync(p) }); } catch { /* skip */ }\n }\n }\n\n // Flip current \u2192 releases/<version>\n await activate(paths.current, staged.version);\n process.stdout.write(`\u2713 current -> releases/${staged.version}\\n`);\n\n // Recreate preserved symlinks in new release\n if (preservedLinks.length > 0) {\n const newNm = join(paths.home, \"current\", \"node_modules\");\n mk2(newNm, { recursive: true });\n for (const { name, target } of preservedLinks) {\n try { sl2(target, join(newNm, name)); } catch { /* best effort */ }\n }\n }\n\n // Update manifest\n const prior = await readManifest(paths.manifest);\n const now = new Date().toISOString();\n const newPriorReleases = prior?.version\n ? [\n {\n version: prior.version,\n commit: prior.commit,\n activatedAt: prior.activatedAt,\n packageLockHash: prior.packageLockHash,\n },\n ...(prior.priorReleases ?? []),\n ].slice(0, RETENTION - 1)\n : prior?.priorReleases ?? [];\n\n await writeManifest(paths.manifest, {\n ...(prior ?? emptyManifest('abtars', hostname())),\n version: staged.version,\n commit: staged.commit,\n branch: staged.branch,\n packageLockHash: staged.packageLockHash,\n activatedAt: now,\n source: 'local',\n priorReleases: newPriorReleases,\n });\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n // Prune old releases\n const pruned = await pruneReleases(\n paths.releases,\n [staged.version, ...newPriorReleases.map((r: PriorRelease) => r.version)],\n staged.version,\n RETENTION,\n );\n if (pruned.length > 0) {\n process.stdout.write(`\u2713 pruned ${pruned.length} old release${pruned.length === 1 ? '' : 's'}: ${pruned.join(', ')}\\n`);\n }\n\n process.stdout.write(`\\nUpdate complete: ${staged.version}\\n`);\n\n // Clear stale model demotions (#739)\n const transportJson = join(paths.home, \"config\", \"transport.json\");\n if (existsSync(transportJson)) {\n try {\n const tc = JSON.parse(readFileSync(transportJson, \"utf-8\"));\n let cleared = false;\n for (const agent of Object.values(tc.agents ?? {})) {\n if ((agent as any).demoted) { delete (agent as any).demoted; delete (agent as any).demotedReason; delete (agent as any).demotedModel; cleared = true; }\n for (const fb of (agent as any).fallbacks ?? []) {\n if (fb.demoted) { delete fb.demoted; delete fb.demotedReason; delete fb.demotedModel; cleared = true; }\n }\n }\n if (cleared) { const { writeFileSync: wfs } = await import(\"node:fs\"); wfs(transportJson, JSON.stringify(tc, null, 2) + \"\\n\"); }\n } catch { /* best effort */ }\n }\n\n // Refresh scripts from repo \u2014 manifest-driven\n const { loadManifest } = await import('../install-manifest.js');\n const sourceRoot = staged.stagedPath;\n const installManifest = loadManifest(sourceRoot);\n const repoScripts = join(sourceRoot, 'scripts');\n const destScripts = join(paths.home, 'scripts');\n await mkdir(destScripts, { recursive: true });\n const allScriptFiles = await readdir(repoScripts).catch(() => [] as string[]);\n // Filter by manifest include patterns\n const matchesInclude = (name: string): boolean =>\n installManifest.scripts.include.some(pattern => {\n const ext = pattern.replace(\"*\", \"\");\n return name.endsWith(ext);\n });\n const scriptFiles = allScriptFiles.filter(matchesInclude);\n const home = process.env['HOME'] ?? '';\n let serviceChanged = false;\n\n // Resolve install mode \u2014 skip supervisor artifacts in simple mode\n const installMode = (await readManifest(paths.manifest))?.installMode ?? \"supervised\";\n\n const isExecutable = (name: string): boolean => {\n const ext = installManifest.scripts.executable.replace(\"*\", \"\");\n return name.endsWith(ext);\n };\n\n for (const name of scriptFiles) {\n await copyFile(join(repoScripts, name), join(destScripts, name));\n if (isExecutable(name)) await chmod(join(destScripts, name), 0o755);\n // Root-level copies for launcher scripts watchdog/launchd reference directly\n if (isExecutable(name)) {\n await copyFile(join(repoScripts, name), join(paths.home, name));\n await chmod(join(paths.home, name), 0o755);\n }\n // macOS: template + install LaunchAgent plist (supervised only)\n const macService = installManifest.services.supervised.macos;\n if (macService && name === macService.plist && process.platform === 'darwin' && home && installMode === 'supervised') {\n const launchAgentsDir = join(home, 'Library', 'LaunchAgents');\n await mkdir(launchAgentsDir, { recursive: true });\n const dst = join(launchAgentsDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n let templated = await readFile(join(repoScripts, name), 'utf-8');\n for (const ph of macService.placeholders) templated = templated.replaceAll(ph, home);\n await writeFile(dst, templated);\n if (oldContent !== templated) serviceChanged = true;\n }\n // Linux: install systemd user service (supervised only)\n const linuxService = installManifest.services.supervised.linux;\n if (linuxService?.units.includes(name) && process.platform === 'linux' && home && installMode === 'supervised') {\n const systemdDir = join(home, '.config', 'systemd', 'user');\n await mkdir(systemdDir, { recursive: true });\n const dst = join(systemdDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n await copyFile(join(repoScripts, name), dst);\n const newContent = await readFile(dst, 'utf-8').catch(() => '');\n if (oldContent !== newContent) serviceChanged = true;\n }\n }\n process.stdout.write(`\u2713 scripts refreshed (${scriptFiles.length} files)\\n`);\n\n // Regenerate CLI bin wrappers (#310) \u2014 keeps wrapper paths in sync with build layout\n const { writeWrapper } = await import('./install.js');\n await mkdir(paths.bin, { recursive: true });\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.current, false);\n }\n process.stdout.write(`\u2713 wrappers refreshed (${installManifest.cliWrappers.length} files)\\n`);\n\n // Sync core skills from release to runtime (#438)\n const { rmSync, cpSync, readdirSync } = await import(\"node:fs\");\n const skillsCoreSrc = join(staged.stagedPath, \"core\", \"skills\");\n const skillsCoreDst = join(paths.home, \"skills\", \"core\");\n if (existsSync(skillsCoreSrc)) {\n rmSync(skillsCoreDst, { recursive: true, force: true });\n cpSync(skillsCoreSrc, skillsCoreDst, { recursive: true });\n const files = readdirSync(skillsCoreDst, { recursive: true }) as string[];\n const count = files.filter(f => f.endsWith(\"SKILL.md\")).length;\n process.stdout.write(`\u2713 skills/core synced (${count} skills)\\n`);\n }\n // Ensure other skill dirs exist\n for (const d of [\"custom\", \"downloaded\", \"self\"]) {\n await mkdir(join(paths.home, \"skills\", d), { recursive: true });\n }\n // Migration (#614): remove stale pre-#438 top-level skill dirs (duplicates of core/)\n for (const stale of [\"memory\", \"ops\", \"tools\", \"coding\"]) {\n const p = join(paths.home, \"skills\", stale);\n if (existsSync(p)) { rmSync(p, { recursive: true, force: true }); }\n }\n\n // Seed missing config files from release defaults (#738)\n const releaseConfig = join(staged.stagedPath, \"config\");\n const destConfig = join(paths.home, \"config\");\n if (existsSync(releaseConfig)) {\n for (const f of readdirSync(releaseConfig)) {\n const src = join(releaseConfig, f);\n if (f.endsWith('.example')) {\n // Always overwrite .example files (user reference for latest schema)\n cpSync(src, join(destConfig, f));\n // Seed the real file if missing\n const target = join(destConfig, f.replace('.example', ''));\n if (!existsSync(target)) cpSync(src, target);\n }\n }\n // Also copy transport.default.json (fallback for transport-config)\n const defaultTransport = join(releaseConfig, 'transport.default.json');\n if (existsSync(defaultTransport)) cpSync(defaultTransport, join(destConfig, 'transport.default.json'));\n }\n\n // Sync core/ to ~/.abtars/core/ (for skill-reloader etc.)\n const coreSrc = join(staged.stagedPath, \"core\");\n const coreDst = join(paths.home, \"core\");\n if (existsSync(coreSrc)) {\n await mkdir(coreDst, { recursive: true });\n cpSync(coreSrc, coreDst, { recursive: true });\n }\n\n if (serviceChanged) {\n if (process.platform === 'darwin') {\n process.stdout.write(`\u26A0\uFE0F LaunchAgent plist updated \u2014 reload with: launchctl bootout gui/$(id -u)/com.abtars.watchdog && launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist\\n`);\n } else {\n process.stdout.write(`\u26A0\uFE0F systemd service updated \u2014 reload with: systemctl --user daemon-reload && systemctl --user restart abtars-watchdog\\n`);\n }\n }\n\n\n // hashFile is unused here but imported to validate the re-export surface;\n // leaving this no-op call removed \u2014 the re-export is exercised by tests.\n void hashFile;\n\n // #426 \u2014 Seed missing config + run config migrations\n const { ensureInstallInvariants } = await import(\"../ensure-invariants.js\");\n const invariantResults = await ensureInstallInvariants(process.cwd(), paths.home);\n if (invariantResults.length > 0) {\n process.stdout.write(`\u2713 invariants: ${invariantResults.join(\", \")}\\n`);\n }\n\n // Native deps (sqlite-vec, better-sqlite3) handled by `abmind install` (#716)\n\n // Run doctor before restart\n const doctorPath = join(paths.home, \"scripts\", \"doctor.sh\");\n if (existsSync(doctorPath)) {\n process.stdout.write(\"\\n\uD83E\uDE7A Health check...\\n\");\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(`bash \"${doctorPath}\" --fix`, { stdio: \"inherit\", timeout: 30_000 });\n } catch (err) {\n process.stderr.write(`\u26A0\uFE0F doctor --fix failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Auto-restart bridge on new code\n const manifestForRestart = await readManifest(paths.manifest);\n const restartMode = manifestForRestart?.installMode;\n if (!restartMode) {\n process.stderr.write(\"\u274C installMode not set in manifest.json. Run 'abtars install' first.\\n\");\n return 1;\n }\n\n if (restartMode === \"supervised-daemon\" || restartMode === \"supervised\") {\n // Send USR1 to watchdog for graceful restart (#688)\n process.stdout.write(\"\\nRestarting bridge via watchdog...\\n\");\n const wdLock = join(paths.home, \"watchdog.lock\");\n const wdPid = readJsonField(wdLock, \"pid\") as number | undefined;\n if (wdPid && wdPid > 0) {\n try {\n process.kill(wdPid, \"SIGUSR1\");\n process.stdout.write(`\u267B\uFE0F USR1 sent to watchdog (PID ${wdPid}) \u2014 bridge will restart\\n`);\n } catch {\n process.stdout.write(`\u26A0\uFE0F Could not signal watchdog (PID ${wdPid}). Restart manually:\\n`);\n if (process.platform === \"darwin\") {\n process.stdout.write(` launchctl kickstart -k gui/$(id -u)/com.abtars.watchdog\\n`);\n } else {\n process.stdout.write(` systemctl --user restart abtars-watchdog\\n`);\n }\n }\n } else {\n // No watchdog running \u2014 fall back to cold restart\n process.stdout.write(`\u26A0\uFE0F Watchdog not running. Cold restart...\\n`);\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n } else {\n // simple mode: no watchdog, cold restart\n process.stdout.write(\"\\nRestarting bridge...\\n\");\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n\n const { printHealthSummary } = await import('./health-check.js');\n printHealthSummary(paths.home);\n\n return 0;\n } finally {\n await release();\n }\n}\n", "/**\n * LocalBuildSource: the Phase 1 adapter. Builds the current working-tree\n * checkout and stages the output into releases/<version>/dist/.\n *\n * Staleness guard: runs `git fetch` and refuses to proceed if HEAD is behind\n * origin/<branch>, unless allowStale (--from-local) is passed. Handles the\n * detached-HEAD / no-upstream / unpushed edge cases with a friendly message.\n *\n * Version string: `<package-version>-<short-sha>`, e.g. `0.1.0-28f71ef`.\n * Uniqueness: if the same version is staged twice, the second stage\n * overwrites (rsync --delete semantics via rm + cp). Rare; only happens when\n * operator runs update twice without changing a commit or bumping version.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { copyFile, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { hashFile } from '../deploy-lib-import.js';\nimport type { PrepareContext, StagedRelease, UpdateSource } from './types.js';\n\nexport class LocalBuildError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(hint ? `${message}\\n\\n${hint}` : message);\n this.name = 'LocalBuildError';\n }\n}\n\nexport interface LocalBuildOptions {\n /** Repository root for the build (defaults to process.cwd()). */\n readonly repoRoot?: string;\n /** If true, skip the behind-origin guard. Operator opt-in. */\n readonly allowStale?: boolean;\n /** If true, skip `npm install` (assume node_modules is already current). */\n readonly skipInstall?: boolean;\n}\n\nfunction runCmd(cmd: string, args: readonly string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.error) throw new LocalBuildError(`${cmd} ${args.join(' ')} failed: ${r.error.message}`);\n if (r.status !== 0) {\n throw new LocalBuildError(\n `${cmd} ${args.join(' ')} exited with status ${r.status}`,\n r.stderr?.trim() || undefined,\n );\n }\n return r.stdout.trim();\n}\n\nfunction tryCmd(cmd: string, args: readonly string[], cwd: string): string | null {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.status !== 0) return null;\n return r.stdout.trim();\n}\n\nfunction checkStaleness(repoRoot: string, allowStale: boolean): { commit: string; branch: string | null } {\n const commit = runCmd('git', ['rev-parse', '--short', 'HEAD'], repoRoot);\n const branch = tryCmd('git', ['rev-parse', '--abbrev-ref', 'HEAD'], repoRoot);\n if (allowStale) return { commit, branch: branch === 'HEAD' ? null : branch };\n\n // Detached HEAD / no-branch case\n if (branch === 'HEAD' || branch === null) {\n throw new LocalBuildError(\n 'Working tree is in detached HEAD (no current branch).',\n 'Cannot check for staleness. Pass --from-local to proceed with the current tree.',\n );\n }\n\n // Fetch to refresh origin refs. Not --unshallow; caller may have a shallow clone intentionally.\n runCmd('git', ['fetch', '--quiet'], repoRoot);\n\n // Does the branch have an upstream?\n const upstream = tryCmd('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], repoRoot);\n if (upstream === null) {\n throw new LocalBuildError(\n `Branch '${branch}' has no upstream configured.`,\n 'Cannot check for staleness. Push the branch, or pass --from-local to proceed with the current tree.',\n );\n }\n\n // How many commits is HEAD behind upstream?\n const behindStr = tryCmd('git', ['rev-list', '--count', `HEAD..${upstream}`], repoRoot);\n const behind = behindStr === null ? null : Number(behindStr);\n if (behind === null || !Number.isFinite(behind)) {\n throw new LocalBuildError(\n `Could not determine how far HEAD is behind ${upstream}.`,\n 'Pass --from-local to proceed anyway.',\n );\n }\n if (behind > 0) {\n throw new LocalBuildError(\n `Current branch: ${branch} (${commit})\\n${upstream} is ahead by ${behind} commit${behind === 1 ? '' : 's'}.`,\n `Run 'git pull' first, or pass --from-local to build from the current tree.`,\n );\n }\n\n return { commit, branch };\n}\n\nasync function readPackageVersion(repoRoot: string): Promise<string> {\n const pkg = JSON.parse(await readFile(join(repoRoot, 'package.json'), 'utf-8')) as { version?: string };\n if (typeof pkg.version !== 'string') {\n throw new LocalBuildError('package.json has no version field.');\n }\n return pkg.version;\n}\n\nexport function makeLocalBuildSource(opts: LocalBuildOptions = {}): UpdateSource {\n const repoRoot = opts.repoRoot ?? process.cwd();\n const isNpmPackage = !existsSync(join(repoRoot, '.git'));\n\n return {\n name: 'local',\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n // npm package mode: no git, no build \u2014 just copy the pre-built bundle\n if (isNpmPackage) {\n const bundleDir = join(repoRoot, 'bundle');\n if (!existsSync(bundleDir)) {\n throw new Error(`No bundle/ found at ${repoRoot}. Run from the abtars npm package or a git checkout.`);\n }\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = pkgVersion;\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(bundleDir, join(stagedPath, 'bundle'), { recursive: true });\n const coreDir = join(repoRoot, 'core');\n if (existsSync(coreDir)) await cp(coreDir, join(stagedPath, 'core'), { recursive: true });\n const scriptsSrc = join(repoRoot, 'scripts');\n if (existsSync(scriptsSrc)) await cp(scriptsSrc, join(stagedPath, 'scripts'), { recursive: true });\n const configSrc = join(repoRoot, 'config');\n if (existsSync(configSrc)) await cp(configSrc, join(stagedPath, 'config'), { recursive: true });\n const manifestSrc = join(repoRoot, 'install-manifest.json');\n if (existsSync(manifestSrc)) await copyFile(manifestSrc, join(stagedPath, 'install-manifest.json'));\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n process.stdout.write(`\u2713 staged ${version} (from npm package)\\n`);\n return { version, stagedPath, commit: null, branch: null, packageLockHash: null, source: 'local' };\n }\n\n // Git checkout mode: build from source\n const { commit, branch } = checkStaleness(repoRoot, opts.allowStale === true || ctx.allowStale);\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = `${pkgVersion}-${commit}`;\n\n // Install deps into the shared node_modules/ (if not skipped).\n if (opts.skipInstall !== true) {\n runCmd('npm', ['install', '--no-audit', '--no-fund'], repoRoot);\n }\n\n // Build: bundle mode (esbuild) or legacy mode (tsc)\n const useBundle = process.env['AGENTBRIDGE_BUILD_MODE'] !== 'tsc';\n\n if (useBundle) {\n // Bundle mode: esbuild \u2192 bundle/ + pruned native deps\n runCmd('npm', ['run', 'bundle'], repoRoot);\n\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'bundle'), join(stagedPath, 'bundle'), { recursive: true });\n\n // Copy core skills for runtime sync (#438)\n const coreSkillsSrc = join(repoRoot, 'core', 'skills');\n if (existsSync(coreSkillsSrc)) {\n await cp(coreSkillsSrc, join(stagedPath, 'core', 'skills'), { recursive: true });\n }\n\n // Ensure ESM works without warnings (MODULE_TYPELESS_PACKAGE_JSON)\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Native addons (better-sqlite3, sqlite-vec) live at ~/.abmind/lib/node_modules/\n // and are loaded via native-loader.ts from there. No need to copy into release.\n // See #431 (persistent install) + native-loader.ts.\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n }\n\n // Legacy tsc mode (AGENTBRIDGE_BUILD_MODE=tsc)\n runCmd('npm', ['run', 'build'], repoRoot);\n\n // Stage releases/<version>/dist/\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'dist'), join(stagedPath, 'dist'), { recursive: true });\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Sync node_modules/ to the shared location.\n //\n // Use `rsync -aL` to DEREFERENCE symlinks \u2014 critical because\n // package.json `\"abmind\": \"file:../abmind\"` creates a symlink at\n // node_modules/abmind pointing into the dev workspace. Plain cp\n // preserves the symlink, so the runtime ends up with abmind code\n // served from the developer's working tree (active live edits +\n // test-suite contention on memory.db). We want a materialized copy.\n //\n // Delete destination first so rsync's --delete is unnecessary (and\n // safer \u2014 we don't want to rsync-delete anything outside).\n await rm(ctx.nodeModulesDir, { recursive: true, force: true });\n await mkdir(ctx.nodeModulesDir, { recursive: true });\n const rsyncResult = spawnSync(\n 'rsync',\n ['-aL', '--quiet', `${join(repoRoot, 'node_modules')}/`, `${ctx.nodeModulesDir}/`],\n { stdio: 'inherit' },\n );\n if (rsyncResult.status !== 0) {\n throw new LocalBuildError(\n `rsync of node_modules failed (status ${rsyncResult.status ?? -1})`,\n `Ensure rsync is installed. Falling back to node cp would re-create symlinks.`,\n );\n }\n\n // Note: abmind's nested node_modules/ (rsync'd from its dev workspace)\n // stays in place. Previously deleted to avoid duplicate better-sqlite3\n // native-addon conflict (#230-related), but since f24b33f removed\n // better-sqlite3 from abtars's deps, abmind's nested copy is the\n // only one and must remain \u2014 deleting it breaks module resolution for\n // abmind at runtime ('Cannot find package better-sqlite3').\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n },\n };\n}\n", "/**\n * NpmSource: fetch latest published version from npm registry (#462).\n * Downloads tarball, extracts, installs prod deps, stages.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PrepareContext, StagedRelease, UpdateSource } from \"./types.js\";\n\nconst TIMEOUT_MS = 60_000;\n\nfunction run(cmd: string, args: string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: \"utf-8\", timeout: TIMEOUT_MS });\n if (r.error) throw new Error(`${cmd} ${args.join(\" \")}: ${r.error.message}`);\n if (r.status !== 0) throw new Error(`${cmd} ${args.join(\" \")} exited ${r.status}: ${r.stderr?.trim()}`);\n return r.stdout.trim();\n}\n\nfunction readLocalVersion(home: string): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(home, \"current\", \"package.json\"), \"utf-8\"));\n return pkg.version ?? null;\n } catch { return null; }\n}\n\nexport function makeNpmSource(packageName: string): UpdateSource {\n return {\n name: \"npm\",\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n const latest = run(\"npm\", [\"view\", packageName, \"version\"], ctx.home);\n const current = readLocalVersion(ctx.home);\n if (latest === current) {\n throw new Error(`Already at latest version (${latest}). Nothing to update.`);\n }\n\n const stagedPath = join(ctx.releasesDir, latest);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n\n // Download tarball\n run(\"npm\", [\"pack\", `${packageName}@${latest}`, \"--pack-destination\", stagedPath], stagedPath);\n const tgzName = `${packageName}-${latest}.tgz`.replace(\"@\", \"\").replace(\"/\", \"-\");\n const tgzPath = join(stagedPath, tgzName);\n\n // Extract (strip package/ prefix)\n run(\"tar\", [\"-xzf\", tgzPath, \"--strip-components=1\"], stagedPath);\n\n // Cleanup tarball\n if (existsSync(tgzPath)) unlinkSync(tgzPath);\n\n // Install production deps\n run(\"npm\", [\"install\", \"--omit=dev\", \"--no-audit\", \"--no-fund\"], stagedPath);\n\n return { version: latest, stagedPath, commit: null, branch: null, packageLockHash: null, source: \"npm\" };\n },\n };\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": "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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 const { existsSync } = await import('node:fs');\n const hasRelease = existsSync(join(paths.home, 'current'));\n if (!hasRelease) {\n process.stdout.write(`\\nNext: run 'abtars update' to stage the release, then start the bridge.\\n`);\n return 0;\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 * First-touch hint system \u2014 show a hint once, persist to manifest.\n * Output to stderr with \uD83D\uDCA1 prefix. Never corrupts manifest (atomic write).\n */\n\nimport { existsSync, readFileSync, writeFileSync, renameSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nfunction manifestPath(): string {\n const home = process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n return join(home, \"manifest.json\");\n}\n\nfunction readManifest(): Record<string, unknown> {\n const path = manifestPath();\n if (!existsSync(path)) return {};\n try { return JSON.parse(readFileSync(path, \"utf-8\")); }\n catch { return {}; }\n}\n\nfunction writeManifestAtomic(data: Record<string, unknown>): void {\n const path = manifestPath();\n const tmp = path + \".tmp\";\n writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\");\n renameSync(tmp, path);\n}\n\nexport function showHintOnce(id: string, text: string): void {\n const manifest = readManifest();\n const seen = (manifest[\"hintsSeen\"] as Record<string, string> | undefined) ?? {};\n if (seen[id]) return;\n\n process.stderr.write(`\\n\uD83D\uDCA1 ${text}\\n\\n`);\n\n seen[id] = new Date().toISOString();\n manifest[\"hintsSeen\"] = seen;\n writeManifestAtomic(manifest);\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 ` mode: ${manifest.installMode ?? 'supervised'}`,\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 const alive = (() => { try { process.kill(lock.content.pid, 0); return true; } catch { return false; } })();\n lines.push(\n ` bridge: ${alive ? '\u25CF running' : '\u2717 dead'} (pid ${lock.content.pid})${lock.stale ? ' \u2014 STALE' : ''}`,\n );\n } else {\n lines.push(` bridge: \u25CB stopped`);\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 update` \u2014 build current checkout, stage new release, flip symlink.\n *\n * Phase 1 implements --source local only. Other sources error with a\n * \"not yet supported\" stub (Phase 5 will add NpmSource).\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { hostname } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport { readFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { copyFile, mkdir, chmod, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { makeLocalBuildSource } from '../update-sources/local.js';\nimport { makeNpmSource } from '../update-sources/npm.js';\nimport type { SourceName } from '../update-sources/types.js';\nimport { acquireLock, activate, emptyManifest, hashFile, packagePaths, pruneReleases, readManifest, writeManifest, RETENTION, type PriorRelease } from '../deploy-lib-import.js';\nimport { showHintOnce } from '../../components/hints.js';\n\nfunction readJsonField(file: string, field: string): unknown {\n try { return JSON.parse(readFileSync(file, 'utf-8'))[field]; } catch { return undefined; }\n}\n\nexport interface UpdateOptions {\n readonly source: SourceName;\n readonly fromLocal: boolean;\n readonly allowAbmindMismatch: boolean;\n readonly repoRoot?: string;\n}\n\nexport async function update(opts: UpdateOptions): Promise<number> {\n if (opts.source !== 'local' && opts.source !== 'npm') {\n process.stderr.write(`--source ${opts.source} is not yet supported.\\nUse --source local (default) or --source npm.\\n`);\n return 2;\n }\n\n const paths = packagePaths('abtars');\n\n // Auto-migrate old flat layout (current/main.js without releases/) \u2192 create releases dir\n if (!existsSync(paths.releases) && existsSync(join(paths.home, 'current'))) {\n process.stdout.write('Migrating old layout \u2192 releases/...\\n');\n mkdirSync(paths.releases, { recursive: true });\n }\n const release = await acquireLock(paths.lock, `update --source ${opts.source}`);\n\n try {\n // Resolve source root: explicit > cwd (if git) > npm package (from argv[1])\n let repoRoot = opts.repoRoot ?? process.cwd();\n if (!opts.repoRoot && !existsSync(join(repoRoot, '.git'))) {\n // Not in a git checkout \u2014 try npm global package path\n const { realpathSync } = await import('node:fs');\n const scriptPath = realpathSync(process.argv[1] ?? '');\n const candidate = join(dirname(scriptPath), '..');\n if (existsSync(join(candidate, 'bundle'))) repoRoot = candidate;\n }\n const source = opts.source === 'npm'\n ? makeNpmSource('abtars')\n : makeLocalBuildSource({ repoRoot, allowStale: opts.fromLocal });\n if (opts.fromLocal) {\n showHintOnce(\"update-from-local\", \"Building from working copy (--from-local). To sync with remote first: git pull && abtars update\");\n }\n process.stdout.write(`Building from local checkout (${process.cwd()})...\\n`);\n const staged = await source.prepare({\n releasesDir: paths.releases,\n nodeModulesDir: paths.nodeModules,\n home: paths.home,\n allowStale: opts.fromLocal,\n });\n process.stdout.write(`\u2713 staged ${staged.version} at ${staged.stagedPath}\\n`);\n\n // Install external runtime deps at the release dir (#582)\n {\n const pkgPath = join(staged.stagedPath, \"package.json\");\n const { readFileSync, writeFileSync } = await import(\"node:fs\");\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const externals: Record<string, string> = { patchright: \"^1.59.4\", \"rettiwt-api\": \"^4.1.3\" };\n pkg.dependencies = { ...pkg.dependencies, ...externals };\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n const { execSync } = await import(\"node:child_process\");\n execSync(\"npm install --omit=dev --ignore-scripts 2>/dev/null\", { cwd: staged.stagedPath, timeout: 60_000 });\n process.stdout.write(`\u2713 external deps installed\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 external deps install failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Create stable entry point symlink (main.js \u2192 bundle or dist)\n {\n const { existsSync, unlinkSync, symlinkSync } = await import(\"node:fs\");\n const mainLink = join(staged.stagedPath, \"main.js\");\n try { unlinkSync(mainLink); } catch (err) { logAndSwallow(\"update\", \"op\", err); }\n const entry = existsSync(join(staged.stagedPath, \"bundle\", \"abtars.js\"))\n ? \"bundle/abtars.js\"\n : \"dist/main.js\";\n symlinkSync(entry, mainLink);\n }\n\n // Preserve abmind symlinks from old release (#722)\n const { existsSync: ex2, lstatSync, readlinkSync, symlinkSync: sl2, mkdirSync: mk2 } = await import(\"node:fs\");\n const oldNm = join(paths.home, \"current\", \"node_modules\");\n const preservedLinks: Array<{ name: string; target: string }> = [];\n if (ex2(oldNm)) {\n for (const name of [\"abmind\", \"better-sqlite3\"]) {\n const p = join(oldNm, name);\n try { if (ex2(p) && lstatSync(p).isSymbolicLink()) preservedLinks.push({ name, target: readlinkSync(p) }); } catch { /* skip */ }\n }\n }\n\n // Flip current \u2192 releases/<version>\n await activate(paths.current, staged.version);\n process.stdout.write(`\u2713 current -> releases/${staged.version}\\n`);\n\n // Recreate preserved symlinks in new release\n if (preservedLinks.length > 0) {\n const newNm = join(paths.home, \"current\", \"node_modules\");\n mk2(newNm, { recursive: true });\n for (const { name, target } of preservedLinks) {\n try { sl2(target, join(newNm, name)); } catch { /* best effort */ }\n }\n }\n\n // Update manifest\n const prior = await readManifest(paths.manifest);\n const now = new Date().toISOString();\n const newPriorReleases = prior?.version\n ? [\n {\n version: prior.version,\n commit: prior.commit,\n activatedAt: prior.activatedAt,\n packageLockHash: prior.packageLockHash,\n },\n ...(prior.priorReleases ?? []),\n ].slice(0, RETENTION - 1)\n : prior?.priorReleases ?? [];\n\n await writeManifest(paths.manifest, {\n ...(prior ?? emptyManifest('abtars', hostname())),\n version: staged.version,\n commit: staged.commit,\n branch: staged.branch,\n packageLockHash: staged.packageLockHash,\n activatedAt: now,\n source: 'local',\n priorReleases: newPriorReleases,\n });\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n // Prune old releases\n const pruned = await pruneReleases(\n paths.releases,\n [staged.version, ...newPriorReleases.map((r: PriorRelease) => r.version)],\n staged.version,\n RETENTION,\n );\n if (pruned.length > 0) {\n process.stdout.write(`\u2713 pruned ${pruned.length} old release${pruned.length === 1 ? '' : 's'}: ${pruned.join(', ')}\\n`);\n }\n\n process.stdout.write(`\\nUpdate complete: ${staged.version}\\n`);\n\n // Clear stale model demotions (#739)\n const transportJson = join(paths.home, \"config\", \"transport.json\");\n if (existsSync(transportJson)) {\n try {\n const tc = JSON.parse(readFileSync(transportJson, \"utf-8\"));\n let cleared = false;\n for (const agent of Object.values(tc.agents ?? {})) {\n if ((agent as any).demoted) { delete (agent as any).demoted; delete (agent as any).demotedReason; delete (agent as any).demotedModel; cleared = true; }\n for (const fb of (agent as any).fallbacks ?? []) {\n if (fb.demoted) { delete fb.demoted; delete fb.demotedReason; delete fb.demotedModel; cleared = true; }\n }\n }\n if (cleared) { const { writeFileSync: wfs } = await import(\"node:fs\"); wfs(transportJson, JSON.stringify(tc, null, 2) + \"\\n\"); }\n } catch { /* best effort */ }\n }\n\n // Refresh scripts from repo \u2014 manifest-driven\n const { loadManifest } = await import('../install-manifest.js');\n const sourceRoot = staged.stagedPath;\n const installManifest = loadManifest(sourceRoot);\n const repoScripts = join(sourceRoot, 'scripts');\n const destScripts = join(paths.home, 'scripts');\n await mkdir(destScripts, { recursive: true });\n const allScriptFiles = await readdir(repoScripts).catch(() => [] as string[]);\n // Filter by manifest include patterns\n const matchesInclude = (name: string): boolean =>\n installManifest.scripts.include.some(pattern => {\n const ext = pattern.replace(\"*\", \"\");\n return name.endsWith(ext);\n });\n const scriptFiles = allScriptFiles.filter(matchesInclude);\n const home = process.env['HOME'] ?? '';\n let serviceChanged = false;\n\n // Resolve install mode \u2014 skip supervisor artifacts in simple mode\n const installMode = (await readManifest(paths.manifest))?.installMode ?? \"supervised\";\n\n const isExecutable = (name: string): boolean => {\n const ext = installManifest.scripts.executable.replace(\"*\", \"\");\n return name.endsWith(ext);\n };\n\n for (const name of scriptFiles) {\n await copyFile(join(repoScripts, name), join(destScripts, name));\n if (isExecutable(name)) await chmod(join(destScripts, name), 0o755);\n // Root-level copies for launcher scripts watchdog/launchd reference directly\n if (isExecutable(name)) {\n await copyFile(join(repoScripts, name), join(paths.home, name));\n await chmod(join(paths.home, name), 0o755);\n }\n // macOS: template + install LaunchAgent plist (supervised only)\n const macService = installManifest.services.supervised.macos;\n if (macService && name === macService.plist && process.platform === 'darwin' && home && installMode === 'supervised') {\n const launchAgentsDir = join(home, 'Library', 'LaunchAgents');\n await mkdir(launchAgentsDir, { recursive: true });\n const dst = join(launchAgentsDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n let templated = await readFile(join(repoScripts, name), 'utf-8');\n for (const ph of macService.placeholders) templated = templated.replaceAll(ph, home);\n await writeFile(dst, templated);\n if (oldContent !== templated) serviceChanged = true;\n }\n // Linux: install systemd user service (supervised only)\n const linuxService = installManifest.services.supervised.linux;\n if (linuxService?.units.includes(name) && process.platform === 'linux' && home && installMode === 'supervised') {\n const systemdDir = join(home, '.config', 'systemd', 'user');\n await mkdir(systemdDir, { recursive: true });\n const dst = join(systemdDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n await copyFile(join(repoScripts, name), dst);\n const newContent = await readFile(dst, 'utf-8').catch(() => '');\n if (oldContent !== newContent) serviceChanged = true;\n }\n }\n process.stdout.write(`\u2713 scripts refreshed (${scriptFiles.length} files)\\n`);\n\n // Regenerate CLI bin wrappers (#310) \u2014 keeps wrapper paths in sync with build layout\n const { writeWrapper } = await import('./install.js');\n await mkdir(paths.bin, { recursive: true });\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.current, false);\n }\n process.stdout.write(`\u2713 wrappers refreshed (${installManifest.cliWrappers.length} files)\\n`);\n\n // Sync core skills from release to runtime (#438)\n const { rmSync, cpSync, readdirSync } = await import(\"node:fs\");\n const skillsCoreSrc = join(staged.stagedPath, \"core\", \"skills\");\n const skillsCoreDst = join(paths.home, \"skills\", \"core\");\n if (existsSync(skillsCoreSrc)) {\n rmSync(skillsCoreDst, { recursive: true, force: true });\n cpSync(skillsCoreSrc, skillsCoreDst, { recursive: true });\n const files = readdirSync(skillsCoreDst, { recursive: true }) as string[];\n const count = files.filter(f => f.endsWith(\"SKILL.md\")).length;\n process.stdout.write(`\u2713 skills/core synced (${count} skills)\\n`);\n }\n // Ensure other skill dirs exist\n for (const d of [\"custom\", \"downloaded\", \"self\"]) {\n await mkdir(join(paths.home, \"skills\", d), { recursive: true });\n }\n // Migration (#614): remove stale pre-#438 top-level skill dirs (duplicates of core/)\n for (const stale of [\"memory\", \"ops\", \"tools\", \"coding\"]) {\n const p = join(paths.home, \"skills\", stale);\n if (existsSync(p)) { rmSync(p, { recursive: true, force: true }); }\n }\n\n // Seed missing config files from release defaults (#738)\n const releaseConfig = join(staged.stagedPath, \"config\");\n const destConfig = join(paths.home, \"config\");\n if (existsSync(releaseConfig)) {\n for (const f of readdirSync(releaseConfig)) {\n const src = join(releaseConfig, f);\n if (f.endsWith('.example')) {\n // Always overwrite .example files (user reference for latest schema)\n cpSync(src, join(destConfig, f));\n // Seed the real file if missing\n const target = join(destConfig, f.replace('.example', ''));\n if (!existsSync(target)) cpSync(src, target);\n }\n }\n // Also copy transport.default.json (fallback for transport-config)\n const defaultTransport = join(releaseConfig, 'transport.default.json');\n if (existsSync(defaultTransport)) cpSync(defaultTransport, join(destConfig, 'transport.default.json'));\n }\n\n // Sync core/ to ~/.abtars/core/ (for skill-reloader etc.)\n const coreSrc = join(staged.stagedPath, \"core\");\n const coreDst = join(paths.home, \"core\");\n if (existsSync(coreSrc)) {\n await mkdir(coreDst, { recursive: true });\n cpSync(coreSrc, coreDst, { recursive: true });\n }\n\n if (serviceChanged) {\n if (process.platform === 'darwin') {\n process.stdout.write(`\u26A0\uFE0F LaunchAgent plist updated \u2014 reload with: launchctl bootout gui/$(id -u)/com.abtars.watchdog && launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist\\n`);\n } else {\n process.stdout.write(`\u26A0\uFE0F systemd service updated \u2014 reload with: systemctl --user daemon-reload && systemctl --user restart abtars-watchdog\\n`);\n }\n }\n\n\n // hashFile is unused here but imported to validate the re-export surface;\n // leaving this no-op call removed \u2014 the re-export is exercised by tests.\n void hashFile;\n\n // #426 \u2014 Seed missing config + run config migrations\n const { ensureInstallInvariants } = await import(\"../ensure-invariants.js\");\n const invariantResults = await ensureInstallInvariants(process.cwd(), paths.home);\n if (invariantResults.length > 0) {\n process.stdout.write(`\u2713 invariants: ${invariantResults.join(\", \")}\\n`);\n }\n\n // Native deps (sqlite-vec, better-sqlite3) handled by `abmind install` (#716)\n\n // Run doctor before restart\n const doctorPath = join(paths.home, \"scripts\", \"doctor.sh\");\n if (existsSync(doctorPath)) {\n process.stdout.write(\"\\n\uD83E\uDE7A Health check...\\n\");\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(`bash \"${doctorPath}\" --fix`, { stdio: \"inherit\", timeout: 30_000 });\n } catch (err) {\n process.stderr.write(`\u26A0\uFE0F doctor --fix failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Auto-restart bridge on new code\n const manifestForRestart = await readManifest(paths.manifest);\n const restartMode = manifestForRestart?.installMode;\n if (!restartMode) {\n process.stderr.write(\"\u274C installMode not set in manifest.json. Run 'abtars install' first.\\n\");\n return 1;\n }\n\n if (restartMode === \"supervised-daemon\" || restartMode === \"supervised\") {\n // Send USR1 to watchdog for graceful restart (#688)\n process.stdout.write(\"\\nRestarting bridge via watchdog...\\n\");\n const wdLock = join(paths.home, \"watchdog.lock\");\n const wdPid = readJsonField(wdLock, \"pid\") as number | undefined;\n if (wdPid && wdPid > 0) {\n try {\n process.kill(wdPid, \"SIGUSR1\");\n process.stdout.write(`\u267B\uFE0F USR1 sent to watchdog (PID ${wdPid}) \u2014 bridge will restart\\n`);\n } catch {\n process.stdout.write(`\u26A0\uFE0F Could not signal watchdog (PID ${wdPid}). Restart manually:\\n`);\n if (process.platform === \"darwin\") {\n process.stdout.write(` launchctl kickstart -k gui/$(id -u)/com.abtars.watchdog\\n`);\n } else {\n process.stdout.write(` systemctl --user restart abtars-watchdog\\n`);\n }\n }\n } else {\n // No watchdog running \u2014 fall back to cold restart\n process.stdout.write(`\u26A0\uFE0F Watchdog not running. Cold restart...\\n`);\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n } else {\n // simple mode: no watchdog, cold restart\n process.stdout.write(\"\\nRestarting bridge...\\n\");\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n\n const { printHealthSummary } = await import('./health-check.js');\n printHealthSummary(paths.home);\n\n return 0;\n } finally {\n await release();\n }\n}\n", "/**\n * LocalBuildSource: the Phase 1 adapter. Builds the current working-tree\n * checkout and stages the output into releases/<version>/dist/.\n *\n * Staleness guard: runs `git fetch` and refuses to proceed if HEAD is behind\n * origin/<branch>, unless allowStale (--from-local) is passed. Handles the\n * detached-HEAD / no-upstream / unpushed edge cases with a friendly message.\n *\n * Version string: `<package-version>-<short-sha>`, e.g. `0.1.0-28f71ef`.\n * Uniqueness: if the same version is staged twice, the second stage\n * overwrites (rsync --delete semantics via rm + cp). Rare; only happens when\n * operator runs update twice without changing a commit or bumping version.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { copyFile, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { hashFile } from '../deploy-lib-import.js';\nimport type { PrepareContext, StagedRelease, UpdateSource } from './types.js';\n\nexport class LocalBuildError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(hint ? `${message}\\n\\n${hint}` : message);\n this.name = 'LocalBuildError';\n }\n}\n\nexport interface LocalBuildOptions {\n /** Repository root for the build (defaults to process.cwd()). */\n readonly repoRoot?: string;\n /** If true, skip the behind-origin guard. Operator opt-in. */\n readonly allowStale?: boolean;\n /** If true, skip `npm install` (assume node_modules is already current). */\n readonly skipInstall?: boolean;\n}\n\nfunction runCmd(cmd: string, args: readonly string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.error) throw new LocalBuildError(`${cmd} ${args.join(' ')} failed: ${r.error.message}`);\n if (r.status !== 0) {\n throw new LocalBuildError(\n `${cmd} ${args.join(' ')} exited with status ${r.status}`,\n r.stderr?.trim() || undefined,\n );\n }\n return r.stdout.trim();\n}\n\nfunction tryCmd(cmd: string, args: readonly string[], cwd: string): string | null {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.status !== 0) return null;\n return r.stdout.trim();\n}\n\nfunction checkStaleness(repoRoot: string, allowStale: boolean): { commit: string; branch: string | null } {\n const commit = runCmd('git', ['rev-parse', '--short', 'HEAD'], repoRoot);\n const branch = tryCmd('git', ['rev-parse', '--abbrev-ref', 'HEAD'], repoRoot);\n if (allowStale) return { commit, branch: branch === 'HEAD' ? null : branch };\n\n // Detached HEAD / no-branch case\n if (branch === 'HEAD' || branch === null) {\n throw new LocalBuildError(\n 'Working tree is in detached HEAD (no current branch).',\n 'Cannot check for staleness. Pass --from-local to proceed with the current tree.',\n );\n }\n\n // Fetch to refresh origin refs. Not --unshallow; caller may have a shallow clone intentionally.\n runCmd('git', ['fetch', '--quiet'], repoRoot);\n\n // Does the branch have an upstream?\n const upstream = tryCmd('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], repoRoot);\n if (upstream === null) {\n throw new LocalBuildError(\n `Branch '${branch}' has no upstream configured.`,\n 'Cannot check for staleness. Push the branch, or pass --from-local to proceed with the current tree.',\n );\n }\n\n // How many commits is HEAD behind upstream?\n const behindStr = tryCmd('git', ['rev-list', '--count', `HEAD..${upstream}`], repoRoot);\n const behind = behindStr === null ? null : Number(behindStr);\n if (behind === null || !Number.isFinite(behind)) {\n throw new LocalBuildError(\n `Could not determine how far HEAD is behind ${upstream}.`,\n 'Pass --from-local to proceed anyway.',\n );\n }\n if (behind > 0) {\n throw new LocalBuildError(\n `Current branch: ${branch} (${commit})\\n${upstream} is ahead by ${behind} commit${behind === 1 ? '' : 's'}.`,\n `Run 'git pull' first, or pass --from-local to build from the current tree.`,\n );\n }\n\n return { commit, branch };\n}\n\nasync function readPackageVersion(repoRoot: string): Promise<string> {\n const pkg = JSON.parse(await readFile(join(repoRoot, 'package.json'), 'utf-8')) as { version?: string };\n if (typeof pkg.version !== 'string') {\n throw new LocalBuildError('package.json has no version field.');\n }\n return pkg.version;\n}\n\nexport function makeLocalBuildSource(opts: LocalBuildOptions = {}): UpdateSource {\n const repoRoot = opts.repoRoot ?? process.cwd();\n const isNpmPackage = !existsSync(join(repoRoot, '.git'));\n\n return {\n name: 'local',\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n // npm package mode: no git, no build \u2014 just copy the pre-built bundle\n if (isNpmPackage) {\n const bundleDir = join(repoRoot, 'bundle');\n if (!existsSync(bundleDir)) {\n throw new Error(`No bundle/ found at ${repoRoot}. Run from the abtars npm package or a git checkout.`);\n }\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = pkgVersion;\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(bundleDir, join(stagedPath, 'bundle'), { recursive: true });\n const coreDir = join(repoRoot, 'core');\n if (existsSync(coreDir)) await cp(coreDir, join(stagedPath, 'core'), { recursive: true });\n const scriptsSrc = join(repoRoot, 'scripts');\n if (existsSync(scriptsSrc)) await cp(scriptsSrc, join(stagedPath, 'scripts'), { recursive: true });\n const configSrc = join(repoRoot, 'config');\n if (existsSync(configSrc)) await cp(configSrc, join(stagedPath, 'config'), { recursive: true });\n const manifestSrc = join(repoRoot, 'install-manifest.json');\n if (existsSync(manifestSrc)) await copyFile(manifestSrc, join(stagedPath, 'install-manifest.json'));\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n process.stdout.write(`\u2713 staged ${version} (from npm package)\\n`);\n return { version, stagedPath, commit: null, branch: null, packageLockHash: null, source: 'local' };\n }\n\n // Git checkout mode: build from source\n const { commit, branch } = checkStaleness(repoRoot, opts.allowStale === true || ctx.allowStale);\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = `${pkgVersion}-${commit}`;\n\n // Install deps into the shared node_modules/ (if not skipped).\n if (opts.skipInstall !== true) {\n runCmd('npm', ['install', '--no-audit', '--no-fund'], repoRoot);\n }\n\n // Build: bundle mode (esbuild) or legacy mode (tsc)\n const useBundle = process.env['AGENTBRIDGE_BUILD_MODE'] !== 'tsc';\n\n if (useBundle) {\n // Bundle mode: esbuild \u2192 bundle/ + pruned native deps\n runCmd('npm', ['run', 'bundle'], repoRoot);\n\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'bundle'), join(stagedPath, 'bundle'), { recursive: true });\n\n // Copy core skills for runtime sync (#438)\n const coreSkillsSrc = join(repoRoot, 'core', 'skills');\n if (existsSync(coreSkillsSrc)) {\n await cp(coreSkillsSrc, join(stagedPath, 'core', 'skills'), { recursive: true });\n }\n\n // Ensure ESM works without warnings (MODULE_TYPELESS_PACKAGE_JSON)\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Native addons (better-sqlite3, sqlite-vec) live at ~/.abmind/lib/node_modules/\n // and are loaded via native-loader.ts from there. No need to copy into release.\n // See #431 (persistent install) + native-loader.ts.\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n }\n\n // Legacy tsc mode (AGENTBRIDGE_BUILD_MODE=tsc)\n runCmd('npm', ['run', 'build'], repoRoot);\n\n // Stage releases/<version>/dist/\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'dist'), join(stagedPath, 'dist'), { recursive: true });\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Sync node_modules/ to the shared location.\n //\n // Use `rsync -aL` to DEREFERENCE symlinks \u2014 critical because\n // package.json `\"abmind\": \"file:../abmind\"` creates a symlink at\n // node_modules/abmind pointing into the dev workspace. Plain cp\n // preserves the symlink, so the runtime ends up with abmind code\n // served from the developer's working tree (active live edits +\n // test-suite contention on memory.db). We want a materialized copy.\n //\n // Delete destination first so rsync's --delete is unnecessary (and\n // safer \u2014 we don't want to rsync-delete anything outside).\n await rm(ctx.nodeModulesDir, { recursive: true, force: true });\n await mkdir(ctx.nodeModulesDir, { recursive: true });\n const rsyncResult = spawnSync(\n 'rsync',\n ['-aL', '--quiet', `${join(repoRoot, 'node_modules')}/`, `${ctx.nodeModulesDir}/`],\n { stdio: 'inherit' },\n );\n if (rsyncResult.status !== 0) {\n throw new LocalBuildError(\n `rsync of node_modules failed (status ${rsyncResult.status ?? -1})`,\n `Ensure rsync is installed. Falling back to node cp would re-create symlinks.`,\n );\n }\n\n // Note: abmind's nested node_modules/ (rsync'd from its dev workspace)\n // stays in place. Previously deleted to avoid duplicate better-sqlite3\n // native-addon conflict (#230-related), but since f24b33f removed\n // better-sqlite3 from abtars's deps, abmind's nested copy is the\n // only one and must remain \u2014 deleting it breaks module resolution for\n // abmind at runtime ('Cannot find package better-sqlite3').\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n },\n };\n}\n", "/**\n * NpmSource: fetch latest published version from npm registry (#462).\n * Downloads tarball, extracts, installs prod deps, stages.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PrepareContext, StagedRelease, UpdateSource } from \"./types.js\";\n\nconst TIMEOUT_MS = 60_000;\n\nfunction run(cmd: string, args: string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: \"utf-8\", timeout: TIMEOUT_MS });\n if (r.error) throw new Error(`${cmd} ${args.join(\" \")}: ${r.error.message}`);\n if (r.status !== 0) throw new Error(`${cmd} ${args.join(\" \")} exited ${r.status}: ${r.stderr?.trim()}`);\n return r.stdout.trim();\n}\n\nfunction readLocalVersion(home: string): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(home, \"current\", \"package.json\"), \"utf-8\"));\n return pkg.version ?? null;\n } catch { return null; }\n}\n\nexport function makeNpmSource(packageName: string): UpdateSource {\n return {\n name: \"npm\",\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n const latest = run(\"npm\", [\"view\", packageName, \"version\"], ctx.home);\n const current = readLocalVersion(ctx.home);\n if (latest === current) {\n throw new Error(`Already at latest version (${latest}). Nothing to update.`);\n }\n\n const stagedPath = join(ctx.releasesDir, latest);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n\n // Download tarball\n run(\"npm\", [\"pack\", `${packageName}@${latest}`, \"--pack-destination\", stagedPath], stagedPath);\n const tgzName = `${packageName}-${latest}.tgz`.replace(\"@\", \"\").replace(\"/\", \"-\");\n const tgzPath = join(stagedPath, tgzName);\n\n // Extract (strip package/ prefix)\n run(\"tar\", [\"-xzf\", tgzPath, \"--strip-components=1\"], stagedPath);\n\n // Cleanup tarball\n if (existsSync(tgzPath)) unlinkSync(tgzPath);\n\n // Install production deps\n run(\"npm\", [\"install\", \"--omit=dev\", \"--no-audit\", \"--no-fund\"], stagedPath);\n\n return { version: latest, stagedPath, commit: null, branch: null, packageLockHash: null, source: \"npm\" };\n },\n };\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 'deps': {\n const { deps: depsCmd } = await import('./commands/deps.js');\n return await depsCmd(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": "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",
|
|
6
6
|
"names": ["existsSync", "unlinkSync", "join", "join", "abtarsHome", "manifestPath", "abtarsHome", "join", "existsSync", "unlinkSync", "existsSync", "readdirSync", "unlinkSync", "join", "dirname", "join", "existsSync", "readFileSync", "renameSync", "join", "readManifest", "confirm", "rm", "join", "writeManifest", "dirname", "existsSync", "spawnSync", "spawn", "run", "abtarsHome", "fileURLToPath", "hostname", "join", "dirname", "readFileSync", "existsSync", "mkdirSync", "copyFile", "mkdir", "readFile", "writeFile", "spawnSync", "existsSync", "mkdir", "readFile", "writeFile", "join", "spawnSync", "readFile", "join", "existsSync", "pkgVersion", "version", "stagedPath", "mkdir", "writeFile", "packageLockHash", "spawnSync", "existsSync", "readFileSync", "unlinkSync", "mkdir", "rm", "join", "readJsonField", "readFileSync", "existsSync", "join", "mkdirSync", "dirname", "writeFileSync", "unlinkSync", "readlinkSync", "hostname", "mkdir", "copyFile", "readFile", "writeFile", "rmSync", "readdirSync", "restart"]
|
|
7
7
|
}
|