botapp-cli 0.2.7 → 0.2.9

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/daemon.ts","../src/config/daemon.ts","../src/commands/daemon-agent-config.ts","../src/rpc/registry.ts","../src/rpc/file-handlers.ts","../src/rpc/pty-handlers.ts","../src/commands/launch.ts","../src/auth/browser-auth.ts","../src/commands/daemon-supervisor.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/doctor.ts","../src/commands/update.ts","../src/commands/simulate.ts","../src/commands/init.ts","../src/commands/publish.ts","../src/commands/review.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { serverCommand } from './commands/server'\n\n// Library exports: third-party callers (e.g. the Electron desktop app)\n// reuse the daemon connection loop and profile helpers without\n// shelling out to the `bot` binary. Re-exporting from the CLI package\n// keeps a single implementation.\nexport { runDaemonConnectionLoop } from './commands/daemon'\nexport {\n loadDaemonProfile,\n loadDaemonProfiles,\n findDaemonProfile,\n saveDaemonProfile,\n removeDaemonProfile,\n type DaemonProfile,\n} from './config/daemon'\n\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'\nimport { doctorCommand } from './commands/doctor'\nimport { updateCommand } from './commands/update'\nimport { simulateCommand } from './commands/simulate'\nimport { initCommand } from './commands/init'\nimport { publishCommand } from './commands/publish'\nimport { reviewCommand } from './commands/review'\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)\nprogram.addCommand(doctorCommand)\n\n// ── App management ───────────────────────────────────────────\nprogram.addCommand(initCommand)\nprogram.addCommand(installCommand)\nprogram.addCommand(uninstallCommand)\nprogram.addCommand(reloadCommand)\nprogram.addCommand(configCommand)\nprogram.addCommand(simulateCommand)\nprogram.addCommand(publishCommand)\nprogram.addCommand(reviewCommand)\n\n// ── Server management ────────────────────────────────────────\nprogram.addCommand(serverCommand)\n\n// ── Self-update ──────────────────────────────────────────────\nprogram.addCommand(updateCommand)\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 (every paired profile in one process)\n $ bot update Update the \\`bot\\` CLI itself to the latest version\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 { 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 {\n findDaemonProfile,\n loadDaemonProfiles,\n removeDaemonProfile,\n type DaemonProfile,\n} from '../config/daemon'\nimport { createDaemonAgentConfigCommand } from './daemon-agent-config'\nimport { RpcDispatcher, RpcRegistry } from '../rpc/registry'\nimport { registerFileHandlers } from '../rpc/file-handlers'\nimport { registerPtyHandlers } from '../rpc/pty-handlers'\n\n// Single shared registry — file.* and pty.* handlers are stateless\n// across calls (PTY processes are tracked inside pty-handlers itself).\nconst rpcRegistry = new RpcRegistry()\nregisterFileHandlers(rpcRegistry)\nregisterPtyHandlers(rpcRegistry)\n\ninterface DaemonAgent {\n id: string\n name: string\n kind: string\n command: string\n args: string[]\n model: string | null\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 KimiToolCall {\n id: string\n name: string\n input?: any\n output?: string\n isError?: boolean\n}\n\ninterface KimiRunResult {\n kind: 'kimi'\n text: string\n messages: string[]\n toolCalls: KimiToolCall[]\n /** Session id parsed from kimi's trailing `To resume this session: kimi -r <id>`\n * stdout line. Stored on the conversation so the next turn can pass\n * `--continue` / `-r <id>` to keep the same kimi session. */\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(\n 'Run paired daemons and wait for server jobs. With no flags, runs every ' +\n 'paired profile concurrently — so a single `bot daemon run` covers both ' +\n 'local and remote pairings.',\n )\n .option('--profile <alias>', 'Run only the profile with this alias')\n .option('--server <url>', 'Run only the profile paired with this server URL')\n .action(async (opts) => {\n const profiles = pickProfilesToRun(opts.profile, opts.server)\n if (profiles === null) return\n\n if (profiles.length === 0) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return\n }\n\n if (profiles.length === 1) {\n await runDaemonConnectionLoop(profiles[0])\n return\n }\n\n console.log(\n pc.dim(\n `Running ${profiles.length} daemon profile${profiles.length === 1 ? '' : 's'}: ` +\n profiles.map((p) => p.alias ?? p.server).join(', '),\n ),\n )\n await Promise.all(profiles.map((p) => runDaemonConnectionLoop(p)))\n })\n\nfunction pickProfilesToRun(\n alias: string | undefined,\n server: string | undefined,\n): DaemonProfile[] | null {\n if (alias) {\n const found = findDaemonProfile(alias)\n if (!found) {\n console.error(pc.red(`No daemon profile with alias \"${alias}\".`))\n process.exitCode = 1\n return null\n }\n return [found]\n }\n if (server) {\n const found = findDaemonProfile(server)\n if (!found) {\n console.error(pc.red(`No daemon profile paired with \"${server}\".`))\n process.exitCode = 1\n return null\n }\n return [found]\n }\n return loadDaemonProfiles()\n}\n\ndaemonCommand\n .command('unpair')\n .description('Remove a paired profile from ~/.botapp/daemon.yaml (does not touch the server)')\n .argument('<aliasOrServer>', 'Profile alias (e.g. local) or server URL')\n .action((aliasOrServer: string) => {\n const removed = removeDaemonProfile(aliasOrServer)\n if (!removed) {\n console.error(pc.red(`No paired profile matching \"${aliasOrServer}\".`))\n process.exitCode = 1\n return\n }\n console.log(pc.green(`Removed daemon profile: ${aliasOrServer}`))\n })\n\ndaemonCommand\n .command('list')\n .alias('ls')\n .description('List paired daemon profiles from ~/.botapp/daemon.yaml')\n .action(() => {\n const profiles = loadDaemonProfiles()\n if (profiles.length === 0) {\n console.log(pc.dim('No paired daemons. Run `bot pair` to add one.'))\n return\n }\n for (const p of profiles) {\n console.log(pc.bold(p.alias ?? p.server))\n console.log(` Server: ${p.server}`)\n console.log(` Daemon: ${p.daemonName} ${pc.dim(`(${p.daemonId})`)}`)\n console.log(` User: ${p.userEmail ?? pc.dim('unknown — re-pair to capture')}`)\n }\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 .option('--profile <alias>', 'Daemon profile alias to query')\n .option('--server <url>', 'Daemon profile by server URL')\n .action(async (opts) => {\n const profile = requireSelectedProfile(opts)\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 if (agent.model) console.log(` Model: ${agent.model}`)\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, kimi, openclaw, hermes, or hermes-agent')\n .requiredOption('--command <command>', 'Executable command')\n .option(\n '--kind <kind>',\n 'Agent adapter kind: acp, codex, claude-code, kimi, 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 .option('--model <model>', 'Provider model to pass to the agent runtime')\n .option('--profile <alias>', 'Daemon profile alias to register against')\n .option('--server <url>', 'Daemon profile by server URL')\n .action(async (name, opts) => {\n const profile = requireSelectedProfile(opts)\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 model: opts.model,\n },\n },\n )\n console.log(pc.green(`Registered daemon agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n if (data.agent.model) console.log(` Model: ${data.agent.model}`)\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 .option('--profile <alias>', 'Daemon profile alias to remove from')\n .option('--server <url>', 'Daemon profile by server URL')\n .action(async (agent, opts) => {\n const profile = requireSelectedProfile(opts)\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: DaemonProfile,\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 const label = profile.alias\n ? `${profile.daemonName} [${profile.alias}]`\n : profile.daemonName\n\n while (!stopped) {\n console.log(pc.blue(`Connecting daemon ${label} to ${profile.server}...`))\n const outcome = await runDaemonSocket(wsUrl, (ws) => {\n activeWs = ws\n })\n activeWs = null\n if (stopped) break\n\n // The server uses close code 4000 to evict an older daemon when a\n // newer one (same daemonId) connects. Without this guard, two local\n // daemon processes — e.g. one auto-spawned by `bot launch`, plus a\n // manual `bot daemon run` — kick each other off forever, and neither\n // ever stays online long enough to take a job.\n if (outcome.superseded) {\n console.log(\n pc.red(\n 'Another daemon process took over this pairing — exiting. ' +\n 'Stop the duplicate `bot daemon run` and rerun if you want this one to take over.',\n ),\n )\n break\n }\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; superseded: boolean }> {\n return new Promise((resolveRun) => {\n const ws = new WebSocket(wsUrl)\n setActiveWs(ws)\n // One dispatcher per socket. Tears down all in-flight RPCs (PTYs,\n // long file reads) when the connection closes so leftover handlers\n // don't try to push frames into a dead socket.\n const rpcDispatcher = new RpcDispatcher(rpcRegistry, ws)\n let opened = false\n let superseded = 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 rpcDispatcher.shutdown()\n resolveRun({ opened, superseded })\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(), rpcDispatcher)\n })\n\n ws.on('close', (code, reason) => {\n // 4000 = server closed us because a newer daemon process (same\n // daemonId) connected. The caller stops retrying so we don't\n // immediately turn around and supersede the new one.\n if (code === 4000) superseded = true\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(\n ws: WebSocket,\n raw: string,\n rpcDispatcher: RpcDispatcher,\n): Promise<void> {\n const frame = JSON.parse(raw)\n\n // Generic RPC channel — apps reaching into local file/pty/etc.\n // Dispatched off-thread; the dispatcher sends its own response frame.\n if (frame.type === 'daemon_rpc_request') {\n void rpcDispatcher.dispatchRequest(frame)\n return\n }\n if (frame.type === 'daemon_rpc_input') {\n rpcDispatcher.dispatchInput(frame)\n return\n }\n if (frame.type === 'daemon_rpc_cancel') {\n rpcDispatcher.dispatchCancel(frame)\n return\n }\n\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 === 'kimi') {\n return runKimiCodeAgent(job, update)\n }\n if (job.agent.kind === 'openclaw') {\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 if (job.agent.model && !hasAnyFlag(args, ['--model', '-m'])) {\n args.push('--model', job.agent.model)\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 const errors: string[] = []\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 === 'error' && typeof event.message === 'string') {\n errors.push(event.message)\n }\n if (event?.type === 'turn.failed' && typeof event.error?.message === 'string') {\n errors.push(event.error.message)\n }\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(errors.at(-1) ?? (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 if (job.agent.model && !hasAnyFlag(args, ['--model'])) {\n args.push('--model', job.agent.model)\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 // Hold the last few non-JSON stdout lines + any error-flavoured event\n // payloads so non-zero exits surface a real cause instead of a\n // generic \"exited with code 1\" with empty stderr. claude-code's\n // stream-json sometimes prints plain-text errors (auth failures,\n // session-resume failures) just before exiting.\n const noiseLines: string[] = []\n const errorEvents: string[] = []\n const NOISE_TAIL = 6\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; keep the tail\n // around for diagnostics but don't otherwise act on it.\n noiseLines.push(line)\n if (noiseLines.length > NOISE_TAIL) noiseLines.shift()\n return\n }\n result.rawEvents.push(event)\n update({ kind: 'claude_code_event', event })\n captureSessionId(event)\n\n // Record any event that signals an error — claude-code's\n // stream-json shape is `{type:'result',subtype:'error',...}` or\n // `{type:'system',subtype:'error',...}`. Capture the whole payload\n // so the daemon can report it on non-zero exit.\n if (\n event &&\n (event.is_error === true ||\n event.subtype === 'error' ||\n (event.type === 'result' && event.is_error))\n ) {\n try {\n errorEvents.push(JSON.stringify(event).slice(0, 1000))\n } catch {\n /* swallow */\n }\n }\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 const parts: string[] = []\n if (stderr.trim()) parts.push(stderr.trim())\n if (errorEvents.length > 0) {\n parts.push(`Error events: ${errorEvents.join(' | ')}`)\n }\n if (noiseLines.length > 0 && parts.length === 0) {\n parts.push(`Last stdout lines: ${noiseLines.join(' | ').slice(-1500)}`)\n }\n if (parts.length === 0) {\n parts.push(`Claude Code exited with code ${code} (no stderr or stdout output)`)\n }\n throw new Error(parts.join(' — '))\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 * Kimi Code adapter.\n *\n * Runs `kimi --print --output-format stream-json --yolo` (Moonshot's\n * Kimi CLI; binary `kimi`, docs at https://moonshotai.github.io/kimi-cli/).\n * The prompt is piped on stdin so we don't hit argv length limits when\n * the dispatcher prepends a labelled context block.\n *\n * stream-json emits one JSON object per line. Three shapes show up:\n * { role:\"assistant\", content:[{type:\"think\"|\"text\", ...}], tool_calls?:[{id, function:{name, arguments}}]}\n * { role:\"tool\", content:<string>, tool_call_id:<id> }\n * { role:\"assistant\", content:[{type:\"text\", text:\"<final>\"}] }\n * Then on stdout (after the JSONL block) kimi prints\n * `To resume this session: kimi -r <session-id>`\n * which we parse to capture sessionId for next-turn resume.\n */\nasync function runKimiCodeAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const args = [...job.agent.args]\n if (!args.includes('--print') && !args.includes('-p')) {\n args.push('--print')\n }\n if (!args.includes('--output-format')) {\n args.push('--output-format', 'stream-json')\n }\n // Without --yolo kimi waits for tool-approval input that never comes\n // in headless mode. Skipped if the user already passed --yolo / --yes.\n if (!hasAnyFlag(args, ['--yolo', '--yes', '-y'])) {\n args.push('--yolo')\n }\n if (job.agent.model && !hasAnyFlag(args, ['--model', '-m'])) {\n args.push('--model', job.agent.model)\n }\n // Prefer --continue when we have a prior session id for this convo so\n // kimi keeps the same context. Fall back to -r <id> if explicitly set.\n const resume = job.resumeSessionId ?? job.agent.env?.KIMI_SESSION_ID ?? null\n if (resume && !hasAnyFlag(args, ['--session', '-S', '-r', '--resume', '--continue', '-C'])) {\n args.push('-r', resume)\n }\n\n // Kimi does not auto-load `AGENTS.md` as a system prompt the way\n // Claude reads `CLAUDE.md` or Codex reads `AGENTS.md`. The file is in\n // cwd but the agent treats it as just-another-file rather than\n // internalizing the protocol primer (notes habit, task updates, chat\n // contracts). To get the same effect we prepend the rendered AGENTS.md\n // to the dispatch prompt with a clear delimiter — only on the first\n // turn, so resumes keep their kimi-side context intact.\n const cwd = job.agent.cwd ?? process.cwd()\n let prompt = job.query\n if (!resume) {\n const agentsMdPath = join(cwd, 'AGENTS.md')\n if (existsSync(agentsMdPath)) {\n try {\n const primer = readFileSync(agentsMdPath, 'utf-8').trim()\n if (primer) {\n prompt = `# System instructions (read carefully before responding)\\n\\n${primer}\\n\\n---\\n\\n# Your task\\n\\n${job.query}`\n }\n } catch {\n // Best-effort: fall back to bare prompt if read fails.\n }\n }\n }\n\n const child = spawn(job.agent.command, args, {\n cwd,\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n child.stdin.write(prompt)\n child.stdin.end()\n\n let stderr = ''\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const result: KimiRunResult = {\n kind: 'kimi',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: resume,\n rawEvents: [],\n }\n const toolCalls = new Map<string, KimiToolCall>()\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 }\n }\n\n function ingestToolCalls(calls: any[]): void {\n for (const call of calls) {\n if (!call || typeof call !== 'object') continue\n const id = typeof call.id === 'string' ? call.id : null\n if (!id) continue\n const name = String(call.function?.name ?? call.name ?? 'tool')\n let input: any = call.function?.arguments ?? call.arguments\n if (typeof input === 'string') {\n try {\n input = JSON.parse(input)\n } catch {\n // leave as raw string\n }\n }\n const next: KimiToolCall = { ...(toolCalls.get(id) ?? {}), id, name, input }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n\n function ingestToolResult(event: any): void {\n const id = event?.tool_call_id\n if (typeof id !== 'string') return\n const existing: KimiToolCall = toolCalls.get(id) ?? { id, name: 'tool' }\n const output = typeof event.content === 'string' ? event.content : JSON.stringify(event.content)\n const next: KimiToolCall = { ...existing, output }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n\n function processLine(line: string): void {\n const trimmed = line.trim()\n if (!trimmed || trimmed[0] !== '{') return\n let event: any\n try {\n event = JSON.parse(trimmed)\n } catch {\n return\n }\n result.rawEvents.push(event)\n update({ kind: 'kimi_event', event })\n if (event.role === 'assistant') {\n if (Array.isArray(event.content)) ingestAssistantContent(event.content)\n if (Array.isArray(event.tool_calls)) ingestToolCalls(event.tool_calls)\n } else if (event.role === 'tool') {\n ingestToolResult(event)\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 // Kimi prints `To resume this session: kimi -r <id>` on stderr after\n // a successful run. Capture it for next-turn resume.\n const resumeMatch = stderr.match(/To resume this session:\\s*kimi\\s+-r\\s+([A-Za-z0-9_-]+)/)\n if (resumeMatch) result.sessionId = resumeMatch[1]\n if (code !== 0) {\n throw new Error(stderr.trim() || `Kimi 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 const stdoutLines: string[] = []\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 const text = line.trim()\n if (!text) return\n stdoutLines.push(text)\n const stdoutText = extractOpenClawStdoutText(text)\n if (!stdoutText) return\n result.text = stdoutText\n result.messages.push(stdoutText)\n update({ kind: 'message', text: stdoutText })\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_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() || extractOpenClawStdoutText(stdoutLines.at(-1) ?? '') || ''\n\n if (code !== 0) {\n throw new Error(stderr.trim() || `OpenClaw exited with code ${code}`)\n }\n if (!result.sessionId && !result.text && result.toolCalls.length === 0) {\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 extractOpenClawStdoutText(line: string): string {\n const text = line.trim()\n if (!text) return ''\n try {\n const parsed = JSON.parse(text)\n if (parsed && typeof parsed === 'object') return JSON.stringify(parsed)\n if (typeof parsed === 'string') return parsed\n } catch {\n // Plain stdout is still a valid OpenClaw response for simple agents.\n }\n return text\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\n/**\n * Pick a single daemon profile when a subcommand can only act on one.\n * Honors `--profile <alias>` / `--server <url>` if given; otherwise\n * uses the only paired profile, or errors out asking the user to\n * disambiguate when several are paired.\n */\nexport function requireSelectedProfile(opts?: {\n profile?: string\n server?: string\n}): DaemonProfile | null {\n if (opts?.profile) {\n const p = findDaemonProfile(opts.profile)\n if (p) return p\n console.error(pc.red(`No daemon profile with alias \"${opts.profile}\".`))\n process.exitCode = 1\n return null\n }\n if (opts?.server) {\n const p = findDaemonProfile(opts.server)\n if (p) return p\n console.error(pc.red(`No daemon profile paired with \"${opts.server}\".`))\n process.exitCode = 1\n return null\n }\n const all = loadDaemonProfiles()\n if (all.length === 0) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return null\n }\n if (all.length > 1) {\n const list = all.map((p) => p.alias ?? p.server).join(', ')\n console.error(\n pc.red(\n `Multiple paired daemons (${list}). ` +\n 'Pick one with --profile <alias> or --server <url>.',\n ),\n )\n process.exitCode = 1\n return null\n }\n return all[0]\n}\n\nexport async 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","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 /** Stable key under `profiles:` in the YAML, derived from the server\n * hostname (e.g. `local`, `cloud`, `api-botapp-ai`). Optional on\n * inputs to `saveDaemonProfile` — auto-derived when absent. Always\n * populated on values returned from `loadDaemonProfile(s)`. */\n alias?: string\n server: string\n daemonId: string\n daemonName: string\n token: string\n /** Email of the dashboard user this profile is paired under. Captured\n * from the browser-auth callback so `bot daemon list` can show which\n * account each profile lives in without a server round-trip. Absent\n * for legacy pairings or `--token` flows where no callback ran. */\n userEmail?: string\n}\n\ninterface ProfileEntry {\n server: string\n daemonId: string\n daemonName?: string\n token: string\n userEmail?: string\n}\n\ninterface DaemonYaml {\n profiles?: Record<string, ProfileEntry>\n // Legacy single-profile shape (pre-multi-profile). Still loaded so\n // existing pairings keep working without a manual migration; the next\n // `saveDaemonProfile` call rewrites the file in the new shape.\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\nfunction readYaml(): DaemonYaml | null {\n try {\n if (!existsSync(DAEMON_FILE)) return null\n const parsed = parse(readFileSync(DAEMON_FILE, 'utf-8'))\n if (!parsed || typeof parsed !== 'object') return null\n return parsed as DaemonYaml\n } catch {\n return null\n }\n}\n\nfunction writeYaml(profiles: DaemonProfile[]): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n const map: Record<string, ProfileEntry> = {}\n for (const p of profiles) {\n const alias = p.alias ?? deriveAlias(p.server, new Set(Object.keys(map)))\n map[alias] = {\n server: p.server,\n daemonId: p.daemonId,\n daemonName: p.daemonName,\n token: p.token,\n ...(p.userEmail ? { userEmail: p.userEmail } : {}),\n }\n }\n writeFileSync(DAEMON_FILE, stringify({ profiles: map }), 'utf-8')\n}\n\nfunction normalizeServer(url: string): string {\n return url.replace(/\\/$/, '')\n}\n\nfunction deriveAlias(serverUrl: string, taken: Set<string>): string {\n let base: string\n try {\n const u = new URL(serverUrl)\n const host = u.hostname\n if (host === 'localhost' || host === '127.0.0.1') {\n base = u.port && u.port !== '7100' ? `local-${u.port}` : 'local'\n } else if (host === 'api.botapp.ai' || host === 'botapp.ai') {\n base = 'cloud'\n } else {\n base = host.replace(/\\./g, '-')\n }\n } catch {\n base = 'remote'\n }\n if (!taken.has(base)) return base\n let i = 2\n while (taken.has(`${base}-${i}`)) i += 1\n return `${base}-${i}`\n}\n\nexport function loadDaemonProfiles(): DaemonProfile[] {\n const data = readYaml()\n if (!data) return []\n\n const profiles: DaemonProfile[] = []\n if (data.profiles && typeof data.profiles === 'object') {\n for (const [alias, value] of Object.entries(data.profiles)) {\n if (!value?.server || !value?.daemonId || !value?.token) continue\n profiles.push({\n alias,\n server: normalizeServer(value.server),\n daemonId: value.daemonId,\n daemonName: value.daemonName ?? value.daemonId,\n token: value.token,\n userEmail: value.userEmail,\n })\n }\n }\n\n // Legacy single-profile fallback. Only honored when no `profiles:` map\n // is present, so a partially migrated file doesn't double-count.\n if (\n profiles.length === 0 &&\n data.server &&\n data.daemonId &&\n data.token\n ) {\n profiles.push({\n alias: deriveAlias(data.server, new Set()),\n server: normalizeServer(data.server),\n daemonId: data.daemonId,\n daemonName: data.daemonName ?? data.daemonId,\n token: data.token,\n })\n }\n return profiles\n}\n\n/** Back-compat: return the first paired profile, or null. */\nexport function loadDaemonProfile(): DaemonProfile | null {\n return loadDaemonProfiles()[0] ?? null\n}\n\n/** Find a profile by alias OR server URL (case-insensitive, trailing slash tolerant). */\nexport function findDaemonProfile(serverOrAlias: string): DaemonProfile | null {\n const profiles = loadDaemonProfiles()\n const needle = serverOrAlias.replace(/\\/$/, '').toLowerCase()\n for (const p of profiles) {\n if ((p.alias ?? '').toLowerCase() === needle) return p\n if (p.server.toLowerCase() === needle) return p\n }\n return null\n}\n\n/**\n * Upsert a daemon profile keyed by server URL. Replaces any prior entry\n * for the same server (so re-pairing the same server doesn't duplicate)\n * but preserves entries for other servers — the killer feature for\n * users who pair both a local dev server and a remote one.\n */\nexport function saveDaemonProfile(input: DaemonProfile): DaemonProfile {\n const server = normalizeServer(input.server)\n const remaining = loadDaemonProfiles().filter(\n (p) => p.server.toLowerCase() !== server.toLowerCase(),\n )\n\n const taken = new Set(remaining.map((p) => p.alias!).filter(Boolean))\n const alias =\n input.alias && !taken.has(input.alias)\n ? input.alias\n : deriveAlias(server, taken)\n\n const next: DaemonProfile = {\n alias,\n server,\n daemonId: input.daemonId,\n daemonName: input.daemonName ?? input.daemonId,\n token: input.token,\n userEmail: input.userEmail,\n }\n writeYaml([...remaining, next])\n return next\n}\n\nexport function removeDaemonProfile(serverOrAlias: string): boolean {\n const target = findDaemonProfile(serverOrAlias)\n if (!target) return false\n const remaining = loadDaemonProfiles().filter(\n (p) => p.alias !== target.alias,\n )\n writeYaml(remaining)\n return true\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 { requireSelectedProfile } from './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 .option('--profile <alias>', 'Daemon profile alias to register against')\n .option('--server <url>', 'Daemon profile by server URL')\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 profile: opts.profile,\n server: opts.server,\n })\n })\n}\n\nasync function configureDaemonAgents(inputOpts: {\n all: boolean\n names: string[]\n cwd: string\n profile?: string\n server?: string\n}): Promise<void> {\n const profile = requireSelectedProfile({\n profile: inputOpts.profile,\n server: inputOpts.server,\n })\n if (!profile) return\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 type { WebSocket } from 'ws'\n\n/**\n * Daemon-side RPC dispatch.\n *\n * Server pushes `daemon_rpc_request` frames keyed by `op` (`file.read`,\n * `pty.spawn`, …). The registry looks up the handler, invokes it, and\n * sends back exactly one `daemon_rpc_response` per rpcId — plus zero or\n * more `daemon_rpc_stream` frames in between for stream-mode ops.\n *\n * Handlers describe their own concurrency: a unary handler returns a\n * value (or throws). A stream handler is an async generator-like thing\n * that yields chunks plus accepts inbound frames via `onInput`.\n */\n\nexport interface RpcContext {\n /** App that initiated the call. Server stamps this onto every frame\n * so handlers can scope state per-app (e.g. workspace jails). */\n appName: string\n rpcId: string\n /** Send a stream chunk back to the server (data direction). */\n pushChunk(payload: unknown): void\n /** Best-effort: true once the server cancels or the socket closes.\n * Long-running handlers should poll this and abort cleanly. */\n isCancelled(): boolean\n /** Register a callback fired when the server sends an\n * `daemon_rpc_input` chunk. PTY handlers wire this to their write\n * pipe. Replaces any prior callback. */\n onInput(callback: (payload: unknown) => void): void\n /** Register a callback fired exactly once on cancel. Use for\n * spawning processes that need teardown beyond the\n * isCancelled() poll. */\n onCancel(callback: () => void): void\n}\n\nexport type RpcHandler = (params: any, ctx: RpcContext) => Promise<unknown>\n\nexport class RpcRegistry {\n private handlers = new Map<string, RpcHandler>()\n\n register(op: string, handler: RpcHandler): void {\n if (this.handlers.has(op)) {\n throw new Error(`RPC op already registered: ${op}`)\n }\n this.handlers.set(op, handler)\n }\n\n get(op: string): RpcHandler | undefined {\n return this.handlers.get(op)\n }\n\n has(op: string): boolean {\n return this.handlers.has(op)\n }\n}\n\ninterface InflightCall {\n ctx: InternalRpcContext\n}\n\nclass InternalRpcContext implements RpcContext {\n cancelled = false\n inputCallback: ((payload: unknown) => void) | null = null\n cancelCallback: (() => void) | null = null\n\n constructor(\n readonly appName: string,\n readonly rpcId: string,\n private readonly ws: WebSocket,\n ) {}\n\n pushChunk(payload: unknown): void {\n sendJson(this.ws, {\n type: 'daemon_rpc_stream',\n rpcId: this.rpcId,\n payload,\n })\n }\n\n isCancelled(): boolean {\n return this.cancelled\n }\n\n onInput(callback: (payload: unknown) => void): void {\n this.inputCallback = callback\n }\n\n onCancel(callback: () => void): void {\n this.cancelCallback = callback\n }\n\n cancel(): void {\n if (this.cancelled) return\n this.cancelled = true\n const cb = this.cancelCallback\n this.cancelCallback = null\n if (cb) {\n try {\n cb()\n } catch {\n // Best-effort teardown — never throw out of cancel.\n }\n }\n }\n\n receiveInput(payload: unknown): void {\n this.inputCallback?.(payload)\n }\n}\n\n/**\n * Per-WebSocket dispatcher. The CLI creates one of these per active\n * daemon socket and routes incoming RPC frames into it.\n */\nexport class RpcDispatcher {\n private inflight = new Map<string, InflightCall>()\n\n constructor(\n private readonly registry: RpcRegistry,\n private readonly ws: WebSocket,\n ) {}\n\n /** Handle a `daemon_rpc_request` frame. */\n async dispatchRequest(frame: {\n rpcId: string\n appName: string\n op: string\n params?: any\n stream?: boolean\n }): Promise<void> {\n const handler = this.registry.get(frame.op)\n if (!handler) {\n this.sendResponse(frame.rpcId, {\n ok: false,\n error: `unknown daemon RPC op: ${frame.op}`,\n })\n return\n }\n\n const ctx = new InternalRpcContext(\n frame.appName ?? 'unknown',\n frame.rpcId,\n this.ws,\n )\n this.inflight.set(frame.rpcId, { ctx })\n\n try {\n const result = await handler(frame.params ?? {}, ctx)\n if (this.inflight.has(frame.rpcId)) {\n this.sendResponse(frame.rpcId, { ok: true, result })\n }\n } catch (e: any) {\n if (this.inflight.has(frame.rpcId)) {\n this.sendResponse(frame.rpcId, {\n ok: false,\n error: e?.message ?? String(e),\n })\n }\n } finally {\n this.inflight.delete(frame.rpcId)\n }\n }\n\n /** Handle a `daemon_rpc_input` frame. */\n dispatchInput(frame: { rpcId: string; payload: unknown }): void {\n const call = this.inflight.get(frame.rpcId)\n if (!call) return\n call.ctx.receiveInput(frame.payload)\n }\n\n /** Handle a `daemon_rpc_cancel` frame. */\n dispatchCancel(frame: { rpcId: string }): void {\n const call = this.inflight.get(frame.rpcId)\n if (!call) return\n call.ctx.cancel()\n // Don't delete inflight here — the handler's catch/finally cleans up\n // and may still want to send a final terminal response.\n }\n\n /** Cancel everything (called on socket close). */\n shutdown(): void {\n for (const [, call] of this.inflight) {\n call.ctx.cancel()\n }\n this.inflight.clear()\n }\n\n private sendResponse(\n rpcId: string,\n body: { ok: boolean; result?: unknown; error?: string },\n ): void {\n sendJson(this.ws, { type: 'daemon_rpc_response', rpcId, ...body })\n }\n}\n\nfunction sendJson(ws: WebSocket, frame: object): void {\n if (ws.readyState !== ws.OPEN) return\n ws.send(JSON.stringify(frame))\n}\n","import { Buffer } from 'node:buffer'\nimport {\n promises as fsp,\n realpathSync,\n statSync,\n type Stats,\n} from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\nimport type { RpcRegistry } from './registry'\n\n/**\n * file.* RPC handlers.\n *\n * Every op takes `{ root, ... }` where `root` is the absolute workspace\n * directory the calling app already resolved. Callers MUST NOT pass\n * raw user-supplied paths — the daemon validates that any provided\n * `path` resolves inside `root` (after symlink resolution) and rejects\n * everything else.\n *\n * The jail intentionally blocks symlinks that escape the workspace.\n * Apps that want symlink-followed reads outside the workspace must\n * resolve them in their own action handler, then explicitly mount that\n * resolved path as another workspace.\n */\n\nexport function registerFileHandlers(registry: RpcRegistry): void {\n registry.register('file.tree', fileTree)\n registry.register('file.read', fileRead)\n registry.register('file.write', fileWrite)\n registry.register('file.stat', fileStat)\n registry.register('file.mkdir', fileMkdir)\n registry.register('file.delete', fileDelete)\n registry.register('file.rename', fileRename)\n // fs.* ops are *unjailed* filesystem browsers used to pick a workspace\n // root. Only reachable through `ctx.daemon()`, which is system-tier\n // gated, so they don't need their own privilege check. The browser\n // walks these to render its own picker — no native dialog opens on\n // the daemon machine, so the picker works from any device.\n registry.register('fs.browse', fsBrowse)\n registry.register('fs.home', fsHome)\n registry.register('fs.mkdir', fsMkdir)\n}\n\ninterface RootedParams {\n root: string\n path?: string\n}\n\nfunction expandHome(p: string): string {\n if (p === '~') return homedir()\n if (p.startsWith('~/')) return join(homedir(), p.slice(2))\n return p\n}\n\nfunction resolveRoot(root: string): string {\n if (typeof root !== 'string' || !root.trim()) {\n throw new Error('file.*: `root` is required')\n }\n const expanded = expandHome(root)\n if (!isAbsolute(expanded)) {\n throw new Error(`file.*: \\`root\\` must be absolute (got \"${root}\")`)\n }\n // Resolve symlinks once so the jail check uses the canonical path.\n // If the root doesn't exist yet (e.g. brand-new workspace) fall back\n // to the syntactic resolve — handlers that need an existing root will\n // surface ENOENT themselves.\n try {\n return realpathSync(expanded)\n } catch {\n return resolve(expanded)\n }\n}\n\n/** Returns the absolute path inside the jail, or throws. */\nfunction jailedPath(root: string, sub: string | undefined): string {\n const canonicalRoot = resolveRoot(root)\n const candidate = sub == null || sub === ''\n ? canonicalRoot\n : isAbsolute(sub)\n ? sub\n : resolve(canonicalRoot, sub)\n\n // Resolve symlinks where possible, but tolerate non-existent leaves\n // (file.write to a brand-new file should still work). Walk up until\n // we hit a real dir, realpath that, then re-attach the missing tail.\n let realBase = candidate\n let tail = ''\n while (true) {\n try {\n realBase = realpathSync(realBase)\n break\n } catch {\n const parent = dirname(realBase)\n if (parent === realBase) {\n // Hit the filesystem root without finding anything — give up\n // and use the syntactic resolve. The jail check below will\n // catch obvious escapes.\n realBase = candidate\n tail = ''\n break\n }\n tail = tail ? join(realBase.slice(parent.length + 1), tail) : realBase.slice(parent.length + 1)\n realBase = parent\n }\n }\n\n const final = tail ? join(realBase, tail) : realBase\n const rel = relative(canonicalRoot, final)\n if (rel.startsWith('..') || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`file.*: path \"${sub ?? ''}\" escapes workspace root \"${root}\"`)\n }\n return final\n}\n\ninterface FileTreeNode {\n name: string\n path: string\n isDir: boolean\n size?: number\n mtimeMs?: number\n}\n\ninterface FileTreeParams extends RootedParams {\n /** Subdir (relative to root). Defaults to root itself. */\n path?: string\n /** Max depth to recurse. Defaults to 1. Use a finite number — there's\n * no global cap, but very deep trees produce big responses. */\n depth?: number\n /** Names to skip at every level. Defaults to common heavy dirs. */\n ignore?: string[]\n}\n\nconst DEFAULT_IGNORE = new Set([\n 'node_modules',\n '.git',\n '.next',\n '.turbo',\n 'dist',\n 'build',\n '.venv',\n '__pycache__',\n '.DS_Store',\n])\n\nasync function fileTree(params: FileTreeParams): Promise<FileTreeNode[]> {\n const root = resolveRoot(params.root)\n const start = jailedPath(params.root, params.path)\n const depth = Math.max(0, params.depth ?? 1)\n const ignore = new Set([...DEFAULT_IGNORE, ...(params.ignore ?? [])])\n const out: FileTreeNode[] = []\n\n async function walk(absDir: string, level: number): Promise<void> {\n let entries: import('node:fs').Dirent[]\n try {\n // `encoding: 'utf8'` keeps Dirent.name typed as string under\n // strict @types/node, where the default `withFileTypes` overload\n // resolves to Dirent<NonSharedBuffer>.\n entries = (await fsp.readdir(absDir, {\n withFileTypes: true,\n encoding: 'utf8',\n })) as unknown as import('node:fs').Dirent[]\n } catch (e: any) {\n if (e?.code === 'ENOENT' || e?.code === 'ENOTDIR') return\n throw e\n }\n entries.sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1\n return a.name.localeCompare(b.name)\n })\n for (const entry of entries) {\n if (ignore.has(entry.name)) continue\n const abs = join(absDir, entry.name)\n const rel = relative(root, abs)\n let stat: Stats | null = null\n try {\n stat = await fsp.stat(abs)\n } catch {\n continue\n }\n const node: FileTreeNode = {\n name: entry.name,\n path: rel,\n isDir: entry.isDirectory(),\n size: entry.isFile() ? stat.size : undefined,\n mtimeMs: stat.mtimeMs,\n }\n out.push(node)\n if (entry.isDirectory() && level < depth) {\n await walk(abs, level + 1)\n }\n }\n }\n\n await walk(start, 1)\n return out\n}\n\ninterface FileReadParams extends RootedParams {\n path: string\n encoding?: 'utf8' | 'base64'\n /** Reject reads larger than this many bytes. Defaults to 5 MB. Apps\n * that need raw binary should chunk via repeated reads. */\n maxBytes?: number\n}\n\ninterface FileReadResult {\n path: string\n content: string\n encoding: 'utf8' | 'base64'\n size: number\n mtimeMs: number\n}\n\nasync function fileRead(params: FileReadParams): Promise<FileReadResult> {\n const abs = jailedPath(params.root, params.path)\n const maxBytes = params.maxBytes ?? 5 * 1024 * 1024\n const stat = await fsp.stat(abs)\n if (!stat.isFile()) {\n throw new Error(`file.read: not a file: ${params.path}`)\n }\n if (stat.size > maxBytes) {\n throw new Error(\n `file.read: file too large (${stat.size} bytes > ${maxBytes}). ` +\n `Pass maxBytes to override or chunk the read.`,\n )\n }\n const buf = await fsp.readFile(abs)\n const encoding = params.encoding ?? 'utf8'\n return {\n path: params.path,\n content:\n encoding === 'base64'\n ? buf.toString('base64')\n : buf.toString('utf8'),\n encoding,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n }\n}\n\ninterface FileWriteParams extends RootedParams {\n path: string\n content: string\n encoding?: 'utf8' | 'base64'\n /** Create parent dirs as needed. Defaults to true — matches the\n * expected ergonomics of an editor \"save\". */\n createDirs?: boolean\n}\n\ninterface FileWriteResult {\n path: string\n size: number\n mtimeMs: number\n}\n\nasync function fileWrite(params: FileWriteParams): Promise<FileWriteResult> {\n const abs = jailedPath(params.root, params.path)\n if (params.createDirs !== false) {\n await fsp.mkdir(dirname(abs), { recursive: true })\n }\n const buf =\n (params.encoding ?? 'utf8') === 'base64'\n ? Buffer.from(params.content, 'base64')\n : Buffer.from(params.content, 'utf8')\n await fsp.writeFile(abs, buf)\n const stat = await fsp.stat(abs)\n return { path: params.path, size: stat.size, mtimeMs: stat.mtimeMs }\n}\n\ninterface FileStatParams extends RootedParams {\n path: string\n}\n\ninterface FileStatResult {\n exists: boolean\n isFile: boolean\n isDir: boolean\n size: number\n mtimeMs: number\n}\n\nasync function fileStat(params: FileStatParams): Promise<FileStatResult> {\n // `path: ''` means \"stat the workspace root itself\" — used by the\n // File app to validate a folder before pinning it. Using `jailedPath`\n // here would fail when the root doesn't exist yet, since the jail\n // walks the parent chain via realpath (and on macOS `/var` ↔\n // `/private/var` symlink resolution makes the result fall outside\n // the syntactic root). Stat the root directly in that case.\n let abs: string\n try {\n abs =\n params.path == null || params.path === ''\n ? expandHome(params.root)\n : jailedPath(params.root, params.path)\n } catch (e: any) {\n if (/escapes workspace root/.test(e?.message ?? '')) throw e\n return { exists: false, isFile: false, isDir: false, size: 0, mtimeMs: 0 }\n }\n try {\n const stat = statSync(abs)\n return {\n exists: true,\n isFile: stat.isFile(),\n isDir: stat.isDirectory(),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n }\n } catch {\n return { exists: false, isFile: false, isDir: false, size: 0, mtimeMs: 0 }\n }\n}\n\ninterface FileMkdirParams extends RootedParams {\n path: string\n}\n\nasync function fileMkdir(params: FileMkdirParams): Promise<{ path: string }> {\n const abs = jailedPath(params.root, params.path)\n await fsp.mkdir(abs, { recursive: true })\n return { path: params.path }\n}\n\ninterface FileDeleteParams extends RootedParams {\n path: string\n /** Permit recursive directory removal. Default false. */\n recursive?: boolean\n}\n\nasync function fileDelete(params: FileDeleteParams): Promise<{ path: string }> {\n const abs = jailedPath(params.root, params.path)\n await fsp.rm(abs, { recursive: !!params.recursive, force: false })\n return { path: params.path }\n}\n\ninterface FileRenameParams extends RootedParams {\n from: string\n to: string\n}\n\nasync function fileRename(\n params: FileRenameParams,\n): Promise<{ from: string; to: string }> {\n const fromAbs = jailedPath(params.root, params.from)\n const toAbs = jailedPath(params.root, params.to)\n await fsp.rename(fromAbs, toAbs)\n return { from: params.from, to: params.to }\n}\n\ninterface FsBrowseParams {\n /** Absolute path to list. Defaults to the user's home dir. */\n path?: string\n /** Include dotfiles. Default false. */\n showHidden?: boolean\n /** Include files (not just directories). Default false — the\n * workspace picker only cares about folders. */\n includeFiles?: boolean\n}\n\ninterface FsBrowseEntry {\n name: string\n path: string\n isDir: boolean\n}\n\ninterface FsBrowseResult {\n /** Resolved absolute path that was listed. */\n path: string\n /** Parent dir, or null if `path` is the filesystem root. */\n parent: string | null\n entries: FsBrowseEntry[]\n}\n\nasync function fsBrowse(params: FsBrowseParams): Promise<FsBrowseResult> {\n const expanded = expandHome(params.path ?? '~')\n if (!isAbsolute(expanded)) {\n throw new Error(`fs.browse: path must be absolute (got \"${params.path}\")`)\n }\n let resolved: string\n try {\n resolved = realpathSync(expanded)\n } catch {\n resolved = resolve(expanded)\n }\n\n let raw: import('node:fs').Dirent[]\n try {\n raw = (await fsp.readdir(resolved, {\n withFileTypes: true,\n encoding: 'utf8',\n })) as unknown as import('node:fs').Dirent[]\n } catch (e: any) {\n throw new Error(`fs.browse: cannot read ${resolved}: ${e?.code ?? e?.message ?? e}`)\n }\n\n const entries: FsBrowseEntry[] = []\n for (const entry of raw) {\n if (!params.showHidden && entry.name.startsWith('.')) continue\n const isDir = entry.isDirectory()\n if (!isDir && !params.includeFiles) continue\n entries.push({\n name: entry.name,\n path: join(resolved, entry.name),\n isDir,\n })\n }\n entries.sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1\n return a.name.localeCompare(b.name)\n })\n\n const parent = dirname(resolved)\n return {\n path: resolved,\n parent: parent === resolved ? null : parent,\n entries,\n }\n}\n\nasync function fsHome(): Promise<{ home: string; cwd: string }> {\n return { home: homedir(), cwd: process.cwd() }\n}\n\ninterface FsMkdirParams {\n /** Absolute path of the directory to create. */\n path: string\n}\n\n/** Unjailed `mkdir -p` for the workspace picker. The file.mkdir op\n * requires a workspace root and would refuse a brand-new location.\n * Only reachable through ctx.daemon() (system-tier gated). */\nasync function fsMkdir(params: FsMkdirParams): Promise<{ path: string }> {\n const expanded = expandHome(params.path ?? '')\n if (!expanded || !isAbsolute(expanded)) {\n throw new Error(`fs.mkdir: path must be absolute (got \"${params.path}\")`)\n }\n await fsp.mkdir(expanded, { recursive: true })\n return { path: expanded }\n}\n\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { existsSync, statSync } from 'node:fs'\nimport { homedir, platform } from 'node:os'\nimport { join } from 'node:path'\nimport { isAbsolute } from 'node:path'\nimport type { RpcContext, RpcRegistry } from './registry'\n\n/**\n * pty.* RPC handlers.\n *\n * Two ops:\n * - pty.spawn (stream): start a process, stream stdout chunks back,\n * accept stdin chunks via daemon_rpc_input. Resolves when\n * the child exits.\n * - pty.resize (unary): resize a previously spawned PTY.\n * - pty.kill (unary): kill a previously spawned PTY.\n *\n * `node-pty` is loaded lazily — it's a native dep that not every install\n * has compiled. When missing we fall back to a `child_process.spawn`\n * pseudo-PTY: works for line-oriented commands (`ls`, `git status`,\n * `node`), useless for curses apps (`vim`, `htop`). The handler reports\n * which mode it ended up in via the first `pushChunk`.\n *\n * Lifetime is tied to the `pty.spawn` RPC: cancel the RPC (or close the\n * daemon WS) and the child gets SIGTERM then SIGKILL after 5 s.\n */\n\ninterface PtySpawnParams {\n cwd: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n cols?: number\n rows?: number\n}\n\ninterface PtyHandle {\n ptyId: string\n resize(cols: number, rows: number): void\n write(data: string): void\n kill(signal?: string): void\n}\n\nconst handles = new Map<string, PtyHandle>()\n\nexport function registerPtyHandlers(registry: RpcRegistry): void {\n registry.register('pty.spawn', ptySpawn)\n registry.register('pty.write', ptyWrite)\n registry.register('pty.resize', ptyResize)\n registry.register('pty.kill', ptyKill)\n}\n\nasync function ptySpawn(\n params: PtySpawnParams,\n ctx: RpcContext,\n): Promise<{ ptyId: string; exitCode: number | null; mode: 'pty' | 'pipe' }> {\n if (!params.cwd || typeof params.cwd !== 'string' || !isAbsolute(params.cwd)) {\n throw new Error('pty.spawn: `cwd` is required and must be absolute')\n }\n // node-pty surfaces missing cwd / shell as an opaque\n // `posix_spawnp failed` error through the child's stdout — pre-flight\n // both so the GUI sees an actionable message instead.\n let cwdStat: ReturnType<typeof statSync>\n try {\n cwdStat = statSync(params.cwd)\n } catch {\n throw new Error(`pty.spawn: cwd does not exist: ${params.cwd}`)\n }\n if (!cwdStat.isDirectory()) {\n throw new Error(`pty.spawn: cwd is not a directory: ${params.cwd}`)\n }\n const command = params.command || defaultShell()\n if (!existsSync(command)) {\n throw new Error(\n `pty.spawn: shell binary not found: ${command} ` +\n `(set $SHELL in the daemon's environment, or pass an explicit \\`command\\`)`,\n )\n }\n const args = params.args ?? defaultShellArgs()\n // node-pty's TS types want { [k: string]: string } — process.env entries\n // are string|undefined, so filter out the undefineds before passing.\n const env: Record<string, string> = { TERM: 'xterm-256color' }\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') env[k] = v\n }\n for (const [k, v] of Object.entries(params.env ?? {})) {\n env[k] = v\n }\n const cols = params.cols ?? 80\n const rows = params.rows ?? 24\n\n const handle = await openPty({ command, args, cwd: params.cwd, env, cols, rows, ctx })\n handles.set(handle.handle.ptyId, handle.handle)\n\n // Stream stdin chunks from server to the child.\n ctx.onInput((payload) => {\n if (typeof payload === 'string') handle.handle.write(payload)\n else if (payload && typeof (payload as any).data === 'string') {\n handle.handle.write((payload as any).data)\n }\n })\n\n ctx.onCancel(() => {\n handle.handle.kill('SIGTERM')\n setTimeout(() => {\n try {\n handle.handle.kill('SIGKILL')\n } catch {\n // already gone\n }\n }, 5_000).unref()\n })\n\n // First chunk announces the mode so the client UI can warn the user\n // when they're getting line-oriented mode (e.g. `vim` won't render).\n ctx.pushChunk({ kind: 'mode', mode: handle.mode, ptyId: handle.handle.ptyId })\n\n const exitCode = await handle.exited\n handles.delete(handle.handle.ptyId)\n return { ptyId: handle.handle.ptyId, exitCode, mode: handle.mode }\n}\n\ninterface PtyWriteParams {\n ptyId: string\n data: string\n}\n\nasync function ptyWrite(params: PtyWriteParams): Promise<{ ok: true }> {\n const handle = handles.get(params.ptyId)\n if (!handle) throw new Error(`pty.write: unknown ptyId ${params.ptyId}`)\n handle.write(params.data)\n return { ok: true }\n}\n\ninterface PtyResizeParams {\n ptyId: string\n cols: number\n rows: number\n}\n\nasync function ptyResize(params: PtyResizeParams): Promise<{ ok: true }> {\n const handle = handles.get(params.ptyId)\n if (!handle) throw new Error(`pty.resize: unknown ptyId ${params.ptyId}`)\n handle.resize(params.cols, params.rows)\n return { ok: true }\n}\n\ninterface PtyKillParams {\n ptyId: string\n signal?: string\n}\n\nasync function ptyKill(params: PtyKillParams): Promise<{ ok: true }> {\n const handle = handles.get(params.ptyId)\n if (!handle) throw new Error(`pty.kill: unknown ptyId ${params.ptyId}`)\n handle.kill(params.signal ?? 'SIGTERM')\n return { ok: true }\n}\n\ninterface OpenedPty {\n handle: PtyHandle\n mode: 'pty' | 'pipe'\n exited: Promise<number | null>\n}\n\nasync function openPty(opts: {\n command: string\n args: string[]\n cwd: string\n env: Record<string, string>\n cols: number\n rows: number\n ctx: RpcContext\n}): Promise<OpenedPty> {\n const nodePty = await loadNodePty()\n if (nodePty) {\n const proc = nodePty.spawn(opts.command, opts.args, {\n name: 'xterm-256color',\n cols: opts.cols,\n rows: opts.rows,\n cwd: opts.cwd,\n env: opts.env as any,\n })\n const ptyId = randomUUID()\n proc.onData((data: string) => {\n opts.ctx.pushChunk({ kind: 'data', data })\n })\n const exited = new Promise<number | null>((resolve) => {\n proc.onExit(({ exitCode }: { exitCode: number; signal?: number }) => {\n resolve(exitCode)\n })\n })\n return {\n mode: 'pty',\n exited,\n handle: {\n ptyId,\n resize: (cols, rows) => proc.resize(cols, rows),\n write: (data) => proc.write(data),\n kill: (signal) => proc.kill(signal),\n },\n }\n }\n\n // Fallback: line-oriented spawn. Works for non-interactive shells.\n const proc: ChildProcessWithoutNullStreams = spawn(\n opts.command,\n opts.args,\n {\n cwd: opts.cwd,\n env: opts.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n )\n const ptyId = randomUUID()\n proc.stdout.on('data', (chunk: Buffer) => {\n opts.ctx.pushChunk({ kind: 'data', data: chunk.toString('utf8') })\n })\n proc.stderr.on('data', (chunk: Buffer) => {\n opts.ctx.pushChunk({ kind: 'data', data: chunk.toString('utf8') })\n })\n const exited = new Promise<number | null>((resolve) => {\n proc.on('close', (code) => resolve(code))\n })\n return {\n mode: 'pipe',\n exited,\n handle: {\n ptyId,\n resize: () => {\n // No SIGWINCH on pipes — no-op.\n },\n write: (data) => {\n proc.stdin.write(data)\n },\n kill: (signal) => {\n proc.kill((signal as NodeJS.Signals) ?? 'SIGTERM')\n },\n },\n }\n}\n\nlet nodePtyCache: any | null | undefined = undefined\n\nasync function loadNodePty(): Promise<any | null> {\n if (nodePtyCache !== undefined) return nodePtyCache\n try {\n // Use a string variable so bundlers don't statically resolve and\n // crash when the optional dep is absent.\n const moduleName = 'node-pty'\n nodePtyCache = await import(moduleName)\n return nodePtyCache\n } catch {\n nodePtyCache = null\n return null\n }\n}\n\nfunction defaultShell(): string {\n if (platform() === 'win32') {\n return process.env.COMSPEC || 'cmd.exe'\n }\n return process.env.SHELL || '/bin/bash'\n}\n\nfunction defaultShellArgs(): string[] {\n if (platform() === 'win32') return []\n // -i to make the shell load aliases / prompt config the user expects.\n return ['-l', '-i']\n}\n\n// Best-effort heuristics so spawned shells start somewhere sensible if\n// the caller forgot to pass cwd. Currently unused but kept here for\n// future ops that don't carry an explicit cwd.\nexport function defaultUserCwd(): string {\n const home = homedir()\n if (process.env.PWD && isAbsolute(process.env.PWD)) {\n return process.env.PWD\n }\n return join(home)\n}\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { resolve, join } from 'node:path'\nimport { existsSync, mkdirSync, openSync, writeFileSync } 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 } from '../config/daemon'\nimport { runBrowserAuth } from '../auth/browser-auth'\nimport { registerAllDetectedAgents } from './daemon-agent-config'\nimport { isDaemonRunningLocally, stopExistingDaemon } from './daemon-supervisor'\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 const savedProfile = saveDaemonProfile({\n server: result.serverUrl ?? serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n userEmail: result.userEmail,\n })\n console.log(\n ` Daemon: ${pc.bold(data.daemon.name)} ${pc.dim(`(${data.daemon.id})`)}` +\n pc.dim(` profile=${savedProfile.alias}`),\n )\n await autoRegisterAgents(opts, savedProfile)\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 // Re-pairing extends `~/.botapp/daemon.yaml` with a new profile, but\n // an already-running daemon process loaded the old set at startup —\n // it won't pick up the new server until we restart it. Stop the\n // existing supervisor (if any) so the spawn below picks up the full\n // updated profile list.\n if (isDaemonRunningLocally(pidFile)) {\n stopExistingDaemon(pidFile)\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\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(\n opts: LaunchOpts,\n daemon: { server: string; token: string },\n): Promise<void> {\n if (opts.agents === false) 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 { 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","// Helpers for managing the local detached `bot daemon run` process\n// (PID tracked in `~/.botapp/daemon.pid`). Shared between `bot launch`\n// and `bot pairing` so that any flow which rotates the token in\n// `daemon.yaml` also stops the running daemon — otherwise it keeps\n// presenting its in-memory stale token and loops forever with\n// `4001 Unauthorized`.\nimport { existsSync, readFileSync, unlinkSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport function daemonPidFile(): string {\n return join(homedir(), '.botapp', 'daemon.pid')\n}\n\nexport function isDaemonRunningLocally(pidFile: string = daemonPidFile()): 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\nexport function stopExistingDaemon(pidFile: string = daemonPidFile()): void {\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10)\n if (Number.isInteger(pid) && pid > 0) {\n try {\n process.kill(pid, 'SIGTERM')\n } catch {\n // Process is already gone — proceed.\n }\n }\n } catch {\n // PID file unreadable — ignore.\n }\n try {\n unlinkSync(pidFile)\n } catch {\n // PID file already removed — fine.\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 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'\nimport { runDaemonConnectionLoop } from './daemon'\nimport { isDaemonRunningLocally, stopExistingDaemon } from './daemon-supervisor'\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 // Stop any background daemon before rotating the token. The\n // detached process loaded the previous token at startup and only\n // re-reads daemon.yaml on restart — leaving it running would\n // produce a perpetual `4001 Unauthorized` loop in daemon.log\n // and let it fight the new daemon for the agent slot via\n // closeStaleDaemonConnections. Same fix `bot launch` already\n // applies before its own auto-restart.\n const stoppedExistingDaemon = isDaemonRunningLocally()\n if (stoppedExistingDaemon) {\n stopExistingDaemon()\n }\n\n const savedProfile = saveDaemonProfile({\n server: serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n userEmail: grant.userEmail,\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(` Profile: ${savedProfile.alias}`)\n if (stoppedExistingDaemon) {\n console.log(pc.dim(' Note: stopped the existing background daemon (was holding the old token).'))\n }\n\n if (opts.run) {\n // No agent auto-registration. The user explicitly creates the\n // agents they want from the dashboard's Create Agent modal —\n // surprise-defaults that scan PATH for `codex` / `claude` /\n // etc. were producing four agents the user never asked for.\n // Run the just-paired profile (not the first one in the file)\n // so re-pairing one of several servers does the obvious thing.\n await runDaemonConnectionLoop(savedProfile)\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 { Command } from 'commander'\nimport pc from 'picocolors'\nimport { loadDaemonProfiles, type DaemonProfile } from '../config/daemon'\nimport { daemonRequest } from './daemon'\n\ntype Severity = 'ok' | 'warn' | 'fail'\n\ninterface Finding {\n severity: Severity\n message: string\n /** Optional remediation hint shown indented under the message. */\n fix?: string\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Diagnose paired daemon profiles (server reachability, token validity, account ownership)')\n .action(async () => {\n const profiles = loadDaemonProfiles()\n if (profiles.length === 0) {\n console.log(pc.dim('No paired daemons in ~/.botapp/daemon.yaml.'))\n console.log(pc.dim('Run `bot pair` to add one.'))\n return\n }\n\n let warns = 0\n let fails = 0\n\n for (const profile of profiles) {\n console.log(pc.bold(`\\n[${profile.alias ?? profile.server}]`))\n console.log(` Server: ${profile.server}`)\n console.log(` Daemon: ${profile.daemonName} ${pc.dim(`(${profile.daemonId})`)}`)\n\n const findings = await checkProfile(profile)\n for (const f of findings) {\n const tag = f.severity === 'ok' ? pc.green(' ✓ ') : f.severity === 'warn' ? pc.yellow(' ⚠ ') : pc.red(' ✗ ')\n console.log(`${tag}${f.message}`)\n if (f.fix) console.log(pc.dim(` → ${f.fix}`))\n if (f.severity === 'warn') warns += 1\n if (f.severity === 'fail') fails += 1\n }\n }\n\n console.log('')\n if (fails === 0 && warns === 0) {\n console.log(pc.green('All checks passed.'))\n } else {\n const parts: string[] = []\n if (fails > 0) parts.push(pc.red(`${fails} failing`))\n if (warns > 0) parts.push(pc.yellow(`${warns} warning${warns === 1 ? '' : 's'}`))\n console.log(parts.join(', ') + '.')\n if (fails > 0) process.exitCode = 1\n }\n })\n\nasync function checkProfile(profile: DaemonProfile): Promise<Finding[]> {\n const findings: Finding[] = []\n\n // 1. Server reachable.\n let serverOk = false\n try {\n const res = await fetch(`${profile.server}/health`, {\n signal: AbortSignal.timeout(5000),\n })\n if (res.ok) {\n findings.push({ severity: 'ok', message: 'Server reachable' })\n serverOk = true\n } else {\n findings.push({\n severity: 'fail',\n message: `Server returned ${res.status} ${res.statusText}`,\n fix: `Verify the server at ${profile.server} is running.`,\n })\n }\n } catch (e: any) {\n findings.push({\n severity: 'fail',\n message: `Server unreachable: ${e.message ?? e}`,\n fix: `Start the server, or remove this profile with \\`bot daemon unpair ${profile.alias ?? profile.server}\\`.`,\n })\n }\n if (!serverOk) return findings\n\n // 2. Token valid + identity probe.\n let serverEmail: string | null = null\n try {\n const data = (await daemonRequest(profile.server, profile.token, '/api/daemon/self')) as {\n daemon?: { id: string; status: string; lastSeenAt: string | null }\n user?: { id: string; email: string } | null\n }\n findings.push({ severity: 'ok', message: 'Token valid' })\n\n serverEmail = data.user?.email ?? null\n if (serverEmail) {\n findings.push({\n severity: 'ok',\n message: `Token paired under ${pc.bold(serverEmail)}`,\n })\n } else {\n findings.push({\n severity: 'warn',\n message: 'Server returned no user record for this daemon',\n fix: 'The owning user may have been deleted. Re-pair with `bot pair`.',\n })\n }\n\n // 3. Online status.\n if (data.daemon?.status === 'online') {\n findings.push({ severity: 'ok', message: 'Daemon currently online' })\n } else {\n findings.push({\n severity: 'warn',\n message: `Daemon status: ${data.daemon?.status ?? 'unknown'}`,\n fix: `Run \\`bot daemon run --server ${profile.server}\\` to bring it online.`,\n })\n }\n } catch (e: any) {\n const msg = e?.message ?? String(e)\n if (/unauthor/i.test(msg) || /token/i.test(msg)) {\n findings.push({\n severity: 'fail',\n message: `Token rejected: ${msg}`,\n fix: 'The token is stale (likely the server DB was reset). Re-pair with `bot pair`.',\n })\n return findings\n }\n findings.push({ severity: 'fail', message: `Identity probe failed: ${msg}` })\n return findings\n }\n\n // 4. Recorded userEmail vs server-reported.\n if (profile.userEmail && serverEmail && profile.userEmail !== serverEmail) {\n findings.push({\n severity: 'warn',\n message: `daemon.yaml says \\`userEmail: ${profile.userEmail}\\` but server says \\`${serverEmail}\\``,\n fix: 'Re-pair to refresh the recorded email.',\n })\n } else if (!profile.userEmail && serverEmail) {\n findings.push({\n severity: 'warn',\n message: 'daemon.yaml has no userEmail recorded',\n fix: 'Re-pair to capture it (cosmetic — auth still works).',\n })\n }\n\n // 5. Cross-check vs the dashboard session, if a cookie jar is around.\n // We can't easily read the browser cookie from CLI, so instead we just\n // hint when there are multiple profiles for the same server with\n // different owners — almost certainly the source of \"I see offline\"\n // confusion.\n return findings\n}\n","import { spawn } from 'node:child_process'\nimport { realpathSync } from 'node:fs'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\n\ntype Manager = 'npm' | 'pnpm' | 'yarn' | 'brew' | 'npx'\n\nconst PACKAGE_NAME = 'botapp-cli'\n\n/**\n * Update the installed `bot` binary itself.\n *\n * Detection from `process.argv[1]`:\n * ~/.../pnpm/... → pnpm add -g botapp-cli@latest\n * ~/.../yarn/... → yarn global add botapp-cli@latest\n * ~/.../Cellar/... → brew upgrade botapp-cli\n * ~/.../_npx/<hash>/ → no-op (npx -y always fetches @latest)\n * anything else → npm i -g botapp-cli@latest\n *\n * App updates are intentionally NOT folded in here — those go through\n * `bot install` / `bot reload` because they have very different\n * semantics (per-app source, manifest reload, capability re-grant).\n */\nexport const updateCommand = new Command('update')\n .description('Update the `bot` CLI itself to the latest published version')\n .option(\n '--manager <pm>',\n 'Force a package manager: npm | pnpm | yarn | brew (default: auto-detect)',\n )\n .option('--dry-run', 'Print the command that would run, but do not execute it')\n .action(async (opts) => {\n const forced = opts.manager as Manager | undefined\n const manager = forced ?? detectPackageManager()\n\n if (manager === 'npx') {\n console.log(\n pc.green(\n 'You are running `bot` via `npx -y botapp-cli@latest` — every invocation already fetches the latest version.',\n ),\n )\n console.log(\n pc.dim(\n 'For a faster startup, install it globally instead:\\n' +\n ' npm i -g botapp-cli@latest\\n' +\n ' pnpm add -g botapp-cli@latest',\n ),\n )\n return\n }\n\n if (!manager) {\n console.error(\n pc.red(\n \"Couldn't detect how `bot` was installed. Pick one of these manually:\",\n ),\n )\n console.log(pc.cyan(' npm i -g botapp-cli@latest'))\n console.log(pc.cyan(' pnpm add -g botapp-cli@latest'))\n console.log(pc.cyan(' yarn global add botapp-cli@latest'))\n console.log(pc.cyan(' brew upgrade botapp-cli'))\n process.exitCode = 1\n return\n }\n\n const { command, args } = updateCommandFor(manager)\n console.log(pc.dim(`$ ${command} ${args.join(' ')}`))\n if (opts.dryRun) return\n\n const child = spawn(command, args, { stdio: 'inherit' })\n const code = await new Promise<number | null>((resolve) => {\n child.once('error', (err) => {\n console.error(pc.red(`Failed to spawn ${command}: ${err.message}`))\n resolve(127)\n })\n child.once('close', resolve)\n })\n if (code !== 0) {\n console.error(pc.red(`Update failed (exit ${code}).`))\n process.exitCode = code ?? 1\n return\n }\n console.log(pc.green('botapp-cli updated. Run `bot --version` to confirm.'))\n })\n\nfunction detectPackageManager(): Manager | null {\n // npm/pnpm/etc. global installs put a symlink in `…/bin/bot` and the\n // actual file under `…/lib/node_modules/…`. `process.argv[1]` is the\n // symlink path (Node doesn't resolve it by default), so we'd miss\n // `/lib/node_modules/`, `/_npx/`, etc. Match against both the\n // invocation path and the resolved real path.\n const argv = process.argv[1] ?? ''\n let real = ''\n try { real = argv ? realpathSync(argv) : '' } catch { /* dangling/missing — keep argv only */ }\n const candidates = [argv, real].filter(Boolean)\n // Order matters: an `npx` cache path also contains `node_modules`, and\n // a pnpm global path on Windows uses `\\pnpm\\`. Check the most specific\n // markers first.\n if (matchAny(candidates, ['/_npx/', '\\\\_npx\\\\'])) return 'npx'\n if (matchAny(candidates, ['/pnpm/', '\\\\pnpm\\\\', '/.pnpm/'])) return 'pnpm'\n if (matchAny(candidates, ['/.yarn/', '/yarn/global/'])) return 'yarn'\n if (matchAny(candidates, ['/Cellar/', '/homebrew/', '\\\\Cellar\\\\'])) return 'brew'\n if (matchAny(candidates, ['/lib/node_modules/', '\\\\node_modules\\\\']) || candidates.some((c) => c.includes('npm'))) return 'npm'\n return null\n}\n\nfunction matchAny(haystacks: string[], needles: string[]): boolean {\n return haystacks.some((h) => needles.some((n) => h.includes(n)))\n}\n\nfunction updateCommandFor(manager: Exclude<Manager, 'npx'>): {\n command: string\n args: string[]\n} {\n switch (manager) {\n case 'pnpm':\n return { command: 'pnpm', args: ['add', '-g', `${PACKAGE_NAME}@latest`] }\n case 'yarn':\n return { command: 'yarn', args: ['global', 'add', `${PACKAGE_NAME}@latest`] }\n case 'brew':\n return { command: 'brew', args: ['upgrade', PACKAGE_NAME] }\n case 'npm':\n default:\n return { command: 'npm', args: ['i', '-g', `${PACKAGE_NAME}@latest`] }\n }\n}\n","// `bot simulate` — dev-tunnel an app to a botapp server.\n//\n// Reads the local `botapp.app.json`, asks the server for a per-user\n// dev-session token (POST /api/dev/token), then spawns the app's entry\n// process with BOTAPP_SERVER + BOTAPP_APP_TOKEN set. The app uses the\n// SDK's HostedClient (or BotApp.start()) to connect; once registered,\n// it shadows the published version of the app for the logged-in user\n// only — the developer can then exercise it through their real\n// dashboard.\n//\n// File watching for hot reload is left as a follow-up; for now Ctrl-C\n// stops the child and exit.\n\nimport { Command } from 'commander'\nimport { resolve, join } from 'node:path'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\ninterface AppManifest {\n name: string\n version?: string\n entry?: string\n [key: string]: unknown\n}\n\nexport const simulateCommand = new Command('simulate')\n .description('Dev-tunnel a local app to a botapp server (per-user shadow)')\n .argument('[path]', 'Path to the app directory', '.')\n .option('-s, --server <url>', 'botapp server URL (default: active profile / $BOTAPP_SERVER)')\n .option('-t, --token <token>', 'auth token (default: active profile / $BOTAPP_TOKEN)')\n .option('--entry <file>', 'override the manifest entry path')\n .option('--lifetime <minutes>', 'dev-session token lifetime in minutes', '480')\n .action(async (appPath, opts) => {\n const absPath = resolve(appPath)\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 const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as AppManifest\n if (!manifest.name) {\n console.error(pc.red('manifest missing \"name\"'))\n process.exitCode = 1\n return\n }\n\n const httpServer = resolveServerUrl(opts.server)\n const wsServer = httpServer.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:') + '/ws/host'\n const token = resolveToken(opts.token)\n if (!token) {\n console.error(pc.red('not logged in: run `bot login` or pass --token'))\n process.exitCode = 1\n return\n }\n\n const lifetimeMs = Math.max(60_000, Number(opts.lifetime) * 60_000)\n\n console.log(pc.dim(`requesting dev token for \"${manifest.name}\" from ${httpServer}...`))\n const devToken = await issueDevToken({\n serverUrl: httpServer,\n token,\n appName: manifest.name,\n lifetimeMs,\n })\n console.log(pc.green('✓'), `dev token issued (lifetime ${opts.lifetime} min)`)\n\n const entryPath = resolveEntry(absPath, opts.entry ?? manifest.entry)\n if (!existsSync(entryPath)) {\n console.error(pc.red(`entry not found: ${entryPath}`))\n console.error(pc.dim(' run `pnpm build` (or your build script) first.'))\n process.exitCode = 1\n return\n }\n\n console.log(pc.dim(`spawning ${entryPath} ...`))\n console.log(pc.dim(` BOTAPP_SERVER=${wsServer}`))\n console.log(pc.dim(` BOTAPP_APP_NAME=${manifest.name}`))\n console.log(\n pc.cyan(\n `\\nWhen ready, your dashboard at ${httpServer} will route \"${manifest.name}\" to this process for your account only.\\n`,\n ),\n )\n\n const child: ChildProcess = spawn('node', [entryPath], {\n cwd: absPath,\n env: {\n ...process.env,\n BOTAPP_SERVER: wsServer,\n BOTAPP_APP_TOKEN: devToken,\n BOTAPP_APP_NAME: manifest.name,\n BOTAPP_DATA_DIR: join(absPath, '.botapp-sim'),\n },\n stdio: 'inherit',\n })\n\n const stop = (signal: NodeJS.Signals) => {\n console.log(pc.dim(`\\nstopping (${signal})...`))\n if (!child.killed) child.kill(signal)\n }\n process.on('SIGINT', () => stop('SIGINT'))\n process.on('SIGTERM', () => stop('SIGTERM'))\n\n child.on('exit', (code, sig) => {\n const reason = sig ? `signal ${sig}` : `exit ${code}`\n console.log(pc.dim(`child exited (${reason})`))\n process.exit(typeof code === 'number' ? code : 0)\n })\n })\n\nasync function issueDevToken(opts: {\n serverUrl: string\n token: string\n appName: string\n lifetimeMs: number\n}): Promise<string> {\n const res = await fetch(`${opts.serverUrl}/api/dev/token`, {\n method: 'POST',\n headers: authHeaders(opts.token),\n body: JSON.stringify({ appName: opts.appName, lifetimeMs: opts.lifetimeMs }),\n })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(`dev-token request failed (${res.status}): ${text}`)\n }\n const data = (await res.json()) as { token?: string; error?: string }\n if (!data.token) {\n throw new Error(`dev-token response missing token: ${JSON.stringify(data)}`)\n }\n return data.token\n}\n\nfunction resolveEntry(appDir: string, entry: string | undefined): string {\n // Default search order: dist/api.js, dist/index.js, api/index.ts (fallback).\n const candidates = [\n entry,\n 'dist/api.js',\n 'dist/api/index.js',\n 'dist/index.js',\n 'api/index.ts',\n 'api/index.js',\n ].filter(Boolean) as string[]\n for (const c of candidates) {\n const full = resolve(appDir, c)\n if (existsSync(full)) return full\n }\n // Fall through: return the first candidate so the caller can show a clear error.\n return resolve(appDir, candidates[0] ?? 'dist/api.js')\n}\n","// `bot init <name>` — scaffold a hosted-tier (Tier B) app project.\n//\n// Pure-TS, no shell-out, no external template tree. Generates a\n// minimal app you can immediately run with `bot simulate`. Intentionally\n// smaller than the legacy app-template/scripts/init.sh — that script\n// targets the old multi-target adapter model; the hosted runtime makes\n// targets irrelevant (the app is just a Node process that connects via\n// outbound WS).\n\nimport { Command } from 'commander'\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\nimport pc from 'picocolors'\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new hosted-tier botapp app project')\n .argument('<name>', 'App name (kebab-case; used in URL paths and manifest)')\n .option('-d, --dir <path>', 'Output directory (default: ./<name>)')\n .option('--headless', 'No frontend — backend-only app (skip src/, tailwind, etc.)')\n .option('--description <text>', 'Short description for AI agents to read')\n .option('-f, --force', 'Overwrite existing directory contents')\n .action(async (name: string, opts: InitOptions) => {\n if (!/^[a-z][a-z0-9-]*$/.test(name)) {\n console.error(pc.red('Invalid name. Use lowercase letters, digits, dashes; must start with a letter.'))\n console.error(pc.dim(' e.g. my-app, todo-tracker, gomoku-2'))\n process.exitCode = 1\n return\n }\n\n const targetDir = resolve(opts.dir ?? `./${name}`)\n if (existsSync(targetDir) && !opts.force) {\n const stat = (() => {\n try {\n return require('node:fs').readdirSync(targetDir)\n } catch {\n return []\n }\n })()\n if (Array.isArray(stat) && stat.length > 0) {\n console.error(pc.red(`Target directory exists and is not empty: ${targetDir}`))\n console.error(pc.dim(' pass --force to overwrite, or pick a different --dir'))\n process.exitCode = 1\n return\n }\n }\n\n const ctx: TemplateContext = {\n name,\n description: opts.description ?? `${name} — a botapp app`,\n headless: !!opts.headless,\n }\n\n mkdirSync(targetDir, { recursive: true })\n const files = ctx.headless ? headlessFiles(ctx) : fullFiles(ctx)\n for (const [rel, content] of Object.entries(files)) {\n const full = join(targetDir, rel)\n mkdirSync(dirname(full), { recursive: true })\n writeFileSync(full, content)\n }\n\n console.log(pc.green('✓'), `Scaffolded ${ctx.headless ? 'headless ' : ''}app at`, pc.cyan(targetDir))\n console.log()\n console.log('Next steps:')\n console.log(pc.dim(` cd ${targetDir.replace(process.cwd() + '/', '')}`))\n console.log(pc.dim(' pnpm install # or npm install'))\n if (!ctx.headless) console.log(pc.dim(' pnpm build # builds api/ + frontend (dist/)'))\n else console.log(pc.dim(' pnpm build # builds api/ to dist/api.js'))\n console.log(pc.dim(` bot login --server <your-botapp-server>`))\n console.log(pc.dim(` bot simulate # dev-tunnel into the server, hot-reload as you build`))\n console.log()\n console.log(\n pc.dim('Once it works, `bot publish` ships it to the server (per-user install by default).'),\n )\n })\n\ninterface InitOptions {\n dir?: string\n headless?: boolean\n description?: string\n force?: boolean\n}\n\ninterface TemplateContext {\n name: string\n description: string\n headless: boolean\n}\n\n// ----- file map builders -----\n\nfunction fullFiles(ctx: TemplateContext): Record<string, string> {\n return {\n 'botapp.app.json': manifestJson(ctx),\n 'package.json': packageJson(ctx, /*headless*/ false),\n 'tsconfig.json': tsconfigJson(false),\n 'tsconfig.api.json': tsconfigApiJson(),\n 'tsconfig.frontend.json': tsconfigFrontendJson(),\n 'tsup.api.config.ts': tsupApiConfig(),\n 'vite.config.ts': viteConfig(ctx),\n 'index.html': indexHtml(ctx),\n 'api/index.ts': apiEntryTs(ctx, false),\n 'src/main.tsx': srcMainTsx(ctx),\n 'src/App.tsx': srcAppTsx(ctx),\n 'src/lib/api.ts': srcApiTs(),\n 'contracts/types.ts': contractsTs(ctx),\n '.gitignore': gitignore(),\n 'README.md': readme(ctx, false),\n }\n}\n\nfunction headlessFiles(ctx: TemplateContext): Record<string, string> {\n return {\n 'botapp.app.json': manifestJson(ctx),\n 'package.json': packageJson(ctx, /*headless*/ true),\n 'tsconfig.json': tsconfigJson(true),\n 'tsup.api.config.ts': tsupApiConfig(),\n 'api/index.ts': apiEntryTs(ctx, true),\n 'contracts/types.ts': contractsTs(ctx),\n '.gitignore': gitignore(),\n 'README.md': readme(ctx, true),\n }\n}\n\n// ----- file contents -----\n\nfunction manifestJson(ctx: TemplateContext): string {\n const m: Record<string, unknown> = {\n name: ctx.name,\n version: '0.1.0',\n description: ctx.description,\n entry: './dist/api.js',\n tier: 'user',\n visibility: 'private',\n }\n if (!ctx.headless) {\n m.hasFrontend = true\n }\n return JSON.stringify(m, null, 2) + '\\n'\n}\n\nfunction packageJson(ctx: TemplateContext, headless: boolean): string {\n const scripts: Record<string, string> = {\n build: headless\n ? 'tsup --config tsup.api.config.ts'\n : 'tsup --config tsup.api.config.ts && vite build',\n 'build:api': 'tsup --config tsup.api.config.ts',\n dev: headless ? 'tsup --config tsup.api.config.ts --watch' : 'tsup --config tsup.api.config.ts --watch & vite',\n typecheck: 'tsc --noEmit',\n }\n const deps: Record<string, string> = {\n 'botapp-sdk': '^0.1.0',\n ws: '^8.18.0',\n }\n const devDeps: Record<string, string> = {\n tsup: '^8.4.0',\n typescript: '^5.8.0',\n '@types/node': '^22.0.0',\n '@types/ws': '^8.5.0',\n }\n if (!headless) {\n Object.assign(deps, {\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n })\n Object.assign(devDeps, {\n vite: '^7.0.0',\n '@vitejs/plugin-react': '^5.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n })\n }\n return (\n JSON.stringify(\n {\n name: ctx.name,\n version: '0.1.0',\n description: ctx.description,\n type: 'module',\n private: true,\n scripts,\n dependencies: deps,\n devDependencies: devDeps,\n },\n null,\n 2,\n ) + '\\n'\n )\n}\n\nfunction tsconfigJson(headless: boolean): string {\n if (headless) {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: ['api/**/*.ts', 'contracts/**/*.ts'],\n },\n null,\n 2,\n ) + '\\n'\n }\n return JSON.stringify(\n {\n files: [],\n references: [\n { path: './tsconfig.api.json' },\n { path: './tsconfig.frontend.json' },\n ],\n },\n null,\n 2,\n ) + '\\n'\n}\n\nfunction tsconfigApiJson(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: ['api/**/*.ts', 'contracts/**/*.ts'],\n },\n null,\n 2,\n ) + '\\n'\n}\n\nfunction tsconfigFrontendJson(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n jsx: 'react-jsx',\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n noEmit: true,\n },\n include: ['src/**/*.ts', 'src/**/*.tsx', 'contracts/**/*.ts'],\n },\n null,\n 2,\n ) + '\\n'\n}\n\nfunction tsupApiConfig(): string {\n return `import { defineConfig } from 'tsup'\n\nexport default defineConfig({\n entry: { api: 'api/index.ts' },\n format: ['esm'],\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n noExternal: [],\n})\n`\n}\n\nfunction viteConfig(ctx: TemplateContext): string {\n return `import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\nexport default defineConfig({\n plugins: [react()],\n base: '/apps/${ctx.name}/',\n build: {\n outDir: 'dist/public',\n emptyOutDir: true,\n },\n})\n`\n}\n\nfunction indexHtml(ctx: TemplateContext): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(ctx.description)}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction apiEntryTs(ctx: TemplateContext, headless: boolean): string {\n const widget = headless\n ? ''\n : `\n ctx.registerWidget({\n refresh: { intervalMs: 30_000 },\n render: async ({ state }) => {\n const count = (await state.get('count')) ?? 0\n return {\n html: \\`<div class=\"card\"><div class=\"label\">${ctx.name.toUpperCase()}</div><div class=\"value\">\\${count}</div></div>\\`,\n css: \\`.card { padding: 20px; font-family: sans-serif; } .value { font-size: 32px; font-weight: 700; }\\`,\n }\n },\n })\n\n ctx.serveStatic('./dist/public')\n`\n return `import { BotApp } from 'botapp-sdk'\n\nconst app = new BotApp({\n name: '${ctx.name}',\n version: '0.1.0',\n description: '${ctx.description.replace(/'/g, \"\\\\'\")}',\n async setup(ctx) {\n ctx.registerCommand('hello', {\n description: 'Greet the caller',\n params: {\n name: { type: 'string', required: false, default: 'world', description: 'Who to greet' },\n },\n handler: async ({ name }, cmdCtx) => {\n const count = ((await cmdCtx.state.get('count')) as number | null) ?? 0\n await cmdCtx.state.set('count', count + 1)\n ctx.invalidateWidget?.()\n return \\`Hello, \\${name}! (called \\${count + 1}x by \\${cmdCtx.agent.id})\\`\n },\n })\n${widget} },\n})\n\nawait app.start()\n`\n}\n\nfunction srcMainTsx(_ctx: TemplateContext): string {\n return `import { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { App } from './App'\n\ncreateRoot(document.getElementById('root')!).render(\n <StrictMode>\n <App />\n </StrictMode>,\n)\n`\n}\n\nfunction srcAppTsx(ctx: TemplateContext): string {\n return `import { useEffect, useState } from 'react'\nimport { callCommand } from './lib/api'\n\nexport function App() {\n const [count, setCount] = useState<number | null>(null)\n const [error, setError] = useState<string | null>(null)\n useEffect(() => {\n callCommand('hello', { name: 'browser' })\n .then((res) => {\n const m = /\\\\(called (\\\\d+)x/.exec(String(res))\n if (m) setCount(Number(m[1]))\n })\n .catch((e: Error) => setError(e.message))\n }, [])\n return (\n <main style={{ fontFamily: 'sans-serif', padding: 24 }}>\n <h1>${ctx.name}</h1>\n {error ? <pre style={{ color: 'crimson' }}>{error}</pre> : <p>Calls so far: {count ?? '...'}</p>}\n </main>\n )\n}\n`\n}\n\nfunction srcApiTs(): string {\n return `// Tiny client for calling app routes/commands from the browser.\n// Routes resolve as /apps/<name>/* on the platform; the platform forwards\n// each request to your app's WebSocket session.\n\nconst APP_BASE = ((): string => {\n const m = location.pathname.match(/^\\\\/apps\\\\/[^/]+\\\\//)\n return m ? m[0] : '/'\n})()\n\nexport async function callCommand(name: string, params: Record<string, unknown> = {}) {\n const r = await fetch(\\`\\${APP_BASE}api/commands/\\${encodeURIComponent(name)}\\`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n })\n if (!r.ok) throw new Error(await r.text())\n return r.json()\n}\n\nexport async function callAction(name: string, params: Record<string, unknown> = {}) {\n const r = await fetch(\\`\\${APP_BASE}api/actions/\\${encodeURIComponent(name)}\\`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n })\n if (!r.ok) throw new Error(await r.text())\n return r.json()\n}\n`\n}\n\nfunction contractsTs(ctx: TemplateContext): string {\n return `// Types shared between api/ (backend) and src/ (frontend).\n// Importing from one side picks up changes on the other immediately.\n\nexport interface ${pascal(ctx.name)}State {\n count: number\n}\n`\n}\n\nfunction gitignore(): string {\n return `node_modules/\ndist/\n.botapp-sim/\n*.log\n.DS_Store\n.env*.local\n`\n}\n\nfunction readme(ctx: TemplateContext, headless: boolean): string {\n const surfaces = headless\n ? '- Backend only (no frontend)'\n : '- React + Vite frontend (built to `dist/public/`)\\n- Dashboard widget (declared in `api/index.ts`)'\n return `# ${ctx.name}\n\n${ctx.description}\n\n## Surfaces\n\n${surfaces}\n- One agent-facing command: \\`hello\\`\n\n## Develop\n\n\\`\\`\\`bash\npnpm install\npnpm build # api → dist/api.js${headless ? '' : ', frontend → dist/public/'}\nbot login --server <your-botapp-server>\nbot simulate # dev-tunnel; hot-reload as you build\n\\`\\`\\`\n\nThe simulator opens a per-user shadow of this app on the server. Your\nreal dashboard at the server's URL routes the app to *your* local\nprocess; nobody else sees it.\n\n## Publish\n\n\\`\\`\\`bash\nbot publish # private, only you see it\nbot publish --public # requests admin review for public visibility\n\\`\\`\\`\n`\n}\n\n// ----- helpers -----\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' })[c]!)\n}\nfunction pascal(s: string): string {\n return s\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((w) => w[0]!.toUpperCase() + w.slice(1))\n .join('')\n}\nfunction dirname(p: string): string {\n const i = p.lastIndexOf('/')\n return i < 0 ? '.' : p.slice(0, i)\n}\n","// `bot publish [path]` — pack the local app's bundle and upload to the\n// configured server. Default visibility is private (only the uploader\n// sees it). `--public` requests admin review; the install stays private\n// in the meantime.\n\nimport { Command } from 'commander'\nimport { resolve, join, relative, sep } from 'node:path'\nimport { existsSync, readFileSync, statSync, readdirSync, createReadStream } from 'node:fs'\nimport { createGzip } from 'node:zlib'\nimport { spawn } from 'node:child_process'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\ninterface AppManifest {\n name: string\n version?: string\n description?: string\n entry?: string\n hasFrontend?: boolean\n [k: string]: unknown\n}\n\nexport const publishCommand = new Command('publish')\n .description('Build, pack, and upload an app to a botapp server')\n .argument('[path]', 'App directory', '.')\n .option('-s, --server <url>', 'Server URL (default: active profile / $BOTAPP_SERVER)')\n .option('-t, --token <token>', 'Auth token (default: active profile / $BOTAPP_TOKEN)')\n .option('--public', 'Request public visibility (queues admin review). Default: private.')\n .option('--no-build', 'Skip running `pnpm build` / `npm run build`')\n .option('--bundle-dir <dir>', 'Directory to bundle into tar.gz (default: dist/public if exists, else dist)')\n .action(async (appPath: string, opts: PublishOptions) => {\n const absPath = resolve(appPath)\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 const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as AppManifest\n if (!manifest.name) {\n console.error(pc.red('manifest missing \"name\"'))\n process.exitCode = 1\n return\n }\n\n const server = resolveServerUrl(opts.server)\n const token = resolveToken(opts.token)\n if (!token) {\n console.error(pc.red('not logged in: run `bot login` or pass --token'))\n process.exitCode = 1\n return\n }\n\n if (opts.build !== false) {\n console.log(pc.dim('building app...'))\n const ok = await runBuild(absPath)\n if (!ok) {\n console.error(pc.red('build failed; aborting'))\n process.exitCode = 1\n return\n }\n }\n\n const bundleDir = opts.bundleDir\n ? resolve(absPath, opts.bundleDir)\n : pickBundleDir(absPath)\n let bundleB64: string | undefined\n if (bundleDir && existsSync(bundleDir)) {\n console.log(pc.dim(`packing ${relative(absPath, bundleDir)}/ → tar.gz...`))\n const bytes = await packDirToTarGz(bundleDir)\n bundleB64 = bytes.toString('base64')\n console.log(pc.dim(` bundle: ${(bytes.length / 1024).toFixed(1)} KiB`))\n } else {\n console.log(pc.dim('no frontend bundle to upload (headless app or no dist/public)'))\n }\n\n console.log(pc.dim(`uploading to ${server}/api/apps/upload (${opts.public ? 'public' : 'private'})...`))\n const res = await fetch(`${server}/api/apps/upload`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({\n manifest,\n bundleB64,\n visibility: opts.public ? 'public' : 'private',\n }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(pc.red(`upload failed (${res.status}): ${body}`))\n process.exitCode = 1\n return\n }\n const data = (await res.json()) as { ok?: boolean; install?: any; message?: string; error?: string }\n if (!data.ok) {\n console.error(pc.red(`upload rejected: ${data.error ?? 'unknown'}`))\n process.exitCode = 1\n return\n }\n console.log(pc.green('✓'), data.message ?? 'uploaded')\n if (data.install) {\n console.log(pc.dim(` id: ${data.install.id}`))\n console.log(pc.dim(` version: ${data.install.version}`))\n console.log(pc.dim(` visibility: ${data.install.visibility}`))\n if (data.install.reviewStatus !== 'none') {\n console.log(pc.dim(` review: ${data.install.reviewStatus}`))\n }\n }\n })\n\ninterface PublishOptions {\n server?: string\n token?: string\n public?: boolean\n build?: boolean\n bundleDir?: string\n}\n\nfunction runBuild(cwd: string): Promise<boolean> {\n // Prefer pnpm if pnpm-lock exists, else npm.\n const pkgManager = existsSync(join(cwd, 'pnpm-lock.yaml')) ? 'pnpm' : 'npm'\n const args = pkgManager === 'pnpm' ? ['build'] : ['run', 'build']\n return new Promise((resolveP) => {\n const child = spawn(pkgManager, args, { cwd, stdio: 'inherit' })\n child.on('exit', (code) => resolveP(code === 0))\n child.on('error', () => resolveP(false))\n })\n}\n\nfunction pickBundleDir(appDir: string): string | null {\n const distPublic = join(appDir, 'dist', 'public')\n if (existsSync(distPublic)) return distPublic\n const dist = join(appDir, 'dist')\n if (existsSync(dist)) return dist\n return null\n}\n\nasync function packDirToTarGz(rootDir: string): Promise<Buffer> {\n // Hand-rolled minimal tar writer + gzip — we already extract this same\n // shape on the server side (see hosted/assets.ts). No tar dependency.\n const entries: Array<{ name: string; size: number; data: Buffer }> = []\n walk(rootDir, '', entries)\n const blocks: Buffer[] = []\n for (const e of entries) {\n blocks.push(tarHeader(e.name, e.size))\n blocks.push(e.data)\n const pad = (512 - (e.size % 512)) % 512\n if (pad) blocks.push(Buffer.alloc(pad))\n }\n blocks.push(Buffer.alloc(1024)) // two zero blocks = end\n const tar = Buffer.concat(blocks)\n return await gzip(tar)\n}\n\nfunction walk(root: string, prefix: string, out: Array<{ name: string; size: number; data: Buffer }>): void {\n for (const entry of readdirSync(root)) {\n const full = join(root, entry)\n const st = statSync(full)\n const rel = (prefix ? `${prefix}/` : '') + entry\n if (st.isDirectory()) {\n walk(full, rel, out)\n } else if (st.isFile()) {\n const data = readFileSync(full)\n out.push({ name: rel, size: data.length, data })\n }\n }\n}\n\nfunction tarHeader(name: string, size: number): Buffer {\n const h = Buffer.alloc(512)\n h.write(name.length > 100 ? name.slice(name.length - 100) : name, 0, 100)\n h.write('0000644', 100, 7)\n h.write('0000000', 108, 7)\n h.write('0000000', 116, 7)\n h.write(size.toString(8).padStart(11, '0'), 124, 11)\n h.write(Math.floor(Date.now() / 1000).toString(8).padStart(11, '0'), 136, 11)\n h.write(' ', 148, 8) // checksum placeholder\n h.write('0', 156, 1) // typeflag = file\n h.write('ustar ', 257, 8)\n let cksum = 0\n for (const b of h) cksum += b\n h.write(cksum.toString(8).padStart(6, '0') + '\\0 ', 148, 8)\n return h\n}\n\nfunction gzip(input: Buffer): Promise<Buffer> {\n return new Promise((resolveP, rejectP) => {\n const gz = createGzip()\n const chunks: Buffer[] = []\n gz.on('data', (c) => chunks.push(c as Buffer))\n gz.on('end', () => resolveP(Buffer.concat(chunks)))\n gz.on('error', rejectP)\n gz.end(input)\n })\n}\n","// `bot review list | approve | reject` — admin-only ops on the public-app\n// review queue. Backed by the server's /api/admin/review-queue and\n// /api/admin/review/:id endpoints. Caller must be authed as an admin\n// user (the server's authenticateUser callback decides the isAdmin flag).\n\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const reviewCommand = new Command('review')\n .description('Admin: review queue for public-visibility uploads')\n\nreviewCommand\n .command('list')\n .description('List pending public-visibility uploads')\n .option('-s, --server <url>', 'Server URL')\n .option('-t, --token <token>', 'Auth token')\n .action(async (opts) => {\n const server = resolveServerUrl(opts.server)\n const token = resolveToken(opts.token)\n if (!token) return die('not logged in: run `bot login` or pass --token')\n const res = await fetch(`${server}/api/admin/review-queue`, { headers: authHeaders(token) })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n return die(`request failed (${res.status}): ${body}`)\n }\n const data = (await res.json()) as { pending: any[] }\n if (!data.pending?.length) {\n console.log(pc.dim('queue empty'))\n return\n }\n for (const i of data.pending) {\n console.log(pc.bold(i.id), pc.cyan(i.appName), pc.dim(`v${i.version}`))\n console.log(pc.dim(` uploader: ${i.ownerUserId ?? '(server-wide)'}`))\n console.log(pc.dim(` uploaded: ${i.uploadedAt}`))\n const desc = i.manifest?.description\n if (desc) console.log(pc.dim(` description: ${desc}`))\n console.log()\n }\n })\n\nreviewCommand\n .command('approve <id>')\n .description('Approve a pending public install')\n .option('--notes <text>', 'Optional reviewer notes')\n .option('-s, --server <url>', 'Server URL')\n .option('-t, --token <token>', 'Auth token')\n .action(async (id, opts) => decide(id, 'approve', opts))\n\nreviewCommand\n .command('reject <id>')\n .description('Reject a pending public install')\n .requiredOption('--notes <text>', 'Reason for rejection (required)')\n .option('-s, --server <url>', 'Server URL')\n .option('-t, --token <token>', 'Auth token')\n .action(async (id, opts) => decide(id, 'reject', opts))\n\nasync function decide(\n id: string,\n decision: 'approve' | 'reject',\n opts: { notes?: string; server?: string; token?: string },\n): Promise<void> {\n const server = resolveServerUrl(opts.server)\n const token = resolveToken(opts.token)\n if (!token) return die('not logged in: run `bot login` or pass --token')\n const res = await fetch(`${server}/api/admin/review/${encodeURIComponent(id)}`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({ decision, notes: opts.notes }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n return die(`request failed (${res.status}): ${body}`)\n }\n const data = (await res.json()) as { ok?: boolean; install?: any; error?: string }\n if (!data.ok) return die(`server rejected: ${data.error ?? 'unknown'}`)\n console.log(pc.green('✓'), `${decision}d`, data.install?.appName, pc.dim(`(${data.install?.id})`))\n if (data.install?.reviewNotes) console.log(pc.dim(` notes: ${data.install.reviewNotes}`))\n}\n\nfunction die(msg: string): void {\n console.error(pc.red(msg))\n process.exitCode = 1\n}\n"],"mappings":"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","names":["Command","pc","existsSync","existsSync","spawn","randomUUID","existsSync","readFileSync","statSync","homedir","join","resolve","createInterface","Command","pc","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","parse","stringify","CONFIG_DIR","input","resolve","Command","pc","input","resolve","Command","pc","Buffer","homedir","join","resolve","walk","spawn","existsSync","statSync","homedir","join","isAbsolute","proc","ptyId","exited","resolve","Command","pc","join","homedir","existsSync","readFileSync","spawn","resolve","createInterface","output","input","randomUUID","statSync","request","Command","spawn","resolve","join","existsSync","mkdirSync","writeFileSync","homedir","createInterface","pc","spawn","pc","resolve","existsSync","readFileSync","homedir","join","createInterface","Command","pc","join","homedir","mkdirSync","existsSync","spawn","writeFileSync","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","WebSocket","pc","Command","pc","WebSocket","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","Command","pc","Command","pc","spawn","realpathSync","Command","pc","resolve","Command","resolve","join","existsSync","readFileSync","spawn","pc","Command","resolve","existsSync","pc","join","readFileSync","spawn","Command","existsSync","mkdirSync","writeFileSync","resolve","join","pc","dirname","Command","resolve","join","relative","existsSync","readFileSync","statSync","readdirSync","spawn","pc","Command","resolve","join","existsSync","pc","readFileSync","relative","spawn","readdirSync","statSync","input","Command","pc","Command","pc","Command","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/server.ts","../src/config/profile.ts","../src/config/server.ts","../src/commands/daemon.ts","../src/config/daemon.ts","../src/commands/daemon-agent-config.ts","../src/rpc/registry.ts","../src/rpc/file-handlers.ts","../src/rpc/pty-handlers.ts","../src/commands/launch.ts","../src/auth/browser-auth.ts","../src/commands/daemon-supervisor.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/doctor.ts","../src/commands/update.ts","../src/commands/simulate.ts","../src/commands/init.ts","../src/commands/publish.ts","../src/commands/review.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { serverCommand } from './commands/server'\n\n// Library exports: third-party callers (e.g. the Electron desktop app)\n// reuse the daemon connection loop and profile helpers without\n// shelling out to the `bot` binary. Re-exporting from the CLI package\n// keeps a single implementation.\nexport { runDaemonConnectionLoop } from './commands/daemon'\nexport {\n loadDaemonProfile,\n loadDaemonProfiles,\n findDaemonProfile,\n saveDaemonProfile,\n removeDaemonProfile,\n type DaemonProfile,\n} from './config/daemon'\n\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'\nimport { doctorCommand } from './commands/doctor'\nimport { updateCommand } from './commands/update'\nimport { simulateCommand } from './commands/simulate'\nimport { initCommand } from './commands/init'\nimport { publishCommand } from './commands/publish'\nimport { reviewCommand } from './commands/review'\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)\nprogram.addCommand(doctorCommand)\n\n// ── App management ───────────────────────────────────────────\nprogram.addCommand(initCommand)\nprogram.addCommand(installCommand)\nprogram.addCommand(uninstallCommand)\nprogram.addCommand(reloadCommand)\nprogram.addCommand(configCommand)\nprogram.addCommand(simulateCommand)\nprogram.addCommand(publishCommand)\nprogram.addCommand(reviewCommand)\n\n// ── Server management ────────────────────────────────────────\nprogram.addCommand(serverCommand)\n\n// ── Self-update ──────────────────────────────────────────────\nprogram.addCommand(updateCommand)\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 (every paired profile in one process)\n $ bot update Update the \\`bot\\` CLI itself to the latest version\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 { 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 {\n findDaemonProfile,\n loadDaemonProfiles,\n removeDaemonProfile,\n type DaemonProfile,\n} from '../config/daemon'\nimport { createDaemonAgentConfigCommand } from './daemon-agent-config'\nimport { RpcDispatcher, RpcRegistry } from '../rpc/registry'\nimport { registerFileHandlers } from '../rpc/file-handlers'\nimport { registerPtyHandlers } from '../rpc/pty-handlers'\n\n// Single shared registry — file.* and pty.* handlers are stateless\n// across calls (PTY processes are tracked inside pty-handlers itself).\nconst rpcRegistry = new RpcRegistry()\nregisterFileHandlers(rpcRegistry)\nregisterPtyHandlers(rpcRegistry)\n\ninterface DaemonAgent {\n id: string\n name: string\n kind: string\n command: string\n args: string[]\n model: string | null\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 KimiToolCall {\n id: string\n name: string\n input?: any\n output?: string\n isError?: boolean\n}\n\ninterface KimiRunResult {\n kind: 'kimi'\n text: string\n messages: string[]\n toolCalls: KimiToolCall[]\n /** Session id parsed from kimi's trailing `To resume this session: kimi -r <id>`\n * stdout line. Stored on the conversation so the next turn can pass\n * `--continue` / `-r <id>` to keep the same kimi session. */\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(\n 'Run paired daemons and wait for server jobs. With no flags, runs every ' +\n 'paired profile concurrently — so a single `bot daemon run` covers both ' +\n 'local and remote pairings.',\n )\n .option('--profile <alias>', 'Run only the profile with this alias')\n .option('--server <url>', 'Run only the profile paired with this server URL')\n .action(async (opts) => {\n const profiles = pickProfilesToRun(opts.profile, opts.server)\n if (profiles === null) return\n\n if (profiles.length === 0) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return\n }\n\n if (profiles.length === 1) {\n await runDaemonConnectionLoop(profiles[0])\n return\n }\n\n console.log(\n pc.dim(\n `Running ${profiles.length} daemon profile${profiles.length === 1 ? '' : 's'}: ` +\n profiles.map((p) => p.alias ?? p.server).join(', '),\n ),\n )\n await Promise.all(profiles.map((p) => runDaemonConnectionLoop(p)))\n })\n\nfunction pickProfilesToRun(\n alias: string | undefined,\n server: string | undefined,\n): DaemonProfile[] | null {\n if (alias) {\n const found = findDaemonProfile(alias)\n if (!found) {\n console.error(pc.red(`No daemon profile with alias \"${alias}\".`))\n process.exitCode = 1\n return null\n }\n return [found]\n }\n if (server) {\n const found = findDaemonProfile(server)\n if (!found) {\n console.error(pc.red(`No daemon profile paired with \"${server}\".`))\n process.exitCode = 1\n return null\n }\n return [found]\n }\n return loadDaemonProfiles()\n}\n\ndaemonCommand\n .command('unpair')\n .description('Remove a paired profile from ~/.botapp/daemon.yaml (does not touch the server)')\n .argument('<aliasOrServer>', 'Profile alias (e.g. local) or server URL')\n .action((aliasOrServer: string) => {\n const removed = removeDaemonProfile(aliasOrServer)\n if (!removed) {\n console.error(pc.red(`No paired profile matching \"${aliasOrServer}\".`))\n process.exitCode = 1\n return\n }\n console.log(pc.green(`Removed daemon profile: ${aliasOrServer}`))\n })\n\ndaemonCommand\n .command('list')\n .alias('ls')\n .description('List paired daemon profiles from ~/.botapp/daemon.yaml')\n .action(() => {\n const profiles = loadDaemonProfiles()\n if (profiles.length === 0) {\n console.log(pc.dim('No paired daemons. Run `bot pair` to add one.'))\n return\n }\n for (const p of profiles) {\n console.log(pc.bold(p.alias ?? p.server))\n console.log(` Server: ${p.server}`)\n console.log(` Daemon: ${p.daemonName} ${pc.dim(`(${p.daemonId})`)}`)\n console.log(` User: ${p.userEmail ?? pc.dim('unknown — re-pair to capture')}`)\n }\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 .option('--profile <alias>', 'Daemon profile alias to query')\n .option('--server <url>', 'Daemon profile by server URL')\n .action(async (opts) => {\n const profile = requireSelectedProfile(opts)\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 if (agent.model) console.log(` Model: ${agent.model}`)\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, kimi, openclaw, hermes, or hermes-agent')\n .requiredOption('--command <command>', 'Executable command')\n .option(\n '--kind <kind>',\n 'Agent adapter kind: acp, codex, claude-code, kimi, 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 .option('--model <model>', 'Provider model to pass to the agent runtime')\n .option('--profile <alias>', 'Daemon profile alias to register against')\n .option('--server <url>', 'Daemon profile by server URL')\n .action(async (name, opts) => {\n const profile = requireSelectedProfile(opts)\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 model: opts.model,\n },\n },\n )\n console.log(pc.green(`Registered daemon agent: ${pc.bold(data.agent.name)}`))\n console.log(` ID: ${data.agent.id}`)\n if (data.agent.model) console.log(` Model: ${data.agent.model}`)\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 .option('--profile <alias>', 'Daemon profile alias to remove from')\n .option('--server <url>', 'Daemon profile by server URL')\n .action(async (agent, opts) => {\n const profile = requireSelectedProfile(opts)\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: DaemonProfile,\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 const label = profile.alias\n ? `${profile.daemonName} [${profile.alias}]`\n : profile.daemonName\n\n while (!stopped) {\n console.log(pc.blue(`Connecting daemon ${label} to ${profile.server}...`))\n const outcome = await runDaemonSocket(wsUrl, (ws) => {\n activeWs = ws\n })\n activeWs = null\n if (stopped) break\n\n // The server uses close code 4000 to evict an older daemon when a\n // newer one (same daemonId) connects. Without this guard, two local\n // daemon processes — e.g. one auto-spawned by `bot launch`, plus a\n // manual `bot daemon run` — kick each other off forever, and neither\n // ever stays online long enough to take a job.\n if (outcome.superseded) {\n console.log(\n pc.red(\n 'Another daemon process took over this pairing — exiting. ' +\n 'Stop the duplicate `bot daemon run` and rerun if you want this one to take over.',\n ),\n )\n break\n }\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; superseded: boolean }> {\n return new Promise((resolveRun) => {\n const ws = new WebSocket(wsUrl)\n setActiveWs(ws)\n // One dispatcher per socket. Tears down all in-flight RPCs (PTYs,\n // long file reads) when the connection closes so leftover handlers\n // don't try to push frames into a dead socket.\n const rpcDispatcher = new RpcDispatcher(rpcRegistry, ws)\n let opened = false\n let superseded = 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 rpcDispatcher.shutdown()\n resolveRun({ opened, superseded })\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(), rpcDispatcher)\n })\n\n ws.on('close', (code, reason) => {\n // 4000 = server closed us because a newer daemon process (same\n // daemonId) connected. The caller stops retrying so we don't\n // immediately turn around and supersede the new one.\n if (code === 4000) superseded = true\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(\n ws: WebSocket,\n raw: string,\n rpcDispatcher: RpcDispatcher,\n): Promise<void> {\n const frame = JSON.parse(raw)\n\n // Generic RPC channel — apps reaching into local file/pty/etc.\n // Dispatched off-thread; the dispatcher sends its own response frame.\n if (frame.type === 'daemon_rpc_request') {\n void rpcDispatcher.dispatchRequest(frame)\n return\n }\n if (frame.type === 'daemon_rpc_input') {\n rpcDispatcher.dispatchInput(frame)\n return\n }\n if (frame.type === 'daemon_rpc_cancel') {\n rpcDispatcher.dispatchCancel(frame)\n return\n }\n\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 === 'kimi') {\n return runKimiCodeAgent(job, update)\n }\n if (job.agent.kind === 'openclaw') {\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 awaitChildClose(child, job.agent.command)\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 if (job.agent.model && !hasAnyFlag(args, ['--model', '-m'])) {\n args.push('--model', job.agent.model)\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 const errors: string[] = []\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 === 'error' && typeof event.message === 'string') {\n errors.push(event.message)\n }\n if (event?.type === 'turn.failed' && typeof event.error?.message === 'string') {\n errors.push(event.error.message)\n }\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 awaitChildClose(child, job.agent.command)\n if (code !== 0) {\n throw new Error(errors.at(-1) ?? (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 if (job.agent.model && !hasAnyFlag(args, ['--model'])) {\n args.push('--model', job.agent.model)\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 // Hold the last few non-JSON stdout lines + any error-flavoured event\n // payloads so non-zero exits surface a real cause instead of a\n // generic \"exited with code 1\" with empty stderr. claude-code's\n // stream-json sometimes prints plain-text errors (auth failures,\n // session-resume failures) just before exiting.\n const noiseLines: string[] = []\n const errorEvents: string[] = []\n const NOISE_TAIL = 6\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; keep the tail\n // around for diagnostics but don't otherwise act on it.\n noiseLines.push(line)\n if (noiseLines.length > NOISE_TAIL) noiseLines.shift()\n return\n }\n result.rawEvents.push(event)\n update({ kind: 'claude_code_event', event })\n captureSessionId(event)\n\n // Record any event that signals an error — claude-code's\n // stream-json shape is `{type:'result',subtype:'error',...}` or\n // `{type:'system',subtype:'error',...}`. Capture the whole payload\n // so the daemon can report it on non-zero exit.\n if (\n event &&\n (event.is_error === true ||\n event.subtype === 'error' ||\n (event.type === 'result' && event.is_error))\n ) {\n try {\n errorEvents.push(JSON.stringify(event).slice(0, 1000))\n } catch {\n /* swallow */\n }\n }\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 awaitChildClose(child, job.agent.command)\n if (code !== 0) {\n const parts: string[] = []\n if (stderr.trim()) parts.push(stderr.trim())\n if (errorEvents.length > 0) {\n parts.push(`Error events: ${errorEvents.join(' | ')}`)\n }\n if (noiseLines.length > 0 && parts.length === 0) {\n parts.push(`Last stdout lines: ${noiseLines.join(' | ').slice(-1500)}`)\n }\n if (parts.length === 0) {\n parts.push(`Claude Code exited with code ${code} (no stderr or stdout output)`)\n }\n throw new Error(parts.join(' — '))\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 * Kimi Code adapter.\n *\n * Runs `kimi --print --output-format stream-json --yolo` (Moonshot's\n * Kimi CLI; binary `kimi`, docs at https://moonshotai.github.io/kimi-cli/).\n * The prompt is piped on stdin so we don't hit argv length limits when\n * the dispatcher prepends a labelled context block.\n *\n * stream-json emits one JSON object per line. Three shapes show up:\n * { role:\"assistant\", content:[{type:\"think\"|\"text\", ...}], tool_calls?:[{id, function:{name, arguments}}]}\n * { role:\"tool\", content:<string>, tool_call_id:<id> }\n * { role:\"assistant\", content:[{type:\"text\", text:\"<final>\"}] }\n * Then on stdout (after the JSONL block) kimi prints\n * `To resume this session: kimi -r <session-id>`\n * which we parse to capture sessionId for next-turn resume.\n */\nasync function runKimiCodeAgent(job: DaemonJob, update: JobUpdateSink): Promise<string> {\n const args = [...job.agent.args]\n if (!args.includes('--print') && !args.includes('-p')) {\n args.push('--print')\n }\n if (!args.includes('--output-format')) {\n args.push('--output-format', 'stream-json')\n }\n // Without --yolo kimi waits for tool-approval input that never comes\n // in headless mode. Skipped if the user already passed --yolo / --yes.\n if (!hasAnyFlag(args, ['--yolo', '--yes', '-y'])) {\n args.push('--yolo')\n }\n if (job.agent.model && !hasAnyFlag(args, ['--model', '-m'])) {\n args.push('--model', job.agent.model)\n }\n // Prefer --continue when we have a prior session id for this convo so\n // kimi keeps the same context. Fall back to -r <id> if explicitly set.\n const resume = job.resumeSessionId ?? job.agent.env?.KIMI_SESSION_ID ?? null\n if (resume && !hasAnyFlag(args, ['--session', '-S', '-r', '--resume', '--continue', '-C'])) {\n args.push('-r', resume)\n }\n\n // Kimi does not auto-load `AGENTS.md` as a system prompt the way\n // Claude reads `CLAUDE.md` or Codex reads `AGENTS.md`. The file is in\n // cwd but the agent treats it as just-another-file rather than\n // internalizing the protocol primer (notes habit, task updates, chat\n // contracts). To get the same effect we prepend the rendered AGENTS.md\n // to the dispatch prompt with a clear delimiter — only on the first\n // turn, so resumes keep their kimi-side context intact.\n const cwd = job.agent.cwd ?? process.cwd()\n let prompt = job.query\n if (!resume) {\n const agentsMdPath = join(cwd, 'AGENTS.md')\n if (existsSync(agentsMdPath)) {\n try {\n const primer = readFileSync(agentsMdPath, 'utf-8').trim()\n if (primer) {\n prompt = `# System instructions (read carefully before responding)\\n\\n${primer}\\n\\n---\\n\\n# Your task\\n\\n${job.query}`\n }\n } catch {\n // Best-effort: fall back to bare prompt if read fails.\n }\n }\n }\n\n const child = spawn(job.agent.command, args, {\n cwd,\n env: { ...process.env, ...(job.agent.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n child.stdin.write(prompt)\n child.stdin.end()\n\n let stderr = ''\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString()\n })\n\n const result: KimiRunResult = {\n kind: 'kimi',\n text: '',\n messages: [],\n toolCalls: [],\n sessionId: resume,\n rawEvents: [],\n }\n const toolCalls = new Map<string, KimiToolCall>()\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 }\n }\n\n function ingestToolCalls(calls: any[]): void {\n for (const call of calls) {\n if (!call || typeof call !== 'object') continue\n const id = typeof call.id === 'string' ? call.id : null\n if (!id) continue\n const name = String(call.function?.name ?? call.name ?? 'tool')\n let input: any = call.function?.arguments ?? call.arguments\n if (typeof input === 'string') {\n try {\n input = JSON.parse(input)\n } catch {\n // leave as raw string\n }\n }\n const next: KimiToolCall = { ...(toolCalls.get(id) ?? {}), id, name, input }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n }\n\n function ingestToolResult(event: any): void {\n const id = event?.tool_call_id\n if (typeof id !== 'string') return\n const existing: KimiToolCall = toolCalls.get(id) ?? { id, name: 'tool' }\n const output = typeof event.content === 'string' ? event.content : JSON.stringify(event.content)\n const next: KimiToolCall = { ...existing, output }\n toolCalls.set(id, next)\n update({ kind: 'tool_call', toolCall: next })\n }\n\n function processLine(line: string): void {\n const trimmed = line.trim()\n if (!trimmed || trimmed[0] !== '{') return\n let event: any\n try {\n event = JSON.parse(trimmed)\n } catch {\n return\n }\n result.rawEvents.push(event)\n update({ kind: 'kimi_event', event })\n if (event.role === 'assistant') {\n if (Array.isArray(event.content)) ingestAssistantContent(event.content)\n if (Array.isArray(event.tool_calls)) ingestToolCalls(event.tool_calls)\n } else if (event.role === 'tool') {\n ingestToolResult(event)\n }\n }\n\n const rl = createInterface({ input: child.stdout })\n rl.on('line', processLine)\n\n const code = await awaitChildClose(child, job.agent.command)\n // Kimi prints `To resume this session: kimi -r <id>` on stderr after\n // a successful run. Capture it for next-turn resume.\n const resumeMatch = stderr.match(/To resume this session:\\s*kimi\\s+-r\\s+([A-Za-z0-9_-]+)/)\n if (resumeMatch) result.sessionId = resumeMatch[1]\n if (code !== 0) {\n throw new Error(stderr.trim() || `Kimi 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 const stdoutLines: string[] = []\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 const text = line.trim()\n if (!text) return\n stdoutLines.push(text)\n const stdoutText = extractOpenClawStdoutText(text)\n if (!stdoutText) return\n result.text = stdoutText\n result.messages.push(stdoutText)\n update({ kind: 'message', text: stdoutText })\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_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() || extractOpenClawStdoutText(stdoutLines.at(-1) ?? '') || ''\n\n if (code !== 0) {\n throw new Error(stderr.trim() || `OpenClaw exited with code ${code}`)\n }\n if (!result.sessionId && !result.text && result.toolCalls.length === 0) {\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 extractOpenClawStdoutText(line: string): string {\n const text = line.trim()\n if (!text) return ''\n try {\n const parsed = JSON.parse(text)\n if (parsed && typeof parsed === 'object') return JSON.stringify(parsed)\n if (typeof parsed === 'string') return parsed\n } catch {\n // Plain stdout is still a valid OpenClaw response for simple agents.\n }\n return text\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\n/**\n * Pick a single daemon profile when a subcommand can only act on one.\n * Honors `--profile <alias>` / `--server <url>` if given; otherwise\n * uses the only paired profile, or errors out asking the user to\n * disambiguate when several are paired.\n */\nexport function requireSelectedProfile(opts?: {\n profile?: string\n server?: string\n}): DaemonProfile | null {\n if (opts?.profile) {\n const p = findDaemonProfile(opts.profile)\n if (p) return p\n console.error(pc.red(`No daemon profile with alias \"${opts.profile}\".`))\n process.exitCode = 1\n return null\n }\n if (opts?.server) {\n const p = findDaemonProfile(opts.server)\n if (p) return p\n console.error(pc.red(`No daemon profile paired with \"${opts.server}\".`))\n process.exitCode = 1\n return null\n }\n const all = loadDaemonProfiles()\n if (all.length === 0) {\n console.error(pc.red('No paired daemon found. Run `bot pair` first.'))\n process.exitCode = 1\n return null\n }\n if (all.length > 1) {\n const list = all.map((p) => p.alias ?? p.server).join(', ')\n console.error(\n pc.red(\n `Multiple paired daemons (${list}). ` +\n 'Pick one with --profile <alias> or --server <url>.',\n ),\n )\n process.exitCode = 1\n return null\n }\n return all[0]\n}\n\nexport async 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\n/**\n * Wait for a child process to close, surfacing spawn-time failures\n * (e.g. ENOENT when the agent CLI isn't on PATH) as a rejected Promise\n * instead of an unhandled `'error'` event that would crash the daemon.\n */\nfunction awaitChildClose(\n child: ReturnType<typeof spawn>,\n commandLabel: string,\n): Promise<number | null> {\n return new Promise((resolveClose, reject) => {\n child.once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOENT') {\n reject(new Error(\n `Agent CLI \"${commandLabel}\" not found on PATH for the daemon process. ` +\n `Install it, or re-register the agent with an absolute path ` +\n `(\\`bot daemon agent remove ${commandLabel}\\` then \\`bot daemon config\\`).`,\n ))\n } else {\n reject(err)\n }\n })\n child.once('close', resolveClose)\n })\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","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 /** Stable key under `profiles:` in the YAML, derived from the server\n * hostname (e.g. `local`, `cloud`, `api-botapp-ai`). Optional on\n * inputs to `saveDaemonProfile` — auto-derived when absent. Always\n * populated on values returned from `loadDaemonProfile(s)`. */\n alias?: string\n server: string\n daemonId: string\n daemonName: string\n token: string\n /** Email of the dashboard user this profile is paired under. Captured\n * from the browser-auth callback so `bot daemon list` can show which\n * account each profile lives in without a server round-trip. Absent\n * for legacy pairings or `--token` flows where no callback ran. */\n userEmail?: string\n}\n\ninterface ProfileEntry {\n server: string\n daemonId: string\n daemonName?: string\n token: string\n userEmail?: string\n}\n\ninterface DaemonYaml {\n profiles?: Record<string, ProfileEntry>\n // Legacy single-profile shape (pre-multi-profile). Still loaded so\n // existing pairings keep working without a manual migration; the next\n // `saveDaemonProfile` call rewrites the file in the new shape.\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\nfunction readYaml(): DaemonYaml | null {\n try {\n if (!existsSync(DAEMON_FILE)) return null\n const parsed = parse(readFileSync(DAEMON_FILE, 'utf-8'))\n if (!parsed || typeof parsed !== 'object') return null\n return parsed as DaemonYaml\n } catch {\n return null\n }\n}\n\nfunction writeYaml(profiles: DaemonProfile[]): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n const map: Record<string, ProfileEntry> = {}\n for (const p of profiles) {\n const alias = p.alias ?? deriveAlias(p.server, new Set(Object.keys(map)))\n map[alias] = {\n server: p.server,\n daemonId: p.daemonId,\n daemonName: p.daemonName,\n token: p.token,\n ...(p.userEmail ? { userEmail: p.userEmail } : {}),\n }\n }\n writeFileSync(DAEMON_FILE, stringify({ profiles: map }), 'utf-8')\n}\n\nfunction normalizeServer(url: string): string {\n return url.replace(/\\/$/, '')\n}\n\nfunction deriveAlias(serverUrl: string, taken: Set<string>): string {\n let base: string\n try {\n const u = new URL(serverUrl)\n const host = u.hostname\n if (host === 'localhost' || host === '127.0.0.1') {\n base = u.port && u.port !== '7100' ? `local-${u.port}` : 'local'\n } else if (host === 'api.botapp.ai' || host === 'botapp.ai') {\n base = 'cloud'\n } else {\n base = host.replace(/\\./g, '-')\n }\n } catch {\n base = 'remote'\n }\n if (!taken.has(base)) return base\n let i = 2\n while (taken.has(`${base}-${i}`)) i += 1\n return `${base}-${i}`\n}\n\nexport function loadDaemonProfiles(): DaemonProfile[] {\n const data = readYaml()\n if (!data) return []\n\n const profiles: DaemonProfile[] = []\n if (data.profiles && typeof data.profiles === 'object') {\n for (const [alias, value] of Object.entries(data.profiles)) {\n if (!value?.server || !value?.daemonId || !value?.token) continue\n profiles.push({\n alias,\n server: normalizeServer(value.server),\n daemonId: value.daemonId,\n daemonName: value.daemonName ?? value.daemonId,\n token: value.token,\n userEmail: value.userEmail,\n })\n }\n }\n\n // Legacy single-profile fallback. Only honored when no `profiles:` map\n // is present, so a partially migrated file doesn't double-count.\n if (\n profiles.length === 0 &&\n data.server &&\n data.daemonId &&\n data.token\n ) {\n profiles.push({\n alias: deriveAlias(data.server, new Set()),\n server: normalizeServer(data.server),\n daemonId: data.daemonId,\n daemonName: data.daemonName ?? data.daemonId,\n token: data.token,\n })\n }\n return profiles\n}\n\n/** Back-compat: return the first paired profile, or null. */\nexport function loadDaemonProfile(): DaemonProfile | null {\n return loadDaemonProfiles()[0] ?? null\n}\n\n/** Find a profile by alias OR server URL (case-insensitive, trailing slash tolerant). */\nexport function findDaemonProfile(serverOrAlias: string): DaemonProfile | null {\n const profiles = loadDaemonProfiles()\n const needle = serverOrAlias.replace(/\\/$/, '').toLowerCase()\n for (const p of profiles) {\n if ((p.alias ?? '').toLowerCase() === needle) return p\n if (p.server.toLowerCase() === needle) return p\n }\n return null\n}\n\n/**\n * Upsert a daemon profile keyed by server URL. Replaces any prior entry\n * for the same server (so re-pairing the same server doesn't duplicate)\n * but preserves entries for other servers — the killer feature for\n * users who pair both a local dev server and a remote one.\n */\nexport function saveDaemonProfile(input: DaemonProfile): DaemonProfile {\n const server = normalizeServer(input.server)\n const remaining = loadDaemonProfiles().filter(\n (p) => p.server.toLowerCase() !== server.toLowerCase(),\n )\n\n const taken = new Set(remaining.map((p) => p.alias!).filter(Boolean))\n const alias =\n input.alias && !taken.has(input.alias)\n ? input.alias\n : deriveAlias(server, taken)\n\n const next: DaemonProfile = {\n alias,\n server,\n daemonId: input.daemonId,\n daemonName: input.daemonName ?? input.daemonId,\n token: input.token,\n userEmail: input.userEmail,\n }\n writeYaml([...remaining, next])\n return next\n}\n\nexport function removeDaemonProfile(serverOrAlias: string): boolean {\n const target = findDaemonProfile(serverOrAlias)\n if (!target) return false\n const remaining = loadDaemonProfiles().filter(\n (p) => p.alias !== target.alias,\n )\n writeYaml(remaining)\n return true\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 { requireSelectedProfile } from './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 .option('--profile <alias>', 'Daemon profile alias to register against')\n .option('--server <url>', 'Daemon profile by server URL')\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 profile: opts.profile,\n server: opts.server,\n })\n })\n}\n\nasync function configureDaemonAgents(inputOpts: {\n all: boolean\n names: string[]\n cwd: string\n profile?: string\n server?: string\n}): Promise<void> {\n const profile = requireSelectedProfile({\n profile: inputOpts.profile,\n server: inputOpts.server,\n })\n if (!profile) return\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 type { WebSocket } from 'ws'\n\n/**\n * Daemon-side RPC dispatch.\n *\n * Server pushes `daemon_rpc_request` frames keyed by `op` (`file.read`,\n * `pty.spawn`, …). The registry looks up the handler, invokes it, and\n * sends back exactly one `daemon_rpc_response` per rpcId — plus zero or\n * more `daemon_rpc_stream` frames in between for stream-mode ops.\n *\n * Handlers describe their own concurrency: a unary handler returns a\n * value (or throws). A stream handler is an async generator-like thing\n * that yields chunks plus accepts inbound frames via `onInput`.\n */\n\nexport interface RpcContext {\n /** App that initiated the call. Server stamps this onto every frame\n * so handlers can scope state per-app (e.g. workspace jails). */\n appName: string\n rpcId: string\n /** Send a stream chunk back to the server (data direction). */\n pushChunk(payload: unknown): void\n /** Best-effort: true once the server cancels or the socket closes.\n * Long-running handlers should poll this and abort cleanly. */\n isCancelled(): boolean\n /** Register a callback fired when the server sends an\n * `daemon_rpc_input` chunk. PTY handlers wire this to their write\n * pipe. Replaces any prior callback. */\n onInput(callback: (payload: unknown) => void): void\n /** Register a callback fired exactly once on cancel. Use for\n * spawning processes that need teardown beyond the\n * isCancelled() poll. */\n onCancel(callback: () => void): void\n}\n\nexport type RpcHandler = (params: any, ctx: RpcContext) => Promise<unknown>\n\nexport class RpcRegistry {\n private handlers = new Map<string, RpcHandler>()\n\n register(op: string, handler: RpcHandler): void {\n if (this.handlers.has(op)) {\n throw new Error(`RPC op already registered: ${op}`)\n }\n this.handlers.set(op, handler)\n }\n\n get(op: string): RpcHandler | undefined {\n return this.handlers.get(op)\n }\n\n has(op: string): boolean {\n return this.handlers.has(op)\n }\n}\n\ninterface InflightCall {\n ctx: InternalRpcContext\n}\n\nclass InternalRpcContext implements RpcContext {\n cancelled = false\n inputCallback: ((payload: unknown) => void) | null = null\n cancelCallback: (() => void) | null = null\n\n constructor(\n readonly appName: string,\n readonly rpcId: string,\n private readonly ws: WebSocket,\n ) {}\n\n pushChunk(payload: unknown): void {\n sendJson(this.ws, {\n type: 'daemon_rpc_stream',\n rpcId: this.rpcId,\n payload,\n })\n }\n\n isCancelled(): boolean {\n return this.cancelled\n }\n\n onInput(callback: (payload: unknown) => void): void {\n this.inputCallback = callback\n }\n\n onCancel(callback: () => void): void {\n this.cancelCallback = callback\n }\n\n cancel(): void {\n if (this.cancelled) return\n this.cancelled = true\n const cb = this.cancelCallback\n this.cancelCallback = null\n if (cb) {\n try {\n cb()\n } catch {\n // Best-effort teardown — never throw out of cancel.\n }\n }\n }\n\n receiveInput(payload: unknown): void {\n this.inputCallback?.(payload)\n }\n}\n\n/**\n * Per-WebSocket dispatcher. The CLI creates one of these per active\n * daemon socket and routes incoming RPC frames into it.\n */\nexport class RpcDispatcher {\n private inflight = new Map<string, InflightCall>()\n\n constructor(\n private readonly registry: RpcRegistry,\n private readonly ws: WebSocket,\n ) {}\n\n /** Handle a `daemon_rpc_request` frame. */\n async dispatchRequest(frame: {\n rpcId: string\n appName: string\n op: string\n params?: any\n stream?: boolean\n }): Promise<void> {\n const handler = this.registry.get(frame.op)\n if (!handler) {\n this.sendResponse(frame.rpcId, {\n ok: false,\n error: `unknown daemon RPC op: ${frame.op}`,\n })\n return\n }\n\n const ctx = new InternalRpcContext(\n frame.appName ?? 'unknown',\n frame.rpcId,\n this.ws,\n )\n this.inflight.set(frame.rpcId, { ctx })\n\n try {\n const result = await handler(frame.params ?? {}, ctx)\n if (this.inflight.has(frame.rpcId)) {\n this.sendResponse(frame.rpcId, { ok: true, result })\n }\n } catch (e: any) {\n if (this.inflight.has(frame.rpcId)) {\n this.sendResponse(frame.rpcId, {\n ok: false,\n error: e?.message ?? String(e),\n })\n }\n } finally {\n this.inflight.delete(frame.rpcId)\n }\n }\n\n /** Handle a `daemon_rpc_input` frame. */\n dispatchInput(frame: { rpcId: string; payload: unknown }): void {\n const call = this.inflight.get(frame.rpcId)\n if (!call) return\n call.ctx.receiveInput(frame.payload)\n }\n\n /** Handle a `daemon_rpc_cancel` frame. */\n dispatchCancel(frame: { rpcId: string }): void {\n const call = this.inflight.get(frame.rpcId)\n if (!call) return\n call.ctx.cancel()\n // Don't delete inflight here — the handler's catch/finally cleans up\n // and may still want to send a final terminal response.\n }\n\n /** Cancel everything (called on socket close). */\n shutdown(): void {\n for (const [, call] of this.inflight) {\n call.ctx.cancel()\n }\n this.inflight.clear()\n }\n\n private sendResponse(\n rpcId: string,\n body: { ok: boolean; result?: unknown; error?: string },\n ): void {\n sendJson(this.ws, { type: 'daemon_rpc_response', rpcId, ...body })\n }\n}\n\nfunction sendJson(ws: WebSocket, frame: object): void {\n if (ws.readyState !== ws.OPEN) return\n ws.send(JSON.stringify(frame))\n}\n","import { Buffer } from 'node:buffer'\nimport {\n promises as fsp,\n realpathSync,\n statSync,\n type Stats,\n} from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\nimport type { RpcRegistry } from './registry'\n\n/**\n * file.* RPC handlers.\n *\n * Every op takes `{ root, ... }` where `root` is the absolute workspace\n * directory the calling app already resolved. Callers MUST NOT pass\n * raw user-supplied paths — the daemon validates that any provided\n * `path` resolves inside `root` (after symlink resolution) and rejects\n * everything else.\n *\n * The jail intentionally blocks symlinks that escape the workspace.\n * Apps that want symlink-followed reads outside the workspace must\n * resolve them in their own action handler, then explicitly mount that\n * resolved path as another workspace.\n */\n\nexport function registerFileHandlers(registry: RpcRegistry): void {\n registry.register('file.tree', fileTree)\n registry.register('file.read', fileRead)\n registry.register('file.write', fileWrite)\n registry.register('file.stat', fileStat)\n registry.register('file.mkdir', fileMkdir)\n registry.register('file.delete', fileDelete)\n registry.register('file.rename', fileRename)\n // fs.* ops are *unjailed* filesystem browsers used to pick a workspace\n // root. Only reachable through `ctx.daemon()`, which is system-tier\n // gated, so they don't need their own privilege check. The browser\n // walks these to render its own picker — no native dialog opens on\n // the daemon machine, so the picker works from any device.\n registry.register('fs.browse', fsBrowse)\n registry.register('fs.home', fsHome)\n registry.register('fs.mkdir', fsMkdir)\n}\n\ninterface RootedParams {\n root: string\n path?: string\n}\n\nfunction expandHome(p: string): string {\n if (p === '~') return homedir()\n if (p.startsWith('~/')) return join(homedir(), p.slice(2))\n return p\n}\n\nfunction resolveRoot(root: string): string {\n if (typeof root !== 'string' || !root.trim()) {\n throw new Error('file.*: `root` is required')\n }\n const expanded = expandHome(root)\n if (!isAbsolute(expanded)) {\n throw new Error(`file.*: \\`root\\` must be absolute (got \"${root}\")`)\n }\n // Resolve symlinks once so the jail check uses the canonical path.\n // If the root doesn't exist yet (e.g. brand-new workspace) fall back\n // to the syntactic resolve — handlers that need an existing root will\n // surface ENOENT themselves.\n try {\n return realpathSync(expanded)\n } catch {\n return resolve(expanded)\n }\n}\n\n/** Returns the absolute path inside the jail, or throws. */\nfunction jailedPath(root: string, sub: string | undefined): string {\n const canonicalRoot = resolveRoot(root)\n const candidate = sub == null || sub === ''\n ? canonicalRoot\n : isAbsolute(sub)\n ? sub\n : resolve(canonicalRoot, sub)\n\n // Resolve symlinks where possible, but tolerate non-existent leaves\n // (file.write to a brand-new file should still work). Walk up until\n // we hit a real dir, realpath that, then re-attach the missing tail.\n let realBase = candidate\n let tail = ''\n while (true) {\n try {\n realBase = realpathSync(realBase)\n break\n } catch {\n const parent = dirname(realBase)\n if (parent === realBase) {\n // Hit the filesystem root without finding anything — give up\n // and use the syntactic resolve. The jail check below will\n // catch obvious escapes.\n realBase = candidate\n tail = ''\n break\n }\n tail = tail ? join(realBase.slice(parent.length + 1), tail) : realBase.slice(parent.length + 1)\n realBase = parent\n }\n }\n\n const final = tail ? join(realBase, tail) : realBase\n const rel = relative(canonicalRoot, final)\n if (rel.startsWith('..') || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`file.*: path \"${sub ?? ''}\" escapes workspace root \"${root}\"`)\n }\n return final\n}\n\ninterface FileTreeNode {\n name: string\n path: string\n isDir: boolean\n size?: number\n mtimeMs?: number\n}\n\ninterface FileTreeParams extends RootedParams {\n /** Subdir (relative to root). Defaults to root itself. */\n path?: string\n /** Max depth to recurse. Defaults to 1. Use a finite number — there's\n * no global cap, but very deep trees produce big responses. */\n depth?: number\n /** Names to skip at every level. Defaults to common heavy dirs. */\n ignore?: string[]\n}\n\nconst DEFAULT_IGNORE = new Set([\n 'node_modules',\n '.git',\n '.next',\n '.turbo',\n 'dist',\n 'build',\n '.venv',\n '__pycache__',\n '.DS_Store',\n])\n\nasync function fileTree(params: FileTreeParams): Promise<FileTreeNode[]> {\n const root = resolveRoot(params.root)\n const start = jailedPath(params.root, params.path)\n const depth = Math.max(0, params.depth ?? 1)\n const ignore = new Set([...DEFAULT_IGNORE, ...(params.ignore ?? [])])\n const out: FileTreeNode[] = []\n\n async function walk(absDir: string, level: number): Promise<void> {\n let entries: import('node:fs').Dirent[]\n try {\n // `encoding: 'utf8'` keeps Dirent.name typed as string under\n // strict @types/node, where the default `withFileTypes` overload\n // resolves to Dirent<NonSharedBuffer>.\n entries = (await fsp.readdir(absDir, {\n withFileTypes: true,\n encoding: 'utf8',\n })) as unknown as import('node:fs').Dirent[]\n } catch (e: any) {\n if (e?.code === 'ENOENT' || e?.code === 'ENOTDIR') return\n throw e\n }\n entries.sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1\n return a.name.localeCompare(b.name)\n })\n for (const entry of entries) {\n if (ignore.has(entry.name)) continue\n const abs = join(absDir, entry.name)\n const rel = relative(root, abs)\n let stat: Stats | null = null\n try {\n stat = await fsp.stat(abs)\n } catch {\n continue\n }\n const node: FileTreeNode = {\n name: entry.name,\n path: rel,\n isDir: entry.isDirectory(),\n size: entry.isFile() ? stat.size : undefined,\n mtimeMs: stat.mtimeMs,\n }\n out.push(node)\n if (entry.isDirectory() && level < depth) {\n await walk(abs, level + 1)\n }\n }\n }\n\n await walk(start, 1)\n return out\n}\n\ninterface FileReadParams extends RootedParams {\n path: string\n encoding?: 'utf8' | 'base64'\n /** Reject reads larger than this many bytes. Defaults to 5 MB. Apps\n * that need raw binary should chunk via repeated reads. */\n maxBytes?: number\n}\n\ninterface FileReadResult {\n path: string\n content: string\n encoding: 'utf8' | 'base64'\n size: number\n mtimeMs: number\n}\n\nasync function fileRead(params: FileReadParams): Promise<FileReadResult> {\n const abs = jailedPath(params.root, params.path)\n const maxBytes = params.maxBytes ?? 5 * 1024 * 1024\n const stat = await fsp.stat(abs)\n if (!stat.isFile()) {\n throw new Error(`file.read: not a file: ${params.path}`)\n }\n if (stat.size > maxBytes) {\n throw new Error(\n `file.read: file too large (${stat.size} bytes > ${maxBytes}). ` +\n `Pass maxBytes to override or chunk the read.`,\n )\n }\n const buf = await fsp.readFile(abs)\n const encoding = params.encoding ?? 'utf8'\n return {\n path: params.path,\n content:\n encoding === 'base64'\n ? buf.toString('base64')\n : buf.toString('utf8'),\n encoding,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n }\n}\n\ninterface FileWriteParams extends RootedParams {\n path: string\n content: string\n encoding?: 'utf8' | 'base64'\n /** Create parent dirs as needed. Defaults to true — matches the\n * expected ergonomics of an editor \"save\". */\n createDirs?: boolean\n}\n\ninterface FileWriteResult {\n path: string\n size: number\n mtimeMs: number\n}\n\nasync function fileWrite(params: FileWriteParams): Promise<FileWriteResult> {\n const abs = jailedPath(params.root, params.path)\n if (params.createDirs !== false) {\n await fsp.mkdir(dirname(abs), { recursive: true })\n }\n const buf =\n (params.encoding ?? 'utf8') === 'base64'\n ? Buffer.from(params.content, 'base64')\n : Buffer.from(params.content, 'utf8')\n await fsp.writeFile(abs, buf)\n const stat = await fsp.stat(abs)\n return { path: params.path, size: stat.size, mtimeMs: stat.mtimeMs }\n}\n\ninterface FileStatParams extends RootedParams {\n path: string\n}\n\ninterface FileStatResult {\n exists: boolean\n isFile: boolean\n isDir: boolean\n size: number\n mtimeMs: number\n}\n\nasync function fileStat(params: FileStatParams): Promise<FileStatResult> {\n // `path: ''` means \"stat the workspace root itself\" — used by the\n // File app to validate a folder before pinning it. Using `jailedPath`\n // here would fail when the root doesn't exist yet, since the jail\n // walks the parent chain via realpath (and on macOS `/var` ↔\n // `/private/var` symlink resolution makes the result fall outside\n // the syntactic root). Stat the root directly in that case.\n let abs: string\n try {\n abs =\n params.path == null || params.path === ''\n ? expandHome(params.root)\n : jailedPath(params.root, params.path)\n } catch (e: any) {\n if (/escapes workspace root/.test(e?.message ?? '')) throw e\n return { exists: false, isFile: false, isDir: false, size: 0, mtimeMs: 0 }\n }\n try {\n const stat = statSync(abs)\n return {\n exists: true,\n isFile: stat.isFile(),\n isDir: stat.isDirectory(),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n }\n } catch {\n return { exists: false, isFile: false, isDir: false, size: 0, mtimeMs: 0 }\n }\n}\n\ninterface FileMkdirParams extends RootedParams {\n path: string\n}\n\nasync function fileMkdir(params: FileMkdirParams): Promise<{ path: string }> {\n const abs = jailedPath(params.root, params.path)\n await fsp.mkdir(abs, { recursive: true })\n return { path: params.path }\n}\n\ninterface FileDeleteParams extends RootedParams {\n path: string\n /** Permit recursive directory removal. Default false. */\n recursive?: boolean\n}\n\nasync function fileDelete(params: FileDeleteParams): Promise<{ path: string }> {\n const abs = jailedPath(params.root, params.path)\n await fsp.rm(abs, { recursive: !!params.recursive, force: false })\n return { path: params.path }\n}\n\ninterface FileRenameParams extends RootedParams {\n from: string\n to: string\n}\n\nasync function fileRename(\n params: FileRenameParams,\n): Promise<{ from: string; to: string }> {\n const fromAbs = jailedPath(params.root, params.from)\n const toAbs = jailedPath(params.root, params.to)\n await fsp.rename(fromAbs, toAbs)\n return { from: params.from, to: params.to }\n}\n\ninterface FsBrowseParams {\n /** Absolute path to list. Defaults to the user's home dir. */\n path?: string\n /** Include dotfiles. Default false. */\n showHidden?: boolean\n /** Include files (not just directories). Default false — the\n * workspace picker only cares about folders. */\n includeFiles?: boolean\n}\n\ninterface FsBrowseEntry {\n name: string\n path: string\n isDir: boolean\n}\n\ninterface FsBrowseResult {\n /** Resolved absolute path that was listed. */\n path: string\n /** Parent dir, or null if `path` is the filesystem root. */\n parent: string | null\n entries: FsBrowseEntry[]\n}\n\nasync function fsBrowse(params: FsBrowseParams): Promise<FsBrowseResult> {\n const expanded = expandHome(params.path ?? '~')\n if (!isAbsolute(expanded)) {\n throw new Error(`fs.browse: path must be absolute (got \"${params.path}\")`)\n }\n let resolved: string\n try {\n resolved = realpathSync(expanded)\n } catch {\n resolved = resolve(expanded)\n }\n\n let raw: import('node:fs').Dirent[]\n try {\n raw = (await fsp.readdir(resolved, {\n withFileTypes: true,\n encoding: 'utf8',\n })) as unknown as import('node:fs').Dirent[]\n } catch (e: any) {\n throw new Error(`fs.browse: cannot read ${resolved}: ${e?.code ?? e?.message ?? e}`)\n }\n\n const entries: FsBrowseEntry[] = []\n for (const entry of raw) {\n if (!params.showHidden && entry.name.startsWith('.')) continue\n const isDir = entry.isDirectory()\n if (!isDir && !params.includeFiles) continue\n entries.push({\n name: entry.name,\n path: join(resolved, entry.name),\n isDir,\n })\n }\n entries.sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1\n return a.name.localeCompare(b.name)\n })\n\n const parent = dirname(resolved)\n return {\n path: resolved,\n parent: parent === resolved ? null : parent,\n entries,\n }\n}\n\nasync function fsHome(): Promise<{ home: string; cwd: string }> {\n return { home: homedir(), cwd: process.cwd() }\n}\n\ninterface FsMkdirParams {\n /** Absolute path of the directory to create. */\n path: string\n}\n\n/** Unjailed `mkdir -p` for the workspace picker. The file.mkdir op\n * requires a workspace root and would refuse a brand-new location.\n * Only reachable through ctx.daemon() (system-tier gated). */\nasync function fsMkdir(params: FsMkdirParams): Promise<{ path: string }> {\n const expanded = expandHome(params.path ?? '')\n if (!expanded || !isAbsolute(expanded)) {\n throw new Error(`fs.mkdir: path must be absolute (got \"${params.path}\")`)\n }\n await fsp.mkdir(expanded, { recursive: true })\n return { path: expanded }\n}\n\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { existsSync, statSync } from 'node:fs'\nimport { homedir, platform } from 'node:os'\nimport { join } from 'node:path'\nimport { isAbsolute } from 'node:path'\nimport type { RpcContext, RpcRegistry } from './registry'\n\n/**\n * pty.* RPC handlers.\n *\n * Two ops:\n * - pty.spawn (stream): start a process, stream stdout chunks back,\n * accept stdin chunks via daemon_rpc_input. Resolves when\n * the child exits.\n * - pty.resize (unary): resize a previously spawned PTY.\n * - pty.kill (unary): kill a previously spawned PTY.\n *\n * `node-pty` is loaded lazily — it's a native dep that not every install\n * has compiled. When missing we fall back to a `child_process.spawn`\n * pseudo-PTY: works for line-oriented commands (`ls`, `git status`,\n * `node`), useless for curses apps (`vim`, `htop`). The handler reports\n * which mode it ended up in via the first `pushChunk`.\n *\n * Lifetime is tied to the `pty.spawn` RPC: cancel the RPC (or close the\n * daemon WS) and the child gets SIGTERM then SIGKILL after 5 s.\n */\n\ninterface PtySpawnParams {\n cwd: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n cols?: number\n rows?: number\n}\n\ninterface PtyHandle {\n ptyId: string\n resize(cols: number, rows: number): void\n write(data: string): void\n kill(signal?: string): void\n}\n\nconst handles = new Map<string, PtyHandle>()\n\nexport function registerPtyHandlers(registry: RpcRegistry): void {\n registry.register('pty.spawn', ptySpawn)\n registry.register('pty.write', ptyWrite)\n registry.register('pty.resize', ptyResize)\n registry.register('pty.kill', ptyKill)\n}\n\nasync function ptySpawn(\n params: PtySpawnParams,\n ctx: RpcContext,\n): Promise<{ ptyId: string; exitCode: number | null; mode: 'pty' | 'pipe' }> {\n if (!params.cwd || typeof params.cwd !== 'string' || !isAbsolute(params.cwd)) {\n throw new Error('pty.spawn: `cwd` is required and must be absolute')\n }\n // node-pty surfaces missing cwd / shell as an opaque\n // `posix_spawnp failed` error through the child's stdout — pre-flight\n // both so the GUI sees an actionable message instead.\n let cwdStat: ReturnType<typeof statSync>\n try {\n cwdStat = statSync(params.cwd)\n } catch {\n throw new Error(`pty.spawn: cwd does not exist: ${params.cwd}`)\n }\n if (!cwdStat.isDirectory()) {\n throw new Error(`pty.spawn: cwd is not a directory: ${params.cwd}`)\n }\n const command = params.command || defaultShell()\n if (!existsSync(command)) {\n throw new Error(\n `pty.spawn: shell binary not found: ${command} ` +\n `(set $SHELL in the daemon's environment, or pass an explicit \\`command\\`)`,\n )\n }\n const args = params.args ?? defaultShellArgs()\n // node-pty's TS types want { [k: string]: string } — process.env entries\n // are string|undefined, so filter out the undefineds before passing.\n const env: Record<string, string> = { TERM: 'xterm-256color' }\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') env[k] = v\n }\n for (const [k, v] of Object.entries(params.env ?? {})) {\n env[k] = v\n }\n const cols = params.cols ?? 80\n const rows = params.rows ?? 24\n\n const handle = await openPty({ command, args, cwd: params.cwd, env, cols, rows, ctx })\n handles.set(handle.handle.ptyId, handle.handle)\n\n // Stream stdin chunks from server to the child.\n ctx.onInput((payload) => {\n if (typeof payload === 'string') handle.handle.write(payload)\n else if (payload && typeof (payload as any).data === 'string') {\n handle.handle.write((payload as any).data)\n }\n })\n\n ctx.onCancel(() => {\n handle.handle.kill('SIGTERM')\n setTimeout(() => {\n try {\n handle.handle.kill('SIGKILL')\n } catch {\n // already gone\n }\n }, 5_000).unref()\n })\n\n // First chunk announces the mode so the client UI can warn the user\n // when they're getting line-oriented mode (e.g. `vim` won't render).\n ctx.pushChunk({ kind: 'mode', mode: handle.mode, ptyId: handle.handle.ptyId })\n\n const exitCode = await handle.exited\n handles.delete(handle.handle.ptyId)\n return { ptyId: handle.handle.ptyId, exitCode, mode: handle.mode }\n}\n\ninterface PtyWriteParams {\n ptyId: string\n data: string\n}\n\nasync function ptyWrite(params: PtyWriteParams): Promise<{ ok: true }> {\n const handle = handles.get(params.ptyId)\n if (!handle) throw new Error(`pty.write: unknown ptyId ${params.ptyId}`)\n handle.write(params.data)\n return { ok: true }\n}\n\ninterface PtyResizeParams {\n ptyId: string\n cols: number\n rows: number\n}\n\nasync function ptyResize(params: PtyResizeParams): Promise<{ ok: true }> {\n const handle = handles.get(params.ptyId)\n if (!handle) throw new Error(`pty.resize: unknown ptyId ${params.ptyId}`)\n handle.resize(params.cols, params.rows)\n return { ok: true }\n}\n\ninterface PtyKillParams {\n ptyId: string\n signal?: string\n}\n\nasync function ptyKill(params: PtyKillParams): Promise<{ ok: true }> {\n const handle = handles.get(params.ptyId)\n if (!handle) throw new Error(`pty.kill: unknown ptyId ${params.ptyId}`)\n handle.kill(params.signal ?? 'SIGTERM')\n return { ok: true }\n}\n\ninterface OpenedPty {\n handle: PtyHandle\n mode: 'pty' | 'pipe'\n exited: Promise<number | null>\n}\n\nasync function openPty(opts: {\n command: string\n args: string[]\n cwd: string\n env: Record<string, string>\n cols: number\n rows: number\n ctx: RpcContext\n}): Promise<OpenedPty> {\n const nodePty = await loadNodePty()\n if (nodePty) {\n const proc = nodePty.spawn(opts.command, opts.args, {\n name: 'xterm-256color',\n cols: opts.cols,\n rows: opts.rows,\n cwd: opts.cwd,\n env: opts.env as any,\n })\n const ptyId = randomUUID()\n proc.onData((data: string) => {\n opts.ctx.pushChunk({ kind: 'data', data })\n })\n const exited = new Promise<number | null>((resolve) => {\n proc.onExit(({ exitCode }: { exitCode: number; signal?: number }) => {\n resolve(exitCode)\n })\n })\n return {\n mode: 'pty',\n exited,\n handle: {\n ptyId,\n resize: (cols, rows) => proc.resize(cols, rows),\n write: (data) => proc.write(data),\n kill: (signal) => proc.kill(signal),\n },\n }\n }\n\n // Fallback: line-oriented spawn. Works for non-interactive shells.\n const proc: ChildProcessWithoutNullStreams = spawn(\n opts.command,\n opts.args,\n {\n cwd: opts.cwd,\n env: opts.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n )\n const ptyId = randomUUID()\n proc.stdout.on('data', (chunk: Buffer) => {\n opts.ctx.pushChunk({ kind: 'data', data: chunk.toString('utf8') })\n })\n proc.stderr.on('data', (chunk: Buffer) => {\n opts.ctx.pushChunk({ kind: 'data', data: chunk.toString('utf8') })\n })\n const exited = new Promise<number | null>((resolve) => {\n proc.on('close', (code) => resolve(code))\n })\n return {\n mode: 'pipe',\n exited,\n handle: {\n ptyId,\n resize: () => {\n // No SIGWINCH on pipes — no-op.\n },\n write: (data) => {\n proc.stdin.write(data)\n },\n kill: (signal) => {\n proc.kill((signal as NodeJS.Signals) ?? 'SIGTERM')\n },\n },\n }\n}\n\nlet nodePtyCache: any | null | undefined = undefined\n\nasync function loadNodePty(): Promise<any | null> {\n if (nodePtyCache !== undefined) return nodePtyCache\n try {\n // Use a string variable so bundlers don't statically resolve and\n // crash when the optional dep is absent.\n const moduleName = 'node-pty'\n nodePtyCache = await import(moduleName)\n return nodePtyCache\n } catch {\n nodePtyCache = null\n return null\n }\n}\n\nfunction defaultShell(): string {\n if (platform() === 'win32') {\n return process.env.COMSPEC || 'cmd.exe'\n }\n return process.env.SHELL || '/bin/bash'\n}\n\nfunction defaultShellArgs(): string[] {\n if (platform() === 'win32') return []\n // -i to make the shell load aliases / prompt config the user expects.\n return ['-l', '-i']\n}\n\n// Best-effort heuristics so spawned shells start somewhere sensible if\n// the caller forgot to pass cwd. Currently unused but kept here for\n// future ops that don't carry an explicit cwd.\nexport function defaultUserCwd(): string {\n const home = homedir()\n if (process.env.PWD && isAbsolute(process.env.PWD)) {\n return process.env.PWD\n }\n return join(home)\n}\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { resolve, join } from 'node:path'\nimport { existsSync, mkdirSync, openSync, writeFileSync } 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 } from '../config/daemon'\nimport { runBrowserAuth } from '../auth/browser-auth'\nimport { registerAllDetectedAgents } from './daemon-agent-config'\nimport { isDaemonRunningLocally, stopExistingDaemon } from './daemon-supervisor'\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 const savedProfile = saveDaemonProfile({\n server: result.serverUrl ?? serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n userEmail: result.userEmail,\n })\n console.log(\n ` Daemon: ${pc.bold(data.daemon.name)} ${pc.dim(`(${data.daemon.id})`)}` +\n pc.dim(` profile=${savedProfile.alias}`),\n )\n await autoRegisterAgents(opts, savedProfile)\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 // Re-pairing extends `~/.botapp/daemon.yaml` with a new profile, but\n // an already-running daemon process loaded the old set at startup —\n // it won't pick up the new server until we restart it. Stop the\n // existing supervisor (if any) so the spawn below picks up the full\n // updated profile list.\n if (isDaemonRunningLocally(pidFile)) {\n stopExistingDaemon(pidFile)\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\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(\n opts: LaunchOpts,\n daemon: { server: string; token: string },\n): Promise<void> {\n if (opts.agents === false) 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 { 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","// Helpers for managing the local detached `bot daemon run` process\n// (PID tracked in `~/.botapp/daemon.pid`). Shared between `bot launch`\n// and `bot pairing` so that any flow which rotates the token in\n// `daemon.yaml` also stops the running daemon — otherwise it keeps\n// presenting its in-memory stale token and loops forever with\n// `4001 Unauthorized`.\nimport { existsSync, readFileSync, unlinkSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport function daemonPidFile(): string {\n return join(homedir(), '.botapp', 'daemon.pid')\n}\n\nexport function isDaemonRunningLocally(pidFile: string = daemonPidFile()): 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\nexport function stopExistingDaemon(pidFile: string = daemonPidFile()): void {\n try {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10)\n if (Number.isInteger(pid) && pid > 0) {\n try {\n process.kill(pid, 'SIGTERM')\n } catch {\n // Process is already gone — proceed.\n }\n }\n } catch {\n // PID file unreadable — ignore.\n }\n try {\n unlinkSync(pidFile)\n } catch {\n // PID file already removed — fine.\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 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'\nimport { runDaemonConnectionLoop } from './daemon'\nimport { isDaemonRunningLocally, stopExistingDaemon } from './daemon-supervisor'\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 // Stop any background daemon before rotating the token. The\n // detached process loaded the previous token at startup and only\n // re-reads daemon.yaml on restart — leaving it running would\n // produce a perpetual `4001 Unauthorized` loop in daemon.log\n // and let it fight the new daemon for the agent slot via\n // closeStaleDaemonConnections. Same fix `bot launch` already\n // applies before its own auto-restart.\n const stoppedExistingDaemon = isDaemonRunningLocally()\n if (stoppedExistingDaemon) {\n stopExistingDaemon()\n }\n\n const savedProfile = saveDaemonProfile({\n server: serverUrl,\n daemonId: data.daemon.id,\n daemonName: data.daemon.name,\n token: data.token,\n userEmail: grant.userEmail,\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(` Profile: ${savedProfile.alias}`)\n if (stoppedExistingDaemon) {\n console.log(pc.dim(' Note: stopped the existing background daemon (was holding the old token).'))\n }\n\n if (opts.run) {\n // No agent auto-registration. The user explicitly creates the\n // agents they want from the dashboard's Create Agent modal —\n // surprise-defaults that scan PATH for `codex` / `claude` /\n // etc. were producing four agents the user never asked for.\n // Run the just-paired profile (not the first one in the file)\n // so re-pairing one of several servers does the obvious thing.\n await runDaemonConnectionLoop(savedProfile)\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 { Command } from 'commander'\nimport pc from 'picocolors'\nimport { loadDaemonProfiles, type DaemonProfile } from '../config/daemon'\nimport { daemonRequest } from './daemon'\n\ntype Severity = 'ok' | 'warn' | 'fail'\n\ninterface Finding {\n severity: Severity\n message: string\n /** Optional remediation hint shown indented under the message. */\n fix?: string\n}\n\nexport const doctorCommand = new Command('doctor')\n .description('Diagnose paired daemon profiles (server reachability, token validity, account ownership)')\n .action(async () => {\n const profiles = loadDaemonProfiles()\n if (profiles.length === 0) {\n console.log(pc.dim('No paired daemons in ~/.botapp/daemon.yaml.'))\n console.log(pc.dim('Run `bot pair` to add one.'))\n return\n }\n\n let warns = 0\n let fails = 0\n\n for (const profile of profiles) {\n console.log(pc.bold(`\\n[${profile.alias ?? profile.server}]`))\n console.log(` Server: ${profile.server}`)\n console.log(` Daemon: ${profile.daemonName} ${pc.dim(`(${profile.daemonId})`)}`)\n\n const findings = await checkProfile(profile)\n for (const f of findings) {\n const tag = f.severity === 'ok' ? pc.green(' ✓ ') : f.severity === 'warn' ? pc.yellow(' ⚠ ') : pc.red(' ✗ ')\n console.log(`${tag}${f.message}`)\n if (f.fix) console.log(pc.dim(` → ${f.fix}`))\n if (f.severity === 'warn') warns += 1\n if (f.severity === 'fail') fails += 1\n }\n }\n\n console.log('')\n if (fails === 0 && warns === 0) {\n console.log(pc.green('All checks passed.'))\n } else {\n const parts: string[] = []\n if (fails > 0) parts.push(pc.red(`${fails} failing`))\n if (warns > 0) parts.push(pc.yellow(`${warns} warning${warns === 1 ? '' : 's'}`))\n console.log(parts.join(', ') + '.')\n if (fails > 0) process.exitCode = 1\n }\n })\n\nasync function checkProfile(profile: DaemonProfile): Promise<Finding[]> {\n const findings: Finding[] = []\n\n // 1. Server reachable.\n let serverOk = false\n try {\n const res = await fetch(`${profile.server}/health`, {\n signal: AbortSignal.timeout(5000),\n })\n if (res.ok) {\n findings.push({ severity: 'ok', message: 'Server reachable' })\n serverOk = true\n } else {\n findings.push({\n severity: 'fail',\n message: `Server returned ${res.status} ${res.statusText}`,\n fix: `Verify the server at ${profile.server} is running.`,\n })\n }\n } catch (e: any) {\n findings.push({\n severity: 'fail',\n message: `Server unreachable: ${e.message ?? e}`,\n fix: `Start the server, or remove this profile with \\`bot daemon unpair ${profile.alias ?? profile.server}\\`.`,\n })\n }\n if (!serverOk) return findings\n\n // 2. Token valid + identity probe.\n let serverEmail: string | null = null\n try {\n const data = (await daemonRequest(profile.server, profile.token, '/api/daemon/self')) as {\n daemon?: { id: string; status: string; lastSeenAt: string | null }\n user?: { id: string; email: string } | null\n }\n findings.push({ severity: 'ok', message: 'Token valid' })\n\n serverEmail = data.user?.email ?? null\n if (serverEmail) {\n findings.push({\n severity: 'ok',\n message: `Token paired under ${pc.bold(serverEmail)}`,\n })\n } else {\n findings.push({\n severity: 'warn',\n message: 'Server returned no user record for this daemon',\n fix: 'The owning user may have been deleted. Re-pair with `bot pair`.',\n })\n }\n\n // 3. Online status.\n if (data.daemon?.status === 'online') {\n findings.push({ severity: 'ok', message: 'Daemon currently online' })\n } else {\n findings.push({\n severity: 'warn',\n message: `Daemon status: ${data.daemon?.status ?? 'unknown'}`,\n fix: `Run \\`bot daemon run --server ${profile.server}\\` to bring it online.`,\n })\n }\n } catch (e: any) {\n const msg = e?.message ?? String(e)\n if (/unauthor/i.test(msg) || /token/i.test(msg)) {\n findings.push({\n severity: 'fail',\n message: `Token rejected: ${msg}`,\n fix: 'The token is stale (likely the server DB was reset). Re-pair with `bot pair`.',\n })\n return findings\n }\n findings.push({ severity: 'fail', message: `Identity probe failed: ${msg}` })\n return findings\n }\n\n // 4. Recorded userEmail vs server-reported.\n if (profile.userEmail && serverEmail && profile.userEmail !== serverEmail) {\n findings.push({\n severity: 'warn',\n message: `daemon.yaml says \\`userEmail: ${profile.userEmail}\\` but server says \\`${serverEmail}\\``,\n fix: 'Re-pair to refresh the recorded email.',\n })\n } else if (!profile.userEmail && serverEmail) {\n findings.push({\n severity: 'warn',\n message: 'daemon.yaml has no userEmail recorded',\n fix: 'Re-pair to capture it (cosmetic — auth still works).',\n })\n }\n\n // 5. Cross-check vs the dashboard session, if a cookie jar is around.\n // We can't easily read the browser cookie from CLI, so instead we just\n // hint when there are multiple profiles for the same server with\n // different owners — almost certainly the source of \"I see offline\"\n // confusion.\n return findings\n}\n","import { spawn } from 'node:child_process'\nimport { realpathSync } from 'node:fs'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\n\ntype Manager = 'npm' | 'pnpm' | 'yarn' | 'brew' | 'npx'\n\nconst PACKAGE_NAME = 'botapp-cli'\n\n/**\n * Update the installed `bot` binary itself.\n *\n * Detection from `process.argv[1]`:\n * ~/.../pnpm/... → pnpm add -g botapp-cli@latest\n * ~/.../yarn/... → yarn global add botapp-cli@latest\n * ~/.../Cellar/... → brew upgrade botapp-cli\n * ~/.../_npx/<hash>/ → no-op (npx -y always fetches @latest)\n * anything else → npm i -g botapp-cli@latest\n *\n * App updates are intentionally NOT folded in here — those go through\n * `bot install` / `bot reload` because they have very different\n * semantics (per-app source, manifest reload, capability re-grant).\n */\nexport const updateCommand = new Command('update')\n .description('Update the `bot` CLI itself to the latest published version')\n .option(\n '--manager <pm>',\n 'Force a package manager: npm | pnpm | yarn | brew (default: auto-detect)',\n )\n .option('--dry-run', 'Print the command that would run, but do not execute it')\n .action(async (opts) => {\n const forced = opts.manager as Manager | undefined\n const manager = forced ?? detectPackageManager()\n\n if (manager === 'npx') {\n console.log(\n pc.green(\n 'You are running `bot` via `npx -y botapp-cli@latest` — every invocation already fetches the latest version.',\n ),\n )\n console.log(\n pc.dim(\n 'For a faster startup, install it globally instead:\\n' +\n ' npm i -g botapp-cli@latest\\n' +\n ' pnpm add -g botapp-cli@latest',\n ),\n )\n return\n }\n\n if (!manager) {\n console.error(\n pc.red(\n \"Couldn't detect how `bot` was installed. Pick one of these manually:\",\n ),\n )\n console.log(pc.cyan(' npm i -g botapp-cli@latest'))\n console.log(pc.cyan(' pnpm add -g botapp-cli@latest'))\n console.log(pc.cyan(' yarn global add botapp-cli@latest'))\n console.log(pc.cyan(' brew upgrade botapp-cli'))\n process.exitCode = 1\n return\n }\n\n const { command, args } = updateCommandFor(manager)\n console.log(pc.dim(`$ ${command} ${args.join(' ')}`))\n if (opts.dryRun) return\n\n const child = spawn(command, args, { stdio: 'inherit' })\n const code = await new Promise<number | null>((resolve) => {\n child.once('error', (err) => {\n console.error(pc.red(`Failed to spawn ${command}: ${err.message}`))\n resolve(127)\n })\n child.once('close', resolve)\n })\n if (code !== 0) {\n console.error(pc.red(`Update failed (exit ${code}).`))\n process.exitCode = code ?? 1\n return\n }\n console.log(pc.green('botapp-cli updated. Run `bot --version` to confirm.'))\n })\n\nfunction detectPackageManager(): Manager | null {\n // npm/pnpm/etc. global installs put a symlink in `…/bin/bot` and the\n // actual file under `…/lib/node_modules/…`. `process.argv[1]` is the\n // symlink path (Node doesn't resolve it by default), so we'd miss\n // `/lib/node_modules/`, `/_npx/`, etc. Match against both the\n // invocation path and the resolved real path.\n const argv = process.argv[1] ?? ''\n let real = ''\n try { real = argv ? realpathSync(argv) : '' } catch { /* dangling/missing — keep argv only */ }\n const candidates = [argv, real].filter(Boolean)\n // Order matters: an `npx` cache path also contains `node_modules`, and\n // a pnpm global path on Windows uses `\\pnpm\\`. Check the most specific\n // markers first.\n if (matchAny(candidates, ['/_npx/', '\\\\_npx\\\\'])) return 'npx'\n if (matchAny(candidates, ['/pnpm/', '\\\\pnpm\\\\', '/.pnpm/'])) return 'pnpm'\n if (matchAny(candidates, ['/.yarn/', '/yarn/global/'])) return 'yarn'\n if (matchAny(candidates, ['/Cellar/', '/homebrew/', '\\\\Cellar\\\\'])) return 'brew'\n if (matchAny(candidates, ['/lib/node_modules/', '\\\\node_modules\\\\']) || candidates.some((c) => c.includes('npm'))) return 'npm'\n return null\n}\n\nfunction matchAny(haystacks: string[], needles: string[]): boolean {\n return haystacks.some((h) => needles.some((n) => h.includes(n)))\n}\n\nfunction updateCommandFor(manager: Exclude<Manager, 'npx'>): {\n command: string\n args: string[]\n} {\n switch (manager) {\n case 'pnpm':\n return { command: 'pnpm', args: ['add', '-g', `${PACKAGE_NAME}@latest`] }\n case 'yarn':\n return { command: 'yarn', args: ['global', 'add', `${PACKAGE_NAME}@latest`] }\n case 'brew':\n return { command: 'brew', args: ['upgrade', PACKAGE_NAME] }\n case 'npm':\n default:\n return { command: 'npm', args: ['i', '-g', `${PACKAGE_NAME}@latest`] }\n }\n}\n","// `bot simulate` — dev-tunnel an app to a botapp server.\n//\n// Reads the local `botapp.app.json`, asks the server for a per-user\n// dev-session token (POST /api/dev/token), then spawns the app's entry\n// process with BOTAPP_SERVER + BOTAPP_APP_TOKEN set. The app uses the\n// SDK's HostedClient (or BotApp.start()) to connect; once registered,\n// it shadows the published version of the app for the logged-in user\n// only — the developer can then exercise it through their real\n// dashboard.\n//\n// File watching for hot reload is left as a follow-up; for now Ctrl-C\n// stops the child and exit.\n\nimport { Command } from 'commander'\nimport { resolve, join } from 'node:path'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\ninterface AppManifest {\n name: string\n version?: string\n entry?: string\n [key: string]: unknown\n}\n\nexport const simulateCommand = new Command('simulate')\n .description('Dev-tunnel a local app to a botapp server (per-user shadow)')\n .argument('[path]', 'Path to the app directory', '.')\n .option('-s, --server <url>', 'botapp server URL (default: active profile / $BOTAPP_SERVER)')\n .option('-t, --token <token>', 'auth token (default: active profile / $BOTAPP_TOKEN)')\n .option('--entry <file>', 'override the manifest entry path')\n .option('--lifetime <minutes>', 'dev-session token lifetime in minutes', '480')\n .action(async (appPath, opts) => {\n const absPath = resolve(appPath)\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 const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as AppManifest\n if (!manifest.name) {\n console.error(pc.red('manifest missing \"name\"'))\n process.exitCode = 1\n return\n }\n\n const httpServer = resolveServerUrl(opts.server)\n const wsServer = httpServer.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:') + '/ws/host'\n const token = resolveToken(opts.token)\n if (!token) {\n console.error(pc.red('not logged in: run `bot login` or pass --token'))\n process.exitCode = 1\n return\n }\n\n const lifetimeMs = Math.max(60_000, Number(opts.lifetime) * 60_000)\n\n console.log(pc.dim(`requesting dev token for \"${manifest.name}\" from ${httpServer}...`))\n const devToken = await issueDevToken({\n serverUrl: httpServer,\n token,\n appName: manifest.name,\n lifetimeMs,\n })\n console.log(pc.green('✓'), `dev token issued (lifetime ${opts.lifetime} min)`)\n\n const entryPath = resolveEntry(absPath, opts.entry ?? manifest.entry)\n if (!existsSync(entryPath)) {\n console.error(pc.red(`entry not found: ${entryPath}`))\n console.error(pc.dim(' run `pnpm build` (or your build script) first.'))\n process.exitCode = 1\n return\n }\n\n console.log(pc.dim(`spawning ${entryPath} ...`))\n console.log(pc.dim(` BOTAPP_SERVER=${wsServer}`))\n console.log(pc.dim(` BOTAPP_APP_NAME=${manifest.name}`))\n console.log(\n pc.cyan(\n `\\nWhen ready, your dashboard at ${httpServer} will route \"${manifest.name}\" to this process for your account only.\\n`,\n ),\n )\n\n const child: ChildProcess = spawn('node', [entryPath], {\n cwd: absPath,\n env: {\n ...process.env,\n BOTAPP_SERVER: wsServer,\n BOTAPP_APP_TOKEN: devToken,\n BOTAPP_APP_NAME: manifest.name,\n BOTAPP_DATA_DIR: join(absPath, '.botapp-sim'),\n },\n stdio: 'inherit',\n })\n\n const stop = (signal: NodeJS.Signals) => {\n console.log(pc.dim(`\\nstopping (${signal})...`))\n if (!child.killed) child.kill(signal)\n }\n process.on('SIGINT', () => stop('SIGINT'))\n process.on('SIGTERM', () => stop('SIGTERM'))\n\n child.on('exit', (code, sig) => {\n const reason = sig ? `signal ${sig}` : `exit ${code}`\n console.log(pc.dim(`child exited (${reason})`))\n process.exit(typeof code === 'number' ? code : 0)\n })\n })\n\nasync function issueDevToken(opts: {\n serverUrl: string\n token: string\n appName: string\n lifetimeMs: number\n}): Promise<string> {\n const res = await fetch(`${opts.serverUrl}/api/dev/token`, {\n method: 'POST',\n headers: authHeaders(opts.token),\n body: JSON.stringify({ appName: opts.appName, lifetimeMs: opts.lifetimeMs }),\n })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(`dev-token request failed (${res.status}): ${text}`)\n }\n const data = (await res.json()) as { token?: string; error?: string }\n if (!data.token) {\n throw new Error(`dev-token response missing token: ${JSON.stringify(data)}`)\n }\n return data.token\n}\n\nfunction resolveEntry(appDir: string, entry: string | undefined): string {\n // Default search order: dist/api.js, dist/index.js, api/index.ts (fallback).\n const candidates = [\n entry,\n 'dist/api.js',\n 'dist/api/index.js',\n 'dist/index.js',\n 'api/index.ts',\n 'api/index.js',\n ].filter(Boolean) as string[]\n for (const c of candidates) {\n const full = resolve(appDir, c)\n if (existsSync(full)) return full\n }\n // Fall through: return the first candidate so the caller can show a clear error.\n return resolve(appDir, candidates[0] ?? 'dist/api.js')\n}\n","// `bot init <name>` — scaffold a hosted-tier (Tier B) app project.\n//\n// Pure-TS, no shell-out, no external template tree. Generates a\n// minimal app you can immediately run with `bot simulate`. Intentionally\n// smaller than the legacy app-template/scripts/init.sh — that script\n// targets the old multi-target adapter model; the hosted runtime makes\n// targets irrelevant (the app is just a Node process that connects via\n// outbound WS).\n\nimport { Command } from 'commander'\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\nimport pc from 'picocolors'\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new hosted-tier botapp app project')\n .argument('<name>', 'App name (kebab-case; used in URL paths and manifest)')\n .option('-d, --dir <path>', 'Output directory (default: ./<name>)')\n .option('--headless', 'No frontend — backend-only app (skip src/, tailwind, etc.)')\n .option('--description <text>', 'Short description for AI agents to read')\n .option('-f, --force', 'Overwrite existing directory contents')\n .action(async (name: string, opts: InitOptions) => {\n if (!/^[a-z][a-z0-9-]*$/.test(name)) {\n console.error(pc.red('Invalid name. Use lowercase letters, digits, dashes; must start with a letter.'))\n console.error(pc.dim(' e.g. my-app, todo-tracker, gomoku-2'))\n process.exitCode = 1\n return\n }\n\n const targetDir = resolve(opts.dir ?? `./${name}`)\n if (existsSync(targetDir) && !opts.force) {\n const stat = (() => {\n try {\n return require('node:fs').readdirSync(targetDir)\n } catch {\n return []\n }\n })()\n if (Array.isArray(stat) && stat.length > 0) {\n console.error(pc.red(`Target directory exists and is not empty: ${targetDir}`))\n console.error(pc.dim(' pass --force to overwrite, or pick a different --dir'))\n process.exitCode = 1\n return\n }\n }\n\n const ctx: TemplateContext = {\n name,\n description: opts.description ?? `${name} — a botapp app`,\n headless: !!opts.headless,\n }\n\n mkdirSync(targetDir, { recursive: true })\n const files = ctx.headless ? headlessFiles(ctx) : fullFiles(ctx)\n for (const [rel, content] of Object.entries(files)) {\n const full = join(targetDir, rel)\n mkdirSync(dirname(full), { recursive: true })\n writeFileSync(full, content)\n }\n\n console.log(pc.green('✓'), `Scaffolded ${ctx.headless ? 'headless ' : ''}app at`, pc.cyan(targetDir))\n console.log()\n console.log('Next steps:')\n console.log(pc.dim(` cd ${targetDir.replace(process.cwd() + '/', '')}`))\n console.log(pc.dim(' pnpm install # or npm install'))\n if (!ctx.headless) console.log(pc.dim(' pnpm build # builds api/ + frontend (dist/)'))\n else console.log(pc.dim(' pnpm build # builds api/ to dist/api.js'))\n console.log(pc.dim(` bot login --server <your-botapp-server>`))\n console.log(pc.dim(` bot simulate # dev-tunnel into the server, hot-reload as you build`))\n console.log()\n console.log(\n pc.dim('Once it works, `bot publish` ships it to the server (per-user install by default).'),\n )\n })\n\ninterface InitOptions {\n dir?: string\n headless?: boolean\n description?: string\n force?: boolean\n}\n\ninterface TemplateContext {\n name: string\n description: string\n headless: boolean\n}\n\n// ----- file map builders -----\n\nfunction fullFiles(ctx: TemplateContext): Record<string, string> {\n return {\n 'botapp.app.json': manifestJson(ctx),\n 'package.json': packageJson(ctx, /*headless*/ false),\n 'tsconfig.json': tsconfigJson(false),\n 'tsconfig.api.json': tsconfigApiJson(),\n 'tsconfig.frontend.json': tsconfigFrontendJson(),\n 'tsup.api.config.ts': tsupApiConfig(),\n 'vite.config.ts': viteConfig(ctx),\n 'index.html': indexHtml(ctx),\n 'api/index.ts': apiEntryTs(ctx, false),\n 'src/main.tsx': srcMainTsx(ctx),\n 'src/App.tsx': srcAppTsx(ctx),\n 'src/lib/api.ts': srcApiTs(),\n 'contracts/types.ts': contractsTs(ctx),\n '.gitignore': gitignore(),\n 'README.md': readme(ctx, false),\n }\n}\n\nfunction headlessFiles(ctx: TemplateContext): Record<string, string> {\n return {\n 'botapp.app.json': manifestJson(ctx),\n 'package.json': packageJson(ctx, /*headless*/ true),\n 'tsconfig.json': tsconfigJson(true),\n 'tsup.api.config.ts': tsupApiConfig(),\n 'api/index.ts': apiEntryTs(ctx, true),\n 'contracts/types.ts': contractsTs(ctx),\n '.gitignore': gitignore(),\n 'README.md': readme(ctx, true),\n }\n}\n\n// ----- file contents -----\n\nfunction manifestJson(ctx: TemplateContext): string {\n const m: Record<string, unknown> = {\n name: ctx.name,\n version: '0.1.0',\n description: ctx.description,\n entry: './dist/api.js',\n tier: 'user',\n visibility: 'private',\n }\n if (!ctx.headless) {\n m.hasFrontend = true\n }\n return JSON.stringify(m, null, 2) + '\\n'\n}\n\nfunction packageJson(ctx: TemplateContext, headless: boolean): string {\n const scripts: Record<string, string> = {\n build: headless\n ? 'tsup --config tsup.api.config.ts'\n : 'tsup --config tsup.api.config.ts && vite build',\n 'build:api': 'tsup --config tsup.api.config.ts',\n dev: headless ? 'tsup --config tsup.api.config.ts --watch' : 'tsup --config tsup.api.config.ts --watch & vite',\n typecheck: 'tsc --noEmit',\n }\n const deps: Record<string, string> = {\n 'botapp-sdk': '^0.1.1',\n ws: '^8.18.0',\n }\n const devDeps: Record<string, string> = {\n tsup: '^8.4.0',\n typescript: '^5.8.0',\n '@types/node': '^22.0.0',\n '@types/ws': '^8.5.0',\n }\n if (!headless) {\n Object.assign(deps, {\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n })\n Object.assign(devDeps, {\n vite: '^7.0.0',\n '@vitejs/plugin-react': '^5.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n })\n }\n return (\n JSON.stringify(\n {\n name: ctx.name,\n version: '0.1.0',\n description: ctx.description,\n type: 'module',\n private: true,\n scripts,\n dependencies: deps,\n devDependencies: devDeps,\n },\n null,\n 2,\n ) + '\\n'\n )\n}\n\nfunction tsconfigJson(headless: boolean): string {\n if (headless) {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: ['api/**/*.ts', 'contracts/**/*.ts'],\n },\n null,\n 2,\n ) + '\\n'\n }\n return JSON.stringify(\n {\n files: [],\n references: [\n { path: './tsconfig.api.json' },\n { path: './tsconfig.frontend.json' },\n ],\n },\n null,\n 2,\n ) + '\\n'\n}\n\nfunction tsconfigApiJson(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: ['api/**/*.ts', 'contracts/**/*.ts'],\n },\n null,\n 2,\n ) + '\\n'\n}\n\nfunction tsconfigFrontendJson(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n jsx: 'react-jsx',\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n noEmit: true,\n },\n include: ['src/**/*.ts', 'src/**/*.tsx', 'contracts/**/*.ts'],\n },\n null,\n 2,\n ) + '\\n'\n}\n\nfunction tsupApiConfig(): string {\n return `import { defineConfig } from 'tsup'\n\nexport default defineConfig({\n entry: { api: 'api/index.ts' },\n format: ['esm'],\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n noExternal: [],\n})\n`\n}\n\nfunction viteConfig(ctx: TemplateContext): string {\n return `import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\nexport default defineConfig({\n plugins: [react()],\n base: '/apps/${ctx.name}/',\n build: {\n outDir: 'dist/public',\n emptyOutDir: true,\n },\n})\n`\n}\n\nfunction indexHtml(ctx: TemplateContext): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(ctx.description)}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction apiEntryTs(ctx: TemplateContext, headless: boolean): string {\n const widget = headless\n ? ''\n : `\n ctx.registerWidget({\n refresh: { intervalMs: 30_000 },\n render: async ({ state }) => {\n const count = (await state.get('count')) ?? 0\n return {\n html: \\`<div class=\"card\"><div class=\"label\">${ctx.name.toUpperCase()}</div><div class=\"value\">\\${count}</div></div>\\`,\n css: \\`.card { padding: 20px; font-family: sans-serif; } .value { font-size: 32px; font-weight: 700; }\\`,\n }\n },\n })\n\n ctx.serveStatic('./dist/public')\n`\n return `import { BotApp, runHosted } from 'botapp-sdk'\n\nconst app = new BotApp({\n name: '${ctx.name}',\n version: '0.1.0',\n description: '${ctx.description.replace(/'/g, \"\\\\'\")}',\n async setup(ctx) {\n ctx.registerCommand('hello', {\n description: 'Greet the caller',\n params: {\n name: { type: 'string', required: false, default: 'world', description: 'Who to greet' },\n },\n handler: async ({ name }, cmdCtx) => {\n const count = ((await cmdCtx.state.get('count')) as number | null) ?? 0\n await cmdCtx.state.set('count', count + 1)\n ctx.invalidateWidget?.()\n return \\`Hello, \\${name}! (called \\${count + 1}x by \\${cmdCtx.agent.id})\\`\n },\n })\n${widget} },\n})\n\nexport default app\n\n// Hosted-tier bridge: only connects when launched with BOTAPP_SERVER +\n// BOTAPP_APP_TOKEN (set by \\`bot simulate\\` and the platform-spawned runner).\n// In every other context (tests, in-process discovery) the bridge stays\n// dormant. Use globalThis.process so this typechecks without @types/node.\nconst env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env ?? {}\nif (env.BOTAPP_SERVER && env.BOTAPP_APP_TOKEN) {\n await runHosted(app)\n}\n`\n}\n\nfunction srcMainTsx(_ctx: TemplateContext): string {\n return `import { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { App } from './App'\n\ncreateRoot(document.getElementById('root')!).render(\n <StrictMode>\n <App />\n </StrictMode>,\n)\n`\n}\n\nfunction srcAppTsx(ctx: TemplateContext): string {\n return `import { useEffect, useState } from 'react'\nimport { callCommand } from './lib/api'\n\nexport function App() {\n const [count, setCount] = useState<number | null>(null)\n const [error, setError] = useState<string | null>(null)\n useEffect(() => {\n callCommand('hello', { name: 'browser' })\n .then((res) => {\n const m = /\\\\(called (\\\\d+)x/.exec(String(res))\n if (m) setCount(Number(m[1]))\n })\n .catch((e: Error) => setError(e.message))\n }, [])\n return (\n <main style={{ fontFamily: 'sans-serif', padding: 24 }}>\n <h1>${ctx.name}</h1>\n {error ? <pre style={{ color: 'crimson' }}>{error}</pre> : <p>Calls so far: {count ?? '...'}</p>}\n </main>\n )\n}\n`\n}\n\nfunction srcApiTs(): string {\n return `// Tiny client for calling app routes/commands from the browser.\n// Two ways an app frontend reaches its backend on a botapp server:\n//\n// 1. Path-prefixed: /apps/<name>/api/commands/<cmd> (on bare apex)\n// 2. Subdomain: /api/apps/<name>/commands/<cmd> (on app subdomain)\n//\n// The subdomain dispatcher in the server leaves /api/* unrewritten on\n// subdomain hosts, so the frontend has to construct the absolute\n// /api/apps/<name>/... URL itself. We resolve <name> three ways and\n// take the first that works:\n// • from a /apps/<name>/ path prefix (host is the apex)\n// • from the first DNS label (host is <name>.<domain>)\n// • fallback: skip the /api/apps/<name> prefix (single-app local dev)\n\nfunction resolveAppName(): string | null {\n const m = location.pathname.match(/^\\\\/apps\\\\/([^/]+)\\\\//)\n if (m) return m[1]\n const host = location.hostname\n const first = host.split('.')[0]\n if (first && first !== 'www' && host.split('.').length >= 2) return first\n return null\n}\n\nconst APP_NAME = resolveAppName()\nconst API_BASE = APP_NAME ? \\`/api/apps/\\${APP_NAME}\\` : '/api'\n\nasync function call(kind: 'commands' | 'actions', name: string, params: Record<string, unknown>): Promise<unknown> {\n const r = await fetch(\\`\\${API_BASE}/\\${kind}/\\${encodeURIComponent(name)}\\`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n })\n if (!r.ok) throw new Error(await r.text())\n // The /api/apps/<name>/... handler wraps responses as\n // \\`{ status: 'success', result }\\` or \\`{ status: 'error', error }\\`.\n // Unwrap so callers see the bare result; throw on error.\n const json = (await r.json()) as { status?: string; result?: unknown; error?: string }\n if (json.status === 'error') throw new Error(json.error ?? 'unknown error')\n if (json.status === 'success') return json.result\n return json\n}\n\nexport async function callCommand(name: string, params: Record<string, unknown> = {}) {\n return call('commands', name, params)\n}\n\nexport async function callAction(name: string, params: Record<string, unknown> = {}) {\n return call('actions', name, params)\n}\n`\n}\n\nfunction contractsTs(ctx: TemplateContext): string {\n return `// Types shared between api/ (backend) and src/ (frontend).\n// Importing from one side picks up changes on the other immediately.\n\nexport interface ${pascal(ctx.name)}State {\n count: number\n}\n`\n}\n\nfunction gitignore(): string {\n return `node_modules/\ndist/\n.botapp-sim/\n*.log\n.DS_Store\n.env*.local\n`\n}\n\nfunction readme(ctx: TemplateContext, headless: boolean): string {\n const surfaces = headless\n ? '- Backend only (no frontend)'\n : '- React + Vite frontend (built to `dist/public/`)\\n- Dashboard widget (declared in `api/index.ts`)'\n return `# ${ctx.name}\n\n${ctx.description}\n\n## Surfaces\n\n${surfaces}\n- One agent-facing command: \\`hello\\`\n\n## Develop\n\n\\`\\`\\`bash\npnpm install\npnpm build # api → dist/api.js${headless ? '' : ', frontend → dist/public/'}\nbot login --server <your-botapp-server>\nbot simulate # dev-tunnel; hot-reload as you build\n\\`\\`\\`\n\nThe simulator opens a per-user shadow of this app on the server. Your\nreal dashboard at the server's URL routes the app to *your* local\nprocess; nobody else sees it.\n\n## Publish\n\n\\`\\`\\`bash\nbot publish # private, only you see it\nbot publish --public # requests admin review for public visibility\n\\`\\`\\`\n`\n}\n\n// ----- helpers -----\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' })[c]!)\n}\nfunction pascal(s: string): string {\n return s\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((w) => w[0]!.toUpperCase() + w.slice(1))\n .join('')\n}\nfunction dirname(p: string): string {\n const i = p.lastIndexOf('/')\n return i < 0 ? '.' : p.slice(0, i)\n}\n","// `bot publish [path]` — pack the local app's bundle and upload to the\n// configured server. Default visibility is private (only the uploader\n// sees it). `--public` requests admin review; the install stays private\n// in the meantime.\n\nimport { Command } from 'commander'\nimport { resolve, join, relative, sep } from 'node:path'\nimport { existsSync, readFileSync, statSync, readdirSync, createReadStream } from 'node:fs'\nimport { createGzip } from 'node:zlib'\nimport { spawn } from 'node:child_process'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\ninterface AppManifest {\n name: string\n version?: string\n description?: string\n entry?: string\n hasFrontend?: boolean\n [k: string]: unknown\n}\n\nexport const publishCommand = new Command('publish')\n .description('Build, pack, and upload an app to a botapp server')\n .argument('[path]', 'App directory', '.')\n .option('-s, --server <url>', 'Server URL (default: active profile / $BOTAPP_SERVER)')\n .option('-t, --token <token>', 'Auth token (default: active profile / $BOTAPP_TOKEN)')\n .option('--public', 'Request public visibility (queues admin review). Default: private.')\n .option('--no-build', 'Skip running `pnpm build` / `npm run build`')\n .option('--bundle-dir <dir>', 'Directory to bundle into tar.gz (default: dist/public if exists, else dist)')\n .action(async (appPath: string, opts: PublishOptions) => {\n const absPath = resolve(appPath)\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 const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as AppManifest\n if (!manifest.name) {\n console.error(pc.red('manifest missing \"name\"'))\n process.exitCode = 1\n return\n }\n\n const server = resolveServerUrl(opts.server)\n const token = resolveToken(opts.token)\n if (!token) {\n console.error(pc.red('not logged in: run `bot login` or pass --token'))\n process.exitCode = 1\n return\n }\n\n if (opts.build !== false) {\n console.log(pc.dim('building app...'))\n const ok = await runBuild(absPath)\n if (!ok) {\n console.error(pc.red('build failed; aborting'))\n process.exitCode = 1\n return\n }\n }\n\n const bundleDir = opts.bundleDir\n ? resolve(absPath, opts.bundleDir)\n : pickBundleDir(absPath)\n let bundleB64: string | undefined\n if (bundleDir && existsSync(bundleDir)) {\n console.log(pc.dim(`packing ${relative(absPath, bundleDir)}/ → tar.gz...`))\n const bytes = await packDirToTarGz(bundleDir)\n bundleB64 = bytes.toString('base64')\n console.log(pc.dim(` bundle: ${(bytes.length / 1024).toFixed(1)} KiB`))\n } else {\n console.log(pc.dim('no frontend bundle to upload (headless app or no dist/public)'))\n }\n\n console.log(pc.dim(`uploading to ${server}/api/apps/upload (${opts.public ? 'public' : 'private'})...`))\n const res = await fetch(`${server}/api/apps/upload`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({\n manifest,\n bundleB64,\n visibility: opts.public ? 'public' : 'private',\n }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(pc.red(`upload failed (${res.status}): ${body}`))\n process.exitCode = 1\n return\n }\n const data = (await res.json()) as { ok?: boolean; install?: any; message?: string; error?: string }\n if (!data.ok) {\n console.error(pc.red(`upload rejected: ${data.error ?? 'unknown'}`))\n process.exitCode = 1\n return\n }\n console.log(pc.green('✓'), data.message ?? 'uploaded')\n if (data.install) {\n console.log(pc.dim(` id: ${data.install.id}`))\n console.log(pc.dim(` version: ${data.install.version}`))\n console.log(pc.dim(` visibility: ${data.install.visibility}`))\n if (data.install.reviewStatus !== 'none') {\n console.log(pc.dim(` review: ${data.install.reviewStatus}`))\n }\n }\n })\n\ninterface PublishOptions {\n server?: string\n token?: string\n public?: boolean\n build?: boolean\n bundleDir?: string\n}\n\nfunction runBuild(cwd: string): Promise<boolean> {\n // Prefer pnpm if pnpm-lock exists, else npm.\n const pkgManager = existsSync(join(cwd, 'pnpm-lock.yaml')) ? 'pnpm' : 'npm'\n const args = pkgManager === 'pnpm' ? ['build'] : ['run', 'build']\n return new Promise((resolveP) => {\n const child = spawn(pkgManager, args, { cwd, stdio: 'inherit' })\n child.on('exit', (code) => resolveP(code === 0))\n child.on('error', () => resolveP(false))\n })\n}\n\nfunction pickBundleDir(appDir: string): string | null {\n const distPublic = join(appDir, 'dist', 'public')\n if (existsSync(distPublic)) return distPublic\n const dist = join(appDir, 'dist')\n if (existsSync(dist)) return dist\n return null\n}\n\nasync function packDirToTarGz(rootDir: string): Promise<Buffer> {\n // Hand-rolled minimal tar writer + gzip — we already extract this same\n // shape on the server side (see hosted/assets.ts). No tar dependency.\n const entries: Array<{ name: string; size: number; data: Buffer }> = []\n walk(rootDir, '', entries)\n const blocks: Buffer[] = []\n for (const e of entries) {\n blocks.push(tarHeader(e.name, e.size))\n blocks.push(e.data)\n const pad = (512 - (e.size % 512)) % 512\n if (pad) blocks.push(Buffer.alloc(pad))\n }\n blocks.push(Buffer.alloc(1024)) // two zero blocks = end\n const tar = Buffer.concat(blocks)\n return await gzip(tar)\n}\n\nfunction walk(root: string, prefix: string, out: Array<{ name: string; size: number; data: Buffer }>): void {\n for (const entry of readdirSync(root)) {\n const full = join(root, entry)\n const st = statSync(full)\n const rel = (prefix ? `${prefix}/` : '') + entry\n if (st.isDirectory()) {\n walk(full, rel, out)\n } else if (st.isFile()) {\n const data = readFileSync(full)\n out.push({ name: rel, size: data.length, data })\n }\n }\n}\n\nfunction tarHeader(name: string, size: number): Buffer {\n const h = Buffer.alloc(512)\n h.write(name.length > 100 ? name.slice(name.length - 100) : name, 0, 100)\n h.write('0000644', 100, 7)\n h.write('0000000', 108, 7)\n h.write('0000000', 116, 7)\n h.write(size.toString(8).padStart(11, '0'), 124, 11)\n h.write(Math.floor(Date.now() / 1000).toString(8).padStart(11, '0'), 136, 11)\n h.write(' ', 148, 8) // checksum placeholder\n h.write('0', 156, 1) // typeflag = file\n h.write('ustar ', 257, 8)\n let cksum = 0\n for (const b of h) cksum += b\n h.write(cksum.toString(8).padStart(6, '0') + '\\0 ', 148, 8)\n return h\n}\n\nfunction gzip(input: Buffer): Promise<Buffer> {\n return new Promise((resolveP, rejectP) => {\n const gz = createGzip()\n const chunks: Buffer[] = []\n gz.on('data', (c) => chunks.push(c as Buffer))\n gz.on('end', () => resolveP(Buffer.concat(chunks)))\n gz.on('error', rejectP)\n gz.end(input)\n })\n}\n","// `bot review list | approve | reject` — admin-only ops on the public-app\n// review queue. Backed by the server's /api/admin/review-queue and\n// /api/admin/review/:id endpoints. Caller must be authed as an admin\n// user (the server's authenticateUser callback decides the isAdmin flag).\n\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveServerUrl, resolveToken, authHeaders } from '../config/server'\n\nexport const reviewCommand = new Command('review')\n .description('Admin: review queue for public-visibility uploads')\n\nreviewCommand\n .command('list')\n .description('List pending public-visibility uploads')\n .option('-s, --server <url>', 'Server URL')\n .option('-t, --token <token>', 'Auth token')\n .action(async (opts) => {\n const server = resolveServerUrl(opts.server)\n const token = resolveToken(opts.token)\n if (!token) return die('not logged in: run `bot login` or pass --token')\n const res = await fetch(`${server}/api/admin/review-queue`, { headers: authHeaders(token) })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n return die(`request failed (${res.status}): ${body}`)\n }\n const data = (await res.json()) as { pending: any[] }\n if (!data.pending?.length) {\n console.log(pc.dim('queue empty'))\n return\n }\n for (const i of data.pending) {\n console.log(pc.bold(i.id), pc.cyan(i.appName), pc.dim(`v${i.version}`))\n console.log(pc.dim(` uploader: ${i.ownerUserId ?? '(server-wide)'}`))\n console.log(pc.dim(` uploaded: ${i.uploadedAt}`))\n const desc = i.manifest?.description\n if (desc) console.log(pc.dim(` description: ${desc}`))\n console.log()\n }\n })\n\nreviewCommand\n .command('approve <id>')\n .description('Approve a pending public install')\n .option('--notes <text>', 'Optional reviewer notes')\n .option('-s, --server <url>', 'Server URL')\n .option('-t, --token <token>', 'Auth token')\n .action(async (id, opts) => decide(id, 'approve', opts))\n\nreviewCommand\n .command('reject <id>')\n .description('Reject a pending public install')\n .requiredOption('--notes <text>', 'Reason for rejection (required)')\n .option('-s, --server <url>', 'Server URL')\n .option('-t, --token <token>', 'Auth token')\n .action(async (id, opts) => decide(id, 'reject', opts))\n\nasync function decide(\n id: string,\n decision: 'approve' | 'reject',\n opts: { notes?: string; server?: string; token?: string },\n): Promise<void> {\n const server = resolveServerUrl(opts.server)\n const token = resolveToken(opts.token)\n if (!token) return die('not logged in: run `bot login` or pass --token')\n const res = await fetch(`${server}/api/admin/review/${encodeURIComponent(id)}`, {\n method: 'POST',\n headers: authHeaders(token),\n body: JSON.stringify({ decision, notes: opts.notes }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n return die(`request failed (${res.status}): ${body}`)\n }\n const data = (await res.json()) as { ok?: boolean; install?: any; error?: string }\n if (!data.ok) return die(`server rejected: ${data.error ?? 'unknown'}`)\n console.log(pc.green('✓'), `${decision}d`, data.install?.appName, pc.dim(`(${data.install?.id})`))\n if (data.install?.reviewNotes) console.log(pc.dim(` notes: ${data.install.reviewNotes}`))\n}\n\nfunction die(msg: string): void {\n console.error(pc.red(msg))\n process.exitCode = 1\n}\n"],"mappings":"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","names":["Command","pc","existsSync","existsSync","spawn","randomUUID","existsSync","readFileSync","statSync","homedir","join","resolve","createInterface","Command","pc","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","parse","stringify","CONFIG_DIR","input","resolve","Command","pc","input","resolve","Command","pc","Buffer","homedir","join","resolve","walk","spawn","existsSync","statSync","homedir","join","isAbsolute","proc","ptyId","exited","resolve","Command","pc","join","homedir","existsSync","readFileSync","spawn","createInterface","output","input","randomUUID","statSync","request","resolve","Command","spawn","resolve","join","existsSync","mkdirSync","writeFileSync","homedir","createInterface","pc","spawn","pc","resolve","existsSync","readFileSync","homedir","join","createInterface","Command","pc","join","homedir","mkdirSync","existsSync","spawn","writeFileSync","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","WebSocket","pc","Command","pc","WebSocket","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","Command","pc","Command","pc","spawn","realpathSync","Command","pc","resolve","Command","resolve","join","existsSync","readFileSync","spawn","pc","Command","resolve","existsSync","pc","join","readFileSync","spawn","Command","existsSync","mkdirSync","writeFileSync","resolve","join","pc","dirname","Command","resolve","join","relative","existsSync","readFileSync","statSync","readdirSync","spawn","pc","Command","resolve","join","existsSync","pc","readFileSync","relative","spawn","readdirSync","statSync","input","Command","pc","Command","pc","Command","pc"]}