botapp-cli 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/server.ts","../src/config/profile.ts","../src/config/server.ts","../src/commands/launch.ts","../src/config/daemon.ts","../src/auth/browser-auth.ts","../src/commands/daemon-agent-config.ts","../src/commands/apps.ts","../src/client/http.ts","../src/commands/run.ts","../src/commands/login.ts","../src/commands/install.ts","../src/commands/uninstall.ts","../src/commands/dev.ts","../src/commands/connect.ts","../src/commands/events.ts","../src/commands/agent.ts","../src/commands/register.ts","../src/commands/wrap.ts","../src/commands/reload.ts","../src/commands/skill.ts","../src/commands/pairing.ts","../src/commands/daemon.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { serverCommand } from './commands/server'\nimport { launchCommand } from './commands/launch'\nimport { appsCommand } from './commands/apps'\nimport { runCommand } from './commands/run'\nimport { loginCommand } from './commands/login'\nimport { installCommand } from './commands/install'\nimport { uninstallCommand } from './commands/uninstall'\nimport { devCommand } from './commands/dev'\nimport { connectCommand } from './commands/connect'\nimport { eventsCommand } from './commands/events'\nimport { agentCommand } from './commands/agent'\nimport { registerCommand } from './commands/register'\nimport { wrapCommand } from './commands/wrap'\nimport { reloadCommand, configCommand } from './commands/reload'\nimport { skillCommand } from './commands/skill'\nimport { pairingCommand } from './commands/pairing'\nimport { daemonCommand } from './commands/daemon'\n\n// Injected by tsup at build time from package.json.\nconst version = process.env.CLI_VERSION ?? '0.0.0'\n\nexport const program = new Command()\n .name('bot')\n .description('botapp CLI — operate apps from the command line')\n .version(version)\n .enablePositionalOptions(true)\n .option('--json', 'Output as JSON')\n .option('-s, --server <url>', 'Server URL override')\n .option('-t, --token <token>', 'Auth token override')\n .option('-v, --verbose', 'Verbose output')\n\n// ── Core (agent daily use) ───────────────────────────────────\nprogram.addCommand(launchCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(appsCommand)\nprogram.addCommand(skillCommand)\nprogram.addCommand(connectCommand)\nprogram.addCommand(eventsCommand)\n\n// ── Auth & identity ──────────────────────────────────────────\nprogram.addCommand(loginCommand)\nprogram.addCommand(agentCommand)\nprogram.addCommand(pairingCommand)\nprogram.addCommand(daemonCommand)\n\n// ── App management ───────────────────────────────────────────\nprogram.addCommand(installCommand)\nprogram.addCommand(uninstallCommand)\nprogram.addCommand(reloadCommand)\nprogram.addCommand(configCommand)\n\n// ── Server management ────────────────────────────────────────\nprogram.addCommand(serverCommand)\n\n// ── Hidden (still callable, not shown in --help) ─────────────\nprogram.addCommand(devCommand, { hidden: true })\nprogram.addCommand(registerCommand, { hidden: true })\nprogram.addCommand(wrapCommand, { hidden: true })\n\nprogram.addHelpText(\n 'after',\n `\nExamples:\n $ bot start Connect to a server and log in\n $ bot run trading quote --symbol NVDA\n Run an app command\n $ bot apps List installed apps\n $ bot skill trading Print the app's agent-facing skill doc\n $ bot connect --subscribe 'trading.*'\n Live event stream\n $ bot pair Pair this machine (browser flow / local fast-path)\n $ bot pair --token <jwt> Pair with a token pasted from dashboard Settings\n $ bot daemon run Run the paired local daemon\n`,\n)\n\nrunCommand.addHelpText(\n 'after',\n `\nExamples:\n $ bot run hello greet --name alice\n $ bot run trading quote --symbol NVDA\n $ bot run trading buy --symbol AAPL --qty 10\n $ bot --json run trading list-positions\n\nArguments after <command> become the command's params object:\n --key value → params.key = value\n --key → params.key = true (flag-only)\n Numeric strings are auto-coerced: \"--qty 10\" → 10\n\nTo discover what params a command accepts:\n $ bot apps --json | jq '.[] | select(.name == \"trading\") | .commands'\n`,\n)\n\n// Friendlier \"unknown command\" error with hints.\nprogram.on('command:*', (operands: string[]) => {\n const first = operands[0]\n const known = program.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name())\n const topLevelHint = `Run ${pc.cyan('bot --help')} for the list of top-level commands.`\n\n const argv = process.argv.slice(2)\n const firstIdx = argv.indexOf(first)\n const tail = firstIdx >= 0 ? argv.slice(firstIdx + 1) : []\n\n if (tail.length > 0) {\n const suggested = `bot run ${first} ${tail.join(' ')}`\n console.error(\n pc.red(`error: unknown command '${first}'`) +\n `\\n\\nApp commands go through ${pc.bold('bot run')}. Did you mean:` +\n `\\n\\n ${pc.cyan(suggested)}` +\n `\\n\\n${topLevelHint}`,\n )\n process.exit(1)\n }\n\n console.error(\n pc.red(`error: unknown command '${first}'`) +\n `\\n\\nIf '${first}' is an app name, invoke one of its commands with:` +\n `\\n ${pc.cyan(`bot run ${first} <command> [--key value ...]`)}` +\n `\\n ${pc.cyan('bot apps --json')} ${pc.dim('(to see what commands exist)')}` +\n `\\n\\nTop-level commands: ${known.join(', ')}` +\n `\\n${topLevelHint}`,\n )\n process.exit(1)\n})\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport pc from 'picocolors'\nimport { resolveServerUrl } from '../config/server'\n\n/**\n * `bot server` — manage the local server process only.\n *\n * First-time setup (auth, default agent, daemon pairing) lives in\n * `bot launch`. `bot start` is kept as an alias of `bot launch` for\n * backwards compatibility.\n */\nexport const serverCommand = new Command('server')\n .description('Manage the local botapp server process')\n\nserverCommand\n .command('start')\n .description('Start the local server process (no auth setup)')\n .option('-p, --port <port>', 'Port for local server', '7100')\n .option('--background', 'Run in background', false)\n .action(async (opts: { port: string; background: boolean }) => {\n const serverUrl = `http://localhost:${opts.port}`\n try {\n const res = await fetch(`${serverUrl}/health`)\n if (res.ok) {\n console.log(pc.yellow('Server is already running at'), pc.cyan(serverUrl))\n return\n }\n } catch { /* not running, proceed */ }\n\n const serverEntry = findServerEntry()\n if (!serverEntry) {\n console.error(\n pc.red('Could not find the server package.\\n') +\n `\\nThis command requires the botapp monorepo source.\\n` +\n `If you installed the CLI from npm, use ${pc.cyan('bot launch')} and\\n` +\n `pick option 2 (cloud) or 3 (custom) instead.`,\n )\n process.exitCode = 1\n return\n }\n\n console.log(pc.blue('Starting local server...'))\n const child = spawn('node', ['--import', 'tsx', serverEntry], {\n env: { ...process.env, PORT: opts.port },\n stdio: opts.background ? 'ignore' : 'inherit',\n detached: opts.background,\n })\n if (opts.background) {\n child.unref()\n console.log(pc.green('Server started in background'), `(PID: ${child.pid})`)\n }\n\n for (let i = 0; i < 30; i++) {\n await new Promise((r) => setTimeout(r, 500))\n try {\n const res = await fetch(`${serverUrl}/health`)\n if (res.ok) {\n if (opts.background) console.log(pc.green('Server ready at'), pc.cyan(serverUrl))\n return\n }\n } catch { /* not ready yet */ }\n }\n if (opts.background) console.log(pc.yellow('Server may still be starting...'))\n })\n\nserverCommand\n .command('status')\n .description('Check if the server is running')\n .action(async () => {\n const serverUrl = resolveServerUrl()\n try {\n const res = await fetch(`${serverUrl}/health`)\n const data = await res.json() as { mode: string; apps: number }\n console.log(pc.green('Server is running'))\n console.log(` URL: ${pc.cyan(serverUrl)}`)\n console.log(` Mode: ${data.mode}`)\n console.log(` Apps: ${data.apps}`)\n } catch {\n console.log(pc.red('Server is not running'))\n process.exitCode = 1\n }\n })\n\nserverCommand\n .command('stop')\n .description('Stop the botapp server')\n .action(async () => {\n console.log(pc.yellow('Server stop not yet implemented (kill the process manually)'))\n })\n\nfunction findServerEntry(): string | null {\n const candidates = [\n resolve(process.cwd(), 'packages/server/src/index.ts'),\n resolve(process.cwd(), '../server/src/index.ts'),\n resolve(process.cwd(), '../../packages/server/src/index.ts'),\n ]\n for (const c of candidates) {\n if (existsSync(c)) return c\n }\n return null\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { parse, stringify } from 'yaml'\n\nexport interface Profile {\n server: string\n /**\n * Dashboard / web-app origin. Defaults to `server` when unset. Kept separate\n * so hosted deployments can split `api.<apex>` (API) from `<apex>` (web).\n */\n app_url?: string\n user_id?: string\n agent_id?: string\n token?: string\n}\n\nexport interface Config {\n active_profile: string\n profiles: Record<string, Profile>\n}\n\nconst CONFIG_DIR = join(homedir(), '.botapp')\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.yaml')\n\nfunction defaultConfig(): Config {\n return {\n active_profile: 'local',\n profiles: {\n local: {\n server: 'http://localhost:7100',\n },\n },\n }\n}\n\nexport function loadProfile(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig()\n const raw = readFileSync(CONFIG_FILE, 'utf-8')\n const parsed = parse(raw)\n return { ...defaultConfig(), ...parsed }\n } catch {\n return defaultConfig()\n }\n}\n\nexport function saveProfile(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n writeFileSync(CONFIG_FILE, stringify(config), 'utf-8')\n}\n\nexport function getActiveProfile(): Profile {\n const config = loadProfile()\n return config.profiles[config.active_profile] ?? config.profiles.local ?? { server: 'http://localhost:7100' }\n}\n\nexport function updateActiveProfile(updates: Partial<Profile>): void {\n const config = loadProfile()\n const name = config.active_profile\n config.profiles[name] = { ...config.profiles[name], ...updates }\n saveProfile(config)\n}\n","import { getActiveProfile } from './profile'\n\nexport function resolveServerUrl(flagUrl?: string): string {\n if (flagUrl) return flagUrl.replace(/\\/$/, '')\n const env = process.env.BOTAPP_SERVER\n if (env) return env.replace(/\\/$/, '')\n const profile = getActiveProfile()\n return profile.server.replace(/\\/$/, '')\n}\n\nexport function resolveToken(flagToken?: string): string | undefined {\n if (flagToken) return flagToken\n const env = process.env.BOTAPP_TOKEN\n if (env) return env\n return getActiveProfile().token\n}\n\nexport function authHeaders(token?: string): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n return headers\n}\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { resolve, join } from 'node:path'\nimport { existsSync, mkdirSync, openSync, writeFileSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { createInterface } from 'node:readline'\nimport { hostname } from 'node:os'\nimport pc from 'picocolors'\nimport { loadProfile, saveProfile, updateActiveProfile } from '../config/profile'\nimport { saveDaemonProfile, loadDaemonProfile } from '../config/daemon'\nimport { runBrowserAuth } from '../auth/browser-auth'\nimport { registerAllDetectedAgents } from './daemon-agent-config'\n\n// Default cloud origins. API serves /api/*; the web app (landing + dashboard)\n// serves /cli-auth, /login, etc. For local/self-hosted deployments they may\n// be the same origin, so `app_url` defaults to `server_url` when unset.\nconst DEFAULT_SERVER_URL = 'https://api.botapp.ai'\nconst DEFAULT_APP_URL = 'https://botapp.ai'\nconst DEFAULT_LOCAL_SERVER = 'http://localhost:7100'\n\nfunction ask(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((res) => {\n rl.question(question, (answer) => {\n rl.close()\n res(answer.trim())\n })\n })\n}\n\ninterface LaunchOpts {\n port: string\n background: boolean\n server?: string\n appUrl?: string\n browser: boolean // commander inverts --no-browser\n agents: boolean // commander inverts --no-agents\n agentCwd: string\n start: boolean // commander inverts --no-start\n}\n\nexport const launchCommand = new Command('launch')\n .alias('start')\n .description('Set up this CLI (auth + default agent + daemon pair + agent register)')\n .option('-p, --port <port>', 'Port for local server', '7100')\n .option('--background', 'Run local server in background', false)\n .option('-s, --server <url>', 'Server URL (skip the interactive picker)')\n .option('--app-url <url>', 'Dashboard URL (defaults to the server URL)')\n .option('--no-browser', 'Error instead of opening a browser')\n .option('--no-agents', 'Skip auto-registering local agent CLIs')\n .option('--agent-cwd <cwd>', 'Working directory stored on registered daemon agents', process.cwd())\n .option('--no-start', 'Skip starting the daemon process in background')\n .action(async (opts: LaunchOpts) => {\n if (opts.server) {\n await launchAgainstServer(opts.server, opts.appUrl, opts)\n return\n }\n\n console.log(pc.bold('Where do you want to run botapp?\\n'))\n console.log(` ${pc.cyan('1)')} Local ${pc.dim('— start a server on this machine')}`)\n console.log(` ${pc.cyan('2)')} Cloud ${pc.dim(`— connect to ${DEFAULT_APP_URL}`)}`)\n console.log(` ${pc.cyan('3)')} Custom ${pc.dim('— enter your own server URL')}\\n`)\n\n const choice = await ask(`${pc.bold('Select [1/2/3]:')} `)\n switch (choice) {\n case '1':\n await launchLocal(opts)\n break\n case '2':\n await launchAgainstServer(DEFAULT_SERVER_URL, DEFAULT_APP_URL, opts)\n break\n case '3': {\n const url = await ask(`\\n${pc.bold('Server URL:')} `)\n if (!url) {\n console.error(pc.red('No URL provided'))\n process.exitCode = 1\n return\n }\n await launchAgainstServer(url.replace(/\\/$/, ''), undefined, opts)\n break\n }\n default:\n console.error(pc.red(`Invalid choice: ${choice}`))\n process.exitCode = 1\n }\n })\n\nasync function launchLocal(opts: LaunchOpts) {\n const serverUrl = `http://localhost:${opts.port}`\n\n if (!(await isServerUp(serverUrl))) {\n const spawned = await startLocalServer(opts)\n if (!spawned) {\n process.exitCode = 1\n return\n }\n } else {\n console.log(pc.yellow('Server already running at'), pc.cyan(serverUrl))\n }\n\n await launchAgainstServer(serverUrl, serverUrl, opts)\n}\n\n/**\n * Main launch path: given a server (and optional app URL), authenticate the\n * human, bind a default agent, pair a daemon. Local-mode servers short-\n * circuit the browser — their /health already returns an anon token.\n */\nasync function launchAgainstServer(\n serverUrl: string,\n appUrl: string | undefined,\n opts: LaunchOpts,\n) {\n console.log(pc.dim(`\\nConfigured for ${serverUrl}`))\n\n const health = await fetchHealth(serverUrl)\n if (!health) {\n console.error(pc.red(`Cannot reach ${serverUrl}`))\n process.exitCode = 1\n return\n }\n\n const profileName = pickProfileName(serverUrl)\n\n if (health.mode === 'local' && health.token) {\n // Local fast-path — no browser, no user accounts.\n const config = loadProfile()\n config.profiles[profileName] = {\n server: serverUrl,\n app_url: appUrl ?? serverUrl,\n token: health.token,\n user_id: 'local',\n agent_id: 'local-agent',\n }\n config.active_profile = profileName\n saveProfile(config)\n console.log(pc.green('Logged in (local mode)'))\n console.log(` Profile: ${pc.bold(profileName)}`)\n console.log(` Server: ${pc.cyan(serverUrl)}`)\n // Pair a daemon in the same shot. Local mode auth-as-local-user lets\n // us mint a pairing token with no credentials, so `/health` → token +\n // `/api/daemon/pairing-tokens` + `/api/daemon/pair` closes the\n // \"PAIR & START\" step in the dashboard without a second command.\n const paired = await tryLocalDaemonPair(serverUrl, hostname())\n if (paired) {\n console.log(\n ` Daemon: ${pc.bold(paired.name)} ${pc.dim(`(${paired.id})`)}`,\n )\n await autoRegisterAgents(opts)\n await autoStartDaemon(opts, serverUrl, paired.id)\n } else {\n console.log(pc.yellow(` Daemon: pairing failed — run \\`bot pair\\` later`))\n }\n return\n }\n\n // Hosted: browser flow.\n if (opts.browser === false) {\n console.error(pc.red('Hosted server needs browser auth but --no-browser was passed.'))\n process.exitCode = 1\n return\n }\n\n const result = await runBrowserAuth({\n serverUrl,\n appUrl: appUrl ?? serverUrl,\n scope: 'launch',\n name: hostname(),\n })\n\n if (!result.userToken || !result.userId || !result.agentId) {\n console.error(pc.red('server did not return a user token / agent'))\n process.exitCode = 1\n return\n }\n\n const config = loadProfile()\n config.profiles[profileName] = {\n server: result.serverUrl ?? serverUrl,\n app_url: appUrl ?? serverUrl,\n token: result.userToken,\n user_id: result.userId,\n agent_id: result.agentId,\n }\n config.active_profile = profileName\n saveProfile(config)\n\n if (result.userEmail) {\n console.log(pc.green(`Authenticated as ${pc.bold(result.userEmail)}`))\n }\n console.log(` Profile: ${pc.bold(profileName)}`)\n console.log(` Server: ${pc.cyan(result.serverUrl ?? serverUrl)}`)\n console.log(\n ` Agent: ${pc.bold(result.agentName ?? 'default')} ${pc.dim(`(${result.agentId})`)}`,\n )\n\n // Pair a daemon in the same shot so the user doesn't need to run a second\n // command. Failure here is non-fatal — the login still succeeded.\n if (result.daemonPairingToken) {\n try {\n const res = await fetch(`${result.serverUrl ?? serverUrl}/api/daemon/pair`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: result.daemonPairingToken,\n name: hostname(),\n machine: hostname(),\n }),\n })\n const data = await res.json().catch(() => ({} as any))\n if (res.ok && data?.daemon?.id) {\n saveDaemonProfile({\n server: result.serverUrl ?? serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n })\n console.log(\n ` Daemon: ${pc.bold(data.daemon.name)} ${pc.dim(`(${data.daemon.id})`)}`,\n )\n await autoRegisterAgents(opts)\n await autoStartDaemon(opts, result.serverUrl ?? serverUrl, data.daemon.id)\n } else {\n console.log(pc.yellow(` Daemon: pairing failed — run \\`bot pair\\` later`))\n }\n } catch {\n console.log(pc.yellow(` Daemon: pairing skipped — run \\`bot pair\\` later`))\n }\n }\n}\n\n/**\n * Spawn `bot daemon run` as a detached background process so the dashboard\n * flips from \"waiting-online\" to \"Connection succeeded\" within ~3s. Logs\n * go to ~/.botapp/daemon.log; PID to ~/.botapp/daemon.pid so it can be\n * stopped with `kill $(cat ~/.botapp/daemon.pid)`.\n *\n * No-op if `--no-start` was passed, a daemon process is already running\n * from a previous invocation, or we can't resolve the current `bot` binary.\n */\nasync function autoStartDaemon(\n opts: LaunchOpts,\n serverUrl: string,\n daemonId: string,\n): Promise<void> {\n if (opts.start === false) {\n console.log(pc.dim(`\\nNext: run \\`bot daemon run\\` to bring this machine online.`))\n return\n }\n\n const dir = join(homedir(), '.botapp')\n const pidFile = join(dir, 'daemon.pid')\n const logFile = join(dir, 'daemon.log')\n mkdirSync(dir, { recursive: true })\n\n if (isDaemonRunningLocally(pidFile)) {\n console.log(pc.dim(` Running: already (pid $(cat ~/.botapp/daemon.pid))`))\n return\n }\n\n const botBin = process.argv[1]\n if (!botBin || !existsSync(botBin)) {\n console.log(pc.yellow(` Running: cannot resolve \\`bot\\` binary — run \\`bot daemon run\\` manually`))\n return\n }\n\n const logFd = openSync(logFile, 'a')\n const child = spawn(process.execPath, [botBin, 'daemon', 'run'], {\n stdio: ['ignore', logFd, logFd],\n detached: true,\n })\n child.unref()\n if (typeof child.pid === 'number') {\n writeFileSync(pidFile, `${child.pid}\\n`, 'utf-8')\n }\n\n // Poll /api/daemons — wait up to ~10s for the daemon to come online.\n let online = false\n for (let i = 0; i < 20; i++) {\n await new Promise((r) => setTimeout(r, 500))\n if (await isDaemonOnline(serverUrl, daemonId)) {\n online = true\n break\n }\n }\n if (online) {\n console.log(` Running: ${pc.green('online')} ${pc.dim(`(pid ${child.pid}, logs ~/.botapp/daemon.log)`)}`)\n } else {\n console.log(\n pc.yellow(\n ` Running: started but didn't report online in 10s — check ~/.botapp/daemon.log`,\n ),\n )\n }\n}\n\nfunction isDaemonRunningLocally(pidFile: string): boolean {\n if (!existsSync(pidFile)) return false\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10)\n if (!Number.isInteger(pid) || pid <= 0) return false\n process.kill(pid, 0) // throws if process doesn't exist\n return true\n } catch {\n return false\n }\n}\n\nasync function isDaemonOnline(serverUrl: string, daemonId: string): Promise<boolean> {\n try {\n const res = await fetch(`${serverUrl}/api/daemons`, {\n signal: AbortSignal.timeout(2000),\n })\n if (!res.ok) return false\n const data = (await res.json()) as { daemons?: Array<{ id: string; status: string }> }\n const d = (data.daemons ?? []).find((x) => x.id === daemonId)\n return d?.status === 'online' || d?.status === 'connected'\n } catch {\n return false\n }\n}\n\n/**\n * Scan PATH for known local agent CLIs (codex / claude / openclaw / hermes)\n * and register any that aren't already known. Skipped silently when the\n * user passed --no-agents or no daemon profile exists (pairing failed).\n */\nasync function autoRegisterAgents(opts: LaunchOpts): Promise<void> {\n if (opts.agents === false) return\n const daemon = loadDaemonProfile()\n if (!daemon) return\n\n try {\n const { created, skipped, detected } = await registerAllDetectedAgents({\n server: daemon.server,\n token: daemon.token,\n cwd: opts.agentCwd,\n })\n if (detected === 0) {\n console.log(\n pc.dim(\n ` Agents: none detected on PATH (scanned: codex, claude, openclaw, hermes)`,\n ),\n )\n return\n }\n const summary: string[] = []\n if (created.length > 0) summary.push(`${created.length} registered (${created.join(', ')})`)\n if (skipped.length > 0) summary.push(`${skipped.length} skipped`)\n console.log(\n ` Agents: ${pc.bold(summary.join(' · ') || 'up to date')}`,\n )\n } catch (e: any) {\n console.log(pc.yellow(` Agents: registration failed (${e.message})`))\n }\n}\n\n/**\n * Local-mode daemon pair. Mints a pairing token as the anonymous-but-\n * authed `local` user, then exchanges it for a daemon token and writes\n * `daemon.yaml`. Returns null on any failure so the caller can continue\n * the launch flow.\n */\nasync function tryLocalDaemonPair(\n serverUrl: string,\n name: string,\n): Promise<{ id: string; name: string } | null> {\n try {\n const tokRes = await fetch(`${serverUrl}/api/daemon/pairing-tokens`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n })\n if (!tokRes.ok) return null\n const tokData = (await tokRes.json()) as { token?: string }\n if (!tokData.token) return null\n\n const pairRes = await fetch(`${serverUrl}/api/daemon/pair`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token: tokData.token, name, machine: name }),\n })\n if (!pairRes.ok) return null\n const data = (await pairRes.json()) as {\n daemon?: { id: string; name: string }\n token?: string\n }\n if (!data.daemon?.id || !data.token) return null\n\n saveDaemonProfile({\n server: serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n })\n return { id: data.daemon.id, name: data.daemon.name }\n } catch {\n return null\n }\n}\n\nfunction pickProfileName(serverUrl: string): string {\n try {\n const host = new URL(serverUrl).hostname\n if (host === 'localhost' || host === '127.0.0.1') return 'local'\n if (host === new URL(DEFAULT_SERVER_URL).hostname) return 'cloud'\n return host.replace(/\\./g, '-')\n } catch {\n return 'remote'\n }\n}\n\nasync function fetchHealth(serverUrl: string): Promise<{ mode: string; token?: string } | null> {\n try {\n const res = await fetch(`${serverUrl}/health`, { signal: AbortSignal.timeout(5000) })\n if (!res.ok) return null\n return (await res.json()) as { mode: string; token?: string }\n } catch {\n return null\n }\n}\n\nasync function isServerUp(serverUrl: string): Promise<boolean> {\n return (await fetchHealth(serverUrl)) !== null\n}\n\nasync function startLocalServer(opts: LaunchOpts): Promise<boolean> {\n const serverUrl = `http://localhost:${opts.port}`\n const serverEntry = findServerEntry()\n if (!serverEntry) {\n console.error(\n pc.red('Could not find the server package.\\n') +\n `\\nLocal mode requires the botapp monorepo source.\\n` +\n `If you installed the CLI from npm, pick option ${pc.cyan('2')} (cloud) or ${pc.cyan('3')} (custom) instead.\\n\\n` +\n `Or run a local server from source:\\n` +\n ` ${pc.cyan('git clone https://github.com/wangdinglu/botapp')}\\n` +\n ` ${pc.cyan('cd botapp && pnpm install && pnpm build')}\\n` +\n ` ${pc.cyan('pnpm --filter @botapp/server dev')}`,\n )\n return false\n }\n\n console.log(pc.blue('Starting local server...'))\n const child = spawn('node', ['--import', 'tsx', serverEntry], {\n env: { ...process.env, PORT: opts.port },\n stdio: opts.background ? 'ignore' : 'inherit',\n detached: opts.background,\n })\n if (opts.background) {\n child.unref()\n }\n\n for (let i = 0; i < 30; i++) {\n await new Promise((r) => setTimeout(r, 500))\n if (await isServerUp(serverUrl)) return true\n }\n console.error(pc.red('Server did not come up in 15s'))\n return false\n}\n\nfunction findServerEntry(): string | null {\n const candidates = [\n resolve(process.cwd(), 'packages/server/src/index.ts'),\n resolve(process.cwd(), '../server/src/index.ts'),\n resolve(process.cwd(), '../../packages/server/src/index.ts'),\n ]\n for (const c of candidates) {\n if (existsSync(c)) return c\n }\n return null\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { parse, stringify } from 'yaml'\n\nexport interface DaemonProfile {\n server: string\n daemonId: string\n daemonName: string\n token: string\n}\n\nconst CONFIG_DIR = join(homedir(), '.botapp')\nconst DAEMON_FILE = join(CONFIG_DIR, 'daemon.yaml')\n\nexport function loadDaemonProfile(): DaemonProfile | null {\n try {\n if (!existsSync(DAEMON_FILE)) return null\n const parsed = parse(readFileSync(DAEMON_FILE, 'utf-8')) as Partial<DaemonProfile> | null\n if (!parsed?.server || !parsed.daemonId || !parsed.token) return null\n return {\n server: parsed.server.replace(/\\/$/, ''),\n daemonId: parsed.daemonId,\n daemonName: parsed.daemonName ?? parsed.daemonId,\n token: parsed.token,\n }\n } catch {\n return null\n }\n}\n\nexport function saveDaemonProfile(profile: DaemonProfile): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n writeFileSync(DAEMON_FILE, stringify(profile), 'utf-8')\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport { randomBytes } from 'node:crypto'\nimport { spawn } from 'node:child_process'\nimport pc from 'picocolors'\n\nexport interface BrowserAuthResult {\n scope: 'pair' | 'launch'\n serverUrl: string\n name?: string\n // scope=pair\n pairingToken?: string\n // scope=launch\n userId?: string\n userEmail?: string\n userToken?: string\n agentId?: string\n agentName?: string\n daemonPairingToken?: string\n}\n\ninterface BrowserAuthOptions {\n appUrl: string\n serverUrl: string\n scope: 'pair' | 'launch'\n name?: string\n timeoutMs?: number\n}\n\nconst OK_HTML = `<!doctype html>\n<meta charset=\"utf-8\">\n<title>botapp · Authentication successful</title>\n<style>\n :root { color-scheme: dark; }\n html, body { height: 100%; margin: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', Roboto, sans-serif;\n background: #0b0b0d;\n color: #e9e9ec;\n display: grid;\n place-items: center;\n -webkit-font-smoothing: antialiased;\n }\n .card {\n width: min(92vw, 520px);\n background: #151518;\n border: 1px solid #242428;\n border-radius: 16px;\n padding: 48px 40px 40px;\n text-align: center;\n }\n .check {\n width: 64px; height: 64px; margin: 0 auto 22px;\n border-radius: 50%;\n background: rgba(34, 197, 94, 0.14);\n color: #22c55e;\n display: grid; place-items: center;\n font-size: 30px;\n }\n .glyph { color: #6b6b72; font-size: 20px; margin: 8px 0 12px; }\n h1 { font-size: 28px; font-weight: 700; margin: 0 0 10px; letter-spacing: -0.01em; }\n p { color: #9a9aa1; margin: 0; font-size: 15px; line-height: 1.5; }\n .dim { color: #6b6b72; font-size: 13px; margin-top: 14px; }\n</style>\n<div class=\"card\">\n <div class=\"check\">✓</div>\n <div class=\"glyph\">✱</div>\n <h1>Authentication successful</h1>\n <p>You can close this tab and return to the terminal.</p>\n <p class=\"dim\">Your CLI session is now authenticated.</p>\n</div>`\n\n/**\n * Starts a one-shot loopback listener on 127.0.0.1, opens the browser to the\n * server's approval page with callback + state params, and resolves once the\n * page POSTs the grant payload back. Rejects on state mismatch, timeout, or\n * a second callback attempt.\n */\nexport async function runBrowserAuth(\n opts: BrowserAuthOptions,\n): Promise<BrowserAuthResult> {\n const state = randomBytes(24).toString('base64url')\n // 10-minute default. First-time users sign up + verify email + click\n // Approve, and 2 minutes is not enough. The loopback stays bound the whole\n // time but it costs nothing — it's one port on 127.0.0.1.\n const timeoutMs = opts.timeoutMs ?? 10 * 60_000\n\n const { port, waitForCallback, shutdown } = await startLoopback(state)\n const cliCallback = `http://127.0.0.1:${port}/callback`\n\n const params = new URLSearchParams({\n cli_callback: cliCallback,\n cli_state: state,\n scope: opts.scope,\n })\n if (opts.name) params.set('name', opts.name)\n\n const approvalUrl = `${opts.appUrl.replace(/\\/$/, '')}/cli-auth?${params.toString()}`\n\n console.log(pc.dim('Opening browser to authenticate...'))\n console.log(pc.dim(\"If the browser didn't open, visit:\"))\n console.log(` ${pc.cyan(approvalUrl)}`)\n console.log()\n console.log(pc.dim('Waiting for authentication...'))\n\n openUrl(approvalUrl)\n\n try {\n const payload = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error('timed out waiting for authentication')),\n timeoutMs,\n )\n }),\n ])\n // Give the browser a moment to fully render the success page AND for\n // any preconnect / prefetch follow-up connections Chrome likes to open\n // right after a navigation. Tearing the loopback down immediately\n // produces a visible ERR_CONNECTION_REFUSED in the address bar even\n // though the navigation succeeded.\n await new Promise((r) => setTimeout(r, 1500))\n return {\n scope: opts.scope,\n serverUrl: payload.serverUrl ?? opts.serverUrl,\n name: payload.name,\n pairingToken: payload.pairingToken,\n userId: payload.userId,\n userEmail: payload.userEmail,\n userToken: payload.userToken,\n agentId: payload.agentId,\n agentName: payload.agentName,\n daemonPairingToken: payload.daemonPairingToken,\n }\n } finally {\n shutdown()\n }\n}\n\ninterface LoopbackCallbackPayload {\n serverUrl?: string\n name?: string\n pairingToken?: string\n userId?: string\n userEmail?: string\n userToken?: string\n agentId?: string\n agentName?: string\n daemonPairingToken?: string\n}\n\nasync function startLoopback(expectedState: string): Promise<{\n port: number\n waitForCallback: () => Promise<LoopbackCallbackPayload>\n shutdown: () => void\n}> {\n let resolveCb: (p: LoopbackCallbackPayload) => void = () => {}\n let rejectCb: (e: Error) => void = () => {}\n let settled = false\n\n const callbackPromise = new Promise<LoopbackCallbackPayload>((resolve, reject) => {\n resolveCb = (p) => {\n if (settled) return\n settled = true\n resolve(p)\n }\n rejectCb = (e) => {\n if (settled) return\n settled = true\n reject(e)\n }\n })\n\n const server = createServer((req, res) => {\n void handleLoopback(req, res, expectedState, resolveCb, rejectCb)\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(0, '127.0.0.1', () => {\n server.removeListener('error', reject)\n resolve()\n })\n })\n\n const address = server.address()\n if (!address || typeof address === 'string') {\n server.close()\n throw new Error('could not bind loopback port')\n }\n\n return {\n port: address.port,\n waitForCallback: () => callbackPromise,\n shutdown: () => {\n rejectCb(new Error('loopback shut down'))\n server.close()\n },\n }\n}\n\nasync function handleLoopback(\n req: IncomingMessage,\n res: ServerResponse,\n expectedState: string,\n onOk: (p: LoopbackCallbackPayload) => void,\n onErr: (e: Error) => void,\n) {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`)\n if (!url.pathname.startsWith('/callback')) {\n res.statusCode = 404\n res.end('not found')\n return\n }\n\n // GET /callback — the approval page navigates here with the grant payload\n // encoded as query params. This is a full-page redirect, not a cross-\n // origin fetch, so there's no CORS preflight and nothing to break in\n // Chrome's Private Network Access policy. It's also resilient to\n // strict browser settings that block cross-origin POSTs to loopback.\n if (req.method === 'GET') {\n const state = url.searchParams.get('state')\n if (!state || state !== expectedState) {\n res.statusCode = 400\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n // Kept around so the user sees an actual error page rather than a\n // connection-reset — fires onErr only after the HTML is flushed.\n res.end(errorHtml('State mismatch. Re-run the CLI and try again.'), () => {\n onErr(new Error('callback state mismatch'))\n })\n return\n }\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n // Resolve the callback promise ONLY after the success HTML has been\n // fully flushed to the socket. Otherwise `runBrowserAuth`'s finally\n // block may close the server before the response drains, and the\n // browser sees ERR_CONNECTION_RESET (or REFUSED for any retry/\n // preconnect attempt).\n res.end(OK_HTML, () => {\n onOk({\n serverUrl: url.searchParams.get('serverUrl') ?? undefined,\n name: url.searchParams.get('name') ?? undefined,\n pairingToken: url.searchParams.get('pairingToken') ?? undefined,\n userId: url.searchParams.get('userId') ?? undefined,\n userEmail: url.searchParams.get('userEmail') ?? undefined,\n userToken: url.searchParams.get('userToken') ?? undefined,\n agentId: url.searchParams.get('agentId') ?? undefined,\n agentName: url.searchParams.get('agentName') ?? undefined,\n daemonPairingToken: url.searchParams.get('daemonPairingToken') ?? undefined,\n })\n })\n return\n }\n\n // POST /callback — kept for programmatic callers (scripts, E2E tests).\n // CORS headers stay on in case a browser ends up here via an old page.\n const origin = req.headers.origin ?? '*'\n res.setHeader('Access-Control-Allow-Origin', origin)\n res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n res.setHeader('Access-Control-Allow-Private-Network', 'true')\n res.setHeader('Vary', 'Origin')\n\n if (req.method === 'OPTIONS') {\n res.statusCode = 204\n res.end()\n return\n }\n\n if (req.method !== 'POST') {\n res.statusCode = 405\n res.end('method not allowed')\n return\n }\n\n try {\n const body = await readJsonBody(req)\n if (!body || typeof body !== 'object') {\n res.statusCode = 400\n res.end('invalid body')\n onErr(new Error('invalid callback body'))\n return\n }\n const parsed = body as Record<string, unknown>\n if (typeof parsed.state !== 'string' || parsed.state !== expectedState) {\n res.statusCode = 400\n res.end('state mismatch')\n onErr(new Error('callback state mismatch'))\n return\n }\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(OK_HTML)\n onOk({\n serverUrl: asString(parsed.serverUrl),\n name: asString(parsed.name),\n pairingToken: asString(parsed.pairingToken),\n userId: asString(parsed.userId),\n userEmail: asString(parsed.userEmail),\n userToken: asString(parsed.userToken),\n agentId: asString(parsed.agentId),\n agentName: asString(parsed.agentName),\n daemonPairingToken: asString(parsed.daemonPairingToken),\n })\n } catch (e: any) {\n res.statusCode = 500\n res.end('error')\n onErr(e)\n }\n}\n\nfunction errorHtml(msg: string): string {\n const safe = msg.replace(/[<>&]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[c] ?? c))\n return `<!doctype html><meta charset=\"utf-8\"><title>botapp · CLI auth failed</title>\n<style>body{font-family:ui-monospace,Menlo,monospace;background:#0b0b0d;color:#eee;display:grid;place-items:center;min-height:100vh;margin:0}.c{border:1px solid #333;padding:2rem 2.5rem;max-width:520px}</style>\n<div class=\"c\"><h1>CLI auth failed</h1><p>${safe}</p></div>`\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === 'string' ? v : undefined\n}\n\nfunction readJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n let total = 0\n req.on('data', (c: Buffer) => {\n total += c.length\n // 64KB cap — the payload is a handful of short strings.\n if (total > 64 * 1024) {\n reject(new Error('payload too large'))\n req.destroy()\n return\n }\n chunks.push(c)\n })\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf-8')\n if (!raw) return resolve(null)\n try {\n resolve(JSON.parse(raw))\n } catch (e) {\n reject(e)\n }\n })\n req.on('error', reject)\n })\n}\n\nfunction openUrl(url: string): void {\n const cmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open'\n const args = process.platform === 'win32' ? ['/c', 'start', '\"\"', url] : [url]\n try {\n spawn(cmd, args, { stdio: 'ignore', detached: true }).unref()\n } catch {\n // Silent — the URL was already printed to the terminal.\n }\n}\n","import { spawnSync } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { resolve } from 'node:path'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { loadDaemonProfile } from '../config/daemon'\n\ninterface DaemonAgentCandidate {\n name: string\n kind: string\n command: string\n path: string\n}\n\ninterface RegisteredDaemonAgent {\n id: string\n name: string\n kind: string\n command: string\n args: string[]\n cwd: string | null\n env: Record<string, string> | null\n}\n\ninterface AgentSpec {\n name: string\n kind: string\n command: string\n}\n\nconst LOCAL_AGENT_SPECS: AgentSpec[] = [\n { name: 'codex', kind: 'codex', command: 'codex' },\n { name: 'claude', kind: 'claude-code', command: 'claude' },\n { name: 'openclaw', kind: 'openclaw', command: 'openclaw' },\n { name: 'hermes', kind: 'hermes-agent', command: 'hermes' },\n]\n\n/**\n * Auto-detect every supported local agent CLI on PATH and register the ones\n * that aren't already known to the daemon. Shared with `bot launch` so a\n * first-time setup ends with a ready-to-run daemon in one command.\n * Returns { created, skipped, detected } counts so callers can print a tidy\n * one-line summary without re-scanning.\n */\nexport async function registerAllDetectedAgents(input: {\n server: string\n token: string\n cwd: string\n}): Promise<{\n created: string[]\n skipped: string[]\n detected: number\n}> {\n const detected = scanLocalDaemonAgents()\n if (detected.length === 0) return { created: [], skipped: [], detected: 0 }\n\n const existing = await daemonSelfRequest<{ agents?: RegisteredDaemonAgent[] }>(\n input.server,\n input.token,\n '/api/daemon/self/agents',\n )\n const registered = existing.agents ?? []\n const created: string[] = []\n const skipped: string[] = []\n const cwd = resolve(input.cwd)\n\n for (const candidate of detected) {\n if (registered.find((a) => a.name === candidate.name)) {\n skipped.push(candidate.name)\n continue\n }\n try {\n await daemonSelfRequest<{ agent: RegisteredDaemonAgent }>(\n input.server,\n input.token,\n '/api/daemon/self/agents',\n {\n method: 'POST',\n body: {\n name: candidate.name,\n kind: candidate.kind,\n command: candidate.command,\n args: [],\n cwd,\n env: null,\n },\n },\n )\n created.push(candidate.name)\n } catch {\n // Non-fatal — skip this agent, continue with the others.\n skipped.push(candidate.name)\n }\n }\n return { created, skipped, detected: detected.length }\n}\n\nexport function createDaemonAgentConfigCommand(): Command {\n return new Command('config')\n .description('Scan local agent CLIs and register selected daemon agents')\n .option('--all', 'Register every detected agent without prompting')\n .option('--agent <name...>', 'Register only these detected agent names, e.g. codex claude')\n .option('--cwd <cwd>', 'Working directory stored on registered daemon agents', process.cwd())\n .action(async (opts) => {\n await configureDaemonAgents({\n all: Boolean(opts.all),\n names: Array.isArray(opts.agent) ? opts.agent : [],\n cwd: opts.cwd,\n })\n })\n}\n\nasync function configureDaemonAgents(inputOpts: {\n all: boolean\n names: string[]\n cwd: string\n}): Promise<void> {\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return\n }\n\n const detected = scanLocalDaemonAgents()\n if (detected.length === 0) {\n console.log(pc.yellow('No supported local agent CLIs were found on PATH.'))\n console.log(pc.dim('Scanned: codex, claude, openclaw, hermes'))\n return\n }\n\n const existing = await daemonSelfRequest<{ agents?: RegisteredDaemonAgent[] }>(\n profile.server,\n profile.token,\n '/api/daemon/self/agents',\n )\n const registered = existing.agents ?? []\n const selected = await selectCandidates(detected, inputOpts)\n if (selected.length === 0) {\n console.log(pc.dim('No agents selected.'))\n return\n }\n\n const cwd = resolve(inputOpts.cwd)\n let created = 0\n let skipped = 0\n\n for (const candidate of selected) {\n const alreadyRegistered = registered.find((agent) => agent.name === candidate.name)\n if (alreadyRegistered) {\n skipped += 1\n console.log(\n pc.dim(\n `Skipping ${candidate.name}: already registered as ${alreadyRegistered.id}`,\n ),\n )\n continue\n }\n\n const data = await daemonSelfRequest<{ agent: RegisteredDaemonAgent }>(\n profile.server,\n profile.token,\n '/api/daemon/self/agents',\n {\n method: 'POST',\n body: {\n name: candidate.name,\n kind: candidate.kind,\n command: candidate.command,\n args: [],\n cwd,\n env: null,\n },\n },\n )\n created += 1\n console.log(\n pc.green(`Registered ${pc.bold(data.agent.name)}`) +\n pc.dim(` (${data.agent.kind}, ${data.agent.command}, cwd ${cwd})`),\n )\n }\n\n console.log(pc.green(`Done. Registered ${created}, skipped ${skipped}.`))\n}\n\nfunction scanLocalDaemonAgents(): DaemonAgentCandidate[] {\n const candidates: DaemonAgentCandidate[] = []\n for (const spec of LOCAL_AGENT_SPECS) {\n const path = findExecutable(spec.command)\n if (!path) continue\n candidates.push({ ...spec, path })\n }\n return candidates\n}\n\nfunction findExecutable(command: string): string | null {\n const lookupCommand = process.platform === 'win32' ? 'where' : 'which'\n const result = spawnSync(lookupCommand, [command], {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n if (result.status !== 0) return null\n return result.stdout.split(/\\r?\\n/).find((line) => line.trim())?.trim() ?? null\n}\n\nasync function selectCandidates(\n detected: DaemonAgentCandidate[],\n opts: { all: boolean; names: string[] },\n): Promise<DaemonAgentCandidate[]> {\n if (opts.all) return detected\n\n const requested = new Set(opts.names.map((name) => name.toLowerCase()))\n if (requested.size > 0) {\n const selected = detected.filter((candidate) => requested.has(candidate.name.toLowerCase()))\n const missing = [...requested].filter(\n (name) => !detected.some((candidate) => candidate.name.toLowerCase() === name),\n )\n for (const name of missing) {\n console.log(pc.yellow(`Not detected on PATH: ${name}`))\n }\n return selected\n }\n\n if (!process.stdin.isTTY) {\n console.error(pc.red('Interactive selection requires a TTY. Use --all or --agent <name...>.'))\n process.exitCode = 1\n return []\n }\n\n console.log(pc.bold('Detected local agents:'))\n detected.forEach((candidate, index) => {\n console.log(\n ` ${index + 1}. ${pc.bold(candidate.name)} ` +\n pc.dim(`${candidate.kind} / ${candidate.command} / ${candidate.path}`),\n )\n })\n\n const rl = createInterface({ input, output })\n try {\n const answer = await rl.question(\n 'Select agents to register (comma-separated numbers, \"all\", or empty for all): ',\n )\n const value = answer.trim().toLowerCase()\n if (!value || value === 'all' || value === 'a') return detected\n if (value === 'none' || value === 'n') return []\n\n const indexes = new Set(\n value\n .split(',')\n .map((part) => Number(part.trim()))\n .filter((index) => Number.isInteger(index) && index >= 1 && index <= detected.length),\n )\n return detected.filter((_, index) => indexes.has(index + 1))\n } finally {\n rl.close()\n }\n}\n\nasync function daemonSelfRequest<T>(\n server: string,\n token: string,\n path: string,\n opts?: { method?: string; body?: unknown },\n): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n }\n if (opts?.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n const res = await fetch(`${server}${path}`, {\n method: opts?.method ?? 'GET',\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) {\n throw new Error(data.error ?? data.message ?? res.statusText)\n }\n return data as T\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken } from '../config/server'\nimport { createClient } from '../client/http'\n\nexport const appsCommand = new Command('apps')\n .description('List installed apps')\n .option('--json', 'Output as JSON')\n .action(async (opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n const client = createClient(serverUrl, token)\n\n try {\n const data = await client.listApps()\n const apps = data.apps ?? []\n\n if (opts.json || globalOpts.json) {\n console.log(JSON.stringify(apps, null, 2))\n return\n }\n\n if (apps.length === 0) {\n console.log(pc.yellow('No apps installed'))\n return\n }\n\n for (const app of apps) {\n const status =\n app.status === 'running'\n ? pc.green('●')\n : app.status === 'errored'\n ? pc.red('●')\n : pc.gray('○')\n\n console.log(`${status} ${pc.bold(app.name)} v${app.version}`)\n if (app.description) {\n console.log(` ${pc.dim(app.description)}`)\n }\n if (app.commands?.length > 0) {\n console.log(\n ` Commands: ${app.commands.map((c: any) => pc.cyan(c.name)).join(', ')}`,\n )\n }\n if (app.actions?.length > 0) {\n console.log(\n ` Actions: ${app.actions.map((a: any) => pc.yellow(a.name)).join(', ')}`,\n )\n }\n console.log()\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { authHeaders } from '../config/server'\n\nexport interface ApiError {\n error: string\n status?: number\n}\n\nasync function request(\n url: string,\n method: string,\n token?: string,\n body?: any,\n): Promise<any> {\n let res: Response\n try {\n res = await fetch(url, {\n method,\n headers: authHeaders(token),\n body: body ? JSON.stringify(body) : undefined,\n })\n } catch (e: any) {\n // Node's fetch throws \"fetch failed\" for any network-level failure;\n // the real reason (ECONNREFUSED, ENOTFOUND, timeout, ...) lives in\n // the `cause` chain. Surface it so the CLI user knows what to fix.\n const cause = e?.cause\n const code = cause?.code\n const parsed = (() => {\n try {\n return new URL(url)\n } catch {\n return null\n }\n })()\n const origin = parsed ? `${parsed.protocol}//${parsed.host}` : url\n\n let hint = ''\n if (code === 'ECONNREFUSED') {\n hint = ` — nothing is listening on ${origin}. Run \\`bot server start\\` to pick a server, or point at a different one with \\`-s <url>\\` or BOTAPP_SERVER.`\n } else if (code === 'ENOTFOUND') {\n hint = ` — cannot resolve host ${parsed?.hostname ?? origin}. Check the URL in ~/.botapp/config.yaml.`\n } else if (code === 'ETIMEDOUT' || code === 'UND_ERR_CONNECT_TIMEOUT') {\n hint = ` — connection to ${origin} timed out.`\n } else if (code) {\n hint = ` (${code})`\n } else if (cause?.message) {\n hint = ` — ${cause.message}`\n }\n\n throw new Error(`Cannot reach ${origin}${hint}`)\n }\n\n const data = await res.json().catch(() => null)\n\n if (!res.ok) {\n const msg = data?.error ?? data?.message ?? `HTTP ${res.status}`\n throw Object.assign(new Error(msg), { status: res.status })\n }\n\n return data\n}\n\nexport function createClient(serverUrl: string, token?: string) {\n return {\n async health() {\n return request(`${serverUrl}/health`, 'GET')\n },\n\n async listApps() {\n return request(`${serverUrl}/api/apps`, 'GET', token)\n },\n\n async getApp(name: string) {\n return request(`${serverUrl}/api/apps/${name}`, 'GET', token)\n },\n\n async runCommand(app: string, command: string, params: Record<string, any>) {\n return request(\n `${serverUrl}/api/apps/${app}/commands/${command}`,\n 'POST',\n token,\n params,\n )\n },\n\n async runAction(app: string, action: string, params: Record<string, any>) {\n return request(\n `${serverUrl}/api/apps/${app}/actions/${action}`,\n 'POST',\n token,\n params,\n )\n },\n }\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken } from '../config/server'\nimport { createClient } from '../client/http'\n\nexport const runCommand = new Command('run')\n .description('Run an app command')\n .argument('<app>', 'App name')\n .argument('<command>', 'Command name')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(async (appName, commandName, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n const client = createClient(serverUrl, token)\n\n const params = parseKwargs(process.argv.slice(process.argv.indexOf(commandName) + 1))\n\n try {\n const data = await client.runCommand(appName, commandName, params)\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else if (data.status === 'success') {\n console.log(data.result)\n } else {\n console.error(pc.red(`Error: ${data.error}`))\n process.exitCode = 1\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nfunction parseKwargs(args: string[]): Record<string, any> {\n const params: Record<string, any> = {}\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n\n if (!next || next.startsWith('--')) {\n params[key] = true\n } else {\n const num = Number(next)\n params[key] = isNaN(num) ? next : num\n i++\n }\n }\n }\n\n return params\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { updateActiveProfile } from '../config/profile'\nimport { resolveServerUrl } from '../config/server'\n\nexport const loginCommand = new Command('login')\n .description('Login to a botapp server')\n .option('-s, --server <url>', 'Server URL')\n .action(async (opts) => {\n const serverUrl = resolveServerUrl(opts.server)\n console.log(`Connecting to ${pc.cyan(serverUrl)}...`)\n\n try {\n const res = await fetch(`${serverUrl}/health`)\n if (!res.ok) {\n console.error(pc.red(`Server returned ${res.status}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json()\n\n if (data.token) {\n updateActiveProfile({\n server: serverUrl,\n token: data.token,\n user_id: 'local',\n agent_id: 'local-agent',\n })\n console.log(pc.green('Logged in successfully'))\n console.log(` Server: ${pc.cyan(serverUrl)}`)\n console.log(` Mode: ${data.mode}`)\n console.log(` Token: ${pc.dim(data.token.slice(0, 12) + '...')}`)\n } else {\n console.log(pc.yellow('Server did not return a token (hosted mode login not yet implemented)'))\n }\n } catch (e: any) {\n const code = e?.cause?.code\n const extra =\n code === 'ECONNREFUSED'\n ? ` — nothing is listening. Run \\`bot server start\\` to pick a server, or set BOTAPP_SERVER to point at a running instance.`\n : code === 'ENOTFOUND'\n ? ` — cannot resolve hostname. Check the URL.`\n : code\n ? ` (${code})`\n : ''\n console.error(pc.red(`Cannot reach ${serverUrl}${extra}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport { resolve, basename } from 'node:path'\nimport { existsSync, mkdirSync, symlinkSync, cpSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nconst APPS_DIR = join(homedir(), '.botapp', 'apps')\n\nexport const installCommand = new Command('install')\n .description('Install an app from a local path')\n .argument('<path>', 'Path to the app directory')\n .option('--dev', 'Install in dev mode (symlink)')\n .action(async (appPath, opts) => {\n const absPath = resolve(appPath)\n\n if (!existsSync(absPath)) {\n console.error(pc.red(`Path not found: ${absPath}`))\n process.exitCode = 1\n return\n }\n\n const manifestPath = join(absPath, 'botapp.app.json')\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`No botapp.app.json found in ${absPath}`))\n process.exitCode = 1\n return\n }\n\n let manifest: any\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n console.error(pc.red('Failed to parse botapp.app.json'))\n process.exitCode = 1\n return\n }\n\n const appName = manifest.name || basename(absPath)\n const targetDir = join(APPS_DIR, appName)\n\n mkdirSync(APPS_DIR, { recursive: true })\n\n if (existsSync(targetDir)) {\n console.log(pc.yellow(`App \"${appName}\" is already installed. Reinstalling...`))\n const { rmSync } = await import('node:fs')\n rmSync(targetDir, { recursive: true, force: true })\n }\n\n if (opts.dev) {\n symlinkSync(absPath, targetDir, 'dir')\n console.log(pc.green(`Installed ${pc.bold(appName)} in dev mode (symlink)`))\n console.log(` ${pc.dim(absPath)} → ${pc.dim(targetDir)}`)\n } else {\n cpSync(absPath, targetDir, { recursive: true })\n console.log(pc.green(`Installed ${pc.bold(appName)}`))\n console.log(` ${pc.dim(targetDir)}`)\n }\n\n console.log(pc.dim('Restart the server to load the new app.'))\n })\n","import { Command } from 'commander'\nimport { existsSync, rmSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nconst APPS_DIR = join(homedir(), '.botapp', 'apps')\n\nexport const uninstallCommand = new Command('uninstall')\n .description('Uninstall an app')\n .argument('<name>', 'App name to uninstall')\n .action(async (name) => {\n const targetDir = join(APPS_DIR, name)\n\n if (!existsSync(targetDir)) {\n console.error(pc.red(`App \"${name}\" is not installed`))\n process.exitCode = 1\n return\n }\n\n rmSync(targetDir, { recursive: true, force: true })\n console.log(pc.green(`Uninstalled ${pc.bold(name)}`))\n console.log(pc.dim('Restart the server to apply changes.'))\n })\n","import { Command } from 'commander'\nimport { resolve, basename, join } from 'node:path'\nimport { existsSync, mkdirSync, symlinkSync, readFileSync, lstatSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { spawn } from 'node:child_process'\nimport pc from 'picocolors'\nimport { resolveServerUrl } from '../config/server'\n\nconst APPS_DIR = join(homedir(), '.botapp', 'apps')\n\nexport const devCommand = new Command('dev')\n .description('Start development mode for an app')\n .argument('[path]', 'Path to the app directory', '.')\n .option('-p, --port <port>', 'Server port', '7100')\n .action(async (appPath, opts) => {\n const absPath = resolve(appPath)\n\n if (!existsSync(absPath)) {\n console.error(pc.red(`Path not found: ${absPath}`))\n process.exitCode = 1\n return\n }\n\n const manifestPath = join(absPath, 'botapp.app.json')\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`No botapp.app.json found in ${absPath}`))\n process.exitCode = 1\n return\n }\n\n let manifest: any\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n console.error(pc.red('Failed to parse botapp.app.json'))\n process.exitCode = 1\n return\n }\n\n const appName = manifest.name || basename(absPath)\n const targetDir = join(APPS_DIR, appName)\n\n mkdirSync(APPS_DIR, { recursive: true })\n\n if (!existsSync(targetDir)) {\n symlinkSync(absPath, targetDir, 'dir')\n console.log(pc.blue(`Linked ${pc.bold(appName)} → ${pc.dim(absPath)}`))\n } else {\n const stat = lstatSync(targetDir)\n if (stat.isSymbolicLink()) {\n console.log(pc.dim(`${appName} already linked`))\n } else {\n console.log(pc.yellow(`${appName} is installed (not symlinked). Using existing installation.`))\n }\n }\n\n const serverUrl = resolveServerUrl()\n let serverRunning = false\n try {\n const res = await fetch(`${serverUrl}/health`)\n serverRunning = res.ok\n } catch {\n // not running\n }\n\n if (serverRunning) {\n console.log(pc.green(`Server already running at ${serverUrl}`))\n console.log(pc.yellow('Restart the server to load the new app.'))\n } else {\n const serverEntry = findServerEntry()\n if (!serverEntry) {\n console.log(\n pc.yellow('No local server found.') +\n ` App ${pc.bold(appName)} has been linked to ${pc.dim(targetDir)}\\n` +\n `\\nStart the server separately, then restart it to load the app:\\n` +\n ` ${pc.cyan('bot server start')}`,\n )\n return\n }\n\n console.log(pc.blue('Starting botapp server...'))\n\n const child = spawn('node', ['--import', 'tsx', serverEntry], {\n env: { ...process.env, PORT: opts.port },\n stdio: 'inherit',\n })\n\n child.on('exit', (code) => {\n process.exitCode = code ?? 0\n })\n\n process.on('SIGINT', () => {\n child.kill('SIGINT')\n })\n }\n })\n\nfunction findServerEntry(): string | null {\n const candidates = [\n resolve(process.cwd(), 'packages/server/src/index.ts'),\n resolve(process.cwd(), '../server/src/index.ts'),\n ]\n for (const c of candidates) {\n if (existsSync(c)) return c\n }\n return null\n}\n","import { Command } from 'commander'\nimport { WebSocket } from 'ws'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken } from '../config/server'\n\nexport const connectCommand = new Command('connect')\n .description('Open a persistent WebSocket connection and stream events')\n .option('--subscribe <patterns>', 'Comma-separated event patterns to subscribe to', '*')\n .action(async (opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n const wsUrl = serverUrl.replace(/^http/, 'ws')\n const url = token\n ? `${wsUrl}/ws/agent?token=${token}`\n : `${wsUrl}/ws/agent`\n\n console.log(pc.blue(`Connecting to ${serverUrl}...`))\n\n const ws = new WebSocket(url)\n\n ws.on('open', () => {\n console.log(pc.green('Connected'))\n\n const patterns = opts.subscribe.split(',').map((p: string) => p.trim())\n ws.send(JSON.stringify({\n type: 'subscribe',\n patterns,\n }))\n })\n\n ws.on('message', (raw) => {\n try {\n const frame = JSON.parse(raw.toString())\n\n switch (frame.type) {\n case 'subscribed':\n console.log(pc.dim(`Subscribed to: ${frame.patterns.join(', ')}`))\n break\n\n case 'event': {\n const e = frame.event\n const ts = new Date(e.timestamp).toLocaleTimeString()\n const status = e.result?.status === 'success'\n ? pc.green('✓')\n : pc.red('✗')\n console.log(\n `${pc.dim(ts)} ${status} ${pc.bold(e.app)}.${e.action} [${e.source}]` +\n (e.duration_ms != null ? pc.dim(` ${e.duration_ms}ms`) : ''),\n )\n if (globalOpts.verbose && e.result) {\n console.log(pc.dim(` → ${JSON.stringify(e.result)}`))\n }\n break\n }\n\n case 'result':\n if (frame.status === 'success') {\n console.log(pc.green(`Result: ${JSON.stringify(frame.output)}`))\n } else {\n console.log(pc.red(`Error: ${frame.error}`))\n }\n break\n\n case 'pong':\n break\n\n case 'error':\n console.log(pc.red(`Server error: ${frame.message}`))\n break\n\n default:\n if (globalOpts.verbose) {\n console.log(pc.dim(JSON.stringify(frame)))\n }\n }\n } catch {\n console.log(pc.dim(raw.toString()))\n }\n })\n\n ws.on('close', (code, reason) => {\n console.log(pc.yellow(`Disconnected (${code}: ${reason.toString() || 'no reason'})`))\n process.exit(0)\n })\n\n ws.on('error', (err) => {\n console.error(pc.red(`WebSocket error: ${err.message}`))\n process.exit(1)\n })\n\n // Keep alive\n const pingInterval = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'ping' }))\n }\n }, 30000)\n\n process.on('SIGINT', () => {\n clearInterval(pingInterval)\n ws.close()\n })\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\nimport { createClient } from '../client/http'\n\nexport const eventsCommand = new Command('events')\n .description('Fetch recent events')\n .option('--app <name>', 'Filter by app name')\n .option('--since <timestamp>', 'Show events since ISO timestamp')\n .option('--limit <n>', 'Max events to return', '20')\n .option('--json', 'Output as JSON')\n .action(async (opts, cmd) => {\n const globalOpts = { ...(cmd.parent?.opts() ?? {}), ...opts }\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n const params = new URLSearchParams()\n if (opts.app) params.set('app', opts.app)\n if (opts.since) params.set('since', opts.since)\n if (opts.limit) params.set('limit', opts.limit)\n\n const url = `${serverUrl}/api/events?${params.toString()}`\n\n try {\n const res = await fetch(url, {\n headers: {\n ...authHeaders(token),\n },\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as { events: any[] }\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n if (data.events.length === 0) {\n console.log(pc.dim('No events found'))\n return\n }\n\n for (const e of data.events.reverse()) {\n const ts = new Date(e.timestamp).toLocaleTimeString()\n const status = e.result?.status === 'success'\n ? pc.green('✓')\n : pc.red('✗')\n console.log(\n `${pc.dim(ts)} ${status} ${pc.bold(e.app)}.${e.action} [${e.source}]` +\n (e.duration_ms != null ? pc.dim(` ${e.duration_ms}ms`) : ''),\n )\n if (globalOpts.verbose && e.result) {\n console.log(pc.dim(` → ${JSON.stringify(e.result)}`))\n }\n }\n\n console.log(pc.dim(`\\n${data.events.length} event(s)`))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const agentCommand = new Command('agent')\n .description('Manage agents')\n\nagentCommand\n .command('list')\n .description('List agents for current user')\n .action(async (_opts, cmd) => {\n const globalOpts = cmd.parent?.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/auth/agents`, {\n headers: authHeaders(token),\n })\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n const data = await res.json() as { agents: any[] }\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n if (data.agents.length === 0) {\n console.log(pc.dim('No agents'))\n return\n }\n\n for (const agent of data.agents) {\n console.log(`${pc.bold(agent.name)} ${pc.dim(`(${agent.id})`)}`)\n console.log(` Token: ${pc.dim(agent.token)}`)\n console.log(` Created: ${pc.dim(agent.createdAt)}`)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nagentCommand\n .command('create')\n .description('Create a new agent')\n .argument('<name>', 'Agent name')\n .action(async (name, _opts, cmd) => {\n const globalOpts = cmd.parent?.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/auth/agents`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({ name }),\n })\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n const data = await res.json() as { agent: any }\n\n console.log(pc.green(`Created agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n console.log(` Token: ${data.agent.token}`)\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nagentCommand\n .command('info')\n .description('Show current user and agent info')\n .action(async (_opts, cmd) => {\n const globalOpts = cmd.parent?.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/auth/me`, {\n headers: authHeaders(token),\n })\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n const data = await res.json() as any\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n console.log(`User: ${pc.bold(data.user.email)} ${pc.dim(`(${data.user.id})`)}`)\n console.log(`Agent: ${pc.bold(data.currentAgent.name)} ${pc.dim(`(${data.currentAgent.id})`)}`)\n if (data.agents.length > 1) {\n console.log(`\\nAll agents:`)\n for (const a of data.agents) {\n const current = a.id === data.currentAgent.id ? pc.green(' (current)') : ''\n console.log(` ${pc.bold(a.name)} ${pc.dim(a.id)}${current}`)\n }\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport { readFileSync, existsSync } from 'node:fs'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const registerCommand = new Command('register')\n .description('Register an external app via HTTP bridge manifest')\n .argument('<manifest>', 'Path to YAML manifest file')\n .option('--adapter <url>', 'Override base URL from manifest')\n .action(async (manifestPath, opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`Error: Manifest not found: ${manifestPath}`))\n process.exitCode = 1\n return\n }\n\n try {\n const raw = readFileSync(manifestPath, 'utf-8')\n\n const res = await fetch(`${serverUrl}/api/bridges/http`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({\n manifest: raw,\n adapterUrl: opts.adapter,\n }),\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as any\n console.log(pc.green(`Registered bridge: ${pc.bold(data.name)}`))\n if (data.commands?.length > 0) {\n console.log(` Commands: ${data.commands.join(', ')}`)\n }\n if (data.actions?.length > 0) {\n console.log(` Actions: ${data.actions.join(', ')}`)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport { readFileSync, existsSync } from 'node:fs'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const wrapCommand = new Command('wrap')\n .description('Register CLI tool as app commands via YAML manifest')\n .argument('<manifest>', 'Path to CLI wrapper YAML manifest')\n .action(async (manifestPath, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`Error: Manifest not found: ${manifestPath}`))\n process.exitCode = 1\n return\n }\n\n try {\n const raw = readFileSync(manifestPath, 'utf-8')\n\n const res = await fetch(`${serverUrl}/api/bridges/cli`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({ manifest: raw }),\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as any\n console.log(pc.green(`Wrapped CLI: ${pc.bold(data.name)}`))\n if (data.commands?.length > 0) {\n console.log(` Commands: ${data.commands.join(', ')}`)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const reloadCommand = new Command('reload')\n .description('Reload an app')\n .argument('<app>', 'App name to reload')\n .action(async (appName, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/api/apps/${appName}/reload`, {\n method: 'POST',\n headers: authHeaders(token),\n body: '{}',\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as any\n console.log(pc.green(`Reloaded: ${pc.bold(data.name)} (${data.status})`))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nexport const configCommand = new Command('config')\n .description('View or set app configuration')\n .argument('[app]', 'App name')\n .argument('[key]', 'Config key')\n .argument('[value]', 'Config value (omit to read)')\n .action(async (appName, key, value, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n if (!appName) {\n // Show server config\n try {\n const res = await fetch(`${serverUrl}/api/config`, {\n headers: authHeaders(token),\n })\n const data = await res.json()\n console.log(JSON.stringify(data, null, 2))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n return\n }\n\n if (!key) {\n // Show app info\n try {\n const res = await fetch(`${serverUrl}/api/apps/${appName}`, {\n headers: authHeaders(token),\n })\n if (!res.ok) {\n console.error(pc.red(`App not found: ${appName}`))\n process.exitCode = 1\n return\n }\n const data = await res.json()\n console.log(JSON.stringify(data, null, 2))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n return\n }\n\n console.log(pc.dim(`Config management for ${appName}.${key}${value ? ` = ${value}` : ''}`))\n console.log(pc.dim('(Config persistence coming in a future update)'))\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\nimport { createClient } from '../client/http'\n\ninterface SkillJson {\n name: string\n description: string\n source: 'file' | 'url' | 'convention' | 'auto'\n sourceUrl: string | null\n warning: string | null\n authorContent: string | null\n schemaContent: string\n full: string\n}\n\nasync function fetchSkill(\n serverUrl: string,\n token: string | undefined,\n appName: string,\n opts: { json?: boolean; refresh?: boolean },\n): Promise<SkillJson | string> {\n const qs = new URLSearchParams()\n if (opts.json) qs.set('format', 'json')\n if (opts.refresh) qs.set('refresh', '1')\n const url = `${serverUrl}/api/apps/${appName}/skill${qs.toString() ? `?${qs}` : ''}`\n\n let res: Response\n try {\n res = await fetch(url, { headers: authHeaders(token) })\n } catch (e: any) {\n const code = e?.cause?.code\n const hint =\n code === 'ECONNREFUSED'\n ? ` — nothing is listening. Run \\`bot server start\\` to pick a server, or set BOTAPP_SERVER to point at a running instance.`\n : code\n ? ` (${code})`\n : ''\n throw new Error(`Cannot reach ${serverUrl}${hint}`)\n }\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n throw new Error((body as any)?.error ?? `HTTP ${res.status}`)\n }\n\n if (opts.json) {\n return (await res.json()) as SkillJson\n }\n return await res.text()\n}\n\nconst skillSingle = new Command('skill')\n .description(\"Fetch an app's skill doc (agent-facing narrative + reference)\")\n .argument('[app]', 'App name. Omit to list all apps with their skill source.')\n .option('--json', \"Emit structured JSON instead of markdown\")\n .option('--refresh', 'Bypass the server-side URL cache')\n .option('--bundle', 'When no app given, print every app as one big markdown doc')\n .action(async (appName: string | undefined, opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n // No app: list mode (or bundle mode).\n if (!appName) {\n const client = createClient(serverUrl, token)\n const data = await client.listApps()\n const apps = (data.apps ?? []) as Array<{\n name: string\n description?: string\n skill?: string\n }>\n\n if (opts.bundle) {\n const chunks: string[] = [\n '# botapp server — app skills bundle',\n '',\n `_Generated from ${serverUrl}. ${apps.length} app(s)._`,\n '',\n '---',\n '',\n ]\n for (const app of apps) {\n try {\n const md = (await fetchSkill(serverUrl, token, app.name, {})) as string\n chunks.push(md, '', '---', '')\n } catch (e: any) {\n chunks.push(\n `# ${app.name}`,\n '',\n `> (failed to load: ${e.message})`,\n '',\n '---',\n '',\n )\n }\n }\n console.log(chunks.join('\\n'))\n return\n }\n\n if (globalOpts.json || opts.json) {\n console.log(JSON.stringify(apps, null, 2))\n return\n }\n\n if (apps.length === 0) {\n console.log(pc.yellow('No apps installed'))\n return\n }\n\n console.log(pc.bold('App skills:'))\n console.log()\n for (const app of apps) {\n const src = app.skill\n ? /^https?:\\/\\//i.test(app.skill)\n ? pc.cyan(app.skill)\n : pc.green(app.skill)\n : pc.dim('(none declared — fallback to ./SKILL.md or auto-gen)')\n console.log(\n ` ${pc.bold(app.name)}${pc.dim(` — ${app.description ?? ''}`)}`,\n )\n console.log(` skill: ${src}`)\n }\n console.log()\n console.log(\n pc.dim(\n `Run \\`bot skill <app>\\` to fetch one, or \\`bot skill --bundle\\` for everything.`,\n ),\n )\n return\n }\n\n // Specific app.\n const wantJson = globalOpts.json || opts.json\n const result = await fetchSkill(serverUrl, token, appName, {\n json: wantJson,\n refresh: opts.refresh,\n })\n\n if (wantJson) {\n console.log(JSON.stringify(result, null, 2))\n } else {\n console.log(result)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n .addHelpText(\n 'after',\n `\nExamples:\n $ bot skill List every app with its skill source\n $ bot skill trading Print the trading app's skill markdown\n $ bot skill trading --json Structured response (source, url, content)\n $ bot skill trading --refresh Bypass the 5-minute URL cache\n $ bot skill --bundle Print every app's skill in one markdown doc\n\nSources, in lookup order:\n manifest.skill (URL) Fetched, cached 5 min\n manifest.skill (path) Read from disk relative to the app's manifest\n ./SKILL.md (convention) Read if no manifest field\n auto Generated from registered commands/actions/widgets\n`,\n )\n\nexport const skillCommand = skillSingle\n","import { hostname } from 'node:os'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl } from '../config/server'\nimport { saveDaemonProfile } from '../config/daemon'\nimport { runBrowserAuth } from '../auth/browser-auth'\n\n/**\n * Pair this machine as a botapp daemon. Three ways in, picked in order:\n * 1. --token <jwt> — manual paste (air-gapped / fallback)\n * 2. local fast-path — server is localhost AND mode=local; mint a\n * pairing token via /api/daemon/pairing-tokens\n * as the `local` user (no browser needed)\n * 3. browser flow — loopback + /cli-auth in the dashboard; the\n * user approves in a real browser session\n */\nexport const pairingCommand = new Command('pairing')\n .alias('pair')\n .description('Pair this machine as a botapp daemon')\n .option('--token <token>', 'Pairing token (skip browser flow)')\n .option('--name <name>', 'Daemon name', hostname())\n .option('--app-url <url>', 'Dashboard URL (defaults to server URL)')\n .option('--no-browser', 'Error instead of opening a browser')\n .action(async (opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const name = opts.name\n\n try {\n const grant = await obtainPairingToken({\n serverUrl,\n appUrl: opts.appUrl,\n name,\n explicitToken: opts.token,\n allowBrowser: opts.browser !== false,\n })\n if (!grant) {\n console.error(\n pc.red(\n 'No pairing token and browser flow disabled. Pass --token, or drop --no-browser.',\n ),\n )\n process.exitCode = 1\n return\n }\n\n if (grant.userEmail) {\n console.log(pc.green(`Authenticated as ${pc.bold(grant.userEmail)}`))\n }\n\n const res = await fetch(`${serverUrl}/api/daemon/pair`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: grant.pairingToken,\n name,\n machine: hostname(),\n }),\n })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) {\n console.error(pc.red(`Error: ${data.error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n saveDaemonProfile({\n server: serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n })\n\n console.log(pc.green(`Paired daemon: ${pc.bold(data.daemon.name)}`))\n console.log(` ID: ${data.daemon.id}`)\n console.log(` Server: ${serverUrl}`)\n console.log(pc.dim('\\nNext: botapp daemon agent add codex --command codex'))\n console.log(pc.dim('Then: botapp daemon run'))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\ninterface Grant {\n pairingToken: string\n userEmail?: string\n}\n\nasync function obtainPairingToken(opts: {\n serverUrl: string\n appUrl?: string\n name: string\n explicitToken?: string\n allowBrowser: boolean\n}): Promise<Grant | null> {\n if (opts.explicitToken) return { pairingToken: opts.explicitToken }\n\n // Local fast-path: server is running in local mode on loopback. We can\n // authenticate as the `local` user directly with no browser involvement.\n const localToken = await tryLocalFastPath(opts.serverUrl, opts.name)\n if (localToken) return { pairingToken: localToken }\n\n if (!opts.allowBrowser) return null\n\n const appUrl = opts.appUrl ?? opts.serverUrl\n const result = await runBrowserAuth({\n serverUrl: opts.serverUrl,\n appUrl,\n scope: 'pair',\n name: opts.name,\n })\n if (!result.pairingToken) {\n throw new Error('server returned no pairing token')\n }\n return { pairingToken: result.pairingToken, userEmail: result.userEmail }\n}\n\nasync function tryLocalFastPath(\n serverUrl: string,\n name: string,\n): Promise<string | null> {\n let mode: string | null = null\n try {\n const res = await fetch(`${serverUrl}/health`, {\n signal: AbortSignal.timeout(3000),\n })\n if (!res.ok) return null\n const data = (await res.json().catch(() => ({}))) as { mode?: string }\n mode = data.mode ?? null\n } catch {\n return null\n }\n if (mode !== 'local') return null\n\n // Principal middleware resolves unauthenticated callers to the local user\n // in local mode, so POST /api/daemon/pairing-tokens works with no creds.\n try {\n const res = await fetch(`${serverUrl}/api/daemon/pairing-tokens`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n })\n if (!res.ok) return null\n const data = (await res.json().catch(() => ({}))) as { token?: string }\n return data.token ?? null\n } catch {\n return null\n }\n}\n","import { spawn } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { Command } from 'commander'\nimport { WebSocket } from 'ws'\nimport pc from 'picocolors'\nimport { loadDaemonProfile } from '../config/daemon'\nimport { createDaemonAgentConfigCommand } from './daemon-agent-config'\n\ninterface DaemonAgent {\n id: string\n name: string\n kind: string\n command: string\n args: string[]\n cwd: string | null\n env: Record<string, string> | null\n}\n\ninterface DaemonJob {\n id: string\n query: string\n daemonId: string\n conversationId?: string | null\n /** Provider-native session handle returned by the last turn in this\n * conversation. Adapters that support resume (e.g. claude-code) should\n * pass it back to the child process instead of starting fresh. */\n resumeSessionId?: string | null\n agent: DaemonAgent\n}\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0'\n id?: number | string\n method?: string\n params?: any\n result?: any\n error?: { code: number; message: string }\n}\n\ninterface CodexToolCall {\n id: string\n type: string\n status?: string\n command?: string\n output?: string\n exitCode?: number | null\n}\n\ninterface CodexRunResult {\n kind: 'codex'\n text: string\n messages: string[]\n toolCalls: CodexToolCall[]\n rawEvents: any[]\n}\n\ninterface ClaudeCodeToolCall {\n id: string\n name: string\n input?: any\n output?: string\n isError?: boolean\n}\n\ninterface ClaudeCodeRunResult {\n kind: 'claude-code'\n text: string\n messages: string[]\n toolCalls: ClaudeCodeToolCall[]\n /** Session id returned by `claude --output-format stream-json`. Used by\n * the server on the next turn to set `resumeSessionId` and re-enter the\n * same conversation via `claude --resume <id>`. */\n sessionId: string | null\n rawEvents: any[]\n}\n\ninterface OpenClawToolCall {\n id: string\n name: string\n arguments?: any\n messageId?: string\n output?: string\n isError?: boolean\n}\n\ninterface OpenClawRunResult {\n kind: 'openclaw'\n text: string\n messages: string[]\n toolCalls: OpenClawToolCall[]\n sessionId: string | null\n requestedSessionId: string | null\n sessionKey: string | null\n sessionFile: string | null\n rawEvents: any[]\n}\n\ninterface OpenClawTailState {\n startedAtMs: number\n sessionDir: string\n sessionStorePath: string\n requestedSessionId: string\n sessionKey: string | null\n sessionId: string | null\n sessionResolvedBy: 'key-fragment' | 'entry-session-id' | null\n initialOffsets: Map<string, number>\n selectedFile: string | null\n offset: number\n pending: string\n seenEventIds: Set<string>\n}\n\ninterface HermesToolCall {\n id: string\n name: string\n arguments?: any\n output?: string\n isError?: boolean\n}\n\ninterface HermesRunResult {\n kind: 'hermes'\n text: string\n messages: string[]\n toolCalls: HermesToolCall[]\n sessionId: string | null\n sessionFile: string | null\n rawMessages: any[]\n}\n\ninterface HermesTailState {\n startedAtMs: number\n sessionDir: string\n resumeSessionId: string | null\n initialMessageCounts: Map<string, number>\n selectedFile: string | null\n processedMessages: number\n}\n\ntype JobUpdateSink = (update: Record<string, any>) => void\n\nexport const daemonCommand = new Command('daemon')\n .description('Manage and run the local botapp daemon')\n\ndaemonCommand\n .command('run')\n .description('Run the local daemon and wait for server jobs')\n .action(async () => {\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return\n }\n\n await runDaemonConnectionLoop(profile)\n })\n\ndaemonCommand\n .command('stop')\n .description('Stop the background daemon started by `bot launch`')\n .action(async () => {\n const pidFile = join(homedir(), '.botapp', 'daemon.pid')\n if (!existsSync(pidFile)) {\n console.log(pc.yellow('No background daemon PID file found.'))\n return\n }\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10)\n if (!Number.isInteger(pid) || pid <= 0) {\n console.error(pc.red(`Invalid PID in ${pidFile}`))\n process.exitCode = 1\n return\n }\n process.kill(pid, 'SIGTERM')\n console.log(pc.green(`Stopped daemon (pid ${pid})`))\n } catch (e: any) {\n console.error(pc.red(`Failed to stop daemon: ${e.message}`))\n process.exitCode = 1\n }\n })\n\ndaemonCommand\n .command('agent')\n .description('Manage agents hosted by this daemon')\n .addCommand(\n new Command('list')\n .description('List registered daemon agents')\n .action(async () => {\n const profile = requireProfile()\n if (!profile) return\n const data = await daemonRequest(profile.server, profile.token, '/api/daemon/self/agents')\n for (const agent of data.agents ?? []) {\n console.log(`${pc.bold(agent.name)} ${pc.dim(`(${agent.id})`)}`)\n console.log(` Kind: ${agent.kind}`)\n console.log(` Command: ${agent.command} ${(agent.args ?? []).join(' ')}`)\n if (agent.cwd) console.log(` CWD: ${agent.cwd}`)\n }\n }),\n )\n .addCommand(createDaemonAgentConfigCommand())\n\n .addCommand(\n new Command('add')\n .description('Register a local agent command')\n .argument('<name>', 'Name, e.g. codex, claude-code, openclaw, hermes, or hermes-agent')\n .requiredOption('--command <command>', 'Executable command')\n .option(\n '--kind <kind>',\n 'Agent adapter kind: acp, codex, claude-code, openclaw, hermes, hermes-agent, or shell',\n 'acp',\n )\n .option('--arg <arg...>', 'Argument passed to the executable')\n .option('--cwd <cwd>', 'Working directory for the agent process')\n .option('--env <entry...>', 'Environment entries in KEY=VALUE form')\n .action(async (name, opts) => {\n const profile = requireProfile()\n if (!profile) return\n const env = parseEnv(opts.env ?? [])\n const data = await daemonRequest(\n profile.server,\n profile.token,\n '/api/daemon/self/agents',\n {\n method: 'POST',\n body: {\n name,\n kind: opts.kind,\n command: opts.command,\n args: opts.arg ?? [],\n cwd: opts.cwd,\n env,\n },\n },\n )\n console.log(pc.green(`Registered daemon agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n console.log(` Command: ${data.agent.command} ${(data.agent.args ?? []).join(' ')}`)\n }),\n )\n .addCommand(\n new Command('remove')\n .alias('rm')\n .description('Remove a daemon agent by id or name')\n .argument('<agent>', 'Daemon agent id or name')\n .action(async (agent) => {\n const profile = requireProfile()\n if (!profile) return\n const data = await daemonRequest(\n profile.server,\n profile.token,\n `/api/daemon/self/agents/${encodeURIComponent(agent)}`,\n { method: 'DELETE' },\n )\n console.log(pc.green(`Removed daemon agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n }),\n )\n\nasync function runDaemonConnectionLoop(\n profile: NonNullable<ReturnType<typeof loadDaemonProfile>>,\n): Promise<void> {\n const wsUrl = `${profile.server.replace(/^http/, 'ws')}/ws/daemon?token=${profile.token}`\n const baseRetryMs = envNumber(process.env, 'BOTAPP_DAEMON_RETRY_MS', 1000)\n const maxRetryMs = envNumber(process.env, 'BOTAPP_DAEMON_MAX_RETRY_MS', 30_000)\n let stopped = false\n let activeWs: WebSocket | null = null\n let retryMs = baseRetryMs\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n let resolveRetry: (() => void) | null = null\n\n const stop = () => {\n stopped = true\n if (activeWs && activeWs.readyState !== WebSocket.CLOSED) {\n activeWs.close()\n }\n if (retryTimer) {\n clearTimeout(retryTimer)\n retryTimer = null\n }\n resolveRetry?.()\n }\n\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n\n while (!stopped) {\n console.log(pc.blue(`Connecting daemon ${profile.daemonName} to ${profile.server}...`))\n const outcome = await runDaemonSocket(wsUrl, (ws) => {\n activeWs = ws\n })\n activeWs = null\n if (stopped) break\n\n const waitMs = outcome.opened ? baseRetryMs : retryMs\n retryMs = outcome.opened ? baseRetryMs : Math.min(retryMs * 2, maxRetryMs)\n console.log(pc.yellow(`Retrying daemon connection in ${Math.round(waitMs / 1000)}s...`))\n await new Promise<void>((resolveWait) => {\n resolveRetry = resolveWait\n retryTimer = setTimeout(() => {\n retryTimer = null\n resolveRetry = null\n resolveWait()\n }, waitMs)\n })\n }\n}\n\nfunction runDaemonSocket(\n wsUrl: string,\n setActiveWs: (ws: WebSocket) => void,\n): Promise<{ opened: boolean }> {\n return new Promise((resolveRun) => {\n const ws = new WebSocket(wsUrl)\n setActiveWs(ws)\n let opened = false\n let settled = false\n let ping: ReturnType<typeof setInterval> | null = null\n\n function finish(): void {\n if (settled) return\n settled = true\n if (ping) clearInterval(ping)\n resolveRun({ opened })\n }\n\n ws.on('open', () => {\n opened = true\n console.log(pc.green('Daemon connected'))\n ws.send(JSON.stringify({ type: 'daemon_ready' }))\n ping = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'ping' }))\n }, 30_000)\n })\n\n ws.on('message', (raw) => {\n void handleFrame(ws, raw.toString())\n })\n\n ws.on('close', (code, reason) => {\n console.log(pc.yellow(`Daemon disconnected (${code}: ${reason.toString() || 'no reason'})`))\n finish()\n })\n\n ws.on('error', (err) => {\n console.error(pc.red(`Daemon WebSocket error: ${err.message}`))\n if (!opened) {\n if (ws.readyState !== WebSocket.CLOSED) ws.terminate()\n finish()\n }\n })\n })\n}\n\nasync function handleFrame(ws: WebSocket, raw: string): Promise<void> {\n const frame = JSON.parse(raw)\n if (frame.type === 'daemon_job') {\n const job = frame.job as DaemonJob\n console.log(pc.blue(`Running ${job.agent.name} job ${job.id}`))\n ws.send(JSON.stringify({ type: 'daemon_job_started', jobId: job.id }))\n try {\n const result = await runAgentJob(job, (update) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({\n type: 'daemon_job_update',\n jobId: job.id,\n update,\n }))\n }\n })\n ws.send(JSON.stringify({\n type: 'daemon_job_result',\n jobId: job.id,\n status: 'succeeded',\n result,\n }))\n console.log(pc.green(`Completed job ${job.id}`))\n } catch (e: any) {\n ws.send(JSON.stringify({\n type: 'daemon_job_result',\n jobId: job.id,\n status: 'failed',\n error: e.message,\n }))\n console.error(pc.red(`Job ${job.id} failed: ${e.message}`))\n }\n return\n }\n\n if (frame.type === 'error') {\n console.error(pc.red(`Server error: ${frame.message}`))\n }\n}\n\nasync function runAgentJob(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n if (job.agent.kind === 'codex') {\n return runCodexAgent(job, update)\n }\n if (job.agent.kind === 'claude-code' || job.agent.kind === 'claude_code') {\n return runClaudeCodeAgent(job, update)\n }\n if (job.agent.kind === 'openclaw' || job.agent.kind === 'kimiclaw') {\n return runOpenClawAgent(job, update)\n }\n if (job.agent.kind === 'hermes' || job.agent.kind === 'hermes-agent') {\n return runHermesAgent(job, update)\n }\n if (job.agent.kind === 'shell') {\n return runShellAgent(job)\n }\n return runAcpAgent(job)\n}\n\nasync function runShellAgent(job: DaemonJob): Promise<string> {\n const child = spawn(job.agent.command, [...job.agent.args, job.query], {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n })\n let stdout = ''\n let stderr = ''\n child.stdout.on('data', (chunk) => {\n stdout += chunk.toString()\n })\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n const code = await new Promise<number | null>((resolve) => child.on('close', resolve))\n if (code !== 0) {\n throw new Error(stderr.trim() || `Agent exited with code ${code}`)\n }\n return stdout.trim()\n}\n\nasync function runCodexAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const args = [...job.agent.args]\n if (!args.includes('exec') && !args.includes('e')) {\n args.unshift('exec')\n }\n if (!args.includes('--json')) {\n args.push('--json')\n }\n if (!args.includes('--skip-git-repo-check')) {\n args.push('--skip-git-repo-check')\n }\n // Without this the child refuses to run `bot …` (or any model-proposed\n // command) in non-interactive mode — there's no terminal to approve on.\n // Skipped if the user already picked a sandbox/approval policy.\n if (!hasAnyFlag(args, [\n '--sandbox',\n '-s',\n '--ask-for-approval',\n '-a',\n '--full-auto',\n '--dangerously-bypass-approvals-and-sandbox',\n ])) {\n args.push('--dangerously-bypass-approvals-and-sandbox')\n }\n args.push(job.query)\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let stderr = ''\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const result: CodexRunResult = {\n kind: 'codex',\n text: '',\n messages: [],\n toolCalls: [],\n rawEvents: [],\n }\n const toolCalls = new Map<string, CodexToolCall>()\n\n function processLine(line: string): void {\n if (!line.trim()) return\n try {\n const event = JSON.parse(line)\n result.rawEvents.push(event)\n update({ kind: 'codex_event', event })\n if (event?.type === 'item.completed' && event.item?.type === 'agent_message') {\n if (typeof event.item.text === 'string') {\n result.messages.push(event.item.text)\n update({ kind: 'message', text: event.item.text })\n }\n }\n if (\n (event?.type === 'item.started' || event?.type === 'item.completed') &&\n typeof event.item?.id === 'string' &&\n event.item?.type &&\n event.item.type !== 'agent_message'\n ) {\n const existing: CodexToolCall = toolCalls.get(event.item.id) ?? {\n id: event.item.id,\n type: String(event.item.type),\n }\n const next: CodexToolCall = {\n ...existing,\n type: String(event.item.type),\n status: event.item.status ?? existing.status,\n command: event.item.command ?? existing.command,\n output: event.item.aggregated_output ?? event.item.output ?? existing.output,\n exitCode: event.item.exit_code ?? existing.exitCode,\n }\n toolCalls.set(event.item.id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n } catch {\n // Ignore non-JSON progress lines; raw stdout remains the fallback.\n }\n }\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', processLine)\n\n const code = await new Promise<number | null>((resolve) => child.on('close', resolve))\n if (code !== 0) {\n throw new Error(stderr.trim() || `Codex exited with code ${code}`)\n }\n\n result.text = result.messages.at(-1)?.trim() || ''\n result.toolCalls = [...toolCalls.values()]\n return JSON.stringify(result)\n}\n\n/**\n * Claude Code adapter.\n *\n * Runs `claude -p --output-format stream-json --verbose`, streams each line\n * as a JSON event, and maps:\n * - `system.subtype=init` → session_id capture\n * - `assistant.message.content[]` → text messages + tool_use\n * - `user.message.content[tool_result]`→ tool output\n * - `result.subtype=success|error` → final message text + session_id\n *\n * When the job carries a `resumeSessionId` (set by the server from the\n * previous succeeded turn in this conversationId), we pass `--resume <id>`\n * so Claude Code restores the prior conversation instead of starting\n * fresh. The returned envelope always includes `sessionId`, which the\n * server then surfaces as `resumeSessionId` on the next turn.\n */\nasync function runClaudeCodeAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const args = [...job.agent.args]\n if (!args.includes('-p') && !args.includes('--print')) {\n args.push('-p')\n }\n if (!args.includes('--output-format')) {\n args.push('--output-format', 'stream-json')\n }\n if (!args.includes('--verbose')) {\n args.push('--verbose')\n }\n // Without this the child denies `bot …` (or any tool use) in -p mode,\n // since there's no user around to approve. Skipped if the user already\n // chose a permission mode.\n if (!hasAnyFlag(args, [\n '--permission-mode',\n '--dangerously-skip-permissions',\n '--allow-dangerously-skip-permissions',\n ])) {\n args.push('--permission-mode', 'bypassPermissions')\n }\n const resume = job.resumeSessionId ?? job.agent.env?.CLAUDE_SESSION_ID ?? null\n if (resume && !args.includes('--resume')) {\n args.push('--resume', resume)\n }\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n // Feed the prompt over stdin so we don't hit argv length limits when\n // buildContext() prepends a big labeled block.\n child.stdin.write(job.query)\n child.stdin.end()\n\n let stderr = ''\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const result: ClaudeCodeRunResult = {\n kind: 'claude-code',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: resume,\n rawEvents: [],\n }\n const toolCalls = new Map<string, ClaudeCodeToolCall>()\n\n function captureSessionId(event: any): void {\n const id = event?.session_id ?? event?.sessionId\n if (typeof id === 'string' && id.length > 0) {\n result.sessionId = id\n }\n }\n\n function ingestAssistantContent(blocks: any[]): void {\n for (const block of blocks) {\n if (!block || typeof block !== 'object') continue\n if (block.type === 'text' && typeof block.text === 'string') {\n result.messages.push(block.text)\n update({ kind: 'message', text: block.text })\n }\n if (block.type === 'tool_use' && typeof block.id === 'string') {\n const existing: ClaudeCodeToolCall =\n toolCalls.get(block.id) ?? { id: block.id, name: String(block.name ?? 'tool') }\n const next: ClaudeCodeToolCall = {\n ...existing,\n name: String(block.name ?? existing.name ?? 'tool'),\n input: block.input ?? existing.input,\n }\n toolCalls.set(block.id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n }\n\n function ingestUserContent(blocks: any[]): void {\n for (const block of blocks) {\n if (!block || typeof block !== 'object') continue\n if (block.type !== 'tool_result') continue\n const id = block.tool_use_id\n if (typeof id !== 'string') continue\n const existing: ClaudeCodeToolCall = toolCalls.get(id) ?? { id, name: 'tool' }\n const output = typeof block.content === 'string'\n ? block.content\n : Array.isArray(block.content)\n ? block.content\n .map((item: any) => (typeof item?.text === 'string' ? item.text : ''))\n .join('')\n : undefined\n const next: ClaudeCodeToolCall = {\n ...existing,\n output: output ?? existing.output,\n isError: Boolean(block.is_error ?? existing.isError),\n }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n\n function processLine(line: string): void {\n if (!line.trim()) return\n let event: any\n try {\n event = JSON.parse(line)\n } catch {\n // Claude Code occasionally emits non-JSON noise; ignore it.\n return\n }\n result.rawEvents.push(event)\n update({ kind: 'claude_code_event', event })\n captureSessionId(event)\n\n if (event.type === 'assistant' && event.message?.content) {\n ingestAssistantContent(\n Array.isArray(event.message.content) ? event.message.content : [],\n )\n return\n }\n if (event.type === 'user' && event.message?.content) {\n ingestUserContent(\n Array.isArray(event.message.content) ? event.message.content : [],\n )\n return\n }\n if (event.type === 'result' && typeof event.result === 'string') {\n result.text = event.result\n }\n }\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', processLine)\n\n const code = await new Promise<number | null>((resolve) => child.on('close', resolve))\n if (code !== 0) {\n throw new Error(stderr.trim() || `Claude Code exited with code ${code}`)\n }\n\n if (!result.text) {\n result.text = result.messages.at(-1)?.trim() ?? ''\n }\n result.toolCalls = [...toolCalls.values()]\n return JSON.stringify(result)\n}\n\n/**\n * OpenClaw adapter.\n *\n * Runs `openclaw agent --message <query> --session-id <id> --verbose on`\n * by default, while allowing all flags to be overridden through the registered\n * daemon agent args. OpenClaw writes its structured transcript to\n * `~/.openclaw/agents/<agent>/sessions/*.jsonl`. We first watch\n * `sessions.json` until a store key contains the requested id, then use that\n * entry's real `sessionId` to select the JSONL transcript.\n *\n * Multi-turn chat stores that real `sessionId` in botapp. On the next turn,\n * OpenClaw resolves it back to the existing session key from `sessions.json`.\n */\nasync function runOpenClawAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const env = { ...process.env, ...(job.agent.env ?? {}) }\n const args = [...job.agent.args]\n\n if (!args.includes('agent')) {\n args.unshift('agent')\n }\n\n let usedPromptPlaceholder = false\n for (let i = 0; i < args.length; i++) {\n if (!args[i].includes('{prompt}')) continue\n args[i] = args[i].replaceAll('{prompt}', job.query)\n usedPromptPlaceholder = true\n }\n if (!usedPromptPlaceholder) {\n const promptArg = env.BOTAPP_OPENCLAW_PROMPT_ARG ?? env.OPENCLAW_PROMPT_ARG ?? '--message'\n if (promptArg) {\n args.push(promptArg, job.query)\n } else {\n args.push(job.query)\n }\n }\n\n let requestedSessionId = getFlagValue(args, '--session-id')\n if (!requestedSessionId) {\n requestedSessionId = job.resumeSessionId || `botapp-${randomUUID()}`\n args.push('--session-id', requestedSessionId)\n }\n\n if (!hasFlag(args, '--verbose')) {\n args.push('--verbose', 'on')\n }\n\n const sessionDir = resolveOpenClawSessionDir(args, env)\n const state: OpenClawTailState = {\n startedAtMs: Date.now(),\n sessionDir,\n sessionStorePath: join(sessionDir, 'sessions.json'),\n requestedSessionId,\n sessionKey: null,\n sessionId: null,\n sessionResolvedBy: null,\n initialOffsets: snapshotOpenClawSessionOffsets(sessionDir),\n selectedFile: null,\n offset: 0,\n pending: '',\n seenEventIds: new Set<string>(),\n }\n\n const result: OpenClawRunResult = {\n kind: 'openclaw',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: null,\n requestedSessionId,\n sessionKey: null,\n sessionFile: null,\n rawEvents: [],\n }\n const toolCalls = new Map<string, OpenClawToolCall>()\n let stderr = ''\n let stopPolling = false\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const stdout = createInterface({ input: child.stdout })\n stdout.on('line', () => {})\n\n const stderrReader = createInterface({ input: child.stderr })\n stderrReader.on('line', (line) => {\n if (!line.trim()) return\n stderr += `${line}\\n`\n })\n\n const pollIntervalMs = envNumber(env, 'BOTAPP_OPENCLAW_POLL_INTERVAL_MS', 500)\n const stableAfterExitMs = envNumber(env, 'BOTAPP_OPENCLAW_STABLE_AFTER_EXIT_MS', 1000)\n const timeoutMs = resolveOpenClawTimeoutMs(env)\n const tailTask = (async () => {\n while (!stopPolling) {\n readOpenClawSessionUpdates(state, result, toolCalls, update)\n await sleep(pollIntervalMs)\n }\n readOpenClawSessionUpdates(state, result, toolCalls, update, true)\n })()\n\n let code: number | null\n try {\n code = await waitForChild(child, timeoutMs, 'OpenClaw')\n await sleep(stableAfterExitMs)\n } finally {\n stopPolling = true\n await tailTask\n }\n\n if (state.pending.trim()) {\n handleOpenClawJsonlLine(state.pending.trim(), state, result, toolCalls, update)\n state.pending = ''\n }\n\n result.sessionFile = state.selectedFile\n result.toolCalls = [...toolCalls.values()]\n result.text = result.text || result.messages.at(-1)?.trim() || ''\n\n if (code !== 0) {\n throw new Error(stderr.trim() || `OpenClaw exited with code ${code}`)\n }\n if (!result.sessionId) {\n throw new Error(\n [\n 'OpenClaw completed, but the session key was not resolved from sessions.json.',\n `Session store: ${state.sessionStorePath}`,\n `Requested session id fragment: ${state.requestedSessionId}`,\n ].join('\\n'),\n )\n }\n if (!result.text && result.toolCalls.length === 0) {\n throw new Error(\n [\n 'OpenClaw completed, but no assistant message was found in session JSONL.',\n `Session directory: ${sessionDir}`,\n state.selectedFile ? `Selected session file: ${state.selectedFile}` : 'Selected session file: none',\n 'Check BOTAPP_OPENCLAW_SESSION_DIR, --agent, or the OpenClaw JSONL message format.',\n ].join('\\n'),\n )\n }\n\n return JSON.stringify(result)\n}\n\nfunction resolveOpenClawSessionDir(args: string[], env: NodeJS.ProcessEnv): string {\n const configured = env.BOTAPP_OPENCLAW_SESSION_DIR ?? env.OPENCLAW_SESSION_DIR\n if (configured) return expandPath(configured)\n\n const agentName = resolveOpenClawAgentName(args)\n return join(homedir(), '.openclaw', 'agents', agentName, 'sessions')\n}\n\nfunction resolveOpenClawAgentName(args: string[]): string {\n return getFlagValue(args, '--agent') ?? 'main'\n}\n\nfunction snapshotOpenClawSessionOffsets(sessionDir: string): Map<string, number> {\n const offsets = new Map<string, number>()\n for (const file of listOpenClawSessionFiles(sessionDir)) {\n try {\n offsets.set(file, statSync(file).size)\n } catch {\n // Ignore files that disappear while snapshotting.\n }\n }\n return offsets\n}\n\nfunction readOpenClawSessionUpdates(\n state: OpenClawTailState,\n result: OpenClawRunResult,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n final = false,\n): void {\n resolveOpenClawRealSessionId(state, result)\n if (!state.sessionId) return\n\n const selectedFile = state.selectedFile ?? selectOpenClawSessionFile(state)\n if (!selectedFile) return\n if (!state.selectedFile) {\n state.selectedFile = selectedFile\n state.offset = state.sessionResolvedBy === 'key-fragment'\n ? 0\n : state.initialOffsets.get(selectedFile) ?? 0\n }\n\n let data = ''\n try {\n const buffer = readFileSync(selectedFile)\n if (state.offset > buffer.length) state.offset = 0\n data = buffer.subarray(state.offset).toString('utf-8')\n state.offset = buffer.length\n } catch {\n return\n }\n\n if (!data && !final) return\n state.pending += data\n if (!state.pending) return\n\n const parts = state.pending.split('\\n')\n const completeLines = final || state.pending.endsWith('\\n') ? parts : parts.slice(0, -1)\n state.pending = final || state.pending.endsWith('\\n') ? '' : parts.at(-1) ?? ''\n\n for (const rawLine of completeLines) {\n const line = rawLine.trim()\n if (line) handleOpenClawJsonlLine(line, state, result, toolCalls, update)\n }\n}\n\nfunction resolveOpenClawRealSessionId(\n state: OpenClawTailState,\n result: OpenClawRunResult,\n): void {\n if (state.sessionId) return\n\n let parsed: any\n try {\n parsed = JSON.parse(readFileSync(state.sessionStorePath, 'utf-8'))\n } catch {\n return\n }\n if (!parsed || typeof parsed !== 'object') return\n\n let entry: any = null\n let sessionKey: string | null = null\n let resolvedBy: OpenClawTailState['sessionResolvedBy'] = null\n for (const candidateKey of Object.keys(parsed)) {\n if (!candidateKey.includes(state.requestedSessionId)) continue\n sessionKey = candidateKey\n entry = parsed[candidateKey]\n resolvedBy = 'key-fragment'\n break\n }\n\n if (!entry) {\n for (const [candidateKey, candidateEntry] of Object.entries(parsed)) {\n if (\n candidateEntry &&\n typeof candidateEntry === 'object' &&\n (candidateEntry as { sessionId?: unknown }).sessionId === state.requestedSessionId\n ) {\n sessionKey = candidateKey\n entry = candidateEntry\n resolvedBy = 'entry-session-id'\n break\n }\n }\n }\n\n const realSessionId = entry?.sessionId\n if (typeof realSessionId !== 'string' || !realSessionId.trim()) return\n\n state.sessionKey = sessionKey\n state.sessionId = realSessionId\n state.sessionResolvedBy = resolvedBy\n result.sessionKey = sessionKey\n result.sessionId = realSessionId\n}\n\nfunction selectOpenClawSessionFile(state: OpenClawTailState): string | null {\n const files = listOpenClawSessionFiles(state.sessionDir)\n if (files.length === 0) return null\n\n if (state.sessionId) {\n const exact = join(state.sessionDir, `${state.sessionId}.jsonl`)\n if (files.includes(exact)) return exact\n const matching = files.filter((file) => file.includes(state.sessionId ?? ''))\n if (matching.length > 0) return newestFile(matching)\n }\n\n if (files.length === 1) return files[0]\n\n const recent = files.filter((file) => {\n try {\n return statSync(file).mtimeMs >= state.startedAtMs - 1000\n } catch {\n return false\n }\n })\n return newestFile(recent.length > 0 ? recent : files)\n}\n\nfunction listOpenClawSessionFiles(sessionDir: string): string[] {\n try {\n if (!existsSync(sessionDir)) return []\n return readdirSync(sessionDir)\n .filter((name) => name.endsWith('.jsonl'))\n .map((name) => join(sessionDir, name))\n .filter((file) => {\n try {\n return statSync(file).isFile()\n } catch {\n return false\n }\n })\n } catch {\n return []\n }\n}\n\nfunction newestFile(files: string[]): string | null {\n if (files.length === 0) return null\n return files.reduce((selected, file) => {\n try {\n return statSync(file).mtimeMs > statSync(selected).mtimeMs ? file : selected\n } catch {\n return selected\n }\n }, files[0])\n}\n\nfunction handleOpenClawJsonlLine(\n line: string,\n state: OpenClawTailState,\n result: OpenClawRunResult,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n): void {\n let event: any\n try {\n event = JSON.parse(line)\n } catch {\n return\n }\n if (!event || typeof event !== 'object') return\n\n const eventId = event.id\n if (typeof eventId === 'string') {\n if (state.seenEventIds.has(eventId)) return\n state.seenEventIds.add(eventId)\n }\n\n result.rawEvents.push(event)\n update({ kind: 'openclaw_event', event })\n\n if (event.type !== 'message' || !event.message || typeof event.message !== 'object') {\n return\n }\n\n const message = event.message\n if (message.role === 'assistant') {\n ingestOpenClawAssistantMessage(event, result, toolCalls, update)\n }\n if (message.role === 'toolResult') {\n ingestOpenClawToolResult(event, toolCalls, update)\n }\n}\n\nfunction ingestOpenClawAssistantMessage(\n event: any,\n result: OpenClawRunResult,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n): void {\n const message = event.message\n const text = openClawContentText(message.content)\n if (text) {\n result.messages.push(text)\n result.text = text\n update({ kind: 'message', text })\n }\n\n for (const part of openClawContentParts(message.content)) {\n if (part.type !== 'toolCall' || typeof part.id !== 'string') continue\n const toolCall: OpenClawToolCall = {\n id: part.id,\n name: String(part.name ?? 'tool'),\n arguments: part.arguments,\n messageId: typeof event.id === 'string' ? event.id : undefined,\n }\n toolCalls.set(toolCall.id, { ...toolCalls.get(toolCall.id), ...toolCall })\n update({ kind: 'tool_call', toolCall: toolCalls.get(toolCall.id) })\n }\n}\n\nfunction ingestOpenClawToolResult(\n event: any,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n): void {\n const message = event.message\n if (typeof message.toolCallId !== 'string') return\n const existing: OpenClawToolCall = toolCalls.get(message.toolCallId) ?? {\n id: message.toolCallId,\n name: String(message.toolName ?? 'tool'),\n }\n const next: OpenClawToolCall = {\n ...existing,\n name: String(message.toolName ?? existing.name),\n output: openClawContentText(message.content),\n isError: Boolean(message.isError ?? existing.isError),\n }\n toolCalls.set(message.toolCallId, next)\n update({ kind: 'tool_call', toolCall: next })\n}\n\nfunction openClawContentParts(content: any): any[] {\n if (Array.isArray(content)) return content.filter((part) => part && typeof part === 'object')\n if (content && typeof content === 'object') return [content]\n return []\n}\n\nfunction openClawContentText(content: any): string {\n if (typeof content === 'string') return content\n return openClawContentParts(content)\n .map((part) => {\n if (part.type === 'text' && typeof part.text === 'string') return part.text\n return ''\n })\n .join('')\n}\n\n/**\n * Hermes Agent adapter.\n *\n * Runs `hermes chat -q <query> -Q` for a fresh conversation and\n * `hermes chat -q <query> -Q --resume <sessionId>` when botapp provides a\n * prior session id. Hermes prints `session_id: ...` on stdout at the end; the\n * adapter captures that id for botapp resume. During the run it polls the\n * JSON session document under `~/.hermes/sessions/session_<id>.json` and\n * streams newly appended assistant/tool messages.\n */\nasync function runHermesAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const env = { ...process.env, ...(job.agent.env ?? {}) }\n const args = [...job.agent.args]\n\n if (!args.includes('chat')) {\n args.unshift('chat')\n }\n\n let usedPromptPlaceholder = false\n for (let i = 0; i < args.length; i++) {\n if (!args[i].includes('{prompt}')) continue\n args[i] = args[i].replaceAll('{prompt}', job.query)\n usedPromptPlaceholder = true\n }\n if (!usedPromptPlaceholder && !hasAnyFlag(args, ['-q', '--query'])) {\n args.push('-q', job.query)\n }\n if (!hasAnyFlag(args, ['-Q', '--quiet'])) {\n args.push('-Q')\n }\n\n const resume = job.resumeSessionId ?? job.agent.env?.HERMES_SESSION_ID ?? null\n if (resume && !hasAnyFlag(args, ['-r', '--resume'])) {\n args.push('--resume', resume)\n }\n\n const sessionDir = resolveHermesSessionDir(env)\n const state: HermesTailState = {\n startedAtMs: Date.now(),\n sessionDir,\n resumeSessionId: resume,\n initialMessageCounts: snapshotHermesMessageCounts(sessionDir),\n selectedFile: null,\n processedMessages: 0,\n }\n const result: HermesRunResult = {\n kind: 'hermes',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: resume,\n sessionFile: null,\n rawMessages: [],\n }\n const toolCalls = new Map<string, HermesToolCall>()\n let stderr = ''\n let stdoutText = ''\n let stopPolling = false\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const stdout = createInterface({ input: child.stdout })\n stdout.on('line', (line) => {\n stdoutText += `${line}\\n`\n const sessionId = parseHermesSessionId(line)\n if (sessionId) result.sessionId = sessionId\n })\n\n const stderrReader = createInterface({ input: child.stderr })\n stderrReader.on('line', (line) => {\n if (!line.trim()) return\n stderr += `${line}\\n`\n })\n\n const pollIntervalMs = envNumber(env, 'BOTAPP_HERMES_POLL_INTERVAL_MS', 500)\n const stableAfterExitMs = envNumber(env, 'BOTAPP_HERMES_STABLE_AFTER_EXIT_MS', 1000)\n const timeoutMs = resolveHermesTimeoutMs(env)\n const tailTask = (async () => {\n while (!stopPolling) {\n readHermesSessionUpdates(state, result, toolCalls, update)\n await sleep(pollIntervalMs)\n }\n readHermesSessionUpdates(state, result, toolCalls, update, true)\n })()\n\n let code: number | null\n try {\n code = await waitForChild(child, timeoutMs, 'Hermes')\n await sleep(stableAfterExitMs)\n } finally {\n stopPolling = true\n await tailTask\n }\n\n const sessionIdFromStdout = parseHermesSessionId(stdoutText)\n if (sessionIdFromStdout) {\n result.sessionId = sessionIdFromStdout\n }\n if (!state.selectedFile && result.sessionId) {\n state.selectedFile = hermesSessionFile(sessionDir, result.sessionId)\n readHermesSessionUpdates(state, result, toolCalls, update, true)\n }\n\n result.sessionFile = state.selectedFile\n result.toolCalls = [...toolCalls.values()]\n result.text = result.text || result.messages.at(-1)?.trim() || ''\n\n if (code !== 0) {\n throw new Error(stderr.trim() || `Hermes exited with code ${code}`)\n }\n if (!result.sessionId) {\n throw new Error('Hermes completed, but no session_id line was found on stdout.')\n }\n if (!result.text && result.toolCalls.length === 0) {\n throw new Error(\n [\n 'Hermes completed, but no assistant message was found in the session file.',\n `Session directory: ${sessionDir}`,\n result.sessionFile ? `Selected session file: ${result.sessionFile}` : 'Selected session file: none',\n ].join('\\n'),\n )\n }\n\n return JSON.stringify(result)\n}\n\nfunction resolveHermesSessionDir(env: NodeJS.ProcessEnv): string {\n const configured = env.BOTAPP_HERMES_SESSION_DIR ?? env.HERMES_SESSION_DIR\n if (configured) return expandPath(configured)\n return join(homedir(), '.hermes', 'sessions')\n}\n\nfunction hermesSessionFile(sessionDir: string, sessionId: string): string {\n return join(sessionDir, `session_${sessionId}.json`)\n}\n\nfunction parseHermesSessionId(text: string): string | null {\n const match = text.match(/session_id:\\s*([A-Za-z0-9_-]+)/)\n return match?.[1] ?? null\n}\n\nfunction snapshotHermesMessageCounts(sessionDir: string): Map<string, number> {\n const counts = new Map<string, number>()\n for (const file of listHermesSessionFiles(sessionDir)) {\n counts.set(file, readHermesMessageCount(file))\n }\n return counts\n}\n\nfunction readHermesMessageCount(file: string): number {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf-8'))\n return Array.isArray(parsed?.messages) ? parsed.messages.length : 0\n } catch {\n return 0\n }\n}\n\nfunction readHermesSessionUpdates(\n state: HermesTailState,\n result: HermesRunResult,\n toolCalls: Map<string, HermesToolCall>,\n update: JobUpdateSink,\n final = false,\n): void {\n const selectedFile = state.selectedFile ?? selectHermesSessionFile(state)\n if (!selectedFile) return\n if (!state.selectedFile) {\n state.selectedFile = selectedFile\n state.processedMessages = state.resumeSessionId\n ? state.initialMessageCounts.get(selectedFile) ?? 0\n : 0\n }\n\n let parsed: any\n try {\n parsed = JSON.parse(readFileSync(selectedFile, 'utf-8'))\n } catch {\n return\n }\n if (typeof parsed?.session_id === 'string') {\n result.sessionId = parsed.session_id\n }\n if (!Array.isArray(parsed?.messages)) return\n if (parsed.messages.length <= state.processedMessages && !final) return\n\n const nextMessages = parsed.messages.slice(state.processedMessages)\n state.processedMessages = parsed.messages.length\n for (const message of nextMessages) {\n ingestHermesMessage(message, result, toolCalls, update)\n }\n}\n\nfunction selectHermesSessionFile(state: HermesTailState): string | null {\n if (state.resumeSessionId) {\n const exact = hermesSessionFile(state.sessionDir, state.resumeSessionId)\n if (existsSync(exact)) return exact\n }\n\n const files = listHermesSessionFiles(state.sessionDir)\n if (files.length === 0) return null\n\n const recent = files.filter((file) => {\n try {\n return statSync(file).mtimeMs >= state.startedAtMs - 1000\n } catch {\n return false\n }\n })\n return newestFile(recent)\n}\n\nfunction listHermesSessionFiles(sessionDir: string): string[] {\n try {\n if (!existsSync(sessionDir)) return []\n return readdirSync(sessionDir)\n .filter((name) => /^session_.+\\.json$/.test(name))\n .map((name) => join(sessionDir, name))\n .filter((file) => {\n try {\n return statSync(file).isFile()\n } catch {\n return false\n }\n })\n } catch {\n return []\n }\n}\n\nfunction ingestHermesMessage(\n message: any,\n result: HermesRunResult,\n toolCalls: Map<string, HermesToolCall>,\n update: JobUpdateSink,\n): void {\n if (!message || typeof message !== 'object') return\n result.rawMessages.push(message)\n\n if (message.role === 'assistant') {\n if (typeof message.content === 'string' && message.content.trim()) {\n result.messages.push(message.content)\n result.text = message.content\n update({ kind: 'message', text: message.content })\n }\n if (Array.isArray(message.tool_calls)) {\n for (const call of message.tool_calls) {\n const id = String(call?.id ?? call?.call_id ?? call?.response_item_id ?? randomUUID())\n const name = String(call?.function?.name ?? call?.name ?? 'tool')\n const next: HermesToolCall = {\n ...toolCalls.get(id),\n id,\n name,\n arguments: parseMaybeJson(call?.function?.arguments ?? call?.arguments),\n }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n }\n\n if (message.role === 'tool' && typeof message.tool_call_id === 'string') {\n const existing = toolCalls.get(message.tool_call_id) ?? {\n id: message.tool_call_id,\n name: 'tool',\n }\n const parsedOutput = parseMaybeJson(message.content)\n const next: HermesToolCall = {\n ...existing,\n output: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n isError: Boolean(parsedOutput?.status === 'error' || parsedOutput?.is_error),\n }\n toolCalls.set(message.tool_call_id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n}\n\nasync function runAcpAgent(job: DaemonJob): Promise<string> {\n const child = spawn(job.agent.command, job.agent.args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n let nextId = 1\n const pending = new Map<\n number,\n { resolve: (value: any) => void; reject: (reason: Error) => void }\n >()\n const chunks: string[] = []\n let stderr = ''\n\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', (line) => {\n if (!line.trim()) return\n let msg: JsonRpcMessage\n try {\n msg = JSON.parse(line)\n } catch {\n stderr += `\\nInvalid ACP stdout: ${line}`\n return\n }\n\n if (msg.id != null && (msg.result !== undefined || msg.error)) {\n const waiting = pending.get(Number(msg.id))\n if (!waiting) return\n pending.delete(Number(msg.id))\n if (msg.error) waiting.reject(new Error(msg.error.message))\n else waiting.resolve(msg.result)\n return\n }\n\n if (msg.id != null && msg.method) {\n child.stdin.write(JSON.stringify({\n jsonrpc: '2.0',\n id: msg.id,\n error: { code: -32601, message: `Unsupported ACP client method: ${msg.method}` },\n }) + '\\n')\n return\n }\n\n if (msg.method === 'session/update') {\n const update = msg.params?.update\n if (update?.sessionUpdate === 'agent_message_chunk') {\n const text = update.content?.text\n if (text) chunks.push(String(text))\n }\n if (update?.sessionUpdate === 'tool_call_update' && Array.isArray(update.content)) {\n for (const item of update.content) {\n const text = item?.content?.text\n if (text) chunks.push(String(text))\n }\n }\n }\n })\n\n function request(method: string, params: any): Promise<any> {\n const id = nextId++\n child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\\n')\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n })\n }\n\n child.on('exit', (code) => {\n if (code === 0) return\n for (const [, waiting] of pending) {\n waiting.reject(new Error(stderr.trim() || `ACP agent exited with code ${code}`))\n }\n pending.clear()\n })\n\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n for (const [, waiting] of pending) {\n waiting.reject(new Error('ACP agent timed out'))\n }\n pending.clear()\n }, 10 * 60 * 1000)\n\n try {\n await request('initialize', {\n protocolVersion: 1,\n clientCapabilities: {},\n clientInfo: {\n name: 'botapp-daemon',\n title: 'botapp daemon',\n version: process.env.CLI_VERSION ?? '0.1.0',\n },\n })\n const session = await request('session/new', {\n cwd: job.agent.cwd ?? process.cwd(),\n })\n const sessionId = session?.sessionId ?? session?.id\n if (!sessionId) throw new Error('ACP agent did not return a sessionId')\n await request('session/prompt', {\n sessionId,\n prompt: [{ type: 'text', text: job.query }],\n })\n return chunks.join('').trim()\n } finally {\n clearTimeout(timeout)\n child.kill('SIGTERM')\n }\n}\n\nfunction requireProfile() {\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return null\n }\n return profile\n}\n\nasync function daemonRequest(\n server: string,\n token: string,\n path: string,\n opts?: { method?: string; body?: any },\n) {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n }\n if (opts?.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n const res = await fetch(`${server}${path}`, {\n method: opts?.method ?? 'GET',\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) {\n throw new Error(data.error ?? data.message ?? res.statusText)\n }\n return data\n}\n\nfunction parseEnv(entries: string[]): Record<string, string> | null {\n if (entries.length === 0) return null\n return Object.fromEntries(entries.map((entry) => {\n const idx = entry.indexOf('=')\n if (idx < 0) return [entry, '']\n return [entry.slice(0, idx), entry.slice(idx + 1)]\n }))\n}\n\nfunction getFlagValue(args: string[], flag: string): string | null {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg === flag) return args[i + 1] ?? null\n if (arg.startsWith(`${flag}=`)) return arg.slice(flag.length + 1) || null\n }\n return null\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.some((arg) => arg === flag || arg.startsWith(`${flag}=`))\n}\n\nfunction hasAnyFlag(args: string[], flags: string[]): boolean {\n return flags.some((flag) => hasFlag(args, flag))\n}\n\nfunction expandPath(path: string): string {\n if (path === '~') return homedir()\n if (path.startsWith('~/')) return join(homedir(), path.slice(2))\n return resolve(path)\n}\n\nfunction envNumber(env: NodeJS.ProcessEnv, name: string, fallback: number): number {\n const value = env[name]\n if (!value) return fallback\n const parsed = Number(value)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback\n}\n\nfunction resolveOpenClawTimeoutMs(env: NodeJS.ProcessEnv): number {\n const explicitMs = envNumber(env, 'BOTAPP_OPENCLAW_TIMEOUT_MS', 0)\n if (explicitMs > 0) return explicitMs\n const explicitSeconds = envNumber(env, 'BOTAPP_OPENCLAW_TIMEOUT_SECONDS', 0)\n if (explicitSeconds > 0) return explicitSeconds * 1000\n return 15 * 60 * 1000\n}\n\nfunction resolveHermesTimeoutMs(env: NodeJS.ProcessEnv): number {\n const explicitMs = envNumber(env, 'BOTAPP_HERMES_TIMEOUT_MS', 0)\n if (explicitMs > 0) return explicitMs\n const explicitSeconds = envNumber(env, 'BOTAPP_HERMES_TIMEOUT_SECONDS', 0)\n if (explicitSeconds > 0) return explicitSeconds * 1000\n return 15 * 60 * 1000\n}\n\nfunction parseMaybeJson(value: any): any {\n if (typeof value !== 'string') return value\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolveSleep) => setTimeout(resolveSleep, ms))\n}\n\nasync function waitForChild(\n child: ReturnType<typeof spawn>,\n timeoutMs: number,\n label: string,\n): Promise<number | null> {\n return new Promise((resolveWait, reject) => {\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL')\n }, 5000).unref()\n reject(new Error(`${label} timed out after ${Math.round(timeoutMs / 1000)}s`))\n }, timeoutMs)\n timeout.unref()\n\n child.once('error', (error) => {\n clearTimeout(timeout)\n reject(error)\n })\n child.once('close', (code) => {\n clearTimeout(timeout)\n resolveWait(code)\n })\n })\n}\n"],"mappings":"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","names":["Command","pc","existsSync","existsSync","Command","spawn","resolve","join","existsSync","mkdirSync","writeFileSync","readFileSync","homedir","createInterface","pc","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","parse","stringify","CONFIG_DIR","spawn","pc","resolve","resolve","Command","pc","input","resolve","Command","pc","createInterface","Command","pc","config","join","homedir","mkdirSync","existsSync","spawn","writeFileSync","readFileSync","findServerEntry","resolve","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","resolve","existsSync","mkdirSync","readFileSync","homedir","join","pc","rmSync","Command","existsSync","homedir","join","pc","APPS_DIR","Command","resolve","basename","join","existsSync","mkdirSync","symlinkSync","readFileSync","homedir","spawn","pc","APPS_DIR","join","homedir","Command","resolve","existsSync","pc","readFileSync","basename","mkdirSync","symlinkSync","findServerEntry","spawn","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","readFileSync","existsSync","pc","Command","existsSync","pc","readFileSync","Command","readFileSync","existsSync","pc","Command","existsSync","pc","readFileSync","Command","pc","Command","pc","Command","pc","Command","pc","hostname","Command","pc","Command","hostname","pc","spawn","existsSync","readFileSync","homedir","join","resolve","createInterface","Command","WebSocket","pc","Command","pc","join","homedir","existsSync","readFileSync","WebSocket","spawn","resolve","createInterface","output","request","Command","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/server.ts","../src/config/profile.ts","../src/config/server.ts","../src/commands/launch.ts","../src/config/daemon.ts","../src/auth/browser-auth.ts","../src/commands/daemon-agent-config.ts","../src/commands/apps.ts","../src/client/http.ts","../src/commands/run.ts","../src/commands/login.ts","../src/commands/install.ts","../src/commands/uninstall.ts","../src/commands/dev.ts","../src/commands/connect.ts","../src/commands/events.ts","../src/commands/agent.ts","../src/commands/register.ts","../src/commands/wrap.ts","../src/commands/reload.ts","../src/commands/skill.ts","../src/commands/pairing.ts","../src/commands/daemon.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { serverCommand } from './commands/server'\nimport { launchCommand } from './commands/launch'\nimport { appsCommand } from './commands/apps'\nimport { runCommand } from './commands/run'\nimport { loginCommand } from './commands/login'\nimport { installCommand } from './commands/install'\nimport { uninstallCommand } from './commands/uninstall'\nimport { devCommand } from './commands/dev'\nimport { connectCommand } from './commands/connect'\nimport { eventsCommand } from './commands/events'\nimport { agentCommand } from './commands/agent'\nimport { registerCommand } from './commands/register'\nimport { wrapCommand } from './commands/wrap'\nimport { reloadCommand, configCommand } from './commands/reload'\nimport { skillCommand } from './commands/skill'\nimport { pairingCommand } from './commands/pairing'\nimport { daemonCommand } from './commands/daemon'\n\n// Injected by tsup at build time from package.json.\nconst version = process.env.CLI_VERSION ?? '0.0.0'\n\nexport const program = new Command()\n .name('bot')\n .description('botapp CLI — operate apps from the command line')\n .version(version)\n .enablePositionalOptions(true)\n .option('--json', 'Output as JSON')\n .option('-s, --server <url>', 'Server URL override')\n .option('-t, --token <token>', 'Auth token override')\n .option('-v, --verbose', 'Verbose output')\n\n// ── Core (agent daily use) ───────────────────────────────────\nprogram.addCommand(launchCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(appsCommand)\nprogram.addCommand(skillCommand)\nprogram.addCommand(connectCommand)\nprogram.addCommand(eventsCommand)\n\n// ── Auth & identity ──────────────────────────────────────────\nprogram.addCommand(loginCommand)\nprogram.addCommand(agentCommand)\nprogram.addCommand(pairingCommand)\nprogram.addCommand(daemonCommand)\n\n// ── App management ───────────────────────────────────────────\nprogram.addCommand(installCommand)\nprogram.addCommand(uninstallCommand)\nprogram.addCommand(reloadCommand)\nprogram.addCommand(configCommand)\n\n// ── Server management ────────────────────────────────────────\nprogram.addCommand(serverCommand)\n\n// ── Hidden (still callable, not shown in --help) ─────────────\nprogram.addCommand(devCommand, { hidden: true })\nprogram.addCommand(registerCommand, { hidden: true })\nprogram.addCommand(wrapCommand, { hidden: true })\n\nprogram.addHelpText(\n 'after',\n `\nExamples:\n $ bot start Connect to a server and log in\n $ bot run trading quote --symbol NVDA\n Run an app command\n $ bot apps List installed apps\n $ bot skill trading Print the app's agent-facing skill doc\n $ bot connect --subscribe 'trading.*'\n Live event stream\n $ bot pair Pair this machine (browser flow / local fast-path)\n $ bot pair --token <jwt> Pair with a token pasted from dashboard Settings\n $ bot daemon run Run the paired local daemon\n`,\n)\n\nrunCommand.addHelpText(\n 'after',\n `\nExamples:\n $ bot run hello greet --name alice\n $ bot run trading quote --symbol NVDA\n $ bot run trading buy --symbol AAPL --qty 10\n $ bot --json run trading list-positions\n\nArguments after <command> become the command's params object:\n --key value → params.key = value\n --key → params.key = true (flag-only)\n Numeric strings are auto-coerced: \"--qty 10\" → 10\n\nTo discover what params a command accepts:\n $ bot apps --json | jq '.[] | select(.name == \"trading\") | .commands'\n`,\n)\n\n// Friendlier \"unknown command\" error with hints.\nprogram.on('command:*', (operands: string[]) => {\n const first = operands[0]\n const known = program.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name())\n const topLevelHint = `Run ${pc.cyan('bot --help')} for the list of top-level commands.`\n\n const argv = process.argv.slice(2)\n const firstIdx = argv.indexOf(first)\n const tail = firstIdx >= 0 ? argv.slice(firstIdx + 1) : []\n\n if (tail.length > 0) {\n const suggested = `bot run ${first} ${tail.join(' ')}`\n console.error(\n pc.red(`error: unknown command '${first}'`) +\n `\\n\\nApp commands go through ${pc.bold('bot run')}. Did you mean:` +\n `\\n\\n ${pc.cyan(suggested)}` +\n `\\n\\n${topLevelHint}`,\n )\n process.exit(1)\n }\n\n console.error(\n pc.red(`error: unknown command '${first}'`) +\n `\\n\\nIf '${first}' is an app name, invoke one of its commands with:` +\n `\\n ${pc.cyan(`bot run ${first} <command> [--key value ...]`)}` +\n `\\n ${pc.cyan('bot apps --json')} ${pc.dim('(to see what commands exist)')}` +\n `\\n\\nTop-level commands: ${known.join(', ')}` +\n `\\n${topLevelHint}`,\n )\n process.exit(1)\n})\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport pc from 'picocolors'\nimport { resolveServerUrl } from '../config/server'\n\n/**\n * `bot server` — manage the local server process only.\n *\n * First-time setup (auth, default agent, daemon pairing) lives in\n * `bot launch`. `bot start` is kept as an alias of `bot launch` for\n * backwards compatibility.\n */\nexport const serverCommand = new Command('server')\n .description('Manage the local botapp server process')\n\nserverCommand\n .command('start')\n .description('Start the local server process (no auth setup)')\n .option('-p, --port <port>', 'Port for local server', '7100')\n .option('--background', 'Run in background', false)\n .action(async (opts: { port: string; background: boolean }) => {\n const serverUrl = `http://localhost:${opts.port}`\n try {\n const res = await fetch(`${serverUrl}/health`)\n if (res.ok) {\n console.log(pc.yellow('Server is already running at'), pc.cyan(serverUrl))\n return\n }\n } catch { /* not running, proceed */ }\n\n const serverEntry = findServerEntry()\n if (!serverEntry) {\n console.error(\n pc.red('Could not find the server package.\\n') +\n `\\nThis command requires the botapp monorepo source.\\n` +\n `If you installed the CLI from npm, use ${pc.cyan('bot launch')} and\\n` +\n `pick option 2 (cloud) or 3 (custom) instead.`,\n )\n process.exitCode = 1\n return\n }\n\n console.log(pc.blue('Starting local server...'))\n const child = spawn('node', ['--import', 'tsx', serverEntry], {\n env: { ...process.env, PORT: opts.port },\n stdio: opts.background ? 'ignore' : 'inherit',\n detached: opts.background,\n })\n if (opts.background) {\n child.unref()\n console.log(pc.green('Server started in background'), `(PID: ${child.pid})`)\n }\n\n for (let i = 0; i < 30; i++) {\n await new Promise((r) => setTimeout(r, 500))\n try {\n const res = await fetch(`${serverUrl}/health`)\n if (res.ok) {\n if (opts.background) console.log(pc.green('Server ready at'), pc.cyan(serverUrl))\n return\n }\n } catch { /* not ready yet */ }\n }\n if (opts.background) console.log(pc.yellow('Server may still be starting...'))\n })\n\nserverCommand\n .command('status')\n .description('Check if the server is running')\n .action(async () => {\n const serverUrl = resolveServerUrl()\n try {\n const res = await fetch(`${serverUrl}/health`)\n const data = await res.json() as { mode: string; apps: number }\n console.log(pc.green('Server is running'))\n console.log(` URL: ${pc.cyan(serverUrl)}`)\n console.log(` Mode: ${data.mode}`)\n console.log(` Apps: ${data.apps}`)\n } catch {\n console.log(pc.red('Server is not running'))\n process.exitCode = 1\n }\n })\n\nserverCommand\n .command('stop')\n .description('Stop the botapp server')\n .action(async () => {\n console.log(pc.yellow('Server stop not yet implemented (kill the process manually)'))\n })\n\nfunction findServerEntry(): string | null {\n const candidates = [\n resolve(process.cwd(), 'packages/server/src/index.ts'),\n resolve(process.cwd(), '../server/src/index.ts'),\n resolve(process.cwd(), '../../packages/server/src/index.ts'),\n ]\n for (const c of candidates) {\n if (existsSync(c)) return c\n }\n return null\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { parse, stringify } from 'yaml'\n\nexport interface Profile {\n server: string\n /**\n * Dashboard / web-app origin. Defaults to `server` when unset. Kept separate\n * so hosted deployments can split `api.<apex>` (API) from `<apex>` (web).\n */\n app_url?: string\n user_id?: string\n agent_id?: string\n token?: string\n}\n\nexport interface Config {\n active_profile: string\n profiles: Record<string, Profile>\n}\n\nconst CONFIG_DIR = join(homedir(), '.botapp')\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.yaml')\n\nfunction defaultConfig(): Config {\n return {\n active_profile: 'local',\n profiles: {\n local: {\n server: 'http://localhost:7100',\n },\n },\n }\n}\n\nexport function loadProfile(): Config {\n try {\n if (!existsSync(CONFIG_FILE)) return defaultConfig()\n const raw = readFileSync(CONFIG_FILE, 'utf-8')\n const parsed = parse(raw)\n return { ...defaultConfig(), ...parsed }\n } catch {\n return defaultConfig()\n }\n}\n\nexport function saveProfile(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n writeFileSync(CONFIG_FILE, stringify(config), 'utf-8')\n}\n\nexport function getActiveProfile(): Profile {\n const config = loadProfile()\n return config.profiles[config.active_profile] ?? config.profiles.local ?? { server: 'http://localhost:7100' }\n}\n\nexport function updateActiveProfile(updates: Partial<Profile>): void {\n const config = loadProfile()\n const name = config.active_profile\n config.profiles[name] = { ...config.profiles[name], ...updates }\n saveProfile(config)\n}\n","import { getActiveProfile } from './profile'\n\nexport function resolveServerUrl(flagUrl?: string): string {\n if (flagUrl) return flagUrl.replace(/\\/$/, '')\n const env = process.env.BOTAPP_SERVER\n if (env) return env.replace(/\\/$/, '')\n const profile = getActiveProfile()\n return profile.server.replace(/\\/$/, '')\n}\n\nexport function resolveToken(flagToken?: string): string | undefined {\n if (flagToken) return flagToken\n const env = process.env.BOTAPP_TOKEN\n if (env) return env\n return getActiveProfile().token\n}\n\nexport function authHeaders(token?: string): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n return headers\n}\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { resolve, join } from 'node:path'\nimport { existsSync, mkdirSync, openSync, writeFileSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { createInterface } from 'node:readline'\nimport { hostname } from 'node:os'\nimport pc from 'picocolors'\nimport { loadProfile, saveProfile, updateActiveProfile } from '../config/profile'\nimport { saveDaemonProfile, loadDaemonProfile } from '../config/daemon'\nimport { runBrowserAuth } from '../auth/browser-auth'\nimport { registerAllDetectedAgents } from './daemon-agent-config'\n\n// Default cloud origins. API serves /api/*; the web app (landing + dashboard)\n// serves /cli-auth, /login, etc. For local/self-hosted deployments they may\n// be the same origin, so `app_url` defaults to `server_url` when unset.\nconst DEFAULT_SERVER_URL = 'https://api.botapp.ai'\nconst DEFAULT_APP_URL = 'https://botapp.ai'\nconst DEFAULT_LOCAL_SERVER = 'http://localhost:7100'\n\nfunction ask(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((res) => {\n rl.question(question, (answer) => {\n rl.close()\n res(answer.trim())\n })\n })\n}\n\ninterface LaunchOpts {\n port: string\n background: boolean\n server?: string\n appUrl?: string\n browser: boolean // commander inverts --no-browser\n agents: boolean // commander inverts --no-agents\n agentCwd: string\n start: boolean // commander inverts --no-start\n}\n\nexport const launchCommand = new Command('launch')\n .alias('start')\n .description('Set up this CLI (auth + default agent + daemon pair + agent register)')\n .option('-p, --port <port>', 'Port for local server', '7100')\n .option('--background', 'Run local server in background', false)\n .option('-s, --server <url>', 'Server URL (skip the interactive picker)')\n .option('--app-url <url>', 'Dashboard URL (defaults to the server URL)')\n .option('--no-browser', 'Error instead of opening a browser')\n .option('--no-agents', 'Skip auto-registering local agent CLIs')\n .option('--agent-cwd <cwd>', 'Working directory stored on registered daemon agents', process.cwd())\n .option('--no-start', 'Skip starting the daemon process in background')\n .action(async (opts: LaunchOpts) => {\n if (opts.server) {\n await launchAgainstServer(opts.server, opts.appUrl, opts)\n return\n }\n\n console.log(pc.bold('Where do you want to run botapp?\\n'))\n console.log(` ${pc.cyan('1)')} Local ${pc.dim('— start a server on this machine')}`)\n console.log(` ${pc.cyan('2)')} Cloud ${pc.dim(`— connect to ${DEFAULT_APP_URL}`)}`)\n console.log(` ${pc.cyan('3)')} Custom ${pc.dim('— enter your own server URL')}\\n`)\n\n const choice = await ask(`${pc.bold('Select [1/2/3]:')} `)\n switch (choice) {\n case '1':\n await launchLocal(opts)\n break\n case '2':\n await launchAgainstServer(DEFAULT_SERVER_URL, DEFAULT_APP_URL, opts)\n break\n case '3': {\n const url = await ask(`\\n${pc.bold('Server URL:')} `)\n if (!url) {\n console.error(pc.red('No URL provided'))\n process.exitCode = 1\n return\n }\n await launchAgainstServer(url.replace(/\\/$/, ''), undefined, opts)\n break\n }\n default:\n console.error(pc.red(`Invalid choice: ${choice}`))\n process.exitCode = 1\n }\n })\n\nasync function launchLocal(opts: LaunchOpts) {\n const serverUrl = `http://localhost:${opts.port}`\n\n if (!(await isServerUp(serverUrl))) {\n const spawned = await startLocalServer(opts)\n if (!spawned) {\n process.exitCode = 1\n return\n }\n } else {\n console.log(pc.yellow('Server already running at'), pc.cyan(serverUrl))\n }\n\n await launchAgainstServer(serverUrl, serverUrl, opts)\n}\n\n/**\n * Main launch path: given a server (and optional app URL), authenticate the\n * human, bind a default agent, pair a daemon. Local-mode servers short-\n * circuit the browser — their /health already returns an anon token.\n */\nasync function launchAgainstServer(\n serverUrl: string,\n appUrl: string | undefined,\n opts: LaunchOpts,\n) {\n console.log(pc.dim(`\\nConfigured for ${serverUrl}`))\n\n const health = await fetchHealth(serverUrl)\n if (!health) {\n console.error(pc.red(`Cannot reach ${serverUrl}`))\n process.exitCode = 1\n return\n }\n\n const profileName = pickProfileName(serverUrl)\n\n // Single auth path: browser-loopback flow against the landing page's\n // /cli-auth handler. Whether the server is on localhost or a hosted\n // domain doesn't matter — the user logs in once via their real\n // account, the loopback receives the grant, and we mint the agent +\n // daemon-pairing tokens server-side in one round trip.\n if (opts.browser === false) {\n console.error(pc.red('Login needs browser auth but --no-browser was passed.'))\n process.exitCode = 1\n return\n }\n\n const result = await runBrowserAuth({\n serverUrl,\n appUrl: appUrl ?? serverUrl,\n scope: 'launch',\n name: hostname(),\n })\n\n if (!result.userToken || !result.userId || !result.agentId) {\n console.error(pc.red('server did not return a user token / agent'))\n process.exitCode = 1\n return\n }\n\n const config = loadProfile()\n config.profiles[profileName] = {\n server: result.serverUrl ?? serverUrl,\n app_url: appUrl ?? serverUrl,\n token: result.userToken,\n user_id: result.userId,\n agent_id: result.agentId,\n }\n config.active_profile = profileName\n saveProfile(config)\n\n if (result.userEmail) {\n console.log(pc.green(`Authenticated as ${pc.bold(result.userEmail)}`))\n }\n console.log(` Profile: ${pc.bold(profileName)}`)\n console.log(` Server: ${pc.cyan(result.serverUrl ?? serverUrl)}`)\n console.log(\n ` Agent: ${pc.bold(result.agentName ?? 'default')} ${pc.dim(`(${result.agentId})`)}`,\n )\n\n // Pair a daemon in the same shot so the user doesn't need to run a second\n // command. Failure here is non-fatal — the login still succeeded.\n if (result.daemonPairingToken) {\n try {\n const res = await fetch(`${result.serverUrl ?? serverUrl}/api/daemon/pair`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: result.daemonPairingToken,\n name: hostname(),\n machine: hostname(),\n }),\n })\n const data = await res.json().catch(() => ({} as any))\n if (res.ok && data?.daemon?.id) {\n saveDaemonProfile({\n server: result.serverUrl ?? serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n })\n console.log(\n ` Daemon: ${pc.bold(data.daemon.name)} ${pc.dim(`(${data.daemon.id})`)}`,\n )\n await autoRegisterAgents(opts)\n await autoStartDaemon(opts, result.serverUrl ?? serverUrl, data.daemon.id)\n } else {\n console.log(pc.yellow(` Daemon: pairing failed — run \\`bot pair\\` later`))\n }\n } catch {\n console.log(pc.yellow(` Daemon: pairing skipped — run \\`bot pair\\` later`))\n }\n }\n}\n\n/**\n * Spawn `bot daemon run` as a detached background process so the dashboard\n * flips from \"waiting-online\" to \"Connection succeeded\" within ~3s. Logs\n * go to ~/.botapp/daemon.log; PID to ~/.botapp/daemon.pid so it can be\n * stopped with `kill $(cat ~/.botapp/daemon.pid)`.\n *\n * No-op if `--no-start` was passed, a daemon process is already running\n * from a previous invocation, or we can't resolve the current `bot` binary.\n */\nasync function autoStartDaemon(\n opts: LaunchOpts,\n serverUrl: string,\n daemonId: string,\n): Promise<void> {\n if (opts.start === false) {\n console.log(pc.dim(`\\nNext: run \\`bot daemon run\\` to bring this machine online.`))\n return\n }\n\n const dir = join(homedir(), '.botapp')\n const pidFile = join(dir, 'daemon.pid')\n const logFile = join(dir, 'daemon.log')\n mkdirSync(dir, { recursive: true })\n\n if (isDaemonRunningLocally(pidFile)) {\n console.log(pc.dim(` Running: already (pid $(cat ~/.botapp/daemon.pid))`))\n return\n }\n\n const botBin = process.argv[1]\n if (!botBin || !existsSync(botBin)) {\n console.log(pc.yellow(` Running: cannot resolve \\`bot\\` binary — run \\`bot daemon run\\` manually`))\n return\n }\n\n const logFd = openSync(logFile, 'a')\n const child = spawn(process.execPath, [botBin, 'daemon', 'run'], {\n stdio: ['ignore', logFd, logFd],\n detached: true,\n })\n child.unref()\n if (typeof child.pid === 'number') {\n writeFileSync(pidFile, `${child.pid}\\n`, 'utf-8')\n }\n\n // Poll /api/daemons — wait up to ~10s for the daemon to come online.\n let online = false\n for (let i = 0; i < 20; i++) {\n await new Promise((r) => setTimeout(r, 500))\n if (await isDaemonOnline(serverUrl, daemonId)) {\n online = true\n break\n }\n }\n if (online) {\n console.log(` Running: ${pc.green('online')} ${pc.dim(`(pid ${child.pid}, logs ~/.botapp/daemon.log)`)}`)\n } else {\n console.log(\n pc.yellow(\n ` Running: started but didn't report online in 10s — check ~/.botapp/daemon.log`,\n ),\n )\n }\n}\n\nfunction isDaemonRunningLocally(pidFile: string): boolean {\n if (!existsSync(pidFile)) return false\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10)\n if (!Number.isInteger(pid) || pid <= 0) return false\n process.kill(pid, 0) // throws if process doesn't exist\n return true\n } catch {\n return false\n }\n}\n\nasync function isDaemonOnline(serverUrl: string, daemonId: string): Promise<boolean> {\n try {\n const res = await fetch(`${serverUrl}/api/daemons`, {\n signal: AbortSignal.timeout(2000),\n })\n if (!res.ok) return false\n const data = (await res.json()) as { daemons?: Array<{ id: string; status: string }> }\n const d = (data.daemons ?? []).find((x) => x.id === daemonId)\n return d?.status === 'online' || d?.status === 'connected'\n } catch {\n return false\n }\n}\n\n/**\n * Scan PATH for known local agent CLIs (codex / claude / openclaw / hermes)\n * and register any that aren't already known. Skipped silently when the\n * user passed --no-agents or no daemon profile exists (pairing failed).\n */\nasync function autoRegisterAgents(opts: LaunchOpts): Promise<void> {\n if (opts.agents === false) return\n const daemon = loadDaemonProfile()\n if (!daemon) return\n\n try {\n const { created, skipped, detected } = await registerAllDetectedAgents({\n server: daemon.server,\n token: daemon.token,\n cwd: opts.agentCwd,\n })\n if (detected === 0) {\n console.log(\n pc.dim(\n ` Agents: none detected on PATH (scanned: codex, claude, openclaw, hermes)`,\n ),\n )\n return\n }\n const summary: string[] = []\n if (created.length > 0) summary.push(`${created.length} registered (${created.join(', ')})`)\n if (skipped.length > 0) summary.push(`${skipped.length} skipped`)\n console.log(\n ` Agents: ${pc.bold(summary.join(' · ') || 'up to date')}`,\n )\n } catch (e: any) {\n console.log(pc.yellow(` Agents: registration failed (${e.message})`))\n }\n}\n\nfunction pickProfileName(serverUrl: string): string {\n try {\n const host = new URL(serverUrl).hostname\n if (host === 'localhost' || host === '127.0.0.1') return 'local'\n if (host === new URL(DEFAULT_SERVER_URL).hostname) return 'cloud'\n return host.replace(/\\./g, '-')\n } catch {\n return 'remote'\n }\n}\n\nasync function fetchHealth(serverUrl: string): Promise<{ ok: true } | null> {\n try {\n const res = await fetch(`${serverUrl}/health`, { signal: AbortSignal.timeout(5000) })\n if (!res.ok) return null\n return { ok: true }\n } catch {\n return null\n }\n}\n\nasync function isServerUp(serverUrl: string): Promise<boolean> {\n return (await fetchHealth(serverUrl)) !== null\n}\n\nasync function startLocalServer(opts: LaunchOpts): Promise<boolean> {\n const serverUrl = `http://localhost:${opts.port}`\n const serverEntry = findServerEntry()\n if (!serverEntry) {\n console.error(\n pc.red('Could not find the server package.\\n') +\n `\\nLocal mode requires the botapp monorepo source.\\n` +\n `If you installed the CLI from npm, pick option ${pc.cyan('2')} (cloud) or ${pc.cyan('3')} (custom) instead.\\n\\n` +\n `Or run a local server from source:\\n` +\n ` ${pc.cyan('git clone https://github.com/wangdinglu/botapp')}\\n` +\n ` ${pc.cyan('cd botapp && pnpm install && pnpm build')}\\n` +\n ` ${pc.cyan('pnpm --filter @botapp/server dev')}`,\n )\n return false\n }\n\n console.log(pc.blue('Starting local server...'))\n const child = spawn('node', ['--import', 'tsx', serverEntry], {\n env: { ...process.env, PORT: opts.port },\n stdio: opts.background ? 'ignore' : 'inherit',\n detached: opts.background,\n })\n if (opts.background) {\n child.unref()\n }\n\n for (let i = 0; i < 30; i++) {\n await new Promise((r) => setTimeout(r, 500))\n if (await isServerUp(serverUrl)) return true\n }\n console.error(pc.red('Server did not come up in 15s'))\n return false\n}\n\nfunction findServerEntry(): string | null {\n const candidates = [\n resolve(process.cwd(), 'packages/server/src/index.ts'),\n resolve(process.cwd(), '../server/src/index.ts'),\n resolve(process.cwd(), '../../packages/server/src/index.ts'),\n ]\n for (const c of candidates) {\n if (existsSync(c)) return c\n }\n return null\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { parse, stringify } from 'yaml'\n\nexport interface DaemonProfile {\n server: string\n daemonId: string\n daemonName: string\n token: string\n}\n\nconst CONFIG_DIR = join(homedir(), '.botapp')\nconst DAEMON_FILE = join(CONFIG_DIR, 'daemon.yaml')\n\nexport function loadDaemonProfile(): DaemonProfile | null {\n try {\n if (!existsSync(DAEMON_FILE)) return null\n const parsed = parse(readFileSync(DAEMON_FILE, 'utf-8')) as Partial<DaemonProfile> | null\n if (!parsed?.server || !parsed.daemonId || !parsed.token) return null\n return {\n server: parsed.server.replace(/\\/$/, ''),\n daemonId: parsed.daemonId,\n daemonName: parsed.daemonName ?? parsed.daemonId,\n token: parsed.token,\n }\n } catch {\n return null\n }\n}\n\nexport function saveDaemonProfile(profile: DaemonProfile): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n writeFileSync(DAEMON_FILE, stringify(profile), 'utf-8')\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport { randomBytes } from 'node:crypto'\nimport { spawn } from 'node:child_process'\nimport pc from 'picocolors'\n\nexport interface BrowserAuthResult {\n scope: 'pair' | 'launch'\n serverUrl: string\n name?: string\n // scope=pair\n pairingToken?: string\n // scope=launch\n userId?: string\n userEmail?: string\n userToken?: string\n agentId?: string\n agentName?: string\n daemonPairingToken?: string\n}\n\ninterface BrowserAuthOptions {\n appUrl: string\n serverUrl: string\n scope: 'pair' | 'launch'\n name?: string\n timeoutMs?: number\n}\n\nconst OK_HTML = `<!doctype html>\n<meta charset=\"utf-8\">\n<title>botapp · Authentication successful</title>\n<style>\n :root { color-scheme: dark; }\n html, body { height: 100%; margin: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', Roboto, sans-serif;\n background: #0b0b0d;\n color: #e9e9ec;\n display: grid;\n place-items: center;\n -webkit-font-smoothing: antialiased;\n }\n .card {\n width: min(92vw, 520px);\n background: #151518;\n border: 1px solid #242428;\n border-radius: 16px;\n padding: 48px 40px 40px;\n text-align: center;\n }\n .check {\n width: 64px; height: 64px; margin: 0 auto 22px;\n border-radius: 50%;\n background: rgba(34, 197, 94, 0.14);\n color: #22c55e;\n display: grid; place-items: center;\n font-size: 30px;\n }\n .glyph { color: #6b6b72; font-size: 20px; margin: 8px 0 12px; }\n h1 { font-size: 28px; font-weight: 700; margin: 0 0 10px; letter-spacing: -0.01em; }\n p { color: #9a9aa1; margin: 0; font-size: 15px; line-height: 1.5; }\n .dim { color: #6b6b72; font-size: 13px; margin-top: 14px; }\n</style>\n<div class=\"card\">\n <div class=\"check\">✓</div>\n <div class=\"glyph\">✱</div>\n <h1>Authentication successful</h1>\n <p>You can close this tab and return to the terminal.</p>\n <p class=\"dim\">Your CLI session is now authenticated.</p>\n</div>`\n\n/**\n * Starts a one-shot loopback listener on 127.0.0.1, opens the browser to the\n * server's approval page with callback + state params, and resolves once the\n * page POSTs the grant payload back. Rejects on state mismatch, timeout, or\n * a second callback attempt.\n */\nexport async function runBrowserAuth(\n opts: BrowserAuthOptions,\n): Promise<BrowserAuthResult> {\n const state = randomBytes(24).toString('base64url')\n // 10-minute default. First-time users sign up + verify email + click\n // Approve, and 2 minutes is not enough. The loopback stays bound the whole\n // time but it costs nothing — it's one port on 127.0.0.1.\n const timeoutMs = opts.timeoutMs ?? 10 * 60_000\n\n const { port, waitForCallback, shutdown } = await startLoopback(state)\n const cliCallback = `http://127.0.0.1:${port}/callback`\n\n const params = new URLSearchParams({\n cli_callback: cliCallback,\n cli_state: state,\n scope: opts.scope,\n })\n if (opts.name) params.set('name', opts.name)\n\n const approvalUrl = `${opts.appUrl.replace(/\\/$/, '')}/cli-auth?${params.toString()}`\n\n console.log(pc.dim('Opening browser to authenticate...'))\n console.log(pc.dim(\"If the browser didn't open, visit:\"))\n console.log(` ${pc.cyan(approvalUrl)}`)\n console.log()\n console.log(pc.dim('Waiting for authentication...'))\n\n openUrl(approvalUrl)\n\n try {\n const payload = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error('timed out waiting for authentication')),\n timeoutMs,\n )\n }),\n ])\n // Give the browser a moment to fully render the success page AND for\n // any preconnect / prefetch follow-up connections Chrome likes to open\n // right after a navigation. Tearing the loopback down immediately\n // produces a visible ERR_CONNECTION_REFUSED in the address bar even\n // though the navigation succeeded.\n await new Promise((r) => setTimeout(r, 1500))\n return {\n scope: opts.scope,\n serverUrl: payload.serverUrl ?? opts.serverUrl,\n name: payload.name,\n pairingToken: payload.pairingToken,\n userId: payload.userId,\n userEmail: payload.userEmail,\n userToken: payload.userToken,\n agentId: payload.agentId,\n agentName: payload.agentName,\n daemonPairingToken: payload.daemonPairingToken,\n }\n } finally {\n shutdown()\n }\n}\n\ninterface LoopbackCallbackPayload {\n serverUrl?: string\n name?: string\n pairingToken?: string\n userId?: string\n userEmail?: string\n userToken?: string\n agentId?: string\n agentName?: string\n daemonPairingToken?: string\n}\n\nasync function startLoopback(expectedState: string): Promise<{\n port: number\n waitForCallback: () => Promise<LoopbackCallbackPayload>\n shutdown: () => void\n}> {\n let resolveCb: (p: LoopbackCallbackPayload) => void = () => {}\n let rejectCb: (e: Error) => void = () => {}\n let settled = false\n\n const callbackPromise = new Promise<LoopbackCallbackPayload>((resolve, reject) => {\n resolveCb = (p) => {\n if (settled) return\n settled = true\n resolve(p)\n }\n rejectCb = (e) => {\n if (settled) return\n settled = true\n reject(e)\n }\n })\n\n const server = createServer((req, res) => {\n void handleLoopback(req, res, expectedState, resolveCb, rejectCb)\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(0, '127.0.0.1', () => {\n server.removeListener('error', reject)\n resolve()\n })\n })\n\n const address = server.address()\n if (!address || typeof address === 'string') {\n server.close()\n throw new Error('could not bind loopback port')\n }\n\n return {\n port: address.port,\n waitForCallback: () => callbackPromise,\n shutdown: () => {\n rejectCb(new Error('loopback shut down'))\n server.close()\n },\n }\n}\n\nasync function handleLoopback(\n req: IncomingMessage,\n res: ServerResponse,\n expectedState: string,\n onOk: (p: LoopbackCallbackPayload) => void,\n onErr: (e: Error) => void,\n) {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`)\n if (!url.pathname.startsWith('/callback')) {\n res.statusCode = 404\n res.end('not found')\n return\n }\n\n // GET /callback — the approval page navigates here with the grant payload\n // encoded as query params. This is a full-page redirect, not a cross-\n // origin fetch, so there's no CORS preflight and nothing to break in\n // Chrome's Private Network Access policy. It's also resilient to\n // strict browser settings that block cross-origin POSTs to loopback.\n if (req.method === 'GET') {\n const state = url.searchParams.get('state')\n if (!state || state !== expectedState) {\n res.statusCode = 400\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n // Kept around so the user sees an actual error page rather than a\n // connection-reset — fires onErr only after the HTML is flushed.\n res.end(errorHtml('State mismatch. Re-run the CLI and try again.'), () => {\n onErr(new Error('callback state mismatch'))\n })\n return\n }\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n // Resolve the callback promise ONLY after the success HTML has been\n // fully flushed to the socket. Otherwise `runBrowserAuth`'s finally\n // block may close the server before the response drains, and the\n // browser sees ERR_CONNECTION_RESET (or REFUSED for any retry/\n // preconnect attempt).\n res.end(OK_HTML, () => {\n onOk({\n serverUrl: url.searchParams.get('serverUrl') ?? undefined,\n name: url.searchParams.get('name') ?? undefined,\n pairingToken: url.searchParams.get('pairingToken') ?? undefined,\n userId: url.searchParams.get('userId') ?? undefined,\n userEmail: url.searchParams.get('userEmail') ?? undefined,\n userToken: url.searchParams.get('userToken') ?? undefined,\n agentId: url.searchParams.get('agentId') ?? undefined,\n agentName: url.searchParams.get('agentName') ?? undefined,\n daemonPairingToken: url.searchParams.get('daemonPairingToken') ?? undefined,\n })\n })\n return\n }\n\n // POST /callback — kept for programmatic callers (scripts, E2E tests).\n // CORS headers stay on in case a browser ends up here via an old page.\n const origin = req.headers.origin ?? '*'\n res.setHeader('Access-Control-Allow-Origin', origin)\n res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n res.setHeader('Access-Control-Allow-Private-Network', 'true')\n res.setHeader('Vary', 'Origin')\n\n if (req.method === 'OPTIONS') {\n res.statusCode = 204\n res.end()\n return\n }\n\n if (req.method !== 'POST') {\n res.statusCode = 405\n res.end('method not allowed')\n return\n }\n\n try {\n const body = await readJsonBody(req)\n if (!body || typeof body !== 'object') {\n res.statusCode = 400\n res.end('invalid body')\n onErr(new Error('invalid callback body'))\n return\n }\n const parsed = body as Record<string, unknown>\n if (typeof parsed.state !== 'string' || parsed.state !== expectedState) {\n res.statusCode = 400\n res.end('state mismatch')\n onErr(new Error('callback state mismatch'))\n return\n }\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(OK_HTML)\n onOk({\n serverUrl: asString(parsed.serverUrl),\n name: asString(parsed.name),\n pairingToken: asString(parsed.pairingToken),\n userId: asString(parsed.userId),\n userEmail: asString(parsed.userEmail),\n userToken: asString(parsed.userToken),\n agentId: asString(parsed.agentId),\n agentName: asString(parsed.agentName),\n daemonPairingToken: asString(parsed.daemonPairingToken),\n })\n } catch (e: any) {\n res.statusCode = 500\n res.end('error')\n onErr(e)\n }\n}\n\nfunction errorHtml(msg: string): string {\n const safe = msg.replace(/[<>&]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[c] ?? c))\n return `<!doctype html><meta charset=\"utf-8\"><title>botapp · CLI auth failed</title>\n<style>body{font-family:ui-monospace,Menlo,monospace;background:#0b0b0d;color:#eee;display:grid;place-items:center;min-height:100vh;margin:0}.c{border:1px solid #333;padding:2rem 2.5rem;max-width:520px}</style>\n<div class=\"c\"><h1>CLI auth failed</h1><p>${safe}</p></div>`\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === 'string' ? v : undefined\n}\n\nfunction readJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n let total = 0\n req.on('data', (c: Buffer) => {\n total += c.length\n // 64KB cap — the payload is a handful of short strings.\n if (total > 64 * 1024) {\n reject(new Error('payload too large'))\n req.destroy()\n return\n }\n chunks.push(c)\n })\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf-8')\n if (!raw) return resolve(null)\n try {\n resolve(JSON.parse(raw))\n } catch (e) {\n reject(e)\n }\n })\n req.on('error', reject)\n })\n}\n\nfunction openUrl(url: string): void {\n const cmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'cmd'\n : 'xdg-open'\n const args = process.platform === 'win32' ? ['/c', 'start', '\"\"', url] : [url]\n try {\n spawn(cmd, args, { stdio: 'ignore', detached: true }).unref()\n } catch {\n // Silent — the URL was already printed to the terminal.\n }\n}\n","import { spawnSync } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { resolve } from 'node:path'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { loadDaemonProfile } from '../config/daemon'\n\ninterface DaemonAgentCandidate {\n name: string\n kind: string\n command: string\n path: string\n}\n\ninterface RegisteredDaemonAgent {\n id: string\n name: string\n kind: string\n command: string\n args: string[]\n cwd: string | null\n env: Record<string, string> | null\n}\n\ninterface AgentSpec {\n name: string\n kind: string\n command: string\n}\n\nconst LOCAL_AGENT_SPECS: AgentSpec[] = [\n { name: 'codex', kind: 'codex', command: 'codex' },\n { name: 'claude', kind: 'claude-code', command: 'claude' },\n { name: 'openclaw', kind: 'openclaw', command: 'openclaw' },\n { name: 'hermes', kind: 'hermes-agent', command: 'hermes' },\n]\n\n/**\n * Auto-detect every supported local agent CLI on PATH and register the ones\n * that aren't already known to the daemon. Shared with `bot launch` so a\n * first-time setup ends with a ready-to-run daemon in one command.\n * Returns { created, skipped, detected } counts so callers can print a tidy\n * one-line summary without re-scanning.\n */\nexport async function registerAllDetectedAgents(input: {\n server: string\n token: string\n cwd: string\n}): Promise<{\n created: string[]\n skipped: string[]\n detected: number\n}> {\n const detected = scanLocalDaemonAgents()\n if (detected.length === 0) return { created: [], skipped: [], detected: 0 }\n\n const existing = await daemonSelfRequest<{ agents?: RegisteredDaemonAgent[] }>(\n input.server,\n input.token,\n '/api/daemon/self/agents',\n )\n const registered = existing.agents ?? []\n const created: string[] = []\n const skipped: string[] = []\n const cwd = resolve(input.cwd)\n\n for (const candidate of detected) {\n if (registered.find((a) => a.name === candidate.name)) {\n skipped.push(candidate.name)\n continue\n }\n try {\n await daemonSelfRequest<{ agent: RegisteredDaemonAgent }>(\n input.server,\n input.token,\n '/api/daemon/self/agents',\n {\n method: 'POST',\n body: {\n name: candidate.name,\n kind: candidate.kind,\n command: candidate.command,\n args: [],\n cwd,\n env: null,\n },\n },\n )\n created.push(candidate.name)\n } catch {\n // Non-fatal — skip this agent, continue with the others.\n skipped.push(candidate.name)\n }\n }\n return { created, skipped, detected: detected.length }\n}\n\nexport function createDaemonAgentConfigCommand(): Command {\n return new Command('config')\n .description('Scan local agent CLIs and register selected daemon agents')\n .option('--all', 'Register every detected agent without prompting')\n .option('--agent <name...>', 'Register only these detected agent names, e.g. codex claude')\n .option('--cwd <cwd>', 'Working directory stored on registered daemon agents', process.cwd())\n .action(async (opts) => {\n await configureDaemonAgents({\n all: Boolean(opts.all),\n names: Array.isArray(opts.agent) ? opts.agent : [],\n cwd: opts.cwd,\n })\n })\n}\n\nasync function configureDaemonAgents(inputOpts: {\n all: boolean\n names: string[]\n cwd: string\n}): Promise<void> {\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return\n }\n\n const detected = scanLocalDaemonAgents()\n if (detected.length === 0) {\n console.log(pc.yellow('No supported local agent CLIs were found on PATH.'))\n console.log(pc.dim('Scanned: codex, claude, openclaw, hermes'))\n return\n }\n\n const existing = await daemonSelfRequest<{ agents?: RegisteredDaemonAgent[] }>(\n profile.server,\n profile.token,\n '/api/daemon/self/agents',\n )\n const registered = existing.agents ?? []\n const selected = await selectCandidates(detected, inputOpts)\n if (selected.length === 0) {\n console.log(pc.dim('No agents selected.'))\n return\n }\n\n const cwd = resolve(inputOpts.cwd)\n let created = 0\n let skipped = 0\n\n for (const candidate of selected) {\n const alreadyRegistered = registered.find((agent) => agent.name === candidate.name)\n if (alreadyRegistered) {\n skipped += 1\n console.log(\n pc.dim(\n `Skipping ${candidate.name}: already registered as ${alreadyRegistered.id}`,\n ),\n )\n continue\n }\n\n const data = await daemonSelfRequest<{ agent: RegisteredDaemonAgent }>(\n profile.server,\n profile.token,\n '/api/daemon/self/agents',\n {\n method: 'POST',\n body: {\n name: candidate.name,\n kind: candidate.kind,\n command: candidate.command,\n args: [],\n cwd,\n env: null,\n },\n },\n )\n created += 1\n console.log(\n pc.green(`Registered ${pc.bold(data.agent.name)}`) +\n pc.dim(` (${data.agent.kind}, ${data.agent.command}, cwd ${cwd})`),\n )\n }\n\n console.log(pc.green(`Done. Registered ${created}, skipped ${skipped}.`))\n}\n\nfunction scanLocalDaemonAgents(): DaemonAgentCandidate[] {\n const candidates: DaemonAgentCandidate[] = []\n for (const spec of LOCAL_AGENT_SPECS) {\n const path = findExecutable(spec.command)\n if (!path) continue\n candidates.push({ ...spec, path })\n }\n return candidates\n}\n\nfunction findExecutable(command: string): string | null {\n const lookupCommand = process.platform === 'win32' ? 'where' : 'which'\n const result = spawnSync(lookupCommand, [command], {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n if (result.status !== 0) return null\n return result.stdout.split(/\\r?\\n/).find((line) => line.trim())?.trim() ?? null\n}\n\nasync function selectCandidates(\n detected: DaemonAgentCandidate[],\n opts: { all: boolean; names: string[] },\n): Promise<DaemonAgentCandidate[]> {\n if (opts.all) return detected\n\n const requested = new Set(opts.names.map((name) => name.toLowerCase()))\n if (requested.size > 0) {\n const selected = detected.filter((candidate) => requested.has(candidate.name.toLowerCase()))\n const missing = [...requested].filter(\n (name) => !detected.some((candidate) => candidate.name.toLowerCase() === name),\n )\n for (const name of missing) {\n console.log(pc.yellow(`Not detected on PATH: ${name}`))\n }\n return selected\n }\n\n if (!process.stdin.isTTY) {\n console.error(pc.red('Interactive selection requires a TTY. Use --all or --agent <name...>.'))\n process.exitCode = 1\n return []\n }\n\n console.log(pc.bold('Detected local agents:'))\n detected.forEach((candidate, index) => {\n console.log(\n ` ${index + 1}. ${pc.bold(candidate.name)} ` +\n pc.dim(`${candidate.kind} / ${candidate.command} / ${candidate.path}`),\n )\n })\n\n const rl = createInterface({ input, output })\n try {\n const answer = await rl.question(\n 'Select agents to register (comma-separated numbers, \"all\", or empty for all): ',\n )\n const value = answer.trim().toLowerCase()\n if (!value || value === 'all' || value === 'a') return detected\n if (value === 'none' || value === 'n') return []\n\n const indexes = new Set(\n value\n .split(',')\n .map((part) => Number(part.trim()))\n .filter((index) => Number.isInteger(index) && index >= 1 && index <= detected.length),\n )\n return detected.filter((_, index) => indexes.has(index + 1))\n } finally {\n rl.close()\n }\n}\n\nasync function daemonSelfRequest<T>(\n server: string,\n token: string,\n path: string,\n opts?: { method?: string; body?: unknown },\n): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n }\n if (opts?.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n const res = await fetch(`${server}${path}`, {\n method: opts?.method ?? 'GET',\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) {\n throw new Error(data.error ?? data.message ?? res.statusText)\n }\n return data as T\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken } from '../config/server'\nimport { createClient } from '../client/http'\n\nexport const appsCommand = new Command('apps')\n .description('List installed apps')\n .option('--json', 'Output as JSON')\n .action(async (opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n const client = createClient(serverUrl, token)\n\n try {\n const data = await client.listApps()\n const apps = data.apps ?? []\n\n if (opts.json || globalOpts.json) {\n console.log(JSON.stringify(apps, null, 2))\n return\n }\n\n if (apps.length === 0) {\n console.log(pc.yellow('No apps installed'))\n return\n }\n\n for (const app of apps) {\n const status =\n app.status === 'running'\n ? pc.green('●')\n : app.status === 'errored'\n ? pc.red('●')\n : pc.gray('○')\n\n console.log(`${status} ${pc.bold(app.name)} v${app.version}`)\n if (app.description) {\n console.log(` ${pc.dim(app.description)}`)\n }\n if (app.commands?.length > 0) {\n console.log(\n ` Commands: ${app.commands.map((c: any) => pc.cyan(c.name)).join(', ')}`,\n )\n }\n if (app.actions?.length > 0) {\n console.log(\n ` Actions: ${app.actions.map((a: any) => pc.yellow(a.name)).join(', ')}`,\n )\n }\n console.log()\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { authHeaders } from '../config/server'\n\nexport interface ApiError {\n error: string\n status?: number\n}\n\nasync function request(\n url: string,\n method: string,\n token?: string,\n body?: any,\n): Promise<any> {\n let res: Response\n try {\n res = await fetch(url, {\n method,\n headers: authHeaders(token),\n body: body ? JSON.stringify(body) : undefined,\n })\n } catch (e: any) {\n // Node's fetch throws \"fetch failed\" for any network-level failure;\n // the real reason (ECONNREFUSED, ENOTFOUND, timeout, ...) lives in\n // the `cause` chain. Surface it so the CLI user knows what to fix.\n const cause = e?.cause\n const code = cause?.code\n const parsed = (() => {\n try {\n return new URL(url)\n } catch {\n return null\n }\n })()\n const origin = parsed ? `${parsed.protocol}//${parsed.host}` : url\n\n let hint = ''\n if (code === 'ECONNREFUSED') {\n hint = ` — nothing is listening on ${origin}. Run \\`bot server start\\` to pick a server, or point at a different one with \\`-s <url>\\` or BOTAPP_SERVER.`\n } else if (code === 'ENOTFOUND') {\n hint = ` — cannot resolve host ${parsed?.hostname ?? origin}. Check the URL in ~/.botapp/config.yaml.`\n } else if (code === 'ETIMEDOUT' || code === 'UND_ERR_CONNECT_TIMEOUT') {\n hint = ` — connection to ${origin} timed out.`\n } else if (code) {\n hint = ` (${code})`\n } else if (cause?.message) {\n hint = ` — ${cause.message}`\n }\n\n throw new Error(`Cannot reach ${origin}${hint}`)\n }\n\n const data = await res.json().catch(() => null)\n\n if (!res.ok) {\n const msg = data?.error ?? data?.message ?? `HTTP ${res.status}`\n throw Object.assign(new Error(msg), { status: res.status })\n }\n\n return data\n}\n\nexport function createClient(serverUrl: string, token?: string) {\n return {\n async health() {\n return request(`${serverUrl}/health`, 'GET')\n },\n\n async listApps() {\n return request(`${serverUrl}/api/apps`, 'GET', token)\n },\n\n async getApp(name: string) {\n return request(`${serverUrl}/api/apps/${name}`, 'GET', token)\n },\n\n async runCommand(app: string, command: string, params: Record<string, any>) {\n return request(\n `${serverUrl}/api/apps/${app}/commands/${command}`,\n 'POST',\n token,\n params,\n )\n },\n\n async runAction(app: string, action: string, params: Record<string, any>) {\n return request(\n `${serverUrl}/api/apps/${app}/actions/${action}`,\n 'POST',\n token,\n params,\n )\n },\n }\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken } from '../config/server'\nimport { createClient } from '../client/http'\n\nexport const runCommand = new Command('run')\n .description('Run an app command')\n .argument('<app>', 'App name')\n .argument('<command>', 'Command name')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(async (appName, commandName, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n const client = createClient(serverUrl, token)\n\n const params = parseKwargs(process.argv.slice(process.argv.indexOf(commandName) + 1))\n\n try {\n const data = await client.runCommand(appName, commandName, params)\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else if (data.status === 'success') {\n console.log(data.result)\n } else {\n console.error(pc.red(`Error: ${data.error}`))\n process.exitCode = 1\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nfunction parseKwargs(args: string[]): Record<string, any> {\n const params: Record<string, any> = {}\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const next = args[i + 1]\n\n if (!next || next.startsWith('--')) {\n params[key] = true\n } else {\n const num = Number(next)\n params[key] = isNaN(num) ? next : num\n i++\n }\n }\n }\n\n return params\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { updateActiveProfile } from '../config/profile'\nimport { resolveServerUrl } from '../config/server'\n\nexport const loginCommand = new Command('login')\n .description('Login to a botapp server')\n .option('-s, --server <url>', 'Server URL')\n .action(async (opts) => {\n const serverUrl = resolveServerUrl(opts.server)\n console.log(`Connecting to ${pc.cyan(serverUrl)}...`)\n\n try {\n const res = await fetch(`${serverUrl}/health`)\n if (!res.ok) {\n console.error(pc.red(`Server returned ${res.status}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json()\n\n if (data.token) {\n updateActiveProfile({\n server: serverUrl,\n token: data.token,\n user_id: 'local',\n agent_id: 'local-agent',\n })\n console.log(pc.green('Logged in successfully'))\n console.log(` Server: ${pc.cyan(serverUrl)}`)\n console.log(` Mode: ${data.mode}`)\n console.log(` Token: ${pc.dim(data.token.slice(0, 12) + '...')}`)\n } else {\n console.log(pc.yellow('Server did not return a token (hosted mode login not yet implemented)'))\n }\n } catch (e: any) {\n const code = e?.cause?.code\n const extra =\n code === 'ECONNREFUSED'\n ? ` — nothing is listening. Run \\`bot server start\\` to pick a server, or set BOTAPP_SERVER to point at a running instance.`\n : code === 'ENOTFOUND'\n ? ` — cannot resolve hostname. Check the URL.`\n : code\n ? ` (${code})`\n : ''\n console.error(pc.red(`Cannot reach ${serverUrl}${extra}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport { resolve, basename } from 'node:path'\nimport { existsSync, mkdirSync, symlinkSync, cpSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nconst APPS_DIR = join(homedir(), '.botapp', 'apps')\n\nexport const installCommand = new Command('install')\n .description('Install an app from a local path')\n .argument('<path>', 'Path to the app directory')\n .option('--dev', 'Install in dev mode (symlink)')\n .action(async (appPath, opts) => {\n const absPath = resolve(appPath)\n\n if (!existsSync(absPath)) {\n console.error(pc.red(`Path not found: ${absPath}`))\n process.exitCode = 1\n return\n }\n\n const manifestPath = join(absPath, 'botapp.app.json')\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`No botapp.app.json found in ${absPath}`))\n process.exitCode = 1\n return\n }\n\n let manifest: any\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n console.error(pc.red('Failed to parse botapp.app.json'))\n process.exitCode = 1\n return\n }\n\n const appName = manifest.name || basename(absPath)\n const targetDir = join(APPS_DIR, appName)\n\n mkdirSync(APPS_DIR, { recursive: true })\n\n if (existsSync(targetDir)) {\n console.log(pc.yellow(`App \"${appName}\" is already installed. Reinstalling...`))\n const { rmSync } = await import('node:fs')\n rmSync(targetDir, { recursive: true, force: true })\n }\n\n if (opts.dev) {\n symlinkSync(absPath, targetDir, 'dir')\n console.log(pc.green(`Installed ${pc.bold(appName)} in dev mode (symlink)`))\n console.log(` ${pc.dim(absPath)} → ${pc.dim(targetDir)}`)\n } else {\n cpSync(absPath, targetDir, { recursive: true })\n console.log(pc.green(`Installed ${pc.bold(appName)}`))\n console.log(` ${pc.dim(targetDir)}`)\n }\n\n console.log(pc.dim('Restart the server to load the new app.'))\n })\n","import { Command } from 'commander'\nimport { existsSync, rmSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nconst APPS_DIR = join(homedir(), '.botapp', 'apps')\n\nexport const uninstallCommand = new Command('uninstall')\n .description('Uninstall an app')\n .argument('<name>', 'App name to uninstall')\n .action(async (name) => {\n const targetDir = join(APPS_DIR, name)\n\n if (!existsSync(targetDir)) {\n console.error(pc.red(`App \"${name}\" is not installed`))\n process.exitCode = 1\n return\n }\n\n rmSync(targetDir, { recursive: true, force: true })\n console.log(pc.green(`Uninstalled ${pc.bold(name)}`))\n console.log(pc.dim('Restart the server to apply changes.'))\n })\n","import { Command } from 'commander'\nimport { resolve, basename, join } from 'node:path'\nimport { existsSync, mkdirSync, symlinkSync, readFileSync, lstatSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { spawn } from 'node:child_process'\nimport pc from 'picocolors'\nimport { resolveServerUrl } from '../config/server'\n\nconst APPS_DIR = join(homedir(), '.botapp', 'apps')\n\nexport const devCommand = new Command('dev')\n .description('Start development mode for an app')\n .argument('[path]', 'Path to the app directory', '.')\n .option('-p, --port <port>', 'Server port', '7100')\n .action(async (appPath, opts) => {\n const absPath = resolve(appPath)\n\n if (!existsSync(absPath)) {\n console.error(pc.red(`Path not found: ${absPath}`))\n process.exitCode = 1\n return\n }\n\n const manifestPath = join(absPath, 'botapp.app.json')\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`No botapp.app.json found in ${absPath}`))\n process.exitCode = 1\n return\n }\n\n let manifest: any\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n console.error(pc.red('Failed to parse botapp.app.json'))\n process.exitCode = 1\n return\n }\n\n const appName = manifest.name || basename(absPath)\n const targetDir = join(APPS_DIR, appName)\n\n mkdirSync(APPS_DIR, { recursive: true })\n\n if (!existsSync(targetDir)) {\n symlinkSync(absPath, targetDir, 'dir')\n console.log(pc.blue(`Linked ${pc.bold(appName)} → ${pc.dim(absPath)}`))\n } else {\n const stat = lstatSync(targetDir)\n if (stat.isSymbolicLink()) {\n console.log(pc.dim(`${appName} already linked`))\n } else {\n console.log(pc.yellow(`${appName} is installed (not symlinked). Using existing installation.`))\n }\n }\n\n const serverUrl = resolveServerUrl()\n let serverRunning = false\n try {\n const res = await fetch(`${serverUrl}/health`)\n serverRunning = res.ok\n } catch {\n // not running\n }\n\n if (serverRunning) {\n console.log(pc.green(`Server already running at ${serverUrl}`))\n console.log(pc.yellow('Restart the server to load the new app.'))\n } else {\n const serverEntry = findServerEntry()\n if (!serverEntry) {\n console.log(\n pc.yellow('No local server found.') +\n ` App ${pc.bold(appName)} has been linked to ${pc.dim(targetDir)}\\n` +\n `\\nStart the server separately, then restart it to load the app:\\n` +\n ` ${pc.cyan('bot server start')}`,\n )\n return\n }\n\n console.log(pc.blue('Starting botapp server...'))\n\n const child = spawn('node', ['--import', 'tsx', serverEntry], {\n env: { ...process.env, PORT: opts.port },\n stdio: 'inherit',\n })\n\n child.on('exit', (code) => {\n process.exitCode = code ?? 0\n })\n\n process.on('SIGINT', () => {\n child.kill('SIGINT')\n })\n }\n })\n\nfunction findServerEntry(): string | null {\n const candidates = [\n resolve(process.cwd(), 'packages/server/src/index.ts'),\n resolve(process.cwd(), '../server/src/index.ts'),\n ]\n for (const c of candidates) {\n if (existsSync(c)) return c\n }\n return null\n}\n","import { Command } from 'commander'\nimport { WebSocket } from 'ws'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken } from '../config/server'\n\nexport const connectCommand = new Command('connect')\n .description('Open a persistent WebSocket connection and stream events')\n .option('--subscribe <patterns>', 'Comma-separated event patterns to subscribe to', '*')\n .action(async (opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n const wsUrl = serverUrl.replace(/^http/, 'ws')\n const url = token\n ? `${wsUrl}/ws/agent?token=${token}`\n : `${wsUrl}/ws/agent`\n\n console.log(pc.blue(`Connecting to ${serverUrl}...`))\n\n const ws = new WebSocket(url)\n\n ws.on('open', () => {\n console.log(pc.green('Connected'))\n\n const patterns = opts.subscribe.split(',').map((p: string) => p.trim())\n ws.send(JSON.stringify({\n type: 'subscribe',\n patterns,\n }))\n })\n\n ws.on('message', (raw) => {\n try {\n const frame = JSON.parse(raw.toString())\n\n switch (frame.type) {\n case 'subscribed':\n console.log(pc.dim(`Subscribed to: ${frame.patterns.join(', ')}`))\n break\n\n case 'event': {\n const e = frame.event\n const ts = new Date(e.timestamp).toLocaleTimeString()\n const status = e.result?.status === 'success'\n ? pc.green('✓')\n : pc.red('✗')\n console.log(\n `${pc.dim(ts)} ${status} ${pc.bold(e.app)}.${e.action} [${e.source}]` +\n (e.duration_ms != null ? pc.dim(` ${e.duration_ms}ms`) : ''),\n )\n if (globalOpts.verbose && e.result) {\n console.log(pc.dim(` → ${JSON.stringify(e.result)}`))\n }\n break\n }\n\n case 'result':\n if (frame.status === 'success') {\n console.log(pc.green(`Result: ${JSON.stringify(frame.output)}`))\n } else {\n console.log(pc.red(`Error: ${frame.error}`))\n }\n break\n\n case 'pong':\n break\n\n case 'error':\n console.log(pc.red(`Server error: ${frame.message}`))\n break\n\n default:\n if (globalOpts.verbose) {\n console.log(pc.dim(JSON.stringify(frame)))\n }\n }\n } catch {\n console.log(pc.dim(raw.toString()))\n }\n })\n\n ws.on('close', (code, reason) => {\n console.log(pc.yellow(`Disconnected (${code}: ${reason.toString() || 'no reason'})`))\n process.exit(0)\n })\n\n ws.on('error', (err) => {\n console.error(pc.red(`WebSocket error: ${err.message}`))\n process.exit(1)\n })\n\n // Keep alive\n const pingInterval = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'ping' }))\n }\n }, 30000)\n\n process.on('SIGINT', () => {\n clearInterval(pingInterval)\n ws.close()\n })\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\nimport { createClient } from '../client/http'\n\nexport const eventsCommand = new Command('events')\n .description('Fetch recent events')\n .option('--app <name>', 'Filter by app name')\n .option('--since <timestamp>', 'Show events since ISO timestamp')\n .option('--limit <n>', 'Max events to return', '20')\n .option('--json', 'Output as JSON')\n .action(async (opts, cmd) => {\n const globalOpts = { ...(cmd.parent?.opts() ?? {}), ...opts }\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n const params = new URLSearchParams()\n if (opts.app) params.set('app', opts.app)\n if (opts.since) params.set('since', opts.since)\n if (opts.limit) params.set('limit', opts.limit)\n\n const url = `${serverUrl}/api/events?${params.toString()}`\n\n try {\n const res = await fetch(url, {\n headers: {\n ...authHeaders(token),\n },\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as { events: any[] }\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n if (data.events.length === 0) {\n console.log(pc.dim('No events found'))\n return\n }\n\n for (const e of data.events.reverse()) {\n const ts = new Date(e.timestamp).toLocaleTimeString()\n const status = e.result?.status === 'success'\n ? pc.green('✓')\n : pc.red('✗')\n console.log(\n `${pc.dim(ts)} ${status} ${pc.bold(e.app)}.${e.action} [${e.source}]` +\n (e.duration_ms != null ? pc.dim(` ${e.duration_ms}ms`) : ''),\n )\n if (globalOpts.verbose && e.result) {\n console.log(pc.dim(` → ${JSON.stringify(e.result)}`))\n }\n }\n\n console.log(pc.dim(`\\n${data.events.length} event(s)`))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const agentCommand = new Command('agent')\n .description('Manage agents')\n\nagentCommand\n .command('list')\n .description('List agents for current user')\n .action(async (_opts, cmd) => {\n const globalOpts = cmd.parent?.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/auth/agents`, {\n headers: authHeaders(token),\n })\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n const data = await res.json() as { agents: any[] }\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n if (data.agents.length === 0) {\n console.log(pc.dim('No agents'))\n return\n }\n\n for (const agent of data.agents) {\n console.log(`${pc.bold(agent.name)} ${pc.dim(`(${agent.id})`)}`)\n console.log(` Token: ${pc.dim(agent.token)}`)\n console.log(` Created: ${pc.dim(agent.createdAt)}`)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nagentCommand\n .command('create')\n .description('Create a new agent')\n .argument('<name>', 'Agent name')\n .action(async (name, _opts, cmd) => {\n const globalOpts = cmd.parent?.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/auth/agents`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({ name }),\n })\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n const data = await res.json() as { agent: any }\n\n console.log(pc.green(`Created agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n console.log(` Token: ${data.agent.token}`)\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nagentCommand\n .command('info')\n .description('Show current user and agent info')\n .action(async (_opts, cmd) => {\n const globalOpts = cmd.parent?.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/auth/me`, {\n headers: authHeaders(token),\n })\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n const data = await res.json() as any\n\n if (globalOpts.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n console.log(`User: ${pc.bold(data.user.email)} ${pc.dim(`(${data.user.id})`)}`)\n console.log(`Agent: ${pc.bold(data.currentAgent.name)} ${pc.dim(`(${data.currentAgent.id})`)}`)\n if (data.agents.length > 1) {\n console.log(`\\nAll agents:`)\n for (const a of data.agents) {\n const current = a.id === data.currentAgent.id ? pc.green(' (current)') : ''\n console.log(` ${pc.bold(a.name)} ${pc.dim(a.id)}${current}`)\n }\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport { readFileSync, existsSync } from 'node:fs'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const registerCommand = new Command('register')\n .description('Register an external app via HTTP bridge manifest')\n .argument('<manifest>', 'Path to YAML manifest file')\n .option('--adapter <url>', 'Override base URL from manifest')\n .action(async (manifestPath, opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`Error: Manifest not found: ${manifestPath}`))\n process.exitCode = 1\n return\n }\n\n try {\n const raw = readFileSync(manifestPath, 'utf-8')\n\n const res = await fetch(`${serverUrl}/api/bridges/http`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({\n manifest: raw,\n adapterUrl: opts.adapter,\n }),\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as any\n console.log(pc.green(`Registered bridge: ${pc.bold(data.name)}`))\n if (data.commands?.length > 0) {\n console.log(` Commands: ${data.commands.join(', ')}`)\n }\n if (data.actions?.length > 0) {\n console.log(` Actions: ${data.actions.join(', ')}`)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport { readFileSync, existsSync } from 'node:fs'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const wrapCommand = new Command('wrap')\n .description('Register CLI tool as app commands via YAML manifest')\n .argument('<manifest>', 'Path to CLI wrapper YAML manifest')\n .action(async (manifestPath, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n if (!existsSync(manifestPath)) {\n console.error(pc.red(`Error: Manifest not found: ${manifestPath}`))\n process.exitCode = 1\n return\n }\n\n try {\n const raw = readFileSync(manifestPath, 'utf-8')\n\n const res = await fetch(`${serverUrl}/api/bridges/cli`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({ manifest: raw }),\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as any\n console.log(pc.green(`Wrapped CLI: ${pc.bold(data.name)}`))\n if (data.commands?.length > 0) {\n console.log(` Commands: ${data.commands.join(', ')}`)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const reloadCommand = new Command('reload')\n .description('Reload an app')\n .argument('<app>', 'App name to reload')\n .action(async (appName, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n const res = await fetch(`${serverUrl}/api/apps/${appName}/reload`, {\n method: 'POST',\n headers: authHeaders(token),\n body: '{}',\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n console.error(pc.red(`Error: ${(body as any).error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n const data = await res.json() as any\n console.log(pc.green(`Reloaded: ${pc.bold(data.name)} (${data.status})`))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\nexport const configCommand = new Command('config')\n .description('View or set app configuration')\n .argument('[app]', 'App name')\n .argument('[key]', 'Config key')\n .argument('[value]', 'Config value (omit to read)')\n .action(async (appName, key, value, _opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n if (!appName) {\n // Show server config\n try {\n const res = await fetch(`${serverUrl}/api/config`, {\n headers: authHeaders(token),\n })\n const data = await res.json()\n console.log(JSON.stringify(data, null, 2))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n return\n }\n\n if (!key) {\n // Show app info\n try {\n const res = await fetch(`${serverUrl}/api/apps/${appName}`, {\n headers: authHeaders(token),\n })\n if (!res.ok) {\n console.error(pc.red(`App not found: ${appName}`))\n process.exitCode = 1\n return\n }\n const data = await res.json()\n console.log(JSON.stringify(data, null, 2))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n return\n }\n\n console.log(pc.dim(`Config management for ${appName}.${key}${value ? ` = ${value}` : ''}`))\n console.log(pc.dim('(Config persistence coming in a future update)'))\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\nimport { createClient } from '../client/http'\n\ninterface SkillJson {\n name: string\n description: string\n source: 'file' | 'url' | 'convention' | 'auto'\n sourceUrl: string | null\n warning: string | null\n authorContent: string | null\n schemaContent: string\n full: string\n}\n\nasync function fetchSkill(\n serverUrl: string,\n token: string | undefined,\n appName: string,\n opts: { json?: boolean; refresh?: boolean },\n): Promise<SkillJson | string> {\n const qs = new URLSearchParams()\n if (opts.json) qs.set('format', 'json')\n if (opts.refresh) qs.set('refresh', '1')\n const url = `${serverUrl}/api/apps/${appName}/skill${qs.toString() ? `?${qs}` : ''}`\n\n let res: Response\n try {\n res = await fetch(url, { headers: authHeaders(token) })\n } catch (e: any) {\n const code = e?.cause?.code\n const hint =\n code === 'ECONNREFUSED'\n ? ` — nothing is listening. Run \\`bot server start\\` to pick a server, or set BOTAPP_SERVER to point at a running instance.`\n : code\n ? ` (${code})`\n : ''\n throw new Error(`Cannot reach ${serverUrl}${hint}`)\n }\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n throw new Error((body as any)?.error ?? `HTTP ${res.status}`)\n }\n\n if (opts.json) {\n return (await res.json()) as SkillJson\n }\n return await res.text()\n}\n\nconst skillSingle = new Command('skill')\n .description(\"Fetch an app's skill doc (agent-facing narrative + reference)\")\n .argument('[app]', 'App name. Omit to list all apps with their skill source.')\n .option('--json', \"Emit structured JSON instead of markdown\")\n .option('--refresh', 'Bypass the server-side URL cache')\n .option('--bundle', 'When no app given, print every app as one big markdown doc')\n .action(async (appName: string | undefined, opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const token = resolveToken(globalOpts.token)\n\n try {\n // No app: list mode (or bundle mode).\n if (!appName) {\n const client = createClient(serverUrl, token)\n const data = await client.listApps()\n const apps = (data.apps ?? []) as Array<{\n name: string\n description?: string\n skill?: string\n }>\n\n if (opts.bundle) {\n const chunks: string[] = [\n '# botapp server — app skills bundle',\n '',\n `_Generated from ${serverUrl}. ${apps.length} app(s)._`,\n '',\n '---',\n '',\n ]\n for (const app of apps) {\n try {\n const md = (await fetchSkill(serverUrl, token, app.name, {})) as string\n chunks.push(md, '', '---', '')\n } catch (e: any) {\n chunks.push(\n `# ${app.name}`,\n '',\n `> (failed to load: ${e.message})`,\n '',\n '---',\n '',\n )\n }\n }\n console.log(chunks.join('\\n'))\n return\n }\n\n if (globalOpts.json || opts.json) {\n console.log(JSON.stringify(apps, null, 2))\n return\n }\n\n if (apps.length === 0) {\n console.log(pc.yellow('No apps installed'))\n return\n }\n\n console.log(pc.bold('App skills:'))\n console.log()\n for (const app of apps) {\n const src = app.skill\n ? /^https?:\\/\\//i.test(app.skill)\n ? pc.cyan(app.skill)\n : pc.green(app.skill)\n : pc.dim('(none declared — fallback to ./SKILL.md or auto-gen)')\n console.log(\n ` ${pc.bold(app.name)}${pc.dim(` — ${app.description ?? ''}`)}`,\n )\n console.log(` skill: ${src}`)\n }\n console.log()\n console.log(\n pc.dim(\n `Run \\`bot skill <app>\\` to fetch one, or \\`bot skill --bundle\\` for everything.`,\n ),\n )\n return\n }\n\n // Specific app.\n const wantJson = globalOpts.json || opts.json\n const result = await fetchSkill(serverUrl, token, appName, {\n json: wantJson,\n refresh: opts.refresh,\n })\n\n if (wantJson) {\n console.log(JSON.stringify(result, null, 2))\n } else {\n console.log(result)\n }\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n .addHelpText(\n 'after',\n `\nExamples:\n $ bot skill List every app with its skill source\n $ bot skill trading Print the trading app's skill markdown\n $ bot skill trading --json Structured response (source, url, content)\n $ bot skill trading --refresh Bypass the 5-minute URL cache\n $ bot skill --bundle Print every app's skill in one markdown doc\n\nSources, in lookup order:\n manifest.skill (URL) Fetched, cached 5 min\n manifest.skill (path) Read from disk relative to the app's manifest\n ./SKILL.md (convention) Read if no manifest field\n auto Generated from registered commands/actions/widgets\n`,\n )\n\nexport const skillCommand = skillSingle\n","import { hostname } from 'node:os'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl } from '../config/server'\nimport { loadDaemonProfile, saveDaemonProfile } from '../config/daemon'\nimport { runBrowserAuth } from '../auth/browser-auth'\nimport { registerAllDetectedAgents } from './daemon-agent-config'\nimport { runDaemonConnectionLoop } from './daemon'\n\n/**\n * Pair this machine as a botapp daemon. Two ways in, picked in order:\n * 1. --token <jwt> — explicit token (air-gapped, dashboard-issued, scripts)\n * 2. browser flow — loopback + /cli-auth in the dashboard; the\n * user approves in a real browser session\n */\nexport const pairingCommand = new Command('pairing')\n .alias('pair')\n .description('Pair this machine as a botapp daemon')\n .option('--token <token>', 'Pairing token (skip browser flow)')\n .option('--name <name>', 'Daemon name', hostname())\n .option('--app-url <url>', 'Dashboard URL (defaults to server URL)')\n .option('--no-browser', 'Error instead of opening a browser')\n .option('--run', 'After pairing, register local agents and run the daemon (single-process onboarding)')\n .action(async (opts, cmd) => {\n const globalOpts = cmd.parent?.opts() ?? {}\n const serverUrl = resolveServerUrl(globalOpts.server)\n const name = opts.name\n\n try {\n const grant = await obtainPairingToken({\n serverUrl,\n appUrl: opts.appUrl,\n name,\n explicitToken: opts.token,\n allowBrowser: opts.browser !== false,\n })\n if (!grant) {\n console.error(\n pc.red(\n 'No pairing token and browser flow disabled. Pass --token, or drop --no-browser.',\n ),\n )\n process.exitCode = 1\n return\n }\n\n if (grant.userEmail) {\n console.log(pc.green(`Authenticated as ${pc.bold(grant.userEmail)}`))\n }\n\n const res = await fetch(`${serverUrl}/api/daemon/pair`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: grant.pairingToken,\n name,\n machine: hostname(),\n }),\n })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) {\n console.error(pc.red(`Error: ${data.error ?? res.statusText}`))\n process.exitCode = 1\n return\n }\n\n saveDaemonProfile({\n server: serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n })\n\n console.log(pc.green(`Paired daemon: ${pc.bold(data.daemon.name)}`))\n console.log(` ID: ${data.daemon.id}`)\n console.log(` Server: ${serverUrl}`)\n\n if (opts.run) {\n try {\n const summary = await registerAllDetectedAgents({\n server: serverUrl,\n token: data.token,\n cwd: process.cwd(),\n })\n if (summary.created.length > 0) {\n console.log(pc.green(`Registered agents: ${summary.created.join(', ')}`))\n } else if (summary.detected === 0) {\n console.log(pc.dim('No local agent CLIs detected (codex, claude, …) — chat will be unavailable until one is installed.'))\n }\n } catch (err: any) {\n console.log(pc.yellow(`Agent auto-registration failed: ${err?.message ?? err}`))\n }\n\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('Pairing succeeded but daemon profile is missing — cannot run.'))\n process.exitCode = 1\n return\n }\n await runDaemonConnectionLoop(profile)\n return\n }\n\n console.log(pc.dim('\\nNext: botapp daemon agent add codex --command codex'))\n console.log(pc.dim('Then: botapp daemon run'))\n } catch (e: any) {\n console.error(pc.red(`Error: ${e.message}`))\n process.exitCode = 1\n }\n })\n\ninterface Grant {\n pairingToken: string\n userEmail?: string\n}\n\nasync function obtainPairingToken(opts: {\n serverUrl: string\n appUrl?: string\n name: string\n explicitToken?: string\n allowBrowser: boolean\n}): Promise<Grant | null> {\n if (opts.explicitToken) return { pairingToken: opts.explicitToken }\n if (!opts.allowBrowser) return null\n\n const appUrl = opts.appUrl ?? opts.serverUrl\n const result = await runBrowserAuth({\n serverUrl: opts.serverUrl,\n appUrl,\n scope: 'pair',\n name: opts.name,\n })\n if (!result.pairingToken) {\n throw new Error('server returned no pairing token')\n }\n return { pairingToken: result.pairingToken, userEmail: result.userEmail }\n}\n","import { spawn } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { Command } from 'commander'\nimport { WebSocket } from 'ws'\nimport pc from 'picocolors'\nimport { loadDaemonProfile } from '../config/daemon'\nimport { createDaemonAgentConfigCommand } from './daemon-agent-config'\n\ninterface DaemonAgent {\n id: string\n name: string\n kind: string\n command: string\n args: string[]\n cwd: string | null\n env: Record<string, string> | null\n}\n\ninterface DaemonJob {\n id: string\n query: string\n daemonId: string\n conversationId?: string | null\n /** Provider-native session handle returned by the last turn in this\n * conversation. Adapters that support resume (e.g. claude-code) should\n * pass it back to the child process instead of starting fresh. */\n resumeSessionId?: string | null\n agent: DaemonAgent\n}\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0'\n id?: number | string\n method?: string\n params?: any\n result?: any\n error?: { code: number; message: string }\n}\n\ninterface CodexToolCall {\n id: string\n type: string\n status?: string\n command?: string\n output?: string\n exitCode?: number | null\n}\n\ninterface CodexRunResult {\n kind: 'codex'\n text: string\n messages: string[]\n toolCalls: CodexToolCall[]\n rawEvents: any[]\n}\n\ninterface ClaudeCodeToolCall {\n id: string\n name: string\n input?: any\n output?: string\n isError?: boolean\n}\n\ninterface ClaudeCodeRunResult {\n kind: 'claude-code'\n text: string\n messages: string[]\n toolCalls: ClaudeCodeToolCall[]\n /** Session id returned by `claude --output-format stream-json`. Used by\n * the server on the next turn to set `resumeSessionId` and re-enter the\n * same conversation via `claude --resume <id>`. */\n sessionId: string | null\n rawEvents: any[]\n}\n\ninterface OpenClawToolCall {\n id: string\n name: string\n arguments?: any\n messageId?: string\n output?: string\n isError?: boolean\n}\n\ninterface OpenClawRunResult {\n kind: 'openclaw'\n text: string\n messages: string[]\n toolCalls: OpenClawToolCall[]\n sessionId: string | null\n requestedSessionId: string | null\n sessionKey: string | null\n sessionFile: string | null\n rawEvents: any[]\n}\n\ninterface OpenClawTailState {\n startedAtMs: number\n sessionDir: string\n sessionStorePath: string\n requestedSessionId: string\n sessionKey: string | null\n sessionId: string | null\n sessionResolvedBy: 'key-fragment' | 'entry-session-id' | null\n initialOffsets: Map<string, number>\n selectedFile: string | null\n offset: number\n pending: string\n seenEventIds: Set<string>\n}\n\ninterface HermesToolCall {\n id: string\n name: string\n arguments?: any\n output?: string\n isError?: boolean\n}\n\ninterface HermesRunResult {\n kind: 'hermes'\n text: string\n messages: string[]\n toolCalls: HermesToolCall[]\n sessionId: string | null\n sessionFile: string | null\n rawMessages: any[]\n}\n\ninterface HermesTailState {\n startedAtMs: number\n sessionDir: string\n resumeSessionId: string | null\n initialMessageCounts: Map<string, number>\n selectedFile: string | null\n processedMessages: number\n}\n\ntype JobUpdateSink = (update: Record<string, any>) => void\n\nexport const daemonCommand = new Command('daemon')\n .description('Manage and run the local botapp daemon')\n\ndaemonCommand\n .command('run')\n .description('Run the local daemon and wait for server jobs')\n .action(async () => {\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return\n }\n\n await runDaemonConnectionLoop(profile)\n })\n\ndaemonCommand\n .command('stop')\n .description('Stop the background daemon started by `bot launch`')\n .action(async () => {\n const pidFile = join(homedir(), '.botapp', 'daemon.pid')\n if (!existsSync(pidFile)) {\n console.log(pc.yellow('No background daemon PID file found.'))\n return\n }\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10)\n if (!Number.isInteger(pid) || pid <= 0) {\n console.error(pc.red(`Invalid PID in ${pidFile}`))\n process.exitCode = 1\n return\n }\n process.kill(pid, 'SIGTERM')\n console.log(pc.green(`Stopped daemon (pid ${pid})`))\n } catch (e: any) {\n console.error(pc.red(`Failed to stop daemon: ${e.message}`))\n process.exitCode = 1\n }\n })\n\ndaemonCommand\n .command('agent')\n .description('Manage agents hosted by this daemon')\n .addCommand(\n new Command('list')\n .description('List registered daemon agents')\n .action(async () => {\n const profile = requireProfile()\n if (!profile) return\n const data = await daemonRequest(profile.server, profile.token, '/api/daemon/self/agents')\n for (const agent of data.agents ?? []) {\n console.log(`${pc.bold(agent.name)} ${pc.dim(`(${agent.id})`)}`)\n console.log(` Kind: ${agent.kind}`)\n console.log(` Command: ${agent.command} ${(agent.args ?? []).join(' ')}`)\n if (agent.cwd) console.log(` CWD: ${agent.cwd}`)\n }\n }),\n )\n .addCommand(createDaemonAgentConfigCommand())\n\n .addCommand(\n new Command('add')\n .description('Register a local agent command')\n .argument('<name>', 'Name, e.g. codex, claude-code, openclaw, hermes, or hermes-agent')\n .requiredOption('--command <command>', 'Executable command')\n .option(\n '--kind <kind>',\n 'Agent adapter kind: acp, codex, claude-code, openclaw, hermes, hermes-agent, or shell',\n 'acp',\n )\n .option('--arg <arg...>', 'Argument passed to the executable')\n .option('--cwd <cwd>', 'Working directory for the agent process')\n .option('--env <entry...>', 'Environment entries in KEY=VALUE form')\n .action(async (name, opts) => {\n const profile = requireProfile()\n if (!profile) return\n const env = parseEnv(opts.env ?? [])\n const data = await daemonRequest(\n profile.server,\n profile.token,\n '/api/daemon/self/agents',\n {\n method: 'POST',\n body: {\n name,\n kind: opts.kind,\n command: opts.command,\n args: opts.arg ?? [],\n cwd: opts.cwd,\n env,\n },\n },\n )\n console.log(pc.green(`Registered daemon agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n console.log(` Command: ${data.agent.command} ${(data.agent.args ?? []).join(' ')}`)\n }),\n )\n .addCommand(\n new Command('remove')\n .alias('rm')\n .description('Remove a daemon agent by id or name')\n .argument('<agent>', 'Daemon agent id or name')\n .action(async (agent) => {\n const profile = requireProfile()\n if (!profile) return\n const data = await daemonRequest(\n profile.server,\n profile.token,\n `/api/daemon/self/agents/${encodeURIComponent(agent)}`,\n { method: 'DELETE' },\n )\n console.log(pc.green(`Removed daemon agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n }),\n )\n\nexport async function runDaemonConnectionLoop(\n profile: NonNullable<ReturnType<typeof loadDaemonProfile>>,\n): Promise<void> {\n const wsUrl = `${profile.server.replace(/^http/, 'ws')}/ws/daemon?token=${profile.token}`\n const baseRetryMs = envNumber(process.env, 'BOTAPP_DAEMON_RETRY_MS', 1000)\n const maxRetryMs = envNumber(process.env, 'BOTAPP_DAEMON_MAX_RETRY_MS', 30_000)\n let stopped = false\n let activeWs: WebSocket | null = null\n let retryMs = baseRetryMs\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n let resolveRetry: (() => void) | null = null\n\n const stop = () => {\n stopped = true\n if (activeWs && activeWs.readyState !== WebSocket.CLOSED) {\n activeWs.close()\n }\n if (retryTimer) {\n clearTimeout(retryTimer)\n retryTimer = null\n }\n resolveRetry?.()\n }\n\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n\n while (!stopped) {\n console.log(pc.blue(`Connecting daemon ${profile.daemonName} to ${profile.server}...`))\n const outcome = await runDaemonSocket(wsUrl, (ws) => {\n activeWs = ws\n })\n activeWs = null\n if (stopped) break\n\n const waitMs = outcome.opened ? baseRetryMs : retryMs\n retryMs = outcome.opened ? baseRetryMs : Math.min(retryMs * 2, maxRetryMs)\n console.log(pc.yellow(`Retrying daemon connection in ${Math.round(waitMs / 1000)}s...`))\n await new Promise<void>((resolveWait) => {\n resolveRetry = resolveWait\n retryTimer = setTimeout(() => {\n retryTimer = null\n resolveRetry = null\n resolveWait()\n }, waitMs)\n })\n }\n}\n\nfunction runDaemonSocket(\n wsUrl: string,\n setActiveWs: (ws: WebSocket) => void,\n): Promise<{ opened: boolean }> {\n return new Promise((resolveRun) => {\n const ws = new WebSocket(wsUrl)\n setActiveWs(ws)\n let opened = false\n let settled = false\n let ping: ReturnType<typeof setInterval> | null = null\n\n function finish(): void {\n if (settled) return\n settled = true\n if (ping) clearInterval(ping)\n resolveRun({ opened })\n }\n\n ws.on('open', () => {\n opened = true\n console.log(pc.green('Daemon connected'))\n ws.send(JSON.stringify({ type: 'daemon_ready' }))\n ping = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'ping' }))\n }, 30_000)\n })\n\n ws.on('message', (raw) => {\n void handleFrame(ws, raw.toString())\n })\n\n ws.on('close', (code, reason) => {\n console.log(pc.yellow(`Daemon disconnected (${code}: ${reason.toString() || 'no reason'})`))\n finish()\n })\n\n ws.on('error', (err) => {\n console.error(pc.red(`Daemon WebSocket error: ${err.message}`))\n if (!opened) {\n if (ws.readyState !== WebSocket.CLOSED) ws.terminate()\n finish()\n }\n })\n })\n}\n\nasync function handleFrame(ws: WebSocket, raw: string): Promise<void> {\n const frame = JSON.parse(raw)\n if (frame.type === 'daemon_job') {\n const job = frame.job as DaemonJob\n console.log(pc.blue(`Running ${job.agent.name} job ${job.id}`))\n ws.send(JSON.stringify({ type: 'daemon_job_started', jobId: job.id }))\n try {\n const result = await runAgentJob(job, (update) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({\n type: 'daemon_job_update',\n jobId: job.id,\n update,\n }))\n }\n })\n ws.send(JSON.stringify({\n type: 'daemon_job_result',\n jobId: job.id,\n status: 'succeeded',\n result,\n }))\n console.log(pc.green(`Completed job ${job.id}`))\n } catch (e: any) {\n ws.send(JSON.stringify({\n type: 'daemon_job_result',\n jobId: job.id,\n status: 'failed',\n error: e.message,\n }))\n console.error(pc.red(`Job ${job.id} failed: ${e.message}`))\n }\n return\n }\n\n if (frame.type === 'error') {\n console.error(pc.red(`Server error: ${frame.message}`))\n }\n}\n\nasync function runAgentJob(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n if (job.agent.kind === 'codex') {\n return runCodexAgent(job, update)\n }\n if (job.agent.kind === 'claude-code' || job.agent.kind === 'claude_code') {\n return runClaudeCodeAgent(job, update)\n }\n if (job.agent.kind === 'openclaw' || job.agent.kind === 'kimiclaw') {\n return runOpenClawAgent(job, update)\n }\n if (job.agent.kind === 'hermes' || job.agent.kind === 'hermes-agent') {\n return runHermesAgent(job, update)\n }\n if (job.agent.kind === 'shell') {\n return runShellAgent(job)\n }\n return runAcpAgent(job)\n}\n\nasync function runShellAgent(job: DaemonJob): Promise<string> {\n const child = spawn(job.agent.command, [...job.agent.args, job.query], {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n })\n let stdout = ''\n let stderr = ''\n child.stdout.on('data', (chunk) => {\n stdout += chunk.toString()\n })\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n const code = await new Promise<number | null>((resolve) => child.on('close', resolve))\n if (code !== 0) {\n throw new Error(stderr.trim() || `Agent exited with code ${code}`)\n }\n return stdout.trim()\n}\n\nasync function runCodexAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const args = [...job.agent.args]\n if (!args.includes('exec') && !args.includes('e')) {\n args.unshift('exec')\n }\n if (!args.includes('--json')) {\n args.push('--json')\n }\n if (!args.includes('--skip-git-repo-check')) {\n args.push('--skip-git-repo-check')\n }\n // Without this the child refuses to run `bot …` (or any model-proposed\n // command) in non-interactive mode — there's no terminal to approve on.\n // Skipped if the user already picked a sandbox/approval policy.\n if (!hasAnyFlag(args, [\n '--sandbox',\n '-s',\n '--ask-for-approval',\n '-a',\n '--full-auto',\n '--dangerously-bypass-approvals-and-sandbox',\n ])) {\n args.push('--dangerously-bypass-approvals-and-sandbox')\n }\n args.push(job.query)\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n let stderr = ''\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const result: CodexRunResult = {\n kind: 'codex',\n text: '',\n messages: [],\n toolCalls: [],\n rawEvents: [],\n }\n const toolCalls = new Map<string, CodexToolCall>()\n\n function processLine(line: string): void {\n if (!line.trim()) return\n try {\n const event = JSON.parse(line)\n result.rawEvents.push(event)\n update({ kind: 'codex_event', event })\n if (event?.type === 'item.completed' && event.item?.type === 'agent_message') {\n if (typeof event.item.text === 'string') {\n result.messages.push(event.item.text)\n update({ kind: 'message', text: event.item.text })\n }\n }\n if (\n (event?.type === 'item.started' || event?.type === 'item.completed') &&\n typeof event.item?.id === 'string' &&\n event.item?.type &&\n event.item.type !== 'agent_message'\n ) {\n const existing: CodexToolCall = toolCalls.get(event.item.id) ?? {\n id: event.item.id,\n type: String(event.item.type),\n }\n const next: CodexToolCall = {\n ...existing,\n type: String(event.item.type),\n status: event.item.status ?? existing.status,\n command: event.item.command ?? existing.command,\n output: event.item.aggregated_output ?? event.item.output ?? existing.output,\n exitCode: event.item.exit_code ?? existing.exitCode,\n }\n toolCalls.set(event.item.id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n } catch {\n // Ignore non-JSON progress lines; raw stdout remains the fallback.\n }\n }\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', processLine)\n\n const code = await new Promise<number | null>((resolve) => child.on('close', resolve))\n if (code !== 0) {\n throw new Error(stderr.trim() || `Codex exited with code ${code}`)\n }\n\n result.text = result.messages.at(-1)?.trim() || ''\n result.toolCalls = [...toolCalls.values()]\n return JSON.stringify(result)\n}\n\n/**\n * Claude Code adapter.\n *\n * Runs `claude -p --output-format stream-json --verbose`, streams each line\n * as a JSON event, and maps:\n * - `system.subtype=init` → session_id capture\n * - `assistant.message.content[]` → text messages + tool_use\n * - `user.message.content[tool_result]`→ tool output\n * - `result.subtype=success|error` → final message text + session_id\n *\n * When the job carries a `resumeSessionId` (set by the server from the\n * previous succeeded turn in this conversationId), we pass `--resume <id>`\n * so Claude Code restores the prior conversation instead of starting\n * fresh. The returned envelope always includes `sessionId`, which the\n * server then surfaces as `resumeSessionId` on the next turn.\n */\nasync function runClaudeCodeAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const args = [...job.agent.args]\n if (!args.includes('-p') && !args.includes('--print')) {\n args.push('-p')\n }\n if (!args.includes('--output-format')) {\n args.push('--output-format', 'stream-json')\n }\n if (!args.includes('--verbose')) {\n args.push('--verbose')\n }\n // Without this the child denies `bot …` (or any tool use) in -p mode,\n // since there's no user around to approve. Skipped if the user already\n // chose a permission mode.\n if (!hasAnyFlag(args, [\n '--permission-mode',\n '--dangerously-skip-permissions',\n '--allow-dangerously-skip-permissions',\n ])) {\n args.push('--permission-mode', 'bypassPermissions')\n }\n const resume = job.resumeSessionId ?? job.agent.env?.CLAUDE_SESSION_ID ?? null\n if (resume && !args.includes('--resume')) {\n args.push('--resume', resume)\n }\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n // Feed the prompt over stdin so we don't hit argv length limits when\n // buildContext() prepends a big labeled block.\n child.stdin.write(job.query)\n child.stdin.end()\n\n let stderr = ''\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const result: ClaudeCodeRunResult = {\n kind: 'claude-code',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: resume,\n rawEvents: [],\n }\n const toolCalls = new Map<string, ClaudeCodeToolCall>()\n\n function captureSessionId(event: any): void {\n const id = event?.session_id ?? event?.sessionId\n if (typeof id === 'string' && id.length > 0) {\n result.sessionId = id\n }\n }\n\n function ingestAssistantContent(blocks: any[]): void {\n for (const block of blocks) {\n if (!block || typeof block !== 'object') continue\n if (block.type === 'text' && typeof block.text === 'string') {\n result.messages.push(block.text)\n update({ kind: 'message', text: block.text })\n }\n if (block.type === 'tool_use' && typeof block.id === 'string') {\n const existing: ClaudeCodeToolCall =\n toolCalls.get(block.id) ?? { id: block.id, name: String(block.name ?? 'tool') }\n const next: ClaudeCodeToolCall = {\n ...existing,\n name: String(block.name ?? existing.name ?? 'tool'),\n input: block.input ?? existing.input,\n }\n toolCalls.set(block.id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n }\n\n function ingestUserContent(blocks: any[]): void {\n for (const block of blocks) {\n if (!block || typeof block !== 'object') continue\n if (block.type !== 'tool_result') continue\n const id = block.tool_use_id\n if (typeof id !== 'string') continue\n const existing: ClaudeCodeToolCall = toolCalls.get(id) ?? { id, name: 'tool' }\n const output = typeof block.content === 'string'\n ? block.content\n : Array.isArray(block.content)\n ? block.content\n .map((item: any) => (typeof item?.text === 'string' ? item.text : ''))\n .join('')\n : undefined\n const next: ClaudeCodeToolCall = {\n ...existing,\n output: output ?? existing.output,\n isError: Boolean(block.is_error ?? existing.isError),\n }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n\n function processLine(line: string): void {\n if (!line.trim()) return\n let event: any\n try {\n event = JSON.parse(line)\n } catch {\n // Claude Code occasionally emits non-JSON noise; ignore it.\n return\n }\n result.rawEvents.push(event)\n update({ kind: 'claude_code_event', event })\n captureSessionId(event)\n\n if (event.type === 'assistant' && event.message?.content) {\n ingestAssistantContent(\n Array.isArray(event.message.content) ? event.message.content : [],\n )\n return\n }\n if (event.type === 'user' && event.message?.content) {\n ingestUserContent(\n Array.isArray(event.message.content) ? event.message.content : [],\n )\n return\n }\n if (event.type === 'result' && typeof event.result === 'string') {\n result.text = event.result\n }\n }\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', processLine)\n\n const code = await new Promise<number | null>((resolve) => child.on('close', resolve))\n if (code !== 0) {\n throw new Error(stderr.trim() || `Claude Code exited with code ${code}`)\n }\n\n if (!result.text) {\n result.text = result.messages.at(-1)?.trim() ?? ''\n }\n result.toolCalls = [...toolCalls.values()]\n return JSON.stringify(result)\n}\n\n/**\n * OpenClaw adapter.\n *\n * Runs `openclaw agent --message <query> --session-id <id> --verbose on`\n * by default, while allowing all flags to be overridden through the registered\n * daemon agent args. OpenClaw writes its structured transcript to\n * `~/.openclaw/agents/<agent>/sessions/*.jsonl`. We first watch\n * `sessions.json` until a store key contains the requested id, then use that\n * entry's real `sessionId` to select the JSONL transcript.\n *\n * Multi-turn chat stores that real `sessionId` in botapp. On the next turn,\n * OpenClaw resolves it back to the existing session key from `sessions.json`.\n */\nasync function runOpenClawAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const env = { ...process.env, ...(job.agent.env ?? {}) }\n const args = [...job.agent.args]\n\n if (!args.includes('agent')) {\n args.unshift('agent')\n }\n\n let usedPromptPlaceholder = false\n for (let i = 0; i < args.length; i++) {\n if (!args[i].includes('{prompt}')) continue\n args[i] = args[i].replaceAll('{prompt}', job.query)\n usedPromptPlaceholder = true\n }\n if (!usedPromptPlaceholder) {\n const promptArg = env.BOTAPP_OPENCLAW_PROMPT_ARG ?? env.OPENCLAW_PROMPT_ARG ?? '--message'\n if (promptArg) {\n args.push(promptArg, job.query)\n } else {\n args.push(job.query)\n }\n }\n\n let requestedSessionId = getFlagValue(args, '--session-id')\n if (!requestedSessionId) {\n requestedSessionId = job.resumeSessionId || `botapp-${randomUUID()}`\n args.push('--session-id', requestedSessionId)\n }\n\n if (!hasFlag(args, '--verbose')) {\n args.push('--verbose', 'on')\n }\n\n const sessionDir = resolveOpenClawSessionDir(args, env)\n const state: OpenClawTailState = {\n startedAtMs: Date.now(),\n sessionDir,\n sessionStorePath: join(sessionDir, 'sessions.json'),\n requestedSessionId,\n sessionKey: null,\n sessionId: null,\n sessionResolvedBy: null,\n initialOffsets: snapshotOpenClawSessionOffsets(sessionDir),\n selectedFile: null,\n offset: 0,\n pending: '',\n seenEventIds: new Set<string>(),\n }\n\n const result: OpenClawRunResult = {\n kind: 'openclaw',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: null,\n requestedSessionId,\n sessionKey: null,\n sessionFile: null,\n rawEvents: [],\n }\n const toolCalls = new Map<string, OpenClawToolCall>()\n let stderr = ''\n let stopPolling = false\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const stdout = createInterface({ input: child.stdout })\n stdout.on('line', () => {})\n\n const stderrReader = createInterface({ input: child.stderr })\n stderrReader.on('line', (line) => {\n if (!line.trim()) return\n stderr += `${line}\\n`\n })\n\n const pollIntervalMs = envNumber(env, 'BOTAPP_OPENCLAW_POLL_INTERVAL_MS', 500)\n const stableAfterExitMs = envNumber(env, 'BOTAPP_OPENCLAW_STABLE_AFTER_EXIT_MS', 1000)\n const timeoutMs = resolveOpenClawTimeoutMs(env)\n const tailTask = (async () => {\n while (!stopPolling) {\n readOpenClawSessionUpdates(state, result, toolCalls, update)\n await sleep(pollIntervalMs)\n }\n readOpenClawSessionUpdates(state, result, toolCalls, update, true)\n })()\n\n let code: number | null\n try {\n code = await waitForChild(child, timeoutMs, 'OpenClaw')\n await sleep(stableAfterExitMs)\n } finally {\n stopPolling = true\n await tailTask\n }\n\n if (state.pending.trim()) {\n handleOpenClawJsonlLine(state.pending.trim(), state, result, toolCalls, update)\n state.pending = ''\n }\n\n result.sessionFile = state.selectedFile\n result.toolCalls = [...toolCalls.values()]\n result.text = result.text || result.messages.at(-1)?.trim() || ''\n\n if (code !== 0) {\n throw new Error(stderr.trim() || `OpenClaw exited with code ${code}`)\n }\n if (!result.sessionId) {\n throw new Error(\n [\n 'OpenClaw completed, but the session key was not resolved from sessions.json.',\n `Session store: ${state.sessionStorePath}`,\n `Requested session id fragment: ${state.requestedSessionId}`,\n ].join('\\n'),\n )\n }\n if (!result.text && result.toolCalls.length === 0) {\n throw new Error(\n [\n 'OpenClaw completed, but no assistant message was found in session JSONL.',\n `Session directory: ${sessionDir}`,\n state.selectedFile ? `Selected session file: ${state.selectedFile}` : 'Selected session file: none',\n 'Check BOTAPP_OPENCLAW_SESSION_DIR, --agent, or the OpenClaw JSONL message format.',\n ].join('\\n'),\n )\n }\n\n return JSON.stringify(result)\n}\n\nfunction resolveOpenClawSessionDir(args: string[], env: NodeJS.ProcessEnv): string {\n const configured = env.BOTAPP_OPENCLAW_SESSION_DIR ?? env.OPENCLAW_SESSION_DIR\n if (configured) return expandPath(configured)\n\n const agentName = resolveOpenClawAgentName(args)\n return join(homedir(), '.openclaw', 'agents', agentName, 'sessions')\n}\n\nfunction resolveOpenClawAgentName(args: string[]): string {\n return getFlagValue(args, '--agent') ?? 'main'\n}\n\nfunction snapshotOpenClawSessionOffsets(sessionDir: string): Map<string, number> {\n const offsets = new Map<string, number>()\n for (const file of listOpenClawSessionFiles(sessionDir)) {\n try {\n offsets.set(file, statSync(file).size)\n } catch {\n // Ignore files that disappear while snapshotting.\n }\n }\n return offsets\n}\n\nfunction readOpenClawSessionUpdates(\n state: OpenClawTailState,\n result: OpenClawRunResult,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n final = false,\n): void {\n resolveOpenClawRealSessionId(state, result)\n if (!state.sessionId) return\n\n const selectedFile = state.selectedFile ?? selectOpenClawSessionFile(state)\n if (!selectedFile) return\n if (!state.selectedFile) {\n state.selectedFile = selectedFile\n state.offset = state.sessionResolvedBy === 'key-fragment'\n ? 0\n : state.initialOffsets.get(selectedFile) ?? 0\n }\n\n let data = ''\n try {\n const buffer = readFileSync(selectedFile)\n if (state.offset > buffer.length) state.offset = 0\n data = buffer.subarray(state.offset).toString('utf-8')\n state.offset = buffer.length\n } catch {\n return\n }\n\n if (!data && !final) return\n state.pending += data\n if (!state.pending) return\n\n const parts = state.pending.split('\\n')\n const completeLines = final || state.pending.endsWith('\\n') ? parts : parts.slice(0, -1)\n state.pending = final || state.pending.endsWith('\\n') ? '' : parts.at(-1) ?? ''\n\n for (const rawLine of completeLines) {\n const line = rawLine.trim()\n if (line) handleOpenClawJsonlLine(line, state, result, toolCalls, update)\n }\n}\n\nfunction resolveOpenClawRealSessionId(\n state: OpenClawTailState,\n result: OpenClawRunResult,\n): void {\n if (state.sessionId) return\n\n let parsed: any\n try {\n parsed = JSON.parse(readFileSync(state.sessionStorePath, 'utf-8'))\n } catch {\n return\n }\n if (!parsed || typeof parsed !== 'object') return\n\n let entry: any = null\n let sessionKey: string | null = null\n let resolvedBy: OpenClawTailState['sessionResolvedBy'] = null\n for (const candidateKey of Object.keys(parsed)) {\n if (!candidateKey.includes(state.requestedSessionId)) continue\n sessionKey = candidateKey\n entry = parsed[candidateKey]\n resolvedBy = 'key-fragment'\n break\n }\n\n if (!entry) {\n for (const [candidateKey, candidateEntry] of Object.entries(parsed)) {\n if (\n candidateEntry &&\n typeof candidateEntry === 'object' &&\n (candidateEntry as { sessionId?: unknown }).sessionId === state.requestedSessionId\n ) {\n sessionKey = candidateKey\n entry = candidateEntry\n resolvedBy = 'entry-session-id'\n break\n }\n }\n }\n\n const realSessionId = entry?.sessionId\n if (typeof realSessionId !== 'string' || !realSessionId.trim()) return\n\n state.sessionKey = sessionKey\n state.sessionId = realSessionId\n state.sessionResolvedBy = resolvedBy\n result.sessionKey = sessionKey\n result.sessionId = realSessionId\n}\n\nfunction selectOpenClawSessionFile(state: OpenClawTailState): string | null {\n const files = listOpenClawSessionFiles(state.sessionDir)\n if (files.length === 0) return null\n\n if (state.sessionId) {\n const exact = join(state.sessionDir, `${state.sessionId}.jsonl`)\n if (files.includes(exact)) return exact\n const matching = files.filter((file) => file.includes(state.sessionId ?? ''))\n if (matching.length > 0) return newestFile(matching)\n }\n\n if (files.length === 1) return files[0]\n\n const recent = files.filter((file) => {\n try {\n return statSync(file).mtimeMs >= state.startedAtMs - 1000\n } catch {\n return false\n }\n })\n return newestFile(recent.length > 0 ? recent : files)\n}\n\nfunction listOpenClawSessionFiles(sessionDir: string): string[] {\n try {\n if (!existsSync(sessionDir)) return []\n return readdirSync(sessionDir)\n .filter((name) => name.endsWith('.jsonl'))\n .map((name) => join(sessionDir, name))\n .filter((file) => {\n try {\n return statSync(file).isFile()\n } catch {\n return false\n }\n })\n } catch {\n return []\n }\n}\n\nfunction newestFile(files: string[]): string | null {\n if (files.length === 0) return null\n return files.reduce((selected, file) => {\n try {\n return statSync(file).mtimeMs > statSync(selected).mtimeMs ? file : selected\n } catch {\n return selected\n }\n }, files[0])\n}\n\nfunction handleOpenClawJsonlLine(\n line: string,\n state: OpenClawTailState,\n result: OpenClawRunResult,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n): void {\n let event: any\n try {\n event = JSON.parse(line)\n } catch {\n return\n }\n if (!event || typeof event !== 'object') return\n\n const eventId = event.id\n if (typeof eventId === 'string') {\n if (state.seenEventIds.has(eventId)) return\n state.seenEventIds.add(eventId)\n }\n\n result.rawEvents.push(event)\n update({ kind: 'openclaw_event', event })\n\n if (event.type !== 'message' || !event.message || typeof event.message !== 'object') {\n return\n }\n\n const message = event.message\n if (message.role === 'assistant') {\n ingestOpenClawAssistantMessage(event, result, toolCalls, update)\n }\n if (message.role === 'toolResult') {\n ingestOpenClawToolResult(event, toolCalls, update)\n }\n}\n\nfunction ingestOpenClawAssistantMessage(\n event: any,\n result: OpenClawRunResult,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n): void {\n const message = event.message\n const text = openClawContentText(message.content)\n if (text) {\n result.messages.push(text)\n result.text = text\n update({ kind: 'message', text })\n }\n\n for (const part of openClawContentParts(message.content)) {\n if (part.type !== 'toolCall' || typeof part.id !== 'string') continue\n const toolCall: OpenClawToolCall = {\n id: part.id,\n name: String(part.name ?? 'tool'),\n arguments: part.arguments,\n messageId: typeof event.id === 'string' ? event.id : undefined,\n }\n toolCalls.set(toolCall.id, { ...toolCalls.get(toolCall.id), ...toolCall })\n update({ kind: 'tool_call', toolCall: toolCalls.get(toolCall.id) })\n }\n}\n\nfunction ingestOpenClawToolResult(\n event: any,\n toolCalls: Map<string, OpenClawToolCall>,\n update: JobUpdateSink,\n): void {\n const message = event.message\n if (typeof message.toolCallId !== 'string') return\n const existing: OpenClawToolCall = toolCalls.get(message.toolCallId) ?? {\n id: message.toolCallId,\n name: String(message.toolName ?? 'tool'),\n }\n const next: OpenClawToolCall = {\n ...existing,\n name: String(message.toolName ?? existing.name),\n output: openClawContentText(message.content),\n isError: Boolean(message.isError ?? existing.isError),\n }\n toolCalls.set(message.toolCallId, next)\n update({ kind: 'tool_call', toolCall: next })\n}\n\nfunction openClawContentParts(content: any): any[] {\n if (Array.isArray(content)) return content.filter((part) => part && typeof part === 'object')\n if (content && typeof content === 'object') return [content]\n return []\n}\n\nfunction openClawContentText(content: any): string {\n if (typeof content === 'string') return content\n return openClawContentParts(content)\n .map((part) => {\n if (part.type === 'text' && typeof part.text === 'string') return part.text\n return ''\n })\n .join('')\n}\n\n/**\n * Hermes Agent adapter.\n *\n * Runs `hermes chat -q <query> -Q` for a fresh conversation and\n * `hermes chat -q <query> -Q --resume <sessionId>` when botapp provides a\n * prior session id. Hermes prints `session_id: ...` on stdout at the end; the\n * adapter captures that id for botapp resume. During the run it polls the\n * JSON session document under `~/.hermes/sessions/session_<id>.json` and\n * streams newly appended assistant/tool messages.\n */\nasync function runHermesAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const env = { ...process.env, ...(job.agent.env ?? {}) }\n const args = [...job.agent.args]\n\n if (!args.includes('chat')) {\n args.unshift('chat')\n }\n\n let usedPromptPlaceholder = false\n for (let i = 0; i < args.length; i++) {\n if (!args[i].includes('{prompt}')) continue\n args[i] = args[i].replaceAll('{prompt}', job.query)\n usedPromptPlaceholder = true\n }\n if (!usedPromptPlaceholder && !hasAnyFlag(args, ['-q', '--query'])) {\n args.push('-q', job.query)\n }\n if (!hasAnyFlag(args, ['-Q', '--quiet'])) {\n args.push('-Q')\n }\n\n const resume = job.resumeSessionId ?? job.agent.env?.HERMES_SESSION_ID ?? null\n if (resume && !hasAnyFlag(args, ['-r', '--resume'])) {\n args.push('--resume', resume)\n }\n\n const sessionDir = resolveHermesSessionDir(env)\n const state: HermesTailState = {\n startedAtMs: Date.now(),\n sessionDir,\n resumeSessionId: resume,\n initialMessageCounts: snapshotHermesMessageCounts(sessionDir),\n selectedFile: null,\n processedMessages: 0,\n }\n const result: HermesRunResult = {\n kind: 'hermes',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: resume,\n sessionFile: null,\n rawMessages: [],\n }\n const toolCalls = new Map<string, HermesToolCall>()\n let stderr = ''\n let stdoutText = ''\n let stopPolling = false\n\n const child = spawn(job.agent.command, args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const stdout = createInterface({ input: child.stdout })\n stdout.on('line', (line) => {\n stdoutText += `${line}\\n`\n const sessionId = parseHermesSessionId(line)\n if (sessionId) result.sessionId = sessionId\n })\n\n const stderrReader = createInterface({ input: child.stderr })\n stderrReader.on('line', (line) => {\n if (!line.trim()) return\n stderr += `${line}\\n`\n })\n\n const pollIntervalMs = envNumber(env, 'BOTAPP_HERMES_POLL_INTERVAL_MS', 500)\n const stableAfterExitMs = envNumber(env, 'BOTAPP_HERMES_STABLE_AFTER_EXIT_MS', 1000)\n const timeoutMs = resolveHermesTimeoutMs(env)\n const tailTask = (async () => {\n while (!stopPolling) {\n readHermesSessionUpdates(state, result, toolCalls, update)\n await sleep(pollIntervalMs)\n }\n readHermesSessionUpdates(state, result, toolCalls, update, true)\n })()\n\n let code: number | null\n try {\n code = await waitForChild(child, timeoutMs, 'Hermes')\n await sleep(stableAfterExitMs)\n } finally {\n stopPolling = true\n await tailTask\n }\n\n const sessionIdFromStdout = parseHermesSessionId(stdoutText)\n if (sessionIdFromStdout) {\n result.sessionId = sessionIdFromStdout\n }\n if (!state.selectedFile && result.sessionId) {\n state.selectedFile = hermesSessionFile(sessionDir, result.sessionId)\n readHermesSessionUpdates(state, result, toolCalls, update, true)\n }\n\n result.sessionFile = state.selectedFile\n result.toolCalls = [...toolCalls.values()]\n result.text = result.text || result.messages.at(-1)?.trim() || ''\n\n if (code !== 0) {\n throw new Error(stderr.trim() || `Hermes exited with code ${code}`)\n }\n if (!result.sessionId) {\n throw new Error('Hermes completed, but no session_id line was found on stdout.')\n }\n if (!result.text && result.toolCalls.length === 0) {\n throw new Error(\n [\n 'Hermes completed, but no assistant message was found in the session file.',\n `Session directory: ${sessionDir}`,\n result.sessionFile ? `Selected session file: ${result.sessionFile}` : 'Selected session file: none',\n ].join('\\n'),\n )\n }\n\n return JSON.stringify(result)\n}\n\nfunction resolveHermesSessionDir(env: NodeJS.ProcessEnv): string {\n const configured = env.BOTAPP_HERMES_SESSION_DIR ?? env.HERMES_SESSION_DIR\n if (configured) return expandPath(configured)\n return join(homedir(), '.hermes', 'sessions')\n}\n\nfunction hermesSessionFile(sessionDir: string, sessionId: string): string {\n return join(sessionDir, `session_${sessionId}.json`)\n}\n\nfunction parseHermesSessionId(text: string): string | null {\n const match = text.match(/session_id:\\s*([A-Za-z0-9_-]+)/)\n return match?.[1] ?? null\n}\n\nfunction snapshotHermesMessageCounts(sessionDir: string): Map<string, number> {\n const counts = new Map<string, number>()\n for (const file of listHermesSessionFiles(sessionDir)) {\n counts.set(file, readHermesMessageCount(file))\n }\n return counts\n}\n\nfunction readHermesMessageCount(file: string): number {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf-8'))\n return Array.isArray(parsed?.messages) ? parsed.messages.length : 0\n } catch {\n return 0\n }\n}\n\nfunction readHermesSessionUpdates(\n state: HermesTailState,\n result: HermesRunResult,\n toolCalls: Map<string, HermesToolCall>,\n update: JobUpdateSink,\n final = false,\n): void {\n const selectedFile = state.selectedFile ?? selectHermesSessionFile(state)\n if (!selectedFile) return\n if (!state.selectedFile) {\n state.selectedFile = selectedFile\n state.processedMessages = state.resumeSessionId\n ? state.initialMessageCounts.get(selectedFile) ?? 0\n : 0\n }\n\n let parsed: any\n try {\n parsed = JSON.parse(readFileSync(selectedFile, 'utf-8'))\n } catch {\n return\n }\n if (typeof parsed?.session_id === 'string') {\n result.sessionId = parsed.session_id\n }\n if (!Array.isArray(parsed?.messages)) return\n if (parsed.messages.length <= state.processedMessages && !final) return\n\n const nextMessages = parsed.messages.slice(state.processedMessages)\n state.processedMessages = parsed.messages.length\n for (const message of nextMessages) {\n ingestHermesMessage(message, result, toolCalls, update)\n }\n}\n\nfunction selectHermesSessionFile(state: HermesTailState): string | null {\n if (state.resumeSessionId) {\n const exact = hermesSessionFile(state.sessionDir, state.resumeSessionId)\n if (existsSync(exact)) return exact\n }\n\n const files = listHermesSessionFiles(state.sessionDir)\n if (files.length === 0) return null\n\n const recent = files.filter((file) => {\n try {\n return statSync(file).mtimeMs >= state.startedAtMs - 1000\n } catch {\n return false\n }\n })\n return newestFile(recent)\n}\n\nfunction listHermesSessionFiles(sessionDir: string): string[] {\n try {\n if (!existsSync(sessionDir)) return []\n return readdirSync(sessionDir)\n .filter((name) => /^session_.+\\.json$/.test(name))\n .map((name) => join(sessionDir, name))\n .filter((file) => {\n try {\n return statSync(file).isFile()\n } catch {\n return false\n }\n })\n } catch {\n return []\n }\n}\n\nfunction ingestHermesMessage(\n message: any,\n result: HermesRunResult,\n toolCalls: Map<string, HermesToolCall>,\n update: JobUpdateSink,\n): void {\n if (!message || typeof message !== 'object') return\n result.rawMessages.push(message)\n\n if (message.role === 'assistant') {\n if (typeof message.content === 'string' && message.content.trim()) {\n result.messages.push(message.content)\n result.text = message.content\n update({ kind: 'message', text: message.content })\n }\n if (Array.isArray(message.tool_calls)) {\n for (const call of message.tool_calls) {\n const id = String(call?.id ?? call?.call_id ?? call?.response_item_id ?? randomUUID())\n const name = String(call?.function?.name ?? call?.name ?? 'tool')\n const next: HermesToolCall = {\n ...toolCalls.get(id),\n id,\n name,\n arguments: parseMaybeJson(call?.function?.arguments ?? call?.arguments),\n }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n }\n\n if (message.role === 'tool' && typeof message.tool_call_id === 'string') {\n const existing = toolCalls.get(message.tool_call_id) ?? {\n id: message.tool_call_id,\n name: 'tool',\n }\n const parsedOutput = parseMaybeJson(message.content)\n const next: HermesToolCall = {\n ...existing,\n output: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n isError: Boolean(parsedOutput?.status === 'error' || parsedOutput?.is_error),\n }\n toolCalls.set(message.tool_call_id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n}\n\nasync function runAcpAgent(job: DaemonJob): Promise<string> {\n const child = spawn(job.agent.command, job.agent.args, {\n cwd: job.agent.cwd ?? process.cwd(),\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n let nextId = 1\n const pending = new Map<\n number,\n { resolve: (value: any) => void; reject: (reason: Error) => void }\n >()\n const chunks: string[] = []\n let stderr = ''\n\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', (line) => {\n if (!line.trim()) return\n let msg: JsonRpcMessage\n try {\n msg = JSON.parse(line)\n } catch {\n stderr += `\\nInvalid ACP stdout: ${line}`\n return\n }\n\n if (msg.id != null && (msg.result !== undefined || msg.error)) {\n const waiting = pending.get(Number(msg.id))\n if (!waiting) return\n pending.delete(Number(msg.id))\n if (msg.error) waiting.reject(new Error(msg.error.message))\n else waiting.resolve(msg.result)\n return\n }\n\n if (msg.id != null && msg.method) {\n child.stdin.write(JSON.stringify({\n jsonrpc: '2.0',\n id: msg.id,\n error: { code: -32601, message: `Unsupported ACP client method: ${msg.method}` },\n }) + '\\n')\n return\n }\n\n if (msg.method === 'session/update') {\n const update = msg.params?.update\n if (update?.sessionUpdate === 'agent_message_chunk') {\n const text = update.content?.text\n if (text) chunks.push(String(text))\n }\n if (update?.sessionUpdate === 'tool_call_update' && Array.isArray(update.content)) {\n for (const item of update.content) {\n const text = item?.content?.text\n if (text) chunks.push(String(text))\n }\n }\n }\n })\n\n function request(method: string, params: any): Promise<any> {\n const id = nextId++\n child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\\n')\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n })\n }\n\n child.on('exit', (code) => {\n if (code === 0) return\n for (const [, waiting] of pending) {\n waiting.reject(new Error(stderr.trim() || `ACP agent exited with code ${code}`))\n }\n pending.clear()\n })\n\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n for (const [, waiting] of pending) {\n waiting.reject(new Error('ACP agent timed out'))\n }\n pending.clear()\n }, 10 * 60 * 1000)\n\n try {\n await request('initialize', {\n protocolVersion: 1,\n clientCapabilities: {},\n clientInfo: {\n name: 'botapp-daemon',\n title: 'botapp daemon',\n version: process.env.CLI_VERSION ?? '0.1.0',\n },\n })\n const session = await request('session/new', {\n cwd: job.agent.cwd ?? process.cwd(),\n })\n const sessionId = session?.sessionId ?? session?.id\n if (!sessionId) throw new Error('ACP agent did not return a sessionId')\n await request('session/prompt', {\n sessionId,\n prompt: [{ type: 'text', text: job.query }],\n })\n return chunks.join('').trim()\n } finally {\n clearTimeout(timeout)\n child.kill('SIGTERM')\n }\n}\n\nfunction requireProfile() {\n const profile = loadDaemonProfile()\n if (!profile) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return null\n }\n return profile\n}\n\nasync function daemonRequest(\n server: string,\n token: string,\n path: string,\n opts?: { method?: string; body?: any },\n) {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n }\n if (opts?.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n const res = await fetch(`${server}${path}`, {\n method: opts?.method ?? 'GET',\n headers,\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n })\n const data = await res.json().catch(() => ({}))\n if (!res.ok) {\n throw new Error(data.error ?? data.message ?? res.statusText)\n }\n return data\n}\n\nfunction parseEnv(entries: string[]): Record<string, string> | null {\n if (entries.length === 0) return null\n return Object.fromEntries(entries.map((entry) => {\n const idx = entry.indexOf('=')\n if (idx < 0) return [entry, '']\n return [entry.slice(0, idx), entry.slice(idx + 1)]\n }))\n}\n\nfunction getFlagValue(args: string[], flag: string): string | null {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg === flag) return args[i + 1] ?? null\n if (arg.startsWith(`${flag}=`)) return arg.slice(flag.length + 1) || null\n }\n return null\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.some((arg) => arg === flag || arg.startsWith(`${flag}=`))\n}\n\nfunction hasAnyFlag(args: string[], flags: string[]): boolean {\n return flags.some((flag) => hasFlag(args, flag))\n}\n\nfunction expandPath(path: string): string {\n if (path === '~') return homedir()\n if (path.startsWith('~/')) return join(homedir(), path.slice(2))\n return resolve(path)\n}\n\nfunction envNumber(env: NodeJS.ProcessEnv, name: string, fallback: number): number {\n const value = env[name]\n if (!value) return fallback\n const parsed = Number(value)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback\n}\n\nfunction resolveOpenClawTimeoutMs(env: NodeJS.ProcessEnv): number {\n const explicitMs = envNumber(env, 'BOTAPP_OPENCLAW_TIMEOUT_MS', 0)\n if (explicitMs > 0) return explicitMs\n const explicitSeconds = envNumber(env, 'BOTAPP_OPENCLAW_TIMEOUT_SECONDS', 0)\n if (explicitSeconds > 0) return explicitSeconds * 1000\n return 15 * 60 * 1000\n}\n\nfunction resolveHermesTimeoutMs(env: NodeJS.ProcessEnv): number {\n const explicitMs = envNumber(env, 'BOTAPP_HERMES_TIMEOUT_MS', 0)\n if (explicitMs > 0) return explicitMs\n const explicitSeconds = envNumber(env, 'BOTAPP_HERMES_TIMEOUT_SECONDS', 0)\n if (explicitSeconds > 0) return explicitSeconds * 1000\n return 15 * 60 * 1000\n}\n\nfunction parseMaybeJson(value: any): any {\n if (typeof value !== 'string') return value\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolveSleep) => setTimeout(resolveSleep, ms))\n}\n\nasync function waitForChild(\n child: ReturnType<typeof spawn>,\n timeoutMs: number,\n label: string,\n): Promise<number | null> {\n return new Promise((resolveWait, reject) => {\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL')\n }, 5000).unref()\n reject(new Error(`${label} timed out after ${Math.round(timeoutMs / 1000)}s`))\n }, timeoutMs)\n timeout.unref()\n\n child.once('error', (error) => {\n clearTimeout(timeout)\n reject(error)\n })\n child.once('close', (code) => {\n clearTimeout(timeout)\n resolveWait(code)\n })\n })\n}\n"],"mappings":"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","names":["Command","pc","existsSync","existsSync","Command","spawn","resolve","join","existsSync","mkdirSync","writeFileSync","readFileSync","homedir","createInterface","pc","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","parse","stringify","CONFIG_DIR","spawn","pc","resolve","resolve","Command","pc","input","resolve","Command","pc","createInterface","Command","pc","join","homedir","mkdirSync","existsSync","spawn","writeFileSync","readFileSync","findServerEntry","resolve","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","resolve","existsSync","mkdirSync","readFileSync","homedir","join","pc","rmSync","Command","existsSync","homedir","join","pc","APPS_DIR","Command","resolve","basename","join","existsSync","mkdirSync","symlinkSync","readFileSync","homedir","spawn","pc","APPS_DIR","join","homedir","Command","resolve","existsSync","pc","readFileSync","basename","mkdirSync","symlinkSync","findServerEntry","spawn","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","pc","Command","readFileSync","existsSync","pc","Command","existsSync","pc","readFileSync","Command","readFileSync","existsSync","pc","Command","existsSync","pc","readFileSync","Command","pc","Command","pc","Command","pc","Command","pc","hostname","Command","pc","spawn","existsSync","readFileSync","homedir","join","resolve","createInterface","Command","WebSocket","pc","Command","pc","join","homedir","existsSync","readFileSync","WebSocket","spawn","resolve","createInterface","output","request","Command","hostname","pc","Command","pc"]}