bazilion 0.14.1 → 0.14.2

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.
Files changed (48) hide show
  1. package/README.md +2 -1
  2. package/dist/cli.js +4 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/web/client/assets/{ConfirmDialog-BAiyYC8w.js → ConfirmDialog-_bmG-wVG.js} +1 -1
  5. package/dist/web/client/assets/{FieldRow-DsWhqiIQ.js → FieldRow-Do1cBkRc.js} +1 -1
  6. package/dist/web/client/assets/{ProductionTeamPolicyEditor-CHBKZMpY.js → ProductionTeamPolicyEditor-XP-QJul4.js} +1 -1
  7. package/dist/web/client/assets/{ProfileCommunicationEditor-DZ8yTQvV.js → ProfileCommunicationEditor-CwdFPdpk.js} +1 -1
  8. package/dist/web/client/assets/{TeamTabs-BfC1pfQe.js → TeamTabs-DIRiKcqx.js} +1 -1
  9. package/dist/web/client/assets/{TemplatesTabs-BwsLjN0Q.js → TemplatesTabs-D4WHvs6b.js} +1 -1
  10. package/dist/web/client/assets/{UnsavedChangesGuard-C7U9rsPw.js → UnsavedChangesGuard-B1aLqiK5.js} +1 -1
  11. package/dist/web/client/assets/{_id-CG9YM1tY.js → _id-3w4PFfma.js} +1 -1
  12. package/dist/web/client/assets/{_id-DtHL-U-0.js → _id-BH3v_vI_.js} +1 -1
  13. package/dist/web/client/assets/{_id-J0kM-98d.js → _id-Cx7o4Zmf.js} +1 -1
  14. package/dist/web/client/assets/{_id-DfzTSFBA.js → _id-DIiVVxBl.js} +1 -1
  15. package/dist/web/client/assets/{activity-CBQGMwWo.js → activity-A_HrG1Tv.js} +1 -1
  16. package/dist/web/client/assets/{agents-BWGBjF2Y.js → agents-BeeFCt2c.js} +1 -1
  17. package/dist/web/client/assets/{agents-DTY5RXgO.js → agents-C8OVKq3N.js} +1 -1
  18. package/dist/web/client/assets/{approvals-DwMk9S4Z.js → approvals-BIdZ9BSn.js} +1 -1
  19. package/dist/web/client/assets/{attention-7qYFtwOW.js → attention-B9bUrxiU.js} +1 -1
  20. package/dist/web/client/assets/chevron-right-VWrk_dTX.js +1 -0
  21. package/dist/web/client/assets/{config-D59MT3Y5.js → config-By86S7k-.js} +2 -2
  22. package/dist/web/client/assets/{inbox-CpKuNfOj.js → inbox-DlXQCJLe.js} +1 -1
  23. package/dist/web/client/assets/{index-BVfpuiby.js → index-CLdmsmiN.js} +2 -2
  24. package/dist/web/client/assets/{learning-631_q6a9.js → learning-BqZIw2nA.js} +1 -1
  25. package/dist/web/client/assets/{login-JjfTCGIb.js → login-CCMPXiny.js} +1 -1
  26. package/dist/web/client/assets/{mcp-DHgUOUPG.js → mcp-DKSY2yVa.js} +1 -1
  27. package/dist/web/client/assets/{members-CLCUdo-h.js → members-9GuOiq6J.js} +1 -1
  28. package/dist/web/client/assets/{memory-paAiM6ix.js → memory-DiGMI6FC.js} +1 -1
  29. package/dist/web/client/assets/{policy-Fy_Wnq6p.js → policy-TBGQffw5.js} +1 -1
  30. package/dist/web/client/assets/{routes-DciiC6QA.js → routes-g3yUOhCb.js} +1 -1
  31. package/dist/web/client/assets/{services-i_RmJYAO.js → services-1Z398CES.js} +1 -1
  32. package/dist/web/client/assets/{skills-BX42OGpp.js → skills-BP2gciFt.js} +1 -1
  33. package/dist/web/client/assets/{teams-4ySkP31k.js → teams-DBIivGT7.js} +1 -1
  34. package/dist/web/client/assets/{teams-D6nIPyC0.js → teams-tNoMDJ_M.js} +1 -1
  35. package/dist/web/client/assets/{telegram-CphoIRWP.js → telegram-CJG_DFdI.js} +1 -1
  36. package/dist/web/client/assets/{tokens-2j3NQudt.js → tokens-eDWCGQQ2.js} +1 -1
  37. package/dist/web/client/assets/{triggers-sDA075Nu.js → triggers-DZME3IcK.js} +1 -1
  38. package/dist/web/client/assets/{welcome-Do427w4M.js → welcome-B49sh_uf.js} +1 -1
  39. package/dist/web/client/assets/{wire-constants-B7b2CQp1.js → wire-constants-zZ7Wjb9C.js} +1 -1
  40. package/dist/web/client/assets/{x-CbAF-3_T.js → x-CHc7_-TH.js} +1 -1
  41. package/dist/web/server/assets/{_tanstack-start-manifest_v-DR7wyKcH.js → _tanstack-start-manifest_v-Duhf0z7H.js} +72 -72
  42. package/dist/web/server/assets/{config-XSTLuRaT.js → config-BmLq53tq.js} +3 -3
  43. package/dist/web/server/assets/{config-DQ8n0AwF.js → config-Wy6hnZ-Z.js} +1 -1
  44. package/dist/web/server/assets/{router-M0lutIDA.js → router-CY_pCgP1.js} +2 -2
  45. package/dist/web/server/assets/{welcome-B8nchXdF.js → welcome-BdQGR68o.js} +1 -1
  46. package/dist/web/server/server.js +2 -2
  47. package/package.json +6 -6
  48. package/dist/web/client/assets/chevron-right-DK703skW.js +0 -1
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../../../packages/client/src/index.ts","../src/auth-file.ts","../src/paths.ts","../src/client.ts","../src/commands/agent.ts","../src/columnize.ts","../src/commands/approval.ts","../src/commands/attention.ts","../src/commands/auth.ts","../src/commands/backup.ts","../src/backup-schema.ts","../src/daemon-liveness.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/commands/dashboard.ts","../src/commands/doctor.ts","../src/commands/gateway.ts","../src/commands/inbox.ts","../src/commands/login.ts","../src/commands/mcp.ts","../src/commands/memory.ts","../src/commands/profile.ts","../../../packages/api-types/src/index.ts","../src/commands/provider.ts","../src/commands/send.ts","../src/commands/serve.ts","../src/commands/session.ts","../src/commands/skill.ts","../src/commands/team.ts","../src/commands/team-policy.ts","../src/team-interchange.ts","../src/commands/team-template.ts","../src/commands/telegram.ts","../src/commands/token.ts","../src/commands/trigger.ts","../src/commands/uninstall.ts"],"sourcesContent":["import { defineCommand, runCommand, showUsage } from 'citty'\nimport pkg from '../package.json' with { type: 'json' }\nimport { ApiClientError } from './client.ts'\n\nconst VERSION = pkg.version\n\nimport { agentCommand } from './commands/agent.ts'\nimport { approvalCommand } from './commands/approval.ts'\nimport { attentionCommand } from './commands/attention.ts'\nimport { authCommand } from './commands/auth.ts'\nimport { backupCommand } from './commands/backup.ts'\nimport { completionCommand } from './commands/completion.ts'\nimport { configCommand } from './commands/config.ts'\nimport { dashboardCommand } from './commands/dashboard.ts'\nimport { doctorCommand } from './commands/doctor.ts'\nimport { gatewayCommand } from './commands/gateway.ts'\nimport { inboxCommand } from './commands/inbox.ts'\nimport { loginCommand } from './commands/login.ts'\nimport { mcpCommand } from './commands/mcp.ts'\nimport { memoryCommand } from './commands/memory.ts'\nimport { profileCommand } from './commands/profile.ts'\nimport { providerCommand } from './commands/provider.ts'\nimport { sendCommand } from './commands/send.ts'\nimport { serveCommand } from './commands/serve.ts'\nimport { sessionCommand } from './commands/session.ts'\nimport { skillCommand } from './commands/skill.ts'\nimport { teamCommand } from './commands/team.ts'\nimport { teamTemplateCommand } from './commands/team-template.ts'\nimport { telegramCommand } from './commands/telegram.ts'\nimport { tokenCommand } from './commands/token.ts'\nimport { triggerCommand } from './commands/trigger.ts'\nimport { uninstallCommand } from './commands/uninstall.ts'\n\nconst main = defineCommand({\n meta: {\n name: 'bazilion',\n version: VERSION,\n description: 'Multi-agent runtime',\n },\n subCommands: {\n login: loginCommand,\n profile: profileCommand,\n team: teamCommand,\n 'team-template': teamTemplateCommand,\n agent: agentCommand,\n approval: approvalCommand,\n attention: attentionCommand,\n skill: skillCommand,\n memory: memoryCommand,\n mcp: mcpCommand,\n provider: providerCommand,\n send: sendCommand,\n session: sessionCommand,\n inbox: inboxCommand,\n config: configCommand,\n serve: serveCommand,\n dashboard: dashboardCommand,\n doctor: doctorCommand,\n gateway: gatewayCommand,\n backup: backupCommand,\n trigger: triggerCommand,\n token: tokenCommand,\n auth: authCommand,\n telegram: telegramCommand,\n uninstall: uninstallCommand,\n },\n})\n\n// Mutate the command tree after definition so `completion` can introspect its\n// own siblings without a circular import. Cast is safe — citty keeps the\n// object reference on `main` after defineCommand, and we know its shape.\n;(main.subCommands as Record<string, unknown>).completion = completionCommand(main as never)\n\n// Resolve `bazilion <a> <b> --help` to the right subcommand for showUsage.\n// citty's built-in version is private, so we re-implement it for plain\n// subCommands objects (the shape we use throughout the tree).\ntype AnyCmd = Parameters<typeof showUsage>[0]\ntype CmdWithSubs = AnyCmd & { subCommands?: Record<string, AnyCmd> }\nasync function resolveSubCommand(\n cmd: CmdWithSubs,\n rawArgs: string[],\n parent?: AnyCmd,\n): Promise<[AnyCmd, AnyCmd | undefined]> {\n const subs = cmd.subCommands\n if (subs && Object.keys(subs).length > 0) {\n const idx = rawArgs.findIndex((a) => !a.startsWith('-'))\n const name = idx >= 0 ? rawArgs[idx] : undefined\n if (name && subs[name]) {\n return resolveSubCommand(subs[name] as CmdWithSubs, rawArgs.slice(idx + 1), cmd)\n }\n }\n return [cmd, parent]\n}\n\nfunction printError(err: unknown): void {\n if (err instanceof ApiClientError) {\n console.error(`error: ${err.body.error}`)\n if (err.status === 401) {\n console.error(' hint: token mismatch. Check ~/.bazilion/auth.json \"token\"')\n console.error(' or re-run \"bazilion login\" for a remote server.')\n } else if (err.status === 403) {\n console.error(' hint: request was rejected by the server. If you hit this from a')\n console.error(' fresh CLI build, check that BAZILION_SERVER matches the')\n console.error(' server origin exactly (scheme + host + port).')\n }\n return\n }\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`error: ${msg}`)\n // Friendly hints for the most common connection failures. node's fetch\n // wraps the syscall error in err.cause.code, so we peek there too.\n const cause = err instanceof Error ? (err as { cause?: { code?: string } }).cause : undefined\n const code = cause?.code\n if (code === 'ECONNREFUSED' || /ECONNREFUSED/.test(msg)) {\n console.error(' hint: the bazilion server is not running. Start it with \"bazilion serve\"')\n console.error(' or point BAZILION_SERVER at a running instance.')\n } else if (code === 'ENOTFOUND' || /ENOTFOUND/.test(msg)) {\n console.error(' hint: host not found. Check BAZILION_SERVER / ~/.bazilion/auth.json.')\n }\n}\n\nfunction exitCodeForError(err: unknown): number {\n if (err instanceof ApiClientError) {\n if (err.status === 401 || err.status === 403) return 4\n if (err.status === 409) return 3\n if (err.status === 400 || err.status === 422) return 2\n return 1\n }\n const message = err instanceof Error ? err.message : String(err)\n return /invalid|unsupported|must be|require|refusing mutation|document belongs/.test(message)\n ? 2\n : 1\n}\n\n/**\n * Top-level `bazilion --help` renders a categorized layout instead of citty's\n * default `sub1|sub2|…` pipe-soup USAGE line. Subcommand `--help` still uses\n * citty's built-in renderer.\n */\nfunction printTopLevelHelp(): void {\n console.log(`Multi-agent runtime (bazilion v${VERSION})`)\n console.log('')\n console.log('USAGE bazilion <command> [args]')\n console.log('')\n const teams: { title: string; items: [string, string][] }[] = [\n {\n title: 'setup',\n items: [\n ['serve', 'Start the bazilion daemon (auto-bootstraps ~/.bazilion on first run)'],\n ['dashboard', 'Start the daemon + bundled web UI, then open the dashboard'],\n ['doctor', 'Diagnose your bazilion install'],\n ['uninstall', 'Wipe bazilion state from ~/.bazilion (or BAZILION_HOME)'],\n ],\n },\n {\n title: 'catalog',\n items: [\n ['profile', 'Manage profiles (templates agents are spawned from)'],\n ['team-template', 'Inspect and exchange reusable Team Templates'],\n ['team', 'Manage teams (collaboration context — filesystem root + USER.md + roster)'],\n ['skill', 'Manage the skill library'],\n ['provider', 'Manage and test LLM providers'],\n ['config', 'Manage service config (credentials + URLs/IDs)'],\n ['auth', 'OAuth provider sign-in (ChatGPT account, …)'],\n ],\n },\n {\n title: 'agents',\n items: [\n ['approval', 'Review and decide communication approval attempts'],\n ['attention', 'See everything that needs operator attention'],\n ['agent', 'Spawn, list, chat, archive agents'],\n ['memory', \"Read/write a team's shared memory\"],\n ['send', 'Send a message from one agent to another'],\n ['inbox', 'Inspect agent inboxes'],\n ['trigger', 'Manage scheduled agent triggers'],\n ],\n },\n {\n title: 'integrations',\n items: [['telegram', 'Telegram bot setup, health, lifecycle']],\n },\n {\n title: 'ops',\n items: [['backup', 'Encrypted backup, restore, and credential recovery']],\n },\n {\n title: 'remote',\n items: [\n ['login', 'Save a remote bazilion server + token pair to auth.json'],\n ['token', 'Manage web tokens for API/CLI clients'],\n ],\n },\n {\n title: 'shell',\n items: [['completion', 'Print shell completion script (bash | zsh | fish)']],\n },\n ]\n const nameWidth = 15\n for (const g of teams) {\n console.log(` ${g.title}`)\n for (const [name, desc] of g.items) {\n console.log(` ${name.padEnd(nameWidth)}${desc}`)\n }\n console.log('')\n }\n console.log('Use `bazilion <command> --help` for more information about a command.')\n}\n\nasync function entry(): Promise<void> {\n const rawArgs = process.argv.slice(2)\n try {\n if (rawArgs.includes('--help') || rawArgs.includes('-h')) {\n // For the top-level `bazilion --help`, render our grouped layout.\n // Subcommand help still goes through citty (preserves native formatting).\n const firstPositional = rawArgs.find((a) => !a.startsWith('-'))\n if (!firstPositional) {\n printTopLevelHelp()\n process.exit(0)\n }\n const [target, parent] = await resolveSubCommand(main as CmdWithSubs, rawArgs)\n await showUsage(target, parent)\n process.exit(0)\n }\n if (rawArgs.length === 1 && (rawArgs[0] === '--version' || rawArgs[0] === '-v')) {\n console.log(VERSION)\n return\n }\n await runCommand(main, { rawArgs })\n } catch (err) {\n printError(err)\n process.exit(exitCodeForError(err))\n }\n}\n\nentry()\n","{\n \"name\": \"bazilion\",\n \"version\": \"0.14.1\",\n \"description\": \"Multi-agent runtime CLI — spawn LLM agents, manage profiles/teams/skills, and run the local daemon.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rullopat/bazilion.git\",\n \"directory\": \"apps/cli\"\n },\n \"homepage\": \"https://bazilion.com\",\n \"bugs\": {\n \"url\": \"https://github.com/rullopat/bazilion/issues\"\n },\n \"keywords\": [\n \"agent\",\n \"agents\",\n \"ai\",\n \"cli\",\n \"daemon\",\n \"llm\",\n \"local-first\",\n \"multi-agent\",\n \"openclaw\",\n \"skills\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"bazilion\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"pnpm --filter @bazilion/web build && tsup\"\n },\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@earendil-works/pi-agent-core\": \"0.84.3\",\n \"@earendil-works/pi-ai\": \"0.84.3\",\n \"@earendil-works/pi-coding-agent\": \"0.84.3\",\n \"@hono/node-server\": \"^2.0.6\",\n \"@mozilla/readability\": \"^0.6.0\",\n \"@playwright/browser-chromium\": \"^1.61.0\",\n \"@tanstack/react-router\": \"1.170.16\",\n \"@tobilu/qmd\": \"^2.5.3\",\n \"adm-zip\": \"^0.5.17\",\n \"age-encryption\": \"0.3.0\",\n \"citty\": \"^0.2.2\",\n \"dompurify\": \"^3.4.11\",\n \"grammy\": \"^1.44.0\",\n \"hono\": \"^4.12.26\",\n \"linkedom\": \"^0.18.12\",\n \"lucide-react\": \"^1.21.0\",\n \"playwright\": \"^1.61.0\",\n \"qrcode-terminal\": \"^0.12.0\",\n \"react\": \"^19.2.7\",\n \"react-dom\": \"^19.2.7\",\n \"tar\": \"^7.5.16\",\n \"typebox\": \"^1.3.0\",\n \"undici\": \"^8.5.0\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@bazilion/api-types\": \"workspace:*\",\n \"@bazilion/client\": \"workspace:*\",\n \"@types/adm-zip\": \"^0.5.8\",\n \"@types/qrcode-terminal\": \"^0.12.2\"\n }\n}\n","import type { ApiError } from '@bazilion/api-types'\n\nexport type TokenSource = string | (() => string | Promise<string>)\n\nexport interface ClientConfig {\n serverUrl: string\n /**\n * Bearer token (or supplier for lazy / rotating credentials). The package\n * sends it as `Authorization: Bearer <token>` and also stamps `Origin:\n * <serverUrl>` to pass Astro's `security.checkOrigin` gate on non-GET\n * requests. Pass a function to support token rotation (OAuth refresh,\n * mobile keychain reads) — it is invoked on every request.\n */\n token: TokenSource | null\n /** Additional request headers for trusted adapters such as the web SSR session bridge. */\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n}\n\nexport class ApiClientError extends Error {\n status: number\n body: ApiError\n constructor(status: number, body: ApiError) {\n super(`${status}: ${body.error}`)\n this.status = status\n this.body = body\n }\n}\n\nasync function resolveToken(src: TokenSource): Promise<string> {\n return typeof src === 'function' ? await src() : src\n}\n\nexport function createClient(cfg: ClientConfig) {\n async function authHeaders(): Promise<Record<string, string>> {\n const token = cfg.token === null ? null : await resolveToken(cfg.token)\n const extra = typeof cfg.headers === 'function' ? await cfg.headers() : (cfg.headers ?? {})\n return {\n ...(token ? { authorization: `Bearer ${token}` } : {}),\n // Astro 6 enabled `security.checkOrigin` by default for server mode:\n // any state-changing request without an `Origin` matching the server\n // host is rejected with 403. Browsers set this automatically; `fetch`\n // in Node / React Native does not. Stamping the server's own URL is\n // always valid for a legitimate client.\n origin: cfg.serverUrl,\n ...extra,\n }\n }\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = { ...(await authHeaders()) }\n if (body !== undefined) headers['content-type'] = 'application/json'\n const res = await fetch(`${cfg.serverUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n if (!res.ok) {\n const err = (await res.json().catch(() => ({ error: res.statusText }))) as ApiError\n throw new ApiClientError(res.status, err)\n }\n if (res.status === 204) return undefined as T\n return (await res.json()) as T\n }\n\n // Multipart POST — lets the runtime set its own `content-type: multipart/form-data;\n // boundary=…` header. Reusing `request()` would stomp that with JSON, so\n // we keep a separate path.\n async function postMultipart<T>(path: string, form: FormData): Promise<T> {\n const res = await fetch(`${cfg.serverUrl}${path}`, {\n method: 'POST',\n headers: { ...(await authHeaders()) },\n body: form,\n })\n if (!res.ok) {\n const err = (await res.json().catch(() => ({ error: res.statusText }))) as ApiError\n throw new ApiClientError(res.status, err)\n }\n if (res.status === 204) return undefined as T\n return (await res.json()) as T\n }\n\n async function* stream<T>(method: string, path: string, body?: unknown): AsyncGenerator<T> {\n const headers: Record<string, string> = { ...(await authHeaders()) }\n if (body !== undefined) headers['content-type'] = 'application/json'\n const res = await fetch(`${cfg.serverUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n if (!res.ok || !res.body) {\n const err = (await res.json().catch(() => ({ error: res.statusText }))) as ApiError\n throw new ApiClientError(res.status, err)\n }\n const reader = res.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim()) yield JSON.parse(line) as T\n }\n }\n if (buffer.trim()) yield JSON.parse(buffer) as T\n }\n\n return {\n get: <T>(p: string) => request<T>('GET', p),\n post: <T>(p: string, b?: unknown) => request<T>('POST', p, b),\n postMultipart,\n put: <T>(p: string, b?: unknown) => request<T>('PUT', p, b),\n patch: <T>(p: string, b?: unknown) => request<T>('PATCH', p, b),\n del: <T>(p: string) => request<T>('DELETE', p),\n stream,\n }\n}\n\nexport type BazilionClient = ReturnType<typeof createClient>\n","import { existsSync, readFileSync } from 'node:fs'\n\nexport interface AuthFile {\n token: string\n remote?: { server: string; token: string } | null\n}\n\nexport function readAuthFile(authFile: string): AuthFile {\n if (!existsSync(authFile)) {\n throw new Error(`${authFile} not found. Start the daemon with \\`bazilion serve\\` first.`)\n }\n const raw = readFileSync(authFile, 'utf8')\n const parsed = JSON.parse(raw) as Partial<AuthFile>\n if (typeof parsed.token !== 'string' || !parsed.token) {\n throw new Error(`${authFile} is missing the \"token\" field`)\n }\n return { token: parsed.token, remote: parsed.remote ?? null }\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport interface CliPaths {\n home: string\n authFile: string\n}\n\nexport function resolveCliPaths(home?: string): CliPaths {\n const root = home ?? process.env.BAZILION_HOME ?? join(homedir(), '.bazilion')\n return { home: root, authFile: join(root, 'auth.json') }\n}\n","import { type BazilionClient, createClient as createPackageClient } from '@bazilion/client'\nimport { readAuthFile } from './auth-file.ts'\nimport { resolveCliPaths } from './paths.ts'\n\nexport type { BazilionClient } from '@bazilion/client'\nexport { ApiClientError } from '@bazilion/client'\n\nexport interface ClientConfig {\n serverUrl: string\n token: string\n}\n\nexport function loadClientConfig(): ClientConfig {\n const envUrl = process.env.BAZILION_SERVER\n const envToken = process.env.BAZILION_TOKEN\n if (envUrl && envToken) return { serverUrl: envUrl, token: envToken }\n\n const paths = resolveCliPaths()\n const auth = readAuthFile(paths.authFile)\n // `bazilion login` writes `remote`; when present it targets another host\n // (Tailscale, LAN). Env vars still win so CI / ad-hoc invocations can\n // override without editing auth.json.\n if (auth.remote?.server && auth.remote.token) {\n return {\n serverUrl: envUrl ?? auth.remote.server,\n token: auth.remote.token,\n }\n }\n return {\n serverUrl: envUrl ?? 'http://127.0.0.1:4321',\n token: auth.token,\n }\n}\n\nexport function createClient(cfg: ClientConfig = loadClientConfig()): BazilionClient {\n return createPackageClient({ serverUrl: cfg.serverUrl, token: cfg.token })\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport { basename, extname } from 'node:path'\nimport { stdin, stdout } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport type {\n Agent,\n AgentLessonProposal,\n AgentLessonProposalResponse,\n AgentLessonStatus,\n AgentReviewConfig,\n Attachment,\n AttachSkillRequest,\n BashApprovalMode,\n ChatCompactRequest,\n ChatCompactResponse,\n ChatContextResponse,\n ChatFrame,\n ChatRequest,\n CommandApproval,\n CommandApprovalDecisionRequest,\n EnqueueAgentReviewResponse,\n ListAgentLessonProposalsResponse,\n ListAgentReviewsResponse,\n MoveAgentRequest,\n ResolvedAgent,\n ResolvedTeamPolicy,\n SessionEvent,\n SessionHeadResponse,\n SkillScanFinding,\n SpawnAgentRequest,\n TruncateChatRequest,\n TruncateChatResponse,\n UpdateAgentReviewConfigRequest,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { ApiClientError, createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst IMAGE_MIME: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n}\n\n/** Read image file paths into base64 attachments (image mime → routed to vision). */\nfunction loadImages(paths: string[]): Attachment[] {\n return paths.map((p) => {\n const mimeType = IMAGE_MIME[extname(p).toLowerCase()]\n if (!mimeType) throw new Error(`unsupported image type: ${p} (png/jpg/gif/webp only)`)\n return { name: basename(p), mimeType, data: readFileSync(p).toString('base64') }\n })\n}\n\nconst FILE_MIME: Record<string, string> = {\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.html': 'text/html',\n '.zip': 'application/zip',\n}\n\n/** Read arbitrary file paths into base64 attachments (non-image → stored + referenced). */\nfunction loadFiles(paths: string[]): Attachment[] {\n return paths.map((p) => ({\n name: basename(p),\n mimeType: FILE_MIME[extname(p).toLowerCase()] ?? 'application/octet-stream',\n data: readFileSync(p).toString('base64'),\n }))\n}\n\n/** citty gives a string for one flag, an array for several — normalize. */\nfunction asPaths(v: string | string[] | undefined): string[] {\n return v ? (Array.isArray(v) ? v : [v]) : []\n}\n\nconst spawnCmd = defineCommand({\n meta: { name: 'spawn', description: 'Spawn an agent from a profile into a team' },\n args: {\n profile: { type: 'string', required: true, description: 'Profile id' },\n name: { type: 'string', description: 'Agent name (defaults to profile name)' },\n team: {\n type: 'string',\n description: \"Team to join (defaults to 'default')\",\n },\n model: { type: 'string', description: 'Override profile default model' },\n reasoning: {\n type: 'string',\n description: 'Reasoning level: off|minimal|low|medium|high|xhigh (default: medium)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const teamId = args.team ?? 'default'\n const policy = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(teamId)}/policy`,\n )\n const body: SpawnAgentRequest = {\n profileId: args.profile,\n name: args.name,\n model: args.model,\n reasoningLevel: args.reasoning as SpawnAgentRequest['reasoningLevel'],\n teamId,\n teamExpectedRevision: policy.teamPolicy.revision,\n placement: 'profile_defaults',\n }\n const response = await client.post<{ agent: Agent }>('/api/agents', body)\n const agent = response.agent\n console.log(`spawned agent ${agent.id} (${agent.name})`)\n console.log(`dir: ${agent.dir}`)\n },\n})\n\nconst editCmd = defineCommand({\n meta: {\n name: 'edit',\n description: 'Edit agent settings (name, model override, reasoning level, telegram mirror)',\n },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n name: { type: 'string', description: 'Rename the agent' },\n model: { type: 'string', description: 'Set model override (use --model \"\" to clear)' },\n reasoning: {\n type: 'string',\n description: 'Reasoning level: off|minimal|low|medium|high|xhigh',\n },\n mirror: {\n type: 'string',\n description: 'Telegram mirror verbosity: minimal|verbose',\n },\n 'topic-icon': {\n type: 'string',\n description: 'Telegram topic emoji (e.g. 📚). Use --topic-icon \"\" to clear.',\n },\n },\n async run({ args }) {\n if (\n args.name === undefined &&\n args.model === undefined &&\n args.reasoning === undefined &&\n args.mirror === undefined &&\n args['topic-icon'] === undefined\n ) {\n console.error(\n 'agent edit: specify at least one of --name, --model, --reasoning, --mirror, --topic-icon',\n )\n process.exit(2)\n }\n const client = createClient()\n const body: Record<string, unknown> = {}\n if (args.name !== undefined) body.name = args.name\n if (args.model !== undefined) {\n body.modelOverride = args.model === '' ? null : args.model\n }\n if (args.reasoning !== undefined) body.reasoningLevel = args.reasoning\n if (args.mirror !== undefined) {\n if (args.mirror !== 'minimal' && args.mirror !== 'verbose') {\n console.error(`agent edit: --mirror must be 'minimal' or 'verbose'`)\n process.exit(2)\n }\n body.telegramMirrorMode = args.mirror\n }\n if (args['topic-icon'] !== undefined) {\n body.telegramIconEmoji = args['topic-icon'] === '' ? null : args['topic-icon']\n }\n const agent = await client.patch<Agent>(`/api/agents/${args.id}`, body)\n console.log(`updated agent ${agent.id} (${agent.name})`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List agents' },\n args: {\n all: { type: 'boolean', description: 'Include archived agents' },\n long: { type: 'boolean', alias: 'l', description: 'Show profile + full UUID columns' },\n },\n async run({ args }) {\n const client = createClient()\n const q = args.all ? '?includeArchived=true' : ''\n const list = await client.get<Agent[]>(`/api/agents${q}`)\n if (list.length === 0) {\n console.log('(no agents)')\n return\n }\n const rows = list.map((a) =>\n args.long\n ? [a.id, a.status, a.name, a.profileId]\n : // Short UUID prefix — all CLI commands accept 4+ char prefixes now.\n [a.id.slice(0, 8), a.status, a.name],\n )\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show agent details' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const r = await client.get<ResolvedAgent>(`/api/agents/${args.id}`)\n console.log(`# ${r.agent.id}`)\n console.log(`name: ${r.agent.name}`)\n console.log(`status: ${r.agent.status}`)\n console.log(`profile: ${r.profile.id}`)\n console.log(`model: ${r.model}`)\n console.log(`dir: ${r.agent.dir}`)\n console.log(`team: ${r.team.id} ${r.team.path}`)\n console.log('skills:')\n if (r.skills.length === 0) {\n console.log(' (none)')\n } else {\n for (const s of r.skills) console.log(` ${s}`)\n }\n },\n})\n\nconst archiveCmd = defineCommand({\n meta: { name: 'archive', description: 'Archive an agent' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.post(`/api/agents/${args.id}/archive`)\n console.log(`archived agent ${args.id}`)\n },\n})\n\nconst unarchiveCmd = defineCommand({\n meta: { name: 'unarchive', description: 'Restore an archived agent to idle' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.post(`/api/agents/${args.id}/unarchive`)\n console.log(`unarchived agent ${args.id}`)\n },\n})\n\nconst deleteCmd = defineCommand({\n meta: { name: 'delete', description: 'Permanently delete an agent and its data' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const agent = await client.get<ResolvedAgent>(`/api/agents/${encodeURIComponent(args.id)}`)\n const policy = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(agent.team.id)}/policy`,\n )\n await client.del(\n `/api/agents/${encodeURIComponent(args.id)}?expectedTeamRevision=${policy.teamPolicy.revision}`,\n )\n console.log(`deleted agent ${args.id}`)\n },\n})\n\n// --- chat ---\n\ninterface PrintState {\n inDeltaStream: boolean\n}\n\ntype CommandApprovalDecision = CommandApprovalDecisionRequest['decision']\n\ninterface CommandApprovalClient {\n post(path: string, body?: unknown): Promise<unknown>\n}\n\nexport interface CommandApprovalPrompt {\n question(prompt: string): Promise<string>\n write(line: string): void\n}\n\n/** Only a real terminal can answer while the chat response stream remains open. */\nexport function bashApprovalModeForTty(\n inputIsTty: boolean | undefined,\n outputIsTty: boolean | undefined,\n): BashApprovalMode {\n return inputIsTty && outputIsTty ? 'interactive' : 'auto_deny'\n}\n\n/** Build every CLI chat request with an explicit approval capability. */\nexport function buildChatRequest(\n message: string,\n attachments: Attachment[] | undefined,\n bashApprovalMode: BashApprovalMode,\n): ChatRequest {\n return {\n message,\n bashApprovalMode,\n ...(attachments && attachments.length > 0 ? { attachments } : {}),\n }\n}\n\nfunction terminalSafe(value: string): string {\n let safe = ''\n for (const character of value) {\n const code = character.charCodeAt(0)\n const isControl = code <= 9 || (code >= 11 && code <= 31) || (code >= 127 && code <= 159)\n safe += isControl ? `\\\\x${code.toString(16).padStart(2, '0')}` : character\n }\n return safe\n}\n\n/** Render one pending command and default safely to denial for every answer except y/yes. */\nexport async function promptForCommandApproval(\n approval: CommandApproval,\n prompt: CommandApprovalPrompt,\n): Promise<CommandApprovalDecision> {\n prompt.write(' [shell command approval required]')\n prompt.write(' command:')\n for (const line of approval.command.split('\\n')) prompt.write(` ${terminalSafe(line)}`)\n prompt.write(' risks:')\n for (const risk of approval.risks) {\n prompt.write(\n ` - ${terminalSafe(risk.code)} (${terminalSafe(risk.severity)}): ${terminalSafe(risk.message)}`,\n )\n }\n\n try {\n const answer = (await prompt.question(' Allow this command once? [y/N] ')).trim().toLowerCase()\n return answer === 'y' || answer === 'yes' ? 'allow' : 'deny'\n } catch {\n prompt.write(' [approval input unavailable; denying]')\n return 'deny'\n }\n}\n\n/** Post exactly one response for a pending approval; callers without a prompt deny immediately. */\nexport async function respondToCommandApproval(\n client: CommandApprovalClient,\n approval: CommandApproval,\n prompt?: CommandApprovalPrompt,\n): Promise<CommandApprovalDecision> {\n const decision = prompt ? await promptForCommandApproval(approval, prompt) : 'deny'\n await client.post(`/api/shell-approvals/${encodeURIComponent(approval.id)}`, { decision })\n return decision\n}\n\nfunction closeDeltaLine(state: PrintState): void {\n if (!state.inDeltaStream) return\n process.stdout.write('\\n')\n state.inDeltaStream = false\n}\n\nfunction printCommandApprovalStatus(approval: CommandApproval): void {\n switch (approval.status) {\n case 'allowed':\n console.log(' [shell command allowed]')\n break\n case 'denied':\n console.log(' [shell command denied]')\n break\n case 'auto_denied':\n console.log(' [shell command auto-denied: non-interactive turn]')\n break\n case 'expired':\n console.log(' [shell command approval expired]')\n break\n case 'cancelled':\n console.log(' [shell command approval cancelled]')\n break\n case 'pending':\n break\n }\n}\n\nfunction printEvent(e: SessionEvent, state: PrintState): void {\n switch (e.type) {\n case 'assistant_delta':\n process.stdout.write(e.delta)\n state.inDeltaStream = true\n break\n case 'assistant_message':\n if (state.inDeltaStream) {\n // Deltas already rendered the text; just close the line.\n process.stdout.write('\\n')\n state.inDeltaStream = false\n } else {\n console.log(e.text)\n }\n break\n case 'tool_call':\n if (state.inDeltaStream) {\n process.stdout.write('\\n')\n state.inDeltaStream = false\n }\n console.log(` [tool: ${e.name} ${e.arguments}]`)\n break\n case 'tool_result':\n console.log(` [result: ${e.result.split('\\n')[0]?.slice(0, 100)}]`)\n break\n case 'tool_error':\n console.log(` [tool error: ${e.name} — ${e.error}]`)\n break\n case 'file': {\n if (state.inDeltaStream) {\n process.stdout.write('\\n')\n state.inDeltaStream = false\n }\n const out = basename(e.name).replace(/[^\\w.-]/g, '_') || 'file'\n writeFileSync(out, Buffer.from(e.data, 'base64'))\n console.log(` [file received: saved to ./${out} (${e.mimeType})]`)\n break\n }\n case 'error':\n if (state.inDeltaStream) {\n process.stdout.write('\\n')\n state.inDeltaStream = false\n }\n console.log(` [error: ${e.error}]`)\n break\n }\n}\n\nasync function streamTurn(\n client: ReturnType<typeof createClient>,\n agentId: string,\n message: string,\n attachments?: Attachment[],\n options: {\n bashApprovalMode: BashApprovalMode\n approvalPrompt?: CommandApprovalPrompt\n } = { bashApprovalMode: 'auto_deny' },\n): Promise<void> {\n const state: PrintState = { inDeltaStream: false }\n const respondedApprovalIds = new Set<string>()\n for await (const frame of client.stream<ChatFrame>(\n 'POST',\n `/api/agents/${agentId}/chat`,\n buildChatRequest(message, attachments, options.bashApprovalMode),\n )) {\n if (frame.kind === 'event') {\n // A pending approval pauses rendering while we post a response on a\n // separate authenticated request; other events remain synchronous.\n const event = frame.event\n if (event.type === 'command_approval') {\n closeDeltaLine(state)\n const approval = event.approval\n if (approval.status === 'pending') {\n if (!respondedApprovalIds.has(approval.id)) {\n respondedApprovalIds.add(approval.id)\n await respondToCommandApproval(client, approval, options.approvalPrompt)\n }\n } else {\n printCommandApprovalStatus(approval)\n }\n } else if (event.type !== 'user_message') {\n printEvent(event, state)\n }\n } else if (frame.kind === 'fatal') {\n closeDeltaLine(state)\n throw new Error(frame.error)\n }\n }\n}\n\nconst chatCmd = defineCommand({\n meta: { name: 'chat', description: 'Chat with an agent' },\n args: {\n id: { type: 'positional', required: true },\n message: {\n type: 'string',\n description: 'Send a single message and exit (one-shot mode)',\n },\n image: {\n type: 'string',\n description: 'Attach an image file (png/jpg/gif/webp; repeatable). One-shot mode.',\n },\n file: {\n type: 'string',\n description: 'Attach any file — the agent gets a path reference (repeatable). One-shot mode.',\n },\n },\n async run({ args }) {\n const client = createClient()\n const resolved = await client.get<ResolvedAgent>(`/api/agents/${args.id}`)\n const bashApprovalMode = bashApprovalModeForTty(stdin.isTTY, stdout.isTTY)\n\n const attachments = [\n ...loadImages(asPaths(args.image as string | string[] | undefined)),\n ...loadFiles(asPaths(args.file as string | string[] | undefined)),\n ]\n\n if (args.message || attachments.length > 0) {\n const rl =\n bashApprovalMode === 'interactive'\n ? createInterface({ input: stdin, output: stdout })\n : null\n try {\n await streamTurn(client, resolved.agent.id, args.message ?? '', attachments, {\n bashApprovalMode,\n ...(rl\n ? {\n approvalPrompt: {\n question: (question) => rl.question(question),\n write: (line) => console.log(line),\n },\n }\n : {}),\n })\n } finally {\n rl?.close()\n }\n return\n }\n\n console.log(`chatting with ${resolved.agent.name} (${resolved.model})`)\n console.log('(type /exit to quit)')\n\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n if (bashApprovalMode === 'interactive') {\n // Sequential questions keep one readline instance as the sole stdin\n // owner. A command-approval question can safely run after the chat\n // question resolves; no async iterator is consuming lines in parallel.\n while (true) {\n let line: string\n try {\n line = await rl.question('> ')\n } catch {\n break\n }\n const trimmed = line.trim()\n if (trimmed === '/exit' || trimmed === '/quit') break\n if (!trimmed) continue\n try {\n await streamTurn(client, resolved.agent.id, trimmed, undefined, {\n bashApprovalMode,\n approvalPrompt: {\n question: (question) => rl.question(question),\n write: (output) => console.log(output),\n },\n })\n } catch (err) {\n console.error(`error: ${(err as Error).message}`)\n }\n }\n } else {\n // Preserve piped multi-line chat input, but never claim that this\n // caller can answer an approval request.\n rl.setPrompt('> ')\n rl.prompt()\n for await (const line of rl) {\n const trimmed = line.trim()\n if (trimmed === '/exit' || trimmed === '/quit') break\n if (!trimmed) {\n rl.prompt()\n continue\n }\n try {\n await streamTurn(client, resolved.agent.id, trimmed, undefined, {\n bashApprovalMode,\n })\n } catch (err) {\n console.error(`error: ${(err as Error).message}`)\n }\n rl.prompt()\n }\n }\n } finally {\n rl.close()\n }\n },\n})\n\nconst chatResetCmd = defineCommand({\n meta: { name: 'chat-reset', description: \"Reset an agent's chat history to empty\" },\n args: {\n id: { type: 'positional', required: true },\n force: { type: 'boolean', description: 'Skip the y/N prompt' },\n },\n async run({ args }) {\n if (!args.force) {\n process.stdout.write(`reset all chat history for ${args.id}? [y/N] `)\n const answer = await new Promise<string>((resolve) => {\n process.stdin.once('data', (d) => resolve(String(d).trim().toLowerCase()))\n })\n if (answer !== 'y' && answer !== 'yes') {\n console.log('aborted')\n return\n }\n }\n const client = createClient()\n await client.post(`/api/agents/${args.id}/chat/reset`)\n console.log(`reset chat history for ${args.id}`)\n },\n})\n\nconst chatTrimCmd = defineCommand({\n meta: {\n name: 'chat-trim',\n description: \"Keep the first N messages of an agent's chat history; drop the rest\",\n },\n args: {\n id: { type: 'positional', required: true },\n keep: { type: 'string', required: true, description: 'Number of leading messages to keep' },\n },\n async run({ args }) {\n const n = Number(args.keep)\n if (!Number.isFinite(n) || n < 0 || !Number.isInteger(n)) {\n throw new Error('--keep must be a non-negative integer')\n }\n const client = createClient()\n const body: TruncateChatRequest = { keepCount: n }\n const res = await client.post<TruncateChatResponse>(\n `/api/agents/${args.id}/chat/truncate`,\n body,\n )\n console.log(\n `trimmed: ${res.before} → ${res.after} messages (${res.before - res.after} dropped)`,\n )\n },\n})\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`\n return `${(n / (1024 * 1024)).toFixed(2)} MiB`\n}\n\nconst chatContextCmd = defineCommand({\n meta: {\n name: 'chat-context',\n description: \"Break down what consumes the agent's context window\",\n },\n args: {\n id: { type: 'positional', required: true },\n detail: {\n type: 'boolean',\n description: 'Include every tool/skill entry instead of the top 30',\n },\n json: { type: 'boolean', description: 'Emit raw JSON instead of a human report' },\n },\n async run({ args }) {\n const client = createClient()\n const query = args.detail || args.json ? '?detail=1' : ''\n const ctx = await client.get<ChatContextResponse>(`/api/agents/${args.id}/chat/context${query}`)\n if (args.json) {\n console.log(JSON.stringify(ctx, null, 2))\n return\n }\n\n const fmt = (chars: number, tokens: number): string =>\n `${chars.toLocaleString()} chars (~${tokens.toLocaleString()} tok)`\n\n console.log(`🧠 context for ${ctx.agentId}`)\n console.log(`model: ${ctx.model}`)\n console.log('')\n console.log('## system prompt')\n console.log(` total: ${fmt(ctx.systemPrompt.chars, ctx.systemPrompt.tokens)}`)\n if (ctx.systemPrompt.files.length > 0) {\n console.log(' profile files:')\n for (const f of ctx.systemPrompt.files) {\n console.log(` - ${f.name}: ${fmt(f.chars, f.tokens)}`)\n }\n }\n if (ctx.systemPrompt.skillsListChars > 0) {\n console.log(` skills line: ${ctx.systemPrompt.skillsListChars.toLocaleString()} chars`)\n }\n if (ctx.systemPrompt.teamListChars > 0) {\n console.log(` team block: ${ctx.systemPrompt.teamListChars.toLocaleString()} chars`)\n }\n if (ctx.systemPrompt.userMdChars > 0) {\n console.log(` user_md block: ${ctx.systemPrompt.userMdChars.toLocaleString()} chars`)\n }\n console.log(` memory hint: ${ctx.systemPrompt.memoryHintChars.toLocaleString()} chars`)\n console.log('')\n console.log('## tools')\n console.log(` count: ${ctx.tools.count}`)\n console.log(\n ` schemas (JSON): ${ctx.tools.schemaChars.toLocaleString()} chars (~${estimate(ctx.tools.schemaChars).toLocaleString()} tok)`,\n )\n console.log(` list text: ${ctx.tools.listChars.toLocaleString()} chars`)\n if (ctx.tools.entries.length > 0) {\n console.log(' top tools by schema size:')\n for (const t of ctx.tools.entries) {\n const params = t.paramCount != null ? ` (${t.paramCount} params)` : ''\n console.log(` - ${t.name}: ${t.schemaChars.toLocaleString()} chars${params}`)\n }\n }\n console.log('')\n if (ctx.skills.count > 0) {\n console.log('## skills')\n console.log(` count: ${ctx.skills.count}`)\n for (const s of ctx.skills.entries) {\n console.log(` - ${s.name}: ${s.blockChars.toLocaleString()} chars`)\n }\n console.log('')\n }\n console.log('## team')\n console.log(` - ${ctx.team.id} (${ctx.team.name}): ${ctx.team.path}`)\n if (ctx.team.userMdChars > 0) {\n console.log(` user_md: ${ctx.team.userMdChars.toLocaleString()} chars`)\n }\n console.log('')\n console.log('## history')\n console.log(` messages: ${ctx.history.messageEntries}`)\n console.log(` compactions: ${ctx.history.compactionEntries}`)\n console.log(` total: ${fmt(ctx.history.chars, ctx.history.tokensEstimate)}`)\n console.log(` bytes: ${formatBytes(ctx.history.bytes)}`)\n console.log('')\n console.log(`TOTAL: ${fmt(ctx.totals.chars, ctx.totals.tokens)}`)\n },\n})\n\nfunction estimate(chars: number): number {\n return Math.ceil(Math.max(0, chars) / 4)\n}\n\nconst chatCompactCmd = defineCommand({\n meta: {\n name: 'chat-compact',\n description: \"Summarize the head of an agent's chat log, preserving the tail verbatim\",\n },\n args: {\n id: { type: 'positional', required: true },\n 'keep-tail': {\n type: 'string',\n description: 'Message entries to keep verbatim after the summary (default 10)',\n },\n instructions: {\n type: 'string',\n description: 'Optional extra guidance prepended to the summarizer prompt',\n },\n force: { type: 'boolean', description: 'Skip the y/N prompt' },\n },\n async run({ args }) {\n if (!args.force) {\n process.stdout.write(\n `compact chat history for ${args.id}? head turns become a summary; tail is preserved. [y/N] `,\n )\n const answer = await new Promise<string>((resolve) => {\n process.stdin.once('data', (d) => resolve(String(d).trim().toLowerCase()))\n })\n if (answer !== 'y' && answer !== 'yes') {\n console.log('aborted')\n return\n }\n }\n const keepTailNum = args['keep-tail'] ? Number(args['keep-tail']) : undefined\n if (keepTailNum !== undefined && (!Number.isFinite(keepTailNum) || keepTailNum < 0)) {\n console.error('--keep-tail must be a non-negative integer')\n process.exitCode = 1\n return\n }\n const body: ChatCompactRequest = {}\n if (keepTailNum !== undefined) body.keepTail = Math.floor(keepTailNum)\n if (args.instructions) body.customInstructions = args.instructions\n const client = createClient()\n const res = await client.post<ChatCompactResponse>(`/api/agents/${args.id}/chat/compact`, body)\n console.log(\n `compacted: ${res.before} → ${res.after} entries (${res.summarized} summarized, ${res.keptTail} tail kept verbatim)`,\n )\n console.log(\n `tokens: ~${res.tokensBefore.toLocaleString()} → ~${res.tokensAfter.toLocaleString()}`,\n )\n console.log('')\n console.log('summary:')\n console.log(res.summary)\n },\n})\n\n// --- skill subcommand ---\n\nconst skillAddCmd = defineCommand({\n meta: { name: 'add', description: 'Attach a skill to an agent' },\n args: {\n agent: { type: 'positional', required: true },\n skill: { type: 'positional', required: true },\n 'allow-warnings': {\n type: 'boolean',\n description: 'Attach even when the static skill scan reports findings',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: AttachSkillRequest = { skill: args.skill, allowFindings: args['allow-warnings'] }\n try {\n await client.post(`/api/agents/${args.agent}/skills`, body)\n } catch (err) {\n if (err instanceof ApiClientError && err.body.code === 'skill_scan_blocked') {\n console.error(`error: ${err.body.error}`)\n printSkillFindings(err.body.findings ?? [])\n console.error(' hint: inspect the skill, then rerun with --allow-warnings to confirm')\n process.exitCode = 1\n return\n }\n throw err\n }\n console.log(`attached skill ${args.skill} to ${args.agent}`)\n },\n})\n\nfunction printSkillFindings(findings: SkillScanFinding[]): void {\n if (findings.length === 0) return\n console.error('scan findings:')\n for (const f of findings) {\n const line = f.line ? ` line ${f.line}` : ''\n console.error(` ${f.severity}: ${f.code}${line} - ${f.message}`)\n }\n}\n\nconst skillRmCmd = defineCommand({\n meta: { name: 'rm', description: 'Detach a skill from an agent' },\n args: {\n agent: { type: 'positional', required: true },\n skill: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/agents/${args.agent}/skills/${encodeURIComponent(args.skill)}`)\n console.log(`detached skill ${args.skill} from ${args.agent}`)\n },\n})\n\nconst skillCmd = defineCommand({\n meta: { name: 'skill', description: 'Attach/detach skills on an agent' },\n subCommands: {\n add: skillAddCmd,\n rm: skillRmCmd,\n },\n})\n\n// --- team membership ---\n\nconst moveCmd = defineCommand({\n meta: { name: 'move', description: 'Move an agent to a different team' },\n args: {\n agent: { type: 'positional', required: true },\n team: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const [agent, destination] = await Promise.all([\n client.get<ResolvedAgent>(`/api/agents/${encodeURIComponent(args.agent)}`),\n client.get<ResolvedTeamPolicy>(`/api/teams/${encodeURIComponent(args.team)}/policy`),\n ])\n const source = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(agent.team.id)}/policy`,\n )\n const body: MoveAgentRequest = {\n teamId: args.team,\n sourceExpectedRevision: source.teamPolicy.revision,\n destinationExpectedRevision: destination.teamPolicy.revision,\n placement: 'profile_defaults',\n }\n await client.patch(`/api/agents/${args.agent}/team`, body)\n console.log(`moved ${args.agent} to team ${args.team}`)\n },\n})\n\nconst sessionHeadCmd = defineCommand({\n meta: {\n name: 'session-head',\n description: \"Print the agent's current session file head (for stale-tab checks)\",\n },\n args: {\n id: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit raw JSON instead of a human line' },\n },\n async run({ args }) {\n const client = createClient()\n const head = await client.get<SessionHeadResponse>(`/api/agents/${args.id}/sessions/head`)\n if (args.json) {\n console.log(JSON.stringify(head))\n return\n }\n console.log(head.file ? `${head.file} (${head.size} bytes)` : '(no session yet)')\n },\n})\n\nconst cancelCmd = defineCommand({\n meta: { name: 'cancel', description: \"Abort the agent's currently-running turn\" },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.post(`/api/agents/${args.id}/cancel`)\n console.log(`cancelled active turn for ${args.id}`)\n },\n})\n\nconst reviewConfigCmd = defineCommand({\n meta: { name: 'review-config', description: 'Inspect or configure reviewed learning' },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n enable: { type: 'boolean', description: 'Enable periodic reviews' },\n disable: { type: 'boolean', description: 'Disable periodic reviews' },\n every: { type: 'string', description: 'Successful user turns between reviews (1-100)' },\n model: { type: 'string', description: \"Review model, or 'agent' to use the Agent model\" },\n reasoning: { type: 'string', description: 'Review reasoning level' },\n },\n async run({ args }) {\n if (args.enable && args.disable) throw new Error('choose either --enable or --disable')\n const client = createClient()\n const body: UpdateAgentReviewConfigRequest = {}\n if (args.enable || args.disable) body.enabled = Boolean(args.enable)\n if (args.every !== undefined) {\n const value = Number(args.every)\n if (!Number.isInteger(value) || value < 1 || value > 100) {\n throw new Error('--every must be an integer from 1 to 100')\n }\n body.everyNTurns = value\n }\n if (args.model !== undefined) body.model = args.model === 'agent' ? null : args.model\n if (args.reasoning !== undefined) {\n body.reasoningLevel = args.reasoning as UpdateAgentReviewConfigRequest['reasoningLevel']\n }\n const hasChanges = Object.keys(body).length > 0\n const config = hasChanges\n ? await client.patch<AgentReviewConfig>(`/api/agents/${args.id}/review-config`, body)\n : await client.get<AgentReviewConfig>(`/api/agents/${args.id}/review-config`)\n console.log(`review: ${config.enabled ? 'enabled' : 'disabled'}`)\n console.log(`cadence: every ${config.everyNTurns} successful user turns`)\n console.log(`model: ${config.model ?? 'agent model'}`)\n console.log(`reasoning: ${config.reasoningLevel}`)\n console.log(`turns since last review: ${config.turnsSinceLast}`)\n },\n})\n\nconst reviewCmd = defineCommand({\n meta: { name: 'review', description: 'Enqueue a reviewed-learning pass' },\n args: { id: { type: 'positional', required: true, description: 'Agent id or prefix' } },\n async run({ args }) {\n const response = await createClient().post<EnqueueAgentReviewResponse>(\n `/api/agents/${args.id}/reviews`,\n )\n console.log(`review ${response.review.id} ${response.review.status}`)\n },\n})\n\nconst reviewsCmd = defineCommand({\n meta: { name: 'reviews', description: 'List reviewed-learning history' },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n status: { type: 'string', description: 'pending|running|retrying|completed|failed|cancelled' },\n },\n async run({ args }) {\n const response = await createClient().get<ListAgentReviewsResponse>(\n `/api/agents/${args.id}/reviews`,\n )\n const reviews = args.status\n ? response.reviews.filter((review) => review.status === args.status)\n : response.reviews\n if (reviews.length === 0) return console.log('(no reviews)')\n for (const line of columnize(\n reviews.map((review) => [\n review.id,\n review.status,\n review.trigger,\n `${review.proposalCount} proposal(s)`,\n new Date(review.createdAt).toISOString(),\n ]),\n )) {\n console.log(line)\n }\n },\n})\n\nconst lessonsCmd = defineCommand({\n meta: { name: 'lessons', description: 'List reviewed lesson proposals' },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n status: { type: 'string', description: 'pending|approved|rejected|revoked' },\n },\n async run({ args }) {\n const status = args.status as AgentLessonStatus | undefined\n const query = status ? `?status=${encodeURIComponent(status)}` : ''\n const response = await createClient().get<ListAgentLessonProposalsResponse>(\n `/api/agents/${args.id}/lesson-proposals${query}`,\n )\n if (response.proposals.length === 0) return console.log('(no lesson proposals)')\n for (const line of columnize(\n response.proposals.map((proposal) => [\n proposal.id,\n proposal.status,\n proposal.scope,\n proposal.text,\n ]),\n )) {\n console.log(line)\n }\n },\n})\n\nasync function locateProposal(\n id: string,\n): Promise<{ agent: Agent; proposal: AgentLessonProposal }> {\n const client = createClient()\n const agents = await client.get<Agent[]>('/api/agents?includeArchived=true')\n for (const agent of agents) {\n const response = await client.get<ListAgentLessonProposalsResponse>(\n `/api/agents/${agent.id}/lesson-proposals`,\n )\n const proposal = response.proposals.find((item) => item.id === id || item.id.startsWith(id))\n if (proposal) return { agent, proposal }\n }\n throw new Error(`lesson proposal not found: ${id}`)\n}\n\nfunction lessonDecisionCmd(decision: 'approve' | 'reject' | 'revoke') {\n return defineCommand({\n meta: { name: decision, description: `${decision} a reviewed lesson proposal` },\n args: {\n id: { type: 'positional', required: true, description: 'Proposal id or prefix' },\n yes: { type: 'boolean', description: `Confirm ${decision}` },\n },\n async run({ args }) {\n if (!args.yes) throw new Error(`${decision} requires --yes`)\n const { agent, proposal } = await locateProposal(args.id)\n const response = await createClient().post<AgentLessonProposalResponse>(\n `/api/agents/${agent.id}/lesson-proposals/${proposal.id}/${decision}`,\n { version: proposal.version },\n )\n console.log(`${response.proposal.status} ${response.proposal.id}`)\n },\n })\n}\n\nconst lessonEditCmd = defineCommand({\n meta: { name: 'edit', description: 'Edit a pending reviewed lesson proposal' },\n args: {\n id: { type: 'positional', required: true, description: 'Proposal id or prefix' },\n text: { type: 'string', description: 'Replacement lesson text' },\n scope: { type: 'string', description: 'private|shared' },\n },\n async run({ args }) {\n if (args.text === undefined && args.scope === undefined) {\n throw new Error('lesson edit requires --text or --scope')\n }\n const { agent, proposal } = await locateProposal(args.id)\n const response = await createClient().patch<AgentLessonProposalResponse>(\n `/api/agents/${agent.id}/lesson-proposals/${proposal.id}`,\n { version: proposal.version, text: args.text, scope: args.scope },\n )\n console.log(`updated ${response.proposal.id} v${response.proposal.version}`)\n },\n})\n\nconst lessonCmd = defineCommand({\n meta: { name: 'lesson', description: 'Edit or decide a reviewed lesson proposal' },\n subCommands: {\n edit: lessonEditCmd,\n approve: lessonDecisionCmd('approve'),\n reject: lessonDecisionCmd('reject'),\n revoke: lessonDecisionCmd('revoke'),\n },\n})\n\nexport const agentCommand = defineCommand({\n meta: { name: 'agent', description: 'Manage agent instances' },\n subCommands: {\n spawn: spawnCmd,\n list: listCmd,\n show: showCmd,\n edit: editCmd,\n archive: archiveCmd,\n unarchive: unarchiveCmd,\n delete: deleteCmd,\n chat: chatCmd,\n 'chat-reset': chatResetCmd,\n 'chat-trim': chatTrimCmd,\n 'chat-context': chatContextCmd,\n 'chat-compact': chatCompactCmd,\n cancel: cancelCmd,\n 'review-config': reviewConfigCmd,\n review: reviewCmd,\n reviews: reviewsCmd,\n lessons: lessonsCmd,\n lesson: lessonCmd,\n skill: skillCmd,\n move: moveCmd,\n 'session-head': sessionHeadCmd,\n },\n})\n","/**\n * Render `rows` as space-aligned columns. All rows must have the same column\n * count; empty cells are treated as `\"\"` for width purposes. Column spacing is\n * two spaces — wider than a tab, tighter than tabular CSV tooling expects.\n *\n * Used by list commands so `status` / `kind` / `name` columns don't jump when\n * one row is `idle` (4) and another is `archived` (8). Does not truncate —\n * long cells win the column width. Callers that want a bounded width should\n * slice before passing.\n */\nexport function columnize(rows: string[][], gap = ' '): string[] {\n if (rows.length === 0) return []\n const colCount = rows[0]?.length ?? 0\n const widths: number[] = new Array<number>(colCount).fill(0)\n for (const row of rows) {\n for (let i = 0; i < colCount; i++) {\n const cell = row[i] ?? ''\n const prev = widths[i] ?? 0\n if (cell.length > prev) widths[i] = cell.length\n }\n }\n return rows.map((row) =>\n row\n .map((cell, i) => {\n // Don't pad the last column — trailing whitespace is pointless and\n // breaks `| wc`-style pipes.\n if (i === colCount - 1) return cell\n return (cell ?? '').padEnd(widths[i] ?? 0)\n })\n .join(gap),\n )\n}\n","import type { CommunicationApproval, CommunicationApprovalDetail } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List communication approval queue/history' },\n args: {\n status: { type: 'string', default: 'pending' },\n team: { type: 'string' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const query = new URLSearchParams({ status: args.status, limit: '100' })\n if (args.team) query.set('teamId', args.team)\n const body = await createClient().get<{ approvals: CommunicationApproval[] }>(\n `/api/approvals?${query}`,\n )\n if (args.json) return console.log(JSON.stringify(body, null, 2))\n if (!body.approvals.length) return console.log('(no approvals)')\n for (const line of columnize([\n ['id', 'status', 'path', 'origin', 'expires'],\n ...body.approvals.map((item) => [\n item.id,\n item.status,\n `${endpoint(item.source)} -> ${endpoint(item.target)}`,\n item.origin,\n new Date(item.expiresAt).toISOString(),\n ]),\n ]))\n console.log(line)\n },\n})\n\nconst show = defineCommand({\n meta: { name: 'show', description: 'Show one approval including payload and audit events' },\n args: { id: { type: 'positional', required: true }, json: { type: 'boolean' } },\n async run({ args }) {\n const item = await createClient().get<CommunicationApprovalDetail>(\n `/api/approvals/${encodeURIComponent(args.id)}`,\n )\n if (args.json) return console.log(JSON.stringify(item, null, 2))\n console.log(`# ${item.id}`)\n console.log(`status: ${item.status}`)\n console.log(`attempt: ${item.attemptKind}:${item.attemptId}`)\n console.log(`path: ${endpoint(item.source)} -> ${endpoint(item.target)}`)\n console.log(`origin: ${item.origin}`)\n console.log(`expires: ${new Date(item.expiresAt).toISOString()}`)\n console.log(\n `revisions: ${item.policyRefs.map((ref) => `${ref.teamId}@${ref.revision}`).join(', ')}`,\n )\n console.log(`events: ${item.events.map((event) => event.event).join(' -> ')}`)\n },\n})\n\nfunction decision(name: 'approve' | 'deny' | 'cancel') {\n return defineCommand({\n meta: {\n name,\n description:\n name === 'approve'\n ? 'Approve and deliver one captured attempt'\n : `${name === 'deny' ? 'Deny' : 'Cancel'} one pending attempt`,\n },\n args: {\n id: { type: 'positional', required: true },\n reason: { type: 'string' },\n yes: { type: 'boolean', description: 'Required explicit non-interactive confirmation' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n if (!args.yes) throw new Error(`refusing ${name}: review with approval show, then pass --yes`)\n const item = await createClient().post<CommunicationApproval>(\n `/api/approvals/${encodeURIComponent(args.id)}/${name}`,\n args.reason ? { reason: args.reason } : {},\n )\n if (args.json) console.log(JSON.stringify(item, null, 2))\n else console.log(`${item.id}: ${item.status}`)\n },\n })\n}\n\nfunction endpoint(value: CommunicationApproval['source']): string {\n return value.kind === 'agent'\n ? `agent:${value.id}`\n : value.kind === 'user'\n ? `user:${value.teamId}`\n : `outside:${value.teamId}`\n}\n\nexport const approvalCommand = defineCommand({\n meta: { name: 'approval', description: 'Manage communication approval queue and history' },\n subCommands: {\n list,\n show,\n approve: decision('approve'),\n deny: decision('deny'),\n cancel: decision('cancel'),\n },\n})\n","import type { AttentionItem, AttentionListResponse, AttentionSummary } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List operator attention items' },\n args: {\n state: { type: 'string', default: 'open' },\n kind: { type: 'string' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const query = new URLSearchParams({ state: args.state, limit: '200' })\n if (args.kind) query.set('kind', args.kind)\n const body = await createClient().get<AttentionListResponse>(`/api/attention?${query}`)\n if (args.json) return console.log(JSON.stringify(body, null, 2))\n if (!body.items.length) console.log('(nothing needs attention)')\n else\n for (const line of columnize([\n ['severity', 'kind', 'context', 'when', 'key'],\n ...body.items.map((item) => [\n item.severity,\n item.kind,\n context(item),\n new Date(item.occurredAt).toISOString(),\n item.key,\n ]),\n ]))\n console.log(line)\n for (const source of body.degraded)\n console.error(`warning: ${source.kind} unavailable: ${source.error}`)\n },\n})\n\nconst summary = defineCommand({\n meta: { name: 'summary', description: 'Summarize open attention items' },\n args: { json: { type: 'boolean' } },\n async run({ args }) {\n const body = await createClient().get<AttentionSummary>('/api/attention/summary')\n if (args.json) console.log(JSON.stringify(body, null, 2))\n else\n console.log(\n `${body.openTotal} open · ${body.bySeverity.action_required} action required · ${body.bySeverity.error} errors · ${body.bySeverity.warning} warnings`,\n )\n },\n})\n\nfunction mutation(name: 'acknowledge' | 'unacknowledge') {\n return defineCommand({\n meta: { name, description: `${name} one informational attention item` },\n args: {\n key: { type: 'positional', required: true },\n yes: { type: 'boolean', description: 'Required confirmation' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n if (!args.yes) throw new Error(`refusing mutation: pass --yes to ${name}`)\n const path = `/api/attention/${encodeURIComponent(args.key)}/${name === 'acknowledge' ? 'acknowledge' : 'acknowledgement'}`\n const body =\n name === 'acknowledge'\n ? await createClient().post<{ item: AttentionItem }>(path)\n : await createClient().del<{ item: AttentionItem }>(path)\n if (args.json) console.log(JSON.stringify(body, null, 2))\n else console.log(`${body.item.key}: ${body.item.acknowledgedAt ? 'acknowledged' : 'open'}`)\n },\n })\n}\n\nconst acknowledgeAll = defineCommand({\n meta: { name: 'acknowledge-all', description: 'Acknowledge all open informational items' },\n args: { yes: { type: 'boolean' }, json: { type: 'boolean' } },\n async run({ args }) {\n if (!args.yes) throw new Error('refusing mutation: pass --yes to acknowledge-all')\n const body = await createClient().post<{ acknowledged: number }>(\n '/api/attention/acknowledge-all',\n )\n if (args.json) console.log(JSON.stringify(body, null, 2))\n else console.log(`acknowledged ${body.acknowledged} informational item(s)`)\n },\n})\n\nfunction context(item: AttentionItem): string {\n return [item.agentName, item.teamName].filter(Boolean).join(' / ') || 'system'\n}\n\nexport const attentionCommand = defineCommand({\n meta: { name: 'attention', description: 'Inspect the operator attention center' },\n subCommands: {\n list,\n summary,\n acknowledge: mutation('acknowledge'),\n unacknowledge: mutation('unacknowledge'),\n 'acknowledge-all': acknowledgeAll,\n },\n})\n","// Import pi-ai's provider directly so the CLI bundle stays slim. The provider\n// owns its OAuth interaction; Bazilion persists the returned credential in the daemon.\nimport type { OpenAICodexStatus } from '@bazilion/api-types'\nimport type { AuthPrompt } from '@earendil-works/pi-ai'\nimport { openaiCodexProvider } from '@earendil-works/pi-ai/providers/openai-codex'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nexport interface OAuthPromptInput {\n once(event: 'data', listener: (chunk: string | Buffer) => void): unknown\n once(event: 'end', listener: () => void): unknown\n once(event: 'error', listener: (error: Error) => void): unknown\n removeListener(event: 'data', listener: (chunk: string | Buffer) => void): unknown\n removeListener(event: 'end', listener: () => void): unknown\n removeListener(event: 'error', listener: (error: Error) => void): unknown\n pause(): unknown\n}\n\nexport interface OAuthPromptOutput {\n write(message: string): unknown\n}\n\nexport type OpenAICodexLoginMethod = 'browser' | 'device_code'\n\nexport const CLI_OPENAI_LOGIN_TIMEOUT_MS = 10 * 60_000\n\nexport interface CliOpenAILoginLifetime {\n signal: AbortSignal\n dispose(): void\n}\n\n/** Keep CLI OAuth bounded even when stdin closes before a browser callback arrives. */\nexport function createCliOpenAILoginLifetime(\n timeoutMs = CLI_OPENAI_LOGIN_TIMEOUT_MS,\n): CliOpenAILoginLifetime {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort(\n new DOMException(\n 'OpenAI login timed out after 10 minutes. Try again with `bazilion auth openai login --device-code`.',\n 'TimeoutError',\n ),\n )\n }, timeoutMs)\n\n return {\n signal: controller.signal,\n dispose() {\n clearTimeout(timeout)\n },\n }\n}\n\nfunction promptAbortError(signal: AbortSignal): Error {\n return signal.reason instanceof Error\n ? signal.reason\n : new DOMException('OAuth prompt cancelled', 'AbortError')\n}\n\n/**\n * Answer Pi's OpenAI OAuth prompts while allowing its localhost callback to\n * cancel a pending manual-code read. Removing the data and abort listeners is\n * essential: a successful browser callback must not leave stdin flowing and\n * keep the CLI process alive.\n */\nexport function answerCliOpenAIPrompt(\n prompt: AuthPrompt,\n input: OAuthPromptInput = process.stdin,\n output: OAuthPromptOutput = process.stdout,\n loginMethod: OpenAICodexLoginMethod = 'browser',\n loginSignal?: AbortSignal,\n): Promise<string> {\n if (prompt.type === 'select') {\n const option = prompt.options.find((candidate) => candidate.id === loginMethod)\n return option\n ? Promise.resolve(option.id)\n : Promise.reject(\n new Error(\n `Pi openai-codex provider does not support ${loginMethod === 'browser' ? 'browser' : 'device-code'} login`,\n ),\n )\n }\n\n output.write(`${prompt.message}: `)\n return new Promise<string>((resolve, reject) => {\n let settled = false\n const signal = prompt.signal\n let readingInput = true\n const cleanupInput = () => {\n if (!readingInput) return\n readingInput = false\n input.removeListener('data', onData)\n input.removeListener('end', onInputUnavailable)\n input.removeListener('error', onInputUnavailable)\n input.pause()\n }\n const cleanup = () => {\n cleanupInput()\n signal?.removeEventListener('abort', onAbort)\n loginSignal?.removeEventListener('abort', onLoginAbort)\n }\n const onData = (data: string | Buffer) => {\n if (settled) return\n settled = true\n cleanup()\n resolve(String(data).trim())\n }\n const onAbort = () => {\n if (settled || !signal) return\n settled = true\n cleanup()\n reject(promptAbortError(signal))\n }\n\n const onLoginAbort = () => {\n if (settled || !loginSignal) return\n settled = true\n cleanup()\n reject(promptAbortError(loginSignal))\n }\n\n // Pi races this prompt against its localhost callback. EOF must stop stdin\n // listeners without rejecting the prompt, because rejecting would cancel a\n // browser callback that may still succeed. The bounded login signal remains\n // responsible for settling a callback that never arrives.\n const onInputUnavailable = () => {\n if (settled) return\n cleanupInput()\n }\n\n if (signal?.aborted) {\n onAbort()\n return\n }\n if (loginSignal?.aborted) {\n onLoginAbort()\n return\n }\n input.once('data', onData)\n input.once('end', onInputUnavailable)\n input.once('error', onInputUnavailable)\n signal?.addEventListener('abort', onAbort, { once: true })\n loginSignal?.addEventListener('abort', onLoginAbort, { once: true })\n })\n}\n\nfunction formatExpiry(ms: number | null): string {\n if (!ms) return '(unknown)'\n const d = new Date(ms)\n return d.toISOString().replace(/\\.\\d+Z$/, 'Z')\n}\n\nconst openaiLoginCmd = defineCommand({\n meta: {\n name: 'login',\n description: 'Connect your ChatGPT account via OAuth',\n },\n args: {\n 'device-code': {\n type: 'boolean',\n description: 'Use headless device-code login instead of the localhost browser callback',\n },\n },\n async run({ args }) {\n const client = createClient()\n // The loopback callback at localhost:1455 must be on the CLI user's\n // machine, so we run pi-ai's flow client-side (not via a server POST).\n // After it completes we ship the credentials to the daemon so they land\n // in the daemon-owned `secrets` table (encrypted with the bootstrap token).\n const loginMethod: OpenAICodexLoginMethod = args['device-code'] ? 'device_code' : 'browser'\n if (loginMethod === 'device_code') {\n console.log('starting OpenAI device-code sign-in...')\n } else {\n console.log('opening your browser for OpenAI sign-in...')\n console.log(\"(if it doesn't open automatically, paste the URL shown below)\")\n }\n const oauth = openaiCodexProvider().auth.oauth\n if (!oauth) throw new Error('Pi openai-codex provider does not expose OAuth')\n const lifetime = createCliOpenAILoginLifetime()\n const creds = await (async () => {\n try {\n return await oauth.login({\n signal: lifetime.signal,\n notify: (event) => {\n if (event.type === 'auth_url') {\n console.log('')\n console.log(` → ${event.url}`)\n console.log('')\n } else if (event.type === 'progress' || event.type === 'info') {\n console.log(` ${event.message}`)\n } else if (event.type === 'device_code') {\n console.log(` open ${event.verificationUri} and enter ${event.userCode}`)\n }\n },\n prompt: (prompt) =>\n answerCliOpenAIPrompt(\n prompt,\n process.stdin,\n process.stdout,\n loginMethod,\n lifetime.signal,\n ),\n })\n } finally {\n lifetime.dispose()\n }\n })()\n const status = await client.put<OpenAICodexStatus>('/api/auth/openai', {\n refresh: creds.refresh,\n access: creds.access,\n expires: creds.expires,\n })\n console.log('')\n console.log('connected ✓')\n if (status.accountId) console.log(`account: ${status.accountId}`)\n console.log(`access token expires: ${formatExpiry(status.expiresAt)}`)\n console.log('')\n console.log(`enable the 'openai-codex' provider on /config and save at least one model`)\n console.log('(e.g. gpt-5.3-codex-spark, gpt-5.4, gpt-5.5) to start using it.')\n console.log('CLI equivalent:')\n console.log(' bazilion provider enable openai-codex')\n console.log(' bazilion provider models-set openai-codex gpt-5.3-codex-spark')\n },\n})\n\nconst openaiLogoutCmd = defineCommand({\n meta: {\n name: 'logout',\n description: 'Forget the stored ChatGPT OAuth credentials',\n },\n async run() {\n const client = createClient()\n await client.del('/api/auth/openai')\n console.log('disconnected ChatGPT OAuth credentials')\n },\n})\n\nconst openaiStatusCmd = defineCommand({\n meta: {\n name: 'status',\n description: 'Show ChatGPT OAuth connection status',\n },\n async run() {\n const client = createClient()\n const status = await client.get<OpenAICodexStatus>('/api/auth/openai')\n if (!status.connected) {\n console.log('not connected — run `bazilion auth openai login`')\n return\n }\n console.log('connected ✓')\n if (status.accountId) console.log(`account: ${status.accountId}`)\n console.log(`access token expires: ${formatExpiry(status.expiresAt)}`)\n },\n})\n\nconst openaiCmd = defineCommand({\n meta: {\n name: 'openai',\n description: 'Manage ChatGPT (OAuth) authentication',\n },\n subCommands: {\n login: openaiLoginCmd,\n logout: openaiLogoutCmd,\n status: openaiStatusCmd,\n },\n})\n\nexport const authCommand = defineCommand({\n meta: {\n name: 'auth',\n description: 'OAuth-based provider authentication (ChatGPT account, etc.)',\n },\n subCommands: {\n openai: openaiCmd,\n },\n})\n","import {\n createCipheriv,\n createDecipheriv,\n createHash,\n pbkdf2Sync,\n randomBytes,\n randomUUID,\n} from 'node:crypto'\nimport {\n chmodSync,\n closeSync,\n copyFileSync,\n cpSync,\n createReadStream,\n createWriteStream,\n existsSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readdirSync,\n readFileSync,\n readSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, isAbsolute, parse, posix, relative, resolve } from 'node:path'\nimport { DatabaseSync, backup as sqliteBackup } from 'node:sqlite'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { Decrypter, Encrypter } from 'age-encryption'\nimport { defineCommand } from 'citty'\nimport { extract, list, type ReadEntry } from 'tar'\nimport { assertCanonicalBackupSchema } from '../backup-schema.ts'\nimport { loadClientConfig } from '../client.ts'\nimport { acquireHomeRestoreLock, DAEMON_LIVENESS_FILENAME } from '../daemon-liveness.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\nconst createCmd = defineCommand({\n meta: { name: 'create', description: 'Create a client-side encrypted backup of ~/.bazilion' },\n args: {\n output: {\n type: 'positional',\n required: false,\n description: 'Output path (default: .tar.gz.age with --recipient, otherwise .tar.gz)',\n },\n recipient: {\n type: 'string',\n description: 'age recipient (age1… or age1pq1…); encrypts before writing output',\n },\n plaintext: {\n type: 'boolean',\n description: 'Explicitly permit a sensitive unencrypted .tar.gz backup',\n },\n },\n async run({ args }) {\n if (args.recipient && args.plaintext) {\n throw new Error('--recipient and --plaintext are mutually exclusive')\n }\n if (!args.recipient && !args.plaintext) {\n throw new Error('choose --recipient <age1…> for encryption or explicitly pass --plaintext')\n }\n const cfg = loadClientConfig()\n const date = new Date().toISOString().slice(0, 10)\n const defaultSuffix = args.recipient ? '.tar.gz.age' : '.tar.gz'\n const outAbs = resolve(args.output ?? `bazilion-backup-${date}${defaultSuffix}`)\n if (existsSync(outAbs)) throw new Error(`refusing to overwrite existing backup: ${outAbs}`)\n const configuredHome = resolve(resolveCliPaths().home)\n const outputFromHome = relative(configuredHome, outAbs)\n if (!outputFromHome || (!outputFromHome.startsWith('..') && !isAbsolute(outputFromHome))) {\n throw new Error(\n `backup output must be outside BAZILION_HOME (${configuredHome}) to avoid nesting backups`,\n )\n }\n\n if (!args.recipient) {\n console.warn('warning: creating a plaintext backup containing all Bazilion credentials')\n }\n console.log(`${args.recipient ? 'encrypting' : 'downloading'} backup → ${outAbs}`)\n const res = await fetch(`${cfg.serverUrl}/api/backup`, {\n headers: { authorization: `Bearer ${cfg.token}`, origin: cfg.serverUrl },\n })\n if (!res.ok || !res.body) {\n let err: string = res.statusText\n try {\n const body = (await res.json()) as { error?: string }\n err = body.error ?? err\n } catch {}\n throw new Error(`backup failed: ${err}`)\n }\n // Keep the in-progress download in OS temp so a failed/cancelled transfer\n // never leaves a partial alongside the requested destination.\n const downloadDir = mkdtempSync(resolve(tmpdir(), 'bazilion-download-'))\n const partial = resolve(downloadDir, 'backup.tar.gz')\n try {\n if (args.recipient) {\n const [encryptSource, validateSource] = res.body.tee()\n const encrypter = new Encrypter()\n encrypter.addRecipient(args.recipient)\n const encrypted = await encrypter.encrypt(encryptSource)\n await Promise.all([\n pipeline(\n Readable.fromWeb(encrypted),\n createWriteStream(partial, { flags: 'wx', mode: 0o600 }),\n ),\n validateArchiveReadable(Readable.fromWeb(validateSource)),\n ])\n } else {\n await pipeline(\n Readable.fromWeb(res.body),\n createWriteStream(partial, { flags: 'wx', mode: 0o600 }),\n )\n }\n // A server/proxy can end a response cleanly after delivering only a\n // prefix. Parse the complete download before it can replace a known-good\n // output file or be reported as usable.\n if (!args.recipient) await validateArchive(partial)\n try {\n renameSync(partial, outAbs)\n } catch (error) {\n if (!(error instanceof Error) || !('code' in error) || error.code !== 'EXDEV') throw error\n // Cross-device rename (commonly a separate /tmp filesystem): copy the\n // complete archive to a sibling, then atomically install that sibling.\n const installPartial = resolve(\n dirname(outAbs),\n `.${basename(outAbs)}.${randomUUID()}.installing`,\n )\n try {\n copyFileSync(partial, installPartial)\n chmodSync(installPartial, 0o600)\n renameSync(installPartial, outAbs)\n } finally {\n rmSync(installPartial, { force: true })\n }\n }\n } finally {\n rmSync(downloadDir, { recursive: true, force: true })\n }\n console.log('done')\n },\n})\n\n/**\n * Offline restore. Server must be stopped first — SQLite's DB files would get\n * corrupted if the running daemon has them open while tar overwrites them.\n * We check the default and configured loopback URLs as a best-effort safety\n * net, including daemons bound to a custom port.\n */\nasync function probeServerRunning(serverUrl: string): Promise<boolean> {\n try {\n const ctrl = new AbortController()\n const timer = setTimeout(() => ctrl.abort(), 500)\n try {\n // /api/health is public — any HTTP response means the configured daemon\n // endpoint is live, without depending on the home token being readable.\n const res = await fetch(new URL('/api/health', serverUrl), { signal: ctrl.signal })\n return res.status >= 200 && res.status < 600\n } finally {\n clearTimeout(timer)\n }\n } catch {\n return false\n }\n}\n\nfunction loopbackServerUrl(raw: string | undefined): string | null {\n if (!raw) return null\n try {\n const url = new URL(raw)\n if (!['http:', 'https:'].includes(url.protocol)) return null\n const hostname = url.hostname.toLowerCase()\n if (!['127.0.0.1', 'localhost', '[::1]', '::1'].includes(hostname)) return null\n return url.origin\n } catch {\n return null\n }\n}\n\nfunction configuredLoopbackUrls(): string[] {\n const urls = new Set<string>(['http://127.0.0.1:4321'])\n const envUrl = loopbackServerUrl(process.env.BAZILION_SERVER)\n if (envUrl) urls.add(envUrl)\n try {\n const clientUrl = loopbackServerUrl(loadClientConfig().serverUrl)\n if (clientUrl) urls.add(clientUrl)\n } catch {\n // A missing/corrupt current auth file must not suppress the default probe.\n }\n return [...urls]\n}\n\ninterface ArchiveEntry {\n path: string\n type: ReadEntry['type']\n linkpath?: string\n}\n\nconst EXTRACTABLE_ENTRY_TYPES = new Set<ReadEntry['type']>([\n 'File',\n 'OldFile',\n 'Directory',\n 'SymbolicLink',\n])\n\nfunction normalizeArchivePath(rawPath: string): string {\n if (!rawPath || rawPath.includes('\\0')) throw new Error('backup contains an invalid empty path')\n // Backslashes are path separators on Windows but ordinary characters on\n // POSIX. Reject them so one archive has the same containment semantics on\n // every platform Bazilion supports.\n if (rawPath.includes('\\\\')) {\n throw new Error(`backup contains a non-portable path: ${JSON.stringify(rawPath)}`)\n }\n if (rawPath.startsWith('/') || /^[A-Za-z]:/.test(rawPath)) {\n throw new Error(`backup contains an absolute path: ${JSON.stringify(rawPath)}`)\n }\n\n const segments: string[] = []\n for (const segment of rawPath.split('/')) {\n if (!segment || segment === '.') continue\n if (segment === '..') {\n throw new Error(`backup path escapes the restore directory: ${JSON.stringify(rawPath)}`)\n }\n segments.push(segment)\n }\n return segments.join('/')\n}\n\nfunction validateArchiveSymbolicLink(path: string, rawTarget: string | undefined): void {\n if (!rawTarget || rawTarget.includes('\\0')) {\n throw new Error(`backup contains an invalid symbolic link target: ${path}`)\n }\n\n const segments = path.split('/')\n const isTeamSlot =\n segments.length === 2 &&\n segments[0] === 'teams' &&\n /^[a-z0-9][a-z0-9-]*$/.test(segments[1] ?? '')\n\n // A registered linked Team is the one intentional external-link shape in\n // a Bazilion home. Preserve its host-native absolute target, but never\n // admit absolute links at arbitrary archive paths.\n const portableTarget = rawTarget.replaceAll('\\\\', '/')\n const absoluteOnAnyPlatform =\n isAbsolute(rawTarget) || posix.isAbsolute(portableTarget) || /^[A-Za-z]:\\//.test(portableTarget)\n if (absoluteOnAnyPlatform) {\n if (!isTeamSlot) {\n throw new Error(`backup absolute symbolic links are only allowed for Team slots: ${path}`)\n }\n if (!isAbsolute(rawTarget)) {\n throw new Error(`backup contains an invalid Team link target: ${path}`)\n }\n return\n }\n\n // Team slots are registered with absolute targets so their identity does\n // not change when the Bazilion home moves. Other relative links are normal\n // work product; accept them only when their portable lexical target remains\n // inside the archive root. Entries beneath every symlink remain forbidden\n // by the complete-archive shape check below.\n if (isTeamSlot) {\n throw new Error(`backup contains an invalid Team link target: ${path}`)\n }\n if (/^[A-Za-z]:/.test(portableTarget)) {\n throw new Error(`backup contains a non-portable symbolic link target: ${path}`)\n }\n const target = posix.normalize(posix.join(posix.dirname(path), portableTarget))\n if (target === '..' || target.startsWith('../') || posix.isAbsolute(target)) {\n throw new Error(`backup symbolic link target escapes the restore directory: ${path}`)\n }\n}\n\nasync function validateArchive(file: string): Promise<ArchiveEntry[]> {\n const entries: ArchiveEntry[] = []\n await list({\n file,\n strict: true,\n onentry(entry) {\n if (entry.meta) return\n const path = normalizeArchivePath(entry.path)\n if (!path) return\n if (!EXTRACTABLE_ENTRY_TYPES.has(entry.type)) {\n throw new Error(`backup contains unsupported ${entry.type} entry: ${path}`)\n }\n if (entry.type === 'SymbolicLink') {\n validateArchiveSymbolicLink(path, entry.linkpath)\n }\n entries.push({ path, type: entry.type, linkpath: entry.linkpath })\n },\n })\n\n return validateArchiveEntries(entries)\n}\n\nasync function validateArchiveReadable(stream: Readable): Promise<ArchiveEntry[]> {\n const entries: ArchiveEntry[] = []\n const parser = list({\n strict: true,\n onentry(entry) {\n if (entry.meta) return\n const path = normalizeArchivePath(entry.path)\n if (!path) return\n if (!EXTRACTABLE_ENTRY_TYPES.has(entry.type)) {\n throw new Error(`backup contains unsupported ${entry.type} entry: ${path}`)\n }\n if (entry.type === 'SymbolicLink') validateArchiveSymbolicLink(path, entry.linkpath)\n entries.push({ path, type: entry.type, linkpath: entry.linkpath })\n },\n })\n await pipeline(stream, parser)\n return validateArchiveEntries(entries)\n}\n\nfunction validateArchiveEntries(entries: ArchiveEntry[]): ArchiveEntry[] {\n const byPath = new Map<string, ArchiveEntry>()\n for (const entry of entries) {\n if (byPath.has(entry.path)) throw new Error(`backup contains a duplicate path: ${entry.path}`)\n byPath.set(entry.path, entry)\n }\n\n const symlinks = new Set(\n entries.filter((entry) => entry.type === 'SymbolicLink').map((entry) => entry.path),\n )\n for (const entry of entries) {\n const segments = entry.path.split('/')\n for (let i = 1; i < segments.length; i++) {\n const ancestor = segments.slice(0, i).join('/')\n if (symlinks.has(ancestor)) {\n throw new Error(`backup entry traverses symbolic link ${ancestor}: ${entry.path}`)\n }\n const ancestorEntry = byPath.get(ancestor)\n if (ancestorEntry && ancestorEntry.type !== 'Directory') {\n throw new Error(`backup entry traverses non-directory ${ancestor}: ${entry.path}`)\n }\n }\n }\n\n for (const required of ['bazilion.db', 'auth.json']) {\n const entry = byPath.get(required)\n if (!entry || (entry.type !== 'File' && entry.type !== 'OldFile')) {\n throw new Error(`backup is missing required regular file: ${required}`)\n }\n }\n for (const transient of [\n 'bazilion.db-wal',\n 'bazilion.db-shm',\n 'bazilion.db-journal',\n DAEMON_LIVENESS_FILENAME,\n ]) {\n if (byPath.has(transient)) {\n throw new Error(`backup contains unsafe transient SQLite file: ${transient}`)\n }\n }\n\n return entries\n}\n\nfunction validateAuthFile(path: string): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new Error(`backup auth.json is invalid: ${detail}`)\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('token' in parsed) ||\n typeof parsed.token !== 'string' ||\n !parsed.token.trim()\n ) {\n throw new Error('backup auth.json is invalid: token is missing')\n }\n return parsed.token\n}\n\nfunction validateDatabase(path: string, authToken: string): void {\n let db: DatabaseSync | null = null\n try {\n db = new DatabaseSync(path, { readOnly: true })\n const integrity = db.prepare('PRAGMA integrity_check').all() as Array<{\n integrity_check: string\n }>\n if (integrity.length !== 1 || integrity[0]?.integrity_check !== 'ok') {\n const detail = integrity.map((row) => row.integrity_check).join('; ') || 'no result'\n throw new Error(`integrity_check failed: ${detail}`)\n }\n\n const foreignKeyErrors = db.prepare('PRAGMA foreign_key_check').all()\n if (foreignKeyErrors.length > 0) {\n throw new Error(`foreign_key_check failed with ${foreignKeyErrors.length} violation(s)`)\n }\n\n assertCanonicalBackupSchema(db)\n\n const tokenHash = createHash('sha256').update(authToken).digest('hex')\n const activeBootstrap = db\n .prepare(\n `SELECT 1 FROM web_tokens\n WHERE token_hash = ? AND kind = 'bootstrap' AND revoked_at IS NULL\n LIMIT 1`,\n )\n .get(tokenHash)\n if (!activeBootstrap) {\n throw new Error('auth.json token does not match an active web_tokens row')\n }\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('backup database is invalid:')) {\n throw error\n }\n const detail = error instanceof Error ? error.message : String(error)\n throw new Error(`backup database is invalid: ${detail}`)\n } finally {\n db?.close()\n }\n}\n\ninterface StoredEntityId {\n id: unknown\n}\n\nconst SLUG_ID = /^[a-z0-9][a-z0-9-]*$/\nconst AGENT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/\n\nfunction validateEntityId(id: unknown, pattern: RegExp, entity: string): string {\n if (typeof id !== 'string' || !pattern.test(id)) {\n throw new Error(`${entity} has an invalid canonical id: ${JSON.stringify(id)}`)\n }\n return id\n}\n\nfunction containedChildDirectory(root: string, id: string, rowLabel: string): string {\n const child = resolve(root, id)\n const fromRoot = relative(root, child)\n if (!fromRoot || fromRoot.startsWith('..') || isAbsolute(fromRoot)) {\n throw new Error(`${rowLabel} directory escapes its canonical root: ${JSON.stringify(id)}`)\n }\n return child\n}\n\nfunction requireExtractedDirectory(path: string, rowLabel: string): void {\n try {\n if (lstatSync(path).isDirectory()) return\n } catch {\n // Replace the platform-specific lstat error with one stable restore error.\n }\n throw new Error(`${rowLabel} is missing its canonical directory in the backup`)\n}\n\nfunction requireExtractedTeamSlot(path: string, rowLabel: string): void {\n try {\n const entry = lstatSync(path)\n if (entry.isDirectory() || entry.isSymbolicLink()) return\n } catch {\n // Replace the platform-specific lstat error with one stable restore error.\n }\n throw new Error(`${rowLabel} is missing its canonical Team slot in the backup`)\n}\n\n/**\n * `profiles.dir` and `agents.dir` are operational filesystem paths used by\n * daemon loaders, tools, sessions, and deletion. A backup can be restored on\n * another machine or under another --home, so source-home values must never\n * survive installation. Validate every DB-derived path component first, then\n * rewrite the staged DB to the final target paths before the atomic swap.\n */\nfunction rebaseRestoredHomeDirectories(\n database: string,\n payload: string,\n targetHome: string,\n): void {\n let db: DatabaseSync | null = null\n try {\n db = new DatabaseSync(database)\n db.exec('PRAGMA foreign_keys = ON')\n\n const profiles = db\n .prepare('SELECT id FROM profiles ORDER BY id')\n .all() as unknown as StoredEntityId[]\n const agents = db\n .prepare('SELECT id FROM agents ORDER BY id')\n .all() as unknown as StoredEntityId[]\n const teams = db\n .prepare('SELECT id FROM teams ORDER BY id')\n .all() as unknown as StoredEntityId[]\n\n const rewrites: Array<{ table: 'profiles' | 'agents'; id: string; dir: string }> = []\n for (const [table, rows, idPattern] of [\n ['profiles', profiles, SLUG_ID],\n ['agents', agents, AGENT_ID],\n ] as const) {\n const collection = table\n const stagedRoot = resolve(payload, collection)\n const targetRoot = resolve(targetHome, collection)\n for (const row of rows) {\n const id = validateEntityId(row.id, idPattern, `${table} row`)\n const rowLabel = `${table} row ${JSON.stringify(id)}`\n const stagedDir = containedChildDirectory(stagedRoot, id, rowLabel)\n requireExtractedDirectory(stagedDir, rowLabel)\n rewrites.push({\n table,\n id,\n dir: containedChildDirectory(targetRoot, id, rowLabel),\n })\n }\n }\n\n // Team paths are already derived from the active home at runtime, so\n // they need no DB rewrite. Their DB IDs are nevertheless path components;\n // validate them and require the archived canonical slot without following\n // an intentionally external linked-Team target.\n const stagedTeamsRoot = resolve(payload, 'teams')\n for (const row of teams) {\n const id = validateEntityId(row.id, SLUG_ID, 'teams row')\n const rowLabel = `teams row ${JSON.stringify(id)}`\n requireExtractedTeamSlot(containedChildDirectory(stagedTeamsRoot, id, rowLabel), rowLabel)\n }\n\n // Force all mutations into the canonical DB file. The daemon will switch\n // the installed DB back to WAL on startup; restore must not install a\n // private staging WAL/SHM tuple alongside it.\n db.exec('PRAGMA journal_mode = DELETE')\n db.exec('PRAGMA synchronous = FULL')\n let transactionOpen = false\n try {\n db.exec('BEGIN IMMEDIATE')\n transactionOpen = true\n const updateProfile = db.prepare('UPDATE profiles SET dir = ? WHERE id = ?')\n const updateAgent = db.prepare('UPDATE agents SET dir = ? WHERE id = ?')\n for (const rewrite of rewrites) {\n const result =\n rewrite.table === 'profiles'\n ? updateProfile.run(rewrite.dir, rewrite.id)\n : updateAgent.run(rewrite.dir, rewrite.id)\n if (result.changes !== 1) {\n throw new Error(`could not rebase ${rewrite.table} row ${JSON.stringify(rewrite.id)}`)\n }\n }\n\n const readProfile = db.prepare('SELECT dir FROM profiles WHERE id = ?')\n const readAgent = db.prepare('SELECT dir FROM agents WHERE id = ?')\n for (const rewrite of rewrites) {\n const row = (\n rewrite.table === 'profiles' ? readProfile.get(rewrite.id) : readAgent.get(rewrite.id)\n ) as { dir?: unknown } | undefined\n if (row?.dir !== rewrite.dir) {\n throw new Error(\n `could not verify rebased ${rewrite.table} row ${JSON.stringify(rewrite.id)}`,\n )\n }\n }\n db.exec('COMMIT')\n transactionOpen = false\n } catch (error) {\n if (transactionOpen) db.exec('ROLLBACK')\n throw error\n }\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new Error(`backup database is invalid: ${detail}`)\n } finally {\n db?.close()\n }\n\n for (const suffix of ['-wal', '-shm', '-journal']) {\n if (existsSync(`${database}${suffix}`)) {\n throw new Error(`backup database is invalid: path rebasing left transient ${suffix} state`)\n }\n }\n}\n\nfunction removeRebuildableQmdIndexes(payload: string): void {\n const teamsDir = resolve(payload, 'teams')\n if (!existsSync(teamsDir) || !lstatSync(teamsDir).isDirectory()) return\n\n for (const team of readdirSync(teamsDir, { withFileTypes: true })) {\n // Linked Teams are leaf symlinks in the archive. Never follow them while\n // cleaning caches or restore could touch the external project directory.\n if (!team.isDirectory() || team.isSymbolicLink()) continue\n const memoryDir = resolve(teamsDir, team.name, 'memory')\n if (!existsSync(memoryDir) || !lstatSync(memoryDir).isDirectory()) continue\n for (const entry of readdirSync(memoryDir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.startsWith('.qmd-index.sqlite')) {\n rmSync(resolve(memoryDir, entry.name), { force: true })\n }\n }\n }\n}\n\nfunction revokeRestoredBrowserSessions(database: string): void {\n const db = new DatabaseSync(database)\n try {\n db.prepare('UPDATE web_sessions SET revoked_at = ? WHERE revoked_at IS NULL').run(Date.now())\n } finally {\n db.close()\n }\n}\n\nexport function installValidatedPayload(\n payload: string,\n targetHome: string,\n staging: string,\n lifecycle?: Pick<\n import('../daemon-liveness.ts').HomeRestoreLock,\n 'markSwapping' | 'markInstalled' | 'markRecoveryRequired'\n >,\n operations: {\n rename(source: string, destination: string): void\n fsyncDirectory?(path: string): void\n afterPreviousMoved?(): void\n } = { rename: renameSync },\n): void {\n const previous = resolve(staging, 'previous-home')\n const hadPrevious = existsSync(targetHome)\n const targetParent = dirname(targetHome)\n const syncDirectory = operations.fsyncDirectory ?? fsyncDirectory\n\n const recoveryError = (\n message: string,\n recoveryPath: string,\n cause: unknown,\n ): RestoreRecoveryRequiredError => {\n let markerError: unknown\n try {\n lifecycle?.markRecoveryRequired(recoveryPath, hadPrevious)\n } catch (error) {\n markerError = error\n }\n const causeDetail = cause instanceof Error ? cause.message : String(cause)\n const markerDetail = markerError\n ? `; recovery marker update failed: ${markerError instanceof Error ? markerError.message : markerError}`\n : ''\n return new RestoreRecoveryRequiredError(\n `${message} (${causeDetail}); recovery data is at ${recoveryPath}${markerDetail}`,\n recoveryPath,\n )\n }\n\n lifecycle?.markSwapping(previous, hadPrevious)\n\n if (hadPrevious) {\n try {\n operations.rename(targetHome, previous)\n } catch (moveError) {\n // The old home never moved, so startup is safe once the phase is\n // durably returned to `installed`.\n lifecycle?.markInstalled()\n throw moveError\n }\n try {\n syncDirectory(targetParent)\n // Test-only fault hook proving that any handled failure after the first\n // rename is promoted to durable recovery-required state.\n operations.afterPreviousMoved?.()\n } catch (postMoveError) {\n throw recoveryError(\n 'the previous home moved but the swap could not continue safely',\n previous,\n postMoveError,\n )\n }\n }\n\n try {\n operations.rename(payload, targetHome)\n } catch (installError) {\n if (hadPrevious) {\n try {\n operations.rename(previous, targetHome)\n } catch (rollbackError) {\n const installDetail =\n installError instanceof Error ? installError.message : String(installError)\n throw recoveryError(\n `restore install failed (${installDetail}) and rollback failed`,\n previous,\n rollbackError,\n )\n }\n\n try {\n syncDirectory(targetParent)\n } catch (rollbackSyncError) {\n throw recoveryError(\n 'the previous home was restored but its directory entry could not be made durable',\n targetHome,\n rollbackSyncError,\n )\n }\n\n try {\n lifecycle?.markInstalled()\n } catch (phaseError) {\n throw recoveryError(\n 'the previous home was restored but could not be marked safe',\n targetHome,\n phaseError,\n )\n }\n } else {\n lifecycle?.markInstalled()\n }\n throw installError\n }\n\n try {\n syncDirectory(targetParent)\n } catch (installSyncError) {\n throw recoveryError(\n 'the restored home was installed but its directory entry could not be made durable',\n hadPrevious ? previous : targetHome,\n installSyncError,\n )\n }\n\n try {\n lifecycle?.markInstalled()\n } catch (phaseError) {\n throw recoveryError(\n 'the restored home was installed but could not be marked safe',\n hadPrevious ? previous : targetHome,\n phaseError,\n )\n }\n}\n\nexport class RestoreRecoveryRequiredError extends Error {\n readonly recoveryPath: string\n\n constructor(message: string, recoveryPath: string) {\n super(message)\n this.name = 'RestoreRecoveryRequiredError'\n this.recoveryPath = recoveryPath\n }\n}\n\nfunction fsyncDirectory(path: string): void {\n let fd: number | null = null\n try {\n fd = openSync(path, 'r')\n fsyncSync(fd)\n } catch (error) {\n // Windows does not allow opening directories. File/lock fsync still\n // provides the strongest portable durability available there.\n if (process.platform !== 'win32') throw error\n } finally {\n if (fd !== null) closeSync(fd)\n }\n}\n\nfunction fsyncFile(path: string): void {\n const fd = openSync(path, 'r')\n try {\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n}\n\nconst AGE_HEADER = Buffer.from('age-encryption.org/v1\\n', 'ascii')\n\nfunction isAgeEncrypted(path: string): boolean {\n const fd = openSync(path, 'r')\n try {\n const header = Buffer.alloc(AGE_HEADER.length)\n return readSync(fd, header, 0, header.length, 0) === header.length && header.equals(AGE_HEADER)\n } finally {\n closeSync(fd)\n }\n}\n\nfunction readAgeIdentity(rawPath: string): string {\n const path = resolve(rawPath)\n const entry = lstatSync(path)\n if (!entry.isFile()) throw new Error(`age identity is not a regular file: ${path}`)\n if (process.platform !== 'win32' && (entry.mode & 0o077) !== 0) {\n throw new Error(`age identity must be owner-only (chmod 600): ${path}`)\n }\n const identities = readFileSync(path, 'utf8')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n if (identities.length !== 1 || !identities[0]?.startsWith('AGE-SECRET-KEY-')) {\n throw new Error('age identity file must contain exactly one supported AGE-SECRET-KEY entry')\n }\n return identities[0]\n}\n\nconst restoreCmd = defineCommand({\n meta: {\n name: 'restore',\n description: 'Extract a backup tar.gz into ~/.bazilion (offline; server must be stopped)',\n },\n args: {\n file: {\n type: 'positional',\n required: true,\n description: 'Path to tar.gz backup file',\n },\n home: { type: 'string', description: 'Override BAZILION_HOME' },\n force: {\n type: 'boolean',\n description: 'Overwrite existing non-empty home (destroys existing data)',\n },\n identity: {\n type: 'string',\n description: 'Path to an age identity file required for encrypted backups',\n },\n },\n async run({ args }) {\n const file = resolve(args.file)\n if (!existsSync(file)) throw new Error(`backup file not found: ${file}`)\n\n const paths = resolveCliPaths(args.home)\n const targetHome = resolve(paths.home)\n if (targetHome === parse(targetHome).root) {\n throw new Error(`refusing to restore over filesystem root: ${targetHome}`)\n }\n\n const targetParent = dirname(targetHome)\n mkdirSync(targetParent, { recursive: true })\n const restoreLock = await acquireHomeRestoreLock(targetHome)\n\n try {\n // Keep probing known URLs for older daemons that predate the ownership\n // record. The lock above is authoritative for current daemons and stays\n // held until validation plus install/rollback have fully completed.\n const targetsConfiguredHome = targetHome === resolve(resolveCliPaths().home)\n if (targetsConfiguredHome) {\n for (const serverUrl of configuredLoopbackUrls()) {\n if (await probeServerRunning(serverUrl)) {\n throw new Error(\n `bazilion server appears to be running at ${serverUrl} — stop it before restoring.`,\n )\n }\n }\n }\n\n if (existsSync(targetHome)) {\n if (!lstatSync(targetHome).isDirectory()) {\n throw new Error(`${targetHome} exists and is not a directory`)\n }\n const entries = readdirSync(targetHome)\n if (entries.length > 0 && !args.force) {\n throw new Error(\n `${targetHome} is not empty. Pass --force to overwrite (destroys existing data).`,\n )\n }\n }\n\n const staging = mkdtempSync(resolve(targetParent, '.bazilion-restore-'))\n const stagedArchive = resolve(staging, 'backup.tar.gz')\n const payload = resolve(staging, 'payload')\n let preserveStaging = false\n\n try {\n // Validate and extract a private copy so an archive replaced by another\n // process between the two passes cannot bypass path validation.\n if (isAgeEncrypted(file)) {\n if (!args.identity) {\n throw new Error('encrypted backup requires --identity <owner-only age identity file>')\n }\n const identity = readAgeIdentity(args.identity)\n const decrypter = new Decrypter()\n decrypter.addIdentity(identity)\n let decrypted: ReadableStream<Uint8Array>\n try {\n decrypted = await decrypter.decrypt(\n Readable.toWeb(createReadStream(file)) as ReadableStream<Uint8Array>,\n )\n } catch {\n throw new Error('backup decryption failed: wrong identity or invalid encrypted header')\n }\n try {\n await pipeline(\n Readable.fromWeb(decrypted),\n createWriteStream(stagedArchive, { flags: 'wx', mode: 0o600 }),\n )\n } catch {\n throw new Error('backup decryption failed: ciphertext is truncated or modified')\n }\n } else {\n if (args.identity) {\n throw new Error('encrypted-only restore requested, but the backup is plaintext')\n }\n copyFileSync(file, stagedArchive)\n chmodSync(stagedArchive, 0o600)\n }\n await validateArchive(stagedArchive)\n mkdirSync(payload)\n await extract({\n file: stagedArchive,\n cwd: payload,\n strict: true,\n preserveOwner: false,\n // The private copy has already passed complete entry-path and link\n // validation above. Preserve paths here so an intentionally absolute\n // external linked-Team target is not stripped into a different,\n // payload-relative path by npm-tar.\n preservePaths: true,\n })\n\n const database = resolve(payload, 'bazilion.db')\n const authFile = resolve(payload, 'auth.json')\n if (!lstatSync(database).isFile() || !lstatSync(authFile).isFile()) {\n throw new Error('backup required files did not extract as regular files')\n }\n const authToken = validateAuthFile(authFile)\n validateDatabase(database, authToken)\n rebaseRestoredHomeDirectories(database, payload, targetHome)\n revokeRestoredBrowserSessions(database)\n // Recheck the canonical file after the controlled mutation. This also\n // proves the auth pairing and all schema/FK invariants still hold.\n validateDatabase(database, authToken)\n removeRebuildableQmdIndexes(payload)\n\n console.log(`installing validated backup ${file} → ${targetHome}`)\n try {\n installValidatedPayload(payload, targetHome, staging, restoreLock)\n } catch (error) {\n if (error instanceof RestoreRecoveryRequiredError) {\n preserveStaging = true\n }\n throw error\n }\n } finally {\n if (!preserveStaging) {\n try {\n rmSync(staging, { recursive: true, force: true })\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n console.warn(\n `warning: could not remove restore staging directory ${staging}: ${detail}`,\n )\n }\n }\n }\n } finally {\n restoreLock.release()\n }\n\n console.log(`restored to ${targetHome}`)\n console.log('start the server with: bazilion serve (migrations apply automatically)')\n },\n})\n\ninterface SecretEnvelope {\n salt: string\n iv: string\n tag: string\n data: string\n}\n\nfunction decryptSecretEnvelope(raw: string, password: string): string {\n const envelope = JSON.parse(raw) as SecretEnvelope\n const key = pbkdf2Sync(password, Buffer.from(envelope.salt, 'hex'), 100_000, 32, 'sha256')\n const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(envelope.iv, 'hex'))\n decipher.setAuthTag(Buffer.from(envelope.tag, 'hex'))\n return Buffer.concat([\n decipher.update(Buffer.from(envelope.data, 'hex')),\n decipher.final(),\n ]).toString('utf8')\n}\n\nfunction encryptSecretEnvelope(value: string, password: string): string {\n const salt = randomBytes(16)\n const key = pbkdf2Sync(password, salt, 100_000, 32, 'sha256')\n const iv = randomBytes(12)\n const cipher = createCipheriv('aes-256-gcm', key, iv)\n const data = Buffer.concat([cipher.update(value, 'utf8'), cipher.final()])\n return JSON.stringify({\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: cipher.getAuthTag().toString('hex'),\n data: data.toString('hex'),\n } satisfies SecretEnvelope)\n}\n\nfunction credentialInventory(home: string): {\n bootstrap: boolean\n activeTokens: number\n secretKeys: string[]\n} {\n const authFile = resolve(home, 'auth.json')\n const database = resolve(home, 'bazilion.db')\n const token = validateAuthFile(authFile)\n validateDatabase(database, token)\n const db = new DatabaseSync(database, { readOnly: true })\n try {\n const activeTokens = db\n .prepare(\n \"SELECT COUNT(*) AS count FROM web_tokens WHERE revoked_at IS NULL AND kind = 'device' AND expires_at > ?\",\n )\n .get(Date.now()) as { count: number }\n const secretKeys = (\n db.prepare('SELECT key FROM secrets ORDER BY key').all() as unknown as Array<{ key: string }>\n ).map((row) => row.key)\n return { bootstrap: true, activeTokens: activeTokens.count, secretKeys }\n } finally {\n db.close()\n }\n}\n\nconst inventoryCmd = defineCommand({\n meta: { name: 'inventory', description: 'List credential classes captured by a backup/home' },\n args: { home: { type: 'string', description: 'Override BAZILION_HOME' } },\n run({ args }) {\n const home = resolve(resolveCliPaths(args.home).home)\n const inventory = credentialInventory(home)\n console.log('credential classes present (values are never shown):')\n console.log(` bootstrap token: ${inventory.bootstrap ? 'present' : 'missing'}`)\n console.log(` active device/web/mobile tokens: ${inventory.activeTokens}`)\n for (const key of inventory.secretKeys) console.log(` stored secret: ${key}`)\n },\n})\n\nconst recoveryGuideCmd = defineCommand({\n meta: { name: 'recovery-guide', description: 'Print the credential-exposure recovery checklist' },\n run() {\n console.log('Bazilion credential exposure recovery:')\n console.log('1. Stop the Bazilion daemon and preserve the suspected archive for investigation.')\n console.log(\n '2. Run `bazilion backup inventory`, then `bazilion backup rotate-bootstrap --yes`.',\n )\n console.log('3. Regenerate the Telegram bot token with BotFather and save the replacement.')\n console.log(\n '4. Disconnect/revoke the affected OpenAI session or grant, then authenticate again.',\n )\n console.log('5. Rotate every provider or MCP credential named by the inventory.')\n console.log('6. Create and verify a fresh recipient-encrypted backup after external rotation.')\n console.log(\n 'Local bootstrap rotation does not revoke copied Telegram/OpenAI/provider credentials.',\n )\n },\n})\n\nconst rotateBootstrapCmd = defineCommand({\n meta: {\n name: 'rotate-bootstrap',\n description: 'Offline crash-safe bootstrap rotation; revokes every other local token',\n },\n args: {\n home: { type: 'string', description: 'Override BAZILION_HOME' },\n yes: { type: 'boolean', required: true, description: 'Confirm token revocation and home swap' },\n },\n async run({ args }) {\n if (!args.yes) throw new Error('--yes is required')\n const paths = resolveCliPaths(args.home)\n const targetHome = resolve(paths.home)\n if (targetHome === parse(targetHome).root) {\n throw new Error(`refusing to rotate filesystem root: ${targetHome}`)\n }\n const lock = await acquireHomeRestoreLock(targetHome)\n const parent = dirname(targetHome)\n const staging = mkdtempSync(resolve(parent, '.bazilion-rotate-'))\n const payload = resolve(staging, 'payload')\n let preserveStaging = false\n try {\n for (const serverUrl of configuredLoopbackUrls()) {\n if (await probeServerRunning(serverUrl)) {\n throw new Error(`bazilion server appears to be running at ${serverUrl} — stop it first.`)\n }\n }\n const oldAuth = JSON.parse(readFileSync(paths.authFile, 'utf8')) as {\n token?: unknown\n remote?: unknown\n }\n if (typeof oldAuth.token !== 'string' || !oldAuth.token) {\n throw new Error('auth.json is missing the bootstrap token')\n }\n validateDatabase(resolve(targetHome, 'bazilion.db'), oldAuth.token)\n\n cpSync(targetHome, payload, {\n recursive: true,\n dereference: false,\n verbatimSymlinks: true,\n preserveTimestamps: true,\n })\n const stagedDb = resolve(payload, 'bazilion.db')\n rmSync(stagedDb, { force: true })\n const sourceDb = new DatabaseSync(resolve(targetHome, 'bazilion.db'), { readOnly: true })\n try {\n await sqliteBackup(sourceDb, stagedDb)\n } finally {\n sourceDb.close()\n }\n for (const suffix of ['-wal', '-shm', '-journal'])\n rmSync(`${stagedDb}${suffix}`, { force: true })\n\n const newToken = randomBytes(24).toString('hex')\n const db = new DatabaseSync(stagedDb)\n try {\n db.exec('PRAGMA foreign_keys = ON; BEGIN IMMEDIATE')\n try {\n const rows = db\n .prepare('SELECT key, envelope FROM secrets ORDER BY key')\n .all() as unknown as Array<{\n key: string\n envelope: string\n }>\n const updateSecret = db.prepare(\n 'UPDATE secrets SET envelope = ?, updated_at = ? WHERE key = ?',\n )\n for (const row of rows) {\n let value: string\n try {\n value = decryptSecretEnvelope(row.envelope, oldAuth.token)\n } catch {\n throw new Error(`stored secret is unreadable and rotation was aborted: ${row.key}`)\n }\n updateSecret.run(encryptSecretEnvelope(value, newToken), Date.now(), row.key)\n }\n const oldHash = createHash('sha256').update(oldAuth.token).digest('hex')\n const newHash = createHash('sha256').update(newToken).digest('hex')\n const bootstrap = db\n .prepare(\n \"UPDATE web_tokens SET token_hash = ?, last_used_at = NULL, revoked_at = NULL WHERE token_hash = ? AND kind = 'bootstrap' AND revoked_at IS NULL\",\n )\n .run(newHash, oldHash)\n if (bootstrap.changes !== 1) throw new Error('active bootstrap token row was not unique')\n const revokedAt = Date.now()\n db.prepare(\n \"UPDATE web_tokens SET revoked_at = ? WHERE kind != 'bootstrap' AND revoked_at IS NULL\",\n ).run(revokedAt)\n db.prepare('UPDATE web_sessions SET revoked_at = ? WHERE revoked_at IS NULL').run(\n revokedAt,\n )\n db.exec('COMMIT')\n } catch (error) {\n db.exec('ROLLBACK')\n throw error\n }\n } finally {\n db.close()\n }\n\n const stagedAuth = resolve(payload, 'auth.json')\n const authPartial = resolve(payload, `.auth.json.${randomUUID()}.installing`)\n writeFileSync(authPartial, `${JSON.stringify({ ...oldAuth, token: newToken }, null, 2)}\\n`, {\n mode: 0o600,\n flag: 'wx',\n })\n renameSync(authPartial, stagedAuth)\n chmodSync(stagedAuth, 0o600)\n validateDatabase(stagedDb, newToken)\n const verification = credentialInventory(payload)\n if (!verification.bootstrap) throw new Error('rotated credential inventory is invalid')\n fsyncFile(stagedDb)\n fsyncFile(stagedAuth)\n fsyncDirectory(payload)\n\n try {\n installValidatedPayload(payload, targetHome, staging, lock)\n } catch (error) {\n if (error instanceof RestoreRecoveryRequiredError) preserveStaging = true\n throw error\n }\n console.log('bootstrap token rotated; all non-bootstrap Bazilion tokens were revoked')\n console.log('external Telegram, OpenAI, provider, and MCP credentials were not revoked')\n } finally {\n if (!preserveStaging) rmSync(staging, { recursive: true, force: true })\n lock.release()\n }\n },\n})\n\nexport const backupCommand = defineCommand({\n meta: { name: 'backup', description: 'Encrypted backup, restore, and credential recovery' },\n subCommands: {\n create: createCmd,\n restore: restoreCmd,\n inventory: inventoryCmd,\n 'recovery-guide': recoveryGuideCmd,\n 'rotate-bootstrap': rotateBootstrapCmd,\n },\n // `bazilion backup` with no positional falls through to citty's subcommand\n // prompt (\"No command specified\"). The previous default (auto-download to\n // cwd) double-fired when a subcommand was used because citty runs parent's\n // `run` after the subcommand completes — explicit `create` / `restore` is\n // the supported form now.\n})\n","import { createHash } from 'node:crypto'\nimport type { DatabaseSync } from 'node:sqlite'\n\nconst CANONICAL_MIGRATION = '0001_init'\nconst CANONICAL_SCHEMA_HASH = '4bde209eb0bf9851bf1f01fc96263f165a1799c81e720ddea463169a0d6c0d51'\n\n// Explicit objects created by migrate.ts + 0001_init.sql. SQLite's implicit\n// auto-indexes have `sql = NULL` and are deliberately represented through the\n// table SQL that creates their UNIQUE/PRIMARY KEY constraints.\nconst CANONICAL_OBJECTS = [\n ['index', 'agent_triggers_agent'],\n ['index', 'agent_triggers_enabled'],\n ['index', 'agent_loop_break_events_agent_time'],\n ['index', 'agent_loop_break_events_team_time'],\n ['index', 'agent_lesson_proposals_agent_status_time'],\n ['index', 'agent_lesson_proposals_review'],\n ['index', 'agent_reviews_agent_time'],\n ['index', 'agent_reviews_claimable'],\n ['index', 'agent_reviews_one_open_per_agent'],\n ['index', 'communication_approval_events_attempt'],\n ['index', 'communication_approvals_queue'],\n ['index', 'communication_approvals_teams'],\n ['index', 'idx_agents_telegram_topic_id'],\n ['index', 'idx_provider_models_provider'],\n ['index', 'messages_policy_delivery_queue'],\n ['index', 'messages_causal_chain'],\n ['index', 'messages_to_unread'],\n ['index', 'team_policy_baseline_owner'],\n ['index', 'team_policy_blocks_team_time'],\n ['index', 'team_template_active_position'],\n ['index', 'trigger_dispatches_claimable'],\n ['index', 'trigger_dispatches_trigger_time'],\n ['index', 'web_tokens_active'],\n ['index', 'web_sessions_active'],\n ['index', 'web_sessions_device'],\n ['table', 'agent_skills'],\n ['table', 'agent_loop_break_events'],\n ['table', 'agent_lesson_proposals'],\n ['table', 'agent_reviews'],\n ['table', 'agent_triggers'],\n ['table', 'agents'],\n ['table', 'attention_acknowledgements'],\n ['table', 'communication_approval_events'],\n ['table', 'communication_approval_message_grants'],\n ['table', 'communication_approvals'],\n ['table', 'config'],\n ['table', 'mcp_servers'],\n ['table', 'messages'],\n ['table', 'profile_communication_defaults'],\n ['table', 'profile_default_skills'],\n ['table', 'profiles'],\n ['table', 'provider_models'],\n ['table', 'provider_state'],\n ['table', 'schema_migrations'],\n ['table', 'secrets'],\n ['table', 'skill_meta'],\n ['table', 'source_slot_bindings'],\n ['table', 'team_agent_state'],\n ['table', 'team_policies'],\n ['table', 'team_policy_block_events'],\n ['table', 'team_policy_edges'],\n ['table', 'team_template_edges'],\n ['table', 'team_template_revision_edges'],\n ['table', 'team_template_revision_slots'],\n ['table', 'team_template_revisions'],\n ['table', 'team_template_slots'],\n ['table', 'team_templates'],\n ['table', 'teams'],\n ['table', 'telegram_allowed_users'],\n ['table', 'telegram_pairing_challenge'],\n ['table', 'template_instantiations'],\n ['table', 'trigger_dispatches'],\n ['table', 'web_tokens'],\n ['table', 'web_sessions'],\n ['trigger', 'create_team_policy'],\n ['trigger', 'prevent_detached_team_policy_delete'],\n ['trigger', 'validate_source_binding_insert'],\n ['trigger', 'validate_team_agent_state_insert'],\n ['trigger', 'validate_team_policy_baseline_update'],\n ['trigger', 'validate_team_policy_edge_insert'],\n ['trigger', 'validate_team_template_edge_insert'],\n] as const\n\ninterface SchemaRow {\n type: string\n name: string\n tbl_name: string\n sql: string\n}\n\nfunction normalizeSql(sql: string): string {\n return sql.replace(/\\s+/g, ' ').trim()\n}\n\n/** Prove the restored DB implements the complete current clean-install schema. */\nexport function assertCanonicalBackupSchema(db: DatabaseSync): void {\n const migrations = db\n .prepare('SELECT version FROM schema_migrations ORDER BY version')\n .all() as Array<{ version: string }>\n if (migrations.length !== 1 || migrations[0]?.version !== CANONICAL_MIGRATION) {\n throw new Error(\n `schema_migrations must contain exactly ${CANONICAL_MIGRATION}; found ` +\n (migrations.map((row) => row.version).join(', ') || 'none'),\n )\n }\n\n const rows = db\n .prepare(\n `SELECT type, name, tbl_name, sql\n FROM sqlite_schema\n WHERE sql IS NOT NULL AND name NOT LIKE 'sqlite_%'`,\n )\n .all() as unknown as SchemaRow[]\n const byKey = new Map(rows.map((row) => [`${row.type}\\0${row.name}`, row]))\n const canonicalKeys = new Set(CANONICAL_OBJECTS.map(([type, name]) => `${type}\\0${name}`))\n for (const row of rows) {\n if (!canonicalKeys.has(`${row.type}\\0${row.name}`)) {\n throw new Error(`unexpected schema ${row.type} is not canonical: ${row.name}`)\n }\n }\n const canonicalRows: SchemaRow[] = []\n\n for (const [type, name] of CANONICAL_OBJECTS) {\n const row = byKey.get(`${type}\\0${name}`)\n if (!row) throw new Error(`required canonical schema ${type} is missing: ${name}`)\n canonicalRows.push(row)\n }\n\n const payload = canonicalRows\n .map((row) => [row.type, row.name, row.tbl_name, normalizeSql(row.sql)].join('\\0'))\n .join('\\n')\n const actualHash = createHash('sha256').update(payload).digest('hex')\n if (actualHash !== CANONICAL_SCHEMA_HASH) {\n throw new Error(\n 'canonical schema fingerprint does not match this Bazilion release; ' +\n 'restore a backup created from the current clean-install schema',\n )\n }\n}\n","import { createHash, randomUUID } from 'node:crypto'\nimport {\n chmodSync,\n closeSync,\n fstatSync,\n fsyncSync,\n ftruncateSync,\n futimesSync,\n lstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n type Stats,\n writeSync,\n} from 'node:fs'\nimport { basename, dirname, join, resolve } from 'node:path'\n\nexport const DAEMON_LIVENESS_FILENAME = 'daemon-runtime.json'\nconst STALE_AFTER_MS = 60_000\nconst PROBE_TIMEOUT_MS = 750\n\ninterface DaemonLivenessRecord {\n version: 1\n instanceId: string\n pid: number\n owner: 'daemon' | 'restore'\n state:\n | 'starting'\n | 'listening'\n | 'restoring'\n | 'uninstalling'\n | 'swapping'\n | 'installed'\n | 'recovery-required'\n host?: string\n port?: number\n startedAt: number\n recoveryPath?: string\n hadPrevious?: boolean\n}\n\nexport interface HomeRestoreLock {\n readonly path: string\n markSwapping(recoveryPath: string, hadPrevious: boolean): void\n markInstalled(): void\n markRecoveryRequired(recoveryPath: string, hadPrevious: boolean): void\n markUninstallComplete(): void\n release(): void\n}\n\nfunction canonicalHomeIdentity(home: string): string {\n const absolute = resolve(home)\n try {\n return realpathSync.native(absolute)\n } catch (error) {\n if (errorCode(error) !== 'ENOENT') throw error\n const parent = dirname(absolute)\n if (parent === absolute) throw error\n return join(canonicalHomeIdentity(parent), basename(absolute))\n }\n}\n\n/** Stable sibling: replacing the home directory during restore cannot drop it. */\nexport function daemonLivenessPath(home: string): string {\n const canonicalHome = canonicalHomeIdentity(home)\n const identity = createHash('sha256').update(canonicalHome).digest('hex').slice(0, 24)\n return join(dirname(canonicalHome), `.bazilion-runtime-${identity}.json`)\n}\n\ninterface ExistingRecord {\n raw: string\n stat: Stats\n record: DaemonLivenessRecord | null\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return error instanceof Error && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined\n}\n\nfunction parseRecord(raw: string): DaemonLivenessRecord | null {\n try {\n const value = JSON.parse(raw) as Partial<DaemonLivenessRecord>\n if (\n value.version !== 1 ||\n typeof value.instanceId !== 'string' ||\n !value.instanceId ||\n !Number.isSafeInteger(value.pid) ||\n (value.pid ?? 0) <= 0 ||\n !['daemon', 'restore'].includes(value.owner ?? '') ||\n ![\n 'starting',\n 'listening',\n 'restoring',\n 'uninstalling',\n 'swapping',\n 'installed',\n 'recovery-required',\n ].includes(value.state ?? '') ||\n !Number.isFinite(value.startedAt)\n ) {\n return null\n }\n if (\n (value.owner === 'daemon' && !['starting', 'listening'].includes(value.state ?? '')) ||\n (value.owner === 'restore' &&\n !['restoring', 'uninstalling', 'swapping', 'installed', 'recovery-required'].includes(\n value.state ?? '',\n ))\n ) {\n return null\n }\n if (\n value.owner === 'restore' &&\n ['swapping', 'recovery-required'].includes(value.state ?? '') &&\n (typeof value.recoveryPath !== 'string' ||\n !value.recoveryPath ||\n typeof value.hadPrevious !== 'boolean')\n ) {\n return null\n }\n if (\n value.owner === 'daemon' &&\n value.state === 'listening' &&\n (typeof value.host !== 'string' ||\n !value.host ||\n !Number.isSafeInteger(value.port) ||\n (value.port ?? 0) < 1 ||\n (value.port ?? 0) > 65_535)\n ) {\n return null\n }\n return value as DaemonLivenessRecord\n } catch {\n return null\n }\n}\n\nfunction readRecord(path: string): ExistingRecord | null {\n try {\n const stat = lstatSync(path)\n const raw = stat.isFile() ? readFileSync(path, 'utf8') : ''\n return { raw, stat, record: stat.isFile() ? parseRecord(raw) : null }\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return null\n throw error\n }\n}\n\nfunction pidIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return errorCode(error) !== 'ESRCH'\n }\n}\n\nfunction endpointFor(record: DaemonLivenessRecord): string | null {\n if (record.state !== 'listening' || !record.host || !record.port) return null\n const normalized = record.host.toLowerCase()\n if (normalized === '0.0.0.0') return `http://127.0.0.1:${record.port}`\n if (normalized === '::' || normalized === '0:0:0:0:0:0:0:0') {\n return `http://[::1]:${record.port}`\n }\n if (normalized === 'localhost' || normalized === '127.0.0.1') {\n return `http://${normalized}:${record.port}`\n }\n if (normalized === '::1' || normalized === '[::1]') {\n return `http://[::1]:${record.port}`\n }\n // The record is local data, but avoid turning a restore into an arbitrary\n // network request when a daemon binds a specific LAN address. A fresh lease\n // and local PID are sufficient to block in that case.\n return null\n}\n\nasync function endpointHasOwner(endpoint: string, instanceId: string): Promise<boolean> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS)\n try {\n const response = await fetch(new URL('/api/health', endpoint), {\n signal: controller.signal,\n })\n return response.headers.get('x-bazilion-daemon-instance') === instanceId\n } catch {\n return false\n } finally {\n clearTimeout(timer)\n }\n}\n\nfunction sameFile(left: Stats, right: Stats): boolean {\n return left.dev === right.dev && left.ino === right.ino\n}\n\nfunction writeRecord(fd: number, record: DaemonLivenessRecord): void {\n const body = `${JSON.stringify(record, null, 2)}\\n`\n ftruncateSync(fd, 0)\n writeSync(fd, body, 0, 'utf8')\n fsyncSync(fd)\n}\n\nfunction fsyncParentDirectory(path: string): void {\n let directoryFd: number | null = null\n try {\n directoryFd = openSync(dirname(path), 'r')\n fsyncSync(directoryFd)\n } catch (error) {\n if (process.platform !== 'win32') throw error\n } finally {\n if (directoryFd !== null) closeSync(directoryFd)\n }\n}\n\nfunction reclaimRecord(path: string, existing: ExistingRecord): string | null {\n const identity = createHash('sha256')\n .update(existing.record?.instanceId ?? existing.raw)\n .update(`\\0${existing.stat.dev}\\0${existing.stat.ino}`)\n .digest('hex')\n .slice(0, 24)\n const claim = `${path}.reclaim-${identity}`\n try {\n mkdirSync(claim, { mode: 0o700 })\n } catch (error) {\n if (errorCode(error) !== 'EEXIST') throw error\n return null\n }\n\n const current = readRecord(path)\n if (!current || !sameFile(current.stat, existing.stat) || current.raw !== existing.raw) {\n return null\n }\n try {\n renameSync(path, join(claim, 'stale-record.json'))\n return claim\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return null\n throw error\n }\n}\n\n/**\n * Acquire the same per-home primitive the daemon takes before opening SQLite.\n * The sibling record remains in place across a target-home rename, closing\n * the check-then-swap race for the entire validation/install/rollback window.\n */\nexport async function acquireHomeRestoreLock(\n home: string,\n operation: 'restoring' | 'uninstalling' = 'restoring',\n): Promise<HomeRestoreLock> {\n const targetHome = resolve(home)\n mkdirSync(dirname(targetHome), { recursive: true })\n const path = daemonLivenessPath(targetHome)\n mkdirSync(dirname(path), { recursive: true })\n const instanceId = randomUUID()\n let fd: number | null = null\n let reclaimClaim: string | null = null\n\n for (let attempt = 0; attempt < 8 && fd === null; attempt++) {\n try {\n fd = openSync(path, 'wx', 0o600)\n break\n } catch (error) {\n if (errorCode(error) !== 'EEXIST') throw error\n }\n\n const existing = readRecord(path)\n if (!existing) continue\n\n const endpoint = existing.record ? endpointFor(existing.record) : null\n if (\n endpoint &&\n existing.record &&\n (await endpointHasOwner(endpoint, existing.record.instanceId))\n ) {\n throw new Error(\n `bazilion daemon is running at ${endpoint} for ${targetHome} — stop it before ${operation}`,\n )\n }\n\n if (!existing.record) {\n throw new Error(\n `the daemon ownership record for ${targetHome} is invalid; verify no daemon is running ` +\n 'before removing it manually',\n )\n }\n const livePid = pidIsAlive(existing.record.pid)\n if (existing.record.owner === 'restore' && existing.record.state === 'uninstalling') {\n if (livePid) {\n throw new Error(\n `bazilion uninstall process ${existing.record.pid} owns ${targetHome} — ` +\n `wait for it to finish before ${operation}`,\n )\n }\n if (operation !== 'uninstalling') {\n throw new Error(\n `a previous Bazilion uninstall was interrupted for ${targetHome}. ` +\n 'Re-run the same `bazilion uninstall` command (including its `--all` choice) ' +\n 'with the same BAZILION_HOME (or --home) ' +\n `to finish it before ${operation}.`,\n )\n }\n console.warn(`resuming interrupted Bazilion uninstall for ${targetHome}`)\n }\n if (\n existing.record.owner === 'restore' &&\n ['swapping', 'recovery-required'].includes(existing.record.state)\n ) {\n if (livePid) {\n throw new Error(\n `bazilion restore process ${existing.record.pid} is ${existing.record.state} ` +\n `${targetHome} — wait for it to finish`,\n )\n }\n const phase = existing.record.state.replace('-', ' ')\n throw new Error(\n `Bazilion restore ${phase} for ${targetHome}; recovery data is at ` +\n `${existing.record.recoveryPath}. Recover the previous home, then remove ${path} manually.`,\n )\n }\n if (livePid) {\n const ageMs = Math.max(0, Date.now() - existing.stat.mtimeMs)\n const staleDetail = ageMs > STALE_AFTER_MS ? ' (its heartbeat is stale)' : ''\n const owner = existing.record.owner === 'daemon' ? 'daemon' : 'restore'\n throw new Error(\n `bazilion ${owner} process ${existing.record.pid} owns ${targetHome}${staleDetail} — ` +\n `stop it before ${operation}`,\n )\n }\n\n const claim = reclaimRecord(path, existing)\n if (claim) {\n reclaimClaim = claim\n console.warn(`removed stale Bazilion daemon ownership record for ${targetHome}`)\n }\n }\n\n if (fd === null) {\n throw new Error(\n `could not safely acquire exclusive ownership for ${operation} ${targetHome}; try again`,\n )\n }\n\n const ownedStat = fstatSync(fd)\n const record: DaemonLivenessRecord = {\n version: 1,\n instanceId,\n pid: process.pid,\n owner: 'restore',\n state: operation,\n startedAt: Date.now(),\n }\n try {\n writeRecord(fd, record)\n fsyncParentDirectory(path)\n if (reclaimClaim) rmSync(reclaimClaim, { recursive: true, force: true })\n try {\n chmodSync(path, 0o600)\n } catch {\n // Windows: chmod may be a no-op.\n }\n } catch (error) {\n closeSync(fd)\n fd = null\n try {\n if (sameFile(lstatSync(path), ownedStat)) rmSync(path, { force: true })\n } catch {\n // Best effort: a dead-PID/invalid record still fails closed.\n }\n throw error\n }\n let released = false\n let uninstallComplete = false\n\n const stillOwnsPath = (): boolean => {\n try {\n return sameFile(lstatSync(path), ownedStat)\n } catch {\n return false\n }\n }\n const heartbeat = setInterval(() => {\n if (released) return\n if (!stillOwnsPath()) {\n console.error(`${operation} ownership was lost; exiting to protect the Bazilion database`)\n process.exit(1)\n }\n try {\n const now = new Date()\n futimesSync(fd as number, now, now)\n } catch (error) {\n console.error(\n `${operation} ownership heartbeat failed:`,\n error instanceof Error ? error.message : error,\n )\n process.exit(1)\n }\n }, 2_000)\n heartbeat.unref()\n\n return {\n path,\n markSwapping(recoveryPath, hadPrevious) {\n if (released || !stillOwnsPath()) throw new Error('restore ownership was lost')\n record.state = 'swapping'\n record.recoveryPath = resolve(recoveryPath)\n record.hadPrevious = hadPrevious\n writeRecord(fd as number, record)\n fsyncParentDirectory(path)\n },\n markInstalled() {\n if (released || !stillOwnsPath()) throw new Error('restore ownership was lost')\n record.state = 'installed'\n delete record.recoveryPath\n delete record.hadPrevious\n writeRecord(fd as number, record)\n },\n markRecoveryRequired(recoveryPath, hadPrevious) {\n if (released || !stillOwnsPath()) throw new Error('restore ownership was lost')\n record.state = 'recovery-required'\n record.recoveryPath = resolve(recoveryPath)\n record.hadPrevious = hadPrevious\n writeRecord(fd as number, record)\n },\n markUninstallComplete() {\n if (released || !stillOwnsPath()) throw new Error('uninstall ownership was lost')\n if (record.state !== 'uninstalling') {\n throw new Error('cannot complete uninstall from a non-uninstall ownership state')\n }\n uninstallComplete = true\n },\n release() {\n if (released) return\n released = true\n clearInterval(heartbeat)\n const ownsPath = stillOwnsPath()\n const retainForRecovery =\n ['swapping', 'recovery-required'].includes(record.state) ||\n (record.state === 'uninstalling' && !uninstallComplete)\n closeSync(fd as number)\n fd = null\n if (ownsPath && !retainForRecovery) rmSync(path, { force: true })\n },\n }\n}\n","import { defineCommand } from 'citty'\n\ninterface CommandNode {\n subCommands?: Record<string, CommandNode | Promise<CommandNode>>\n args?: Record<string, { type?: string; alias?: string | string[] }>\n}\n\ninterface Flatten {\n /** full path e.g. [\"agent\", \"chat\"]; empty for the top-level root */\n path: string[]\n /** immediate subcommand names available at this path */\n subs: string[]\n /** flag tokens e.g. [\"--profile\", \"--name\", \"--long\", \"-l\"] */\n flags: string[]\n}\n\nasync function walk(cmd: CommandNode, path: string[], out: Flatten[]): Promise<void> {\n const subsRaw = cmd.subCommands ?? {}\n const subNames = Object.keys(subsRaw)\n const flags = flagsOf(cmd.args ?? {})\n out.push({ path, subs: subNames, flags })\n for (const name of subNames) {\n const v = subsRaw[name]\n const sub = (await Promise.resolve(v)) as CommandNode\n await walk(sub, [...path, name], out)\n }\n}\n\nfunction flagsOf(args: Record<string, { type?: string; alias?: string | string[] }>): string[] {\n const out: string[] = []\n for (const [name, def] of Object.entries(args)) {\n // Positionals don't get completed as flags.\n if (def.type === 'positional') continue\n out.push(`--${name}`)\n const aliases = Array.isArray(def.alias) ? def.alias : def.alias ? [def.alias] : []\n for (const a of aliases) out.push(a.length === 1 ? `-${a}` : `--${a}`)\n }\n return out\n}\n\nfunction bashScript(flat: Flatten[]): string {\n const cases = flat\n .map((f) => {\n const key = f.path.length === 0 ? '\"\"' : JSON.stringify(f.path.join(' '))\n const words = [...f.subs, ...f.flags].join(' ')\n return ` ${key})\\n COMPREPLY=($(compgen -W ${JSON.stringify(words)} -- \"$cur\"))\\n ;;`\n })\n .join('\\n')\n return `# bazilion bash completion. Install with:\n# source <(bazilion completion bash)\n# or append to ~/.bashrc / ~/.bash_profile.\n_bazilion_completion() {\n local cur prev cword\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n cword=$COMP_CWORD\n # Build the current subcommand path by walking words[1..cword-1], skipping\n # flags and their values. We don't try to parse flag arity — treating every\n # flag as standalone is a good-enough approximation for completion.\n local cmd=\"\"\n local i\n for ((i=1; i<cword; i++)); do\n local w=\"\\${COMP_WORDS[i]}\"\n [[ \"$w\" == -* ]] && continue\n cmd+=\"\\${cmd:+ }$w\"\n done\n case \"$cmd\" in\n${cases}\n *)\n COMPREPLY=()\n ;;\n esac\n}\ncomplete -F _bazilion_completion bazilion\n`\n}\n\nfunction zshScript(flat: Flatten[]): string {\n // zsh bundles a bashcompinit shim; reusing the bash script sidesteps the\n // cost of a native _arguments/_describe implementation while still giving\n // users a working completion. Ships with a tiny preamble so zsh loads the\n // bash compat helpers first.\n const bash = bashScript(flat)\n return `# bazilion zsh completion. Install with:\n# source <(bazilion completion zsh)\n# If you don't already have bashcompinit loaded, this does it for you.\nautoload -U +X compinit && compinit\nautoload -U +X bashcompinit && bashcompinit\n${bash}`\n}\n\nfunction fishScript(flat: Flatten[]): string {\n const lines: string[] = [\n '# bazilion fish completion. Install with:',\n '# bazilion completion fish | source',\n '# or write it to ~/.config/fish/completions/bazilion.fish',\n '',\n 'complete -c bazilion -f',\n ]\n for (const f of flat) {\n if (f.path.length === 0) {\n for (const s of f.subs) lines.push(`complete -c bazilion -n '__fish_use_subcommand' -a ${s}`)\n for (const fl of f.flags) {\n const long = fl.startsWith('--') ? fl.slice(2) : ''\n const short = !fl.startsWith('--') ? fl.slice(1) : ''\n const parts: string[] = [\"complete -c bazilion -n '__fish_use_subcommand'\"]\n if (short) parts.push(`-s ${short}`)\n if (long) parts.push(`-l ${long}`)\n lines.push(parts.join(' '))\n }\n } else {\n // Guard this case on the joined path being the last N tokens in\n // COMP_CWORDS — fish's __fish_seen_subcommand_from handles each token\n // independently, so we require every path segment.\n const guard = f.path.map((p) => `__fish_seen_subcommand_from ${p}`).join('; and ')\n for (const s of f.subs) {\n lines.push(`complete -c bazilion -n '${guard}' -a ${s}`)\n }\n for (const fl of f.flags) {\n const long = fl.startsWith('--') ? fl.slice(2) : ''\n const short = !fl.startsWith('--') ? fl.slice(1) : ''\n const parts: string[] = [`complete -c bazilion -n '${guard}'`]\n if (short) parts.push(`-s ${short}`)\n if (long) parts.push(`-l ${long}`)\n lines.push(parts.join(' '))\n }\n }\n }\n return `${lines.join('\\n')}\\n`\n}\n\nexport function completionCommand(main: CommandNode) {\n return defineCommand({\n meta: {\n name: 'completion',\n description: 'Print a shell completion script (bash, zsh, or fish)',\n },\n args: {\n shell: {\n type: 'positional',\n required: true,\n description: 'bash | zsh | fish',\n },\n },\n async run({ args }) {\n const flat: Flatten[] = []\n await walk(main, [], flat)\n const shell = String(args.shell).toLowerCase()\n if (shell === 'bash') console.log(bashScript(flat))\n else if (shell === 'zsh') console.log(zshScript(flat))\n else if (shell === 'fish') console.log(fishScript(flat))\n else throw new Error(`unsupported shell: ${args.shell} (want bash | zsh | fish)`)\n },\n })\n}\n","import type {\n ProviderConfigResponse,\n ServiceCard,\n ServiceConfigResponse,\n ServiceFieldState,\n SetFieldRequest,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction displayValue(f: ServiceFieldState): string {\n if (!f.set) return '(unset)'\n if (f.kind === 'secret') return f.preview ?? '(set)'\n return f.value ?? '(set)'\n}\n\nconst listCmd = defineCommand({\n meta: {\n name: 'list',\n description: 'List every configurable field (credentials + URLs) across all services',\n },\n async run() {\n const client = createClient()\n // Both endpoints return ServiceCard-shaped entries — merge and print.\n const { providers } = await client.get<ProviderConfigResponse>('/api/config/providers')\n const { services } = await client.get<ServiceConfigResponse>('/api/config/services')\n const all: ServiceCard[] = [...providers, ...services]\n\n const rows: string[][] = []\n for (const svc of all) {\n for (const f of svc.fields) {\n rows.push([svc.id, f.envVar, f.kind, displayValue(f)])\n }\n }\n if (rows.length === 0) {\n console.log('(no fields registered)')\n return\n }\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst setCmd = defineCommand({\n meta: {\n name: 'set',\n description: 'Set a configurable field (auto-routes to secrets or plaintext store)',\n },\n args: {\n envVar: {\n type: 'positional',\n required: true,\n description: 'Env var name (e.g. ANTHROPIC_API_KEY, LMSTUDIO_URL)',\n },\n value: {\n type: 'positional',\n required: true,\n description: 'New value (empty string clears the field)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: SetFieldRequest = { value: args.value }\n const state = await client.put<ServiceFieldState>(\n `/api/config/fields/${encodeURIComponent(args.envVar)}`,\n body,\n )\n console.log(`${state.envVar} (${state.kind}): ${displayValue(state)}`)\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Remove a configurable field value' },\n args: {\n envVar: { type: 'positional', required: true, description: 'Env var name to clear' },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/config/fields/${encodeURIComponent(args.envVar)}`)\n console.log(`removed ${args.envVar}`)\n },\n})\n\nexport const configCommand = defineCommand({\n meta: {\n name: 'config',\n description:\n 'Manage service configuration — credentials (encrypted) and URLs/IDs (plaintext), unified under one CLI',\n },\n subCommands: {\n list: listCmd,\n set: setCmd,\n rm: rmCmd,\n },\n})\n","import { type ChildProcess, spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { connect } from 'node:net'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { resolveCliPaths } from '../paths.ts'\n\nconst bundledDaemonEntry = join(import.meta.dirname, 'daemon.js')\nconst sourceDaemonEntry = join(import.meta.dirname, '..', '..', '..', 'daemon', 'src', 'index.ts')\nconst daemonEntry = existsSync(bundledDaemonEntry) ? bundledDaemonEntry : sourceDaemonEntry\n\nconst bundledWebServerEntry = join(import.meta.dirname, 'web-server.js')\nconst sourceWebServerEntry = join(import.meta.dirname, '..', 'web-server.ts')\nconst webServerEntry = existsSync(bundledWebServerEntry)\n ? bundledWebServerEntry\n : sourceWebServerEntry\n\nconst bundledWebDist = join(import.meta.dirname, 'web')\nconst sourceWebDist = join(import.meta.dirname, '..', '..', '..', 'web', 'dist')\nconst webDist = existsSync(bundledWebDist) ? bundledWebDist : sourceWebDist\n\nfunction nodeArgs(entry: string): string[] {\n return entry.endsWith('.ts') ? ['--import', 'tsx/esm', entry] : [entry]\n}\n\nasync function responds(url: string): Promise<boolean> {\n try {\n const res = await fetch(url)\n return res.status >= 200 && res.status < 500\n } catch {\n return false\n }\n}\n\nfunction probeHost(host: string): string {\n if (host === '0.0.0.0') return '127.0.0.1'\n if (host === '::') return '::1'\n return host\n}\n\nfunction isTcpPortOpen(host: string, port: string): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = connect({ host: probeHost(host), port: Number(port) })\n const done = (open: boolean): void => {\n socket.removeAllListeners()\n socket.destroy()\n resolve(open)\n }\n socket.setTimeout(600)\n socket.once('connect', () => done(true))\n socket.once('timeout', () => done(false))\n socket.once('error', () => done(false))\n })\n}\n\nasync function bazilionDaemonRunning(url: string, port: string): Promise<boolean> {\n try {\n const res = await fetch(`${url}/api/health`)\n if (res.ok) {\n const body = (await res.json().catch(() => null)) as { ok?: unknown } | null\n if (body?.ok === true) return true\n }\n } catch {\n return false\n }\n\n throw new Error(\n `port ${port} is already serving HTTP, but it is not a healthy bazilion daemon. Re-run with --daemon-port <free-port>.`,\n )\n}\n\nasync function bazilionWebRunning(url: string, port: string): Promise<boolean> {\n try {\n const res = await fetch(url)\n if (res.status >= 200 && res.status < 500) {\n const html = await res.text()\n if (html.includes('<title>bazilion</title>') || html.includes('>bazilion<')) {\n return true\n }\n }\n } catch {\n return false\n }\n\n throw new Error(\n `port ${port} is already serving HTTP, but it is not the bazilion web UI. Re-run with --port <free-port>.`,\n )\n}\n\nasync function waitFor(url: string, label: string, timeoutMs = 20_000): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (await responds(url)) return\n await new Promise((r) => setTimeout(r, 150))\n }\n throw new Error(`timed out waiting for ${label} at ${url}`)\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === 'darwin'\n ? 'open'\n : platform === 'win32'\n ? 'cmd'\n : process.env.BROWSER || 'xdg-open'\n const args = platform === 'win32' ? ['/c', 'start', '', url] : [url]\n const proc = spawn(cmd, args, { detached: true, stdio: 'ignore' })\n proc.unref()\n}\n\nfunction spawnProcess(label: string, entry: string, env: NodeJS.ProcessEnv): ChildProcess {\n if (!existsSync(entry)) {\n throw new Error(`${label} entry not found at ${entry}`)\n }\n return spawn(process.execPath, nodeArgs(entry), {\n env,\n stdio: 'inherit',\n })\n}\n\nexport const dashboardCommand = defineCommand({\n meta: {\n name: 'dashboard',\n description: 'Start the bazilion daemon and bundled web UI',\n },\n args: {\n port: { type: 'string', description: 'Web UI port (default 4322)' },\n host: {\n type: 'string',\n description: 'Web UI host (default 127.0.0.1). Use loopback unless you know why not.',\n },\n 'daemon-port': { type: 'string', description: 'Daemon port (default 4321)' },\n 'daemon-host': {\n type: 'string',\n description: 'Daemon host (default 127.0.0.1). Use loopback unless you know why not.',\n },\n open: {\n type: 'boolean',\n description: 'Open the dashboard in your browser (default true)',\n default: true,\n },\n },\n async run({ args }) {\n const webHost = args.host ?? '127.0.0.1'\n const webPort = args.port ?? '4322'\n const daemonHost = args['daemon-host'] ?? '127.0.0.1'\n const daemonPort = args['daemon-port'] ?? '4321'\n const daemonUrl = `http://${daemonHost}:${daemonPort}`\n const webUrl = `http://${webHost}:${webPort}`\n const authFile = resolveCliPaths().authFile\n\n if (webHost !== '127.0.0.1' && webHost !== 'localhost' && webHost !== '::1') {\n console.error('')\n console.error(\n `warning: binding web UI to ${webHost} - the dashboard may be reachable beyond loopback.`,\n )\n console.error(' keep it behind a trusted network or a TLS proxy.')\n console.error('')\n }\n\n const children: ChildProcess[] = []\n let signalled = false\n const terminateChildren = (): void => {\n signalled = true\n for (const child of children) {\n try {\n child.kill('SIGTERM')\n } catch {}\n }\n }\n\n try {\n const daemonRunning = await bazilionDaemonRunning(daemonUrl, daemonPort)\n if (daemonRunning) {\n console.log(`using existing bazilion daemon at ${daemonUrl}`)\n } else {\n if (await isTcpPortOpen(daemonHost, daemonPort)) {\n throw new Error(\n `daemon port ${daemonPort} is already in use. Re-run with --daemon-port <free-port>.`,\n )\n }\n console.log(`starting bazilion daemon at ${daemonUrl}`)\n const daemon = spawnProcess('daemon', daemonEntry, {\n ...process.env,\n HOST: daemonHost,\n PORT: daemonPort,\n })\n children.push(daemon)\n await waitFor(`${daemonUrl}/api/health`, 'bazilion daemon')\n }\n\n const webRunning = await bazilionWebRunning(webUrl, webPort)\n if (webRunning) {\n console.log(`using existing bazilion web UI at ${webUrl}`)\n } else {\n if (await isTcpPortOpen(webHost, webPort)) {\n throw new Error(\n `web UI port ${webPort} is already in use. Re-run with --port <free-port>.`,\n )\n }\n if (!existsSync(join(webDist, 'server', 'server.js'))) {\n throw new Error(\n `bazilion web UI bundle not found at ${webDist}. Run \"pnpm --filter @bazilion/web build\" from the repository root of a source checkout, or reinstall the published package.`,\n )\n }\n console.log(`starting bazilion web UI at ${webUrl}`)\n const web = spawnProcess('web UI', webServerEntry, {\n ...process.env,\n WEB_HOST: webHost,\n WEB_PORT: webPort,\n BAZILION_DAEMON: daemonUrl,\n BAZILION_WEB_DIST: webDist,\n })\n children.push(web)\n await waitFor(webUrl, 'bazilion web UI')\n }\n\n console.log('')\n console.log(`dashboard: ${webUrl}`)\n console.log(`token: ${authFile}`)\n if (args.open) openBrowser(webUrl)\n } catch (err) {\n terminateChildren()\n throw err\n }\n\n if (children.length === 0) return\n\n process.on('SIGINT', terminateChildren)\n process.on('SIGTERM', terminateChildren)\n\n await new Promise<void>((resolve) => {\n let remaining = children.length\n for (const child of children) {\n child.on('close', (code) => {\n remaining--\n if (!signalled && code && code !== 0) process.exitCode = code\n if (remaining === 0) resolve()\n })\n }\n })\n\n if (signalled) process.exitCode = 0\n },\n})\n","import type { HealthReport } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nexport const doctorCommand = defineCommand({\n meta: { name: 'doctor', description: 'Diagnose your bazilion install' },\n async run() {\n const client = createClient()\n const r = await client.get<HealthReport>('/api/health/details')\n\n function check(label: string, condition: boolean, hint?: string): void {\n const mark = condition ? '✓' : '✗'\n const tail = !condition && hint ? ` — ${hint}` : ''\n console.log(` ${mark} ${label}${tail}`)\n }\n\n console.log(`bazilion home: ${r.home}`)\n console.log()\n console.log('paths')\n check('home dir exists', r.paths.home)\n check('database exists', r.paths.db, 'run: bazilion serve (auto-bootstraps on first run)')\n check('auth.json exists', r.paths.auth, 'run: bazilion serve (auto-bootstraps on first run)')\n check('profiles dir exists', r.paths.profiles)\n check('agents dir exists', r.paths.agents)\n check('skills dir exists', r.paths.skills)\n\n if (r.database) {\n console.log()\n console.log('database')\n if (r.database.ok) {\n console.log(` ${r.database.profiles} profile(s)`)\n console.log(\n ` ${r.database.activeAgents} active agent(s) (${r.database.totalAgents} total)`,\n )\n console.log(` ${r.database.teams} team(s)`)\n } else {\n check('open database', false, r.database.error)\n }\n }\n\n console.log()\n console.log('skills library')\n console.log(` ${r.skills.installed} skill(s) installed`)\n if (r.skills.parseErrors > 0) {\n check('all skills parse', false, `${r.skills.parseErrors} skill(s) have errors`)\n }\n\n console.log()\n console.log('providers (enable one and save at least one model for chat)')\n if (r.providers.configured.length === 0) {\n console.log(' - no cloud providers configured')\n console.log(' (set e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY)')\n } else {\n for (const name of r.providers.configured) {\n console.log(` ✓ ${name}`)\n }\n }\n console.log(\n ` ✓ lmstudio: ${\n r.providers.lmstudio.customEndpointConfigured\n ? 'custom endpoint configured'\n : 'default local endpoint'\n }${r.providers.lmstudio.keyConfigured ? ' (API key configured)' : ''}`,\n )\n console.log(\n ` ✓ ollama: ${\n r.providers.ollama.customEndpointConfigured\n ? 'custom endpoint configured'\n : 'default local endpoint'\n }`,\n )\n\n console.log()\n console.log('web search (at least one needed for web_search tool)')\n if (r.webSearch.braveConfigured) {\n console.log(' ✓ Brave Search configured')\n } else {\n console.log(' - Brave Search (set BRAVE_API_KEY — free at https://brave.com/search/api/)')\n }\n if (r.webSearch.searxngConfigured) {\n console.log(' ✓ SearXNG configured')\n } else {\n console.log(' - SearXNG (set SEARXNG_URL if you self-host one)')\n }\n if (!r.webSearch.braveConfigured && !r.webSearch.searxngConfigured) {\n console.log(' ⚠ no search backend — web_search will error until one is configured')\n }\n\n console.log()\n console.log('openclaw integration')\n if (r.openclaw.exists) {\n console.log(` ✓ ${r.openclaw.path} found`)\n console.log(' try: bazilion skill import --from openclaw')\n } else {\n console.log(` - ${r.openclaw.path} not found (fine if you don't use OpenClaw)`)\n }\n\n console.log()\n console.log('background jobs')\n console.log(\n ` ${r.scheduler.enabled ? '✓' : '-'} scheduler${\n r.scheduler.enabled ? ` (tick ${r.scheduler.tickMs}ms)` : ' (BAZILION_SCHEDULER=off)'\n }`,\n )\n\n console.log()\n for (const line of executionSecurityDoctorLines(r)) console.log(line)\n\n console.log()\n console.log('operational counts')\n console.log(` ${r.triggers.active} active trigger(s), ${r.triggers.disabled} disabled`)\n console.log(` ${r.tokens.active} active web token(s)`)\n\n const anyCloudProvider = r.providers.configured.length > 0\n const hasProfiles = (r.database?.ok ? r.database.profiles : 0) > 0\n const hasAgents = (r.database?.ok ? r.database.totalAgents : 0) > 0\n\n console.log()\n if (doctorHasIssues(r)) {\n console.log('issues found ✗')\n process.exit(1)\n }\n // Install is structurally healthy. Differentiate \"ready to use\" from \"just\n // initialized\" so a fresh install doesn't masquerade as fully configured.\n // (Local providers — lmstudio/ollama — are reported with default URLs\n // whether or not they're actually running, so we can only advise; cloud\n // providers have api keys we can check.)\n if (!hasProfiles || !hasAgents) {\n console.log('install is healthy, but not yet ready to run ⚠')\n const todo: string[] = []\n if (!anyCloudProvider) {\n todo.push(' - set a cloud api key (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY)')\n todo.push(' or make sure LMStudio / Ollama is running locally')\n }\n if (!hasProfiles) {\n todo.push(' - enable a provider: bazilion provider enable <provider>')\n todo.push(' - save a model: bazilion provider models-set <provider> <model-id>')\n }\n if (!hasAgents) todo.push(' - spawn an agent: bazilion agent spawn --profile <id>')\n for (const line of todo) console.log(line)\n } else {\n console.log('all good ✓')\n }\n },\n})\n\nexport function executionSecurityDoctorLines(\n report: Pick<HealthReport, 'executionSecurity' | 'shellSecurity'>,\n): string[] {\n const configured = report.executionSecurity.configuredOperatorHttp\n const protectedTurns = report.executionSecurity.protectedUnattendedTurns\n const lines = ['configured operator HTTP (legacy · unprotected)']\n\n if (!report.shellSecurity.ok) {\n lines.push(checkLine('valid shell-security configuration', false, report.shellSecurity.error))\n } else {\n if (report.shellSecurity.approvalMode === 'dangerous') {\n lines.push(\n ' - dangerous-command approval enabled',\n ' web and TTY CLI turns can allow once; non-interactive operator requests auto-deny',\n )\n } else {\n lines.push(\n ' - dangerous-command approval off',\n ' set BAZILION_BASH_APPROVAL=dangerous to opt in',\n )\n }\n\n if (report.shellSecurity.sandboxMode === 'docker') {\n lines.push(\n ` - coding surface: Docker only (${report.shellSecurity.sandboxImage})`,\n ' workspace-only writable mount · bounded inputs/skills/memory read-only · network disabled',\n ' host coding tools hidden',\n ' policy syntax is valid; Docker and image availability are checked on execution',\n ' commands fail closed if either is unavailable',\n )\n } else {\n lines.push(\n ' - coding surface: host tools',\n ' approval is a host-execution tripwire, not a filesystem sandbox',\n ' set BAZILION_BASH_SANDBOX=docker to opt in',\n )\n }\n }\n lines.push(` - browser: ${configured.browser}`, ` - MCP: ${configured.mcp}`, '')\n\n lines.push(\n 'protected unattended turns baseline (Telegram, schedules, inbox, approvals)',\n checkLine('protected base runtime ready', protectedTurns.baseRuntimeReady),\n ' - coding surface: Docker only',\n checkLine(\n `Docker ready (${protectedTurns.docker.image})`,\n protectedTurns.docker.ready,\n protectedTurns.docker.reason ?? undefined,\n ),\n checkLine('OpenAI Codex enabled', protectedTurns.openaiCodex.enabled),\n checkLine('ChatGPT connected', protectedTurns.openaiCodex.connected),\n ` - OpenAI access: ${openAIAccessStatus(protectedTurns.openaiCodex)}`,\n checkLine('OpenAI Codex baseline eligible', protectedTurns.openaiCodex.baselineEligible),\n ` ✓ browser: ${protectedTurns.browser}`,\n ` ✓ MCP: ${protectedTurns.mcp}`,\n ' - every turn separately validates its selected normal/review model, bound OAuth refresh, and mounts/paths',\n )\n if (protectedTurns.remediation) {\n lines.push(` remediation: ${protectedTurns.remediation}`)\n }\n return lines\n}\n\nexport function doctorHasIssues(\n report: Pick<HealthReport, 'ok' | 'protectedWorkBaselineReady'>,\n): boolean {\n return !report.ok || !report.protectedWorkBaselineReady\n}\n\nfunction openAIAccessStatus(\n status: ExecutionSecurityReportOpenAIStatus,\n): 'current' | 'refresh on next turn' | 'unavailable' {\n if (status.accessCurrent) return 'current'\n if (status.refreshOnNextTurn) return 'refresh on next turn'\n return 'unavailable'\n}\n\ntype ExecutionSecurityReportOpenAIStatus =\n HealthReport['executionSecurity']['protectedUnattendedTurns']['openaiCodex']\n\nfunction checkLine(label: string, condition: boolean, hint?: string): string {\n const mark = condition ? '✓' : '✗'\n const tail = !condition && hint ? ` — ${hint}` : ''\n return ` ${mark} ${label}${tail}`\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type { HealthReport } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nconst execFileAsync = promisify(execFile)\n\nfunction exactHttpsOrigin(raw: string | undefined): URL {\n if (!raw) throw new Error('BAZILION_PUBLIC_ORIGIN is required')\n const url = new URL(raw)\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n url.pathname !== '/' ||\n url.search ||\n url.hash ||\n url.origin !== raw.replace(/\\/$/, '')\n ) {\n throw new Error('BAZILION_PUBLIC_ORIGIN must be an exact HTTPS origin')\n }\n return url\n}\n\nfunction listenerIsLoopback(output: string, port: number): boolean {\n const suffix = `:${port}`\n const listeners = output\n .split('\\n')\n .filter((line) => line.trim())\n .filter((line) => line.split(/\\s+/).some((field) => field.endsWith(suffix)))\n return (\n listeners.length > 0 && listeners.every((line) => /(?:127\\.0\\.0\\.1|\\[?::1\\]?):\\d+/.test(line))\n )\n}\n\nfunction hasFunnel(value: unknown): boolean {\n if (Array.isArray(value)) return value.some(hasFunnel)\n if (!value || typeof value !== 'object') return false\n return Object.entries(value).some(\n ([key, nested]) =>\n (/funnel/i.test(key) && nested !== false && nested !== null) || hasFunnel(nested),\n )\n}\n\nconst preflightCmd = defineCommand({\n meta: { name: 'preflight', description: 'Read-only private Tailscale gateway safety check' },\n async run() {\n const publicOrigin = exactHttpsOrigin(process.env.BAZILION_PUBLIC_ORIGIN)\n const daemonPort = Number(process.env.PORT ?? 4321)\n const webPort = Number(process.env.WEB_PORT ?? 4322)\n const { stdout: listeners } = await execFileAsync('ss', ['-ltnH'], { timeout: 5_000 })\n if (!listenerIsLoopback(listeners, daemonPort)) {\n throw new Error(`daemon port ${daemonPort} is not listening exclusively on loopback`)\n }\n if (!listenerIsLoopback(listeners, webPort)) {\n throw new Error(`web port ${webPort} is not listening exclusively on loopback`)\n }\n\n let serveStatus: unknown\n try {\n const { stdout } = await execFileAsync('tailscale', ['serve', 'status', '--json'], {\n timeout: 10_000,\n maxBuffer: 1024 * 1024,\n })\n serveStatus = JSON.parse(stdout) as unknown\n } catch {\n throw new Error('could not obtain unambiguous `tailscale serve status --json` evidence')\n }\n if (hasFunnel(serveStatus))\n throw new Error('Tailscale Funnel is enabled; private Serve is required')\n const serialized = JSON.stringify(serveStatus)\n if (\n !serialized.includes(`127.0.0.1:${webPort}`) &&\n !serialized.includes(`localhost:${webPort}`)\n ) {\n throw new Error(`Tailscale Serve does not clearly target the loopback web port ${webPort}`)\n }\n\n const health = await createClient().get<HealthReport>('/api/health/details')\n if (!health.protectedWorkBaselineReady) {\n throw new Error('BAZ-027 protected-turn baseline is not ready')\n }\n console.log('private gateway preflight passed')\n console.log(`public origin: ${publicOrigin.origin}`)\n console.log(`daemon: loopback:${daemonPort}`)\n console.log(`web: loopback:${webPort}`)\n console.log('Tailscale: private Serve target present; Funnel absent')\n console.log('hosted Agent turns: protected baseline ready')\n },\n})\n\nexport const gatewayCommand = defineCommand({\n meta: { name: 'gateway', description: 'Inspect the private web gateway posture' },\n subCommands: { preflight: preflightCmd },\n})\n","import type { ListAgentLoopBreaksResponse, ListInboxResponse, Message } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction decodeText(payload: string): string {\n try {\n const obj = JSON.parse(payload) as { text?: unknown }\n if (typeof obj.text === 'string') return obj.text\n } catch {}\n return payload\n}\n\nfunction messageRow(m: Message): string[] {\n const when = new Date(m.createdAt).toISOString()\n const state = m.readAt ? 'read' : 'NEW'\n const text = decodeText(m.payload)\n const preview = text.length > 60 ? `${text.slice(0, 60)}…` : text\n return [m.id, state, when, `from:${m.fromAgentId.slice(0, 8)}`, `\"${preview}\"`]\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List messages in an agent inbox' },\n args: {\n agent: { type: 'positional', required: true, description: 'Recipient agent id' },\n unread: { type: 'boolean', description: 'Only show unread messages' },\n },\n async run({ args }) {\n const client = createClient()\n const qs = args.unread ? '?unread=1' : ''\n const { messages } = await client.get<ListInboxResponse>(\n `/api/agents/${args.agent}/messages${qs}`,\n )\n if (messages.length === 0) {\n console.log(args.unread ? '(no unread messages)' : '(inbox empty)')\n return\n }\n for (const line of columnize(messages.map(messageRow))) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show a single message in full' },\n args: {\n id: { type: 'positional', required: true, description: 'Message id' },\n },\n async run({ args }) {\n const client = createClient()\n const m = await client.get<Message>(`/api/messages/${args.id}`)\n const when = new Date(m.createdAt).toISOString()\n const read = m.readAt ? new Date(m.readAt).toISOString() : '(unread)'\n console.log(`id: ${m.id}`)\n console.log(`from: ${m.fromAgentId}`)\n console.log(`to: ${m.toAgentId}`)\n console.log(`created: ${when}`)\n console.log(`read: ${read}`)\n if (m.replyTo) console.log(`reply_to: ${m.replyTo}`)\n console.log('')\n console.log(decodeText(m.payload))\n },\n})\n\nconst readCmd = defineCommand({\n meta: { name: 'read', description: 'Mark a message as read' },\n args: {\n id: { type: 'positional', required: true, description: 'Message id' },\n },\n async run({ args }) {\n const client = createClient()\n await client.patch<Message>(`/api/messages/${args.id}`, { read: true })\n console.log(`marked read: ${args.id}`)\n },\n})\n\nconst loopBreaksCmd = defineCommand({\n meta: { name: 'loop-breaks', description: 'List stopped agent-message chains' },\n args: {\n agent: { type: 'positional', required: true, description: 'Agent id' },\n limit: { type: 'string', description: 'Maximum events to show (default 25)' },\n },\n async run({ args }) {\n const client = createClient()\n const limit = args.limit ? `?limit=${encodeURIComponent(args.limit)}` : ''\n const { events } = await client.get<ListAgentLoopBreaksResponse>(\n `/api/agents/${args.agent}/loop-breaks${limit}`,\n )\n if (events.length === 0) {\n console.log('(no agent-message chains stopped)')\n return\n }\n for (const line of columnize(\n events.map((event) => [\n new Date(event.createdAt).toISOString(),\n `chain:${event.causalChainId.slice(0, 8)}`,\n `${event.fromAgentId.slice(0, 8)}→${event.toAgentId.slice(0, 8)}`,\n `hop:${event.attemptedHop}/${event.maxHops}`,\n event.reason,\n ]),\n ))\n console.log(line)\n },\n})\n\nexport const inboxCommand = defineCommand({\n meta: { name: 'inbox', description: 'Inspect agent inboxes' },\n subCommands: {\n list: listCmd,\n show: showCmd,\n read: readCmd,\n 'loop-breaks': loopBreaksCmd,\n },\n})\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { defineCommand } from 'citty'\nimport type { AuthFile } from '../auth-file.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\nfunction normalizeServer(raw: string): string {\n let url: URL\n try {\n url = new URL(raw)\n } catch {\n throw new Error(`invalid --server URL: ${raw}`)\n }\n if (!/^https?:$/.test(url.protocol)) {\n throw new Error(`--server must be http(s), got ${url.protocol}`)\n }\n // Strip trailing slash so `${serverUrl}${path}` never produces `//`.\n return `${url.origin}${url.pathname.replace(/\\/$/, '')}`\n}\n\nasync function verifyToken(server: string, token: string): Promise<void> {\n const res = await fetch(`${server}/api/auth/whoami`, {\n headers: { authorization: `Bearer ${token}`, origin: server },\n })\n if (res.status === 401) throw new Error('server rejected token (401)')\n if (!res.ok) throw new Error(`server returned ${res.status} from /api/auth/whoami`)\n const owner = (await res.json()) as { publicOrigin?: string | null }\n if (owner.publicOrigin && owner.publicOrigin !== new URL(server).origin) {\n throw new Error('server canonical private origin does not match --server')\n }\n}\n\nexport const loginCommand = defineCommand({\n meta: {\n name: 'login',\n description: 'Save a remote bazilion server + token pair to auth.json',\n },\n args: {\n server: { type: 'string', description: 'Remote server URL (http[s]://...)' },\n token: { type: 'string', description: 'Token issued by `bazilion token create`' },\n skipVerify: { type: 'boolean', description: \"Don't verify /api/auth/whoami before saving\" },\n clear: { type: 'boolean', description: 'Remove the stored remote instead of setting one' },\n },\n async run({ args }) {\n const paths = resolveCliPaths()\n if (!existsSync(paths.authFile)) {\n throw new Error(\n `${paths.authFile} not found. Start the daemon with \"bazilion serve\" first — login stores the remote there.`,\n )\n }\n const auth = JSON.parse(readFileSync(paths.authFile, 'utf8')) as AuthFile\n\n if (args.clear) {\n if (!auth.remote) {\n console.log('no remote stored — nothing to clear')\n return\n }\n delete auth.remote\n writeFileSync(paths.authFile, `${JSON.stringify(auth, null, 2)}\\n`, { mode: 0o600 })\n console.log('cleared stored remote; CLI will fall back to the local daemon')\n return\n }\n\n if (!args.server || !args.token) {\n throw new Error(\n '--server and --token are required (or pass --clear to remove the stored remote)',\n )\n }\n const server = normalizeServer(args.server)\n if (!args.skipVerify) {\n await verifyToken(server, args.token)\n }\n auth.remote = { server, token: args.token }\n writeFileSync(paths.authFile, `${JSON.stringify(auth, null, 2)}\\n`, { mode: 0o600 })\n console.log(`saved remote: ${server}`)\n console.log('CLI will now target this server unless BAZILION_SERVER is set in the env.')\n },\n})\n","import type { McpServer, McpServerInput, McpToolInfo, McpTransport } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction serverRow(s: McpServer): string[] {\n const where = s.transport === 'stdio' ? `${s.command} ${s.args.join(' ')}`.trim() : (s.url ?? '')\n return [\n s.id,\n s.enabled ? 'enabled' : 'disabled',\n s.transport,\n s.hasAuthToken ? 'auth' : '-',\n s.name,\n where,\n ]\n}\n\nconst addCmd = defineCommand({\n meta: { name: 'add', description: 'Register an MCP server' },\n args: {\n name: { type: 'positional', required: true, description: 'Unique name ([a-zA-Z0-9_])' },\n transport: { type: 'string', description: 'stdio | http | sse (default stdio)' },\n command: { type: 'string', description: 'stdio: executable to run (e.g. npx)' },\n args: { type: 'string', description: 'stdio: space-separated args (quote the whole string)' },\n url: { type: 'string', description: 'http/sse: endpoint URL' },\n token: { type: 'string', description: 'http/sse: bearer token (stored encrypted)' },\n disabled: { type: 'boolean', description: 'Create disabled' },\n },\n async run({ args }) {\n const transport = (args.transport ?? 'stdio') as McpTransport\n const body: McpServerInput = {\n name: args.name,\n transport,\n command: args.command ?? null,\n args: args.args ? args.args.split(' ').filter(Boolean) : [],\n url: args.url ?? null,\n authToken: args.token ?? undefined,\n enabled: !args.disabled,\n }\n const client = createClient()\n const { server } = await client.post<{ server: McpServer }>('/api/mcp-servers', body)\n console.log(`${server.id}\\t${server.name}\\t${server.transport}`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List MCP servers' },\n async run() {\n const client = createClient()\n const { servers } = await client.get<{ servers: McpServer[] }>('/api/mcp-servers')\n if (servers.length === 0) {\n console.log('(no MCP servers)')\n return\n }\n for (const line of columnize(servers.map(serverRow))) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show one MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const { server } = await client.get<{ server: McpServer }>(`/api/mcp-servers/${args.id}`)\n console.log(JSON.stringify(server, null, 2))\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Delete an MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/mcp-servers/${args.id}`)\n console.log(`removed MCP server ${args.id}`)\n },\n})\n\nconst enableCmd = defineCommand({\n meta: { name: 'enable', description: 'Enable an MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.patch(`/api/mcp-servers/${args.id}`, { enabled: true })\n console.log(`enabled MCP server ${args.id}`)\n },\n})\n\nconst disableCmd = defineCommand({\n meta: { name: 'disable', description: 'Disable an MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.patch(`/api/mcp-servers/${args.id}`, { enabled: false })\n console.log(`disabled MCP server ${args.id}`)\n },\n})\n\nconst testCmd = defineCommand({\n meta: { name: 'test', description: 'Connect to a server and list its tools' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const res = await client.post<{ ok: boolean; tools?: McpToolInfo[]; error?: string }>(\n `/api/mcp-servers/${args.id}/test`,\n )\n if (!res.ok) {\n console.error(`connection failed: ${res.error}`)\n process.exitCode = 1\n return\n }\n const tools = res.tools ?? []\n console.log(`connected — ${tools.length} tool(s):`)\n for (const t of tools) console.log(` ${t.name}\\t${t.description}`)\n },\n})\n\nexport const mcpCommand = defineCommand({\n meta: { name: 'mcp', description: 'Manage MCP servers' },\n subCommands: {\n add: addCmd,\n list: listCmd,\n show: showCmd,\n rm: rmCmd,\n enable: enableCmd,\n disable: disableCmd,\n test: testCmd,\n },\n})\n","import type { MemoryEntry, MemoryHit } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nfunction encodeKey(key: string): string {\n return key.split('/').map(encodeURIComponent).join('/')\n}\n\nconst writeCmd = defineCommand({\n meta: { name: 'write', description: \"Write an entry into a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n key: { type: 'positional', required: true, description: 'Memory key (path under memory/)' },\n content: { type: 'positional', required: true, description: 'Content to write' },\n },\n async run({ args }) {\n const client = createClient()\n const entry = await client.put<MemoryEntry>(\n `/api/teams/${args.team}/memory/${encodeKey(args.key)}`,\n { content: args.content },\n )\n console.log(`wrote ${entry.key} (${entry.content.length} bytes)`)\n },\n})\n\nconst readCmd = defineCommand({\n meta: { name: 'read', description: \"Read an entry from a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n key: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const entry = await client.get<MemoryEntry>(\n `/api/teams/${args.team}/memory/${encodeKey(args.key)}`,\n )\n console.log(entry.content)\n },\n})\n\nconst searchCmd = defineCommand({\n meta: { name: 'search', description: \"Search a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n query: { type: 'positional', required: true },\n limit: { type: 'string', description: 'Max results (default 10)' },\n },\n async run({ args }) {\n const client = createClient()\n const limit = args.limit ? Number.parseInt(args.limit, 10) : 10\n const params = new URLSearchParams({ q: args.query, limit: String(limit) })\n const hits = await client.get<MemoryHit[]>(`/api/teams/${args.team}/memory/search?${params}`)\n if (hits.length === 0) {\n console.log('(no matches)')\n return\n }\n for (const h of hits) {\n console.log(`${h.key}\\t${h.snippet.replaceAll('\\n', ' ')}`)\n }\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: \"List all entries in a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n },\n async run({ args }) {\n const client = createClient()\n const all = await client.get<MemoryEntry[]>(`/api/teams/${args.team}/memory`)\n if (all.length === 0) {\n console.log('(no memory entries)')\n return\n }\n for (const e of all) {\n console.log(`${e.key}\\t${e.content.length}b`)\n }\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: \"Remove an entry from a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n key: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/teams/${args.team}/memory/${encodeKey(args.key)}`)\n console.log(`removed ${args.key}`)\n },\n})\n\nexport const memoryCommand = defineCommand({\n meta: {\n name: 'memory',\n description: \"Manage a team's shared memory (BM25-indexed markdown notes)\",\n },\n subCommands: {\n write: writeCmd,\n read: readCmd,\n search: searchCmd,\n list: listCmd,\n rm: rmCmd,\n },\n})\n","import { spawn } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport { readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type {\n CreateProfileRequest,\n FileContentResponse,\n LoadedProfile,\n Profile,\n ProfileFileName,\n PutFileRequest,\n SkillsMode,\n UpdateProfileRequest,\n} from '@bazilion/api-types'\nimport { PROFILE_FILES } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction splitCsv(v: string | undefined): string[] | undefined {\n if (!v) return undefined\n const out = v\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n return out.length > 0 ? out : undefined\n}\n\nfunction parseSkillsMode(v: string | undefined): SkillsMode | undefined {\n if (v === undefined) return undefined\n if (v === 'all' || v === 'selected') return v\n throw new Error(`--skills-mode must be 'all' or 'selected', got '${v}'`)\n}\n\nconst createCmd = defineCommand({\n meta: { name: 'create', description: 'Create a new profile' },\n args: {\n id: { type: 'positional', required: true, description: 'Profile slug' },\n name: { type: 'string', description: 'Display name (defaults to slug)' },\n model: {\n type: 'string',\n required: true,\n description: 'Default model, e.g. anthropic:claude-opus-4-8',\n },\n 'skills-mode': {\n type: 'string',\n description: \"'all' (attach every discovered skill) or 'selected' (default)\",\n },\n skills: {\n type: 'string',\n description: 'Default skills, comma-separated (skills-mode=selected)',\n },\n 'soul-file': {\n type: 'string',\n description: 'Path to custom SOUL.md content (defaults to the built-in template)',\n },\n 'identity-file': {\n type: 'string',\n description: 'Path to custom IDENTITY.md content (defaults to the built-in template)',\n },\n 'bootstrap-file': {\n type: 'string',\n description: 'Path to custom BOOTSTRAP.md content (defaults to the built-in template)',\n },\n 'skip-bootstrap': {\n type: 'boolean',\n description: 'Skip the bootstrap file entirely (no first-run intro)',\n },\n 'agents-file': {\n type: 'string',\n description: 'Path to AGENTS.md content (optional; omit to skip)',\n },\n 'tools-file': {\n type: 'string',\n description: 'Path to TOOLS.md content (optional; omit to skip)',\n },\n },\n async run({ args }) {\n const skillsMode = parseSkillsMode(args['skills-mode'])\n const readTemplate = (path: string | undefined): string | undefined =>\n path ? readFileSync(path, 'utf8') : undefined\n const body: CreateProfileRequest = {\n id: args.id,\n name: args.name,\n defaultModel: args.model,\n skillsMode,\n defaultSkills: splitCsv(args.skills),\n soul: readTemplate(args['soul-file']),\n identity: readTemplate(args['identity-file']),\n bootstrap: args['skip-bootstrap']\n ? null\n : (readTemplate(args['bootstrap-file']) ?? undefined),\n agents: readTemplate(args['agents-file']),\n tools: readTemplate(args['tools-file']),\n }\n const client = createClient()\n const profile = await client.post<Profile>('/api/profiles', body)\n console.log(`created profile ${profile.id} at ${profile.dir}`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List profiles' },\n async run() {\n const client = createClient()\n const list = await client.get<Profile[]>('/api/profiles')\n if (list.length === 0) {\n console.log('(no profiles)')\n return\n }\n const rows = list.map((p) => [p.id, p.defaultModel, p.name])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show profile details' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const loaded = await client.get<LoadedProfile>(`/api/profiles/${args.id}`)\n console.log(`# ${loaded.profile.id}`)\n console.log(`name: ${loaded.profile.name}`)\n console.log(`dir: ${loaded.profile.dir}`)\n console.log(`default model: ${loaded.profile.defaultModel}`)\n console.log(`skills mode: ${loaded.profile.skillsMode}`)\n console.log(\n `default skills: ${\n loaded.defaultSkills.length === 0 ? '(none)' : loaded.defaultSkills.join(', ')\n }`,\n )\n console.log(`bootstrap: ${loaded.files.bootstrap !== null ? 'yes' : 'no'}`)\n console.log(`agents: ${loaded.files.agents !== null ? 'yes' : 'no'}`)\n console.log(`tools: ${loaded.files.tools !== null ? 'yes' : 'no'}`)\n if (loaded.identity) {\n const fields = Object.entries(loaded.identity)\n .filter(([, v]) => typeof v === 'string' && v.length > 0)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ')\n if (fields) console.log(`identity: ${fields}`)\n }\n },\n})\n\nconst editCmd = defineCommand({\n meta: { name: 'edit', description: 'Open a profile file in $EDITOR' },\n args: {\n id: { type: 'positional', required: true },\n file: {\n type: 'string',\n default: 'profile.json',\n description: `File: ${PROFILE_FILES.join(', ')}`,\n },\n },\n async run({ args }) {\n if (!(PROFILE_FILES as readonly string[]).includes(args.file)) {\n throw new Error(`unsupported file: ${args.file}. Allowed: ${PROFILE_FILES.join(', ')}`)\n }\n const file = args.file as ProfileFileName\n const client = createClient()\n const { content } = await client.get<FileContentResponse>(\n `/api/profiles/${args.id}/files/${file}`,\n )\n const tmpPath = join(tmpdir(), `bazilion-${args.id}-${file}-${randomBytes(4).toString('hex')}`)\n writeFileSync(tmpPath, content)\n try {\n const editor = process.env.EDITOR ?? process.env.VISUAL ?? 'vi'\n const code: number = await new Promise((resolve, reject) => {\n const child = spawn(editor, [tmpPath], { stdio: 'inherit' })\n child.on('error', reject)\n child.on('close', (c) => resolve(c ?? 0))\n })\n if (code !== 0) throw new Error(`editor exited with code ${code}`)\n const updated = readFileSync(tmpPath, 'utf8')\n if (updated === content) {\n console.log('(no changes)')\n return\n }\n const body: PutFileRequest = { content: updated }\n await client.put(`/api/profiles/${args.id}/files/${file}`, body)\n console.log(`saved ${file}`)\n } finally {\n try {\n rmSync(tmpPath, { force: true })\n } catch {}\n }\n },\n})\n\nconst updateCmd = defineCommand({\n meta: {\n name: 'update',\n description: 'Update profile settings (name, model, skills-mode, skills)',\n },\n args: {\n id: { type: 'positional', required: true },\n name: { type: 'string', description: 'New display name' },\n model: { type: 'string', description: 'New default model' },\n 'skills-mode': {\n type: 'string',\n description: \"Switch to 'all' or 'selected'\",\n },\n skills: { type: 'string', description: 'Replacement default skills, comma-separated' },\n },\n async run({ args }) {\n const body: UpdateProfileRequest = {}\n if (args.name !== undefined) body.name = args.name\n if (args.model !== undefined) body.defaultModel = args.model\n const mode = parseSkillsMode(args['skills-mode'])\n if (mode !== undefined) body.skillsMode = mode\n if (args.skills !== undefined) {\n body.defaultSkills = args.skills\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n }\n if (Object.keys(body).length === 0) {\n throw new Error(\n 'nothing to update — pass at least one of --name/--model/--skills-mode/--skills',\n )\n }\n const client = createClient()\n const profile = await client.patch<Profile>(`/api/profiles/${args.id}`, body)\n console.log(`updated profile ${profile.id}`)\n },\n})\n\nconst deleteCmd = defineCommand({\n meta: { name: 'delete', description: 'Permanently delete a profile and its files' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/profiles/${args.id}`)\n console.log(`deleted profile ${args.id}`)\n },\n})\n\nexport const profileCommand = defineCommand({\n meta: { name: 'profile', description: 'Manage profiles' },\n subCommands: {\n create: createCmd,\n list: listCmd,\n show: showCmd,\n edit: editCmd,\n update: updateCmd,\n delete: deleteCmd,\n },\n})\n","// Wire-shape package. Hermetic: depends on nothing from the daemon, so every\n// client (web, mobile, cli, future SDKs) can pull in API shapes without\n// dragging Node-only code (node:sqlite, undici, pi-ai, the worker spawner)\n// into its TS check graph or runtime bundle. The daemon imports its entity\n// and wire types FROM here.\n\nexport type {\n AttentionAcknowledgeAllResponse,\n AttentionAcknowledgementResponse,\n AttentionDegradedSource,\n AttentionItem,\n AttentionKind,\n AttentionListResponse,\n AttentionSeverity,\n AttentionState,\n AttentionSummary,\n} from './attention.ts'\nexport type {\n Agent,\n AgentIdentityFile,\n AgentLessonEvidence,\n AgentLessonProposal,\n AgentLessonScope,\n AgentLessonStatus,\n AgentLoopBreakEvent,\n AgentReview,\n AgentReviewStatus,\n AgentReviewTrigger,\n AgentSkillAttachment,\n AgentStatus,\n AgentTrigger,\n CommunicationApproval,\n CommunicationApprovalDetail,\n CommunicationApprovalEvent,\n CommunicationApprovalStatus,\n CommunicationAuthorizationResult,\n CommunicationChannel,\n CommunicationComponentOutcome,\n CommunicationDecision,\n CommunicationEdgePosture,\n CommunicationEndpoint,\n CommunicationPolicyRef,\n LiveEndpointKind,\n LoadedProfile,\n McpServer,\n McpServerInput,\n McpToolInfo,\n McpTransport,\n Message,\n OpenAICodexStatus,\n Profile,\n ProfileCommunicationDefaults,\n ProfilePeerDefault,\n ReasoningLevel,\n ResolvedAgent,\n ResolvedTeamPolicy,\n SkillMeta,\n SkillsMode,\n SourceSlotBinding,\n Team,\n TeamAgentState,\n TeamPolicy,\n TeamPolicyBlockEvent,\n TeamPolicyBlockPage,\n TeamPolicyDetail,\n TeamPolicyEdge,\n TeamPolicyPlacement,\n TeamTemplate,\n TeamTemplateDetail,\n TeamTemplateEdge,\n TeamTemplateRevision,\n TeamTemplateSlot,\n TeamTemplateWithCount,\n TelegramAclRole,\n TelegramAllowedUser,\n TelegramMirrorMode,\n TemplateEndpointKind,\n TemplateInstantiation,\n Timestamp,\n TriggerDispatch,\n TriggerDispatchStatus,\n TriggerKind,\n WebSession,\n WebToken,\n} from './entities.ts'\nexport { REASONING_LEVELS } from './entities.ts'\nexport type {\n BashApprovalMode,\n ChatFrame,\n CommandApproval,\n CommandApprovalStatus,\n CommandRisk,\n CommandRiskCode,\n CommandRiskSeverity,\n ProviderMessage,\n Role,\n SessionEvent,\n ToolCall,\n ToolDef,\n ToolResultImage,\n} from './events.ts'\nexport type { MemoryEntry, MemoryHit } from './memory.ts'\n\nimport type {\n Agent,\n AgentLessonProposal,\n AgentLessonScope,\n AgentLessonStatus,\n AgentReview,\n AgentTrigger,\n CommunicationEdgePosture,\n LiveEndpointKind,\n Message,\n ProfileCommunicationDefaults,\n ReasoningLevel,\n TeamPolicyPlacement,\n TelegramAclRole,\n TelegramMirrorMode,\n TemplateEndpointKind,\n TriggerDispatch,\n WebSession,\n WebToken,\n} from './entities.ts'\nimport type { BashApprovalMode, CommandApproval } from './events.ts'\n\nexport interface ApiError {\n error: string\n code?: string\n findings?: SkillScanFinding[]\n}\n\n// --- agents ---\n\nexport interface ListAgentsQuery {\n includeArchived?: boolean\n}\n\nexport interface SpawnAgentRequest {\n profileId: string\n name?: string\n model?: string\n reasoningLevel?: ReasoningLevel\n /** Team the new agent joins. */\n teamId: string\n teamExpectedRevision: number\n placement: Exclude<TeamPolicyPlacement, 'template_snapshot'>\n}\n\nexport interface UpdateAgentRequest {\n modelOverride?: string | null\n reasoningLevel?: ReasoningLevel\n /** Step 6: per-agent Telegram outbound-mirror verbosity. */\n telegramMirrorMode?: TelegramMirrorMode\n /** Step 6: rename (mirrors the `name` field the daemon accepts on PATCH). */\n name?: string\n /**\n * Per-agent forum-topic emoji override (single emoji char). `null` or `''`\n * clears it (falls back to the profile default, then color-only).\n */\n telegramIconEmoji?: string | null\n}\n\nexport interface AgentReviewConfig {\n enabled: boolean\n everyNTurns: number\n model: string | null\n reasoningLevel: ReasoningLevel\n turnsSinceLast: number\n}\n\nexport interface UpdateAgentReviewConfigRequest {\n enabled?: boolean\n everyNTurns?: number\n model?: string | null\n reasoningLevel?: ReasoningLevel\n}\n\nexport interface EnqueueAgentReviewResponse {\n review: AgentReview\n}\n\nexport interface ListAgentReviewsResponse {\n reviews: AgentReview[]\n}\n\nexport interface ListAgentLessonProposalsQuery {\n status?: AgentLessonStatus\n}\n\nexport interface ListAgentLessonProposalsResponse {\n proposals: AgentLessonProposal[]\n}\n\nexport interface AgentReviewDetailResponse {\n review: AgentReview\n proposals: AgentLessonProposal[]\n}\n\nexport interface UpdateAgentLessonProposalRequest {\n version: number\n text?: string\n scope?: AgentLessonScope\n}\n\nexport interface DecideAgentLessonProposalRequest {\n version: number\n}\n\nexport interface AgentLessonProposalResponse {\n proposal: AgentLessonProposal\n}\n\nexport interface AttachSkillRequest {\n skill: string\n /** Required when attaching a skill whose static scan has findings. */\n allowFindings?: boolean\n}\n\n/** Body for `PATCH /api/agents/:id/team`: move the agent to a new team. */\nexport interface MoveAgentRequest {\n teamId: string\n /** A move is revision-checked and requires an explicit policy placement. */\n sourceExpectedRevision: number\n destinationExpectedRevision: number\n placement: Exclude<TeamPolicyPlacement, 'template_snapshot'>\n}\n\n// --- canonical Team templates and Team policy ---\n\nexport interface TeamTemplateSlotInput {\n /** Existing stable slot. Omit for a new server-allocated slot. */\n slotId?: string\n /** Request-local reference used by edges for a new slot. */\n clientKey?: string\n profileId: string\n agentName: string\n modelOverride?: string | null\n reasoningLevel?: ReasoningLevel | null\n layoutPosition?: { x: number; y: number } | null\n display?: Record<string, unknown> | null\n}\n\nexport interface TeamTemplateEdgeInput {\n sourceKind: TemplateEndpointKind\n sourceId?: string | null\n targetKind: TemplateEndpointKind\n targetId?: string | null\n posture?: CommunicationEdgePosture\n}\n\nexport interface CreateTeamTemplateRequest {\n id: string\n name: string\n userMd?: string | null\n}\n\nexport interface UpdateTeamTemplateRequest {\n expectedRevision: number\n name?: string\n userMd?: string | null\n}\n\nexport interface PutTeamTemplateDefinitionRequest {\n expectedRevision: number\n slots: TeamTemplateSlotInput[]\n edges: TeamTemplateEdgeInput[]\n}\n\nexport interface CloneTeamTemplateRequest {\n templateExpectedRevision: number\n id: string\n name?: string\n}\n\nexport interface SpawnTeamTemplateRequest {\n templateExpectedRevision: number\n teamId: string\n teamExpectedRevision?: number\n mode: 'initialize' | 'append'\n userMd?: string\n}\n\nexport interface TeamPolicyEdgeInput {\n sourceKind: LiveEndpointKind\n sourceId?: string | null\n targetKind: LiveEndpointKind\n targetId?: string | null\n posture?: CommunicationEdgePosture\n}\n\nexport interface PutGroupTeamPolicyPolicyRequest {\n expectedRevision: number\n edges: TeamPolicyEdgeInput[]\n}\n\nexport interface AdoptTeamTemplateRequest {\n teamExpectedRevision: number\n templateId: string\n templateExpectedRevision: number\n slotMappings: Array<{ slotId: string; agentId: string }>\n remainingPlacements: Array<{\n agentId: string\n placement: Exclude<TeamPolicyPlacement, 'template_snapshot'>\n }>\n previewEdges: TeamPolicyEdgeInput[]\n}\n\nexport interface UpdateTeamPolicySourceRequest {\n teamExpectedRevision: number\n templateExpectedRevision: number\n includeAgentIds: string[]\n}\n\nexport interface SaveTeamPolicyAsTemplateRequest {\n expectedRevision: number\n id: string\n name: string\n userMd?: string | null\n}\n\nexport interface SendMessageRequest {\n from: string\n payload: { text: string }\n replyTo?: string\n}\n\nexport interface CommunicationPendingResponse {\n code?: 'communication_pending'\n decision: 'approval_required'\n approvalId: string\n status: 'pending'\n expiresAt: number\n attemptKind: string\n attemptId: string\n}\n\nexport interface ListInboxQuery {\n unread?: boolean\n}\n\nexport interface ListInboxResponse {\n messages: Message[]\n}\n\nexport interface ListAgentLoopBreaksResponse {\n events: import('./entities.ts').AgentLoopBreakEvent[]\n}\n\nexport interface UpdateMessageRequest {\n read: true\n}\n\n// --- profiles ---\n\nexport interface UpdateProfileRequest {\n name?: string\n defaultModel?: string\n skillsMode?: 'all' | 'selected'\n defaultSkills?: string[]\n /** Omit to leave unchanged; null clears the row. */\n communicationDefaults?: ProfileCommunicationDefaults | null\n}\n\nexport interface CreateProfileRequest {\n id: string\n name?: string\n defaultModel: string\n skillsMode?: 'all' | 'selected'\n defaultSkills?: string[]\n /** Omit to create no defaults row. */\n communicationDefaults?: ProfileCommunicationDefaults\n /** Initial SOUL.md content. Falls back to the built-in template when omitted. */\n soul?: string\n /** Initial IDENTITY.md content. Falls back to the built-in template when omitted. */\n identity?: string\n /** Initial BOOTSTRAP.md content. Omit for default; pass null to skip bootstrap entirely. */\n bootstrap?: string | null\n /** Initial AGENTS.md content. Omit for the default template; pass null to skip the file. */\n agents?: string | null\n /** Initial TOOLS.md content. Omit for the default template; pass null to skip the file. */\n tools?: string | null\n}\n\n// --- teams ---\n\nexport interface RegisterTeamRequest {\n /** Slug (lowercase, digits, hyphens). Becomes the row id AND the directory\n * name under `~/.bazilion/teams/<slug>/`. */\n id: string\n /** Optional human-readable label. Defaults to `id`. */\n name?: string\n /**\n * Optional symlink target. When set, the daemon materializes the team\n * slot as a symlink to this absolute path instead of as a real directory\n * — useful for \"agents working on my existing project tree.\" Target must\n * exist and be a directory.\n */\n link?: string\n}\n\n/** Body for `PUT /api/teams/:id/user-md`. */\nexport interface SetTeamUserMdRequest {\n userMd: string\n}\n\n/**\n * Body for `PUT /api/teams/:id/topic-format`. `null` (or an empty/whitespace\n * string) clears the template and reverts to built-in topic naming.\n */\nexport interface SetTeamTopicFormatRequest {\n format: string | null\n}\n\n/** Body for `POST /api/config/telegram/acl` — add a user to the allowlist. */\nexport interface AddTelegramAllowedUserRequest {\n userId: number\n username?: string | null\n label?: string | null\n /** Defaults to 'member' when omitted. */\n role?: TelegramAclRole\n}\n\n// --- skills (write) ---\n\nexport interface ImportSkillsRequest {\n source: string\n /** Overwrite existing skills and confirm static-scan warnings. */\n force?: boolean\n}\n\nexport interface ImportSkillsResponse {\n imported: string[]\n skipped: { name: string; reason: string; findings?: SkillScanFinding[] }[]\n findings?: Record<string, SkillScanFinding[]>\n}\n\n// --- providers (write) ---\n\nexport interface ProviderTestRequest {\n model: string\n message?: string\n}\n\nexport interface ProviderTestResponse {\n content: string\n usage?: {\n promptTokens: number\n completionTokens: number\n }\n}\n\n// --- chat streaming ---\n\n/**\n * A file the user attaches to a chat message. One generic shape for everything;\n * the daemon classifies it at turn assembly: `image/*` goes to the model as\n * vision, anything else is stored on disk and referenced by path so the agent\n * decides how to process it.\n */\nexport interface Attachment {\n /** Original filename when known (used for stored non-image files). */\n name?: string\n /** e.g. \"image/png\", \"application/pdf\", \"text/csv\". */\n mimeType: string\n /** base64-encoded bytes (no data: prefix). */\n data: string\n}\n\nexport interface ChatRequest {\n message: string\n /** Files attached to this message (images → vision; others → stored + referenced). */\n attachments?: Attachment[]\n /** Explicit client capability. Omitted callers fail closed instead of waiting for input. */\n bashApprovalMode?: BashApprovalMode\n}\n\nexport interface CommandApprovalDecisionRequest {\n decision: 'allow' | 'deny'\n}\n\nexport interface CommandApprovalDecisionResponse {\n approval: CommandApproval\n}\n\nexport interface ListCommandApprovalsResponse {\n approvals: CommandApproval[]\n}\n\n// --- profile files ---\n\nexport type ProfileFileName =\n | 'profile.json'\n | 'SOUL.md'\n | 'IDENTITY.md'\n | 'BOOTSTRAP.md'\n | 'AGENTS.md'\n | 'TOOLS.md'\n\nexport const PROFILE_FILES: ProfileFileName[] = [\n 'profile.json',\n 'SOUL.md',\n 'IDENTITY.md',\n 'BOOTSTRAP.md',\n 'AGENTS.md',\n 'TOOLS.md',\n]\n\nexport interface FileContentResponse {\n content: string\n}\n\nexport interface PutFileRequest {\n content: string\n}\n\n// --- skills ---\n\nexport type SkillScanSeverity = 'warning' | 'danger'\n\nexport interface SkillScanFinding {\n code: string\n severity: SkillScanSeverity\n message: string\n line?: number\n}\n\nexport interface SkillInfo {\n name: string\n description: string\n source: string | null\n importedAt: number | null\n parseError?: string\n scanFindings?: SkillScanFinding[]\n}\n\nexport interface ResolvedSkillsResponse {\n resolved: SkillInfo[]\n missing: { name: string; reason: string }[]\n}\n\nexport interface TruncateChatRequest {\n /** Number of leading messages to preserve; everything after is dropped. */\n keepCount: number\n}\n\nexport interface TruncateChatResponse {\n before: number\n after: number\n}\n\n/**\n * Lightweight \"has anything new happened on this agent's session?\" probe.\n * Polled by the web chat UI to detect out-of-band activity (inbox-wakes,\n * scheduled triggers, turns run from another tab) so it can prompt the user\n * to refresh — the session JSONL is append-only, so either a new filename or\n * a bigger byte-count means new entries landed.\n */\nexport interface SessionHeadResponse {\n /** Basename of the most-recent `.jsonl` session file, or `null` if none. */\n file: string | null\n /** Byte size of that file (monotonically increasing while in use). */\n size: number\n}\n\nexport interface ContextFileEntry {\n /** Basename of the injected profile file (e.g. SOUL.md). */\n name: string\n /** Full character count of the file's contribution to the system prompt. */\n chars: number\n /** Rough token estimate (chars / 4). */\n tokens: number\n}\n\nexport interface ContextToolEntry {\n name: string\n /** JSON schema char size (what the provider sees as tool definitions). */\n schemaChars: number\n /** Description char size. */\n descriptionChars: number\n /** Count of top-level properties on the input schema, when shaped like JSONSchema. */\n paramCount: number | null\n}\n\nexport interface ContextSkillEntry {\n name: string\n /** Char count of the skill block injected into the system prompt (currently just the name). */\n blockChars: number\n}\n\nexport interface ContextGroupEntry {\n id: string\n name: string\n path: string\n userMdChars: number\n}\n\nexport interface ContextHistoryBreakdown {\n /** Count of `message` entries. */\n messageEntries: number\n /** Count of `compaction` entries (summarization boundaries). */\n compactionEntries: number\n /** Char sum of message `content` fields (LLM input surface). */\n chars: number\n /** Raw wire size of the serialized log on disk. */\n bytes: number\n /** Rough token estimate (chars / 4) for history alone. */\n tokensEstimate: number\n}\n\nexport interface ChatContextResponse {\n /** Agent being reported on. */\n agentId: string\n /** provider:model string the agent currently resolves to. */\n model: string\n systemPrompt: {\n chars: number\n tokens: number\n /** Per-file breakdown of profile markdown sources. */\n files: ContextFileEntry[]\n /** Char count of the skill-list text rendered into the system prompt. */\n skillsListChars: number\n /** Char count of the team block rendered into the system prompt. */\n teamListChars: number\n /** Char count of the USER.md block (0 when the team's userMd is empty). */\n userMdChars: number\n /** Fixed memory-hint block the runtime always appends. */\n memoryHintChars: number\n }\n tools: {\n count: number\n listChars: number\n schemaChars: number\n entries: ContextToolEntry[]\n }\n skills: {\n count: number\n entries: ContextSkillEntry[]\n }\n team: ContextGroupEntry\n history: ContextHistoryBreakdown\n /** Sum of system prompt + tool schemas + history, in chars + tokens. */\n totals: { chars: number; tokens: number }\n}\n\nexport interface ChatCompactRequest {\n /** Number of trailing message entries to keep verbatim. Default 10. */\n keepTail?: number\n /** Optional freeform guidance prepended to the summarizer system prompt. */\n customInstructions?: string\n}\n\nexport interface ChatCompactResponse {\n /** Entry count before compaction. */\n before: number\n /** Entry count after compaction (1 compaction + `keptTail` messages). */\n after: number\n /** Message entries summarized into the compaction (the head that was dropped). */\n summarized: number\n /** Message entries preserved verbatim after the compaction boundary. */\n keptTail: number\n /** Rough token estimate of the log before compaction. */\n tokensBefore: number\n /** Rough token estimate of the log after compaction. */\n tokensAfter: number\n /** The summary text produced by the model. */\n summary: string\n}\n\n// --- scheduled triggers (interval / cron) ---\n\nexport interface CreateTriggerRequest {\n kind: 'interval' | 'cron'\n /** required when kind='interval' */\n intervalSec?: number\n /** required when kind='cron' — 5-field expression (\"m h dom mon dow\") */\n cronExpr?: string\n /** injected as the user message when the trigger fires */\n message: string\n enabled?: boolean\n}\n\nexport interface UpdateTriggerRequest {\n enabled?: boolean\n}\n\nexport interface CreateTriggerResponse {\n trigger: AgentTrigger\n}\n\nexport interface UpdateTriggerResponse {\n trigger: AgentTrigger\n}\n\nexport interface ListTriggersResponse {\n triggers: AgentTrigger[]\n dispatches: TriggerDispatch[]\n}\n\nexport interface ListTriggerDispatchesResponse {\n dispatches: TriggerDispatch[]\n}\n\n// --- config page (providers + services + fields) ---\n\n/** Per-field UI + storage descriptor — source-of-truth is SERVICES in apps/daemon/src/core/services.ts. */\nexport interface ServiceFieldState {\n envVar: string\n kind: 'secret' | 'config'\n label: string\n placeholder?: string\n description?: string\n /** True when the field has a non-empty value in its storage backend. */\n set: boolean\n /** For `kind: 'config'` (plaintext): the actual value. Omitted for secrets. */\n value?: string\n /** For `kind: 'secret'`: a truncated preview like \"sk-abc…\" so the UI can confirm something is stored. Omitted when unset. */\n preview?: string\n}\n\nexport interface ServiceCard {\n id: string\n displayName: string\n /** Present for category==='provider' cards — tracks whether the pi-adapter sees it as configured. */\n enabled?: boolean\n envHint?: string\n hint?: string\n /** Display grouping label (e.g. \"Web tools\"). Cards without a team are bucketed under \"Other\". */\n team?: string\n fields: ServiceFieldState[]\n}\n\nexport interface ProviderConfigEntry extends ServiceCard {\n enabled: boolean\n envHint: string\n /** Static catalog from pi-ai's typed model list — empty for providers not in the catalog. */\n catalog: string[]\n /** Live `/v1/models` query — omitted when the provider doesn't expose one. */\n live?: { models: string[]; error?: string }\n /** Curated models the admin has selected — drives the dropdowns in profile/agent forms. */\n curated: string[]\n}\n\nexport interface ProviderConfigResponse {\n providers: ProviderConfigEntry[]\n}\n\nexport interface ServiceConfigResponse {\n services: ServiceCard[]\n}\n\nexport interface SetFieldRequest {\n value: string\n}\n\nexport interface SetProviderModelsRequest {\n models: string[]\n}\n\nexport interface SetProviderModelsResponse {\n models: string[]\n}\n\nexport interface SetProviderEnabledRequest {\n enabled: boolean\n}\n\nexport interface SetProviderEnabledResponse {\n name: string\n enabled: boolean\n}\n\n// --- web tokens ---\n\nexport interface CreateTokenRequest {\n label: string\n /** Device lifetime in days. Defaults to 90 and must be between 1 and 365. */\n expiresInDays?: number\n}\n\nexport interface CreateTokenResponse {\n /** Plaintext token — returned exactly once. */\n token: string\n meta: WebToken\n}\n\nexport interface ListTokensResponse {\n tokens: WebToken[]\n}\n\nexport interface ListSessionsResponse {\n sessions: WebSession[]\n}\n\nexport interface AuthenticatedOwnerResponse {\n authenticated: true\n setupComplete: boolean\n publicOrigin: string | null\n principal: {\n kind: 'bootstrap' | 'device' | 'session'\n tokenId: string\n label: string\n sessionId: string | null\n }\n}\n\nexport interface PublicHealthResponse {\n ok: true\n}\n\n// --- health (doctor) ---\n\nexport type ExecutionCodingSurface = 'host' | 'docker' | 'unavailable'\n\n/** Closed, secret-free reasons returned by the protected Docker readiness probe. */\nexport type ProtectedDockerReadinessReason =\n | 'unsupported platform'\n | 'Docker executable is unavailable'\n | 'Docker must use a local Unix socket'\n | 'Docker socket is unavailable'\n | 'Docker image is unavailable'\n | 'Docker image declares writable volumes'\n | 'Docker preflight failed'\n\nexport interface ExecutionSecurityReport {\n /** Explicit compatibility posture for operator-initiated web/CLI/mobile HTTP turns. */\n configuredOperatorHttp: {\n protected: false\n codingSurface: ExecutionCodingSurface\n dockerImage: string\n browser: 'enabled' | 'disabled'\n mcp: 'enabled' | 'disabled'\n }\n /** Mandatory posture for Telegram, schedules, inbox wake-ups, and approval delivery. */\n protectedUnattendedTurns: {\n /**\n * Process-wide prerequisites are available. This is not whole-turn readiness: every turn\n * separately validates its selected normal/review model, bound refresh, and mounts/paths.\n */\n baseRuntimeReady: boolean\n codingSurface: 'docker'\n docker: {\n ready: boolean\n image: string\n /** Null when ready or when Docker was not probed because shell configuration was invalid. */\n reason: ProtectedDockerReadinessReason | null\n }\n browser: 'denied'\n mcp: 'denied'\n openaiCodex: {\n enabled: boolean\n connected: boolean\n /** Stored access token is locally current; every turn still revalidates/refreshes. */\n accessCurrent: boolean\n /** A connected credential will be refreshed by the next turn when access is near expiry. */\n refreshOnNextTurn: boolean\n /** Process-wide provider prerequisites are present; individual turns still bind/refresh. */\n baselineEligible: boolean\n }\n /** Exactly one secret-free next action when `baseRuntimeReady` is false. */\n remediation: string | null\n }\n}\n\nexport interface HealthReport {\n /** Structural install health only; it does not claim that protected work can execute. */\n ok: boolean\n /**\n * Mandatory process-wide prerequisites for protected work. Every turn still validates its\n * selected normal/review model, bound refresh, and mounts/paths.\n */\n protectedWorkBaselineReady: boolean\n home: string\n paths: {\n home: boolean\n db: boolean\n auth: boolean\n profiles: boolean\n agents: boolean\n skills: boolean\n }\n database:\n | { ok: true; profiles: number; activeAgents: number; totalAgents: number; teams: number }\n | { ok: false; error: string }\n | null\n skills: { installed: number; parseErrors: number }\n providers: {\n /** Names of cloud providers with credentials configured (e.g. ['anthropic', 'groq']). */\n configured: string[]\n lmstudio: { customEndpointConfigured: boolean; keyConfigured: boolean }\n ollama: { customEndpointConfigured: boolean }\n }\n webSearch: { braveConfigured: boolean; searxngConfigured: boolean }\n openclaw: { path: string; exists: boolean }\n triggers: { active: number; disabled: number }\n tokens: { active: number }\n scheduler: { enabled: boolean; tickMs: number }\n shellSecurity:\n | {\n ok: true\n sandboxMode: 'off' | 'docker'\n approvalMode: 'off' | 'dangerous'\n sandboxImage: string\n hostCodingTools: boolean\n network: 'host' | 'none'\n }\n | {\n ok: false\n error: string\n }\n executionSecurity: ExecutionSecurityReport\n teamPolicyManagement: {\n contractVersion: number\n enforcementRequested: boolean\n enforcementActive: boolean\n releaseReady: boolean\n degraded: boolean\n decisions: { allowed: number; denied: number }\n }\n}\n\n// --- telegram integration ---\n\n/** Body for `PUT /api/config/telegram` — both fields required; daemon stores each in its proper table. */\nexport interface TelegramConfigInput {\n /** Bot token from BotFather. Goes to the encrypted `secrets` table as TELEGRAM_BOT_TOKEN. */\n botToken: string\n /** Supergroup numeric chat id. Goes to the plaintext `config` table as TELEGRAM_CHAT_ID. */\n chatId: string\n}\n\n/**\n * The four preflight checks that must all pass before the integration is\n * considered usable. Each call is one-shot — no polling, no bot running.\n */\nexport interface TelegramPreflight {\n /** Bot identity from getMe. Username has no leading `@`. */\n botUsername: string\n /** Display name of the supergroup, from getChat. */\n chatTitle: string\n /** True iff the chat has forum topics enabled (the irreversible owner-only toggle). */\n isForum: boolean\n /** True iff the bot is admin in the supergroup with the can_manage_topics right. */\n hasManageTopics: boolean\n /** True iff Privacy Mode is OFF (getMe.can_read_all_group_messages). */\n privacyModeOff: boolean\n /** True when getChat reports no public @username. */\n chatIsPrivate: boolean\n /** Telegram's current member count, used as a visibility warning only. */\n memberCount: number | null\n /** Paired owner is currently reported as a chat member. Null while unpaired. */\n ownerPresent: boolean | null\n}\n\n/**\n * Live state of the polling singleton on the daemon side. `null` when no bot\n * is running (creds absent, or daemon hasn't activated yet); populated once\n * the bot has been started.\n *\n * `lastSuccessfulPollAt` is the epoch-ms timestamp of the most recent\n * `getUpdates` call that completed without throwing — drives the stall\n * watchdog (BAZILION_TELEGRAM_POLLING_STALL_MS, default 120000).\n *\n * `error` is the most recent failure surfaced by the bot or its runner — set\n * when polling crashed, cleared when polling resumes.\n *\n * `activated` flips to true after the one-time first-activation completes\n * (service chat created, directory message pinned, General hidden, commands\n * registered).\n */\nexport interface TelegramPollingState {\n running: boolean\n activated: boolean\n lastUpdateId: number | null\n lastSuccessfulPollAt: number | null\n startedAt: number | null\n error: string | null\n}\n\n/**\n * Response from `GET /api/config/telegram/health`. When credentials aren't\n * configured, `configured: false` and `preflight` is `null`. When credentials\n * are configured but a preflight call errored, `preflight` is `null` and\n * `error` carries the failing step + message.\n *\n * `polling` is `null` until Step 2 starts a bot; once activated, it carries\n * the live state of the polling singleton (running, watermark, last-poll\n * timestamp, any error). Drives the live \"is the bot working?\" indicator in\n * the web setup card.\n */\nexport interface TelegramHealth {\n configured: boolean\n preflight: TelegramPreflight | null\n error: {\n step: 'getMe' | 'getChat' | 'getChatMember'\n message: string\n } | null\n polling: TelegramPollingState | null\n}\n\n/**\n * Response from `GET /api/config/telegram` — what's stored, without exposing\n * the bot token plaintext. Used by the setup form to render \"configured\"\n * state on first load.\n */\nexport interface TelegramConfigState {\n /** True iff both botToken and chatId are present in storage. */\n configured: boolean\n /** Plaintext chat id (empty string when unset). */\n chatId: string\n /** Masked preview of the bot token like `1234567:AAHi…`. Empty when unset. */\n botTokenPreview: string\n /**\n * Set when Telegram reported a `migrate_to_chat_id` for the configured\n * supergroup. The UI surfaces a \"your chat id changed — reconnect\" banner;\n * `POST /api/config/telegram/reconnect` applies it. Null when no migration\n * is pending.\n */\n migratedChatId: string | null\n}\n\nexport interface TelegramPairingStatus {\n paired: boolean\n challengeActive: boolean\n challengeExpiresAt: number | null\n ownerUserId: number | null\n}\n\nexport interface TelegramPairingChallenge extends TelegramPairingStatus {\n /** One-time plaintext. Returned only by challenge creation. */\n code: string\n expiresAt: number\n}\n\n/**\n * Response from `POST /api/agents/:id/telegram/bind`. The full agent is\n * returned with telegramTopicId populated, plus a deep-link the client can\n * surface as a button. `created` distinguishes \"we made a new topic\" from\n * \"agent was already bound\".\n */\nexport interface TelegramBindResponse {\n agent: Agent\n topicId: number\n deepLink: string\n created: boolean\n}\n","import type {\n ProviderConfigResponse,\n ProviderTestRequest,\n ProviderTestResponse,\n SetProviderEnabledResponse,\n SetProviderModelsRequest,\n SetProviderModelsResponse,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst listCmd = defineCommand({\n meta: {\n name: 'list',\n description: 'List all providers with enabled/disabled state and curated model counts',\n },\n args: {\n enabled: { type: 'boolean', description: 'Show only enabled providers' },\n },\n async run({ args }) {\n const client = createClient()\n const { providers } = await client.get<ProviderConfigResponse>('/api/config/providers')\n const filtered = args.enabled ? providers.filter((p) => p.enabled) : providers\n if (filtered.length === 0) {\n console.log('(no providers to show)')\n return\n }\n const rows = filtered.map((p) => [\n p.id,\n p.enabled ? 'enabled' : 'disabled',\n `${p.curated.length} curated`,\n `${p.catalog.length} catalog`,\n p.enabled ? '' : `(set ${p.envHint})`,\n ])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst modelsCmd = defineCommand({\n meta: {\n name: 'models',\n description: 'Show curated + catalog + live models for one provider',\n },\n args: {\n name: { type: 'positional', required: true, description: 'Provider name' },\n },\n async run({ args }) {\n const client = createClient()\n const { providers } = await client.get<ProviderConfigResponse>('/api/config/providers')\n const p = providers.find((x) => x.id === args.name)\n if (!p) {\n console.error(`unknown provider: ${args.name}`)\n process.exit(1)\n }\n console.log(`# ${p.id} (${p.enabled ? 'enabled' : 'disabled'})`)\n if (!p.enabled) console.log(` (set ${p.envHint} to enable)`)\n\n console.log('\\n## curated')\n if (p.curated.length === 0) console.log(' (none — use `provider models-set` to pin some)')\n else for (const m of p.curated) console.log(` ${m}`)\n\n console.log('\\n## catalog (from pi-ai)')\n if (p.catalog.length === 0) console.log(' (empty)')\n else for (const m of p.catalog) console.log(` ${m}`)\n\n if (p.live) {\n console.log('\\n## live (from upstream /v1/models)')\n if (p.live.error) console.log(` (error: ${p.live.error})`)\n else if (p.live.models.length === 0) console.log(' (empty)')\n else for (const m of p.live.models) console.log(` ${m}`)\n }\n },\n})\n\nconst modelsSetCmd = defineCommand({\n meta: {\n name: 'models-set',\n description: 'Replace the curated model list for a provider (comma-separated)',\n },\n args: {\n name: { type: 'positional', required: true, description: 'Provider name' },\n models: {\n type: 'positional',\n required: true,\n description: 'Comma-separated model list (empty string clears the list)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const models = args.models\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n const body: SetProviderModelsRequest = { models }\n const saved = await client.put<SetProviderModelsResponse>(\n `/api/config/providers/${encodeURIComponent(args.name)}/models`,\n body,\n )\n console.log(`saved ${saved.models.length} curated model(s) for ${args.name}`)\n for (const m of saved.models) console.log(` ${m}`)\n },\n})\n\nconst enableCmd = defineCommand({\n meta: { name: 'enable', description: 'Toggle a provider on so agents can use it' },\n args: {\n name: { type: 'positional', required: true, description: 'Provider id (e.g. anthropic)' },\n },\n async run({ args }) {\n const client = createClient()\n const res = await client.put<SetProviderEnabledResponse>(\n `/api/config/providers/${encodeURIComponent(args.name)}/enabled`,\n { enabled: true },\n )\n console.log(`${res.name}: enabled`)\n },\n})\n\nconst disableCmd = defineCommand({\n meta: {\n name: 'disable',\n description: 'Toggle a provider off — agents will refuse its model strings',\n },\n args: {\n name: { type: 'positional', required: true, description: 'Provider id' },\n },\n async run({ args }) {\n const client = createClient()\n const res = await client.put<SetProviderEnabledResponse>(\n `/api/config/providers/${encodeURIComponent(args.name)}/enabled`,\n { enabled: false },\n )\n console.log(`${res.name}: disabled`)\n },\n})\n\nconst testCmd = defineCommand({\n meta: { name: 'test', description: 'Send a single chat to a model and print the reply' },\n args: {\n model: {\n type: 'positional',\n required: true,\n description: 'Model string, e.g. anthropic:claude-opus-4-8',\n },\n message: { type: 'string', description: 'Message text (default \"say hi briefly\")' },\n },\n async run({ args }) {\n const client = createClient()\n const body: ProviderTestRequest = { model: args.model, message: args.message }\n console.log(`-> ${args.model}: ${args.message ?? 'say hi briefly'}`)\n const res = await client.post<ProviderTestResponse>('/api/providers/test', body)\n console.log(`<- ${res.content}`)\n if (res.usage) {\n console.log(`(${res.usage.promptTokens} in, ${res.usage.completionTokens} out)`)\n }\n },\n})\n\nexport const providerCommand = defineCommand({\n meta: { name: 'provider', description: 'Manage and test LLM providers' },\n subCommands: {\n list: listCmd,\n enable: enableCmd,\n disable: disableCmd,\n models: modelsCmd,\n 'models-set': modelsSetCmd,\n test: testCmd,\n },\n})\n","import type { CommunicationPendingResponse, Message, SendMessageRequest } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nexport const sendCommand = defineCommand({\n meta: {\n name: 'send',\n description: 'Send a message from one agent to another',\n },\n args: {\n from: { type: 'positional', required: true, description: 'Sender agent id' },\n to: { type: 'positional', required: true, description: 'Recipient agent id' },\n message: { type: 'positional', required: true, description: 'Message text' },\n },\n async run({ args }) {\n const client = createClient()\n const body: SendMessageRequest = {\n from: args.from,\n payload: { text: args.message },\n }\n const result = await client.post<Message | CommunicationPendingResponse>(\n `/api/agents/${args.to}/messages`,\n body,\n )\n if ('approvalId' in result) {\n console.log(\n `pending approval ${result.approvalId} (expires ${new Date(result.expiresAt).toISOString()})`,\n )\n return\n }\n console.log(`sent message ${result.id}`)\n },\n})\n","import { spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\n\n// In published builds, serve.ts is inlined into dist/cli.js — the daemon\n// sits next to it as dist/daemon.js. In dev (running .ts source via tsx),\n// fall back to walking up to apps/daemon/src/index.ts.\nconst bundledDaemonEntry = join(import.meta.dirname, 'daemon.js')\nconst sourceDaemonEntry = join(import.meta.dirname, '..', '..', '..', 'daemon', 'src', 'index.ts')\nconst daemonEntry = existsSync(bundledDaemonEntry) ? bundledDaemonEntry : sourceDaemonEntry\n\nexport const serveCommand = defineCommand({\n meta: {\n name: 'serve',\n description: 'Start the bazilion daemon (HTTP API)',\n },\n args: {\n port: { type: 'string', description: 'Port (default 4321)' },\n host: {\n type: 'string',\n description: 'Host (default 127.0.0.1). Put a TLS proxy in front before binding 0.0.0.0',\n },\n },\n async run({ args }) {\n if (!existsSync(daemonEntry)) {\n throw new Error(\n `bazilion daemon not found at ${daemonEntry}. Are you running from a development checkout?`,\n )\n }\n\n const env: NodeJS.ProcessEnv = { ...process.env }\n if (args.port) env.PORT = args.port\n if (args.host) env.HOST = args.host\n\n const host = args.host ?? '127.0.0.1'\n const port = args.port ?? '4321'\n\n if (host !== '127.0.0.1' && host !== 'localhost' && host !== '::1') {\n console.error('')\n console.error(`⚠ binding to ${host} — the daemon is now reachable beyond loopback.`)\n console.error(' anyone on this network who has a valid token can reach every API.')\n console.error(' put a TLS proxy in front for untrusted networks.')\n console.error('')\n }\n\n console.log(`starting bazilion daemon at http://${host}:${port}`)\n console.log('(web UI runs separately: cd apps/web && pnpm dev)')\n\n // Spawn the daemon. In dev mode the entry is .ts so we go through tsx;\n // in published builds it's bundled .js so plain node is enough. Stdio\n // inherited so the daemon's startup log and any console.error go to the\n // user's terminal directly. The daemon installs its own SIGINT/SIGTERM\n // handlers and shuts the HTTP server gracefully — we just need to keep\n // this process alive long enough for it.\n const nodeArgs = daemonEntry.endsWith('.ts')\n ? ['--import', 'tsx/esm', daemonEntry]\n : [daemonEntry]\n const proc = spawn('node', nodeArgs, {\n env,\n stdio: 'inherit',\n })\n\n let signalled = false\n const onSigterm = (): void => {\n signalled = true\n try {\n proc.kill('SIGTERM')\n } catch {}\n }\n // SIGINT from the kernel (Ctrl+C) goes to the foreground pgroup, so the\n // daemon already gets it directly — we just have to stay alive.\n process.on('SIGINT', () => {\n signalled = true\n })\n process.on('SIGTERM', onSigterm)\n\n await new Promise<void>((resolve, reject) => {\n proc.on('error', (err) => reject(err))\n proc.on('close', (code) => {\n // signalled exits get translated to 0 so the outer `pnpm tsx … serve`\n // wrapper doesn't print `ELIFECYCLE Command failed` after a clean Ctrl+C.\n if (signalled) {\n process.exitCode = 0\n resolve()\n } else if (code === 0 || code === null) {\n resolve()\n } else {\n process.exitCode = code\n resolve()\n }\n })\n })\n },\n})\n","import type { ListSessionsResponse, WebSession } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction row(session: WebSession): string[] {\n const state = session.revokedAt\n ? 'revoked'\n : session.absoluteExpiresAt <= Date.now() || session.idleExpiresAt <= Date.now()\n ? 'expired'\n : 'active'\n return [\n session.id,\n state,\n session.current ? 'current' : '',\n session.deviceLabel,\n `idle: ${new Date(session.idleExpiresAt).toISOString()}`,\n `absolute: ${new Date(session.absoluteExpiresAt).toISOString()}`,\n ]\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List browser sessions' },\n async run() {\n const { sessions } = await createClient().get<ListSessionsResponse>('/api/sessions')\n if (sessions.length === 0) {\n console.log('(no active browser sessions)')\n return\n }\n for (const line of columnize(sessions.map(row))) console.log(line)\n },\n})\n\nconst revokeCmd = defineCommand({\n meta: { name: 'revoke', description: 'Revoke one browser session' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n await createClient().del(`/api/sessions/${encodeURIComponent(args.id)}`)\n console.log(`revoked browser session ${args.id}`)\n },\n})\n\nexport const sessionCommand = defineCommand({\n meta: { name: 'session', description: 'Manage browser sessions' },\n subCommands: { list: listCmd, revoke: revokeCmd },\n})\n","import { existsSync, readFileSync, statSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport type {\n ImportSkillsRequest,\n ImportSkillsResponse,\n ResolvedSkillsResponse,\n SkillInfo,\n SkillScanFinding,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { ApiClientError, createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction printFindings(findings: SkillScanFinding[], prefix = ' '): void {\n for (const f of findings) {\n const line = f.line ? ` line ${f.line}` : ''\n console.log(`${prefix}${f.severity}: ${f.code}${line} - ${f.message}`)\n }\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List installed skills (or those attached to an agent)' },\n args: {\n agent: { type: 'string', description: 'Filter to skills attached to this agent' },\n },\n async run({ args }) {\n const client = createClient()\n\n if (args.agent) {\n const set = await client.get<ResolvedSkillsResponse>(`/api/agents/${args.agent}/skills`)\n if (set.resolved.length === 0 && set.missing.length === 0) {\n console.log('(no skills attached to this agent)')\n return\n }\n const rows = set.resolved.map((s) => [s.name, s.description])\n for (const line of columnize(rows)) console.log(line)\n for (const m of set.missing) {\n console.log(`(missing: ${m.name} — ${m.reason})`)\n }\n return\n }\n\n const skills = await client.get<SkillInfo[]>('/api/skills')\n if (skills.length === 0) {\n console.log('(no skills installed; use \"bazilion skill import\" to add some)')\n return\n }\n const rows = skills.map((s) => [\n s.name,\n s.parseError ? `(parse error: ${s.parseError})` : s.description,\n ])\n for (const line of columnize(rows)) console.log(line)\n const flagged = skills.filter((s) => s.scanFindings && s.scanFindings.length > 0)\n if (flagged.length > 0) {\n console.log('')\n console.log('scan findings:')\n for (const s of flagged) {\n console.log(`${s.name}:`)\n printFindings(s.scanFindings ?? [])\n }\n }\n },\n})\n\nconst importCmd = defineCommand({\n meta: {\n name: 'import',\n description: 'Import skills from openclaw, a directory, or a local .zip archive',\n },\n args: {\n from: {\n type: 'string',\n required: true,\n description:\n 'Source: \"openclaw\", a filesystem path on the server, or a local .zip file to upload',\n },\n force: { type: 'boolean', description: 'Overwrite existing skills' },\n },\n async run({ args }) {\n const client = createClient()\n\n // Auto-detect local .zip uploads: if `--from` points at an existing local\n // file ending in .zip, stream it to the server as multipart. Otherwise\n // fall through to the legacy JSON path (server reads the source directly).\n const absFrom = resolve(args.from)\n const isLocalZip =\n args.from.toLowerCase().endsWith('.zip') && existsSync(absFrom) && statSync(absFrom).isFile()\n\n let result: ImportSkillsResponse\n try {\n if (isLocalZip) {\n const bytes = readFileSync(absFrom)\n const file = new File([bytes], basename(absFrom), { type: 'application/zip' })\n const fd = new FormData()\n fd.set('file', file)\n if (args.force) fd.set('force', 'true')\n result = await client.postMultipart<ImportSkillsResponse>('/api/skills/import', fd)\n } else {\n const body: ImportSkillsRequest = {\n source: args.from,\n force: args.force,\n }\n result = await client.post<ImportSkillsResponse>('/api/skills/import', body)\n }\n } catch (err) {\n if (err instanceof ApiClientError && err.body.code === 'skill_scan_blocked') {\n console.error(`error: ${err.body.error}`)\n if (err.body.findings && err.body.findings.length > 0) {\n console.error('scan findings:')\n for (const f of err.body.findings) {\n const line = f.line ? ` line ${f.line}` : ''\n console.error(` ${f.severity}: ${f.code}${line} - ${f.message}`)\n }\n }\n console.error(' hint: inspect the skill, then rerun with --force to confirm')\n process.exitCode = 1\n return\n }\n throw err\n }\n\n if (result.imported.length === 0 && result.skipped.length === 0) {\n console.log('(nothing to import)')\n return\n }\n for (const name of result.imported) {\n console.log(`imported ${name}`)\n }\n for (const s of result.skipped) {\n console.log(`skipped ${s.name}: ${s.reason}`)\n }\n if (result.findings && Object.keys(result.findings).length > 0) {\n console.log('')\n console.log('confirmed scan findings:')\n for (const [name, findings] of Object.entries(result.findings)) {\n console.log(`${name}:`)\n printFindings(findings)\n }\n }\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Remove an installed skill' },\n args: {\n name: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/skills/${encodeURIComponent(args.name)}`)\n console.log(`removed skill ${args.name}`)\n },\n})\n\nexport const skillCommand = defineCommand({\n meta: { name: 'skill', description: 'Manage the skill library' },\n subCommands: {\n list: listCmd,\n import: importCmd,\n rm: rmCmd,\n },\n})\n","import { readFileSync } from 'node:fs'\nimport { stdin } from 'node:process'\nimport type {\n RegisterTeamRequest,\n ResolvedTeamPolicy,\n SetTeamTopicFormatRequest,\n SetTeamUserMdRequest,\n Team,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport { teamPolicyCommand } from './team-policy.ts'\n\nconst addCmd = defineCommand({\n meta: {\n name: 'add',\n description:\n 'Register a team at ~/.bazilion/teams/<slug>/ (use --link to point at an existing tree)',\n },\n args: {\n id: { type: 'positional', required: true, description: 'Team slug' },\n name: { type: 'string', description: 'Display name (defaults to slug)' },\n link: {\n type: 'string',\n description: 'Absolute path of an existing directory; the team slot becomes a symlink to it',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: RegisterTeamRequest = {\n id: args.id,\n ...(args.name ? { name: args.name } : {}),\n ...(args.link ? { link: args.link } : {}),\n }\n const g = await client.post<Team>('/api/teams', body)\n console.log(`registered team ${g.id} at ${g.path}`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List teams' },\n async run() {\n const client = createClient()\n const list = await client.get<Team[]>('/api/teams')\n if (list.length === 0) {\n console.log('(no teams)')\n return\n }\n const rows = list.map((g) => [g.id, g.path])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Remove a team registration' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const policy = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(args.id)}/policy`,\n )\n await client.del(\n `/api/teams/${encodeURIComponent(args.id)}?expectedTeamPolicyRevision=${policy.teamPolicy.revision}`,\n )\n console.log(`removed team ${args.id}`)\n },\n})\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = []\n for await (const chunk of stdin) chunks.push(chunk as Buffer)\n return Buffer.concat(chunks).toString('utf8')\n}\n\nconst userMdShowCmd = defineCommand({\n meta: { name: 'show', description: \"Print the team's USER.md\" },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const g = await client.get<Team>(`/api/teams/${args.id}`)\n process.stdout.write(g.userMd)\n if (g.userMd && !g.userMd.endsWith('\\n')) process.stdout.write('\\n')\n },\n})\n\nconst userMdSetCmd = defineCommand({\n meta: {\n name: 'set',\n description: \"Replace the team's USER.md (from --file, --from-stdin, or inline text)\",\n },\n args: {\n id: { type: 'positional', required: true },\n file: { type: 'string', description: 'Read content from a file path' },\n 'from-stdin': { type: 'boolean', description: 'Read content from stdin' },\n text: { type: 'string', description: 'Inline content' },\n },\n async run({ args }) {\n let content: string\n if (args['from-stdin']) content = await readStdin()\n else if (args.file) content = readFileSync(args.file, 'utf8')\n else if (args.text !== undefined) content = args.text\n else {\n console.error('team user-md set: provide --file, --from-stdin, or --text')\n process.exit(2)\n }\n const client = createClient()\n const body: SetTeamUserMdRequest = { userMd: content }\n await client.put(`/api/teams/${args.id}/user-md`, body)\n console.log(`updated USER.md for team ${args.id} (${content.length} bytes)`)\n },\n})\n\nconst userMdClearCmd = defineCommand({\n meta: { name: 'clear', description: \"Clear the team's USER.md to empty\" },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const body: SetTeamUserMdRequest = { userMd: '' }\n await client.put(`/api/teams/${args.id}/user-md`, body)\n console.log(`cleared USER.md for team ${args.id}`)\n },\n})\n\nconst userMdCmd = defineCommand({\n meta: { name: 'user-md', description: \"View or edit a team's USER.md\" },\n subCommands: {\n show: userMdShowCmd,\n set: userMdSetCmd,\n clear: userMdClearCmd,\n },\n})\n\nconst topicFormatShowCmd = defineCommand({\n meta: { name: 'show', description: \"Print the team's Telegram topic-name template\" },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const g = await client.get<Team>(`/api/teams/${args.id}`)\n console.log(g.telegramTopicNameFormat ?? '(default naming)')\n },\n})\n\nconst topicFormatSetCmd = defineCommand({\n meta: {\n name: 'set',\n description:\n 'Set the topic-name template. Tokens: {agent.name} {team.name} {team.slug} (must include {agent.name})',\n },\n args: {\n id: { type: 'positional', required: true },\n format: {\n type: 'positional',\n required: true,\n description: 'e.g. \"{team.name} / {agent.name}\"',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: SetTeamTopicFormatRequest = { format: args.format }\n const g = await client.put<Team>(`/api/teams/${args.id}/topic-format`, body)\n console.log(`set topic-name template for team ${args.id}: ${g.telegramTopicNameFormat}`)\n },\n})\n\nconst topicFormatClearCmd = defineCommand({\n meta: { name: 'clear', description: 'Clear the template (revert to built-in naming)' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const body: SetTeamTopicFormatRequest = { format: null }\n await client.put(`/api/teams/${args.id}/topic-format`, body)\n console.log(`cleared topic-name template for team ${args.id}`)\n },\n})\n\nconst topicFormatCmd = defineCommand({\n meta: {\n name: 'topic-format',\n description: \"View or edit a team's Telegram forum-topic name template\",\n },\n subCommands: {\n show: topicFormatShowCmd,\n set: topicFormatSetCmd,\n clear: topicFormatClearCmd,\n },\n})\n\nexport const teamCommand = defineCommand({\n meta: { name: 'team', description: 'Manage teams (collaboration contexts)' },\n subCommands: {\n add: addCmd,\n list: listCmd,\n rm: rmCmd,\n 'user-md': userMdCmd,\n 'topic-format': topicFormatCmd,\n policy: teamPolicyCommand,\n },\n})\n","import { readFileSync } from 'node:fs'\nimport type {\n CommunicationAuthorizationResult,\n CommunicationEndpoint,\n PutGroupTeamPolicyPolicyRequest,\n ResolvedTeamPolicy,\n TeamPolicyBlockPage,\n TeamPolicyDetail,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport { edgeDiff, exportTeamPolicy, parseTeamPolicyDocument } from '../team-interchange.ts'\n\ninterface TeamPolicyDiff {\n liveRevision: number\n baseline: { templateId: string; templateRevision: number } | null\n currentSource: { template: { currentRevision: number } } | null\n sourceDiverged: boolean\n comparison: {\n addedSinceBaseline: unknown[]\n removedSinceBaseline: unknown[]\n currentSourceAddedSlotIds: string[]\n currentSourceRemovedSlotIds: string[]\n }\n [key: string]: unknown\n}\n\nfunction readJson(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown\n } catch (error) {\n throw new Error(`invalid JSON: ${(error as Error).message}`)\n }\n}\n\nfunction endpoint(value: string, teamId: string): CommunicationEndpoint {\n if (value === 'user') return { kind: 'user', teamId }\n if (value.startsWith('agent:') && value.length > 6) return { kind: 'agent', id: value.slice(6) }\n if (value.startsWith('outside:') && value.length > 8)\n return { kind: 'outside_team', teamId: value.slice(8) }\n throw new Error('endpoint must be user, agent:<id>, or outside:<team-id>')\n}\n\nfunction printPolicy(detail: ResolvedTeamPolicy): void {\n console.log(`# Team ${detail.teamPolicy.teamId} policy`)\n console.log(`revision: ${detail.teamPolicy.revision}`)\n console.log(\n `baseline: ${detail.baseline ? `${detail.baseline.templateId}@${detail.baseline.templateRevision}` : '(none)'}`,\n )\n console.log(`members: ${detail.members.length}`)\n console.log(`edges: ${detail.edges.length}`)\n if (detail.edges.length) {\n console.log('')\n for (const line of columnize([\n ['source', 'target'],\n ...detail.edges.map((edge) => [\n `${edge.sourceKind}:${edge.sourceId ?? '-'}`,\n `${edge.targetKind}:${edge.targetId ?? '-'}`,\n ]),\n ]))\n console.log(line)\n }\n}\n\nconst show = defineCommand({\n meta: { name: 'show', description: 'Show the one effective live policy for a Team' },\n args: {\n team: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit the canonical aggregate as JSON' },\n },\n async run({ args }) {\n const detail = await createClient().get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n )\n if (args.json) console.log(JSON.stringify(detail, null, 2))\n else printPolicy(detail)\n },\n})\n\nconst exportCommand = defineCommand({\n meta: { name: 'export', description: 'Export a revisioned Team policy document' },\n args: { team: { type: 'positional', required: true } },\n async run({ args }) {\n const detail = await createClient().get<TeamPolicyDetail>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n )\n console.log(\n JSON.stringify(\n exportTeamPolicy(args.team, detail.teamPolicy.revision, detail.edges),\n null,\n 2,\n ),\n )\n },\n})\n\nfunction printEdgeDiff(\n current: TeamPolicyDetail,\n edges: ReturnType<typeof parseTeamPolicyDocument>['edges'],\n): void {\n const diff = edgeDiff(current.edges, edges)\n console.log(`Team: ${current.teamPolicy.teamId}`)\n console.log(`Revision: ${current.teamPolicy.revision}`)\n console.log(`Edges: +${diff.added.length} -${diff.removed.length}`)\n for (const value of diff.added) console.log(` + ${value}`)\n for (const value of diff.removed) console.log(` - ${value}`)\n}\n\nconst importCommand = defineCommand({\n meta: {\n name: 'import',\n description: 'Validate, diff, and explicitly replace a Team policy',\n },\n args: {\n team: { type: 'positional', required: true },\n file: { type: 'positional', required: true },\n 'dry-run': { type: 'boolean', description: 'Validate and print the diff only' },\n apply: { type: 'boolean', description: 'Apply non-interactively after printing the diff' },\n 'expected-revision': {\n type: 'string',\n description: 'Expected current Team revision (defaults to document revision)',\n },\n force: {\n type: 'boolean',\n description: 'Refetch current revision; requires --apply and still uses optimistic locking',\n },\n 'confirm-current-revision': {\n type: 'string',\n description: 'Second force confirmation: the freshly displayed current revision',\n },\n },\n async run({ args }) {\n if (args.force && !args.apply)\n throw new Error('--force requires --apply (interactive force is intentionally unsupported)')\n const document = parseTeamPolicyDocument(readJson(args.file))\n if (document.teamId !== args.team)\n throw new Error(`document belongs to Team ${document.teamId}, not ${args.team}`)\n const client = createClient()\n const current = await client.get<TeamPolicyDetail>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n )\n printEdgeDiff(current, document.edges)\n if (args['dry-run']) return console.log('valid: no changes applied')\n if (!args.apply) throw new Error('refusing mutation: review the diff, then pass --apply')\n const supplied = args['expected-revision']\n ? Number.parseInt(args['expected-revision'], 10)\n : document.expectedRevision\n const expectedRevision = args.force ? current.teamPolicy.revision : supplied\n if (\n args.force &&\n Number.parseInt(args['confirm-current-revision'] ?? '', 10) !== current.teamPolicy.revision\n )\n throw new Error(\n `--force requires --confirm-current-revision ${current.teamPolicy.revision} after reviewing the fresh diff`,\n )\n if (!Number.isInteger(expectedRevision) || expectedRevision < 1)\n throw new Error('expected revision must be a positive integer')\n const body: PutGroupTeamPolicyPolicyRequest = {\n expectedRevision,\n edges: document.edges,\n }\n const updated = await client.put<TeamPolicyDetail>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n body,\n )\n console.log(`updated Team ${args.team} policy to revision ${updated.teamPolicy.revision}`)\n },\n})\n\nconst diff = defineCommand({\n meta: { name: 'diff', description: 'Compare live policy with its retained baseline source' },\n args: {\n team: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit canonical diff JSON' },\n },\n async run({ args }) {\n const result = await createClient().get<TeamPolicyDiff>(\n `/api/teams/${encodeURIComponent(args.team)}/policy/diff`,\n )\n if (args.json) return console.log(JSON.stringify(result, null, 2))\n console.log(`# Team ${args.team} source diff`)\n console.log(\n `status: ${result.baseline ? (result.sourceDiverged ? 'source diverged' : 'source current') : 'no baseline'}`,\n )\n console.log(`revision: ${result.liveRevision}`)\n console.log(\n `edges: +${result.comparison.addedSinceBaseline.length} -${result.comparison.removedSinceBaseline.length}`,\n )\n console.log(\n `slots: +${result.comparison.currentSourceAddedSlotIds.length} -${result.comparison.currentSourceRemovedSlotIds.length}`,\n )\n },\n})\n\nconst evaluate = defineCommand({\n meta: {\n name: 'evaluate',\n description: 'Evaluate a communication path without sending or recording a block',\n },\n args: {\n team: { type: 'positional', required: true, description: 'Owning Team for context' },\n source: { type: 'string', required: true, description: 'user | agent:<id> | outside:<team>' },\n target: { type: 'string', required: true, description: 'user | agent:<id> | outside:<team>' },\n origin: { type: 'string', default: 'cli-diagnostic' },\n json: { type: 'boolean', description: 'Emit decision JSON' },\n },\n async run({ args }) {\n const result = await createClient().post<CommunicationAuthorizationResult>(\n '/api/communication/evaluate',\n {\n source: endpoint(args.source, args.team),\n target: endpoint(args.target, args.team),\n origin: args.origin,\n attemptKind: 'cli_evaluate',\n attemptId: `diagnostic:${args.team}`,\n },\n )\n if (args.json) return console.log(JSON.stringify(result, null, 2))\n console.log(`${result.decision.toUpperCase()} ${result.channel}: ${result.reasonCode}`)\n console.log(result.reason)\n console.log(\n `policy revisions: ${result.policyRefs.map((ref) => `${ref.teamId}@${ref.revision}`).join(', ') || '-'}`,\n )\n },\n})\n\nconst blocks = defineCommand({\n meta: { name: 'blocks', description: 'List paginated durable communication denials' },\n args: {\n team: { type: 'positional', required: true },\n limit: { type: 'string', default: '50' },\n cursor: { type: 'string' },\n source: { type: 'string' },\n target: { type: 'string' },\n channel: { type: 'string' },\n origin: { type: 'string' },\n reason: { type: 'string', description: 'Reason code' },\n from: { type: 'string', description: 'Epoch milliseconds or ISO timestamp' },\n to: { type: 'string', description: 'Epoch milliseconds or ISO timestamp' },\n json: { type: 'boolean', description: 'Emit page JSON including nextCursor' },\n },\n async run({ args }) {\n const query = new URLSearchParams({ limit: args.limit })\n for (const [key, value] of [\n ['cursor', args.cursor],\n ['source', args.source],\n ['target', args.target],\n ['channel', args.channel],\n ['origin', args.origin],\n ['reasonCode', args.reason],\n ['from', args.from],\n ['to', args.to],\n ] as const)\n if (value) query.set(key, value)\n const page = await createClient().get<TeamPolicyBlockPage>(\n `/api/teams/${encodeURIComponent(args.team)}/policy/blocks?${query}`,\n )\n if (args.json) return console.log(JSON.stringify(page, null, 2))\n if (!page.blocks.length) console.log('(no blocks)')\n else\n for (const line of columnize([\n ['time', 'source', 'target', 'channel', 'origin', 'reason'],\n ...page.blocks.map((block) => [\n new Date(block.created_at).toISOString(),\n `${block.source_kind}:${block.source_id ?? '-'}`,\n `${block.target_kind}:${block.target_id ?? '-'}`,\n block.channel,\n block.origin,\n block.reason_code,\n ]),\n ]))\n console.log(line)\n if (page.nextCursor) console.log(`next cursor: ${page.nextCursor}`)\n },\n})\n\nexport const teamPolicyCommand = defineCommand({\n meta: { name: 'policy', description: 'Inspect and manage the Team-owned live policy' },\n subCommands: {\n show,\n export: exportCommand,\n import: importCommand,\n diff,\n evaluate,\n blocks,\n },\n})\n","import type {\n CommunicationEdgePosture,\n ReasoningLevel,\n TeamPolicyEdge,\n TeamPolicyEdgeInput,\n TeamTemplateDetail,\n TeamTemplateEdgeInput,\n TeamTemplateSlotInput,\n TemplateEndpointKind,\n} from '@bazilion/api-types'\n\nexport const TEAM_POLICY_INTERCHANGE_VERSION = 1 as const\nexport const TEAM_DOCUMENT_KIND = 'bazilion.team-template' as const\nexport const TEAM_POLICY_DOCUMENT_KIND = 'bazilion.team-policy' as const\n\nexport interface TeamTemplateDocument {\n version: 1\n kind: typeof TEAM_DOCUMENT_KIND\n template: { id: string; name: string; userMd: string | null }\n slots: Array<{\n key: string\n profileId: string\n agentName: string\n modelOverride: string | null\n reasoningLevel: ReasoningLevel | null\n layoutPosition: { x: number; y: number } | null\n display: Record<string, unknown> | null\n }>\n edges: Array<{\n sourceKind: TemplateEndpointKind\n sourceKey: string | null\n targetKind: TemplateEndpointKind\n targetKey: string | null\n posture: CommunicationEdgePosture\n }>\n}\n\nexport interface TeamPolicyDocument {\n version: 1\n kind: typeof TEAM_POLICY_DOCUMENT_KIND\n teamId: string\n expectedRevision: number\n edges: TeamPolicyEdgeInput[]\n}\n\nconst reasoning = new Set<ReasoningLevel>(['off', 'minimal', 'low', 'medium', 'high', 'xhigh'])\nconst templateKinds = new Set(['user', 'outside_team', 'slot'])\nconst liveKinds = new Set(['user', 'outside_team', 'agent'])\n\nfunction object(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(`${label} must be an object`)\n return value as Record<string, unknown>\n}\n\nfunction text(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} is required`)\n return value.trim()\n}\n\nfunction nullableText(value: unknown, label: string): string | null {\n if (value === null || value === undefined) return null\n if (typeof value !== 'string') throw new Error(`${label} must be a string or null`)\n return value\n}\n\nfunction endpointKey(kind: string, key: string | null): string {\n return `${kind}:${key ?? '-'}`\n}\n\nexport function exportTeamDocument(detail: TeamTemplateDetail): TeamTemplateDocument {\n const keyById = new Map(detail.slots.map((slot, index) => [slot.slotId, `slot-${index + 1}`]))\n return {\n version: TEAM_POLICY_INTERCHANGE_VERSION,\n kind: TEAM_DOCUMENT_KIND,\n template: {\n id: detail.template.id,\n name: detail.template.name,\n userMd: detail.template.userMd,\n },\n slots: detail.slots.map((slot) => ({\n key: keyById.get(slot.slotId) as string,\n profileId: slot.profileId,\n agentName: slot.agentName,\n modelOverride: slot.modelOverride,\n reasoningLevel: slot.reasoningLevel,\n layoutPosition: slot.layoutPosition,\n display: slot.display,\n })),\n edges: detail.edges.map((edge) => ({\n sourceKind: edge.sourceKind,\n sourceKey: edge.sourceKind === 'slot' ? (keyById.get(edge.sourceId ?? '') ?? null) : null,\n targetKind: edge.targetKind,\n targetKey: edge.targetKind === 'slot' ? (keyById.get(edge.targetId ?? '') ?? null) : null,\n posture: edge.posture,\n })),\n }\n}\n\nexport function parseTeamDocument(value: unknown): TeamTemplateDocument {\n const root = object(value, 'document')\n if (root.version !== TEAM_POLICY_INTERCHANGE_VERSION)\n throw new Error(`unsupported Team Policy document version: ${String(root.version)}`)\n if (root.kind !== TEAM_DOCUMENT_KIND)\n throw new Error(`invalid document kind: expected ${TEAM_DOCUMENT_KIND}`)\n const meta = object(root.template, 'template')\n const rawSlots = Array.isArray(root.slots) ? root.slots : null\n const rawEdges = Array.isArray(root.edges) ? root.edges : null\n if (!rawSlots || !rawEdges) throw new Error('slots and edges must be arrays')\n const keys = new Set<string>()\n const slots = rawSlots.map((raw, index) => {\n const slot = object(raw, `slot ${index}`)\n const key = text(slot.key, `slot ${index} key`)\n if (keys.has(key)) throw new Error(`duplicate slot key: ${key}`)\n keys.add(key)\n const level = slot.reasoningLevel\n if (level !== null && level !== undefined && !reasoning.has(level as ReasoningLevel))\n throw new Error(`slot ${index} has invalid reasoningLevel`)\n const position = slot.layoutPosition\n if (\n position !== null &&\n position !== undefined &&\n (!position ||\n typeof position !== 'object' ||\n Array.isArray(position) ||\n !Number.isFinite((position as { x?: number }).x) ||\n !Number.isFinite((position as { y?: number }).y))\n )\n throw new Error(`slot ${index} has invalid layoutPosition`)\n const display = slot.display\n if (\n display !== null &&\n display !== undefined &&\n (!display || typeof display !== 'object' || Array.isArray(display))\n )\n throw new Error(`slot ${index} has invalid display`)\n return {\n key,\n profileId: text(slot.profileId, `slot ${index} profileId`),\n agentName: text(slot.agentName, `slot ${index} agentName`),\n modelOverride: nullableText(slot.modelOverride, `slot ${index} modelOverride`),\n reasoningLevel: (level as ReasoningLevel | null | undefined) ?? null,\n layoutPosition: (position as { x: number; y: number } | null | undefined) ?? null,\n display: (display as Record<string, unknown> | null | undefined) ?? null,\n }\n })\n const seen = new Set<string>()\n const edges = rawEdges.map((raw, index) => {\n const edge = object(raw, `edge ${index}`)\n if (!templateKinds.has(String(edge.sourceKind)) || !templateKinds.has(String(edge.targetKind)))\n throw new Error(`edge ${index} has invalid endpoint kind`)\n const sourceKind = edge.sourceKind as TemplateEndpointKind\n const targetKind = edge.targetKind as TemplateEndpointKind\n const sourceKey = nullableText(edge.sourceKey, `edge ${index} sourceKey`)\n const targetKey = nullableText(edge.targetKey, `edge ${index} targetKey`)\n const posture: CommunicationEdgePosture | null =\n edge.posture === undefined || edge.posture === 'allow'\n ? 'allow'\n : edge.posture === 'approval_required'\n ? 'approval_required'\n : null\n if (!posture) throw new Error(`edge ${index} has invalid posture`)\n if ((sourceKind === 'slot') !== Boolean(sourceKey))\n throw new Error(`edge ${index} source slot key is missing or invalid`)\n if ((targetKind === 'slot') !== Boolean(targetKey))\n throw new Error(`edge ${index} target slot key is missing or invalid`)\n if (sourceKey && !keys.has(sourceKey))\n throw new Error(`edge ${index} references missing slot ${sourceKey}`)\n if (targetKey && !keys.has(targetKey))\n throw new Error(`edge ${index} references missing slot ${targetKey}`)\n const signature = `${endpointKey(sourceKind, sourceKey)}->${endpointKey(targetKind, targetKey)}`\n if (endpointKey(sourceKind, sourceKey) === endpointKey(targetKind, targetKey))\n throw new Error(`edge ${index} is a self edge`)\n if (seen.has(signature)) throw new Error(`duplicate edge: ${signature}`)\n seen.add(signature)\n return { sourceKind, sourceKey, targetKind, targetKey, posture }\n })\n return {\n version: 1,\n kind: TEAM_DOCUMENT_KIND,\n template: {\n id: text(meta.id, 'template id'),\n name: text(meta.name, 'template name'),\n userMd: nullableText(meta.userMd, 'template userMd'),\n },\n slots,\n edges,\n }\n}\n\nexport function teamImportBody(document: TeamTemplateDocument, existing?: TeamTemplateDetail) {\n const currentByKey = existing\n ? new Map(existing.slots.map((slot, index) => [`slot-${index + 1}`, slot.slotId]))\n : new Map<string, string>()\n const slots: TeamTemplateSlotInput[] = document.slots.map((slot) => ({\n ...(currentByKey.has(slot.key)\n ? { slotId: currentByKey.get(slot.key) }\n : { clientKey: slot.key }),\n profileId: slot.profileId,\n agentName: slot.agentName,\n modelOverride: slot.modelOverride,\n reasoningLevel: slot.reasoningLevel,\n layoutPosition: slot.layoutPosition,\n display: slot.display,\n }))\n const idByKey = new Map(\n slots.map((slot, index) => [\n document.slots[index]?.key as string,\n slot.slotId ?? slot.clientKey ?? null,\n ]),\n )\n const edges: TeamTemplateEdgeInput[] = document.edges.map((edge) => ({\n sourceKind: edge.sourceKind,\n sourceId: edge.sourceKind === 'slot' ? idByKey.get(edge.sourceKey ?? '') : null,\n targetKind: edge.targetKind,\n targetId: edge.targetKind === 'slot' ? idByKey.get(edge.targetKey ?? '') : null,\n posture: edge.posture,\n }))\n return { slots, edges }\n}\n\nexport function parseTeamPolicyDocument(value: unknown): TeamPolicyDocument {\n const root = object(value, 'document')\n if (root.version !== 1)\n throw new Error(`unsupported Team Policy document version: ${String(root.version)}`)\n if (root.kind !== TEAM_POLICY_DOCUMENT_KIND)\n throw new Error(`invalid document kind: expected ${TEAM_POLICY_DOCUMENT_KIND}`)\n if (!Number.isInteger(root.expectedRevision) || Number(root.expectedRevision) < 1)\n throw new Error('expectedRevision must be a positive integer')\n if (!Array.isArray(root.edges)) throw new Error('edges must be an array')\n const seen = new Set<string>()\n const edges = root.edges.map((raw, index) => {\n const edge = object(raw, `edge ${index}`)\n if (!liveKinds.has(String(edge.sourceKind)) || !liveKinds.has(String(edge.targetKind)))\n throw new Error(`edge ${index} has invalid endpoint kind`)\n const sourceKind = edge.sourceKind as TeamPolicyEdgeInput['sourceKind']\n const targetKind = edge.targetKind as TeamPolicyEdgeInput['targetKind']\n const sourceId = nullableText(edge.sourceId, `edge ${index} sourceId`)\n const targetId = nullableText(edge.targetId, `edge ${index} targetId`)\n if (\n (sourceKind === 'agent') !== Boolean(sourceId) ||\n (targetKind === 'agent') !== Boolean(targetId)\n )\n throw new Error(`edge ${index} Agent id is missing or invalid`)\n const signature = `${endpointKey(sourceKind, sourceId)}->${endpointKey(targetKind, targetId)}`\n if (endpointKey(sourceKind, sourceId) === endpointKey(targetKind, targetId))\n throw new Error(`edge ${index} is a self edge`)\n if (seen.has(signature)) throw new Error(`duplicate edge: ${signature}`)\n seen.add(signature)\n return { sourceKind, sourceId, targetKind, targetId }\n })\n return {\n version: 1,\n kind: TEAM_POLICY_DOCUMENT_KIND,\n teamId: text(root.teamId, 'teamId'),\n expectedRevision: Number(root.expectedRevision),\n edges,\n }\n}\n\nexport function exportTeamPolicy(\n teamId: string,\n revision: number,\n edges: TeamPolicyEdge[],\n): TeamPolicyDocument {\n return {\n version: 1,\n kind: TEAM_POLICY_DOCUMENT_KIND,\n teamId,\n expectedRevision: revision,\n edges: edges.map(({ sourceKind, sourceId, targetKind, targetId, posture }) => ({\n sourceKind,\n sourceId,\n targetKind,\n targetId,\n posture,\n })),\n }\n}\n\nexport function edgeDiff(\n before: Array<{\n sourceKind: string\n sourceId?: string | null\n targetKind: string\n targetId?: string | null\n posture?: CommunicationEdgePosture\n }>,\n after: Array<{\n sourceKind: string\n sourceId?: string | null\n targetKind: string\n targetId?: string | null\n posture?: CommunicationEdgePosture\n }>,\n) {\n const signature = (edge: (typeof before)[number]) =>\n `${endpointKey(edge.sourceKind, edge.sourceId ?? null)} -> ${endpointKey(edge.targetKind, edge.targetId ?? null)} [${edge.posture ?? 'allow'}]`\n const left = new Set(before.map(signature))\n const right = new Set(after.map(signature))\n return {\n added: [...right].filter((value) => !left.has(value)).sort(),\n removed: [...left].filter((value) => !right.has(value)).sort(),\n }\n}\n","import { readFileSync } from 'node:fs'\nimport type {\n PutTeamTemplateDefinitionRequest,\n TeamTemplateDetail,\n TeamTemplateWithCount,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { ApiClientError, createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport {\n edgeDiff,\n exportTeamDocument,\n parseTeamDocument,\n teamImportBody,\n} from '../team-interchange.ts'\n\nfunction jsonFile(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown\n } catch (error) {\n throw new Error(`invalid JSON: ${(error as Error).message}`)\n }\n}\n\nfunction printTeam(detail: TeamTemplateDetail): void {\n console.log(`# ${detail.template.id} — ${detail.template.name}`)\n console.log(`revision: ${detail.template.currentRevision}`)\n console.log(`slots: ${detail.slots.length}`)\n console.log(`edges: ${detail.edges.length}`)\n if (detail.slots.length) {\n console.log('')\n for (const line of columnize([\n ['slot', 'profile', 'Agent name', 'model', 'reasoning'],\n ...detail.slots.map((slot, index) => [\n String(index + 1),\n slot.profileId,\n slot.agentName,\n slot.modelOverride ?? '-',\n slot.reasoningLevel ?? '-',\n ]),\n ]))\n console.log(line)\n }\n}\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List canonical Team templates' },\n args: { json: { type: 'boolean', description: 'Emit stable JSON' } },\n async run({ args }) {\n const rows = await createClient().get<TeamTemplateWithCount[]>('/api/team-templates')\n if (args.json) return console.log(JSON.stringify(rows, null, 2))\n if (!rows.length) return console.log('(no Team templates)')\n for (const line of columnize([\n ['id', 'revision', 'slots', 'name'],\n ...rows.map((row) => [row.id, String(row.currentRevision), String(row.slotCount), row.name]),\n ]))\n console.log(line)\n },\n})\n\nconst show = defineCommand({\n meta: { name: 'show', description: 'Show a canonical Team template' },\n args: {\n id: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit the canonical API aggregate' },\n },\n async run({ args }) {\n const detail = await createClient().get<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(args.id)}`,\n )\n if (args.json) console.log(JSON.stringify(detail, null, 2))\n else printTeam(detail)\n },\n})\n\nconst exportCommand = defineCommand({\n meta: {\n name: 'export',\n description: 'Export a portable versioned Team-template document to stdout',\n },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const detail = await createClient().get<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(args.id)}`,\n )\n console.log(JSON.stringify(exportTeamDocument(detail), null, 2))\n },\n})\n\nfunction printImportDiff(\n current: TeamTemplateDetail | null,\n document: ReturnType<typeof parseTeamDocument>,\n): void {\n const before = current ? exportTeamDocument(current) : null\n console.log(`Team: ${current ? current.template.id : '(new)'} -> ${document.template.id}`)\n console.log(`Roster: ${current?.slots.length ?? 0} -> ${document.slots.length}`)\n const previousSlots = new Map(before?.slots.map((slot) => [slot.key, slot]) ?? [])\n const nextSlots = new Map(document.slots.map((slot) => [slot.key, slot]))\n for (const [key, slot] of nextSlots) {\n const previous = previousSlots.get(key)\n if (!previous) console.log(` + ${key}: ${slot.profileId} / ${slot.agentName}`)\n else if (JSON.stringify(previous) !== JSON.stringify(slot))\n console.log(\n ` ~ ${key}: ${previous.profileId} / ${previous.agentName} -> ${slot.profileId} / ${slot.agentName}`,\n )\n }\n for (const [key, slot] of previousSlots)\n if (!nextSlots.has(key)) console.log(` - ${key}: ${slot.profileId} / ${slot.agentName}`)\n const toEdge = (edge: (typeof document.edges)[number]) => ({\n sourceKind: edge.sourceKind,\n sourceId: edge.sourceKey,\n targetKind: edge.targetKind,\n targetId: edge.targetKey,\n })\n const diff = edgeDiff(before?.edges.map(toEdge) ?? [], document.edges.map(toEdge))\n console.log(`Edges: +${diff.added.length} -${diff.removed.length}`)\n for (const value of diff.added) console.log(` + ${value}`)\n for (const value of diff.removed) console.log(` - ${value}`)\n}\n\nconst importCommand = defineCommand({\n meta: {\n name: 'import',\n description: 'Validate, diff, and explicitly apply a portable Team-template document',\n },\n args: {\n file: { type: 'positional', required: true, description: 'JSON document path' },\n 'dry-run': { type: 'boolean', description: 'Validate and print the resolved diff only' },\n apply: { type: 'boolean', description: 'Apply non-interactively after printing the diff' },\n 'expected-revision': {\n type: 'string',\n description: 'Required current revision when replacing an existing Team',\n },\n force: {\n type: 'boolean',\n description: 'Refetch current revision; requires --apply and still uses optimistic locking',\n },\n 'confirm-current-revision': {\n type: 'string',\n description: 'Second force confirmation: the freshly displayed current revision',\n },\n },\n async run({ args }) {\n if (args.force && !args.apply)\n throw new Error('--force requires --apply (interactive force is intentionally unsupported)')\n const document = parseTeamDocument(jsonFile(args.file))\n const client = createClient()\n let current: TeamTemplateDetail | null = null\n try {\n current = await client.get<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(document.template.id)}`,\n )\n } catch (error) {\n if (!(error instanceof ApiClientError) || error.status !== 404) throw error\n }\n printImportDiff(current, document)\n if (args['dry-run']) {\n console.log('valid: no changes applied')\n return\n }\n if (!args.apply) throw new Error('refusing mutation: review the diff, then pass --apply')\n if (!current) {\n const body = teamImportBody(document)\n const created = await client.post<TeamTemplateDetail>('/api/team-templates/import', {\n id: document.template.id,\n name: document.template.name,\n userMd: document.template.userMd,\n slots: document.slots.map((slot, index) => ({\n ...body.slots[index],\n clientKey: slot.key,\n })),\n edges: body.edges,\n })\n console.log(\n `created Team ${created.template.id} at revision ${created.template.currentRevision}`,\n )\n return\n }\n if (\n document.template.name !== current.template.name ||\n document.template.userMd !== current.template.userMd\n )\n throw new Error(\n 'replacement document metadata differs; update Team name/USER.md separately before import',\n )\n const supplied = Number.parseInt(args['expected-revision'] ?? '', 10)\n const expectedRevision = args.force ? current.template.currentRevision : supplied\n if (\n args.force &&\n Number.parseInt(args['confirm-current-revision'] ?? '', 10) !==\n current.template.currentRevision\n )\n throw new Error(\n `--force requires --confirm-current-revision ${current.template.currentRevision} after reviewing the fresh diff`,\n )\n if (!Number.isInteger(expectedRevision) || expectedRevision < 1)\n throw new Error('--expected-revision is required when replacing an existing Team')\n const definition = teamImportBody(document, current)\n const body: PutTeamTemplateDefinitionRequest = { expectedRevision, ...definition }\n const updated = await client.put<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(document.template.id)}/definition`,\n body,\n )\n console.log(\n `updated Team ${updated.template.id} to revision ${updated.template.currentRevision}`,\n )\n },\n})\n\nexport const teamTemplateCommand = defineCommand({\n meta: {\n name: 'team-template',\n description: 'Inspect and exchange canonical Team templates',\n },\n subCommands: { list, show, export: exportCommand, import: importCommand },\n})\n","// `bazilion telegram` — Step 1 surface. Wires the same two endpoints the\n// web UI calls (config set/clear + health). Future steps grow this tree\n// with bind, adopt, setup, etc.\n\nimport type {\n Agent,\n TelegramAllowedUser,\n TelegramBindResponse,\n TelegramConfigState,\n TelegramHealth,\n TelegramPairingChallenge,\n TelegramPairingStatus,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nconst setCmd = defineCommand({\n meta: {\n name: 'set',\n description: 'Save bot token + supergroup chat ID (paired write)',\n },\n args: {\n token: { type: 'string', required: true, description: 'Bot token from @BotFather' },\n chat: { type: 'string', required: true, description: 'Numeric supergroup chat ID' },\n },\n async run({ args }) {\n const client = createClient()\n const state = await client.put<TelegramConfigState>('/api/config/telegram', {\n botToken: args.token,\n chatId: args.chat,\n })\n console.log(`saved · token ${state.botTokenPreview} · chat ${state.chatId}`)\n },\n})\n\nconst clearCmd = defineCommand({\n meta: {\n name: 'clear',\n description: 'Remove stored bot token + chat ID',\n },\n async run() {\n const client = createClient()\n await client.del('/api/config/telegram')\n console.log('cleared')\n },\n})\n\nconst showCmd = defineCommand({\n meta: {\n name: 'show',\n description: 'Show what credentials are stored (token is masked)',\n },\n async run() {\n const client = createClient()\n const state = await client.get<TelegramConfigState>('/api/config/telegram')\n if (!state.configured) {\n console.log('(no credentials saved — run `bazilion telegram config set --token … --chat …`)')\n return\n }\n console.log(`token: ${state.botTokenPreview}`)\n console.log(`chat: ${state.chatId}`)\n if (state.migratedChatId) {\n console.log(\n `⚠ supergroup migrated → ${state.migratedChatId}. Run \\`bazilion telegram reconnect\\` to apply.`,\n )\n }\n },\n})\n\nconst reconnectCmd = defineCommand({\n meta: {\n name: 'reconnect',\n description: 'Apply a pending supergroup chat-id migration + re-activate the bot',\n },\n async run() {\n const client = createClient()\n const state = await client.post<TelegramConfigState>('/api/config/telegram/reconnect')\n console.log(`reconnected · chat ${state.chatId}`)\n },\n})\n\nconst configCmd = defineCommand({\n meta: {\n name: 'config',\n description: 'Manage Telegram credentials (bot token + chat ID)',\n },\n subCommands: {\n set: setCmd,\n clear: clearCmd,\n show: showCmd,\n },\n})\n\nconst healthCmd = defineCommand({\n meta: {\n name: 'health',\n description: 'Run the four-step preflight against the Telegram Bot API',\n },\n async run() {\n const client = createClient()\n const h = await client.get<TelegramHealth>('/api/config/telegram/health')\n if (!h.configured) {\n console.log('not configured — run `bazilion telegram config set` first')\n process.exitCode = 1\n return\n }\n if (h.error) {\n console.error(`error at ${h.error.step}: ${h.error.message}`)\n process.exitCode = 1\n return\n }\n if (!h.preflight) {\n console.error('preflight returned no data')\n process.exitCode = 1\n return\n }\n const p = h.preflight\n const line = (ok: boolean, label: string, detail: string): string =>\n `${ok ? '✓' : '✕'} ${label.padEnd(30)} ${detail}`\n console.log(line(p.botUsername.length > 0, 'bot identity', `@${p.botUsername}`))\n console.log(line(p.chatTitle.length > 0, 'supergroup reachable', p.chatTitle))\n console.log(line(p.isForum, 'forum topics enabled', String(p.isForum)))\n console.log(line(p.hasManageTopics, 'can_manage_topics', String(p.hasManageTopics)))\n console.log(line(p.privacyModeOff, 'Privacy Mode is OFF', String(p.privacyModeOff)))\n console.log(line(p.chatIsPrivate, 'supergroup is private', String(p.chatIsPrivate)))\n console.log(line(p.memberCount === 2, 'one owner + bot', String(p.memberCount ?? 'unknown')))\n if (p.ownerPresent !== null) {\n console.log(line(p.ownerPresent, 'paired owner is present', String(p.ownerPresent)))\n }\n const allOk =\n p.botUsername.length > 0 &&\n p.chatTitle.length > 0 &&\n p.isForum &&\n p.hasManageTopics &&\n p.privacyModeOff &&\n p.chatIsPrivate &&\n p.memberCount === 2 &&\n p.ownerPresent !== false\n if (!allOk) process.exitCode = 1\n },\n})\n\nconst botStatusCmd = defineCommand({\n meta: {\n name: 'status',\n description: 'Show polling state of the live bot',\n },\n async run() {\n const client = createClient()\n const h = await client.get<TelegramHealth>('/api/config/telegram/health')\n if (!h.polling) {\n console.log('bot: not running')\n process.exitCode = 1\n return\n }\n const p = h.polling\n const startedAt = p.startedAt ? new Date(p.startedAt).toISOString() : '(never)'\n const lastPoll = p.lastSuccessfulPollAt\n ? new Date(p.lastSuccessfulPollAt).toISOString()\n : '(never)'\n console.log(`running: ${p.running}`)\n console.log(`activated: ${p.activated}`)\n console.log(`started at: ${startedAt}`)\n console.log(`last update id: ${p.lastUpdateId ?? '(none)'}`)\n console.log(`last successful: ${lastPoll}`)\n if (p.error) console.log(`error: ${p.error}`)\n if (!p.running) process.exitCode = 1\n },\n})\n\nconst botRestartCmd = defineCommand({\n meta: {\n name: 'restart',\n description: 'Force-restart the bot (tears down + brings up from current creds)',\n },\n async run() {\n const client = createClient()\n await client.post('/api/config/telegram/restart')\n console.log('restart requested')\n },\n})\n\nconst botCmd = defineCommand({\n meta: {\n name: 'bot',\n description: 'Inspect / control the live polling bot',\n },\n subCommands: {\n status: botStatusCmd,\n restart: botRestartCmd,\n },\n})\n\nconst bindCmd = defineCommand({\n meta: {\n name: 'bind',\n description: 'Create a Telegram topic for an agent (manual fallback for /talk)',\n },\n args: {\n agent: { type: 'positional', required: true, description: 'Agent id or prefix' },\n },\n async run({ args }) {\n const client = createClient()\n const result = await client.post<TelegramBindResponse>(\n `/api/agents/${args.agent}/telegram/bind`,\n )\n const verb = result.created ? 'created topic' : 'already bound to'\n console.log(`${verb} #${result.topicId} for agent ${result.agent.name} (${result.agent.id})`)\n console.log(` ${result.deepLink}`)\n },\n})\n\nconst unbindCmd = defineCommand({\n meta: {\n name: 'unbind',\n description: \"Clear an agent's Telegram topic binding (topic stays in Telegram as orphan)\",\n },\n args: {\n agent: { type: 'positional', required: true, description: 'Agent id or prefix' },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/agents/${args.agent}/telegram/binding`)\n console.log(`unbound agent ${args.agent}`)\n },\n})\n\nconst listBindingsCmd = defineCommand({\n meta: {\n name: 'list',\n description: 'List agents and their Telegram topic bindings',\n },\n async run() {\n const client = createClient()\n const agents = await client.get<Agent[]>('/api/agents')\n const bound = agents.filter((a) => a.telegramTopicId !== null)\n const unbound = agents.filter((a) => a.telegramTopicId === null)\n if (bound.length === 0 && unbound.length === 0) {\n console.log('(no agents)')\n return\n }\n if (bound.length > 0) {\n console.log('bound:')\n for (const a of bound) {\n console.log(` #${a.telegramTopicId}\\t${a.name}\\t(team: ${a.teamId})`)\n }\n }\n if (unbound.length > 0) {\n console.log('unbound:')\n for (const a of unbound) {\n console.log(` —\\t${a.name}\\t(team: ${a.teamId})`)\n }\n }\n },\n})\n\nconst allowCmd = defineCommand({\n meta: { name: 'allow', description: 'Add a Telegram user id to the allowlist' },\n args: {\n userId: { type: 'positional', required: true, description: 'Numeric Telegram user id' },\n label: { type: 'string', description: 'Optional human label' },\n },\n async run({ args }) {\n const client = createClient()\n const u = await client.post<TelegramAllowedUser>('/api/config/telegram/acl', {\n userId: Number(args.userId),\n label: args.label ?? null,\n role: 'member',\n })\n console.log(`allowed ${u.userId} (${u.role})`)\n },\n})\n\nconst denyCmd = defineCommand({\n meta: { name: 'deny', description: 'Remove a Telegram user id from the allowlist' },\n args: { userId: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/config/telegram/acl/${Number(args.userId)}`)\n console.log(`removed ${args.userId}`)\n },\n})\n\nconst allowedCmd = defineCommand({\n meta: { name: 'allowed', description: 'List allowlisted Telegram users' },\n async run() {\n const client = createClient()\n const users = await client.get<TelegramAllowedUser[]>('/api/config/telegram/acl')\n if (users.length === 0) {\n console.log('(allowlist empty — unpaired and closed)')\n return\n }\n for (const u of users) {\n const who = u.label ?? (u.username ? `@${u.username}` : '—')\n console.log(`${u.userId}\\t${u.role}\\t${who}`)\n }\n },\n})\n\nconst pairingCreateCmd = defineCommand({\n meta: { name: 'create', description: 'Generate a one-time Telegram owner pairing code' },\n async run() {\n const result = await createClient().post<TelegramPairingChallenge>(\n '/api/config/telegram/pairing/challenge',\n )\n console.log(`pairing code: ${result.code}`)\n console.log(`expires: ${new Date(result.expiresAt).toISOString()}`)\n console.log('send `/pair <code>` in the configured ⚙ bazilion service topic')\n },\n})\n\nconst pairingStatusCmd = defineCommand({\n meta: { name: 'status', description: 'Show Telegram owner pairing status' },\n async run() {\n const result = await createClient().get<TelegramPairingStatus>('/api/config/telegram/pairing')\n console.log(`paired: ${result.paired}`)\n console.log(`owner: ${result.ownerUserId ?? '(none)'}`)\n console.log(`challenge active: ${result.challengeActive}`)\n if (result.challengeExpiresAt)\n console.log(`expires: ${new Date(result.challengeExpiresAt).toISOString()}`)\n },\n})\n\nconst pairingCancelCmd = defineCommand({\n meta: { name: 'cancel', description: 'Cancel the active Telegram pairing code' },\n async run() {\n await createClient().del('/api/config/telegram/pairing/challenge')\n console.log('pairing challenge cancelled')\n },\n})\n\nconst pairingResetCmd = defineCommand({\n meta: { name: 'reset', description: 'Revoke the Telegram owner and require re-pairing' },\n args: {\n yes: { type: 'boolean', description: 'Confirm destructive owner reset', required: true },\n },\n async run({ args }) {\n if (!args.yes) throw new Error('--yes is required')\n await createClient().post('/api/config/telegram/pairing/reset', { confirm: true })\n console.log('Telegram owner reset; ingress is closed until re-paired')\n },\n})\n\nconst pairingCmd = defineCommand({\n meta: { name: 'pairing', description: 'Manage single-owner Telegram pairing' },\n subCommands: {\n create: pairingCreateCmd,\n status: pairingStatusCmd,\n cancel: pairingCancelCmd,\n reset: pairingResetCmd,\n },\n})\n\nexport const telegramCommand = defineCommand({\n meta: {\n name: 'telegram',\n description: 'Telegram integration: credentials, health, bot lifecycle, bindings, access',\n },\n subCommands: {\n config: configCmd,\n health: healthCmd,\n bot: botCmd,\n reconnect: reconnectCmd,\n bind: bindCmd,\n unbind: unbindCmd,\n list: listBindingsCmd,\n allow: allowCmd,\n deny: denyCmd,\n allowed: allowedCmd,\n pairing: pairingCmd,\n },\n})\n","import type {\n CreateTokenRequest,\n CreateTokenResponse,\n ListTokensResponse,\n WebToken,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport qrcode from 'qrcode-terminal'\nimport { readAuthFile } from '../auth-file.ts'\nimport { createClient, loadClientConfig } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\nfunction tokenRow(t: WebToken): string[] {\n const last = t.lastUsedAt ? new Date(t.lastUsedAt).toISOString() : '(never)'\n const expired = t.expiresAt !== null && t.expiresAt <= Date.now()\n const state = t.revokedAt ? 'revoked' : expired ? 'expired' : 'active'\n const expires = t.expiresAt ? new Date(t.expiresAt).toISOString() : '(never)'\n return [t.id, t.kind, state, t.label, `expires: ${expires}`, `last: ${last}`]\n}\n\nfunction resolveQrServer(override: string | undefined): string {\n const raw = override ?? loadClientConfig().serverUrl\n const url = new URL(raw)\n const loopback = ['127.0.0.1', 'localhost', '[::1]', '::1'].includes(url.hostname)\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {\n throw new Error('pairing server must use HTTPS (HTTP is allowed only for loopback development)')\n }\n if (url.username || url.password || url.pathname !== '/' || url.search || url.hash) {\n throw new Error(\n 'pairing server must be an exact origin without credentials, path, query, or fragment',\n )\n }\n const cfg = loadClientConfig()\n if (loopback && !override && new URL(cfg.serverUrl).hostname === url.hostname) {\n throw new Error(\n 'server URL is loopback-only. Pass --server https://<private-tailnet-host> for mobile pairing.',\n )\n }\n return url.origin\n}\n\nconst createCmd = defineCommand({\n meta: { name: 'create', description: 'Mint a new web token (shown once)' },\n args: {\n label: { type: 'positional', required: true, description: 'Human-readable label' },\n qr: {\n type: 'boolean',\n description: 'Also render a pairing QR code for mobile clients (bazilion://pair?...)',\n },\n server: {\n type: 'string',\n description:\n 'Server URL to embed in the pairing QR (default: detect LAN IP; ignored without --qr)',\n },\n expiresDays: {\n type: 'string',\n description: 'Device lifetime in days (default 90, maximum 365)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const expiresInDays = args.expiresDays === undefined ? undefined : Number(args.expiresDays)\n if (expiresInDays !== undefined && !Number.isInteger(expiresInDays)) {\n throw new Error('--expires-days must be an integer')\n }\n const body: CreateTokenRequest = { label: args.label, expiresInDays }\n const res = await client.post<CreateTokenResponse>('/api/tokens', body)\n console.log(`id: ${res.meta.id}`)\n console.log(`label: ${res.meta.label}`)\n console.log(`kind: ${res.meta.kind}`)\n console.log(\n `expires: ${res.meta.expiresAt ? new Date(res.meta.expiresAt).toISOString() : '(never)'}`,\n )\n console.log(`token: ${res.token}`)\n console.log('')\n console.log('store the token now — it is not recoverable later.')\n\n if (!args.qr) return\n\n const serverUrl = resolveQrServer(args.server)\n const pairUrl = `bazilion://pair?server=${encodeURIComponent(serverUrl)}&token=${encodeURIComponent(res.token)}`\n console.log('')\n console.log(`pairing URL: ${pairUrl}`)\n console.log('')\n qrcode.generate(pairUrl, { small: true }, (qr) => console.log(qr))\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List web tokens' },\n args: {\n all: { type: 'boolean', description: 'Include revoked tokens' },\n },\n async run({ args }) {\n const client = createClient()\n const qs = args.all ? '?includeRevoked=1' : ''\n const { tokens } = await client.get<ListTokensResponse>(`/api/tokens${qs}`)\n if (tokens.length === 0) {\n console.log('(no tokens)')\n return\n }\n for (const line of columnize(tokens.map(tokenRow))) console.log(line)\n },\n})\n\nconst showLocalCmd = defineCommand({\n meta: {\n name: 'show-local',\n description: 'Print the bootstrap web token stored in ~/.bazilion/auth.json',\n },\n run() {\n const paths = resolveCliPaths()\n console.log(readAuthFile(paths.authFile).token)\n },\n})\n\nconst revokeCmd = defineCommand({\n meta: { name: 'revoke', description: 'Revoke a web token' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/tokens/${args.id}`)\n console.log(`revoked token ${args.id}`)\n },\n})\n\nexport const tokenCommand = defineCommand({\n meta: { name: 'token', description: 'Manage web tokens for API/CLI clients' },\n subCommands: {\n create: createCmd,\n list: listCmd,\n revoke: revokeCmd,\n 'show-local': showLocalCmd,\n },\n})\n","import type {\n AgentTrigger,\n CreateTriggerRequest,\n CreateTriggerResponse,\n ListTriggerDispatchesResponse,\n ListTriggersResponse,\n UpdateTriggerRequest,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst addCmd = defineCommand({\n meta: { name: 'add', description: 'Add an interval / cron trigger to an agent' },\n args: {\n agent: { type: 'positional', required: true },\n every: {\n type: 'string',\n description: 'Interval in seconds (e.g. --every 300 = every 5 minutes)',\n },\n cron: {\n type: 'string',\n description: 'Cron expression (5 fields: minute hour dom month dow)',\n },\n message: {\n type: 'string',\n required: true,\n description: 'Message to inject when the trigger fires',\n },\n disabled: { type: 'boolean', description: 'Create in disabled state' },\n },\n async run({ args }) {\n if (!args.every === !args.cron) {\n throw new Error('specify exactly one of --every <seconds> or --cron \"<expr>\"')\n }\n const client = createClient()\n const body: CreateTriggerRequest = args.every\n ? {\n kind: 'interval',\n intervalSec: Number(args.every),\n message: args.message,\n enabled: !args.disabled,\n }\n : {\n kind: 'cron',\n cronExpr: args.cron as string,\n message: args.message,\n enabled: !args.disabled,\n }\n const res = await client.post<CreateTriggerResponse>(`/api/agents/${args.agent}/triggers`, body)\n const t = res.trigger\n const spec = t.kind === 'interval' ? `every ${t.intervalSec}s` : `cron \"${t.cronExpr}\"`\n console.log(`${t.id}\\t${spec}\\t${t.enabled ? 'enabled' : 'disabled'}`)\n },\n})\n\nfunction triggerRow(t: AgentTrigger): string[] {\n const spec = t.kind === 'interval' ? `every ${t.intervalSec}s` : `cron \"${t.cronExpr}\"`\n const last = t.lastFiredAt ? new Date(t.lastFiredAt).toISOString() : '(never)'\n const state = t.enabled ? 'enabled' : 'disabled'\n const msgPreview = t.message.length > 60 ? `${t.message.slice(0, 60)}…` : t.message\n return [t.id, state, spec, `last: ${last}`, `\"${msgPreview}\"`]\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List triggers for an agent' },\n args: {\n agent: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const { triggers } = await client.get<ListTriggersResponse>(\n `/api/agents/${args.agent}/triggers`,\n )\n if (triggers.length === 0) {\n console.log('(no triggers)')\n return\n }\n for (const line of columnize(triggers.map(triggerRow))) console.log(line)\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Delete a trigger' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/triggers/${args.id}`)\n console.log(`removed trigger ${args.id}`)\n },\n})\n\nconst enableCmd = defineCommand({\n meta: { name: 'enable', description: 'Enable a trigger' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const body: UpdateTriggerRequest = { enabled: true }\n await client.patch(`/api/triggers/${args.id}`, body)\n console.log(`enabled trigger ${args.id}`)\n },\n})\n\nconst disableCmd = defineCommand({\n meta: { name: 'disable', description: 'Disable a trigger' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const body: UpdateTriggerRequest = { enabled: false }\n await client.patch(`/api/triggers/${args.id}`, body)\n console.log(`disabled trigger ${args.id}`)\n },\n})\n\nconst historyCmd = defineCommand({\n meta: { name: 'history', description: 'Show recent dispatches for a trigger' },\n args: {\n id: { type: 'positional', required: true },\n limit: { type: 'string', description: 'Maximum rows (default 20)' },\n },\n async run({ args }) {\n const limit = args.limit ? Number(args.limit) : 20\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error('--limit must be an integer from 1 to 100')\n }\n const client = createClient()\n const { dispatches } = await client.get<ListTriggerDispatchesResponse>(\n `/api/triggers/${args.id}/dispatches?limit=${limit}`,\n )\n if (dispatches.length === 0) {\n console.log('(no dispatches)')\n return\n }\n const rows = dispatches.map((dispatch) => [\n new Date(dispatch.scheduledAt).toISOString(),\n dispatch.status,\n `attempts: ${dispatch.attemptCount}`,\n dispatch.lastError ?? '',\n ])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nexport const triggerCommand = defineCommand({\n meta: { name: 'trigger', description: 'Manage scheduled agent triggers' },\n subCommands: {\n add: addCmd,\n list: listCmd,\n rm: rmCmd,\n enable: enableCmd,\n disable: disableCmd,\n history: historyCmd,\n },\n})\n","import { existsSync, lstatSync, readdirSync, realpathSync, rmSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { isAbsolute, join, parse, relative, resolve, sep } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { acquireHomeRestoreLock } from '../daemon-liveness.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\n// Line-buffered stdin reader. `node:readline/promises` drops data after EOF\n// on piped input (a known Node quirk with back-to-back `question()` calls),\n// so we read chunks ourselves and emit one line per call.\nfunction makeLineReader(): () => Promise<string> {\n let buffer = ''\n let ended = false\n const queue: ((line: string) => void)[] = []\n\n const tryDeliver = (): void => {\n while (queue.length > 0) {\n const nlIdx = buffer.indexOf('\\n')\n if (nlIdx === -1) {\n if (ended) {\n const resolve = queue.shift()\n resolve?.(buffer)\n buffer = ''\n } else {\n return\n }\n } else {\n const line = buffer.slice(0, nlIdx)\n buffer = buffer.slice(nlIdx + 1)\n const resolve = queue.shift()\n resolve?.(line)\n }\n }\n }\n\n process.stdin.setEncoding('utf8')\n process.stdin.on('data', (chunk) => {\n buffer += chunk\n tryDeliver()\n })\n process.stdin.on('end', () => {\n ended = true\n tryDeliver()\n })\n\n return () =>\n new Promise<string>((resolve) => {\n queue.push(resolve)\n tryDeliver()\n })\n}\n\nasync function askYes(readLine: () => Promise<string>, prompt: string): Promise<boolean> {\n process.stdout.write(`${prompt} [y/N] `)\n const answer = (await readLine()).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n}\n\nfunction removePath(p: string): boolean {\n try {\n // Unlike existsSync(), lstatSync() sees dangling symlinks. Managed Team\n // and legacy Group slots may be symlinks; rmSync unlinks the slot without\n // traversing into or deleting its external target.\n lstatSync(p)\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return false\n throw error\n }\n rmSync(p, { recursive: true, force: true })\n return true\n}\n\nfunction canonicalExistingPath(path: string): string {\n try {\n return realpathSync.native(path)\n } catch (error) {\n if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) throw error\n return resolve(path)\n }\n}\n\nfunction containsPath(container: string, candidate: string): boolean {\n const nested = relative(container, candidate)\n return nested === '' || (nested !== '..' && !nested.startsWith(`..${sep}`) && !isAbsolute(nested))\n}\n\nexport function assertSafeUninstallHome(home: string): string {\n const target = resolve(home)\n const canonical = canonicalExistingPath(target)\n const userHome = canonicalExistingPath(homedir())\n const workingDirectory = canonicalExistingPath(process.cwd())\n const exactForbidden = new Map<string, string>([\n [parse(canonical).root, 'filesystem root'],\n [userHome, 'user home directory'],\n [workingDirectory, 'current working directory'],\n ])\n const reason = exactForbidden.get(canonical)\n if (reason) throw new Error(`refusing to uninstall from ${reason}: ${target}`)\n if (containsPath(canonical, userHome)) {\n throw new Error(`refusing to uninstall from an ancestor of the user home directory: ${target}`)\n }\n if (containsPath(canonical, workingDirectory)) {\n throw new Error(\n `refusing to uninstall from an ancestor of the current working directory: ${target}`,\n )\n }\n return target\n}\n\nexport const uninstallCommand = defineCommand({\n meta: {\n name: 'uninstall',\n description: 'Wipe bazilion state from ~/.bazilion (or BAZILION_HOME)',\n },\n args: {\n home: { type: 'string', description: 'Override BAZILION_HOME' },\n yes: {\n type: 'boolean',\n description: 'Skip confirmations (reset tier only unless --all is set)',\n },\n all: {\n type: 'boolean',\n description: 'Also remove logs and skills (full wipe)',\n },\n },\n async run({ args }) {\n const paths = resolveCliPaths(args.home)\n const targetHome = assertSafeUninstallHome(paths.home)\n const dbFile = join(targetHome, 'bazilion.db')\n const profilesDir = join(targetHome, 'profiles')\n const agentsDir = join(targetHome, 'agents')\n const teamsDir = join(targetHome, 'teams')\n const legacyGroupsDir = join(targetHome, 'groups')\n const skillsDir = join(targetHome, 'skills')\n const logsDir = join(targetHome, 'logs')\n const legacyConfigFile = join(targetHome, 'config.json')\n const legacySecretsFile = join(targetHome, 'secrets.enc')\n\n if (!existsSync(targetHome)) {\n // A full wipe can remove the home and then be interrupted before its\n // sibling ownership record is released. Acquire the same operation so a\n // retry can reclaim that dead marker instead of leaving the home\n // permanently blocked from daemon startup and restore.\n const uninstallLock = await acquireHomeRestoreLock(targetHome, 'uninstalling')\n try {\n console.log(`nothing to remove: ${targetHome} does not exist`)\n uninstallLock.markUninstallComplete()\n } finally {\n uninstallLock.release()\n }\n return\n }\n const homeIsSymlink = lstatSync(targetHome).isSymbolicLink()\n\n console.log(`about to uninstall bazilion at ${targetHome}`)\n console.log('')\n\n const resetTargets = [\n dbFile,\n `${dbFile}-wal`,\n `${dbFile}-shm`,\n `${dbFile}-journal`,\n join(targetHome, 'auth.json'),\n legacyConfigFile,\n legacySecretsFile,\n profilesDir,\n agentsDir,\n teamsDir,\n legacyGroupsDir,\n ]\n\n const needsPrompt = !args.yes\n const readLine = needsPrompt ? makeLineReader() : null\n const wipeData =\n args.yes ||\n (await askYes(\n readLine as () => Promise<string>,\n 'remove DB + auth/config + agent / profile / team data?',\n ))\n if (!wipeData) {\n console.log('aborted')\n process.stdin.pause()\n return\n }\n\n // Tier 2: ask only after reset is confirmed. auth.json belongs to the DB's\n // bootstrap-token row, so both tiers remove it as one identity pair. Logs\n // and imported skills remain reusable across a clean bootstrap.\n const wipeAll =\n args.all ||\n (args.yes\n ? false\n : await askYes(\n readLine as () => Promise<string>,\n `also remove logs and skills? (full wipe of ${targetHome})`,\n ))\n\n process.stdin.pause()\n // Share the daemon/restore ownership primitive for the entire destructive\n // window. A daemon that is live or starting wins the lock and uninstall\n // fails closed before removing any state.\n const uninstallLock = await acquireHomeRestoreLock(targetHome, 'uninstalling')\n try {\n for (const p of resetTargets) {\n if (removePath(p)) console.log(`removed ${p}`)\n }\n\n if (wipeAll) {\n const fullWipeTargets = [logsDir, skillsDir]\n for (const p of fullWipeTargets) {\n if (removePath(p)) console.log(`removed ${p}`)\n }\n // If nothing else is left in $BAZILION_HOME, drop the empty dir too so\n // a subsequent `bazilion serve` re-bootstraps into a truly fresh home.\n if (readdirSync(targetHome).length === 0 && !homeIsSymlink) {\n rmSync(targetHome, { recursive: true, force: true })\n console.log(`removed ${targetHome}`)\n } else if (homeIsSymlink && readdirSync(targetHome).length === 0) {\n // The sibling ownership record is keyed to this symlink's canonical\n // target. Unlinking the alias before the record is released would\n // let an interrupted retry compute a different identity and bypass\n // the durable uninstall marker. Keep the empty root slot stable.\n console.log(`kept ${targetHome}: symlinked BAZILION_HOME root is now empty`)\n } else {\n console.log(`${targetHome} still has unmanaged files; left in place`)\n }\n } else {\n console.log('')\n console.log('kept: logs/, skills/')\n console.log(\n `re-run 'bazilion serve' to create a fresh DB and matching auth.json when you're ready.`,\n )\n }\n uninstallLock.markUninstallComplete()\n } finally {\n uninstallLock.release()\n }\n },\n})\n"],"mappings":"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","names":["defineCommand","createClient","readFileSync","row","readFileSync","createClient","list","decision","rl","resolve","defineCommand","defineCommand","createClient","defineCommand","list","defineCommand","createClient","defineCommand","resolve","defineCommand","createClient","createHash","randomUUID","chmodSync","closeSync","existsSync","fsyncSync","lstatSync","mkdirSync","openSync","readFileSync","renameSync","rmSync","writeFileSync","basename","dirname","resolve","defineCommand","list","row","createHash","readFileSync","basename","join","endpoint","defineCommand","resolve","existsSync","renameSync","dirname","basename","randomUUID","chmodSync","rmSync","list","entry","readFileSync","row","createHash","lstatSync","openSync","fsyncSync","closeSync","mkdirSync","writeFileSync","defineCommand","main","defineCommand","listCmd","defineCommand","createClient","existsSync","join","defineCommand","join","existsSync","entry","resolve","defineCommand","defineCommand","defineCommand","createClient","defineCommand","defineCommand","stdout","createClient","defineCommand","text","listCmd","defineCommand","createClient","showCmd","existsSync","readFileSync","writeFileSync","defineCommand","defineCommand","existsSync","readFileSync","writeFileSync","defineCommand","defineCommand","createClient","listCmd","showCmd","rmCmd","defineCommand","defineCommand","createClient","entry","readCmd","listCmd","rmCmd","spawn","randomBytes","readFileSync","rmSync","writeFileSync","tmpdir","join","defineCommand","createCmd","defineCommand","readFileSync","createClient","listCmd","list","showCmd","editCmd","join","tmpdir","randomBytes","writeFileSync","resolve","spawn","rmSync","deleteCmd","defineCommand","listCmd","defineCommand","createClient","enableCmd","disableCmd","testCmd","defineCommand","defineCommand","createClient","spawn","existsSync","join","defineCommand","bundledDaemonEntry","sourceDaemonEntry","daemonEntry","nodeArgs","resolve","defineCommand","listCmd","defineCommand","createClient","existsSync","readFileSync","basename","resolve","defineCommand","listCmd","defineCommand","createClient","rows","resolve","existsSync","readFileSync","basename","rmCmd","readFileSync","stdin","defineCommand","readFileSync","defineCommand","readFileSync","endpoint","show","defineCommand","createClient","diff","addCmd","defineCommand","createClient","listCmd","list","rmCmd","stdin","readFileSync","readFileSync","defineCommand","readFileSync","list","defineCommand","createClient","row","show","exportCommand","diff","importCommand","body","defineCommand","setCmd","defineCommand","createClient","showCmd","defineCommand","createCmd","defineCommand","createClient","listCmd","revokeCmd","defineCommand","addCmd","defineCommand","createClient","listCmd","rmCmd","enableCmd","disableCmd","existsSync","lstatSync","readdirSync","realpathSync","rmSync","homedir","isAbsolute","join","parse","relative","resolve","defineCommand","resolve","lstatSync","rmSync","realpathSync","relative","isAbsolute","homedir","parse","defineCommand","join","existsSync","uninstallLock","readdirSync","defineCommand"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../../../packages/client/src/index.ts","../src/auth-file.ts","../src/paths.ts","../src/client.ts","../src/commands/agent.ts","../src/columnize.ts","../src/commands/approval.ts","../src/commands/attention.ts","../src/commands/auth.ts","../src/commands/backup.ts","../src/backup-schema.ts","../src/daemon-liveness.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/commands/dashboard.ts","../src/commands/doctor.ts","../src/commands/gateway.ts","../src/commands/inbox.ts","../src/commands/login.ts","../src/commands/mcp.ts","../src/commands/memory.ts","../src/commands/profile.ts","../../../packages/api-types/src/index.ts","../src/commands/provider.ts","../src/commands/send.ts","../src/commands/serve.ts","../src/commands/session.ts","../src/commands/skill.ts","../src/commands/team.ts","../src/commands/team-policy.ts","../src/team-interchange.ts","../src/commands/team-template.ts","../src/commands/telegram.ts","../src/commands/token.ts","../src/commands/trigger.ts","../src/commands/uninstall.ts"],"sourcesContent":["import { defineCommand, runCommand, showUsage } from 'citty'\nimport pkg from '../package.json' with { type: 'json' }\nimport { ApiClientError } from './client.ts'\n\nconst VERSION = pkg.version\n\nimport { agentCommand } from './commands/agent.ts'\nimport { approvalCommand } from './commands/approval.ts'\nimport { attentionCommand } from './commands/attention.ts'\nimport { authCommand } from './commands/auth.ts'\nimport { backupCommand } from './commands/backup.ts'\nimport { completionCommand } from './commands/completion.ts'\nimport { configCommand } from './commands/config.ts'\nimport { dashboardCommand } from './commands/dashboard.ts'\nimport { doctorCommand } from './commands/doctor.ts'\nimport { gatewayCommand } from './commands/gateway.ts'\nimport { inboxCommand } from './commands/inbox.ts'\nimport { loginCommand } from './commands/login.ts'\nimport { mcpCommand } from './commands/mcp.ts'\nimport { memoryCommand } from './commands/memory.ts'\nimport { profileCommand } from './commands/profile.ts'\nimport { providerCommand } from './commands/provider.ts'\nimport { sendCommand } from './commands/send.ts'\nimport { serveCommand } from './commands/serve.ts'\nimport { sessionCommand } from './commands/session.ts'\nimport { skillCommand } from './commands/skill.ts'\nimport { teamCommand } from './commands/team.ts'\nimport { teamTemplateCommand } from './commands/team-template.ts'\nimport { telegramCommand } from './commands/telegram.ts'\nimport { tokenCommand } from './commands/token.ts'\nimport { triggerCommand } from './commands/trigger.ts'\nimport { uninstallCommand } from './commands/uninstall.ts'\n\nconst main = defineCommand({\n meta: {\n name: 'bazilion',\n version: VERSION,\n description: 'Multi-agent runtime',\n },\n subCommands: {\n login: loginCommand,\n profile: profileCommand,\n team: teamCommand,\n 'team-template': teamTemplateCommand,\n agent: agentCommand,\n approval: approvalCommand,\n attention: attentionCommand,\n skill: skillCommand,\n memory: memoryCommand,\n mcp: mcpCommand,\n provider: providerCommand,\n send: sendCommand,\n session: sessionCommand,\n inbox: inboxCommand,\n config: configCommand,\n serve: serveCommand,\n dashboard: dashboardCommand,\n doctor: doctorCommand,\n gateway: gatewayCommand,\n backup: backupCommand,\n trigger: triggerCommand,\n token: tokenCommand,\n auth: authCommand,\n telegram: telegramCommand,\n uninstall: uninstallCommand,\n },\n})\n\n// Mutate the command tree after definition so `completion` can introspect its\n// own siblings without a circular import. Cast is safe — citty keeps the\n// object reference on `main` after defineCommand, and we know its shape.\n;(main.subCommands as Record<string, unknown>).completion = completionCommand(main as never)\n\n// Resolve `bazilion <a> <b> --help` to the right subcommand for showUsage.\n// citty's built-in version is private, so we re-implement it for plain\n// subCommands objects (the shape we use throughout the tree).\ntype AnyCmd = Parameters<typeof showUsage>[0]\ntype CmdWithSubs = AnyCmd & { subCommands?: Record<string, AnyCmd> }\nasync function resolveSubCommand(\n cmd: CmdWithSubs,\n rawArgs: string[],\n parent?: AnyCmd,\n): Promise<[AnyCmd, AnyCmd | undefined]> {\n const subs = cmd.subCommands\n if (subs && Object.keys(subs).length > 0) {\n const idx = rawArgs.findIndex((a) => !a.startsWith('-'))\n const name = idx >= 0 ? rawArgs[idx] : undefined\n if (name && subs[name]) {\n return resolveSubCommand(subs[name] as CmdWithSubs, rawArgs.slice(idx + 1), cmd)\n }\n }\n return [cmd, parent]\n}\n\nfunction printError(err: unknown): void {\n if (err instanceof ApiClientError) {\n console.error(`error: ${err.body.error}`)\n if (err.status === 401) {\n console.error(' hint: token mismatch. Check ~/.bazilion/auth.json \"token\"')\n console.error(' or re-run \"bazilion login\" for a remote server.')\n } else if (err.status === 403) {\n console.error(' hint: request was rejected by the server. If you hit this from a')\n console.error(' fresh CLI build, check that BAZILION_SERVER matches the')\n console.error(' server origin exactly (scheme + host + port).')\n }\n return\n }\n const msg = err instanceof Error ? err.message : String(err)\n console.error(`error: ${msg}`)\n // Friendly hints for the most common connection failures. node's fetch\n // wraps the syscall error in err.cause.code, so we peek there too.\n const cause = err instanceof Error ? (err as { cause?: { code?: string } }).cause : undefined\n const code = cause?.code\n if (code === 'ECONNREFUSED' || /ECONNREFUSED/.test(msg)) {\n console.error(' hint: the bazilion server is not running. Start it with \"bazilion serve\"')\n console.error(' or point BAZILION_SERVER at a running instance.')\n } else if (code === 'ENOTFOUND' || /ENOTFOUND/.test(msg)) {\n console.error(' hint: host not found. Check BAZILION_SERVER / ~/.bazilion/auth.json.')\n }\n}\n\nfunction exitCodeForError(err: unknown): number {\n if (err instanceof ApiClientError) {\n if (err.status === 401 || err.status === 403) return 4\n if (err.status === 409) return 3\n if (err.status === 400 || err.status === 422) return 2\n return 1\n }\n const message = err instanceof Error ? err.message : String(err)\n return /invalid|unsupported|must be|require|refusing mutation|document belongs/.test(message)\n ? 2\n : 1\n}\n\n/**\n * Top-level `bazilion --help` renders a categorized layout instead of citty's\n * default `sub1|sub2|…` pipe-soup USAGE line. Subcommand `--help` still uses\n * citty's built-in renderer.\n */\nfunction printTopLevelHelp(): void {\n console.log(`Multi-agent runtime (bazilion v${VERSION})`)\n console.log('')\n console.log('USAGE bazilion <command> [args]')\n console.log('')\n const teams: { title: string; items: [string, string][] }[] = [\n {\n title: 'setup',\n items: [\n ['serve', 'Start the bazilion daemon (auto-bootstraps ~/.bazilion on first run)'],\n ['dashboard', 'Start the daemon + bundled web UI, then open the dashboard'],\n ['doctor', 'Diagnose your bazilion install'],\n ['uninstall', 'Wipe bazilion state from ~/.bazilion (or BAZILION_HOME)'],\n ],\n },\n {\n title: 'catalog',\n items: [\n ['profile', 'Manage profiles (templates agents are spawned from)'],\n ['team-template', 'Inspect and exchange reusable Team Templates'],\n ['team', 'Manage teams (collaboration context — filesystem root + USER.md + roster)'],\n ['skill', 'Manage the skill library'],\n ['provider', 'Manage and test LLM providers'],\n ['config', 'Manage service config (credentials + URLs/IDs)'],\n ['auth', 'OAuth provider sign-in (ChatGPT account, …)'],\n ],\n },\n {\n title: 'agents',\n items: [\n ['approval', 'Review and decide communication approval attempts'],\n ['attention', 'See everything that needs operator attention'],\n ['agent', 'Spawn, list, chat, archive agents'],\n ['memory', \"Read/write a team's shared memory\"],\n ['send', 'Send a message from one agent to another'],\n ['inbox', 'Inspect agent inboxes'],\n ['trigger', 'Manage scheduled agent triggers'],\n ],\n },\n {\n title: 'integrations',\n items: [['telegram', 'Telegram bot setup, health, lifecycle']],\n },\n {\n title: 'ops',\n items: [['backup', 'Encrypted backup, restore, and credential recovery']],\n },\n {\n title: 'remote',\n items: [\n ['login', 'Save a remote bazilion server + token pair to auth.json'],\n ['token', 'Manage web tokens for API/CLI clients'],\n ],\n },\n {\n title: 'shell',\n items: [['completion', 'Print shell completion script (bash | zsh | fish)']],\n },\n ]\n const nameWidth = 15\n for (const g of teams) {\n console.log(` ${g.title}`)\n for (const [name, desc] of g.items) {\n console.log(` ${name.padEnd(nameWidth)}${desc}`)\n }\n console.log('')\n }\n console.log('Use `bazilion <command> --help` for more information about a command.')\n}\n\nasync function entry(): Promise<void> {\n const rawArgs = process.argv.slice(2)\n try {\n if (rawArgs.includes('--help') || rawArgs.includes('-h')) {\n // For the top-level `bazilion --help`, render our grouped layout.\n // Subcommand help still goes through citty (preserves native formatting).\n const firstPositional = rawArgs.find((a) => !a.startsWith('-'))\n if (!firstPositional) {\n printTopLevelHelp()\n process.exit(0)\n }\n const [target, parent] = await resolveSubCommand(main as CmdWithSubs, rawArgs)\n await showUsage(target, parent)\n process.exit(0)\n }\n if (rawArgs.length === 1 && (rawArgs[0] === '--version' || rawArgs[0] === '-v')) {\n console.log(VERSION)\n return\n }\n await runCommand(main, { rawArgs })\n } catch (err) {\n printError(err)\n process.exit(exitCodeForError(err))\n }\n}\n\nentry()\n","{\n \"name\": \"bazilion\",\n \"version\": \"0.14.2\",\n \"description\": \"Multi-agent runtime CLI — spawn LLM agents, manage profiles/teams/skills, and run the local daemon.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rullopat/bazilion.git\",\n \"directory\": \"apps/cli\"\n },\n \"homepage\": \"https://bazilion.com\",\n \"bugs\": {\n \"url\": \"https://github.com/rullopat/bazilion/issues\"\n },\n \"keywords\": [\n \"agent\",\n \"agents\",\n \"ai\",\n \"cli\",\n \"daemon\",\n \"llm\",\n \"local-first\",\n \"multi-agent\",\n \"openclaw\",\n \"skills\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"bazilion\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"pnpm --filter @bazilion/web build && tsup\"\n },\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@earendil-works/pi-agent-core\": \"0.85.1\",\n \"@earendil-works/pi-ai\": \"0.85.1\",\n \"@earendil-works/pi-coding-agent\": \"0.85.1\",\n \"@hono/node-server\": \"^2.0.6\",\n \"@mozilla/readability\": \"^0.6.0\",\n \"@playwright/browser-chromium\": \"^1.61.0\",\n \"@tanstack/react-router\": \"1.170.16\",\n \"@tobilu/qmd\": \"^2.5.3\",\n \"adm-zip\": \"^0.5.17\",\n \"age-encryption\": \"0.3.0\",\n \"citty\": \"^0.2.2\",\n \"dompurify\": \"^3.4.11\",\n \"grammy\": \"^1.44.0\",\n \"hono\": \"^4.12.26\",\n \"linkedom\": \"^0.18.12\",\n \"lucide-react\": \"^1.21.0\",\n \"playwright\": \"^1.61.0\",\n \"qrcode-terminal\": \"^0.12.0\",\n \"react\": \"^19.2.7\",\n \"react-dom\": \"^19.2.7\",\n \"tar\": \"^7.5.16\",\n \"typebox\": \"^1.3.0\",\n \"undici\": \"^8.5.0\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@bazilion/api-types\": \"workspace:*\",\n \"@bazilion/client\": \"workspace:*\",\n \"@types/adm-zip\": \"^0.5.8\",\n \"@types/qrcode-terminal\": \"^0.12.2\"\n }\n}\n","import type { ApiError } from '@bazilion/api-types'\n\nexport type TokenSource = string | (() => string | Promise<string>)\n\nexport interface ClientConfig {\n serverUrl: string\n /**\n * Bearer token (or supplier for lazy / rotating credentials). The package\n * sends it as `Authorization: Bearer <token>` and also stamps `Origin:\n * <serverUrl>` to pass Astro's `security.checkOrigin` gate on non-GET\n * requests. Pass a function to support token rotation (OAuth refresh,\n * mobile keychain reads) — it is invoked on every request.\n */\n token: TokenSource | null\n /** Additional request headers for trusted adapters such as the web SSR session bridge. */\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n}\n\nexport class ApiClientError extends Error {\n status: number\n body: ApiError\n constructor(status: number, body: ApiError) {\n super(`${status}: ${body.error}`)\n this.status = status\n this.body = body\n }\n}\n\nasync function resolveToken(src: TokenSource): Promise<string> {\n return typeof src === 'function' ? await src() : src\n}\n\nexport function createClient(cfg: ClientConfig) {\n async function authHeaders(): Promise<Record<string, string>> {\n const token = cfg.token === null ? null : await resolveToken(cfg.token)\n const extra = typeof cfg.headers === 'function' ? await cfg.headers() : (cfg.headers ?? {})\n return {\n ...(token ? { authorization: `Bearer ${token}` } : {}),\n // Astro 6 enabled `security.checkOrigin` by default for server mode:\n // any state-changing request without an `Origin` matching the server\n // host is rejected with 403. Browsers set this automatically; `fetch`\n // in Node / React Native does not. Stamping the server's own URL is\n // always valid for a legitimate client.\n origin: cfg.serverUrl,\n ...extra,\n }\n }\n\n async function request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = { ...(await authHeaders()) }\n if (body !== undefined) headers['content-type'] = 'application/json'\n const res = await fetch(`${cfg.serverUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n if (!res.ok) {\n const err = (await res.json().catch(() => ({ error: res.statusText }))) as ApiError\n throw new ApiClientError(res.status, err)\n }\n if (res.status === 204) return undefined as T\n return (await res.json()) as T\n }\n\n // Multipart POST — lets the runtime set its own `content-type: multipart/form-data;\n // boundary=…` header. Reusing `request()` would stomp that with JSON, so\n // we keep a separate path.\n async function postMultipart<T>(path: string, form: FormData): Promise<T> {\n const res = await fetch(`${cfg.serverUrl}${path}`, {\n method: 'POST',\n headers: { ...(await authHeaders()) },\n body: form,\n })\n if (!res.ok) {\n const err = (await res.json().catch(() => ({ error: res.statusText }))) as ApiError\n throw new ApiClientError(res.status, err)\n }\n if (res.status === 204) return undefined as T\n return (await res.json()) as T\n }\n\n async function* stream<T>(method: string, path: string, body?: unknown): AsyncGenerator<T> {\n const headers: Record<string, string> = { ...(await authHeaders()) }\n if (body !== undefined) headers['content-type'] = 'application/json'\n const res = await fetch(`${cfg.serverUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n if (!res.ok || !res.body) {\n const err = (await res.json().catch(() => ({ error: res.statusText }))) as ApiError\n throw new ApiClientError(res.status, err)\n }\n const reader = res.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim()) yield JSON.parse(line) as T\n }\n }\n if (buffer.trim()) yield JSON.parse(buffer) as T\n }\n\n return {\n get: <T>(p: string) => request<T>('GET', p),\n post: <T>(p: string, b?: unknown) => request<T>('POST', p, b),\n postMultipart,\n put: <T>(p: string, b?: unknown) => request<T>('PUT', p, b),\n patch: <T>(p: string, b?: unknown) => request<T>('PATCH', p, b),\n del: <T>(p: string) => request<T>('DELETE', p),\n stream,\n }\n}\n\nexport type BazilionClient = ReturnType<typeof createClient>\n","import { existsSync, readFileSync } from 'node:fs'\n\nexport interface AuthFile {\n token: string\n remote?: { server: string; token: string } | null\n}\n\nexport function readAuthFile(authFile: string): AuthFile {\n if (!existsSync(authFile)) {\n throw new Error(`${authFile} not found. Start the daemon with \\`bazilion serve\\` first.`)\n }\n const raw = readFileSync(authFile, 'utf8')\n const parsed = JSON.parse(raw) as Partial<AuthFile>\n if (typeof parsed.token !== 'string' || !parsed.token) {\n throw new Error(`${authFile} is missing the \"token\" field`)\n }\n return { token: parsed.token, remote: parsed.remote ?? null }\n}\n","import { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport interface CliPaths {\n home: string\n authFile: string\n}\n\nexport function resolveCliPaths(home?: string): CliPaths {\n const root = home ?? process.env.BAZILION_HOME ?? join(homedir(), '.bazilion')\n return { home: root, authFile: join(root, 'auth.json') }\n}\n","import { type BazilionClient, createClient as createPackageClient } from '@bazilion/client'\nimport { readAuthFile } from './auth-file.ts'\nimport { resolveCliPaths } from './paths.ts'\n\nexport type { BazilionClient } from '@bazilion/client'\nexport { ApiClientError } from '@bazilion/client'\n\nexport interface ClientConfig {\n serverUrl: string\n token: string\n}\n\nexport function loadClientConfig(): ClientConfig {\n const envUrl = process.env.BAZILION_SERVER\n const envToken = process.env.BAZILION_TOKEN\n if (envUrl && envToken) return { serverUrl: envUrl, token: envToken }\n\n const paths = resolveCliPaths()\n const auth = readAuthFile(paths.authFile)\n // `bazilion login` writes `remote`; when present it targets another host\n // (Tailscale, LAN). Env vars still win so CI / ad-hoc invocations can\n // override without editing auth.json.\n if (auth.remote?.server && auth.remote.token) {\n return {\n serverUrl: envUrl ?? auth.remote.server,\n token: auth.remote.token,\n }\n }\n return {\n serverUrl: envUrl ?? 'http://127.0.0.1:4321',\n token: auth.token,\n }\n}\n\nexport function createClient(cfg: ClientConfig = loadClientConfig()): BazilionClient {\n return createPackageClient({ serverUrl: cfg.serverUrl, token: cfg.token })\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport { basename, extname } from 'node:path'\nimport { stdin, stdout } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport type {\n Agent,\n AgentLessonProposal,\n AgentLessonProposalResponse,\n AgentLessonStatus,\n AgentReviewConfig,\n Attachment,\n AttachSkillRequest,\n BashApprovalMode,\n ChatCompactRequest,\n ChatCompactResponse,\n ChatContextResponse,\n ChatFrame,\n ChatRequest,\n CommandApproval,\n CommandApprovalDecisionRequest,\n EnqueueAgentReviewResponse,\n ListAgentLessonProposalsResponse,\n ListAgentReviewsResponse,\n MoveAgentRequest,\n ResolvedAgent,\n ResolvedTeamPolicy,\n SessionEvent,\n SessionHeadResponse,\n SkillScanFinding,\n SpawnAgentRequest,\n TruncateChatRequest,\n TruncateChatResponse,\n UpdateAgentReviewConfigRequest,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { ApiClientError, createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst IMAGE_MIME: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n}\n\n/** Read image file paths into base64 attachments (image mime → routed to vision). */\nfunction loadImages(paths: string[]): Attachment[] {\n return paths.map((p) => {\n const mimeType = IMAGE_MIME[extname(p).toLowerCase()]\n if (!mimeType) throw new Error(`unsupported image type: ${p} (png/jpg/gif/webp only)`)\n return { name: basename(p), mimeType, data: readFileSync(p).toString('base64') }\n })\n}\n\nconst FILE_MIME: Record<string, string> = {\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.html': 'text/html',\n '.zip': 'application/zip',\n}\n\n/** Read arbitrary file paths into base64 attachments (non-image → stored + referenced). */\nfunction loadFiles(paths: string[]): Attachment[] {\n return paths.map((p) => ({\n name: basename(p),\n mimeType: FILE_MIME[extname(p).toLowerCase()] ?? 'application/octet-stream',\n data: readFileSync(p).toString('base64'),\n }))\n}\n\n/** citty gives a string for one flag, an array for several — normalize. */\nfunction asPaths(v: string | string[] | undefined): string[] {\n return v ? (Array.isArray(v) ? v : [v]) : []\n}\n\nconst spawnCmd = defineCommand({\n meta: { name: 'spawn', description: 'Spawn an agent from a profile into a team' },\n args: {\n profile: { type: 'string', required: true, description: 'Profile id' },\n name: { type: 'string', description: 'Agent name (defaults to profile name)' },\n team: {\n type: 'string',\n description: \"Team to join (defaults to 'default')\",\n },\n model: { type: 'string', description: 'Override profile default model' },\n reasoning: {\n type: 'string',\n description: 'Reasoning level: off|minimal|low|medium|high|xhigh (default: medium)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const teamId = args.team ?? 'default'\n const policy = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(teamId)}/policy`,\n )\n const body: SpawnAgentRequest = {\n profileId: args.profile,\n name: args.name,\n model: args.model,\n reasoningLevel: args.reasoning as SpawnAgentRequest['reasoningLevel'],\n teamId,\n teamExpectedRevision: policy.teamPolicy.revision,\n placement: 'profile_defaults',\n }\n const response = await client.post<{ agent: Agent }>('/api/agents', body)\n const agent = response.agent\n console.log(`spawned agent ${agent.id} (${agent.name})`)\n console.log(`dir: ${agent.dir}`)\n },\n})\n\nconst editCmd = defineCommand({\n meta: {\n name: 'edit',\n description: 'Edit agent settings (name, model override, reasoning level, telegram mirror)',\n },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n name: { type: 'string', description: 'Rename the agent' },\n model: { type: 'string', description: 'Set model override (use --model \"\" to clear)' },\n reasoning: {\n type: 'string',\n description: 'Reasoning level: off|minimal|low|medium|high|xhigh',\n },\n mirror: {\n type: 'string',\n description: 'Telegram mirror verbosity: minimal|verbose',\n },\n 'topic-icon': {\n type: 'string',\n description: 'Telegram topic emoji (e.g. 📚). Use --topic-icon \"\" to clear.',\n },\n },\n async run({ args }) {\n if (\n args.name === undefined &&\n args.model === undefined &&\n args.reasoning === undefined &&\n args.mirror === undefined &&\n args['topic-icon'] === undefined\n ) {\n console.error(\n 'agent edit: specify at least one of --name, --model, --reasoning, --mirror, --topic-icon',\n )\n process.exit(2)\n }\n const client = createClient()\n const body: Record<string, unknown> = {}\n if (args.name !== undefined) body.name = args.name\n if (args.model !== undefined) {\n body.modelOverride = args.model === '' ? null : args.model\n }\n if (args.reasoning !== undefined) body.reasoningLevel = args.reasoning\n if (args.mirror !== undefined) {\n if (args.mirror !== 'minimal' && args.mirror !== 'verbose') {\n console.error(`agent edit: --mirror must be 'minimal' or 'verbose'`)\n process.exit(2)\n }\n body.telegramMirrorMode = args.mirror\n }\n if (args['topic-icon'] !== undefined) {\n body.telegramIconEmoji = args['topic-icon'] === '' ? null : args['topic-icon']\n }\n const agent = await client.patch<Agent>(`/api/agents/${args.id}`, body)\n console.log(`updated agent ${agent.id} (${agent.name})`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List agents' },\n args: {\n all: { type: 'boolean', description: 'Include archived agents' },\n long: { type: 'boolean', alias: 'l', description: 'Show profile + full UUID columns' },\n },\n async run({ args }) {\n const client = createClient()\n const q = args.all ? '?includeArchived=true' : ''\n const list = await client.get<Agent[]>(`/api/agents${q}`)\n if (list.length === 0) {\n console.log('(no agents)')\n return\n }\n const rows = list.map((a) =>\n args.long\n ? [a.id, a.status, a.name, a.profileId]\n : // Short UUID prefix — all CLI commands accept 4+ char prefixes now.\n [a.id.slice(0, 8), a.status, a.name],\n )\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show agent details' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const r = await client.get<ResolvedAgent>(`/api/agents/${args.id}`)\n console.log(`# ${r.agent.id}`)\n console.log(`name: ${r.agent.name}`)\n console.log(`status: ${r.agent.status}`)\n console.log(`profile: ${r.profile.id}`)\n console.log(`model: ${r.model}`)\n console.log(`dir: ${r.agent.dir}`)\n console.log(`team: ${r.team.id} ${r.team.path}`)\n console.log('skills:')\n if (r.skills.length === 0) {\n console.log(' (none)')\n } else {\n for (const s of r.skills) console.log(` ${s}`)\n }\n },\n})\n\nconst archiveCmd = defineCommand({\n meta: { name: 'archive', description: 'Archive an agent' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.post(`/api/agents/${args.id}/archive`)\n console.log(`archived agent ${args.id}`)\n },\n})\n\nconst unarchiveCmd = defineCommand({\n meta: { name: 'unarchive', description: 'Restore an archived agent to idle' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.post(`/api/agents/${args.id}/unarchive`)\n console.log(`unarchived agent ${args.id}`)\n },\n})\n\nconst deleteCmd = defineCommand({\n meta: { name: 'delete', description: 'Permanently delete an agent and its data' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const agent = await client.get<ResolvedAgent>(`/api/agents/${encodeURIComponent(args.id)}`)\n const policy = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(agent.team.id)}/policy`,\n )\n await client.del(\n `/api/agents/${encodeURIComponent(args.id)}?expectedTeamRevision=${policy.teamPolicy.revision}`,\n )\n console.log(`deleted agent ${args.id}`)\n },\n})\n\n// --- chat ---\n\ninterface PrintState {\n inDeltaStream: boolean\n}\n\ntype CommandApprovalDecision = CommandApprovalDecisionRequest['decision']\n\ninterface CommandApprovalClient {\n post(path: string, body?: unknown): Promise<unknown>\n}\n\nexport interface CommandApprovalPrompt {\n question(prompt: string): Promise<string>\n write(line: string): void\n}\n\n/** Only a real terminal can answer while the chat response stream remains open. */\nexport function bashApprovalModeForTty(\n inputIsTty: boolean | undefined,\n outputIsTty: boolean | undefined,\n): BashApprovalMode {\n return inputIsTty && outputIsTty ? 'interactive' : 'auto_deny'\n}\n\n/** Build every CLI chat request with an explicit approval capability. */\nexport function buildChatRequest(\n message: string,\n attachments: Attachment[] | undefined,\n bashApprovalMode: BashApprovalMode,\n): ChatRequest {\n return {\n message,\n bashApprovalMode,\n ...(attachments && attachments.length > 0 ? { attachments } : {}),\n }\n}\n\nfunction terminalSafe(value: string): string {\n let safe = ''\n for (const character of value) {\n const code = character.charCodeAt(0)\n const isControl = code <= 9 || (code >= 11 && code <= 31) || (code >= 127 && code <= 159)\n safe += isControl ? `\\\\x${code.toString(16).padStart(2, '0')}` : character\n }\n return safe\n}\n\n/** Render one pending command and default safely to denial for every answer except y/yes. */\nexport async function promptForCommandApproval(\n approval: CommandApproval,\n prompt: CommandApprovalPrompt,\n): Promise<CommandApprovalDecision> {\n prompt.write(' [shell command approval required]')\n prompt.write(' command:')\n for (const line of approval.command.split('\\n')) prompt.write(` ${terminalSafe(line)}`)\n prompt.write(' risks:')\n for (const risk of approval.risks) {\n prompt.write(\n ` - ${terminalSafe(risk.code)} (${terminalSafe(risk.severity)}): ${terminalSafe(risk.message)}`,\n )\n }\n\n try {\n const answer = (await prompt.question(' Allow this command once? [y/N] ')).trim().toLowerCase()\n return answer === 'y' || answer === 'yes' ? 'allow' : 'deny'\n } catch {\n prompt.write(' [approval input unavailable; denying]')\n return 'deny'\n }\n}\n\n/** Post exactly one response for a pending approval; callers without a prompt deny immediately. */\nexport async function respondToCommandApproval(\n client: CommandApprovalClient,\n approval: CommandApproval,\n prompt?: CommandApprovalPrompt,\n): Promise<CommandApprovalDecision> {\n const decision = prompt ? await promptForCommandApproval(approval, prompt) : 'deny'\n await client.post(`/api/shell-approvals/${encodeURIComponent(approval.id)}`, { decision })\n return decision\n}\n\nfunction closeDeltaLine(state: PrintState): void {\n if (!state.inDeltaStream) return\n process.stdout.write('\\n')\n state.inDeltaStream = false\n}\n\nfunction printCommandApprovalStatus(approval: CommandApproval): void {\n switch (approval.status) {\n case 'allowed':\n console.log(' [shell command allowed]')\n break\n case 'denied':\n console.log(' [shell command denied]')\n break\n case 'auto_denied':\n console.log(' [shell command auto-denied: non-interactive turn]')\n break\n case 'expired':\n console.log(' [shell command approval expired]')\n break\n case 'cancelled':\n console.log(' [shell command approval cancelled]')\n break\n case 'pending':\n break\n }\n}\n\nfunction printEvent(e: SessionEvent, state: PrintState): void {\n switch (e.type) {\n case 'assistant_delta':\n process.stdout.write(e.delta)\n state.inDeltaStream = true\n break\n case 'assistant_message':\n if (state.inDeltaStream) {\n // Deltas already rendered the text; just close the line.\n process.stdout.write('\\n')\n state.inDeltaStream = false\n } else {\n console.log(e.text)\n }\n break\n case 'tool_call':\n if (state.inDeltaStream) {\n process.stdout.write('\\n')\n state.inDeltaStream = false\n }\n console.log(` [tool: ${e.name} ${e.arguments}]`)\n break\n case 'tool_result':\n console.log(` [result: ${e.result.split('\\n')[0]?.slice(0, 100)}]`)\n break\n case 'tool_error':\n console.log(` [tool error: ${e.name} — ${e.error}]`)\n break\n case 'file': {\n if (state.inDeltaStream) {\n process.stdout.write('\\n')\n state.inDeltaStream = false\n }\n const out = basename(e.name).replace(/[^\\w.-]/g, '_') || 'file'\n writeFileSync(out, Buffer.from(e.data, 'base64'))\n console.log(` [file received: saved to ./${out} (${e.mimeType})]`)\n break\n }\n case 'error':\n if (state.inDeltaStream) {\n process.stdout.write('\\n')\n state.inDeltaStream = false\n }\n console.log(` [error: ${e.error}]`)\n break\n }\n}\n\nasync function streamTurn(\n client: ReturnType<typeof createClient>,\n agentId: string,\n message: string,\n attachments?: Attachment[],\n options: {\n bashApprovalMode: BashApprovalMode\n approvalPrompt?: CommandApprovalPrompt\n } = { bashApprovalMode: 'auto_deny' },\n): Promise<void> {\n const state: PrintState = { inDeltaStream: false }\n const respondedApprovalIds = new Set<string>()\n for await (const frame of client.stream<ChatFrame>(\n 'POST',\n `/api/agents/${agentId}/chat`,\n buildChatRequest(message, attachments, options.bashApprovalMode),\n )) {\n if (frame.kind === 'event') {\n // A pending approval pauses rendering while we post a response on a\n // separate authenticated request; other events remain synchronous.\n const event = frame.event\n if (event.type === 'command_approval') {\n closeDeltaLine(state)\n const approval = event.approval\n if (approval.status === 'pending') {\n if (!respondedApprovalIds.has(approval.id)) {\n respondedApprovalIds.add(approval.id)\n await respondToCommandApproval(client, approval, options.approvalPrompt)\n }\n } else {\n printCommandApprovalStatus(approval)\n }\n } else if (event.type !== 'user_message') {\n printEvent(event, state)\n }\n } else if (frame.kind === 'fatal') {\n closeDeltaLine(state)\n throw new Error(frame.error)\n }\n }\n}\n\nconst chatCmd = defineCommand({\n meta: { name: 'chat', description: 'Chat with an agent' },\n args: {\n id: { type: 'positional', required: true },\n message: {\n type: 'string',\n description: 'Send a single message and exit (one-shot mode)',\n },\n image: {\n type: 'string',\n description: 'Attach an image file (png/jpg/gif/webp; repeatable). One-shot mode.',\n },\n file: {\n type: 'string',\n description: 'Attach any file — the agent gets a path reference (repeatable). One-shot mode.',\n },\n },\n async run({ args }) {\n const client = createClient()\n const resolved = await client.get<ResolvedAgent>(`/api/agents/${args.id}`)\n const bashApprovalMode = bashApprovalModeForTty(stdin.isTTY, stdout.isTTY)\n\n const attachments = [\n ...loadImages(asPaths(args.image as string | string[] | undefined)),\n ...loadFiles(asPaths(args.file as string | string[] | undefined)),\n ]\n\n if (args.message || attachments.length > 0) {\n const rl =\n bashApprovalMode === 'interactive'\n ? createInterface({ input: stdin, output: stdout })\n : null\n try {\n await streamTurn(client, resolved.agent.id, args.message ?? '', attachments, {\n bashApprovalMode,\n ...(rl\n ? {\n approvalPrompt: {\n question: (question) => rl.question(question),\n write: (line) => console.log(line),\n },\n }\n : {}),\n })\n } finally {\n rl?.close()\n }\n return\n }\n\n console.log(`chatting with ${resolved.agent.name} (${resolved.model})`)\n console.log('(type /exit to quit)')\n\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n if (bashApprovalMode === 'interactive') {\n // Sequential questions keep one readline instance as the sole stdin\n // owner. A command-approval question can safely run after the chat\n // question resolves; no async iterator is consuming lines in parallel.\n while (true) {\n let line: string\n try {\n line = await rl.question('> ')\n } catch {\n break\n }\n const trimmed = line.trim()\n if (trimmed === '/exit' || trimmed === '/quit') break\n if (!trimmed) continue\n try {\n await streamTurn(client, resolved.agent.id, trimmed, undefined, {\n bashApprovalMode,\n approvalPrompt: {\n question: (question) => rl.question(question),\n write: (output) => console.log(output),\n },\n })\n } catch (err) {\n console.error(`error: ${(err as Error).message}`)\n }\n }\n } else {\n // Preserve piped multi-line chat input, but never claim that this\n // caller can answer an approval request.\n rl.setPrompt('> ')\n rl.prompt()\n for await (const line of rl) {\n const trimmed = line.trim()\n if (trimmed === '/exit' || trimmed === '/quit') break\n if (!trimmed) {\n rl.prompt()\n continue\n }\n try {\n await streamTurn(client, resolved.agent.id, trimmed, undefined, {\n bashApprovalMode,\n })\n } catch (err) {\n console.error(`error: ${(err as Error).message}`)\n }\n rl.prompt()\n }\n }\n } finally {\n rl.close()\n }\n },\n})\n\nconst chatResetCmd = defineCommand({\n meta: { name: 'chat-reset', description: \"Reset an agent's chat history to empty\" },\n args: {\n id: { type: 'positional', required: true },\n force: { type: 'boolean', description: 'Skip the y/N prompt' },\n },\n async run({ args }) {\n if (!args.force) {\n process.stdout.write(`reset all chat history for ${args.id}? [y/N] `)\n const answer = await new Promise<string>((resolve) => {\n process.stdin.once('data', (d) => resolve(String(d).trim().toLowerCase()))\n })\n if (answer !== 'y' && answer !== 'yes') {\n console.log('aborted')\n return\n }\n }\n const client = createClient()\n await client.post(`/api/agents/${args.id}/chat/reset`)\n console.log(`reset chat history for ${args.id}`)\n },\n})\n\nconst chatTrimCmd = defineCommand({\n meta: {\n name: 'chat-trim',\n description: \"Keep the first N messages of an agent's chat history; drop the rest\",\n },\n args: {\n id: { type: 'positional', required: true },\n keep: { type: 'string', required: true, description: 'Number of leading messages to keep' },\n },\n async run({ args }) {\n const n = Number(args.keep)\n if (!Number.isFinite(n) || n < 0 || !Number.isInteger(n)) {\n throw new Error('--keep must be a non-negative integer')\n }\n const client = createClient()\n const body: TruncateChatRequest = { keepCount: n }\n const res = await client.post<TruncateChatResponse>(\n `/api/agents/${args.id}/chat/truncate`,\n body,\n )\n console.log(\n `trimmed: ${res.before} → ${res.after} messages (${res.before - res.after} dropped)`,\n )\n },\n})\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`\n return `${(n / (1024 * 1024)).toFixed(2)} MiB`\n}\n\nconst chatContextCmd = defineCommand({\n meta: {\n name: 'chat-context',\n description: \"Break down what consumes the agent's context window\",\n },\n args: {\n id: { type: 'positional', required: true },\n detail: {\n type: 'boolean',\n description: 'Include every tool/skill entry instead of the top 30',\n },\n json: { type: 'boolean', description: 'Emit raw JSON instead of a human report' },\n },\n async run({ args }) {\n const client = createClient()\n const query = args.detail || args.json ? '?detail=1' : ''\n const ctx = await client.get<ChatContextResponse>(`/api/agents/${args.id}/chat/context${query}`)\n if (args.json) {\n console.log(JSON.stringify(ctx, null, 2))\n return\n }\n\n const fmt = (chars: number, tokens: number): string =>\n `${chars.toLocaleString()} chars (~${tokens.toLocaleString()} tok)`\n\n console.log(`🧠 context for ${ctx.agentId}`)\n console.log(`model: ${ctx.model}`)\n console.log('')\n console.log('## system prompt')\n console.log(` total: ${fmt(ctx.systemPrompt.chars, ctx.systemPrompt.tokens)}`)\n if (ctx.systemPrompt.files.length > 0) {\n console.log(' profile files:')\n for (const f of ctx.systemPrompt.files) {\n console.log(` - ${f.name}: ${fmt(f.chars, f.tokens)}`)\n }\n }\n if (ctx.systemPrompt.skillsListChars > 0) {\n console.log(` skills line: ${ctx.systemPrompt.skillsListChars.toLocaleString()} chars`)\n }\n if (ctx.systemPrompt.teamListChars > 0) {\n console.log(` team block: ${ctx.systemPrompt.teamListChars.toLocaleString()} chars`)\n }\n if (ctx.systemPrompt.userMdChars > 0) {\n console.log(` user_md block: ${ctx.systemPrompt.userMdChars.toLocaleString()} chars`)\n }\n console.log(` memory hint: ${ctx.systemPrompt.memoryHintChars.toLocaleString()} chars`)\n console.log('')\n console.log('## tools')\n console.log(` count: ${ctx.tools.count}`)\n console.log(\n ` schemas (JSON): ${ctx.tools.schemaChars.toLocaleString()} chars (~${estimate(ctx.tools.schemaChars).toLocaleString()} tok)`,\n )\n console.log(` list text: ${ctx.tools.listChars.toLocaleString()} chars`)\n if (ctx.tools.entries.length > 0) {\n console.log(' top tools by schema size:')\n for (const t of ctx.tools.entries) {\n const params = t.paramCount != null ? ` (${t.paramCount} params)` : ''\n console.log(` - ${t.name}: ${t.schemaChars.toLocaleString()} chars${params}`)\n }\n }\n console.log('')\n if (ctx.skills.count > 0) {\n console.log('## skills')\n console.log(` count: ${ctx.skills.count}`)\n for (const s of ctx.skills.entries) {\n console.log(` - ${s.name}: ${s.blockChars.toLocaleString()} chars`)\n }\n console.log('')\n }\n console.log('## team')\n console.log(` - ${ctx.team.id} (${ctx.team.name}): ${ctx.team.path}`)\n if (ctx.team.userMdChars > 0) {\n console.log(` user_md: ${ctx.team.userMdChars.toLocaleString()} chars`)\n }\n console.log('')\n console.log('## history')\n console.log(` messages: ${ctx.history.messageEntries}`)\n console.log(` compactions: ${ctx.history.compactionEntries}`)\n console.log(` total: ${fmt(ctx.history.chars, ctx.history.tokensEstimate)}`)\n console.log(` bytes: ${formatBytes(ctx.history.bytes)}`)\n console.log('')\n console.log(`TOTAL: ${fmt(ctx.totals.chars, ctx.totals.tokens)}`)\n },\n})\n\nfunction estimate(chars: number): number {\n return Math.ceil(Math.max(0, chars) / 4)\n}\n\nconst chatCompactCmd = defineCommand({\n meta: {\n name: 'chat-compact',\n description: \"Summarize the head of an agent's chat log, preserving the tail verbatim\",\n },\n args: {\n id: { type: 'positional', required: true },\n 'keep-tail': {\n type: 'string',\n description: 'Message entries to keep verbatim after the summary (default 10)',\n },\n instructions: {\n type: 'string',\n description: 'Optional extra guidance prepended to the summarizer prompt',\n },\n force: { type: 'boolean', description: 'Skip the y/N prompt' },\n },\n async run({ args }) {\n if (!args.force) {\n process.stdout.write(\n `compact chat history for ${args.id}? head turns become a summary; tail is preserved. [y/N] `,\n )\n const answer = await new Promise<string>((resolve) => {\n process.stdin.once('data', (d) => resolve(String(d).trim().toLowerCase()))\n })\n if (answer !== 'y' && answer !== 'yes') {\n console.log('aborted')\n return\n }\n }\n const keepTailNum = args['keep-tail'] ? Number(args['keep-tail']) : undefined\n if (keepTailNum !== undefined && (!Number.isFinite(keepTailNum) || keepTailNum < 0)) {\n console.error('--keep-tail must be a non-negative integer')\n process.exitCode = 1\n return\n }\n const body: ChatCompactRequest = {}\n if (keepTailNum !== undefined) body.keepTail = Math.floor(keepTailNum)\n if (args.instructions) body.customInstructions = args.instructions\n const client = createClient()\n const res = await client.post<ChatCompactResponse>(`/api/agents/${args.id}/chat/compact`, body)\n console.log(\n `compacted: ${res.before} → ${res.after} entries (${res.summarized} summarized, ${res.keptTail} tail kept verbatim)`,\n )\n console.log(\n `tokens: ~${res.tokensBefore.toLocaleString()} → ~${res.tokensAfter.toLocaleString()}`,\n )\n console.log('')\n console.log('summary:')\n console.log(res.summary)\n },\n})\n\n// --- skill subcommand ---\n\nconst skillAddCmd = defineCommand({\n meta: { name: 'add', description: 'Attach a skill to an agent' },\n args: {\n agent: { type: 'positional', required: true },\n skill: { type: 'positional', required: true },\n 'allow-warnings': {\n type: 'boolean',\n description: 'Attach even when the static skill scan reports findings',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: AttachSkillRequest = { skill: args.skill, allowFindings: args['allow-warnings'] }\n try {\n await client.post(`/api/agents/${args.agent}/skills`, body)\n } catch (err) {\n if (err instanceof ApiClientError && err.body.code === 'skill_scan_blocked') {\n console.error(`error: ${err.body.error}`)\n printSkillFindings(err.body.findings ?? [])\n console.error(' hint: inspect the skill, then rerun with --allow-warnings to confirm')\n process.exitCode = 1\n return\n }\n throw err\n }\n console.log(`attached skill ${args.skill} to ${args.agent}`)\n },\n})\n\nfunction printSkillFindings(findings: SkillScanFinding[]): void {\n if (findings.length === 0) return\n console.error('scan findings:')\n for (const f of findings) {\n const line = f.line ? ` line ${f.line}` : ''\n console.error(` ${f.severity}: ${f.code}${line} - ${f.message}`)\n }\n}\n\nconst skillRmCmd = defineCommand({\n meta: { name: 'rm', description: 'Detach a skill from an agent' },\n args: {\n agent: { type: 'positional', required: true },\n skill: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/agents/${args.agent}/skills/${encodeURIComponent(args.skill)}`)\n console.log(`detached skill ${args.skill} from ${args.agent}`)\n },\n})\n\nconst skillCmd = defineCommand({\n meta: { name: 'skill', description: 'Attach/detach skills on an agent' },\n subCommands: {\n add: skillAddCmd,\n rm: skillRmCmd,\n },\n})\n\n// --- team membership ---\n\nconst moveCmd = defineCommand({\n meta: { name: 'move', description: 'Move an agent to a different team' },\n args: {\n agent: { type: 'positional', required: true },\n team: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const [agent, destination] = await Promise.all([\n client.get<ResolvedAgent>(`/api/agents/${encodeURIComponent(args.agent)}`),\n client.get<ResolvedTeamPolicy>(`/api/teams/${encodeURIComponent(args.team)}/policy`),\n ])\n const source = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(agent.team.id)}/policy`,\n )\n const body: MoveAgentRequest = {\n teamId: args.team,\n sourceExpectedRevision: source.teamPolicy.revision,\n destinationExpectedRevision: destination.teamPolicy.revision,\n placement: 'profile_defaults',\n }\n await client.patch(`/api/agents/${args.agent}/team`, body)\n console.log(`moved ${args.agent} to team ${args.team}`)\n },\n})\n\nconst sessionHeadCmd = defineCommand({\n meta: {\n name: 'session-head',\n description: \"Print the agent's current session file head (for stale-tab checks)\",\n },\n args: {\n id: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit raw JSON instead of a human line' },\n },\n async run({ args }) {\n const client = createClient()\n const head = await client.get<SessionHeadResponse>(`/api/agents/${args.id}/sessions/head`)\n if (args.json) {\n console.log(JSON.stringify(head))\n return\n }\n console.log(head.file ? `${head.file} (${head.size} bytes)` : '(no session yet)')\n },\n})\n\nconst cancelCmd = defineCommand({\n meta: { name: 'cancel', description: \"Abort the agent's currently-running turn\" },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.post(`/api/agents/${args.id}/cancel`)\n console.log(`cancelled active turn for ${args.id}`)\n },\n})\n\nconst reviewConfigCmd = defineCommand({\n meta: { name: 'review-config', description: 'Inspect or configure reviewed learning' },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n enable: { type: 'boolean', description: 'Enable periodic reviews' },\n disable: { type: 'boolean', description: 'Disable periodic reviews' },\n every: { type: 'string', description: 'Successful user turns between reviews (1-100)' },\n model: { type: 'string', description: \"Review model, or 'agent' to use the Agent model\" },\n reasoning: { type: 'string', description: 'Review reasoning level' },\n },\n async run({ args }) {\n if (args.enable && args.disable) throw new Error('choose either --enable or --disable')\n const client = createClient()\n const body: UpdateAgentReviewConfigRequest = {}\n if (args.enable || args.disable) body.enabled = Boolean(args.enable)\n if (args.every !== undefined) {\n const value = Number(args.every)\n if (!Number.isInteger(value) || value < 1 || value > 100) {\n throw new Error('--every must be an integer from 1 to 100')\n }\n body.everyNTurns = value\n }\n if (args.model !== undefined) body.model = args.model === 'agent' ? null : args.model\n if (args.reasoning !== undefined) {\n body.reasoningLevel = args.reasoning as UpdateAgentReviewConfigRequest['reasoningLevel']\n }\n const hasChanges = Object.keys(body).length > 0\n const config = hasChanges\n ? await client.patch<AgentReviewConfig>(`/api/agents/${args.id}/review-config`, body)\n : await client.get<AgentReviewConfig>(`/api/agents/${args.id}/review-config`)\n console.log(`review: ${config.enabled ? 'enabled' : 'disabled'}`)\n console.log(`cadence: every ${config.everyNTurns} successful user turns`)\n console.log(`model: ${config.model ?? 'agent model'}`)\n console.log(`reasoning: ${config.reasoningLevel}`)\n console.log(`turns since last review: ${config.turnsSinceLast}`)\n },\n})\n\nconst reviewCmd = defineCommand({\n meta: { name: 'review', description: 'Enqueue a reviewed-learning pass' },\n args: { id: { type: 'positional', required: true, description: 'Agent id or prefix' } },\n async run({ args }) {\n const response = await createClient().post<EnqueueAgentReviewResponse>(\n `/api/agents/${args.id}/reviews`,\n )\n console.log(`review ${response.review.id} ${response.review.status}`)\n },\n})\n\nconst reviewsCmd = defineCommand({\n meta: { name: 'reviews', description: 'List reviewed-learning history' },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n status: { type: 'string', description: 'pending|running|retrying|completed|failed|cancelled' },\n },\n async run({ args }) {\n const response = await createClient().get<ListAgentReviewsResponse>(\n `/api/agents/${args.id}/reviews`,\n )\n const reviews = args.status\n ? response.reviews.filter((review) => review.status === args.status)\n : response.reviews\n if (reviews.length === 0) return console.log('(no reviews)')\n for (const line of columnize(\n reviews.map((review) => [\n review.id,\n review.status,\n review.trigger,\n `${review.proposalCount} proposal(s)`,\n new Date(review.createdAt).toISOString(),\n ]),\n )) {\n console.log(line)\n }\n },\n})\n\nconst lessonsCmd = defineCommand({\n meta: { name: 'lessons', description: 'List reviewed lesson proposals' },\n args: {\n id: { type: 'positional', required: true, description: 'Agent id or prefix' },\n status: { type: 'string', description: 'pending|approved|rejected|revoked' },\n },\n async run({ args }) {\n const status = args.status as AgentLessonStatus | undefined\n const query = status ? `?status=${encodeURIComponent(status)}` : ''\n const response = await createClient().get<ListAgentLessonProposalsResponse>(\n `/api/agents/${args.id}/lesson-proposals${query}`,\n )\n if (response.proposals.length === 0) return console.log('(no lesson proposals)')\n for (const line of columnize(\n response.proposals.map((proposal) => [\n proposal.id,\n proposal.status,\n proposal.scope,\n proposal.text,\n ]),\n )) {\n console.log(line)\n }\n },\n})\n\nasync function locateProposal(\n id: string,\n): Promise<{ agent: Agent; proposal: AgentLessonProposal }> {\n const client = createClient()\n const agents = await client.get<Agent[]>('/api/agents?includeArchived=true')\n for (const agent of agents) {\n const response = await client.get<ListAgentLessonProposalsResponse>(\n `/api/agents/${agent.id}/lesson-proposals`,\n )\n const proposal = response.proposals.find((item) => item.id === id || item.id.startsWith(id))\n if (proposal) return { agent, proposal }\n }\n throw new Error(`lesson proposal not found: ${id}`)\n}\n\nfunction lessonDecisionCmd(decision: 'approve' | 'reject' | 'revoke') {\n return defineCommand({\n meta: { name: decision, description: `${decision} a reviewed lesson proposal` },\n args: {\n id: { type: 'positional', required: true, description: 'Proposal id or prefix' },\n yes: { type: 'boolean', description: `Confirm ${decision}` },\n },\n async run({ args }) {\n if (!args.yes) throw new Error(`${decision} requires --yes`)\n const { agent, proposal } = await locateProposal(args.id)\n const response = await createClient().post<AgentLessonProposalResponse>(\n `/api/agents/${agent.id}/lesson-proposals/${proposal.id}/${decision}`,\n { version: proposal.version },\n )\n console.log(`${response.proposal.status} ${response.proposal.id}`)\n },\n })\n}\n\nconst lessonEditCmd = defineCommand({\n meta: { name: 'edit', description: 'Edit a pending reviewed lesson proposal' },\n args: {\n id: { type: 'positional', required: true, description: 'Proposal id or prefix' },\n text: { type: 'string', description: 'Replacement lesson text' },\n scope: { type: 'string', description: 'private|shared' },\n },\n async run({ args }) {\n if (args.text === undefined && args.scope === undefined) {\n throw new Error('lesson edit requires --text or --scope')\n }\n const { agent, proposal } = await locateProposal(args.id)\n const response = await createClient().patch<AgentLessonProposalResponse>(\n `/api/agents/${agent.id}/lesson-proposals/${proposal.id}`,\n { version: proposal.version, text: args.text, scope: args.scope },\n )\n console.log(`updated ${response.proposal.id} v${response.proposal.version}`)\n },\n})\n\nconst lessonCmd = defineCommand({\n meta: { name: 'lesson', description: 'Edit or decide a reviewed lesson proposal' },\n subCommands: {\n edit: lessonEditCmd,\n approve: lessonDecisionCmd('approve'),\n reject: lessonDecisionCmd('reject'),\n revoke: lessonDecisionCmd('revoke'),\n },\n})\n\nexport const agentCommand = defineCommand({\n meta: { name: 'agent', description: 'Manage agent instances' },\n subCommands: {\n spawn: spawnCmd,\n list: listCmd,\n show: showCmd,\n edit: editCmd,\n archive: archiveCmd,\n unarchive: unarchiveCmd,\n delete: deleteCmd,\n chat: chatCmd,\n 'chat-reset': chatResetCmd,\n 'chat-trim': chatTrimCmd,\n 'chat-context': chatContextCmd,\n 'chat-compact': chatCompactCmd,\n cancel: cancelCmd,\n 'review-config': reviewConfigCmd,\n review: reviewCmd,\n reviews: reviewsCmd,\n lessons: lessonsCmd,\n lesson: lessonCmd,\n skill: skillCmd,\n move: moveCmd,\n 'session-head': sessionHeadCmd,\n },\n})\n","/**\n * Render `rows` as space-aligned columns. All rows must have the same column\n * count; empty cells are treated as `\"\"` for width purposes. Column spacing is\n * two spaces — wider than a tab, tighter than tabular CSV tooling expects.\n *\n * Used by list commands so `status` / `kind` / `name` columns don't jump when\n * one row is `idle` (4) and another is `archived` (8). Does not truncate —\n * long cells win the column width. Callers that want a bounded width should\n * slice before passing.\n */\nexport function columnize(rows: string[][], gap = ' '): string[] {\n if (rows.length === 0) return []\n const colCount = rows[0]?.length ?? 0\n const widths: number[] = new Array<number>(colCount).fill(0)\n for (const row of rows) {\n for (let i = 0; i < colCount; i++) {\n const cell = row[i] ?? ''\n const prev = widths[i] ?? 0\n if (cell.length > prev) widths[i] = cell.length\n }\n }\n return rows.map((row) =>\n row\n .map((cell, i) => {\n // Don't pad the last column — trailing whitespace is pointless and\n // breaks `| wc`-style pipes.\n if (i === colCount - 1) return cell\n return (cell ?? '').padEnd(widths[i] ?? 0)\n })\n .join(gap),\n )\n}\n","import type { CommunicationApproval, CommunicationApprovalDetail } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List communication approval queue/history' },\n args: {\n status: { type: 'string', default: 'pending' },\n team: { type: 'string' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const query = new URLSearchParams({ status: args.status, limit: '100' })\n if (args.team) query.set('teamId', args.team)\n const body = await createClient().get<{ approvals: CommunicationApproval[] }>(\n `/api/approvals?${query}`,\n )\n if (args.json) return console.log(JSON.stringify(body, null, 2))\n if (!body.approvals.length) return console.log('(no approvals)')\n for (const line of columnize([\n ['id', 'status', 'path', 'origin', 'expires'],\n ...body.approvals.map((item) => [\n item.id,\n item.status,\n `${endpoint(item.source)} -> ${endpoint(item.target)}`,\n item.origin,\n new Date(item.expiresAt).toISOString(),\n ]),\n ]))\n console.log(line)\n },\n})\n\nconst show = defineCommand({\n meta: { name: 'show', description: 'Show one approval including payload and audit events' },\n args: { id: { type: 'positional', required: true }, json: { type: 'boolean' } },\n async run({ args }) {\n const item = await createClient().get<CommunicationApprovalDetail>(\n `/api/approvals/${encodeURIComponent(args.id)}`,\n )\n if (args.json) return console.log(JSON.stringify(item, null, 2))\n console.log(`# ${item.id}`)\n console.log(`status: ${item.status}`)\n console.log(`attempt: ${item.attemptKind}:${item.attemptId}`)\n console.log(`path: ${endpoint(item.source)} -> ${endpoint(item.target)}`)\n console.log(`origin: ${item.origin}`)\n console.log(`expires: ${new Date(item.expiresAt).toISOString()}`)\n console.log(\n `revisions: ${item.policyRefs.map((ref) => `${ref.teamId}@${ref.revision}`).join(', ')}`,\n )\n console.log(`events: ${item.events.map((event) => event.event).join(' -> ')}`)\n },\n})\n\nfunction decision(name: 'approve' | 'deny' | 'cancel') {\n return defineCommand({\n meta: {\n name,\n description:\n name === 'approve'\n ? 'Approve and deliver one captured attempt'\n : `${name === 'deny' ? 'Deny' : 'Cancel'} one pending attempt`,\n },\n args: {\n id: { type: 'positional', required: true },\n reason: { type: 'string' },\n yes: { type: 'boolean', description: 'Required explicit non-interactive confirmation' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n if (!args.yes) throw new Error(`refusing ${name}: review with approval show, then pass --yes`)\n const item = await createClient().post<CommunicationApproval>(\n `/api/approvals/${encodeURIComponent(args.id)}/${name}`,\n args.reason ? { reason: args.reason } : {},\n )\n if (args.json) console.log(JSON.stringify(item, null, 2))\n else console.log(`${item.id}: ${item.status}`)\n },\n })\n}\n\nfunction endpoint(value: CommunicationApproval['source']): string {\n return value.kind === 'agent'\n ? `agent:${value.id}`\n : value.kind === 'user'\n ? `user:${value.teamId}`\n : `outside:${value.teamId}`\n}\n\nexport const approvalCommand = defineCommand({\n meta: { name: 'approval', description: 'Manage communication approval queue and history' },\n subCommands: {\n list,\n show,\n approve: decision('approve'),\n deny: decision('deny'),\n cancel: decision('cancel'),\n },\n})\n","import type { AttentionItem, AttentionListResponse, AttentionSummary } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List operator attention items' },\n args: {\n state: { type: 'string', default: 'open' },\n kind: { type: 'string' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n const query = new URLSearchParams({ state: args.state, limit: '200' })\n if (args.kind) query.set('kind', args.kind)\n const body = await createClient().get<AttentionListResponse>(`/api/attention?${query}`)\n if (args.json) return console.log(JSON.stringify(body, null, 2))\n if (!body.items.length) console.log('(nothing needs attention)')\n else\n for (const line of columnize([\n ['severity', 'kind', 'context', 'when', 'key'],\n ...body.items.map((item) => [\n item.severity,\n item.kind,\n context(item),\n new Date(item.occurredAt).toISOString(),\n item.key,\n ]),\n ]))\n console.log(line)\n for (const source of body.degraded)\n console.error(`warning: ${source.kind} unavailable: ${source.error}`)\n },\n})\n\nconst summary = defineCommand({\n meta: { name: 'summary', description: 'Summarize open attention items' },\n args: { json: { type: 'boolean' } },\n async run({ args }) {\n const body = await createClient().get<AttentionSummary>('/api/attention/summary')\n if (args.json) console.log(JSON.stringify(body, null, 2))\n else\n console.log(\n `${body.openTotal} open · ${body.bySeverity.action_required} action required · ${body.bySeverity.error} errors · ${body.bySeverity.warning} warnings`,\n )\n },\n})\n\nfunction mutation(name: 'acknowledge' | 'unacknowledge') {\n return defineCommand({\n meta: { name, description: `${name} one informational attention item` },\n args: {\n key: { type: 'positional', required: true },\n yes: { type: 'boolean', description: 'Required confirmation' },\n json: { type: 'boolean' },\n },\n async run({ args }) {\n if (!args.yes) throw new Error(`refusing mutation: pass --yes to ${name}`)\n const path = `/api/attention/${encodeURIComponent(args.key)}/${name === 'acknowledge' ? 'acknowledge' : 'acknowledgement'}`\n const body =\n name === 'acknowledge'\n ? await createClient().post<{ item: AttentionItem }>(path)\n : await createClient().del<{ item: AttentionItem }>(path)\n if (args.json) console.log(JSON.stringify(body, null, 2))\n else console.log(`${body.item.key}: ${body.item.acknowledgedAt ? 'acknowledged' : 'open'}`)\n },\n })\n}\n\nconst acknowledgeAll = defineCommand({\n meta: { name: 'acknowledge-all', description: 'Acknowledge all open informational items' },\n args: { yes: { type: 'boolean' }, json: { type: 'boolean' } },\n async run({ args }) {\n if (!args.yes) throw new Error('refusing mutation: pass --yes to acknowledge-all')\n const body = await createClient().post<{ acknowledged: number }>(\n '/api/attention/acknowledge-all',\n )\n if (args.json) console.log(JSON.stringify(body, null, 2))\n else console.log(`acknowledged ${body.acknowledged} informational item(s)`)\n },\n})\n\nfunction context(item: AttentionItem): string {\n return [item.agentName, item.teamName].filter(Boolean).join(' / ') || 'system'\n}\n\nexport const attentionCommand = defineCommand({\n meta: { name: 'attention', description: 'Inspect the operator attention center' },\n subCommands: {\n list,\n summary,\n acknowledge: mutation('acknowledge'),\n unacknowledge: mutation('unacknowledge'),\n 'acknowledge-all': acknowledgeAll,\n },\n})\n","// Import pi-ai's provider directly so the CLI bundle stays slim. The provider\n// owns its OAuth interaction; Bazilion persists the returned credential in the daemon.\nimport type { OpenAICodexStatus } from '@bazilion/api-types'\nimport type { AuthPrompt } from '@earendil-works/pi-ai'\nimport { openaiCodexProvider } from '@earendil-works/pi-ai/providers/openai-codex'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nexport interface OAuthPromptInput {\n once(event: 'data', listener: (chunk: string | Buffer) => void): unknown\n once(event: 'end', listener: () => void): unknown\n once(event: 'error', listener: (error: Error) => void): unknown\n removeListener(event: 'data', listener: (chunk: string | Buffer) => void): unknown\n removeListener(event: 'end', listener: () => void): unknown\n removeListener(event: 'error', listener: (error: Error) => void): unknown\n pause(): unknown\n}\n\nexport interface OAuthPromptOutput {\n write(message: string): unknown\n}\n\nexport type OpenAICodexLoginMethod = 'browser' | 'device_code'\n\nexport const CLI_OPENAI_LOGIN_TIMEOUT_MS = 10 * 60_000\n\nexport interface CliOpenAILoginLifetime {\n signal: AbortSignal\n dispose(): void\n}\n\n/** Keep CLI OAuth bounded even when stdin closes before a browser callback arrives. */\nexport function createCliOpenAILoginLifetime(\n timeoutMs = CLI_OPENAI_LOGIN_TIMEOUT_MS,\n): CliOpenAILoginLifetime {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort(\n new DOMException(\n 'OpenAI login timed out after 10 minutes. Try again with `bazilion auth openai login --device-code`.',\n 'TimeoutError',\n ),\n )\n }, timeoutMs)\n\n return {\n signal: controller.signal,\n dispose() {\n clearTimeout(timeout)\n },\n }\n}\n\nfunction promptAbortError(signal: AbortSignal): Error {\n return signal.reason instanceof Error\n ? signal.reason\n : new DOMException('OAuth prompt cancelled', 'AbortError')\n}\n\n/**\n * Answer Pi's OpenAI OAuth prompts while allowing its localhost callback to\n * cancel a pending manual-code read. Removing the data and abort listeners is\n * essential: a successful browser callback must not leave stdin flowing and\n * keep the CLI process alive.\n */\nexport function answerCliOpenAIPrompt(\n prompt: AuthPrompt,\n input: OAuthPromptInput = process.stdin,\n output: OAuthPromptOutput = process.stdout,\n loginMethod: OpenAICodexLoginMethod = 'browser',\n loginSignal?: AbortSignal,\n): Promise<string> {\n if (prompt.type === 'select') {\n const option = prompt.options.find((candidate) => candidate.id === loginMethod)\n return option\n ? Promise.resolve(option.id)\n : Promise.reject(\n new Error(\n `Pi openai-codex provider does not support ${loginMethod === 'browser' ? 'browser' : 'device-code'} login`,\n ),\n )\n }\n\n output.write(`${prompt.message}: `)\n return new Promise<string>((resolve, reject) => {\n let settled = false\n const signal = prompt.signal\n let readingInput = true\n const cleanupInput = () => {\n if (!readingInput) return\n readingInput = false\n input.removeListener('data', onData)\n input.removeListener('end', onInputUnavailable)\n input.removeListener('error', onInputUnavailable)\n input.pause()\n }\n const cleanup = () => {\n cleanupInput()\n signal?.removeEventListener('abort', onAbort)\n loginSignal?.removeEventListener('abort', onLoginAbort)\n }\n const onData = (data: string | Buffer) => {\n if (settled) return\n settled = true\n cleanup()\n resolve(String(data).trim())\n }\n const onAbort = () => {\n if (settled || !signal) return\n settled = true\n cleanup()\n reject(promptAbortError(signal))\n }\n\n const onLoginAbort = () => {\n if (settled || !loginSignal) return\n settled = true\n cleanup()\n reject(promptAbortError(loginSignal))\n }\n\n // Pi races this prompt against its localhost callback. EOF must stop stdin\n // listeners without rejecting the prompt, because rejecting would cancel a\n // browser callback that may still succeed. The bounded login signal remains\n // responsible for settling a callback that never arrives.\n const onInputUnavailable = () => {\n if (settled) return\n cleanupInput()\n }\n\n if (signal?.aborted) {\n onAbort()\n return\n }\n if (loginSignal?.aborted) {\n onLoginAbort()\n return\n }\n input.once('data', onData)\n input.once('end', onInputUnavailable)\n input.once('error', onInputUnavailable)\n signal?.addEventListener('abort', onAbort, { once: true })\n loginSignal?.addEventListener('abort', onLoginAbort, { once: true })\n })\n}\n\nfunction formatExpiry(ms: number | null): string {\n if (!ms) return '(unknown)'\n const d = new Date(ms)\n return d.toISOString().replace(/\\.\\d+Z$/, 'Z')\n}\n\nconst openaiLoginCmd = defineCommand({\n meta: {\n name: 'login',\n description: 'Connect your ChatGPT account via OAuth',\n },\n args: {\n 'device-code': {\n type: 'boolean',\n description: 'Use headless device-code login instead of the localhost browser callback',\n },\n },\n async run({ args }) {\n const client = createClient()\n // The loopback callback at localhost:1455 must be on the CLI user's\n // machine, so we run pi-ai's flow client-side (not via a server POST).\n // After it completes we ship the credentials to the daemon so they land\n // in the daemon-owned `secrets` table (encrypted with the bootstrap token).\n const loginMethod: OpenAICodexLoginMethod = args['device-code'] ? 'device_code' : 'browser'\n if (loginMethod === 'device_code') {\n console.log('starting OpenAI device-code sign-in...')\n } else {\n console.log('opening your browser for OpenAI sign-in...')\n console.log(\"(if it doesn't open automatically, paste the URL shown below)\")\n }\n const oauth = openaiCodexProvider().auth.oauth\n if (!oauth) throw new Error('Pi openai-codex provider does not expose OAuth')\n const lifetime = createCliOpenAILoginLifetime()\n const creds = await (async () => {\n try {\n return await oauth.login({\n signal: lifetime.signal,\n notify: (event) => {\n if (event.type === 'auth_url') {\n console.log('')\n console.log(` → ${event.url}`)\n console.log('')\n } else if (event.type === 'progress' || event.type === 'info') {\n console.log(` ${event.message}`)\n } else if (event.type === 'device_code') {\n console.log(` open ${event.verificationUri} and enter ${event.userCode}`)\n }\n },\n prompt: (prompt) =>\n answerCliOpenAIPrompt(\n prompt,\n process.stdin,\n process.stdout,\n loginMethod,\n lifetime.signal,\n ),\n })\n } finally {\n lifetime.dispose()\n }\n })()\n const status = await client.put<OpenAICodexStatus>('/api/auth/openai', {\n refresh: creds.refresh,\n access: creds.access,\n expires: creds.expires,\n })\n console.log('')\n console.log('connected ✓')\n if (status.accountId) console.log(`account: ${status.accountId}`)\n console.log(`access token expires: ${formatExpiry(status.expiresAt)}`)\n console.log('')\n console.log(`enable the 'openai-codex' provider on /config and save at least one model`)\n console.log('(e.g. gpt-5.3-codex-spark, gpt-5.4, gpt-5.5) to start using it.')\n console.log('CLI equivalent:')\n console.log(' bazilion provider enable openai-codex')\n console.log(' bazilion provider models-set openai-codex gpt-5.3-codex-spark')\n },\n})\n\nconst openaiLogoutCmd = defineCommand({\n meta: {\n name: 'logout',\n description: 'Forget the stored ChatGPT OAuth credentials',\n },\n async run() {\n const client = createClient()\n await client.del('/api/auth/openai')\n console.log('disconnected ChatGPT OAuth credentials')\n },\n})\n\nconst openaiStatusCmd = defineCommand({\n meta: {\n name: 'status',\n description: 'Show ChatGPT OAuth connection status',\n },\n async run() {\n const client = createClient()\n const status = await client.get<OpenAICodexStatus>('/api/auth/openai')\n if (!status.connected) {\n console.log('not connected — run `bazilion auth openai login`')\n return\n }\n console.log('connected ✓')\n if (status.accountId) console.log(`account: ${status.accountId}`)\n console.log(`access token expires: ${formatExpiry(status.expiresAt)}`)\n },\n})\n\nconst openaiCmd = defineCommand({\n meta: {\n name: 'openai',\n description: 'Manage ChatGPT (OAuth) authentication',\n },\n subCommands: {\n login: openaiLoginCmd,\n logout: openaiLogoutCmd,\n status: openaiStatusCmd,\n },\n})\n\nexport const authCommand = defineCommand({\n meta: {\n name: 'auth',\n description: 'OAuth-based provider authentication (ChatGPT account, etc.)',\n },\n subCommands: {\n openai: openaiCmd,\n },\n})\n","import {\n createCipheriv,\n createDecipheriv,\n createHash,\n pbkdf2Sync,\n randomBytes,\n randomUUID,\n} from 'node:crypto'\nimport {\n chmodSync,\n closeSync,\n copyFileSync,\n cpSync,\n createReadStream,\n createWriteStream,\n existsSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readdirSync,\n readFileSync,\n readSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, isAbsolute, parse, posix, relative, resolve } from 'node:path'\nimport { DatabaseSync, backup as sqliteBackup } from 'node:sqlite'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { Decrypter, Encrypter } from 'age-encryption'\nimport { defineCommand } from 'citty'\nimport { extract, list, type ReadEntry } from 'tar'\nimport { assertCanonicalBackupSchema } from '../backup-schema.ts'\nimport { loadClientConfig } from '../client.ts'\nimport { acquireHomeRestoreLock, DAEMON_LIVENESS_FILENAME } from '../daemon-liveness.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\nconst createCmd = defineCommand({\n meta: { name: 'create', description: 'Create a client-side encrypted backup of ~/.bazilion' },\n args: {\n output: {\n type: 'positional',\n required: false,\n description: 'Output path (default: .tar.gz.age with --recipient, otherwise .tar.gz)',\n },\n recipient: {\n type: 'string',\n description: 'age recipient (age1… or age1pq1…); encrypts before writing output',\n },\n plaintext: {\n type: 'boolean',\n description: 'Explicitly permit a sensitive unencrypted .tar.gz backup',\n },\n },\n async run({ args }) {\n if (args.recipient && args.plaintext) {\n throw new Error('--recipient and --plaintext are mutually exclusive')\n }\n if (!args.recipient && !args.plaintext) {\n throw new Error('choose --recipient <age1…> for encryption or explicitly pass --plaintext')\n }\n const cfg = loadClientConfig()\n const date = new Date().toISOString().slice(0, 10)\n const defaultSuffix = args.recipient ? '.tar.gz.age' : '.tar.gz'\n const outAbs = resolve(args.output ?? `bazilion-backup-${date}${defaultSuffix}`)\n if (existsSync(outAbs)) throw new Error(`refusing to overwrite existing backup: ${outAbs}`)\n const configuredHome = resolve(resolveCliPaths().home)\n const outputFromHome = relative(configuredHome, outAbs)\n if (!outputFromHome || (!outputFromHome.startsWith('..') && !isAbsolute(outputFromHome))) {\n throw new Error(\n `backup output must be outside BAZILION_HOME (${configuredHome}) to avoid nesting backups`,\n )\n }\n\n if (!args.recipient) {\n console.warn('warning: creating a plaintext backup containing all Bazilion credentials')\n }\n console.log(`${args.recipient ? 'encrypting' : 'downloading'} backup → ${outAbs}`)\n const res = await fetch(`${cfg.serverUrl}/api/backup`, {\n headers: { authorization: `Bearer ${cfg.token}`, origin: cfg.serverUrl },\n })\n if (!res.ok || !res.body) {\n let err: string = res.statusText\n try {\n const body = (await res.json()) as { error?: string }\n err = body.error ?? err\n } catch {}\n throw new Error(`backup failed: ${err}`)\n }\n // Keep the in-progress download in OS temp so a failed/cancelled transfer\n // never leaves a partial alongside the requested destination.\n const downloadDir = mkdtempSync(resolve(tmpdir(), 'bazilion-download-'))\n const partial = resolve(downloadDir, 'backup.tar.gz')\n try {\n if (args.recipient) {\n const [encryptSource, validateSource] = res.body.tee()\n const encrypter = new Encrypter()\n encrypter.addRecipient(args.recipient)\n const encrypted = await encrypter.encrypt(encryptSource)\n await Promise.all([\n pipeline(\n Readable.fromWeb(encrypted),\n createWriteStream(partial, { flags: 'wx', mode: 0o600 }),\n ),\n validateArchiveReadable(Readable.fromWeb(validateSource)),\n ])\n } else {\n await pipeline(\n Readable.fromWeb(res.body),\n createWriteStream(partial, { flags: 'wx', mode: 0o600 }),\n )\n }\n // A server/proxy can end a response cleanly after delivering only a\n // prefix. Parse the complete download before it can replace a known-good\n // output file or be reported as usable.\n if (!args.recipient) await validateArchive(partial)\n try {\n renameSync(partial, outAbs)\n } catch (error) {\n if (!(error instanceof Error) || !('code' in error) || error.code !== 'EXDEV') throw error\n // Cross-device rename (commonly a separate /tmp filesystem): copy the\n // complete archive to a sibling, then atomically install that sibling.\n const installPartial = resolve(\n dirname(outAbs),\n `.${basename(outAbs)}.${randomUUID()}.installing`,\n )\n try {\n copyFileSync(partial, installPartial)\n chmodSync(installPartial, 0o600)\n renameSync(installPartial, outAbs)\n } finally {\n rmSync(installPartial, { force: true })\n }\n }\n } finally {\n rmSync(downloadDir, { recursive: true, force: true })\n }\n console.log('done')\n },\n})\n\n/**\n * Offline restore. Server must be stopped first — SQLite's DB files would get\n * corrupted if the running daemon has them open while tar overwrites them.\n * We check the default and configured loopback URLs as a best-effort safety\n * net, including daemons bound to a custom port.\n */\nasync function probeServerRunning(serverUrl: string): Promise<boolean> {\n try {\n const ctrl = new AbortController()\n const timer = setTimeout(() => ctrl.abort(), 500)\n try {\n // /api/health is public — any HTTP response means the configured daemon\n // endpoint is live, without depending on the home token being readable.\n const res = await fetch(new URL('/api/health', serverUrl), { signal: ctrl.signal })\n return res.status >= 200 && res.status < 600\n } finally {\n clearTimeout(timer)\n }\n } catch {\n return false\n }\n}\n\nfunction loopbackServerUrl(raw: string | undefined): string | null {\n if (!raw) return null\n try {\n const url = new URL(raw)\n if (!['http:', 'https:'].includes(url.protocol)) return null\n const hostname = url.hostname.toLowerCase()\n if (!['127.0.0.1', 'localhost', '[::1]', '::1'].includes(hostname)) return null\n return url.origin\n } catch {\n return null\n }\n}\n\nfunction configuredLoopbackUrls(): string[] {\n const urls = new Set<string>(['http://127.0.0.1:4321'])\n const envUrl = loopbackServerUrl(process.env.BAZILION_SERVER)\n if (envUrl) urls.add(envUrl)\n try {\n const clientUrl = loopbackServerUrl(loadClientConfig().serverUrl)\n if (clientUrl) urls.add(clientUrl)\n } catch {\n // A missing/corrupt current auth file must not suppress the default probe.\n }\n return [...urls]\n}\n\ninterface ArchiveEntry {\n path: string\n type: ReadEntry['type']\n linkpath?: string\n}\n\nconst EXTRACTABLE_ENTRY_TYPES = new Set<ReadEntry['type']>([\n 'File',\n 'OldFile',\n 'Directory',\n 'SymbolicLink',\n])\n\nfunction normalizeArchivePath(rawPath: string): string {\n if (!rawPath || rawPath.includes('\\0')) throw new Error('backup contains an invalid empty path')\n // Backslashes are path separators on Windows but ordinary characters on\n // POSIX. Reject them so one archive has the same containment semantics on\n // every platform Bazilion supports.\n if (rawPath.includes('\\\\')) {\n throw new Error(`backup contains a non-portable path: ${JSON.stringify(rawPath)}`)\n }\n if (rawPath.startsWith('/') || /^[A-Za-z]:/.test(rawPath)) {\n throw new Error(`backup contains an absolute path: ${JSON.stringify(rawPath)}`)\n }\n\n const segments: string[] = []\n for (const segment of rawPath.split('/')) {\n if (!segment || segment === '.') continue\n if (segment === '..') {\n throw new Error(`backup path escapes the restore directory: ${JSON.stringify(rawPath)}`)\n }\n segments.push(segment)\n }\n return segments.join('/')\n}\n\nfunction validateArchiveSymbolicLink(path: string, rawTarget: string | undefined): void {\n if (!rawTarget || rawTarget.includes('\\0')) {\n throw new Error(`backup contains an invalid symbolic link target: ${path}`)\n }\n\n const segments = path.split('/')\n const isTeamSlot =\n segments.length === 2 &&\n segments[0] === 'teams' &&\n /^[a-z0-9][a-z0-9-]*$/.test(segments[1] ?? '')\n\n // A registered linked Team is the one intentional external-link shape in\n // a Bazilion home. Preserve its host-native absolute target, but never\n // admit absolute links at arbitrary archive paths.\n const portableTarget = rawTarget.replaceAll('\\\\', '/')\n const absoluteOnAnyPlatform =\n isAbsolute(rawTarget) || posix.isAbsolute(portableTarget) || /^[A-Za-z]:\\//.test(portableTarget)\n if (absoluteOnAnyPlatform) {\n if (!isTeamSlot) {\n throw new Error(`backup absolute symbolic links are only allowed for Team slots: ${path}`)\n }\n if (!isAbsolute(rawTarget)) {\n throw new Error(`backup contains an invalid Team link target: ${path}`)\n }\n return\n }\n\n // Team slots are registered with absolute targets so their identity does\n // not change when the Bazilion home moves. Other relative links are normal\n // work product; accept them only when their portable lexical target remains\n // inside the archive root. Entries beneath every symlink remain forbidden\n // by the complete-archive shape check below.\n if (isTeamSlot) {\n throw new Error(`backup contains an invalid Team link target: ${path}`)\n }\n if (/^[A-Za-z]:/.test(portableTarget)) {\n throw new Error(`backup contains a non-portable symbolic link target: ${path}`)\n }\n const target = posix.normalize(posix.join(posix.dirname(path), portableTarget))\n if (target === '..' || target.startsWith('../') || posix.isAbsolute(target)) {\n throw new Error(`backup symbolic link target escapes the restore directory: ${path}`)\n }\n}\n\nasync function validateArchive(file: string): Promise<ArchiveEntry[]> {\n const entries: ArchiveEntry[] = []\n await list({\n file,\n strict: true,\n onentry(entry) {\n if (entry.meta) return\n const path = normalizeArchivePath(entry.path)\n if (!path) return\n if (!EXTRACTABLE_ENTRY_TYPES.has(entry.type)) {\n throw new Error(`backup contains unsupported ${entry.type} entry: ${path}`)\n }\n if (entry.type === 'SymbolicLink') {\n validateArchiveSymbolicLink(path, entry.linkpath)\n }\n entries.push({ path, type: entry.type, linkpath: entry.linkpath })\n },\n })\n\n return validateArchiveEntries(entries)\n}\n\nasync function validateArchiveReadable(stream: Readable): Promise<ArchiveEntry[]> {\n const entries: ArchiveEntry[] = []\n const parser = list({\n strict: true,\n onentry(entry) {\n if (entry.meta) return\n const path = normalizeArchivePath(entry.path)\n if (!path) return\n if (!EXTRACTABLE_ENTRY_TYPES.has(entry.type)) {\n throw new Error(`backup contains unsupported ${entry.type} entry: ${path}`)\n }\n if (entry.type === 'SymbolicLink') validateArchiveSymbolicLink(path, entry.linkpath)\n entries.push({ path, type: entry.type, linkpath: entry.linkpath })\n },\n })\n await pipeline(stream, parser)\n return validateArchiveEntries(entries)\n}\n\nfunction validateArchiveEntries(entries: ArchiveEntry[]): ArchiveEntry[] {\n const byPath = new Map<string, ArchiveEntry>()\n for (const entry of entries) {\n if (byPath.has(entry.path)) throw new Error(`backup contains a duplicate path: ${entry.path}`)\n byPath.set(entry.path, entry)\n }\n\n const symlinks = new Set(\n entries.filter((entry) => entry.type === 'SymbolicLink').map((entry) => entry.path),\n )\n for (const entry of entries) {\n const segments = entry.path.split('/')\n for (let i = 1; i < segments.length; i++) {\n const ancestor = segments.slice(0, i).join('/')\n if (symlinks.has(ancestor)) {\n throw new Error(`backup entry traverses symbolic link ${ancestor}: ${entry.path}`)\n }\n const ancestorEntry = byPath.get(ancestor)\n if (ancestorEntry && ancestorEntry.type !== 'Directory') {\n throw new Error(`backup entry traverses non-directory ${ancestor}: ${entry.path}`)\n }\n }\n }\n\n for (const required of ['bazilion.db', 'auth.json']) {\n const entry = byPath.get(required)\n if (!entry || (entry.type !== 'File' && entry.type !== 'OldFile')) {\n throw new Error(`backup is missing required regular file: ${required}`)\n }\n }\n for (const transient of [\n 'bazilion.db-wal',\n 'bazilion.db-shm',\n 'bazilion.db-journal',\n DAEMON_LIVENESS_FILENAME,\n ]) {\n if (byPath.has(transient)) {\n throw new Error(`backup contains unsafe transient SQLite file: ${transient}`)\n }\n }\n\n return entries\n}\n\nfunction validateAuthFile(path: string): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new Error(`backup auth.json is invalid: ${detail}`)\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('token' in parsed) ||\n typeof parsed.token !== 'string' ||\n !parsed.token.trim()\n ) {\n throw new Error('backup auth.json is invalid: token is missing')\n }\n return parsed.token\n}\n\nfunction validateDatabase(path: string, authToken: string): void {\n let db: DatabaseSync | null = null\n try {\n db = new DatabaseSync(path, { readOnly: true })\n const integrity = db.prepare('PRAGMA integrity_check').all() as Array<{\n integrity_check: string\n }>\n if (integrity.length !== 1 || integrity[0]?.integrity_check !== 'ok') {\n const detail = integrity.map((row) => row.integrity_check).join('; ') || 'no result'\n throw new Error(`integrity_check failed: ${detail}`)\n }\n\n const foreignKeyErrors = db.prepare('PRAGMA foreign_key_check').all()\n if (foreignKeyErrors.length > 0) {\n throw new Error(`foreign_key_check failed with ${foreignKeyErrors.length} violation(s)`)\n }\n\n assertCanonicalBackupSchema(db)\n\n const tokenHash = createHash('sha256').update(authToken).digest('hex')\n const activeBootstrap = db\n .prepare(\n `SELECT 1 FROM web_tokens\n WHERE token_hash = ? AND kind = 'bootstrap' AND revoked_at IS NULL\n LIMIT 1`,\n )\n .get(tokenHash)\n if (!activeBootstrap) {\n throw new Error('auth.json token does not match an active web_tokens row')\n }\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('backup database is invalid:')) {\n throw error\n }\n const detail = error instanceof Error ? error.message : String(error)\n throw new Error(`backup database is invalid: ${detail}`)\n } finally {\n db?.close()\n }\n}\n\ninterface StoredEntityId {\n id: unknown\n}\n\nconst SLUG_ID = /^[a-z0-9][a-z0-9-]*$/\nconst AGENT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/\n\nfunction validateEntityId(id: unknown, pattern: RegExp, entity: string): string {\n if (typeof id !== 'string' || !pattern.test(id)) {\n throw new Error(`${entity} has an invalid canonical id: ${JSON.stringify(id)}`)\n }\n return id\n}\n\nfunction containedChildDirectory(root: string, id: string, rowLabel: string): string {\n const child = resolve(root, id)\n const fromRoot = relative(root, child)\n if (!fromRoot || fromRoot.startsWith('..') || isAbsolute(fromRoot)) {\n throw new Error(`${rowLabel} directory escapes its canonical root: ${JSON.stringify(id)}`)\n }\n return child\n}\n\nfunction requireExtractedDirectory(path: string, rowLabel: string): void {\n try {\n if (lstatSync(path).isDirectory()) return\n } catch {\n // Replace the platform-specific lstat error with one stable restore error.\n }\n throw new Error(`${rowLabel} is missing its canonical directory in the backup`)\n}\n\nfunction requireExtractedTeamSlot(path: string, rowLabel: string): void {\n try {\n const entry = lstatSync(path)\n if (entry.isDirectory() || entry.isSymbolicLink()) return\n } catch {\n // Replace the platform-specific lstat error with one stable restore error.\n }\n throw new Error(`${rowLabel} is missing its canonical Team slot in the backup`)\n}\n\n/**\n * `profiles.dir` and `agents.dir` are operational filesystem paths used by\n * daemon loaders, tools, sessions, and deletion. A backup can be restored on\n * another machine or under another --home, so source-home values must never\n * survive installation. Validate every DB-derived path component first, then\n * rewrite the staged DB to the final target paths before the atomic swap.\n */\nfunction rebaseRestoredHomeDirectories(\n database: string,\n payload: string,\n targetHome: string,\n): void {\n let db: DatabaseSync | null = null\n try {\n db = new DatabaseSync(database)\n db.exec('PRAGMA foreign_keys = ON')\n\n const profiles = db\n .prepare('SELECT id FROM profiles ORDER BY id')\n .all() as unknown as StoredEntityId[]\n const agents = db\n .prepare('SELECT id FROM agents ORDER BY id')\n .all() as unknown as StoredEntityId[]\n const teams = db\n .prepare('SELECT id FROM teams ORDER BY id')\n .all() as unknown as StoredEntityId[]\n\n const rewrites: Array<{ table: 'profiles' | 'agents'; id: string; dir: string }> = []\n for (const [table, rows, idPattern] of [\n ['profiles', profiles, SLUG_ID],\n ['agents', agents, AGENT_ID],\n ] as const) {\n const collection = table\n const stagedRoot = resolve(payload, collection)\n const targetRoot = resolve(targetHome, collection)\n for (const row of rows) {\n const id = validateEntityId(row.id, idPattern, `${table} row`)\n const rowLabel = `${table} row ${JSON.stringify(id)}`\n const stagedDir = containedChildDirectory(stagedRoot, id, rowLabel)\n requireExtractedDirectory(stagedDir, rowLabel)\n rewrites.push({\n table,\n id,\n dir: containedChildDirectory(targetRoot, id, rowLabel),\n })\n }\n }\n\n // Team paths are already derived from the active home at runtime, so\n // they need no DB rewrite. Their DB IDs are nevertheless path components;\n // validate them and require the archived canonical slot without following\n // an intentionally external linked-Team target.\n const stagedTeamsRoot = resolve(payload, 'teams')\n for (const row of teams) {\n const id = validateEntityId(row.id, SLUG_ID, 'teams row')\n const rowLabel = `teams row ${JSON.stringify(id)}`\n requireExtractedTeamSlot(containedChildDirectory(stagedTeamsRoot, id, rowLabel), rowLabel)\n }\n\n // Force all mutations into the canonical DB file. The daemon will switch\n // the installed DB back to WAL on startup; restore must not install a\n // private staging WAL/SHM tuple alongside it.\n db.exec('PRAGMA journal_mode = DELETE')\n db.exec('PRAGMA synchronous = FULL')\n let transactionOpen = false\n try {\n db.exec('BEGIN IMMEDIATE')\n transactionOpen = true\n const updateProfile = db.prepare('UPDATE profiles SET dir = ? WHERE id = ?')\n const updateAgent = db.prepare('UPDATE agents SET dir = ? WHERE id = ?')\n for (const rewrite of rewrites) {\n const result =\n rewrite.table === 'profiles'\n ? updateProfile.run(rewrite.dir, rewrite.id)\n : updateAgent.run(rewrite.dir, rewrite.id)\n if (result.changes !== 1) {\n throw new Error(`could not rebase ${rewrite.table} row ${JSON.stringify(rewrite.id)}`)\n }\n }\n\n const readProfile = db.prepare('SELECT dir FROM profiles WHERE id = ?')\n const readAgent = db.prepare('SELECT dir FROM agents WHERE id = ?')\n for (const rewrite of rewrites) {\n const row = (\n rewrite.table === 'profiles' ? readProfile.get(rewrite.id) : readAgent.get(rewrite.id)\n ) as { dir?: unknown } | undefined\n if (row?.dir !== rewrite.dir) {\n throw new Error(\n `could not verify rebased ${rewrite.table} row ${JSON.stringify(rewrite.id)}`,\n )\n }\n }\n db.exec('COMMIT')\n transactionOpen = false\n } catch (error) {\n if (transactionOpen) db.exec('ROLLBACK')\n throw error\n }\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new Error(`backup database is invalid: ${detail}`)\n } finally {\n db?.close()\n }\n\n for (const suffix of ['-wal', '-shm', '-journal']) {\n if (existsSync(`${database}${suffix}`)) {\n throw new Error(`backup database is invalid: path rebasing left transient ${suffix} state`)\n }\n }\n}\n\nfunction removeRebuildableQmdIndexes(payload: string): void {\n const teamsDir = resolve(payload, 'teams')\n if (!existsSync(teamsDir) || !lstatSync(teamsDir).isDirectory()) return\n\n for (const team of readdirSync(teamsDir, { withFileTypes: true })) {\n // Linked Teams are leaf symlinks in the archive. Never follow them while\n // cleaning caches or restore could touch the external project directory.\n if (!team.isDirectory() || team.isSymbolicLink()) continue\n const memoryDir = resolve(teamsDir, team.name, 'memory')\n if (!existsSync(memoryDir) || !lstatSync(memoryDir).isDirectory()) continue\n for (const entry of readdirSync(memoryDir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.startsWith('.qmd-index.sqlite')) {\n rmSync(resolve(memoryDir, entry.name), { force: true })\n }\n }\n }\n}\n\nfunction revokeRestoredBrowserSessions(database: string): void {\n const db = new DatabaseSync(database)\n try {\n db.prepare('UPDATE web_sessions SET revoked_at = ? WHERE revoked_at IS NULL').run(Date.now())\n } finally {\n db.close()\n }\n}\n\nexport function installValidatedPayload(\n payload: string,\n targetHome: string,\n staging: string,\n lifecycle?: Pick<\n import('../daemon-liveness.ts').HomeRestoreLock,\n 'markSwapping' | 'markInstalled' | 'markRecoveryRequired'\n >,\n operations: {\n rename(source: string, destination: string): void\n fsyncDirectory?(path: string): void\n afterPreviousMoved?(): void\n } = { rename: renameSync },\n): void {\n const previous = resolve(staging, 'previous-home')\n const hadPrevious = existsSync(targetHome)\n const targetParent = dirname(targetHome)\n const syncDirectory = operations.fsyncDirectory ?? fsyncDirectory\n\n const recoveryError = (\n message: string,\n recoveryPath: string,\n cause: unknown,\n ): RestoreRecoveryRequiredError => {\n let markerError: unknown\n try {\n lifecycle?.markRecoveryRequired(recoveryPath, hadPrevious)\n } catch (error) {\n markerError = error\n }\n const causeDetail = cause instanceof Error ? cause.message : String(cause)\n const markerDetail = markerError\n ? `; recovery marker update failed: ${markerError instanceof Error ? markerError.message : markerError}`\n : ''\n return new RestoreRecoveryRequiredError(\n `${message} (${causeDetail}); recovery data is at ${recoveryPath}${markerDetail}`,\n recoveryPath,\n )\n }\n\n lifecycle?.markSwapping(previous, hadPrevious)\n\n if (hadPrevious) {\n try {\n operations.rename(targetHome, previous)\n } catch (moveError) {\n // The old home never moved, so startup is safe once the phase is\n // durably returned to `installed`.\n lifecycle?.markInstalled()\n throw moveError\n }\n try {\n syncDirectory(targetParent)\n // Test-only fault hook proving that any handled failure after the first\n // rename is promoted to durable recovery-required state.\n operations.afterPreviousMoved?.()\n } catch (postMoveError) {\n throw recoveryError(\n 'the previous home moved but the swap could not continue safely',\n previous,\n postMoveError,\n )\n }\n }\n\n try {\n operations.rename(payload, targetHome)\n } catch (installError) {\n if (hadPrevious) {\n try {\n operations.rename(previous, targetHome)\n } catch (rollbackError) {\n const installDetail =\n installError instanceof Error ? installError.message : String(installError)\n throw recoveryError(\n `restore install failed (${installDetail}) and rollback failed`,\n previous,\n rollbackError,\n )\n }\n\n try {\n syncDirectory(targetParent)\n } catch (rollbackSyncError) {\n throw recoveryError(\n 'the previous home was restored but its directory entry could not be made durable',\n targetHome,\n rollbackSyncError,\n )\n }\n\n try {\n lifecycle?.markInstalled()\n } catch (phaseError) {\n throw recoveryError(\n 'the previous home was restored but could not be marked safe',\n targetHome,\n phaseError,\n )\n }\n } else {\n lifecycle?.markInstalled()\n }\n throw installError\n }\n\n try {\n syncDirectory(targetParent)\n } catch (installSyncError) {\n throw recoveryError(\n 'the restored home was installed but its directory entry could not be made durable',\n hadPrevious ? previous : targetHome,\n installSyncError,\n )\n }\n\n try {\n lifecycle?.markInstalled()\n } catch (phaseError) {\n throw recoveryError(\n 'the restored home was installed but could not be marked safe',\n hadPrevious ? previous : targetHome,\n phaseError,\n )\n }\n}\n\nexport class RestoreRecoveryRequiredError extends Error {\n readonly recoveryPath: string\n\n constructor(message: string, recoveryPath: string) {\n super(message)\n this.name = 'RestoreRecoveryRequiredError'\n this.recoveryPath = recoveryPath\n }\n}\n\nfunction fsyncDirectory(path: string): void {\n let fd: number | null = null\n try {\n fd = openSync(path, 'r')\n fsyncSync(fd)\n } catch (error) {\n // Windows does not allow opening directories. File/lock fsync still\n // provides the strongest portable durability available there.\n if (process.platform !== 'win32') throw error\n } finally {\n if (fd !== null) closeSync(fd)\n }\n}\n\nfunction fsyncFile(path: string): void {\n const fd = openSync(path, 'r')\n try {\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n}\n\nconst AGE_HEADER = Buffer.from('age-encryption.org/v1\\n', 'ascii')\n\nfunction isAgeEncrypted(path: string): boolean {\n const fd = openSync(path, 'r')\n try {\n const header = Buffer.alloc(AGE_HEADER.length)\n return readSync(fd, header, 0, header.length, 0) === header.length && header.equals(AGE_HEADER)\n } finally {\n closeSync(fd)\n }\n}\n\nfunction readAgeIdentity(rawPath: string): string {\n const path = resolve(rawPath)\n const entry = lstatSync(path)\n if (!entry.isFile()) throw new Error(`age identity is not a regular file: ${path}`)\n if (process.platform !== 'win32' && (entry.mode & 0o077) !== 0) {\n throw new Error(`age identity must be owner-only (chmod 600): ${path}`)\n }\n const identities = readFileSync(path, 'utf8')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n if (identities.length !== 1 || !identities[0]?.startsWith('AGE-SECRET-KEY-')) {\n throw new Error('age identity file must contain exactly one supported AGE-SECRET-KEY entry')\n }\n return identities[0]\n}\n\nconst restoreCmd = defineCommand({\n meta: {\n name: 'restore',\n description: 'Extract a backup tar.gz into ~/.bazilion (offline; server must be stopped)',\n },\n args: {\n file: {\n type: 'positional',\n required: true,\n description: 'Path to tar.gz backup file',\n },\n home: { type: 'string', description: 'Override BAZILION_HOME' },\n force: {\n type: 'boolean',\n description: 'Overwrite existing non-empty home (destroys existing data)',\n },\n identity: {\n type: 'string',\n description: 'Path to an age identity file required for encrypted backups',\n },\n },\n async run({ args }) {\n const file = resolve(args.file)\n if (!existsSync(file)) throw new Error(`backup file not found: ${file}`)\n\n const paths = resolveCliPaths(args.home)\n const targetHome = resolve(paths.home)\n if (targetHome === parse(targetHome).root) {\n throw new Error(`refusing to restore over filesystem root: ${targetHome}`)\n }\n\n const targetParent = dirname(targetHome)\n mkdirSync(targetParent, { recursive: true })\n const restoreLock = await acquireHomeRestoreLock(targetHome)\n\n try {\n // Keep probing known URLs for older daemons that predate the ownership\n // record. The lock above is authoritative for current daemons and stays\n // held until validation plus install/rollback have fully completed.\n const targetsConfiguredHome = targetHome === resolve(resolveCliPaths().home)\n if (targetsConfiguredHome) {\n for (const serverUrl of configuredLoopbackUrls()) {\n if (await probeServerRunning(serverUrl)) {\n throw new Error(\n `bazilion server appears to be running at ${serverUrl} — stop it before restoring.`,\n )\n }\n }\n }\n\n if (existsSync(targetHome)) {\n if (!lstatSync(targetHome).isDirectory()) {\n throw new Error(`${targetHome} exists and is not a directory`)\n }\n const entries = readdirSync(targetHome)\n if (entries.length > 0 && !args.force) {\n throw new Error(\n `${targetHome} is not empty. Pass --force to overwrite (destroys existing data).`,\n )\n }\n }\n\n const staging = mkdtempSync(resolve(targetParent, '.bazilion-restore-'))\n const stagedArchive = resolve(staging, 'backup.tar.gz')\n const payload = resolve(staging, 'payload')\n let preserveStaging = false\n\n try {\n // Validate and extract a private copy so an archive replaced by another\n // process between the two passes cannot bypass path validation.\n if (isAgeEncrypted(file)) {\n if (!args.identity) {\n throw new Error('encrypted backup requires --identity <owner-only age identity file>')\n }\n const identity = readAgeIdentity(args.identity)\n const decrypter = new Decrypter()\n decrypter.addIdentity(identity)\n let decrypted: ReadableStream<Uint8Array>\n try {\n decrypted = await decrypter.decrypt(\n Readable.toWeb(createReadStream(file)) as ReadableStream<Uint8Array>,\n )\n } catch {\n throw new Error('backup decryption failed: wrong identity or invalid encrypted header')\n }\n try {\n await pipeline(\n Readable.fromWeb(decrypted),\n createWriteStream(stagedArchive, { flags: 'wx', mode: 0o600 }),\n )\n } catch {\n throw new Error('backup decryption failed: ciphertext is truncated or modified')\n }\n } else {\n if (args.identity) {\n throw new Error('encrypted-only restore requested, but the backup is plaintext')\n }\n copyFileSync(file, stagedArchive)\n chmodSync(stagedArchive, 0o600)\n }\n await validateArchive(stagedArchive)\n mkdirSync(payload)\n await extract({\n file: stagedArchive,\n cwd: payload,\n strict: true,\n preserveOwner: false,\n // The private copy has already passed complete entry-path and link\n // validation above. Preserve paths here so an intentionally absolute\n // external linked-Team target is not stripped into a different,\n // payload-relative path by npm-tar.\n preservePaths: true,\n })\n\n const database = resolve(payload, 'bazilion.db')\n const authFile = resolve(payload, 'auth.json')\n if (!lstatSync(database).isFile() || !lstatSync(authFile).isFile()) {\n throw new Error('backup required files did not extract as regular files')\n }\n const authToken = validateAuthFile(authFile)\n validateDatabase(database, authToken)\n rebaseRestoredHomeDirectories(database, payload, targetHome)\n revokeRestoredBrowserSessions(database)\n // Recheck the canonical file after the controlled mutation. This also\n // proves the auth pairing and all schema/FK invariants still hold.\n validateDatabase(database, authToken)\n removeRebuildableQmdIndexes(payload)\n\n console.log(`installing validated backup ${file} → ${targetHome}`)\n try {\n installValidatedPayload(payload, targetHome, staging, restoreLock)\n } catch (error) {\n if (error instanceof RestoreRecoveryRequiredError) {\n preserveStaging = true\n }\n throw error\n }\n } finally {\n if (!preserveStaging) {\n try {\n rmSync(staging, { recursive: true, force: true })\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n console.warn(\n `warning: could not remove restore staging directory ${staging}: ${detail}`,\n )\n }\n }\n }\n } finally {\n restoreLock.release()\n }\n\n console.log(`restored to ${targetHome}`)\n console.log('start the server with: bazilion serve (migrations apply automatically)')\n },\n})\n\ninterface SecretEnvelope {\n salt: string\n iv: string\n tag: string\n data: string\n}\n\nfunction decryptSecretEnvelope(raw: string, password: string): string {\n const envelope = JSON.parse(raw) as SecretEnvelope\n const key = pbkdf2Sync(password, Buffer.from(envelope.salt, 'hex'), 100_000, 32, 'sha256')\n const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(envelope.iv, 'hex'))\n decipher.setAuthTag(Buffer.from(envelope.tag, 'hex'))\n return Buffer.concat([\n decipher.update(Buffer.from(envelope.data, 'hex')),\n decipher.final(),\n ]).toString('utf8')\n}\n\nfunction encryptSecretEnvelope(value: string, password: string): string {\n const salt = randomBytes(16)\n const key = pbkdf2Sync(password, salt, 100_000, 32, 'sha256')\n const iv = randomBytes(12)\n const cipher = createCipheriv('aes-256-gcm', key, iv)\n const data = Buffer.concat([cipher.update(value, 'utf8'), cipher.final()])\n return JSON.stringify({\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: cipher.getAuthTag().toString('hex'),\n data: data.toString('hex'),\n } satisfies SecretEnvelope)\n}\n\nfunction credentialInventory(home: string): {\n bootstrap: boolean\n activeTokens: number\n secretKeys: string[]\n} {\n const authFile = resolve(home, 'auth.json')\n const database = resolve(home, 'bazilion.db')\n const token = validateAuthFile(authFile)\n validateDatabase(database, token)\n const db = new DatabaseSync(database, { readOnly: true })\n try {\n const activeTokens = db\n .prepare(\n \"SELECT COUNT(*) AS count FROM web_tokens WHERE revoked_at IS NULL AND kind = 'device' AND expires_at > ?\",\n )\n .get(Date.now()) as { count: number }\n const secretKeys = (\n db.prepare('SELECT key FROM secrets ORDER BY key').all() as unknown as Array<{ key: string }>\n ).map((row) => row.key)\n return { bootstrap: true, activeTokens: activeTokens.count, secretKeys }\n } finally {\n db.close()\n }\n}\n\nconst inventoryCmd = defineCommand({\n meta: { name: 'inventory', description: 'List credential classes captured by a backup/home' },\n args: { home: { type: 'string', description: 'Override BAZILION_HOME' } },\n run({ args }) {\n const home = resolve(resolveCliPaths(args.home).home)\n const inventory = credentialInventory(home)\n console.log('credential classes present (values are never shown):')\n console.log(` bootstrap token: ${inventory.bootstrap ? 'present' : 'missing'}`)\n console.log(` active device/web/mobile tokens: ${inventory.activeTokens}`)\n for (const key of inventory.secretKeys) console.log(` stored secret: ${key}`)\n },\n})\n\nconst recoveryGuideCmd = defineCommand({\n meta: { name: 'recovery-guide', description: 'Print the credential-exposure recovery checklist' },\n run() {\n console.log('Bazilion credential exposure recovery:')\n console.log('1. Stop the Bazilion daemon and preserve the suspected archive for investigation.')\n console.log(\n '2. Run `bazilion backup inventory`, then `bazilion backup rotate-bootstrap --yes`.',\n )\n console.log('3. Regenerate the Telegram bot token with BotFather and save the replacement.')\n console.log(\n '4. Disconnect/revoke the affected OpenAI session or grant, then authenticate again.',\n )\n console.log('5. Rotate every provider or MCP credential named by the inventory.')\n console.log('6. Create and verify a fresh recipient-encrypted backup after external rotation.')\n console.log(\n 'Local bootstrap rotation does not revoke copied Telegram/OpenAI/provider credentials.',\n )\n },\n})\n\nconst rotateBootstrapCmd = defineCommand({\n meta: {\n name: 'rotate-bootstrap',\n description: 'Offline crash-safe bootstrap rotation; revokes every other local token',\n },\n args: {\n home: { type: 'string', description: 'Override BAZILION_HOME' },\n yes: { type: 'boolean', required: true, description: 'Confirm token revocation and home swap' },\n },\n async run({ args }) {\n if (!args.yes) throw new Error('--yes is required')\n const paths = resolveCliPaths(args.home)\n const targetHome = resolve(paths.home)\n if (targetHome === parse(targetHome).root) {\n throw new Error(`refusing to rotate filesystem root: ${targetHome}`)\n }\n const lock = await acquireHomeRestoreLock(targetHome)\n const parent = dirname(targetHome)\n const staging = mkdtempSync(resolve(parent, '.bazilion-rotate-'))\n const payload = resolve(staging, 'payload')\n let preserveStaging = false\n try {\n for (const serverUrl of configuredLoopbackUrls()) {\n if (await probeServerRunning(serverUrl)) {\n throw new Error(`bazilion server appears to be running at ${serverUrl} — stop it first.`)\n }\n }\n const oldAuth = JSON.parse(readFileSync(paths.authFile, 'utf8')) as {\n token?: unknown\n remote?: unknown\n }\n if (typeof oldAuth.token !== 'string' || !oldAuth.token) {\n throw new Error('auth.json is missing the bootstrap token')\n }\n validateDatabase(resolve(targetHome, 'bazilion.db'), oldAuth.token)\n\n cpSync(targetHome, payload, {\n recursive: true,\n dereference: false,\n verbatimSymlinks: true,\n preserveTimestamps: true,\n })\n const stagedDb = resolve(payload, 'bazilion.db')\n rmSync(stagedDb, { force: true })\n const sourceDb = new DatabaseSync(resolve(targetHome, 'bazilion.db'), { readOnly: true })\n try {\n await sqliteBackup(sourceDb, stagedDb)\n } finally {\n sourceDb.close()\n }\n for (const suffix of ['-wal', '-shm', '-journal'])\n rmSync(`${stagedDb}${suffix}`, { force: true })\n\n const newToken = randomBytes(24).toString('hex')\n const db = new DatabaseSync(stagedDb)\n try {\n db.exec('PRAGMA foreign_keys = ON; BEGIN IMMEDIATE')\n try {\n const rows = db\n .prepare('SELECT key, envelope FROM secrets ORDER BY key')\n .all() as unknown as Array<{\n key: string\n envelope: string\n }>\n const updateSecret = db.prepare(\n 'UPDATE secrets SET envelope = ?, updated_at = ? WHERE key = ?',\n )\n for (const row of rows) {\n let value: string\n try {\n value = decryptSecretEnvelope(row.envelope, oldAuth.token)\n } catch {\n throw new Error(`stored secret is unreadable and rotation was aborted: ${row.key}`)\n }\n updateSecret.run(encryptSecretEnvelope(value, newToken), Date.now(), row.key)\n }\n const oldHash = createHash('sha256').update(oldAuth.token).digest('hex')\n const newHash = createHash('sha256').update(newToken).digest('hex')\n const bootstrap = db\n .prepare(\n \"UPDATE web_tokens SET token_hash = ?, last_used_at = NULL, revoked_at = NULL WHERE token_hash = ? AND kind = 'bootstrap' AND revoked_at IS NULL\",\n )\n .run(newHash, oldHash)\n if (bootstrap.changes !== 1) throw new Error('active bootstrap token row was not unique')\n const revokedAt = Date.now()\n db.prepare(\n \"UPDATE web_tokens SET revoked_at = ? WHERE kind != 'bootstrap' AND revoked_at IS NULL\",\n ).run(revokedAt)\n db.prepare('UPDATE web_sessions SET revoked_at = ? WHERE revoked_at IS NULL').run(\n revokedAt,\n )\n db.exec('COMMIT')\n } catch (error) {\n db.exec('ROLLBACK')\n throw error\n }\n } finally {\n db.close()\n }\n\n const stagedAuth = resolve(payload, 'auth.json')\n const authPartial = resolve(payload, `.auth.json.${randomUUID()}.installing`)\n writeFileSync(authPartial, `${JSON.stringify({ ...oldAuth, token: newToken }, null, 2)}\\n`, {\n mode: 0o600,\n flag: 'wx',\n })\n renameSync(authPartial, stagedAuth)\n chmodSync(stagedAuth, 0o600)\n validateDatabase(stagedDb, newToken)\n const verification = credentialInventory(payload)\n if (!verification.bootstrap) throw new Error('rotated credential inventory is invalid')\n fsyncFile(stagedDb)\n fsyncFile(stagedAuth)\n fsyncDirectory(payload)\n\n try {\n installValidatedPayload(payload, targetHome, staging, lock)\n } catch (error) {\n if (error instanceof RestoreRecoveryRequiredError) preserveStaging = true\n throw error\n }\n console.log('bootstrap token rotated; all non-bootstrap Bazilion tokens were revoked')\n console.log('external Telegram, OpenAI, provider, and MCP credentials were not revoked')\n } finally {\n if (!preserveStaging) rmSync(staging, { recursive: true, force: true })\n lock.release()\n }\n },\n})\n\nexport const backupCommand = defineCommand({\n meta: { name: 'backup', description: 'Encrypted backup, restore, and credential recovery' },\n subCommands: {\n create: createCmd,\n restore: restoreCmd,\n inventory: inventoryCmd,\n 'recovery-guide': recoveryGuideCmd,\n 'rotate-bootstrap': rotateBootstrapCmd,\n },\n // `bazilion backup` with no positional falls through to citty's subcommand\n // prompt (\"No command specified\"). The previous default (auto-download to\n // cwd) double-fired when a subcommand was used because citty runs parent's\n // `run` after the subcommand completes — explicit `create` / `restore` is\n // the supported form now.\n})\n","import { createHash } from 'node:crypto'\nimport type { DatabaseSync } from 'node:sqlite'\n\nconst CANONICAL_MIGRATION = '0001_init'\nconst CANONICAL_SCHEMA_HASH = '4bde209eb0bf9851bf1f01fc96263f165a1799c81e720ddea463169a0d6c0d51'\n\n// Explicit objects created by migrate.ts + 0001_init.sql. SQLite's implicit\n// auto-indexes have `sql = NULL` and are deliberately represented through the\n// table SQL that creates their UNIQUE/PRIMARY KEY constraints.\nconst CANONICAL_OBJECTS = [\n ['index', 'agent_triggers_agent'],\n ['index', 'agent_triggers_enabled'],\n ['index', 'agent_loop_break_events_agent_time'],\n ['index', 'agent_loop_break_events_team_time'],\n ['index', 'agent_lesson_proposals_agent_status_time'],\n ['index', 'agent_lesson_proposals_review'],\n ['index', 'agent_reviews_agent_time'],\n ['index', 'agent_reviews_claimable'],\n ['index', 'agent_reviews_one_open_per_agent'],\n ['index', 'communication_approval_events_attempt'],\n ['index', 'communication_approvals_queue'],\n ['index', 'communication_approvals_teams'],\n ['index', 'idx_agents_telegram_topic_id'],\n ['index', 'idx_provider_models_provider'],\n ['index', 'messages_policy_delivery_queue'],\n ['index', 'messages_causal_chain'],\n ['index', 'messages_to_unread'],\n ['index', 'team_policy_baseline_owner'],\n ['index', 'team_policy_blocks_team_time'],\n ['index', 'team_template_active_position'],\n ['index', 'trigger_dispatches_claimable'],\n ['index', 'trigger_dispatches_trigger_time'],\n ['index', 'web_tokens_active'],\n ['index', 'web_sessions_active'],\n ['index', 'web_sessions_device'],\n ['table', 'agent_skills'],\n ['table', 'agent_loop_break_events'],\n ['table', 'agent_lesson_proposals'],\n ['table', 'agent_reviews'],\n ['table', 'agent_triggers'],\n ['table', 'agents'],\n ['table', 'attention_acknowledgements'],\n ['table', 'communication_approval_events'],\n ['table', 'communication_approval_message_grants'],\n ['table', 'communication_approvals'],\n ['table', 'config'],\n ['table', 'mcp_servers'],\n ['table', 'messages'],\n ['table', 'profile_communication_defaults'],\n ['table', 'profile_default_skills'],\n ['table', 'profiles'],\n ['table', 'provider_models'],\n ['table', 'provider_state'],\n ['table', 'schema_migrations'],\n ['table', 'secrets'],\n ['table', 'skill_meta'],\n ['table', 'source_slot_bindings'],\n ['table', 'team_agent_state'],\n ['table', 'team_policies'],\n ['table', 'team_policy_block_events'],\n ['table', 'team_policy_edges'],\n ['table', 'team_template_edges'],\n ['table', 'team_template_revision_edges'],\n ['table', 'team_template_revision_slots'],\n ['table', 'team_template_revisions'],\n ['table', 'team_template_slots'],\n ['table', 'team_templates'],\n ['table', 'teams'],\n ['table', 'telegram_allowed_users'],\n ['table', 'telegram_pairing_challenge'],\n ['table', 'template_instantiations'],\n ['table', 'trigger_dispatches'],\n ['table', 'web_tokens'],\n ['table', 'web_sessions'],\n ['trigger', 'create_team_policy'],\n ['trigger', 'prevent_detached_team_policy_delete'],\n ['trigger', 'validate_source_binding_insert'],\n ['trigger', 'validate_team_agent_state_insert'],\n ['trigger', 'validate_team_policy_baseline_update'],\n ['trigger', 'validate_team_policy_edge_insert'],\n ['trigger', 'validate_team_template_edge_insert'],\n] as const\n\ninterface SchemaRow {\n type: string\n name: string\n tbl_name: string\n sql: string\n}\n\nfunction normalizeSql(sql: string): string {\n return sql.replace(/\\s+/g, ' ').trim()\n}\n\n/** Prove the restored DB implements the complete current clean-install schema. */\nexport function assertCanonicalBackupSchema(db: DatabaseSync): void {\n const migrations = db\n .prepare('SELECT version FROM schema_migrations ORDER BY version')\n .all() as Array<{ version: string }>\n if (migrations.length !== 1 || migrations[0]?.version !== CANONICAL_MIGRATION) {\n throw new Error(\n `schema_migrations must contain exactly ${CANONICAL_MIGRATION}; found ` +\n (migrations.map((row) => row.version).join(', ') || 'none'),\n )\n }\n\n const rows = db\n .prepare(\n `SELECT type, name, tbl_name, sql\n FROM sqlite_schema\n WHERE sql IS NOT NULL AND name NOT LIKE 'sqlite_%'`,\n )\n .all() as unknown as SchemaRow[]\n const byKey = new Map(rows.map((row) => [`${row.type}\\0${row.name}`, row]))\n const canonicalKeys = new Set(CANONICAL_OBJECTS.map(([type, name]) => `${type}\\0${name}`))\n for (const row of rows) {\n if (!canonicalKeys.has(`${row.type}\\0${row.name}`)) {\n throw new Error(`unexpected schema ${row.type} is not canonical: ${row.name}`)\n }\n }\n const canonicalRows: SchemaRow[] = []\n\n for (const [type, name] of CANONICAL_OBJECTS) {\n const row = byKey.get(`${type}\\0${name}`)\n if (!row) throw new Error(`required canonical schema ${type} is missing: ${name}`)\n canonicalRows.push(row)\n }\n\n const payload = canonicalRows\n .map((row) => [row.type, row.name, row.tbl_name, normalizeSql(row.sql)].join('\\0'))\n .join('\\n')\n const actualHash = createHash('sha256').update(payload).digest('hex')\n if (actualHash !== CANONICAL_SCHEMA_HASH) {\n throw new Error(\n 'canonical schema fingerprint does not match this Bazilion release; ' +\n 'restore a backup created from the current clean-install schema',\n )\n }\n}\n","import { createHash, randomUUID } from 'node:crypto'\nimport {\n chmodSync,\n closeSync,\n fstatSync,\n fsyncSync,\n ftruncateSync,\n futimesSync,\n lstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n type Stats,\n writeSync,\n} from 'node:fs'\nimport { basename, dirname, join, resolve } from 'node:path'\n\nexport const DAEMON_LIVENESS_FILENAME = 'daemon-runtime.json'\nconst STALE_AFTER_MS = 60_000\nconst PROBE_TIMEOUT_MS = 750\n\ninterface DaemonLivenessRecord {\n version: 1\n instanceId: string\n pid: number\n owner: 'daemon' | 'restore'\n state:\n | 'starting'\n | 'listening'\n | 'restoring'\n | 'uninstalling'\n | 'swapping'\n | 'installed'\n | 'recovery-required'\n host?: string\n port?: number\n startedAt: number\n recoveryPath?: string\n hadPrevious?: boolean\n}\n\nexport interface HomeRestoreLock {\n readonly path: string\n markSwapping(recoveryPath: string, hadPrevious: boolean): void\n markInstalled(): void\n markRecoveryRequired(recoveryPath: string, hadPrevious: boolean): void\n markUninstallComplete(): void\n release(): void\n}\n\nfunction canonicalHomeIdentity(home: string): string {\n const absolute = resolve(home)\n try {\n return realpathSync.native(absolute)\n } catch (error) {\n if (errorCode(error) !== 'ENOENT') throw error\n const parent = dirname(absolute)\n if (parent === absolute) throw error\n return join(canonicalHomeIdentity(parent), basename(absolute))\n }\n}\n\n/** Stable sibling: replacing the home directory during restore cannot drop it. */\nexport function daemonLivenessPath(home: string): string {\n const canonicalHome = canonicalHomeIdentity(home)\n const identity = createHash('sha256').update(canonicalHome).digest('hex').slice(0, 24)\n return join(dirname(canonicalHome), `.bazilion-runtime-${identity}.json`)\n}\n\ninterface ExistingRecord {\n raw: string\n stat: Stats\n record: DaemonLivenessRecord | null\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return error instanceof Error && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined\n}\n\nfunction parseRecord(raw: string): DaemonLivenessRecord | null {\n try {\n const value = JSON.parse(raw) as Partial<DaemonLivenessRecord>\n if (\n value.version !== 1 ||\n typeof value.instanceId !== 'string' ||\n !value.instanceId ||\n !Number.isSafeInteger(value.pid) ||\n (value.pid ?? 0) <= 0 ||\n !['daemon', 'restore'].includes(value.owner ?? '') ||\n ![\n 'starting',\n 'listening',\n 'restoring',\n 'uninstalling',\n 'swapping',\n 'installed',\n 'recovery-required',\n ].includes(value.state ?? '') ||\n !Number.isFinite(value.startedAt)\n ) {\n return null\n }\n if (\n (value.owner === 'daemon' && !['starting', 'listening'].includes(value.state ?? '')) ||\n (value.owner === 'restore' &&\n !['restoring', 'uninstalling', 'swapping', 'installed', 'recovery-required'].includes(\n value.state ?? '',\n ))\n ) {\n return null\n }\n if (\n value.owner === 'restore' &&\n ['swapping', 'recovery-required'].includes(value.state ?? '') &&\n (typeof value.recoveryPath !== 'string' ||\n !value.recoveryPath ||\n typeof value.hadPrevious !== 'boolean')\n ) {\n return null\n }\n if (\n value.owner === 'daemon' &&\n value.state === 'listening' &&\n (typeof value.host !== 'string' ||\n !value.host ||\n !Number.isSafeInteger(value.port) ||\n (value.port ?? 0) < 1 ||\n (value.port ?? 0) > 65_535)\n ) {\n return null\n }\n return value as DaemonLivenessRecord\n } catch {\n return null\n }\n}\n\nfunction readRecord(path: string): ExistingRecord | null {\n try {\n const stat = lstatSync(path)\n const raw = stat.isFile() ? readFileSync(path, 'utf8') : ''\n return { raw, stat, record: stat.isFile() ? parseRecord(raw) : null }\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return null\n throw error\n }\n}\n\nfunction pidIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return errorCode(error) !== 'ESRCH'\n }\n}\n\nfunction endpointFor(record: DaemonLivenessRecord): string | null {\n if (record.state !== 'listening' || !record.host || !record.port) return null\n const normalized = record.host.toLowerCase()\n if (normalized === '0.0.0.0') return `http://127.0.0.1:${record.port}`\n if (normalized === '::' || normalized === '0:0:0:0:0:0:0:0') {\n return `http://[::1]:${record.port}`\n }\n if (normalized === 'localhost' || normalized === '127.0.0.1') {\n return `http://${normalized}:${record.port}`\n }\n if (normalized === '::1' || normalized === '[::1]') {\n return `http://[::1]:${record.port}`\n }\n // The record is local data, but avoid turning a restore into an arbitrary\n // network request when a daemon binds a specific LAN address. A fresh lease\n // and local PID are sufficient to block in that case.\n return null\n}\n\nasync function endpointHasOwner(endpoint: string, instanceId: string): Promise<boolean> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS)\n try {\n const response = await fetch(new URL('/api/health', endpoint), {\n signal: controller.signal,\n })\n return response.headers.get('x-bazilion-daemon-instance') === instanceId\n } catch {\n return false\n } finally {\n clearTimeout(timer)\n }\n}\n\nfunction sameFile(left: Stats, right: Stats): boolean {\n return left.dev === right.dev && left.ino === right.ino\n}\n\nfunction writeRecord(fd: number, record: DaemonLivenessRecord): void {\n const body = `${JSON.stringify(record, null, 2)}\\n`\n ftruncateSync(fd, 0)\n writeSync(fd, body, 0, 'utf8')\n fsyncSync(fd)\n}\n\nfunction fsyncParentDirectory(path: string): void {\n let directoryFd: number | null = null\n try {\n directoryFd = openSync(dirname(path), 'r')\n fsyncSync(directoryFd)\n } catch (error) {\n if (process.platform !== 'win32') throw error\n } finally {\n if (directoryFd !== null) closeSync(directoryFd)\n }\n}\n\nfunction reclaimRecord(path: string, existing: ExistingRecord): string | null {\n const identity = createHash('sha256')\n .update(existing.record?.instanceId ?? existing.raw)\n .update(`\\0${existing.stat.dev}\\0${existing.stat.ino}`)\n .digest('hex')\n .slice(0, 24)\n const claim = `${path}.reclaim-${identity}`\n try {\n mkdirSync(claim, { mode: 0o700 })\n } catch (error) {\n if (errorCode(error) !== 'EEXIST') throw error\n return null\n }\n\n const current = readRecord(path)\n if (!current || !sameFile(current.stat, existing.stat) || current.raw !== existing.raw) {\n return null\n }\n try {\n renameSync(path, join(claim, 'stale-record.json'))\n return claim\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return null\n throw error\n }\n}\n\n/**\n * Acquire the same per-home primitive the daemon takes before opening SQLite.\n * The sibling record remains in place across a target-home rename, closing\n * the check-then-swap race for the entire validation/install/rollback window.\n */\nexport async function acquireHomeRestoreLock(\n home: string,\n operation: 'restoring' | 'uninstalling' = 'restoring',\n): Promise<HomeRestoreLock> {\n const targetHome = resolve(home)\n mkdirSync(dirname(targetHome), { recursive: true })\n const path = daemonLivenessPath(targetHome)\n mkdirSync(dirname(path), { recursive: true })\n const instanceId = randomUUID()\n let fd: number | null = null\n let reclaimClaim: string | null = null\n\n for (let attempt = 0; attempt < 8 && fd === null; attempt++) {\n try {\n fd = openSync(path, 'wx', 0o600)\n break\n } catch (error) {\n if (errorCode(error) !== 'EEXIST') throw error\n }\n\n const existing = readRecord(path)\n if (!existing) continue\n\n const endpoint = existing.record ? endpointFor(existing.record) : null\n if (\n endpoint &&\n existing.record &&\n (await endpointHasOwner(endpoint, existing.record.instanceId))\n ) {\n throw new Error(\n `bazilion daemon is running at ${endpoint} for ${targetHome} — stop it before ${operation}`,\n )\n }\n\n if (!existing.record) {\n throw new Error(\n `the daemon ownership record for ${targetHome} is invalid; verify no daemon is running ` +\n 'before removing it manually',\n )\n }\n const livePid = pidIsAlive(existing.record.pid)\n if (existing.record.owner === 'restore' && existing.record.state === 'uninstalling') {\n if (livePid) {\n throw new Error(\n `bazilion uninstall process ${existing.record.pid} owns ${targetHome} — ` +\n `wait for it to finish before ${operation}`,\n )\n }\n if (operation !== 'uninstalling') {\n throw new Error(\n `a previous Bazilion uninstall was interrupted for ${targetHome}. ` +\n 'Re-run the same `bazilion uninstall` command (including its `--all` choice) ' +\n 'with the same BAZILION_HOME (or --home) ' +\n `to finish it before ${operation}.`,\n )\n }\n console.warn(`resuming interrupted Bazilion uninstall for ${targetHome}`)\n }\n if (\n existing.record.owner === 'restore' &&\n ['swapping', 'recovery-required'].includes(existing.record.state)\n ) {\n if (livePid) {\n throw new Error(\n `bazilion restore process ${existing.record.pid} is ${existing.record.state} ` +\n `${targetHome} — wait for it to finish`,\n )\n }\n const phase = existing.record.state.replace('-', ' ')\n throw new Error(\n `Bazilion restore ${phase} for ${targetHome}; recovery data is at ` +\n `${existing.record.recoveryPath}. Recover the previous home, then remove ${path} manually.`,\n )\n }\n if (livePid) {\n const ageMs = Math.max(0, Date.now() - existing.stat.mtimeMs)\n const staleDetail = ageMs > STALE_AFTER_MS ? ' (its heartbeat is stale)' : ''\n const owner = existing.record.owner === 'daemon' ? 'daemon' : 'restore'\n throw new Error(\n `bazilion ${owner} process ${existing.record.pid} owns ${targetHome}${staleDetail} — ` +\n `stop it before ${operation}`,\n )\n }\n\n const claim = reclaimRecord(path, existing)\n if (claim) {\n reclaimClaim = claim\n console.warn(`removed stale Bazilion daemon ownership record for ${targetHome}`)\n }\n }\n\n if (fd === null) {\n throw new Error(\n `could not safely acquire exclusive ownership for ${operation} ${targetHome}; try again`,\n )\n }\n\n const ownedStat = fstatSync(fd)\n const record: DaemonLivenessRecord = {\n version: 1,\n instanceId,\n pid: process.pid,\n owner: 'restore',\n state: operation,\n startedAt: Date.now(),\n }\n try {\n writeRecord(fd, record)\n fsyncParentDirectory(path)\n if (reclaimClaim) rmSync(reclaimClaim, { recursive: true, force: true })\n try {\n chmodSync(path, 0o600)\n } catch {\n // Windows: chmod may be a no-op.\n }\n } catch (error) {\n closeSync(fd)\n fd = null\n try {\n if (sameFile(lstatSync(path), ownedStat)) rmSync(path, { force: true })\n } catch {\n // Best effort: a dead-PID/invalid record still fails closed.\n }\n throw error\n }\n let released = false\n let uninstallComplete = false\n\n const stillOwnsPath = (): boolean => {\n try {\n return sameFile(lstatSync(path), ownedStat)\n } catch {\n return false\n }\n }\n const heartbeat = setInterval(() => {\n if (released) return\n if (!stillOwnsPath()) {\n console.error(`${operation} ownership was lost; exiting to protect the Bazilion database`)\n process.exit(1)\n }\n try {\n const now = new Date()\n futimesSync(fd as number, now, now)\n } catch (error) {\n console.error(\n `${operation} ownership heartbeat failed:`,\n error instanceof Error ? error.message : error,\n )\n process.exit(1)\n }\n }, 2_000)\n heartbeat.unref()\n\n return {\n path,\n markSwapping(recoveryPath, hadPrevious) {\n if (released || !stillOwnsPath()) throw new Error('restore ownership was lost')\n record.state = 'swapping'\n record.recoveryPath = resolve(recoveryPath)\n record.hadPrevious = hadPrevious\n writeRecord(fd as number, record)\n fsyncParentDirectory(path)\n },\n markInstalled() {\n if (released || !stillOwnsPath()) throw new Error('restore ownership was lost')\n record.state = 'installed'\n delete record.recoveryPath\n delete record.hadPrevious\n writeRecord(fd as number, record)\n },\n markRecoveryRequired(recoveryPath, hadPrevious) {\n if (released || !stillOwnsPath()) throw new Error('restore ownership was lost')\n record.state = 'recovery-required'\n record.recoveryPath = resolve(recoveryPath)\n record.hadPrevious = hadPrevious\n writeRecord(fd as number, record)\n },\n markUninstallComplete() {\n if (released || !stillOwnsPath()) throw new Error('uninstall ownership was lost')\n if (record.state !== 'uninstalling') {\n throw new Error('cannot complete uninstall from a non-uninstall ownership state')\n }\n uninstallComplete = true\n },\n release() {\n if (released) return\n released = true\n clearInterval(heartbeat)\n const ownsPath = stillOwnsPath()\n const retainForRecovery =\n ['swapping', 'recovery-required'].includes(record.state) ||\n (record.state === 'uninstalling' && !uninstallComplete)\n closeSync(fd as number)\n fd = null\n if (ownsPath && !retainForRecovery) rmSync(path, { force: true })\n },\n }\n}\n","import { defineCommand } from 'citty'\n\ninterface CommandNode {\n subCommands?: Record<string, CommandNode | Promise<CommandNode>>\n args?: Record<string, { type?: string; alias?: string | string[] }>\n}\n\ninterface Flatten {\n /** full path e.g. [\"agent\", \"chat\"]; empty for the top-level root */\n path: string[]\n /** immediate subcommand names available at this path */\n subs: string[]\n /** flag tokens e.g. [\"--profile\", \"--name\", \"--long\", \"-l\"] */\n flags: string[]\n}\n\nasync function walk(cmd: CommandNode, path: string[], out: Flatten[]): Promise<void> {\n const subsRaw = cmd.subCommands ?? {}\n const subNames = Object.keys(subsRaw)\n const flags = flagsOf(cmd.args ?? {})\n out.push({ path, subs: subNames, flags })\n for (const name of subNames) {\n const v = subsRaw[name]\n const sub = (await Promise.resolve(v)) as CommandNode\n await walk(sub, [...path, name], out)\n }\n}\n\nfunction flagsOf(args: Record<string, { type?: string; alias?: string | string[] }>): string[] {\n const out: string[] = []\n for (const [name, def] of Object.entries(args)) {\n // Positionals don't get completed as flags.\n if (def.type === 'positional') continue\n out.push(`--${name}`)\n const aliases = Array.isArray(def.alias) ? def.alias : def.alias ? [def.alias] : []\n for (const a of aliases) out.push(a.length === 1 ? `-${a}` : `--${a}`)\n }\n return out\n}\n\nfunction bashScript(flat: Flatten[]): string {\n const cases = flat\n .map((f) => {\n const key = f.path.length === 0 ? '\"\"' : JSON.stringify(f.path.join(' '))\n const words = [...f.subs, ...f.flags].join(' ')\n return ` ${key})\\n COMPREPLY=($(compgen -W ${JSON.stringify(words)} -- \"$cur\"))\\n ;;`\n })\n .join('\\n')\n return `# bazilion bash completion. Install with:\n# source <(bazilion completion bash)\n# or append to ~/.bashrc / ~/.bash_profile.\n_bazilion_completion() {\n local cur prev cword\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n cword=$COMP_CWORD\n # Build the current subcommand path by walking words[1..cword-1], skipping\n # flags and their values. We don't try to parse flag arity — treating every\n # flag as standalone is a good-enough approximation for completion.\n local cmd=\"\"\n local i\n for ((i=1; i<cword; i++)); do\n local w=\"\\${COMP_WORDS[i]}\"\n [[ \"$w\" == -* ]] && continue\n cmd+=\"\\${cmd:+ }$w\"\n done\n case \"$cmd\" in\n${cases}\n *)\n COMPREPLY=()\n ;;\n esac\n}\ncomplete -F _bazilion_completion bazilion\n`\n}\n\nfunction zshScript(flat: Flatten[]): string {\n // zsh bundles a bashcompinit shim; reusing the bash script sidesteps the\n // cost of a native _arguments/_describe implementation while still giving\n // users a working completion. Ships with a tiny preamble so zsh loads the\n // bash compat helpers first.\n const bash = bashScript(flat)\n return `# bazilion zsh completion. Install with:\n# source <(bazilion completion zsh)\n# If you don't already have bashcompinit loaded, this does it for you.\nautoload -U +X compinit && compinit\nautoload -U +X bashcompinit && bashcompinit\n${bash}`\n}\n\nfunction fishScript(flat: Flatten[]): string {\n const lines: string[] = [\n '# bazilion fish completion. Install with:',\n '# bazilion completion fish | source',\n '# or write it to ~/.config/fish/completions/bazilion.fish',\n '',\n 'complete -c bazilion -f',\n ]\n for (const f of flat) {\n if (f.path.length === 0) {\n for (const s of f.subs) lines.push(`complete -c bazilion -n '__fish_use_subcommand' -a ${s}`)\n for (const fl of f.flags) {\n const long = fl.startsWith('--') ? fl.slice(2) : ''\n const short = !fl.startsWith('--') ? fl.slice(1) : ''\n const parts: string[] = [\"complete -c bazilion -n '__fish_use_subcommand'\"]\n if (short) parts.push(`-s ${short}`)\n if (long) parts.push(`-l ${long}`)\n lines.push(parts.join(' '))\n }\n } else {\n // Guard this case on the joined path being the last N tokens in\n // COMP_CWORDS — fish's __fish_seen_subcommand_from handles each token\n // independently, so we require every path segment.\n const guard = f.path.map((p) => `__fish_seen_subcommand_from ${p}`).join('; and ')\n for (const s of f.subs) {\n lines.push(`complete -c bazilion -n '${guard}' -a ${s}`)\n }\n for (const fl of f.flags) {\n const long = fl.startsWith('--') ? fl.slice(2) : ''\n const short = !fl.startsWith('--') ? fl.slice(1) : ''\n const parts: string[] = [`complete -c bazilion -n '${guard}'`]\n if (short) parts.push(`-s ${short}`)\n if (long) parts.push(`-l ${long}`)\n lines.push(parts.join(' '))\n }\n }\n }\n return `${lines.join('\\n')}\\n`\n}\n\nexport function completionCommand(main: CommandNode) {\n return defineCommand({\n meta: {\n name: 'completion',\n description: 'Print a shell completion script (bash, zsh, or fish)',\n },\n args: {\n shell: {\n type: 'positional',\n required: true,\n description: 'bash | zsh | fish',\n },\n },\n async run({ args }) {\n const flat: Flatten[] = []\n await walk(main, [], flat)\n const shell = String(args.shell).toLowerCase()\n if (shell === 'bash') console.log(bashScript(flat))\n else if (shell === 'zsh') console.log(zshScript(flat))\n else if (shell === 'fish') console.log(fishScript(flat))\n else throw new Error(`unsupported shell: ${args.shell} (want bash | zsh | fish)`)\n },\n })\n}\n","import type {\n ProviderConfigResponse,\n ServiceCard,\n ServiceConfigResponse,\n ServiceFieldState,\n SetFieldRequest,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction displayValue(f: ServiceFieldState): string {\n if (!f.set) return '(unset)'\n if (f.kind === 'secret') return f.preview ?? '(set)'\n return f.value ?? '(set)'\n}\n\nconst listCmd = defineCommand({\n meta: {\n name: 'list',\n description: 'List every configurable field (credentials + URLs) across all services',\n },\n async run() {\n const client = createClient()\n // Both endpoints return ServiceCard-shaped entries — merge and print.\n const { providers } = await client.get<ProviderConfigResponse>('/api/config/providers')\n const { services } = await client.get<ServiceConfigResponse>('/api/config/services')\n const all: ServiceCard[] = [...providers, ...services]\n\n const rows: string[][] = []\n for (const svc of all) {\n for (const f of svc.fields) {\n rows.push([svc.id, f.envVar, f.kind, displayValue(f)])\n }\n }\n if (rows.length === 0) {\n console.log('(no fields registered)')\n return\n }\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst setCmd = defineCommand({\n meta: {\n name: 'set',\n description: 'Set a configurable field (auto-routes to secrets or plaintext store)',\n },\n args: {\n envVar: {\n type: 'positional',\n required: true,\n description: 'Env var name (e.g. ANTHROPIC_API_KEY, LMSTUDIO_URL)',\n },\n value: {\n type: 'positional',\n required: true,\n description: 'New value (empty string clears the field)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: SetFieldRequest = { value: args.value }\n const state = await client.put<ServiceFieldState>(\n `/api/config/fields/${encodeURIComponent(args.envVar)}`,\n body,\n )\n console.log(`${state.envVar} (${state.kind}): ${displayValue(state)}`)\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Remove a configurable field value' },\n args: {\n envVar: { type: 'positional', required: true, description: 'Env var name to clear' },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/config/fields/${encodeURIComponent(args.envVar)}`)\n console.log(`removed ${args.envVar}`)\n },\n})\n\nexport const configCommand = defineCommand({\n meta: {\n name: 'config',\n description:\n 'Manage service configuration — credentials (encrypted) and URLs/IDs (plaintext), unified under one CLI',\n },\n subCommands: {\n list: listCmd,\n set: setCmd,\n rm: rmCmd,\n },\n})\n","import { type ChildProcess, spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { connect } from 'node:net'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { resolveCliPaths } from '../paths.ts'\n\nconst bundledDaemonEntry = join(import.meta.dirname, 'daemon.js')\nconst sourceDaemonEntry = join(import.meta.dirname, '..', '..', '..', 'daemon', 'src', 'index.ts')\nconst daemonEntry = existsSync(bundledDaemonEntry) ? bundledDaemonEntry : sourceDaemonEntry\n\nconst bundledWebServerEntry = join(import.meta.dirname, 'web-server.js')\nconst sourceWebServerEntry = join(import.meta.dirname, '..', 'web-server.ts')\nconst webServerEntry = existsSync(bundledWebServerEntry)\n ? bundledWebServerEntry\n : sourceWebServerEntry\n\nconst bundledWebDist = join(import.meta.dirname, 'web')\nconst sourceWebDist = join(import.meta.dirname, '..', '..', '..', 'web', 'dist')\nconst webDist = existsSync(bundledWebDist) ? bundledWebDist : sourceWebDist\n\nfunction nodeArgs(entry: string): string[] {\n return entry.endsWith('.ts') ? ['--import', 'tsx/esm', entry] : [entry]\n}\n\nasync function responds(url: string): Promise<boolean> {\n try {\n const res = await fetch(url)\n return res.status >= 200 && res.status < 500\n } catch {\n return false\n }\n}\n\nfunction probeHost(host: string): string {\n if (host === '0.0.0.0') return '127.0.0.1'\n if (host === '::') return '::1'\n return host\n}\n\nfunction isTcpPortOpen(host: string, port: string): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = connect({ host: probeHost(host), port: Number(port) })\n const done = (open: boolean): void => {\n socket.removeAllListeners()\n socket.destroy()\n resolve(open)\n }\n socket.setTimeout(600)\n socket.once('connect', () => done(true))\n socket.once('timeout', () => done(false))\n socket.once('error', () => done(false))\n })\n}\n\nasync function bazilionDaemonRunning(url: string, port: string): Promise<boolean> {\n try {\n const res = await fetch(`${url}/api/health`)\n if (res.ok) {\n const body = (await res.json().catch(() => null)) as { ok?: unknown } | null\n if (body?.ok === true) return true\n }\n } catch {\n return false\n }\n\n throw new Error(\n `port ${port} is already serving HTTP, but it is not a healthy bazilion daemon. Re-run with --daemon-port <free-port>.`,\n )\n}\n\nasync function bazilionWebRunning(url: string, port: string): Promise<boolean> {\n try {\n const res = await fetch(url)\n if (res.status >= 200 && res.status < 500) {\n const html = await res.text()\n if (html.includes('<title>bazilion</title>') || html.includes('>bazilion<')) {\n return true\n }\n }\n } catch {\n return false\n }\n\n throw new Error(\n `port ${port} is already serving HTTP, but it is not the bazilion web UI. Re-run with --port <free-port>.`,\n )\n}\n\nasync function waitFor(url: string, label: string, timeoutMs = 20_000): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (await responds(url)) return\n await new Promise((r) => setTimeout(r, 150))\n }\n throw new Error(`timed out waiting for ${label} at ${url}`)\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === 'darwin'\n ? 'open'\n : platform === 'win32'\n ? 'cmd'\n : process.env.BROWSER || 'xdg-open'\n const args = platform === 'win32' ? ['/c', 'start', '', url] : [url]\n const proc = spawn(cmd, args, { detached: true, stdio: 'ignore' })\n proc.unref()\n}\n\nfunction spawnProcess(label: string, entry: string, env: NodeJS.ProcessEnv): ChildProcess {\n if (!existsSync(entry)) {\n throw new Error(`${label} entry not found at ${entry}`)\n }\n return spawn(process.execPath, nodeArgs(entry), {\n env,\n stdio: 'inherit',\n })\n}\n\nexport const dashboardCommand = defineCommand({\n meta: {\n name: 'dashboard',\n description: 'Start the bazilion daemon and bundled web UI',\n },\n args: {\n port: { type: 'string', description: 'Web UI port (default 4322)' },\n host: {\n type: 'string',\n description: 'Web UI host (default 127.0.0.1). Use loopback unless you know why not.',\n },\n 'daemon-port': { type: 'string', description: 'Daemon port (default 4321)' },\n 'daemon-host': {\n type: 'string',\n description: 'Daemon host (default 127.0.0.1). Use loopback unless you know why not.',\n },\n open: {\n type: 'boolean',\n description: 'Open the dashboard in your browser (default true)',\n default: true,\n },\n },\n async run({ args }) {\n const webHost = args.host ?? '127.0.0.1'\n const webPort = args.port ?? '4322'\n const daemonHost = args['daemon-host'] ?? '127.0.0.1'\n const daemonPort = args['daemon-port'] ?? '4321'\n const daemonUrl = `http://${daemonHost}:${daemonPort}`\n const webUrl = `http://${webHost}:${webPort}`\n const authFile = resolveCliPaths().authFile\n\n if (webHost !== '127.0.0.1' && webHost !== 'localhost' && webHost !== '::1') {\n console.error('')\n console.error(\n `warning: binding web UI to ${webHost} - the dashboard may be reachable beyond loopback.`,\n )\n console.error(' keep it behind a trusted network or a TLS proxy.')\n console.error('')\n }\n\n const children: ChildProcess[] = []\n let signalled = false\n const terminateChildren = (): void => {\n signalled = true\n for (const child of children) {\n try {\n child.kill('SIGTERM')\n } catch {}\n }\n }\n\n try {\n const daemonRunning = await bazilionDaemonRunning(daemonUrl, daemonPort)\n if (daemonRunning) {\n console.log(`using existing bazilion daemon at ${daemonUrl}`)\n } else {\n if (await isTcpPortOpen(daemonHost, daemonPort)) {\n throw new Error(\n `daemon port ${daemonPort} is already in use. Re-run with --daemon-port <free-port>.`,\n )\n }\n console.log(`starting bazilion daemon at ${daemonUrl}`)\n const daemon = spawnProcess('daemon', daemonEntry, {\n ...process.env,\n HOST: daemonHost,\n PORT: daemonPort,\n })\n children.push(daemon)\n await waitFor(`${daemonUrl}/api/health`, 'bazilion daemon')\n }\n\n const webRunning = await bazilionWebRunning(webUrl, webPort)\n if (webRunning) {\n console.log(`using existing bazilion web UI at ${webUrl}`)\n } else {\n if (await isTcpPortOpen(webHost, webPort)) {\n throw new Error(\n `web UI port ${webPort} is already in use. Re-run with --port <free-port>.`,\n )\n }\n if (!existsSync(join(webDist, 'server', 'server.js'))) {\n throw new Error(\n `bazilion web UI bundle not found at ${webDist}. Run \"pnpm --filter @bazilion/web build\" from the repository root of a source checkout, or reinstall the published package.`,\n )\n }\n console.log(`starting bazilion web UI at ${webUrl}`)\n const web = spawnProcess('web UI', webServerEntry, {\n ...process.env,\n WEB_HOST: webHost,\n WEB_PORT: webPort,\n BAZILION_DAEMON: daemonUrl,\n BAZILION_WEB_DIST: webDist,\n })\n children.push(web)\n await waitFor(webUrl, 'bazilion web UI')\n }\n\n console.log('')\n console.log(`dashboard: ${webUrl}`)\n console.log(`token: ${authFile}`)\n if (args.open) openBrowser(webUrl)\n } catch (err) {\n terminateChildren()\n throw err\n }\n\n if (children.length === 0) return\n\n process.on('SIGINT', terminateChildren)\n process.on('SIGTERM', terminateChildren)\n\n await new Promise<void>((resolve) => {\n let remaining = children.length\n for (const child of children) {\n child.on('close', (code) => {\n remaining--\n if (!signalled && code && code !== 0) process.exitCode = code\n if (remaining === 0) resolve()\n })\n }\n })\n\n if (signalled) process.exitCode = 0\n },\n})\n","import type { HealthReport } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nexport const doctorCommand = defineCommand({\n meta: { name: 'doctor', description: 'Diagnose your bazilion install' },\n async run() {\n const client = createClient()\n const r = await client.get<HealthReport>('/api/health/details')\n\n function check(label: string, condition: boolean, hint?: string): void {\n const mark = condition ? '✓' : '✗'\n const tail = !condition && hint ? ` — ${hint}` : ''\n console.log(` ${mark} ${label}${tail}`)\n }\n\n console.log(`bazilion home: ${r.home}`)\n console.log()\n console.log('paths')\n check('home dir exists', r.paths.home)\n check('database exists', r.paths.db, 'run: bazilion serve (auto-bootstraps on first run)')\n check('auth.json exists', r.paths.auth, 'run: bazilion serve (auto-bootstraps on first run)')\n check('profiles dir exists', r.paths.profiles)\n check('agents dir exists', r.paths.agents)\n check('skills dir exists', r.paths.skills)\n\n if (r.database) {\n console.log()\n console.log('database')\n if (r.database.ok) {\n console.log(` ${r.database.profiles} profile(s)`)\n console.log(\n ` ${r.database.activeAgents} active agent(s) (${r.database.totalAgents} total)`,\n )\n console.log(` ${r.database.teams} team(s)`)\n } else {\n check('open database', false, r.database.error)\n }\n }\n\n console.log()\n console.log('skills library')\n console.log(` ${r.skills.installed} skill(s) installed`)\n if (r.skills.parseErrors > 0) {\n check('all skills parse', false, `${r.skills.parseErrors} skill(s) have errors`)\n }\n\n console.log()\n console.log('providers (enable one and save at least one model for chat)')\n if (r.providers.configured.length === 0) {\n console.log(' - no cloud providers configured')\n console.log(' (set e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY)')\n } else {\n for (const name of r.providers.configured) {\n console.log(` ✓ ${name}`)\n }\n }\n console.log(\n ` ✓ lmstudio: ${\n r.providers.lmstudio.customEndpointConfigured\n ? 'custom endpoint configured'\n : 'default local endpoint'\n }${r.providers.lmstudio.keyConfigured ? ' (API key configured)' : ''}`,\n )\n console.log(\n ` ✓ ollama: ${\n r.providers.ollama.customEndpointConfigured\n ? 'custom endpoint configured'\n : 'default local endpoint'\n }`,\n )\n\n console.log()\n console.log('web search (at least one needed for web_search tool)')\n if (r.webSearch.braveConfigured) {\n console.log(' ✓ Brave Search configured')\n } else {\n console.log(' - Brave Search (set BRAVE_API_KEY — free at https://brave.com/search/api/)')\n }\n if (r.webSearch.searxngConfigured) {\n console.log(' ✓ SearXNG configured')\n } else {\n console.log(' - SearXNG (set SEARXNG_URL if you self-host one)')\n }\n if (!r.webSearch.braveConfigured && !r.webSearch.searxngConfigured) {\n console.log(' ⚠ no search backend — web_search will error until one is configured')\n }\n\n console.log()\n console.log('openclaw integration')\n if (r.openclaw.exists) {\n console.log(` ✓ ${r.openclaw.path} found`)\n console.log(' try: bazilion skill import --from openclaw')\n } else {\n console.log(` - ${r.openclaw.path} not found (fine if you don't use OpenClaw)`)\n }\n\n console.log()\n console.log('background jobs')\n console.log(\n ` ${r.scheduler.enabled ? '✓' : '-'} scheduler${\n r.scheduler.enabled ? ` (tick ${r.scheduler.tickMs}ms)` : ' (BAZILION_SCHEDULER=off)'\n }`,\n )\n\n console.log()\n for (const line of executionSecurityDoctorLines(r)) console.log(line)\n\n console.log()\n console.log('operational counts')\n console.log(` ${r.triggers.active} active trigger(s), ${r.triggers.disabled} disabled`)\n console.log(` ${r.tokens.active} active web token(s)`)\n\n const anyCloudProvider = r.providers.configured.length > 0\n const hasProfiles = (r.database?.ok ? r.database.profiles : 0) > 0\n const hasAgents = (r.database?.ok ? r.database.totalAgents : 0) > 0\n\n console.log()\n if (doctorHasIssues(r)) {\n console.log('issues found ✗')\n process.exit(1)\n }\n // Install is structurally healthy. Differentiate \"ready to use\" from \"just\n // initialized\" so a fresh install doesn't masquerade as fully configured.\n // (Local providers — lmstudio/ollama — are reported with default URLs\n // whether or not they're actually running, so we can only advise; cloud\n // providers have api keys we can check.)\n if (!hasProfiles || !hasAgents) {\n console.log('install is healthy, but not yet ready to run ⚠')\n const todo: string[] = []\n if (!anyCloudProvider) {\n todo.push(' - set a cloud api key (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY)')\n todo.push(' or make sure LMStudio / Ollama is running locally')\n }\n if (!hasProfiles) {\n todo.push(' - enable a provider: bazilion provider enable <provider>')\n todo.push(' - save a model: bazilion provider models-set <provider> <model-id>')\n }\n if (!hasAgents) todo.push(' - spawn an agent: bazilion agent spawn --profile <id>')\n for (const line of todo) console.log(line)\n } else {\n console.log('all good ✓')\n }\n },\n})\n\nexport function executionSecurityDoctorLines(\n report: Pick<HealthReport, 'executionSecurity' | 'shellSecurity'>,\n): string[] {\n const configured = report.executionSecurity.configuredOperatorHttp\n const protectedTurns = report.executionSecurity.protectedUnattendedTurns\n const lines = ['configured operator HTTP (legacy · unprotected)']\n\n if (!report.shellSecurity.ok) {\n lines.push(checkLine('valid shell-security configuration', false, report.shellSecurity.error))\n } else {\n if (report.shellSecurity.approvalMode === 'dangerous') {\n lines.push(\n ' - dangerous-command approval enabled',\n ' web and TTY CLI turns can allow once; non-interactive operator requests auto-deny',\n )\n } else {\n lines.push(\n ' - dangerous-command approval off',\n ' set BAZILION_BASH_APPROVAL=dangerous to opt in',\n )\n }\n\n if (report.shellSecurity.sandboxMode === 'docker') {\n lines.push(\n ` - coding surface: Docker only (${report.shellSecurity.sandboxImage})`,\n ' workspace-only writable mount · bounded inputs/skills/memory read-only · network disabled',\n ' host coding tools hidden',\n ' policy syntax is valid; Docker and image availability are checked on execution',\n ' commands fail closed if either is unavailable',\n )\n } else {\n lines.push(\n ' - coding surface: host tools',\n ' approval is a host-execution tripwire, not a filesystem sandbox',\n ' set BAZILION_BASH_SANDBOX=docker to opt in',\n )\n }\n }\n lines.push(` - browser: ${configured.browser}`, ` - MCP: ${configured.mcp}`, '')\n\n lines.push(\n 'protected unattended turns baseline (Telegram, schedules, inbox, approvals)',\n checkLine('protected base runtime ready', protectedTurns.baseRuntimeReady),\n ' - coding surface: Docker only',\n checkLine(\n `Docker ready (${protectedTurns.docker.image})`,\n protectedTurns.docker.ready,\n protectedTurns.docker.reason ?? undefined,\n ),\n checkLine('OpenAI Codex enabled', protectedTurns.openaiCodex.enabled),\n checkLine('ChatGPT connected', protectedTurns.openaiCodex.connected),\n ` - OpenAI access: ${openAIAccessStatus(protectedTurns.openaiCodex)}`,\n checkLine('OpenAI Codex baseline eligible', protectedTurns.openaiCodex.baselineEligible),\n ` ✓ browser: ${protectedTurns.browser}`,\n ` ✓ MCP: ${protectedTurns.mcp}`,\n ' - every turn separately validates its selected normal/review model, bound OAuth refresh, and mounts/paths',\n )\n if (protectedTurns.remediation) {\n lines.push(` remediation: ${protectedTurns.remediation}`)\n }\n return lines\n}\n\nexport function doctorHasIssues(\n report: Pick<HealthReport, 'ok' | 'protectedWorkBaselineReady'>,\n): boolean {\n return !report.ok || !report.protectedWorkBaselineReady\n}\n\nfunction openAIAccessStatus(\n status: ExecutionSecurityReportOpenAIStatus,\n): 'current' | 'refresh on next turn' | 'unavailable' {\n if (status.accessCurrent) return 'current'\n if (status.refreshOnNextTurn) return 'refresh on next turn'\n return 'unavailable'\n}\n\ntype ExecutionSecurityReportOpenAIStatus =\n HealthReport['executionSecurity']['protectedUnattendedTurns']['openaiCodex']\n\nfunction checkLine(label: string, condition: boolean, hint?: string): string {\n const mark = condition ? '✓' : '✗'\n const tail = !condition && hint ? ` — ${hint}` : ''\n return ` ${mark} ${label}${tail}`\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type { HealthReport } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nconst execFileAsync = promisify(execFile)\n\nfunction exactHttpsOrigin(raw: string | undefined): URL {\n if (!raw) throw new Error('BAZILION_PUBLIC_ORIGIN is required')\n const url = new URL(raw)\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n url.pathname !== '/' ||\n url.search ||\n url.hash ||\n url.origin !== raw.replace(/\\/$/, '')\n ) {\n throw new Error('BAZILION_PUBLIC_ORIGIN must be an exact HTTPS origin')\n }\n return url\n}\n\nfunction listenerIsLoopback(output: string, port: number): boolean {\n const suffix = `:${port}`\n const listeners = output\n .split('\\n')\n .filter((line) => line.trim())\n .filter((line) => line.split(/\\s+/).some((field) => field.endsWith(suffix)))\n return (\n listeners.length > 0 && listeners.every((line) => /(?:127\\.0\\.0\\.1|\\[?::1\\]?):\\d+/.test(line))\n )\n}\n\nfunction hasFunnel(value: unknown): boolean {\n if (Array.isArray(value)) return value.some(hasFunnel)\n if (!value || typeof value !== 'object') return false\n return Object.entries(value).some(\n ([key, nested]) =>\n (/funnel/i.test(key) && nested !== false && nested !== null) || hasFunnel(nested),\n )\n}\n\nconst preflightCmd = defineCommand({\n meta: { name: 'preflight', description: 'Read-only private Tailscale gateway safety check' },\n async run() {\n const publicOrigin = exactHttpsOrigin(process.env.BAZILION_PUBLIC_ORIGIN)\n const daemonPort = Number(process.env.PORT ?? 4321)\n const webPort = Number(process.env.WEB_PORT ?? 4322)\n const { stdout: listeners } = await execFileAsync('ss', ['-ltnH'], { timeout: 5_000 })\n if (!listenerIsLoopback(listeners, daemonPort)) {\n throw new Error(`daemon port ${daemonPort} is not listening exclusively on loopback`)\n }\n if (!listenerIsLoopback(listeners, webPort)) {\n throw new Error(`web port ${webPort} is not listening exclusively on loopback`)\n }\n\n let serveStatus: unknown\n try {\n const { stdout } = await execFileAsync('tailscale', ['serve', 'status', '--json'], {\n timeout: 10_000,\n maxBuffer: 1024 * 1024,\n })\n serveStatus = JSON.parse(stdout) as unknown\n } catch {\n throw new Error('could not obtain unambiguous `tailscale serve status --json` evidence')\n }\n if (hasFunnel(serveStatus))\n throw new Error('Tailscale Funnel is enabled; private Serve is required')\n const serialized = JSON.stringify(serveStatus)\n if (\n !serialized.includes(`127.0.0.1:${webPort}`) &&\n !serialized.includes(`localhost:${webPort}`)\n ) {\n throw new Error(`Tailscale Serve does not clearly target the loopback web port ${webPort}`)\n }\n\n const health = await createClient().get<HealthReport>('/api/health/details')\n if (!health.protectedWorkBaselineReady) {\n throw new Error('BAZ-027 protected-turn baseline is not ready')\n }\n console.log('private gateway preflight passed')\n console.log(`public origin: ${publicOrigin.origin}`)\n console.log(`daemon: loopback:${daemonPort}`)\n console.log(`web: loopback:${webPort}`)\n console.log('Tailscale: private Serve target present; Funnel absent')\n console.log('hosted Agent turns: protected baseline ready')\n },\n})\n\nexport const gatewayCommand = defineCommand({\n meta: { name: 'gateway', description: 'Inspect the private web gateway posture' },\n subCommands: { preflight: preflightCmd },\n})\n","import type { ListAgentLoopBreaksResponse, ListInboxResponse, Message } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction decodeText(payload: string): string {\n try {\n const obj = JSON.parse(payload) as { text?: unknown }\n if (typeof obj.text === 'string') return obj.text\n } catch {}\n return payload\n}\n\nfunction messageRow(m: Message): string[] {\n const when = new Date(m.createdAt).toISOString()\n const state = m.readAt ? 'read' : 'NEW'\n const text = decodeText(m.payload)\n const preview = text.length > 60 ? `${text.slice(0, 60)}…` : text\n return [m.id, state, when, `from:${m.fromAgentId.slice(0, 8)}`, `\"${preview}\"`]\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List messages in an agent inbox' },\n args: {\n agent: { type: 'positional', required: true, description: 'Recipient agent id' },\n unread: { type: 'boolean', description: 'Only show unread messages' },\n },\n async run({ args }) {\n const client = createClient()\n const qs = args.unread ? '?unread=1' : ''\n const { messages } = await client.get<ListInboxResponse>(\n `/api/agents/${args.agent}/messages${qs}`,\n )\n if (messages.length === 0) {\n console.log(args.unread ? '(no unread messages)' : '(inbox empty)')\n return\n }\n for (const line of columnize(messages.map(messageRow))) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show a single message in full' },\n args: {\n id: { type: 'positional', required: true, description: 'Message id' },\n },\n async run({ args }) {\n const client = createClient()\n const m = await client.get<Message>(`/api/messages/${args.id}`)\n const when = new Date(m.createdAt).toISOString()\n const read = m.readAt ? new Date(m.readAt).toISOString() : '(unread)'\n console.log(`id: ${m.id}`)\n console.log(`from: ${m.fromAgentId}`)\n console.log(`to: ${m.toAgentId}`)\n console.log(`created: ${when}`)\n console.log(`read: ${read}`)\n if (m.replyTo) console.log(`reply_to: ${m.replyTo}`)\n console.log('')\n console.log(decodeText(m.payload))\n },\n})\n\nconst readCmd = defineCommand({\n meta: { name: 'read', description: 'Mark a message as read' },\n args: {\n id: { type: 'positional', required: true, description: 'Message id' },\n },\n async run({ args }) {\n const client = createClient()\n await client.patch<Message>(`/api/messages/${args.id}`, { read: true })\n console.log(`marked read: ${args.id}`)\n },\n})\n\nconst loopBreaksCmd = defineCommand({\n meta: { name: 'loop-breaks', description: 'List stopped agent-message chains' },\n args: {\n agent: { type: 'positional', required: true, description: 'Agent id' },\n limit: { type: 'string', description: 'Maximum events to show (default 25)' },\n },\n async run({ args }) {\n const client = createClient()\n const limit = args.limit ? `?limit=${encodeURIComponent(args.limit)}` : ''\n const { events } = await client.get<ListAgentLoopBreaksResponse>(\n `/api/agents/${args.agent}/loop-breaks${limit}`,\n )\n if (events.length === 0) {\n console.log('(no agent-message chains stopped)')\n return\n }\n for (const line of columnize(\n events.map((event) => [\n new Date(event.createdAt).toISOString(),\n `chain:${event.causalChainId.slice(0, 8)}`,\n `${event.fromAgentId.slice(0, 8)}→${event.toAgentId.slice(0, 8)}`,\n `hop:${event.attemptedHop}/${event.maxHops}`,\n event.reason,\n ]),\n ))\n console.log(line)\n },\n})\n\nexport const inboxCommand = defineCommand({\n meta: { name: 'inbox', description: 'Inspect agent inboxes' },\n subCommands: {\n list: listCmd,\n show: showCmd,\n read: readCmd,\n 'loop-breaks': loopBreaksCmd,\n },\n})\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { defineCommand } from 'citty'\nimport type { AuthFile } from '../auth-file.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\nfunction normalizeServer(raw: string): string {\n let url: URL\n try {\n url = new URL(raw)\n } catch {\n throw new Error(`invalid --server URL: ${raw}`)\n }\n if (!/^https?:$/.test(url.protocol)) {\n throw new Error(`--server must be http(s), got ${url.protocol}`)\n }\n // Strip trailing slash so `${serverUrl}${path}` never produces `//`.\n return `${url.origin}${url.pathname.replace(/\\/$/, '')}`\n}\n\nasync function verifyToken(server: string, token: string): Promise<void> {\n const res = await fetch(`${server}/api/auth/whoami`, {\n headers: { authorization: `Bearer ${token}`, origin: server },\n })\n if (res.status === 401) throw new Error('server rejected token (401)')\n if (!res.ok) throw new Error(`server returned ${res.status} from /api/auth/whoami`)\n const owner = (await res.json()) as { publicOrigin?: string | null }\n if (owner.publicOrigin && owner.publicOrigin !== new URL(server).origin) {\n throw new Error('server canonical private origin does not match --server')\n }\n}\n\nexport const loginCommand = defineCommand({\n meta: {\n name: 'login',\n description: 'Save a remote bazilion server + token pair to auth.json',\n },\n args: {\n server: { type: 'string', description: 'Remote server URL (http[s]://...)' },\n token: { type: 'string', description: 'Token issued by `bazilion token create`' },\n skipVerify: { type: 'boolean', description: \"Don't verify /api/auth/whoami before saving\" },\n clear: { type: 'boolean', description: 'Remove the stored remote instead of setting one' },\n },\n async run({ args }) {\n const paths = resolveCliPaths()\n if (!existsSync(paths.authFile)) {\n throw new Error(\n `${paths.authFile} not found. Start the daemon with \"bazilion serve\" first — login stores the remote there.`,\n )\n }\n const auth = JSON.parse(readFileSync(paths.authFile, 'utf8')) as AuthFile\n\n if (args.clear) {\n if (!auth.remote) {\n console.log('no remote stored — nothing to clear')\n return\n }\n delete auth.remote\n writeFileSync(paths.authFile, `${JSON.stringify(auth, null, 2)}\\n`, { mode: 0o600 })\n console.log('cleared stored remote; CLI will fall back to the local daemon')\n return\n }\n\n if (!args.server || !args.token) {\n throw new Error(\n '--server and --token are required (or pass --clear to remove the stored remote)',\n )\n }\n const server = normalizeServer(args.server)\n if (!args.skipVerify) {\n await verifyToken(server, args.token)\n }\n auth.remote = { server, token: args.token }\n writeFileSync(paths.authFile, `${JSON.stringify(auth, null, 2)}\\n`, { mode: 0o600 })\n console.log(`saved remote: ${server}`)\n console.log('CLI will now target this server unless BAZILION_SERVER is set in the env.')\n },\n})\n","import type { McpServer, McpServerInput, McpToolInfo, McpTransport } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction serverRow(s: McpServer): string[] {\n const where = s.transport === 'stdio' ? `${s.command} ${s.args.join(' ')}`.trim() : (s.url ?? '')\n return [\n s.id,\n s.enabled ? 'enabled' : 'disabled',\n s.transport,\n s.hasAuthToken ? 'auth' : '-',\n s.name,\n where,\n ]\n}\n\nconst addCmd = defineCommand({\n meta: { name: 'add', description: 'Register an MCP server' },\n args: {\n name: { type: 'positional', required: true, description: 'Unique name ([a-zA-Z0-9_])' },\n transport: { type: 'string', description: 'stdio | http | sse (default stdio)' },\n command: { type: 'string', description: 'stdio: executable to run (e.g. npx)' },\n args: { type: 'string', description: 'stdio: space-separated args (quote the whole string)' },\n url: { type: 'string', description: 'http/sse: endpoint URL' },\n token: { type: 'string', description: 'http/sse: bearer token (stored encrypted)' },\n disabled: { type: 'boolean', description: 'Create disabled' },\n },\n async run({ args }) {\n const transport = (args.transport ?? 'stdio') as McpTransport\n const body: McpServerInput = {\n name: args.name,\n transport,\n command: args.command ?? null,\n args: args.args ? args.args.split(' ').filter(Boolean) : [],\n url: args.url ?? null,\n authToken: args.token ?? undefined,\n enabled: !args.disabled,\n }\n const client = createClient()\n const { server } = await client.post<{ server: McpServer }>('/api/mcp-servers', body)\n console.log(`${server.id}\\t${server.name}\\t${server.transport}`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List MCP servers' },\n async run() {\n const client = createClient()\n const { servers } = await client.get<{ servers: McpServer[] }>('/api/mcp-servers')\n if (servers.length === 0) {\n console.log('(no MCP servers)')\n return\n }\n for (const line of columnize(servers.map(serverRow))) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show one MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const { server } = await client.get<{ server: McpServer }>(`/api/mcp-servers/${args.id}`)\n console.log(JSON.stringify(server, null, 2))\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Delete an MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/mcp-servers/${args.id}`)\n console.log(`removed MCP server ${args.id}`)\n },\n})\n\nconst enableCmd = defineCommand({\n meta: { name: 'enable', description: 'Enable an MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.patch(`/api/mcp-servers/${args.id}`, { enabled: true })\n console.log(`enabled MCP server ${args.id}`)\n },\n})\n\nconst disableCmd = defineCommand({\n meta: { name: 'disable', description: 'Disable an MCP server' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.patch(`/api/mcp-servers/${args.id}`, { enabled: false })\n console.log(`disabled MCP server ${args.id}`)\n },\n})\n\nconst testCmd = defineCommand({\n meta: { name: 'test', description: 'Connect to a server and list its tools' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const res = await client.post<{ ok: boolean; tools?: McpToolInfo[]; error?: string }>(\n `/api/mcp-servers/${args.id}/test`,\n )\n if (!res.ok) {\n console.error(`connection failed: ${res.error}`)\n process.exitCode = 1\n return\n }\n const tools = res.tools ?? []\n console.log(`connected — ${tools.length} tool(s):`)\n for (const t of tools) console.log(` ${t.name}\\t${t.description}`)\n },\n})\n\nexport const mcpCommand = defineCommand({\n meta: { name: 'mcp', description: 'Manage MCP servers' },\n subCommands: {\n add: addCmd,\n list: listCmd,\n show: showCmd,\n rm: rmCmd,\n enable: enableCmd,\n disable: disableCmd,\n test: testCmd,\n },\n})\n","import type { MemoryEntry, MemoryHit } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nfunction encodeKey(key: string): string {\n return key.split('/').map(encodeURIComponent).join('/')\n}\n\nconst writeCmd = defineCommand({\n meta: { name: 'write', description: \"Write an entry into a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n key: { type: 'positional', required: true, description: 'Memory key (path under memory/)' },\n content: { type: 'positional', required: true, description: 'Content to write' },\n },\n async run({ args }) {\n const client = createClient()\n const entry = await client.put<MemoryEntry>(\n `/api/teams/${args.team}/memory/${encodeKey(args.key)}`,\n { content: args.content },\n )\n console.log(`wrote ${entry.key} (${entry.content.length} bytes)`)\n },\n})\n\nconst readCmd = defineCommand({\n meta: { name: 'read', description: \"Read an entry from a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n key: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const entry = await client.get<MemoryEntry>(\n `/api/teams/${args.team}/memory/${encodeKey(args.key)}`,\n )\n console.log(entry.content)\n },\n})\n\nconst searchCmd = defineCommand({\n meta: { name: 'search', description: \"Search a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n query: { type: 'positional', required: true },\n limit: { type: 'string', description: 'Max results (default 10)' },\n },\n async run({ args }) {\n const client = createClient()\n const limit = args.limit ? Number.parseInt(args.limit, 10) : 10\n const params = new URLSearchParams({ q: args.query, limit: String(limit) })\n const hits = await client.get<MemoryHit[]>(`/api/teams/${args.team}/memory/search?${params}`)\n if (hits.length === 0) {\n console.log('(no matches)')\n return\n }\n for (const h of hits) {\n console.log(`${h.key}\\t${h.snippet.replaceAll('\\n', ' ')}`)\n }\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: \"List all entries in a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n },\n async run({ args }) {\n const client = createClient()\n const all = await client.get<MemoryEntry[]>(`/api/teams/${args.team}/memory`)\n if (all.length === 0) {\n console.log('(no memory entries)')\n return\n }\n for (const e of all) {\n console.log(`${e.key}\\t${e.content.length}b`)\n }\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: \"Remove an entry from a team's shared memory\" },\n args: {\n team: { type: 'positional', required: true, description: 'Team slug' },\n key: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/teams/${args.team}/memory/${encodeKey(args.key)}`)\n console.log(`removed ${args.key}`)\n },\n})\n\nexport const memoryCommand = defineCommand({\n meta: {\n name: 'memory',\n description: \"Manage a team's shared memory (BM25-indexed markdown notes)\",\n },\n subCommands: {\n write: writeCmd,\n read: readCmd,\n search: searchCmd,\n list: listCmd,\n rm: rmCmd,\n },\n})\n","import { spawn } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport { readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport type {\n CreateProfileRequest,\n FileContentResponse,\n LoadedProfile,\n Profile,\n ProfileFileName,\n PutFileRequest,\n SkillsMode,\n UpdateProfileRequest,\n} from '@bazilion/api-types'\nimport { PROFILE_FILES } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction splitCsv(v: string | undefined): string[] | undefined {\n if (!v) return undefined\n const out = v\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n return out.length > 0 ? out : undefined\n}\n\nfunction parseSkillsMode(v: string | undefined): SkillsMode | undefined {\n if (v === undefined) return undefined\n if (v === 'all' || v === 'selected') return v\n throw new Error(`--skills-mode must be 'all' or 'selected', got '${v}'`)\n}\n\nconst createCmd = defineCommand({\n meta: { name: 'create', description: 'Create a new profile' },\n args: {\n id: { type: 'positional', required: true, description: 'Profile slug' },\n name: { type: 'string', description: 'Display name (defaults to slug)' },\n model: {\n type: 'string',\n required: true,\n description: 'Default model, e.g. anthropic:claude-opus-4-8',\n },\n 'skills-mode': {\n type: 'string',\n description: \"'all' (attach every discovered skill) or 'selected' (default)\",\n },\n skills: {\n type: 'string',\n description: 'Default skills, comma-separated (skills-mode=selected)',\n },\n 'soul-file': {\n type: 'string',\n description: 'Path to custom SOUL.md content (defaults to the built-in template)',\n },\n 'identity-file': {\n type: 'string',\n description: 'Path to custom IDENTITY.md content (defaults to the built-in template)',\n },\n 'bootstrap-file': {\n type: 'string',\n description: 'Path to custom BOOTSTRAP.md content (defaults to the built-in template)',\n },\n 'skip-bootstrap': {\n type: 'boolean',\n description: 'Skip the bootstrap file entirely (no first-run intro)',\n },\n 'agents-file': {\n type: 'string',\n description: 'Path to AGENTS.md content (optional; omit to skip)',\n },\n 'tools-file': {\n type: 'string',\n description: 'Path to TOOLS.md content (optional; omit to skip)',\n },\n },\n async run({ args }) {\n const skillsMode = parseSkillsMode(args['skills-mode'])\n const readTemplate = (path: string | undefined): string | undefined =>\n path ? readFileSync(path, 'utf8') : undefined\n const body: CreateProfileRequest = {\n id: args.id,\n name: args.name,\n defaultModel: args.model,\n skillsMode,\n defaultSkills: splitCsv(args.skills),\n soul: readTemplate(args['soul-file']),\n identity: readTemplate(args['identity-file']),\n bootstrap: args['skip-bootstrap']\n ? null\n : (readTemplate(args['bootstrap-file']) ?? undefined),\n agents: readTemplate(args['agents-file']),\n tools: readTemplate(args['tools-file']),\n }\n const client = createClient()\n const profile = await client.post<Profile>('/api/profiles', body)\n console.log(`created profile ${profile.id} at ${profile.dir}`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List profiles' },\n async run() {\n const client = createClient()\n const list = await client.get<Profile[]>('/api/profiles')\n if (list.length === 0) {\n console.log('(no profiles)')\n return\n }\n const rows = list.map((p) => [p.id, p.defaultModel, p.name])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst showCmd = defineCommand({\n meta: { name: 'show', description: 'Show profile details' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const loaded = await client.get<LoadedProfile>(`/api/profiles/${args.id}`)\n console.log(`# ${loaded.profile.id}`)\n console.log(`name: ${loaded.profile.name}`)\n console.log(`dir: ${loaded.profile.dir}`)\n console.log(`default model: ${loaded.profile.defaultModel}`)\n console.log(`skills mode: ${loaded.profile.skillsMode}`)\n console.log(\n `default skills: ${\n loaded.defaultSkills.length === 0 ? '(none)' : loaded.defaultSkills.join(', ')\n }`,\n )\n console.log(`bootstrap: ${loaded.files.bootstrap !== null ? 'yes' : 'no'}`)\n console.log(`agents: ${loaded.files.agents !== null ? 'yes' : 'no'}`)\n console.log(`tools: ${loaded.files.tools !== null ? 'yes' : 'no'}`)\n if (loaded.identity) {\n const fields = Object.entries(loaded.identity)\n .filter(([, v]) => typeof v === 'string' && v.length > 0)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ')\n if (fields) console.log(`identity: ${fields}`)\n }\n },\n})\n\nconst editCmd = defineCommand({\n meta: { name: 'edit', description: 'Open a profile file in $EDITOR' },\n args: {\n id: { type: 'positional', required: true },\n file: {\n type: 'string',\n default: 'profile.json',\n description: `File: ${PROFILE_FILES.join(', ')}`,\n },\n },\n async run({ args }) {\n if (!(PROFILE_FILES as readonly string[]).includes(args.file)) {\n throw new Error(`unsupported file: ${args.file}. Allowed: ${PROFILE_FILES.join(', ')}`)\n }\n const file = args.file as ProfileFileName\n const client = createClient()\n const { content } = await client.get<FileContentResponse>(\n `/api/profiles/${args.id}/files/${file}`,\n )\n const tmpPath = join(tmpdir(), `bazilion-${args.id}-${file}-${randomBytes(4).toString('hex')}`)\n writeFileSync(tmpPath, content)\n try {\n const editor = process.env.EDITOR ?? process.env.VISUAL ?? 'vi'\n const code: number = await new Promise((resolve, reject) => {\n const child = spawn(editor, [tmpPath], { stdio: 'inherit' })\n child.on('error', reject)\n child.on('close', (c) => resolve(c ?? 0))\n })\n if (code !== 0) throw new Error(`editor exited with code ${code}`)\n const updated = readFileSync(tmpPath, 'utf8')\n if (updated === content) {\n console.log('(no changes)')\n return\n }\n const body: PutFileRequest = { content: updated }\n await client.put(`/api/profiles/${args.id}/files/${file}`, body)\n console.log(`saved ${file}`)\n } finally {\n try {\n rmSync(tmpPath, { force: true })\n } catch {}\n }\n },\n})\n\nconst updateCmd = defineCommand({\n meta: {\n name: 'update',\n description: 'Update profile settings (name, model, skills-mode, skills)',\n },\n args: {\n id: { type: 'positional', required: true },\n name: { type: 'string', description: 'New display name' },\n model: { type: 'string', description: 'New default model' },\n 'skills-mode': {\n type: 'string',\n description: \"Switch to 'all' or 'selected'\",\n },\n skills: { type: 'string', description: 'Replacement default skills, comma-separated' },\n },\n async run({ args }) {\n const body: UpdateProfileRequest = {}\n if (args.name !== undefined) body.name = args.name\n if (args.model !== undefined) body.defaultModel = args.model\n const mode = parseSkillsMode(args['skills-mode'])\n if (mode !== undefined) body.skillsMode = mode\n if (args.skills !== undefined) {\n body.defaultSkills = args.skills\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n }\n if (Object.keys(body).length === 0) {\n throw new Error(\n 'nothing to update — pass at least one of --name/--model/--skills-mode/--skills',\n )\n }\n const client = createClient()\n const profile = await client.patch<Profile>(`/api/profiles/${args.id}`, body)\n console.log(`updated profile ${profile.id}`)\n },\n})\n\nconst deleteCmd = defineCommand({\n meta: { name: 'delete', description: 'Permanently delete a profile and its files' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/profiles/${args.id}`)\n console.log(`deleted profile ${args.id}`)\n },\n})\n\nexport const profileCommand = defineCommand({\n meta: { name: 'profile', description: 'Manage profiles' },\n subCommands: {\n create: createCmd,\n list: listCmd,\n show: showCmd,\n edit: editCmd,\n update: updateCmd,\n delete: deleteCmd,\n },\n})\n","// Wire-shape package. Hermetic: depends on nothing from the daemon, so every\n// client (web, mobile, cli, future SDKs) can pull in API shapes without\n// dragging Node-only code (node:sqlite, undici, pi-ai, the worker spawner)\n// into its TS check graph or runtime bundle. The daemon imports its entity\n// and wire types FROM here.\n\nexport type {\n AttentionAcknowledgeAllResponse,\n AttentionAcknowledgementResponse,\n AttentionDegradedSource,\n AttentionItem,\n AttentionKind,\n AttentionListResponse,\n AttentionSeverity,\n AttentionState,\n AttentionSummary,\n} from './attention.ts'\nexport type {\n Agent,\n AgentIdentityFile,\n AgentLessonEvidence,\n AgentLessonProposal,\n AgentLessonScope,\n AgentLessonStatus,\n AgentLoopBreakEvent,\n AgentReview,\n AgentReviewStatus,\n AgentReviewTrigger,\n AgentSkillAttachment,\n AgentStatus,\n AgentTrigger,\n CommunicationApproval,\n CommunicationApprovalDetail,\n CommunicationApprovalEvent,\n CommunicationApprovalStatus,\n CommunicationAuthorizationResult,\n CommunicationChannel,\n CommunicationComponentOutcome,\n CommunicationDecision,\n CommunicationEdgePosture,\n CommunicationEndpoint,\n CommunicationPolicyRef,\n LiveEndpointKind,\n LoadedProfile,\n McpServer,\n McpServerInput,\n McpToolInfo,\n McpTransport,\n Message,\n OpenAICodexStatus,\n Profile,\n ProfileCommunicationDefaults,\n ProfilePeerDefault,\n ReasoningLevel,\n ResolvedAgent,\n ResolvedTeamPolicy,\n SkillMeta,\n SkillsMode,\n SourceSlotBinding,\n Team,\n TeamAgentState,\n TeamPolicy,\n TeamPolicyBlockEvent,\n TeamPolicyBlockPage,\n TeamPolicyDetail,\n TeamPolicyEdge,\n TeamPolicyPlacement,\n TeamTemplate,\n TeamTemplateDetail,\n TeamTemplateEdge,\n TeamTemplateRevision,\n TeamTemplateSlot,\n TeamTemplateWithCount,\n TelegramAclRole,\n TelegramAllowedUser,\n TelegramMirrorMode,\n TemplateEndpointKind,\n TemplateInstantiation,\n Timestamp,\n TriggerDispatch,\n TriggerDispatchStatus,\n TriggerKind,\n WebSession,\n WebToken,\n} from './entities.ts'\nexport { REASONING_LEVELS } from './entities.ts'\nexport type {\n BashApprovalMode,\n ChatFrame,\n CommandApproval,\n CommandApprovalStatus,\n CommandRisk,\n CommandRiskCode,\n CommandRiskSeverity,\n ProviderMessage,\n Role,\n SessionEvent,\n ToolCall,\n ToolDef,\n ToolResultImage,\n} from './events.ts'\nexport type { MemoryEntry, MemoryHit } from './memory.ts'\n\nimport type {\n Agent,\n AgentLessonProposal,\n AgentLessonScope,\n AgentLessonStatus,\n AgentReview,\n AgentTrigger,\n CommunicationEdgePosture,\n LiveEndpointKind,\n Message,\n ProfileCommunicationDefaults,\n ReasoningLevel,\n TeamPolicyPlacement,\n TelegramAclRole,\n TelegramMirrorMode,\n TemplateEndpointKind,\n TriggerDispatch,\n WebSession,\n WebToken,\n} from './entities.ts'\nimport type { BashApprovalMode, CommandApproval } from './events.ts'\n\nexport interface ApiError {\n error: string\n code?: string\n findings?: SkillScanFinding[]\n}\n\n// --- agents ---\n\nexport interface ListAgentsQuery {\n includeArchived?: boolean\n}\n\nexport interface SpawnAgentRequest {\n profileId: string\n name?: string\n model?: string\n reasoningLevel?: ReasoningLevel\n /** Team the new agent joins. */\n teamId: string\n teamExpectedRevision: number\n placement: Exclude<TeamPolicyPlacement, 'template_snapshot'>\n}\n\nexport interface UpdateAgentRequest {\n modelOverride?: string | null\n reasoningLevel?: ReasoningLevel\n /** Step 6: per-agent Telegram outbound-mirror verbosity. */\n telegramMirrorMode?: TelegramMirrorMode\n /** Step 6: rename (mirrors the `name` field the daemon accepts on PATCH). */\n name?: string\n /**\n * Per-agent forum-topic emoji override (single emoji char). `null` or `''`\n * clears it (falls back to the profile default, then color-only).\n */\n telegramIconEmoji?: string | null\n}\n\nexport interface AgentReviewConfig {\n enabled: boolean\n everyNTurns: number\n model: string | null\n reasoningLevel: ReasoningLevel\n turnsSinceLast: number\n}\n\nexport interface UpdateAgentReviewConfigRequest {\n enabled?: boolean\n everyNTurns?: number\n model?: string | null\n reasoningLevel?: ReasoningLevel\n}\n\nexport interface EnqueueAgentReviewResponse {\n review: AgentReview\n}\n\nexport interface ListAgentReviewsResponse {\n reviews: AgentReview[]\n}\n\nexport interface ListAgentLessonProposalsQuery {\n status?: AgentLessonStatus\n}\n\nexport interface ListAgentLessonProposalsResponse {\n proposals: AgentLessonProposal[]\n}\n\nexport interface AgentReviewDetailResponse {\n review: AgentReview\n proposals: AgentLessonProposal[]\n}\n\nexport interface UpdateAgentLessonProposalRequest {\n version: number\n text?: string\n scope?: AgentLessonScope\n}\n\nexport interface DecideAgentLessonProposalRequest {\n version: number\n}\n\nexport interface AgentLessonProposalResponse {\n proposal: AgentLessonProposal\n}\n\nexport interface AttachSkillRequest {\n skill: string\n /** Required when attaching a skill whose static scan has findings. */\n allowFindings?: boolean\n}\n\n/** Body for `PATCH /api/agents/:id/team`: move the agent to a new team. */\nexport interface MoveAgentRequest {\n teamId: string\n /** A move is revision-checked and requires an explicit policy placement. */\n sourceExpectedRevision: number\n destinationExpectedRevision: number\n placement: Exclude<TeamPolicyPlacement, 'template_snapshot'>\n}\n\n// --- canonical Team templates and Team policy ---\n\nexport interface TeamTemplateSlotInput {\n /** Existing stable slot. Omit for a new server-allocated slot. */\n slotId?: string\n /** Request-local reference used by edges for a new slot. */\n clientKey?: string\n profileId: string\n agentName: string\n modelOverride?: string | null\n reasoningLevel?: ReasoningLevel | null\n layoutPosition?: { x: number; y: number } | null\n display?: Record<string, unknown> | null\n}\n\nexport interface TeamTemplateEdgeInput {\n sourceKind: TemplateEndpointKind\n sourceId?: string | null\n targetKind: TemplateEndpointKind\n targetId?: string | null\n posture?: CommunicationEdgePosture\n}\n\nexport interface CreateTeamTemplateRequest {\n id: string\n name: string\n userMd?: string | null\n}\n\nexport interface UpdateTeamTemplateRequest {\n expectedRevision: number\n name?: string\n userMd?: string | null\n}\n\nexport interface PutTeamTemplateDefinitionRequest {\n expectedRevision: number\n slots: TeamTemplateSlotInput[]\n edges: TeamTemplateEdgeInput[]\n}\n\nexport interface CloneTeamTemplateRequest {\n templateExpectedRevision: number\n id: string\n name?: string\n}\n\nexport interface SpawnTeamTemplateRequest {\n templateExpectedRevision: number\n teamId: string\n teamExpectedRevision?: number\n mode: 'initialize' | 'append'\n userMd?: string\n}\n\nexport interface TeamPolicyEdgeInput {\n sourceKind: LiveEndpointKind\n sourceId?: string | null\n targetKind: LiveEndpointKind\n targetId?: string | null\n posture?: CommunicationEdgePosture\n}\n\nexport interface PutGroupTeamPolicyPolicyRequest {\n expectedRevision: number\n edges: TeamPolicyEdgeInput[]\n}\n\nexport interface AdoptTeamTemplateRequest {\n teamExpectedRevision: number\n templateId: string\n templateExpectedRevision: number\n slotMappings: Array<{ slotId: string; agentId: string }>\n remainingPlacements: Array<{\n agentId: string\n placement: Exclude<TeamPolicyPlacement, 'template_snapshot'>\n }>\n previewEdges: TeamPolicyEdgeInput[]\n}\n\nexport interface UpdateTeamPolicySourceRequest {\n teamExpectedRevision: number\n templateExpectedRevision: number\n includeAgentIds: string[]\n}\n\nexport interface SaveTeamPolicyAsTemplateRequest {\n expectedRevision: number\n id: string\n name: string\n userMd?: string | null\n}\n\nexport interface SendMessageRequest {\n from: string\n payload: { text: string }\n replyTo?: string\n}\n\nexport interface CommunicationPendingResponse {\n code?: 'communication_pending'\n decision: 'approval_required'\n approvalId: string\n status: 'pending'\n expiresAt: number\n attemptKind: string\n attemptId: string\n}\n\nexport interface ListInboxQuery {\n unread?: boolean\n}\n\nexport interface ListInboxResponse {\n messages: Message[]\n}\n\nexport interface ListAgentLoopBreaksResponse {\n events: import('./entities.ts').AgentLoopBreakEvent[]\n}\n\nexport interface UpdateMessageRequest {\n read: true\n}\n\n// --- profiles ---\n\nexport interface UpdateProfileRequest {\n name?: string\n defaultModel?: string\n skillsMode?: 'all' | 'selected'\n defaultSkills?: string[]\n /** Omit to leave unchanged; null clears the row. */\n communicationDefaults?: ProfileCommunicationDefaults | null\n}\n\nexport interface CreateProfileRequest {\n id: string\n name?: string\n defaultModel: string\n skillsMode?: 'all' | 'selected'\n defaultSkills?: string[]\n /** Omit to create no defaults row. */\n communicationDefaults?: ProfileCommunicationDefaults\n /** Initial SOUL.md content. Falls back to the built-in template when omitted. */\n soul?: string\n /** Initial IDENTITY.md content. Falls back to the built-in template when omitted. */\n identity?: string\n /** Initial BOOTSTRAP.md content. Omit for default; pass null to skip bootstrap entirely. */\n bootstrap?: string | null\n /** Initial AGENTS.md content. Omit for the default template; pass null to skip the file. */\n agents?: string | null\n /** Initial TOOLS.md content. Omit for the default template; pass null to skip the file. */\n tools?: string | null\n}\n\n// --- teams ---\n\nexport interface RegisterTeamRequest {\n /** Slug (lowercase, digits, hyphens). Becomes the row id AND the directory\n * name under `~/.bazilion/teams/<slug>/`. */\n id: string\n /** Optional human-readable label. Defaults to `id`. */\n name?: string\n /**\n * Optional symlink target. When set, the daemon materializes the team\n * slot as a symlink to this absolute path instead of as a real directory\n * — useful for \"agents working on my existing project tree.\" Target must\n * exist and be a directory.\n */\n link?: string\n}\n\n/** Body for `PUT /api/teams/:id/user-md`. */\nexport interface SetTeamUserMdRequest {\n userMd: string\n}\n\n/**\n * Body for `PUT /api/teams/:id/topic-format`. `null` (or an empty/whitespace\n * string) clears the template and reverts to built-in topic naming.\n */\nexport interface SetTeamTopicFormatRequest {\n format: string | null\n}\n\n/** Body for `POST /api/config/telegram/acl` — add a user to the allowlist. */\nexport interface AddTelegramAllowedUserRequest {\n userId: number\n username?: string | null\n label?: string | null\n /** Defaults to 'member' when omitted. */\n role?: TelegramAclRole\n}\n\n// --- skills (write) ---\n\nexport interface ImportSkillsRequest {\n source: string\n /** Overwrite existing skills and confirm static-scan warnings. */\n force?: boolean\n}\n\nexport interface ImportSkillsResponse {\n imported: string[]\n skipped: { name: string; reason: string; findings?: SkillScanFinding[] }[]\n findings?: Record<string, SkillScanFinding[]>\n}\n\n// --- providers (write) ---\n\nexport interface ProviderTestRequest {\n model: string\n message?: string\n}\n\nexport interface ProviderTestResponse {\n content: string\n usage?: {\n promptTokens: number\n completionTokens: number\n }\n}\n\n// --- chat streaming ---\n\n/**\n * A file the user attaches to a chat message. One generic shape for everything;\n * the daemon classifies it at turn assembly: `image/*` goes to the model as\n * vision, anything else is stored on disk and referenced by path so the agent\n * decides how to process it.\n */\nexport interface Attachment {\n /** Original filename when known (used for stored non-image files). */\n name?: string\n /** e.g. \"image/png\", \"application/pdf\", \"text/csv\". */\n mimeType: string\n /** base64-encoded bytes (no data: prefix). */\n data: string\n}\n\nexport interface ChatRequest {\n message: string\n /** Files attached to this message (images → vision; others → stored + referenced). */\n attachments?: Attachment[]\n /** Explicit client capability. Omitted callers fail closed instead of waiting for input. */\n bashApprovalMode?: BashApprovalMode\n}\n\nexport interface CommandApprovalDecisionRequest {\n decision: 'allow' | 'deny'\n}\n\nexport interface CommandApprovalDecisionResponse {\n approval: CommandApproval\n}\n\nexport interface ListCommandApprovalsResponse {\n approvals: CommandApproval[]\n}\n\n// --- profile files ---\n\nexport type ProfileFileName =\n | 'profile.json'\n | 'SOUL.md'\n | 'IDENTITY.md'\n | 'BOOTSTRAP.md'\n | 'AGENTS.md'\n | 'TOOLS.md'\n\nexport const PROFILE_FILES: ProfileFileName[] = [\n 'profile.json',\n 'SOUL.md',\n 'IDENTITY.md',\n 'BOOTSTRAP.md',\n 'AGENTS.md',\n 'TOOLS.md',\n]\n\nexport interface FileContentResponse {\n content: string\n}\n\nexport interface PutFileRequest {\n content: string\n}\n\n// --- skills ---\n\nexport type SkillScanSeverity = 'warning' | 'danger'\n\nexport interface SkillScanFinding {\n code: string\n severity: SkillScanSeverity\n message: string\n line?: number\n}\n\nexport interface SkillInfo {\n name: string\n description: string\n source: string | null\n importedAt: number | null\n parseError?: string\n scanFindings?: SkillScanFinding[]\n}\n\nexport interface ResolvedSkillsResponse {\n resolved: SkillInfo[]\n missing: { name: string; reason: string }[]\n}\n\nexport interface TruncateChatRequest {\n /** Number of leading messages to preserve; everything after is dropped. */\n keepCount: number\n}\n\nexport interface TruncateChatResponse {\n before: number\n after: number\n}\n\n/**\n * Lightweight \"has anything new happened on this agent's session?\" probe.\n * Polled by the web chat UI to detect out-of-band activity (inbox-wakes,\n * scheduled triggers, turns run from another tab) so it can prompt the user\n * to refresh — the session JSONL is append-only, so either a new filename or\n * a bigger byte-count means new entries landed.\n */\nexport interface SessionHeadResponse {\n /** Basename of the most-recent `.jsonl` session file, or `null` if none. */\n file: string | null\n /** Byte size of that file (monotonically increasing while in use). */\n size: number\n}\n\nexport interface ContextFileEntry {\n /** Basename of the injected profile file (e.g. SOUL.md). */\n name: string\n /** Full character count of the file's contribution to the system prompt. */\n chars: number\n /** Rough token estimate (chars / 4). */\n tokens: number\n}\n\nexport interface ContextToolEntry {\n name: string\n /** JSON schema char size (what the provider sees as tool definitions). */\n schemaChars: number\n /** Description char size. */\n descriptionChars: number\n /** Count of top-level properties on the input schema, when shaped like JSONSchema. */\n paramCount: number | null\n}\n\nexport interface ContextSkillEntry {\n name: string\n /** Char count of the skill block injected into the system prompt (currently just the name). */\n blockChars: number\n}\n\nexport interface ContextGroupEntry {\n id: string\n name: string\n path: string\n userMdChars: number\n}\n\nexport interface ContextHistoryBreakdown {\n /** Count of `message` entries. */\n messageEntries: number\n /** Count of `compaction` entries (summarization boundaries). */\n compactionEntries: number\n /** Char sum of message `content` fields (LLM input surface). */\n chars: number\n /** Raw wire size of the serialized log on disk. */\n bytes: number\n /** Rough token estimate (chars / 4) for history alone. */\n tokensEstimate: number\n}\n\nexport interface ChatContextResponse {\n /** Agent being reported on. */\n agentId: string\n /** provider:model string the agent currently resolves to. */\n model: string\n systemPrompt: {\n chars: number\n tokens: number\n /** Per-file breakdown of profile markdown sources. */\n files: ContextFileEntry[]\n /** Char count of the skill-list text rendered into the system prompt. */\n skillsListChars: number\n /** Char count of the team block rendered into the system prompt. */\n teamListChars: number\n /** Char count of the USER.md block (0 when the team's userMd is empty). */\n userMdChars: number\n /** Fixed memory-hint block the runtime always appends. */\n memoryHintChars: number\n }\n tools: {\n count: number\n listChars: number\n schemaChars: number\n entries: ContextToolEntry[]\n }\n skills: {\n count: number\n entries: ContextSkillEntry[]\n }\n team: ContextGroupEntry\n history: ContextHistoryBreakdown\n /** Sum of system prompt + tool schemas + history, in chars + tokens. */\n totals: { chars: number; tokens: number }\n}\n\nexport interface ChatCompactRequest {\n /** Number of trailing message entries to keep verbatim. Default 10. */\n keepTail?: number\n /** Optional freeform guidance prepended to the summarizer system prompt. */\n customInstructions?: string\n}\n\nexport interface ChatCompactResponse {\n /** Entry count before compaction. */\n before: number\n /** Entry count after compaction (1 compaction + `keptTail` messages). */\n after: number\n /** Message entries summarized into the compaction (the head that was dropped). */\n summarized: number\n /** Message entries preserved verbatim after the compaction boundary. */\n keptTail: number\n /** Rough token estimate of the log before compaction. */\n tokensBefore: number\n /** Rough token estimate of the log after compaction. */\n tokensAfter: number\n /** The summary text produced by the model. */\n summary: string\n}\n\n// --- scheduled triggers (interval / cron) ---\n\nexport interface CreateTriggerRequest {\n kind: 'interval' | 'cron'\n /** required when kind='interval' */\n intervalSec?: number\n /** required when kind='cron' — 5-field expression (\"m h dom mon dow\") */\n cronExpr?: string\n /** injected as the user message when the trigger fires */\n message: string\n enabled?: boolean\n}\n\nexport interface UpdateTriggerRequest {\n enabled?: boolean\n}\n\nexport interface CreateTriggerResponse {\n trigger: AgentTrigger\n}\n\nexport interface UpdateTriggerResponse {\n trigger: AgentTrigger\n}\n\nexport interface ListTriggersResponse {\n triggers: AgentTrigger[]\n dispatches: TriggerDispatch[]\n}\n\nexport interface ListTriggerDispatchesResponse {\n dispatches: TriggerDispatch[]\n}\n\n// --- config page (providers + services + fields) ---\n\n/** Per-field UI + storage descriptor — source-of-truth is SERVICES in apps/daemon/src/core/services.ts. */\nexport interface ServiceFieldState {\n envVar: string\n kind: 'secret' | 'config'\n label: string\n placeholder?: string\n description?: string\n /** True when the field has a non-empty value in its storage backend. */\n set: boolean\n /** For `kind: 'config'` (plaintext): the actual value. Omitted for secrets. */\n value?: string\n /** For `kind: 'secret'`: a truncated preview like \"sk-abc…\" so the UI can confirm something is stored. Omitted when unset. */\n preview?: string\n}\n\nexport interface ServiceCard {\n id: string\n displayName: string\n /** Present for category==='provider' cards — tracks whether the pi-adapter sees it as configured. */\n enabled?: boolean\n envHint?: string\n hint?: string\n /** Display grouping label (e.g. \"Web tools\"). Cards without a team are bucketed under \"Other\". */\n team?: string\n fields: ServiceFieldState[]\n}\n\nexport interface ProviderConfigEntry extends ServiceCard {\n enabled: boolean\n envHint: string\n /** Static catalog from pi-ai's typed model list — empty for providers not in the catalog. */\n catalog: string[]\n /** Live `/v1/models` query — omitted when the provider doesn't expose one. */\n live?: { models: string[]; error?: string }\n /** Curated models the admin has selected — drives the dropdowns in profile/agent forms. */\n curated: string[]\n}\n\nexport interface ProviderConfigResponse {\n providers: ProviderConfigEntry[]\n}\n\nexport interface ServiceConfigResponse {\n services: ServiceCard[]\n}\n\nexport interface SetFieldRequest {\n value: string\n}\n\nexport interface SetProviderModelsRequest {\n models: string[]\n}\n\nexport interface SetProviderModelsResponse {\n models: string[]\n}\n\nexport interface SetProviderEnabledRequest {\n enabled: boolean\n}\n\nexport interface SetProviderEnabledResponse {\n name: string\n enabled: boolean\n}\n\n// --- web tokens ---\n\nexport interface CreateTokenRequest {\n label: string\n /** Device lifetime in days. Defaults to 90 and must be between 1 and 365. */\n expiresInDays?: number\n}\n\nexport interface CreateTokenResponse {\n /** Plaintext token — returned exactly once. */\n token: string\n meta: WebToken\n}\n\nexport interface ListTokensResponse {\n tokens: WebToken[]\n}\n\nexport interface ListSessionsResponse {\n sessions: WebSession[]\n}\n\nexport interface AuthenticatedOwnerResponse {\n authenticated: true\n setupComplete: boolean\n publicOrigin: string | null\n principal: {\n kind: 'bootstrap' | 'device' | 'session'\n tokenId: string\n label: string\n sessionId: string | null\n }\n}\n\nexport interface PublicHealthResponse {\n ok: true\n}\n\n// --- health (doctor) ---\n\nexport type ExecutionCodingSurface = 'host' | 'docker' | 'unavailable'\n\n/** Closed, secret-free reasons returned by the protected Docker readiness probe. */\nexport type ProtectedDockerReadinessReason =\n | 'unsupported platform'\n | 'Docker executable is unavailable'\n | 'Docker must use a local Unix socket'\n | 'Docker socket is unavailable'\n | 'Docker image is unavailable'\n | 'Docker image declares writable volumes'\n | 'Docker preflight failed'\n\nexport interface ExecutionSecurityReport {\n /** Explicit compatibility posture for operator-initiated web/CLI/mobile HTTP turns. */\n configuredOperatorHttp: {\n protected: false\n codingSurface: ExecutionCodingSurface\n dockerImage: string\n browser: 'enabled' | 'disabled'\n mcp: 'enabled' | 'disabled'\n }\n /** Mandatory posture for Telegram, schedules, inbox wake-ups, and approval delivery. */\n protectedUnattendedTurns: {\n /**\n * Process-wide prerequisites are available. This is not whole-turn readiness: every turn\n * separately validates its selected normal/review model, bound refresh, and mounts/paths.\n */\n baseRuntimeReady: boolean\n codingSurface: 'docker'\n docker: {\n ready: boolean\n image: string\n /** Null when ready or when Docker was not probed because shell configuration was invalid. */\n reason: ProtectedDockerReadinessReason | null\n }\n browser: 'denied'\n mcp: 'denied'\n openaiCodex: {\n enabled: boolean\n connected: boolean\n /** Stored access token is locally current; every turn still revalidates/refreshes. */\n accessCurrent: boolean\n /** A connected credential will be refreshed by the next turn when access is near expiry. */\n refreshOnNextTurn: boolean\n /** Process-wide provider prerequisites are present; individual turns still bind/refresh. */\n baselineEligible: boolean\n }\n /** Exactly one secret-free next action when `baseRuntimeReady` is false. */\n remediation: string | null\n }\n}\n\nexport interface HealthReport {\n /** Structural install health only; it does not claim that protected work can execute. */\n ok: boolean\n /**\n * Mandatory process-wide prerequisites for protected work. Every turn still validates its\n * selected normal/review model, bound refresh, and mounts/paths.\n */\n protectedWorkBaselineReady: boolean\n home: string\n paths: {\n home: boolean\n db: boolean\n auth: boolean\n profiles: boolean\n agents: boolean\n skills: boolean\n }\n database:\n | { ok: true; profiles: number; activeAgents: number; totalAgents: number; teams: number }\n | { ok: false; error: string }\n | null\n skills: { installed: number; parseErrors: number }\n providers: {\n /** Names of cloud providers with credentials configured (e.g. ['anthropic', 'groq']). */\n configured: string[]\n lmstudio: { customEndpointConfigured: boolean; keyConfigured: boolean }\n ollama: { customEndpointConfigured: boolean }\n }\n webSearch: { braveConfigured: boolean; searxngConfigured: boolean }\n openclaw: { path: string; exists: boolean }\n triggers: { active: number; disabled: number }\n tokens: { active: number }\n scheduler: { enabled: boolean; tickMs: number }\n shellSecurity:\n | {\n ok: true\n sandboxMode: 'off' | 'docker'\n approvalMode: 'off' | 'dangerous'\n sandboxImage: string\n hostCodingTools: boolean\n network: 'host' | 'none'\n }\n | {\n ok: false\n error: string\n }\n executionSecurity: ExecutionSecurityReport\n teamPolicyManagement: {\n contractVersion: number\n enforcementRequested: boolean\n enforcementActive: boolean\n releaseReady: boolean\n degraded: boolean\n decisions: { allowed: number; denied: number }\n }\n}\n\n// --- telegram integration ---\n\n/** Body for `PUT /api/config/telegram` — both fields required; daemon stores each in its proper table. */\nexport interface TelegramConfigInput {\n /** Bot token from BotFather. Goes to the encrypted `secrets` table as TELEGRAM_BOT_TOKEN. */\n botToken: string\n /** Supergroup numeric chat id. Goes to the plaintext `config` table as TELEGRAM_CHAT_ID. */\n chatId: string\n}\n\n/**\n * The four preflight checks that must all pass before the integration is\n * considered usable. Each call is one-shot — no polling, no bot running.\n */\nexport interface TelegramPreflight {\n /** Bot identity from getMe. Username has no leading `@`. */\n botUsername: string\n /** Display name of the supergroup, from getChat. */\n chatTitle: string\n /** True iff the chat has forum topics enabled (the irreversible owner-only toggle). */\n isForum: boolean\n /** True iff the bot is admin in the supergroup with the can_manage_topics right. */\n hasManageTopics: boolean\n /** True iff Privacy Mode is OFF (getMe.can_read_all_group_messages). */\n privacyModeOff: boolean\n /** True when getChat reports no public @username. */\n chatIsPrivate: boolean\n /** Telegram's current member count, used as a visibility warning only. */\n memberCount: number | null\n /** Paired owner is currently reported as a chat member. Null while unpaired. */\n ownerPresent: boolean | null\n}\n\n/**\n * Live state of the polling singleton on the daemon side. `null` when no bot\n * is running (creds absent, or daemon hasn't activated yet); populated once\n * the bot has been started.\n *\n * `lastSuccessfulPollAt` is the epoch-ms timestamp of the most recent\n * `getUpdates` call that completed without throwing — drives the stall\n * watchdog (BAZILION_TELEGRAM_POLLING_STALL_MS, default 120000).\n *\n * `error` is the most recent failure surfaced by the bot or its runner — set\n * when polling crashed, cleared when polling resumes.\n *\n * `activated` flips to true after the one-time first-activation completes\n * (service chat created, directory message pinned, General hidden, commands\n * registered).\n */\nexport interface TelegramPollingState {\n running: boolean\n activated: boolean\n lastUpdateId: number | null\n lastSuccessfulPollAt: number | null\n startedAt: number | null\n error: string | null\n}\n\n/**\n * Response from `GET /api/config/telegram/health`. When credentials aren't\n * configured, `configured: false` and `preflight` is `null`. When credentials\n * are configured but a preflight call errored, `preflight` is `null` and\n * `error` carries the failing step + message.\n *\n * `polling` is `null` until Step 2 starts a bot; once activated, it carries\n * the live state of the polling singleton (running, watermark, last-poll\n * timestamp, any error). Drives the live \"is the bot working?\" indicator in\n * the web setup card.\n */\nexport interface TelegramHealth {\n configured: boolean\n preflight: TelegramPreflight | null\n error: {\n step: 'getMe' | 'getChat' | 'getChatMember'\n message: string\n } | null\n polling: TelegramPollingState | null\n}\n\n/**\n * Response from `GET /api/config/telegram` — what's stored, without exposing\n * the bot token plaintext. Used by the setup form to render \"configured\"\n * state on first load.\n */\nexport interface TelegramConfigState {\n /** True iff both botToken and chatId are present in storage. */\n configured: boolean\n /** Plaintext chat id (empty string when unset). */\n chatId: string\n /** Masked preview of the bot token like `1234567:AAHi…`. Empty when unset. */\n botTokenPreview: string\n /**\n * Set when Telegram reported a `migrate_to_chat_id` for the configured\n * supergroup. The UI surfaces a \"your chat id changed — reconnect\" banner;\n * `POST /api/config/telegram/reconnect` applies it. Null when no migration\n * is pending.\n */\n migratedChatId: string | null\n}\n\nexport interface TelegramPairingStatus {\n paired: boolean\n challengeActive: boolean\n challengeExpiresAt: number | null\n ownerUserId: number | null\n}\n\nexport interface TelegramPairingChallenge extends TelegramPairingStatus {\n /** One-time plaintext. Returned only by challenge creation. */\n code: string\n expiresAt: number\n}\n\n/**\n * Response from `POST /api/agents/:id/telegram/bind`. The full agent is\n * returned with telegramTopicId populated, plus a deep-link the client can\n * surface as a button. `created` distinguishes \"we made a new topic\" from\n * \"agent was already bound\".\n */\nexport interface TelegramBindResponse {\n agent: Agent\n topicId: number\n deepLink: string\n created: boolean\n}\n","import type {\n ProviderConfigResponse,\n ProviderTestRequest,\n ProviderTestResponse,\n SetProviderEnabledResponse,\n SetProviderModelsRequest,\n SetProviderModelsResponse,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst listCmd = defineCommand({\n meta: {\n name: 'list',\n description: 'List all providers with enabled/disabled state and curated model counts',\n },\n args: {\n enabled: { type: 'boolean', description: 'Show only enabled providers' },\n },\n async run({ args }) {\n const client = createClient()\n const { providers } = await client.get<ProviderConfigResponse>('/api/config/providers')\n const filtered = args.enabled ? providers.filter((p) => p.enabled) : providers\n if (filtered.length === 0) {\n console.log('(no providers to show)')\n return\n }\n const rows = filtered.map((p) => [\n p.id,\n p.enabled ? 'enabled' : 'disabled',\n `${p.curated.length} curated`,\n `${p.catalog.length} catalog`,\n p.enabled ? '' : `(set ${p.envHint})`,\n ])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst modelsCmd = defineCommand({\n meta: {\n name: 'models',\n description: 'Show curated + catalog + live models for one provider',\n },\n args: {\n name: { type: 'positional', required: true, description: 'Provider name' },\n },\n async run({ args }) {\n const client = createClient()\n const { providers } = await client.get<ProviderConfigResponse>('/api/config/providers')\n const p = providers.find((x) => x.id === args.name)\n if (!p) {\n console.error(`unknown provider: ${args.name}`)\n process.exit(1)\n }\n console.log(`# ${p.id} (${p.enabled ? 'enabled' : 'disabled'})`)\n if (!p.enabled) console.log(` (set ${p.envHint} to enable)`)\n\n console.log('\\n## curated')\n if (p.curated.length === 0) console.log(' (none — use `provider models-set` to pin some)')\n else for (const m of p.curated) console.log(` ${m}`)\n\n console.log('\\n## catalog (from pi-ai)')\n if (p.catalog.length === 0) console.log(' (empty)')\n else for (const m of p.catalog) console.log(` ${m}`)\n\n if (p.live) {\n console.log('\\n## live (from upstream /v1/models)')\n if (p.live.error) console.log(` (error: ${p.live.error})`)\n else if (p.live.models.length === 0) console.log(' (empty)')\n else for (const m of p.live.models) console.log(` ${m}`)\n }\n },\n})\n\nconst modelsSetCmd = defineCommand({\n meta: {\n name: 'models-set',\n description: 'Replace the curated model list for a provider (comma-separated)',\n },\n args: {\n name: { type: 'positional', required: true, description: 'Provider name' },\n models: {\n type: 'positional',\n required: true,\n description: 'Comma-separated model list (empty string clears the list)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const models = args.models\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n const body: SetProviderModelsRequest = { models }\n const saved = await client.put<SetProviderModelsResponse>(\n `/api/config/providers/${encodeURIComponent(args.name)}/models`,\n body,\n )\n console.log(`saved ${saved.models.length} curated model(s) for ${args.name}`)\n for (const m of saved.models) console.log(` ${m}`)\n },\n})\n\nconst enableCmd = defineCommand({\n meta: { name: 'enable', description: 'Toggle a provider on so agents can use it' },\n args: {\n name: { type: 'positional', required: true, description: 'Provider id (e.g. anthropic)' },\n },\n async run({ args }) {\n const client = createClient()\n const res = await client.put<SetProviderEnabledResponse>(\n `/api/config/providers/${encodeURIComponent(args.name)}/enabled`,\n { enabled: true },\n )\n console.log(`${res.name}: enabled`)\n },\n})\n\nconst disableCmd = defineCommand({\n meta: {\n name: 'disable',\n description: 'Toggle a provider off — agents will refuse its model strings',\n },\n args: {\n name: { type: 'positional', required: true, description: 'Provider id' },\n },\n async run({ args }) {\n const client = createClient()\n const res = await client.put<SetProviderEnabledResponse>(\n `/api/config/providers/${encodeURIComponent(args.name)}/enabled`,\n { enabled: false },\n )\n console.log(`${res.name}: disabled`)\n },\n})\n\nconst testCmd = defineCommand({\n meta: { name: 'test', description: 'Send a single chat to a model and print the reply' },\n args: {\n model: {\n type: 'positional',\n required: true,\n description: 'Model string, e.g. anthropic:claude-opus-4-8',\n },\n message: { type: 'string', description: 'Message text (default \"say hi briefly\")' },\n },\n async run({ args }) {\n const client = createClient()\n const body: ProviderTestRequest = { model: args.model, message: args.message }\n console.log(`-> ${args.model}: ${args.message ?? 'say hi briefly'}`)\n const res = await client.post<ProviderTestResponse>('/api/providers/test', body)\n console.log(`<- ${res.content}`)\n if (res.usage) {\n console.log(`(${res.usage.promptTokens} in, ${res.usage.completionTokens} out)`)\n }\n },\n})\n\nexport const providerCommand = defineCommand({\n meta: { name: 'provider', description: 'Manage and test LLM providers' },\n subCommands: {\n list: listCmd,\n enable: enableCmd,\n disable: disableCmd,\n models: modelsCmd,\n 'models-set': modelsSetCmd,\n test: testCmd,\n },\n})\n","import type { CommunicationPendingResponse, Message, SendMessageRequest } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nexport const sendCommand = defineCommand({\n meta: {\n name: 'send',\n description: 'Send a message from one agent to another',\n },\n args: {\n from: { type: 'positional', required: true, description: 'Sender agent id' },\n to: { type: 'positional', required: true, description: 'Recipient agent id' },\n message: { type: 'positional', required: true, description: 'Message text' },\n },\n async run({ args }) {\n const client = createClient()\n const body: SendMessageRequest = {\n from: args.from,\n payload: { text: args.message },\n }\n const result = await client.post<Message | CommunicationPendingResponse>(\n `/api/agents/${args.to}/messages`,\n body,\n )\n if ('approvalId' in result) {\n console.log(\n `pending approval ${result.approvalId} (expires ${new Date(result.expiresAt).toISOString()})`,\n )\n return\n }\n console.log(`sent message ${result.id}`)\n },\n})\n","import { spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { defineCommand } from 'citty'\n\n// In published builds, serve.ts is inlined into dist/cli.js — the daemon\n// sits next to it as dist/daemon.js. In dev (running .ts source via tsx),\n// fall back to walking up to apps/daemon/src/index.ts.\nconst bundledDaemonEntry = join(import.meta.dirname, 'daemon.js')\nconst sourceDaemonEntry = join(import.meta.dirname, '..', '..', '..', 'daemon', 'src', 'index.ts')\nconst daemonEntry = existsSync(bundledDaemonEntry) ? bundledDaemonEntry : sourceDaemonEntry\n\nexport const serveCommand = defineCommand({\n meta: {\n name: 'serve',\n description: 'Start the bazilion daemon (HTTP API)',\n },\n args: {\n port: { type: 'string', description: 'Port (default 4321)' },\n host: {\n type: 'string',\n description: 'Host (default 127.0.0.1). Put a TLS proxy in front before binding 0.0.0.0',\n },\n },\n async run({ args }) {\n if (!existsSync(daemonEntry)) {\n throw new Error(\n `bazilion daemon not found at ${daemonEntry}. Are you running from a development checkout?`,\n )\n }\n\n const env: NodeJS.ProcessEnv = { ...process.env }\n if (args.port) env.PORT = args.port\n if (args.host) env.HOST = args.host\n\n const host = args.host ?? '127.0.0.1'\n const port = args.port ?? '4321'\n\n if (host !== '127.0.0.1' && host !== 'localhost' && host !== '::1') {\n console.error('')\n console.error(`⚠ binding to ${host} — the daemon is now reachable beyond loopback.`)\n console.error(' anyone on this network who has a valid token can reach every API.')\n console.error(' put a TLS proxy in front for untrusted networks.')\n console.error('')\n }\n\n console.log(`starting bazilion daemon at http://${host}:${port}`)\n console.log('(web UI runs separately: cd apps/web && pnpm dev)')\n\n // Spawn the daemon. In dev mode the entry is .ts so we go through tsx;\n // in published builds it's bundled .js so plain node is enough. Stdio\n // inherited so the daemon's startup log and any console.error go to the\n // user's terminal directly. The daemon installs its own SIGINT/SIGTERM\n // handlers and shuts the HTTP server gracefully — we just need to keep\n // this process alive long enough for it.\n const nodeArgs = daemonEntry.endsWith('.ts')\n ? ['--import', 'tsx/esm', daemonEntry]\n : [daemonEntry]\n const proc = spawn('node', nodeArgs, {\n env,\n stdio: 'inherit',\n })\n\n let signalled = false\n const onSigterm = (): void => {\n signalled = true\n try {\n proc.kill('SIGTERM')\n } catch {}\n }\n // SIGINT from the kernel (Ctrl+C) goes to the foreground pgroup, so the\n // daemon already gets it directly — we just have to stay alive.\n process.on('SIGINT', () => {\n signalled = true\n })\n process.on('SIGTERM', onSigterm)\n\n await new Promise<void>((resolve, reject) => {\n proc.on('error', (err) => reject(err))\n proc.on('close', (code) => {\n // signalled exits get translated to 0 so the outer `pnpm tsx … serve`\n // wrapper doesn't print `ELIFECYCLE Command failed` after a clean Ctrl+C.\n if (signalled) {\n process.exitCode = 0\n resolve()\n } else if (code === 0 || code === null) {\n resolve()\n } else {\n process.exitCode = code\n resolve()\n }\n })\n })\n },\n})\n","import type { ListSessionsResponse, WebSession } from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction row(session: WebSession): string[] {\n const state = session.revokedAt\n ? 'revoked'\n : session.absoluteExpiresAt <= Date.now() || session.idleExpiresAt <= Date.now()\n ? 'expired'\n : 'active'\n return [\n session.id,\n state,\n session.current ? 'current' : '',\n session.deviceLabel,\n `idle: ${new Date(session.idleExpiresAt).toISOString()}`,\n `absolute: ${new Date(session.absoluteExpiresAt).toISOString()}`,\n ]\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List browser sessions' },\n async run() {\n const { sessions } = await createClient().get<ListSessionsResponse>('/api/sessions')\n if (sessions.length === 0) {\n console.log('(no active browser sessions)')\n return\n }\n for (const line of columnize(sessions.map(row))) console.log(line)\n },\n})\n\nconst revokeCmd = defineCommand({\n meta: { name: 'revoke', description: 'Revoke one browser session' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n await createClient().del(`/api/sessions/${encodeURIComponent(args.id)}`)\n console.log(`revoked browser session ${args.id}`)\n },\n})\n\nexport const sessionCommand = defineCommand({\n meta: { name: 'session', description: 'Manage browser sessions' },\n subCommands: { list: listCmd, revoke: revokeCmd },\n})\n","import { existsSync, readFileSync, statSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport type {\n ImportSkillsRequest,\n ImportSkillsResponse,\n ResolvedSkillsResponse,\n SkillInfo,\n SkillScanFinding,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { ApiClientError, createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nfunction printFindings(findings: SkillScanFinding[], prefix = ' '): void {\n for (const f of findings) {\n const line = f.line ? ` line ${f.line}` : ''\n console.log(`${prefix}${f.severity}: ${f.code}${line} - ${f.message}`)\n }\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List installed skills (or those attached to an agent)' },\n args: {\n agent: { type: 'string', description: 'Filter to skills attached to this agent' },\n },\n async run({ args }) {\n const client = createClient()\n\n if (args.agent) {\n const set = await client.get<ResolvedSkillsResponse>(`/api/agents/${args.agent}/skills`)\n if (set.resolved.length === 0 && set.missing.length === 0) {\n console.log('(no skills attached to this agent)')\n return\n }\n const rows = set.resolved.map((s) => [s.name, s.description])\n for (const line of columnize(rows)) console.log(line)\n for (const m of set.missing) {\n console.log(`(missing: ${m.name} — ${m.reason})`)\n }\n return\n }\n\n const skills = await client.get<SkillInfo[]>('/api/skills')\n if (skills.length === 0) {\n console.log('(no skills installed; use \"bazilion skill import\" to add some)')\n return\n }\n const rows = skills.map((s) => [\n s.name,\n s.parseError ? `(parse error: ${s.parseError})` : s.description,\n ])\n for (const line of columnize(rows)) console.log(line)\n const flagged = skills.filter((s) => s.scanFindings && s.scanFindings.length > 0)\n if (flagged.length > 0) {\n console.log('')\n console.log('scan findings:')\n for (const s of flagged) {\n console.log(`${s.name}:`)\n printFindings(s.scanFindings ?? [])\n }\n }\n },\n})\n\nconst importCmd = defineCommand({\n meta: {\n name: 'import',\n description: 'Import skills from openclaw, a directory, or a local .zip archive',\n },\n args: {\n from: {\n type: 'string',\n required: true,\n description:\n 'Source: \"openclaw\", a filesystem path on the server, or a local .zip file to upload',\n },\n force: { type: 'boolean', description: 'Overwrite existing skills' },\n },\n async run({ args }) {\n const client = createClient()\n\n // Auto-detect local .zip uploads: if `--from` points at an existing local\n // file ending in .zip, stream it to the server as multipart. Otherwise\n // fall through to the legacy JSON path (server reads the source directly).\n const absFrom = resolve(args.from)\n const isLocalZip =\n args.from.toLowerCase().endsWith('.zip') && existsSync(absFrom) && statSync(absFrom).isFile()\n\n let result: ImportSkillsResponse\n try {\n if (isLocalZip) {\n const bytes = readFileSync(absFrom)\n const file = new File([bytes], basename(absFrom), { type: 'application/zip' })\n const fd = new FormData()\n fd.set('file', file)\n if (args.force) fd.set('force', 'true')\n result = await client.postMultipart<ImportSkillsResponse>('/api/skills/import', fd)\n } else {\n const body: ImportSkillsRequest = {\n source: args.from,\n force: args.force,\n }\n result = await client.post<ImportSkillsResponse>('/api/skills/import', body)\n }\n } catch (err) {\n if (err instanceof ApiClientError && err.body.code === 'skill_scan_blocked') {\n console.error(`error: ${err.body.error}`)\n if (err.body.findings && err.body.findings.length > 0) {\n console.error('scan findings:')\n for (const f of err.body.findings) {\n const line = f.line ? ` line ${f.line}` : ''\n console.error(` ${f.severity}: ${f.code}${line} - ${f.message}`)\n }\n }\n console.error(' hint: inspect the skill, then rerun with --force to confirm')\n process.exitCode = 1\n return\n }\n throw err\n }\n\n if (result.imported.length === 0 && result.skipped.length === 0) {\n console.log('(nothing to import)')\n return\n }\n for (const name of result.imported) {\n console.log(`imported ${name}`)\n }\n for (const s of result.skipped) {\n console.log(`skipped ${s.name}: ${s.reason}`)\n }\n if (result.findings && Object.keys(result.findings).length > 0) {\n console.log('')\n console.log('confirmed scan findings:')\n for (const [name, findings] of Object.entries(result.findings)) {\n console.log(`${name}:`)\n printFindings(findings)\n }\n }\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Remove an installed skill' },\n args: {\n name: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/skills/${encodeURIComponent(args.name)}`)\n console.log(`removed skill ${args.name}`)\n },\n})\n\nexport const skillCommand = defineCommand({\n meta: { name: 'skill', description: 'Manage the skill library' },\n subCommands: {\n list: listCmd,\n import: importCmd,\n rm: rmCmd,\n },\n})\n","import { readFileSync } from 'node:fs'\nimport { stdin } from 'node:process'\nimport type {\n RegisterTeamRequest,\n ResolvedTeamPolicy,\n SetTeamTopicFormatRequest,\n SetTeamUserMdRequest,\n Team,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport { teamPolicyCommand } from './team-policy.ts'\n\nconst addCmd = defineCommand({\n meta: {\n name: 'add',\n description:\n 'Register a team at ~/.bazilion/teams/<slug>/ (use --link to point at an existing tree)',\n },\n args: {\n id: { type: 'positional', required: true, description: 'Team slug' },\n name: { type: 'string', description: 'Display name (defaults to slug)' },\n link: {\n type: 'string',\n description: 'Absolute path of an existing directory; the team slot becomes a symlink to it',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: RegisterTeamRequest = {\n id: args.id,\n ...(args.name ? { name: args.name } : {}),\n ...(args.link ? { link: args.link } : {}),\n }\n const g = await client.post<Team>('/api/teams', body)\n console.log(`registered team ${g.id} at ${g.path}`)\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List teams' },\n async run() {\n const client = createClient()\n const list = await client.get<Team[]>('/api/teams')\n if (list.length === 0) {\n console.log('(no teams)')\n return\n }\n const rows = list.map((g) => [g.id, g.path])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Remove a team registration' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const policy = await client.get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(args.id)}/policy`,\n )\n await client.del(\n `/api/teams/${encodeURIComponent(args.id)}?expectedTeamPolicyRevision=${policy.teamPolicy.revision}`,\n )\n console.log(`removed team ${args.id}`)\n },\n})\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = []\n for await (const chunk of stdin) chunks.push(chunk as Buffer)\n return Buffer.concat(chunks).toString('utf8')\n}\n\nconst userMdShowCmd = defineCommand({\n meta: { name: 'show', description: \"Print the team's USER.md\" },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const g = await client.get<Team>(`/api/teams/${args.id}`)\n process.stdout.write(g.userMd)\n if (g.userMd && !g.userMd.endsWith('\\n')) process.stdout.write('\\n')\n },\n})\n\nconst userMdSetCmd = defineCommand({\n meta: {\n name: 'set',\n description: \"Replace the team's USER.md (from --file, --from-stdin, or inline text)\",\n },\n args: {\n id: { type: 'positional', required: true },\n file: { type: 'string', description: 'Read content from a file path' },\n 'from-stdin': { type: 'boolean', description: 'Read content from stdin' },\n text: { type: 'string', description: 'Inline content' },\n },\n async run({ args }) {\n let content: string\n if (args['from-stdin']) content = await readStdin()\n else if (args.file) content = readFileSync(args.file, 'utf8')\n else if (args.text !== undefined) content = args.text\n else {\n console.error('team user-md set: provide --file, --from-stdin, or --text')\n process.exit(2)\n }\n const client = createClient()\n const body: SetTeamUserMdRequest = { userMd: content }\n await client.put(`/api/teams/${args.id}/user-md`, body)\n console.log(`updated USER.md for team ${args.id} (${content.length} bytes)`)\n },\n})\n\nconst userMdClearCmd = defineCommand({\n meta: { name: 'clear', description: \"Clear the team's USER.md to empty\" },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const body: SetTeamUserMdRequest = { userMd: '' }\n await client.put(`/api/teams/${args.id}/user-md`, body)\n console.log(`cleared USER.md for team ${args.id}`)\n },\n})\n\nconst userMdCmd = defineCommand({\n meta: { name: 'user-md', description: \"View or edit a team's USER.md\" },\n subCommands: {\n show: userMdShowCmd,\n set: userMdSetCmd,\n clear: userMdClearCmd,\n },\n})\n\nconst topicFormatShowCmd = defineCommand({\n meta: { name: 'show', description: \"Print the team's Telegram topic-name template\" },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const g = await client.get<Team>(`/api/teams/${args.id}`)\n console.log(g.telegramTopicNameFormat ?? '(default naming)')\n },\n})\n\nconst topicFormatSetCmd = defineCommand({\n meta: {\n name: 'set',\n description:\n 'Set the topic-name template. Tokens: {agent.name} {team.name} {team.slug} (must include {agent.name})',\n },\n args: {\n id: { type: 'positional', required: true },\n format: {\n type: 'positional',\n required: true,\n description: 'e.g. \"{team.name} / {agent.name}\"',\n },\n },\n async run({ args }) {\n const client = createClient()\n const body: SetTeamTopicFormatRequest = { format: args.format }\n const g = await client.put<Team>(`/api/teams/${args.id}/topic-format`, body)\n console.log(`set topic-name template for team ${args.id}: ${g.telegramTopicNameFormat}`)\n },\n})\n\nconst topicFormatClearCmd = defineCommand({\n meta: { name: 'clear', description: 'Clear the template (revert to built-in naming)' },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n const body: SetTeamTopicFormatRequest = { format: null }\n await client.put(`/api/teams/${args.id}/topic-format`, body)\n console.log(`cleared topic-name template for team ${args.id}`)\n },\n})\n\nconst topicFormatCmd = defineCommand({\n meta: {\n name: 'topic-format',\n description: \"View or edit a team's Telegram forum-topic name template\",\n },\n subCommands: {\n show: topicFormatShowCmd,\n set: topicFormatSetCmd,\n clear: topicFormatClearCmd,\n },\n})\n\nexport const teamCommand = defineCommand({\n meta: { name: 'team', description: 'Manage teams (collaboration contexts)' },\n subCommands: {\n add: addCmd,\n list: listCmd,\n rm: rmCmd,\n 'user-md': userMdCmd,\n 'topic-format': topicFormatCmd,\n policy: teamPolicyCommand,\n },\n})\n","import { readFileSync } from 'node:fs'\nimport type {\n CommunicationAuthorizationResult,\n CommunicationEndpoint,\n PutGroupTeamPolicyPolicyRequest,\n ResolvedTeamPolicy,\n TeamPolicyBlockPage,\n TeamPolicyDetail,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport { edgeDiff, exportTeamPolicy, parseTeamPolicyDocument } from '../team-interchange.ts'\n\ninterface TeamPolicyDiff {\n liveRevision: number\n baseline: { templateId: string; templateRevision: number } | null\n currentSource: { template: { currentRevision: number } } | null\n sourceDiverged: boolean\n comparison: {\n addedSinceBaseline: unknown[]\n removedSinceBaseline: unknown[]\n currentSourceAddedSlotIds: string[]\n currentSourceRemovedSlotIds: string[]\n }\n [key: string]: unknown\n}\n\nfunction readJson(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown\n } catch (error) {\n throw new Error(`invalid JSON: ${(error as Error).message}`)\n }\n}\n\nfunction endpoint(value: string, teamId: string): CommunicationEndpoint {\n if (value === 'user') return { kind: 'user', teamId }\n if (value.startsWith('agent:') && value.length > 6) return { kind: 'agent', id: value.slice(6) }\n if (value.startsWith('outside:') && value.length > 8)\n return { kind: 'outside_team', teamId: value.slice(8) }\n throw new Error('endpoint must be user, agent:<id>, or outside:<team-id>')\n}\n\nfunction printPolicy(detail: ResolvedTeamPolicy): void {\n console.log(`# Team ${detail.teamPolicy.teamId} policy`)\n console.log(`revision: ${detail.teamPolicy.revision}`)\n console.log(\n `baseline: ${detail.baseline ? `${detail.baseline.templateId}@${detail.baseline.templateRevision}` : '(none)'}`,\n )\n console.log(`members: ${detail.members.length}`)\n console.log(`edges: ${detail.edges.length}`)\n if (detail.edges.length) {\n console.log('')\n for (const line of columnize([\n ['source', 'target'],\n ...detail.edges.map((edge) => [\n `${edge.sourceKind}:${edge.sourceId ?? '-'}`,\n `${edge.targetKind}:${edge.targetId ?? '-'}`,\n ]),\n ]))\n console.log(line)\n }\n}\n\nconst show = defineCommand({\n meta: { name: 'show', description: 'Show the one effective live policy for a Team' },\n args: {\n team: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit the canonical aggregate as JSON' },\n },\n async run({ args }) {\n const detail = await createClient().get<ResolvedTeamPolicy>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n )\n if (args.json) console.log(JSON.stringify(detail, null, 2))\n else printPolicy(detail)\n },\n})\n\nconst exportCommand = defineCommand({\n meta: { name: 'export', description: 'Export a revisioned Team policy document' },\n args: { team: { type: 'positional', required: true } },\n async run({ args }) {\n const detail = await createClient().get<TeamPolicyDetail>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n )\n console.log(\n JSON.stringify(\n exportTeamPolicy(args.team, detail.teamPolicy.revision, detail.edges),\n null,\n 2,\n ),\n )\n },\n})\n\nfunction printEdgeDiff(\n current: TeamPolicyDetail,\n edges: ReturnType<typeof parseTeamPolicyDocument>['edges'],\n): void {\n const diff = edgeDiff(current.edges, edges)\n console.log(`Team: ${current.teamPolicy.teamId}`)\n console.log(`Revision: ${current.teamPolicy.revision}`)\n console.log(`Edges: +${diff.added.length} -${diff.removed.length}`)\n for (const value of diff.added) console.log(` + ${value}`)\n for (const value of diff.removed) console.log(` - ${value}`)\n}\n\nconst importCommand = defineCommand({\n meta: {\n name: 'import',\n description: 'Validate, diff, and explicitly replace a Team policy',\n },\n args: {\n team: { type: 'positional', required: true },\n file: { type: 'positional', required: true },\n 'dry-run': { type: 'boolean', description: 'Validate and print the diff only' },\n apply: { type: 'boolean', description: 'Apply non-interactively after printing the diff' },\n 'expected-revision': {\n type: 'string',\n description: 'Expected current Team revision (defaults to document revision)',\n },\n force: {\n type: 'boolean',\n description: 'Refetch current revision; requires --apply and still uses optimistic locking',\n },\n 'confirm-current-revision': {\n type: 'string',\n description: 'Second force confirmation: the freshly displayed current revision',\n },\n },\n async run({ args }) {\n if (args.force && !args.apply)\n throw new Error('--force requires --apply (interactive force is intentionally unsupported)')\n const document = parseTeamPolicyDocument(readJson(args.file))\n if (document.teamId !== args.team)\n throw new Error(`document belongs to Team ${document.teamId}, not ${args.team}`)\n const client = createClient()\n const current = await client.get<TeamPolicyDetail>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n )\n printEdgeDiff(current, document.edges)\n if (args['dry-run']) return console.log('valid: no changes applied')\n if (!args.apply) throw new Error('refusing mutation: review the diff, then pass --apply')\n const supplied = args['expected-revision']\n ? Number.parseInt(args['expected-revision'], 10)\n : document.expectedRevision\n const expectedRevision = args.force ? current.teamPolicy.revision : supplied\n if (\n args.force &&\n Number.parseInt(args['confirm-current-revision'] ?? '', 10) !== current.teamPolicy.revision\n )\n throw new Error(\n `--force requires --confirm-current-revision ${current.teamPolicy.revision} after reviewing the fresh diff`,\n )\n if (!Number.isInteger(expectedRevision) || expectedRevision < 1)\n throw new Error('expected revision must be a positive integer')\n const body: PutGroupTeamPolicyPolicyRequest = {\n expectedRevision,\n edges: document.edges,\n }\n const updated = await client.put<TeamPolicyDetail>(\n `/api/teams/${encodeURIComponent(args.team)}/policy`,\n body,\n )\n console.log(`updated Team ${args.team} policy to revision ${updated.teamPolicy.revision}`)\n },\n})\n\nconst diff = defineCommand({\n meta: { name: 'diff', description: 'Compare live policy with its retained baseline source' },\n args: {\n team: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit canonical diff JSON' },\n },\n async run({ args }) {\n const result = await createClient().get<TeamPolicyDiff>(\n `/api/teams/${encodeURIComponent(args.team)}/policy/diff`,\n )\n if (args.json) return console.log(JSON.stringify(result, null, 2))\n console.log(`# Team ${args.team} source diff`)\n console.log(\n `status: ${result.baseline ? (result.sourceDiverged ? 'source diverged' : 'source current') : 'no baseline'}`,\n )\n console.log(`revision: ${result.liveRevision}`)\n console.log(\n `edges: +${result.comparison.addedSinceBaseline.length} -${result.comparison.removedSinceBaseline.length}`,\n )\n console.log(\n `slots: +${result.comparison.currentSourceAddedSlotIds.length} -${result.comparison.currentSourceRemovedSlotIds.length}`,\n )\n },\n})\n\nconst evaluate = defineCommand({\n meta: {\n name: 'evaluate',\n description: 'Evaluate a communication path without sending or recording a block',\n },\n args: {\n team: { type: 'positional', required: true, description: 'Owning Team for context' },\n source: { type: 'string', required: true, description: 'user | agent:<id> | outside:<team>' },\n target: { type: 'string', required: true, description: 'user | agent:<id> | outside:<team>' },\n origin: { type: 'string', default: 'cli-diagnostic' },\n json: { type: 'boolean', description: 'Emit decision JSON' },\n },\n async run({ args }) {\n const result = await createClient().post<CommunicationAuthorizationResult>(\n '/api/communication/evaluate',\n {\n source: endpoint(args.source, args.team),\n target: endpoint(args.target, args.team),\n origin: args.origin,\n attemptKind: 'cli_evaluate',\n attemptId: `diagnostic:${args.team}`,\n },\n )\n if (args.json) return console.log(JSON.stringify(result, null, 2))\n console.log(`${result.decision.toUpperCase()} ${result.channel}: ${result.reasonCode}`)\n console.log(result.reason)\n console.log(\n `policy revisions: ${result.policyRefs.map((ref) => `${ref.teamId}@${ref.revision}`).join(', ') || '-'}`,\n )\n },\n})\n\nconst blocks = defineCommand({\n meta: { name: 'blocks', description: 'List paginated durable communication denials' },\n args: {\n team: { type: 'positional', required: true },\n limit: { type: 'string', default: '50' },\n cursor: { type: 'string' },\n source: { type: 'string' },\n target: { type: 'string' },\n channel: { type: 'string' },\n origin: { type: 'string' },\n reason: { type: 'string', description: 'Reason code' },\n from: { type: 'string', description: 'Epoch milliseconds or ISO timestamp' },\n to: { type: 'string', description: 'Epoch milliseconds or ISO timestamp' },\n json: { type: 'boolean', description: 'Emit page JSON including nextCursor' },\n },\n async run({ args }) {\n const query = new URLSearchParams({ limit: args.limit })\n for (const [key, value] of [\n ['cursor', args.cursor],\n ['source', args.source],\n ['target', args.target],\n ['channel', args.channel],\n ['origin', args.origin],\n ['reasonCode', args.reason],\n ['from', args.from],\n ['to', args.to],\n ] as const)\n if (value) query.set(key, value)\n const page = await createClient().get<TeamPolicyBlockPage>(\n `/api/teams/${encodeURIComponent(args.team)}/policy/blocks?${query}`,\n )\n if (args.json) return console.log(JSON.stringify(page, null, 2))\n if (!page.blocks.length) console.log('(no blocks)')\n else\n for (const line of columnize([\n ['time', 'source', 'target', 'channel', 'origin', 'reason'],\n ...page.blocks.map((block) => [\n new Date(block.created_at).toISOString(),\n `${block.source_kind}:${block.source_id ?? '-'}`,\n `${block.target_kind}:${block.target_id ?? '-'}`,\n block.channel,\n block.origin,\n block.reason_code,\n ]),\n ]))\n console.log(line)\n if (page.nextCursor) console.log(`next cursor: ${page.nextCursor}`)\n },\n})\n\nexport const teamPolicyCommand = defineCommand({\n meta: { name: 'policy', description: 'Inspect and manage the Team-owned live policy' },\n subCommands: {\n show,\n export: exportCommand,\n import: importCommand,\n diff,\n evaluate,\n blocks,\n },\n})\n","import type {\n CommunicationEdgePosture,\n ReasoningLevel,\n TeamPolicyEdge,\n TeamPolicyEdgeInput,\n TeamTemplateDetail,\n TeamTemplateEdgeInput,\n TeamTemplateSlotInput,\n TemplateEndpointKind,\n} from '@bazilion/api-types'\n\nexport const TEAM_POLICY_INTERCHANGE_VERSION = 1 as const\nexport const TEAM_DOCUMENT_KIND = 'bazilion.team-template' as const\nexport const TEAM_POLICY_DOCUMENT_KIND = 'bazilion.team-policy' as const\n\nexport interface TeamTemplateDocument {\n version: 1\n kind: typeof TEAM_DOCUMENT_KIND\n template: { id: string; name: string; userMd: string | null }\n slots: Array<{\n key: string\n profileId: string\n agentName: string\n modelOverride: string | null\n reasoningLevel: ReasoningLevel | null\n layoutPosition: { x: number; y: number } | null\n display: Record<string, unknown> | null\n }>\n edges: Array<{\n sourceKind: TemplateEndpointKind\n sourceKey: string | null\n targetKind: TemplateEndpointKind\n targetKey: string | null\n posture: CommunicationEdgePosture\n }>\n}\n\nexport interface TeamPolicyDocument {\n version: 1\n kind: typeof TEAM_POLICY_DOCUMENT_KIND\n teamId: string\n expectedRevision: number\n edges: TeamPolicyEdgeInput[]\n}\n\nconst reasoning = new Set<ReasoningLevel>(['off', 'minimal', 'low', 'medium', 'high', 'xhigh'])\nconst templateKinds = new Set(['user', 'outside_team', 'slot'])\nconst liveKinds = new Set(['user', 'outside_team', 'agent'])\n\nfunction object(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(`${label} must be an object`)\n return value as Record<string, unknown>\n}\n\nfunction text(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} is required`)\n return value.trim()\n}\n\nfunction nullableText(value: unknown, label: string): string | null {\n if (value === null || value === undefined) return null\n if (typeof value !== 'string') throw new Error(`${label} must be a string or null`)\n return value\n}\n\nfunction endpointKey(kind: string, key: string | null): string {\n return `${kind}:${key ?? '-'}`\n}\n\nexport function exportTeamDocument(detail: TeamTemplateDetail): TeamTemplateDocument {\n const keyById = new Map(detail.slots.map((slot, index) => [slot.slotId, `slot-${index + 1}`]))\n return {\n version: TEAM_POLICY_INTERCHANGE_VERSION,\n kind: TEAM_DOCUMENT_KIND,\n template: {\n id: detail.template.id,\n name: detail.template.name,\n userMd: detail.template.userMd,\n },\n slots: detail.slots.map((slot) => ({\n key: keyById.get(slot.slotId) as string,\n profileId: slot.profileId,\n agentName: slot.agentName,\n modelOverride: slot.modelOverride,\n reasoningLevel: slot.reasoningLevel,\n layoutPosition: slot.layoutPosition,\n display: slot.display,\n })),\n edges: detail.edges.map((edge) => ({\n sourceKind: edge.sourceKind,\n sourceKey: edge.sourceKind === 'slot' ? (keyById.get(edge.sourceId ?? '') ?? null) : null,\n targetKind: edge.targetKind,\n targetKey: edge.targetKind === 'slot' ? (keyById.get(edge.targetId ?? '') ?? null) : null,\n posture: edge.posture,\n })),\n }\n}\n\nexport function parseTeamDocument(value: unknown): TeamTemplateDocument {\n const root = object(value, 'document')\n if (root.version !== TEAM_POLICY_INTERCHANGE_VERSION)\n throw new Error(`unsupported Team Policy document version: ${String(root.version)}`)\n if (root.kind !== TEAM_DOCUMENT_KIND)\n throw new Error(`invalid document kind: expected ${TEAM_DOCUMENT_KIND}`)\n const meta = object(root.template, 'template')\n const rawSlots = Array.isArray(root.slots) ? root.slots : null\n const rawEdges = Array.isArray(root.edges) ? root.edges : null\n if (!rawSlots || !rawEdges) throw new Error('slots and edges must be arrays')\n const keys = new Set<string>()\n const slots = rawSlots.map((raw, index) => {\n const slot = object(raw, `slot ${index}`)\n const key = text(slot.key, `slot ${index} key`)\n if (keys.has(key)) throw new Error(`duplicate slot key: ${key}`)\n keys.add(key)\n const level = slot.reasoningLevel\n if (level !== null && level !== undefined && !reasoning.has(level as ReasoningLevel))\n throw new Error(`slot ${index} has invalid reasoningLevel`)\n const position = slot.layoutPosition\n if (\n position !== null &&\n position !== undefined &&\n (!position ||\n typeof position !== 'object' ||\n Array.isArray(position) ||\n !Number.isFinite((position as { x?: number }).x) ||\n !Number.isFinite((position as { y?: number }).y))\n )\n throw new Error(`slot ${index} has invalid layoutPosition`)\n const display = slot.display\n if (\n display !== null &&\n display !== undefined &&\n (!display || typeof display !== 'object' || Array.isArray(display))\n )\n throw new Error(`slot ${index} has invalid display`)\n return {\n key,\n profileId: text(slot.profileId, `slot ${index} profileId`),\n agentName: text(slot.agentName, `slot ${index} agentName`),\n modelOverride: nullableText(slot.modelOverride, `slot ${index} modelOverride`),\n reasoningLevel: (level as ReasoningLevel | null | undefined) ?? null,\n layoutPosition: (position as { x: number; y: number } | null | undefined) ?? null,\n display: (display as Record<string, unknown> | null | undefined) ?? null,\n }\n })\n const seen = new Set<string>()\n const edges = rawEdges.map((raw, index) => {\n const edge = object(raw, `edge ${index}`)\n if (!templateKinds.has(String(edge.sourceKind)) || !templateKinds.has(String(edge.targetKind)))\n throw new Error(`edge ${index} has invalid endpoint kind`)\n const sourceKind = edge.sourceKind as TemplateEndpointKind\n const targetKind = edge.targetKind as TemplateEndpointKind\n const sourceKey = nullableText(edge.sourceKey, `edge ${index} sourceKey`)\n const targetKey = nullableText(edge.targetKey, `edge ${index} targetKey`)\n const posture: CommunicationEdgePosture | null =\n edge.posture === undefined || edge.posture === 'allow'\n ? 'allow'\n : edge.posture === 'approval_required'\n ? 'approval_required'\n : null\n if (!posture) throw new Error(`edge ${index} has invalid posture`)\n if ((sourceKind === 'slot') !== Boolean(sourceKey))\n throw new Error(`edge ${index} source slot key is missing or invalid`)\n if ((targetKind === 'slot') !== Boolean(targetKey))\n throw new Error(`edge ${index} target slot key is missing or invalid`)\n if (sourceKey && !keys.has(sourceKey))\n throw new Error(`edge ${index} references missing slot ${sourceKey}`)\n if (targetKey && !keys.has(targetKey))\n throw new Error(`edge ${index} references missing slot ${targetKey}`)\n const signature = `${endpointKey(sourceKind, sourceKey)}->${endpointKey(targetKind, targetKey)}`\n if (endpointKey(sourceKind, sourceKey) === endpointKey(targetKind, targetKey))\n throw new Error(`edge ${index} is a self edge`)\n if (seen.has(signature)) throw new Error(`duplicate edge: ${signature}`)\n seen.add(signature)\n return { sourceKind, sourceKey, targetKind, targetKey, posture }\n })\n return {\n version: 1,\n kind: TEAM_DOCUMENT_KIND,\n template: {\n id: text(meta.id, 'template id'),\n name: text(meta.name, 'template name'),\n userMd: nullableText(meta.userMd, 'template userMd'),\n },\n slots,\n edges,\n }\n}\n\nexport function teamImportBody(document: TeamTemplateDocument, existing?: TeamTemplateDetail) {\n const currentByKey = existing\n ? new Map(existing.slots.map((slot, index) => [`slot-${index + 1}`, slot.slotId]))\n : new Map<string, string>()\n const slots: TeamTemplateSlotInput[] = document.slots.map((slot) => ({\n ...(currentByKey.has(slot.key)\n ? { slotId: currentByKey.get(slot.key) }\n : { clientKey: slot.key }),\n profileId: slot.profileId,\n agentName: slot.agentName,\n modelOverride: slot.modelOverride,\n reasoningLevel: slot.reasoningLevel,\n layoutPosition: slot.layoutPosition,\n display: slot.display,\n }))\n const idByKey = new Map(\n slots.map((slot, index) => [\n document.slots[index]?.key as string,\n slot.slotId ?? slot.clientKey ?? null,\n ]),\n )\n const edges: TeamTemplateEdgeInput[] = document.edges.map((edge) => ({\n sourceKind: edge.sourceKind,\n sourceId: edge.sourceKind === 'slot' ? idByKey.get(edge.sourceKey ?? '') : null,\n targetKind: edge.targetKind,\n targetId: edge.targetKind === 'slot' ? idByKey.get(edge.targetKey ?? '') : null,\n posture: edge.posture,\n }))\n return { slots, edges }\n}\n\nexport function parseTeamPolicyDocument(value: unknown): TeamPolicyDocument {\n const root = object(value, 'document')\n if (root.version !== 1)\n throw new Error(`unsupported Team Policy document version: ${String(root.version)}`)\n if (root.kind !== TEAM_POLICY_DOCUMENT_KIND)\n throw new Error(`invalid document kind: expected ${TEAM_POLICY_DOCUMENT_KIND}`)\n if (!Number.isInteger(root.expectedRevision) || Number(root.expectedRevision) < 1)\n throw new Error('expectedRevision must be a positive integer')\n if (!Array.isArray(root.edges)) throw new Error('edges must be an array')\n const seen = new Set<string>()\n const edges = root.edges.map((raw, index) => {\n const edge = object(raw, `edge ${index}`)\n if (!liveKinds.has(String(edge.sourceKind)) || !liveKinds.has(String(edge.targetKind)))\n throw new Error(`edge ${index} has invalid endpoint kind`)\n const sourceKind = edge.sourceKind as TeamPolicyEdgeInput['sourceKind']\n const targetKind = edge.targetKind as TeamPolicyEdgeInput['targetKind']\n const sourceId = nullableText(edge.sourceId, `edge ${index} sourceId`)\n const targetId = nullableText(edge.targetId, `edge ${index} targetId`)\n if (\n (sourceKind === 'agent') !== Boolean(sourceId) ||\n (targetKind === 'agent') !== Boolean(targetId)\n )\n throw new Error(`edge ${index} Agent id is missing or invalid`)\n const signature = `${endpointKey(sourceKind, sourceId)}->${endpointKey(targetKind, targetId)}`\n if (endpointKey(sourceKind, sourceId) === endpointKey(targetKind, targetId))\n throw new Error(`edge ${index} is a self edge`)\n if (seen.has(signature)) throw new Error(`duplicate edge: ${signature}`)\n seen.add(signature)\n return { sourceKind, sourceId, targetKind, targetId }\n })\n return {\n version: 1,\n kind: TEAM_POLICY_DOCUMENT_KIND,\n teamId: text(root.teamId, 'teamId'),\n expectedRevision: Number(root.expectedRevision),\n edges,\n }\n}\n\nexport function exportTeamPolicy(\n teamId: string,\n revision: number,\n edges: TeamPolicyEdge[],\n): TeamPolicyDocument {\n return {\n version: 1,\n kind: TEAM_POLICY_DOCUMENT_KIND,\n teamId,\n expectedRevision: revision,\n edges: edges.map(({ sourceKind, sourceId, targetKind, targetId, posture }) => ({\n sourceKind,\n sourceId,\n targetKind,\n targetId,\n posture,\n })),\n }\n}\n\nexport function edgeDiff(\n before: Array<{\n sourceKind: string\n sourceId?: string | null\n targetKind: string\n targetId?: string | null\n posture?: CommunicationEdgePosture\n }>,\n after: Array<{\n sourceKind: string\n sourceId?: string | null\n targetKind: string\n targetId?: string | null\n posture?: CommunicationEdgePosture\n }>,\n) {\n const signature = (edge: (typeof before)[number]) =>\n `${endpointKey(edge.sourceKind, edge.sourceId ?? null)} -> ${endpointKey(edge.targetKind, edge.targetId ?? null)} [${edge.posture ?? 'allow'}]`\n const left = new Set(before.map(signature))\n const right = new Set(after.map(signature))\n return {\n added: [...right].filter((value) => !left.has(value)).sort(),\n removed: [...left].filter((value) => !right.has(value)).sort(),\n }\n}\n","import { readFileSync } from 'node:fs'\nimport type {\n PutTeamTemplateDefinitionRequest,\n TeamTemplateDetail,\n TeamTemplateWithCount,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { ApiClientError, createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport {\n edgeDiff,\n exportTeamDocument,\n parseTeamDocument,\n teamImportBody,\n} from '../team-interchange.ts'\n\nfunction jsonFile(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as unknown\n } catch (error) {\n throw new Error(`invalid JSON: ${(error as Error).message}`)\n }\n}\n\nfunction printTeam(detail: TeamTemplateDetail): void {\n console.log(`# ${detail.template.id} — ${detail.template.name}`)\n console.log(`revision: ${detail.template.currentRevision}`)\n console.log(`slots: ${detail.slots.length}`)\n console.log(`edges: ${detail.edges.length}`)\n if (detail.slots.length) {\n console.log('')\n for (const line of columnize([\n ['slot', 'profile', 'Agent name', 'model', 'reasoning'],\n ...detail.slots.map((slot, index) => [\n String(index + 1),\n slot.profileId,\n slot.agentName,\n slot.modelOverride ?? '-',\n slot.reasoningLevel ?? '-',\n ]),\n ]))\n console.log(line)\n }\n}\n\nconst list = defineCommand({\n meta: { name: 'list', description: 'List canonical Team templates' },\n args: { json: { type: 'boolean', description: 'Emit stable JSON' } },\n async run({ args }) {\n const rows = await createClient().get<TeamTemplateWithCount[]>('/api/team-templates')\n if (args.json) return console.log(JSON.stringify(rows, null, 2))\n if (!rows.length) return console.log('(no Team templates)')\n for (const line of columnize([\n ['id', 'revision', 'slots', 'name'],\n ...rows.map((row) => [row.id, String(row.currentRevision), String(row.slotCount), row.name]),\n ]))\n console.log(line)\n },\n})\n\nconst show = defineCommand({\n meta: { name: 'show', description: 'Show a canonical Team template' },\n args: {\n id: { type: 'positional', required: true },\n json: { type: 'boolean', description: 'Emit the canonical API aggregate' },\n },\n async run({ args }) {\n const detail = await createClient().get<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(args.id)}`,\n )\n if (args.json) console.log(JSON.stringify(detail, null, 2))\n else printTeam(detail)\n },\n})\n\nconst exportCommand = defineCommand({\n meta: {\n name: 'export',\n description: 'Export a portable versioned Team-template document to stdout',\n },\n args: { id: { type: 'positional', required: true } },\n async run({ args }) {\n const detail = await createClient().get<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(args.id)}`,\n )\n console.log(JSON.stringify(exportTeamDocument(detail), null, 2))\n },\n})\n\nfunction printImportDiff(\n current: TeamTemplateDetail | null,\n document: ReturnType<typeof parseTeamDocument>,\n): void {\n const before = current ? exportTeamDocument(current) : null\n console.log(`Team: ${current ? current.template.id : '(new)'} -> ${document.template.id}`)\n console.log(`Roster: ${current?.slots.length ?? 0} -> ${document.slots.length}`)\n const previousSlots = new Map(before?.slots.map((slot) => [slot.key, slot]) ?? [])\n const nextSlots = new Map(document.slots.map((slot) => [slot.key, slot]))\n for (const [key, slot] of nextSlots) {\n const previous = previousSlots.get(key)\n if (!previous) console.log(` + ${key}: ${slot.profileId} / ${slot.agentName}`)\n else if (JSON.stringify(previous) !== JSON.stringify(slot))\n console.log(\n ` ~ ${key}: ${previous.profileId} / ${previous.agentName} -> ${slot.profileId} / ${slot.agentName}`,\n )\n }\n for (const [key, slot] of previousSlots)\n if (!nextSlots.has(key)) console.log(` - ${key}: ${slot.profileId} / ${slot.agentName}`)\n const toEdge = (edge: (typeof document.edges)[number]) => ({\n sourceKind: edge.sourceKind,\n sourceId: edge.sourceKey,\n targetKind: edge.targetKind,\n targetId: edge.targetKey,\n })\n const diff = edgeDiff(before?.edges.map(toEdge) ?? [], document.edges.map(toEdge))\n console.log(`Edges: +${diff.added.length} -${diff.removed.length}`)\n for (const value of diff.added) console.log(` + ${value}`)\n for (const value of diff.removed) console.log(` - ${value}`)\n}\n\nconst importCommand = defineCommand({\n meta: {\n name: 'import',\n description: 'Validate, diff, and explicitly apply a portable Team-template document',\n },\n args: {\n file: { type: 'positional', required: true, description: 'JSON document path' },\n 'dry-run': { type: 'boolean', description: 'Validate and print the resolved diff only' },\n apply: { type: 'boolean', description: 'Apply non-interactively after printing the diff' },\n 'expected-revision': {\n type: 'string',\n description: 'Required current revision when replacing an existing Team',\n },\n force: {\n type: 'boolean',\n description: 'Refetch current revision; requires --apply and still uses optimistic locking',\n },\n 'confirm-current-revision': {\n type: 'string',\n description: 'Second force confirmation: the freshly displayed current revision',\n },\n },\n async run({ args }) {\n if (args.force && !args.apply)\n throw new Error('--force requires --apply (interactive force is intentionally unsupported)')\n const document = parseTeamDocument(jsonFile(args.file))\n const client = createClient()\n let current: TeamTemplateDetail | null = null\n try {\n current = await client.get<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(document.template.id)}`,\n )\n } catch (error) {\n if (!(error instanceof ApiClientError) || error.status !== 404) throw error\n }\n printImportDiff(current, document)\n if (args['dry-run']) {\n console.log('valid: no changes applied')\n return\n }\n if (!args.apply) throw new Error('refusing mutation: review the diff, then pass --apply')\n if (!current) {\n const body = teamImportBody(document)\n const created = await client.post<TeamTemplateDetail>('/api/team-templates/import', {\n id: document.template.id,\n name: document.template.name,\n userMd: document.template.userMd,\n slots: document.slots.map((slot, index) => ({\n ...body.slots[index],\n clientKey: slot.key,\n })),\n edges: body.edges,\n })\n console.log(\n `created Team ${created.template.id} at revision ${created.template.currentRevision}`,\n )\n return\n }\n if (\n document.template.name !== current.template.name ||\n document.template.userMd !== current.template.userMd\n )\n throw new Error(\n 'replacement document metadata differs; update Team name/USER.md separately before import',\n )\n const supplied = Number.parseInt(args['expected-revision'] ?? '', 10)\n const expectedRevision = args.force ? current.template.currentRevision : supplied\n if (\n args.force &&\n Number.parseInt(args['confirm-current-revision'] ?? '', 10) !==\n current.template.currentRevision\n )\n throw new Error(\n `--force requires --confirm-current-revision ${current.template.currentRevision} after reviewing the fresh diff`,\n )\n if (!Number.isInteger(expectedRevision) || expectedRevision < 1)\n throw new Error('--expected-revision is required when replacing an existing Team')\n const definition = teamImportBody(document, current)\n const body: PutTeamTemplateDefinitionRequest = { expectedRevision, ...definition }\n const updated = await client.put<TeamTemplateDetail>(\n `/api/team-templates/${encodeURIComponent(document.template.id)}/definition`,\n body,\n )\n console.log(\n `updated Team ${updated.template.id} to revision ${updated.template.currentRevision}`,\n )\n },\n})\n\nexport const teamTemplateCommand = defineCommand({\n meta: {\n name: 'team-template',\n description: 'Inspect and exchange canonical Team templates',\n },\n subCommands: { list, show, export: exportCommand, import: importCommand },\n})\n","// `bazilion telegram` — Step 1 surface. Wires the same two endpoints the\n// web UI calls (config set/clear + health). Future steps grow this tree\n// with bind, adopt, setup, etc.\n\nimport type {\n Agent,\n TelegramAllowedUser,\n TelegramBindResponse,\n TelegramConfigState,\n TelegramHealth,\n TelegramPairingChallenge,\n TelegramPairingStatus,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\n\nconst setCmd = defineCommand({\n meta: {\n name: 'set',\n description: 'Save bot token + supergroup chat ID (paired write)',\n },\n args: {\n token: { type: 'string', required: true, description: 'Bot token from @BotFather' },\n chat: { type: 'string', required: true, description: 'Numeric supergroup chat ID' },\n },\n async run({ args }) {\n const client = createClient()\n const state = await client.put<TelegramConfigState>('/api/config/telegram', {\n botToken: args.token,\n chatId: args.chat,\n })\n console.log(`saved · token ${state.botTokenPreview} · chat ${state.chatId}`)\n },\n})\n\nconst clearCmd = defineCommand({\n meta: {\n name: 'clear',\n description: 'Remove stored bot token + chat ID',\n },\n async run() {\n const client = createClient()\n await client.del('/api/config/telegram')\n console.log('cleared')\n },\n})\n\nconst showCmd = defineCommand({\n meta: {\n name: 'show',\n description: 'Show what credentials are stored (token is masked)',\n },\n async run() {\n const client = createClient()\n const state = await client.get<TelegramConfigState>('/api/config/telegram')\n if (!state.configured) {\n console.log('(no credentials saved — run `bazilion telegram config set --token … --chat …`)')\n return\n }\n console.log(`token: ${state.botTokenPreview}`)\n console.log(`chat: ${state.chatId}`)\n if (state.migratedChatId) {\n console.log(\n `⚠ supergroup migrated → ${state.migratedChatId}. Run \\`bazilion telegram reconnect\\` to apply.`,\n )\n }\n },\n})\n\nconst reconnectCmd = defineCommand({\n meta: {\n name: 'reconnect',\n description: 'Apply a pending supergroup chat-id migration + re-activate the bot',\n },\n async run() {\n const client = createClient()\n const state = await client.post<TelegramConfigState>('/api/config/telegram/reconnect')\n console.log(`reconnected · chat ${state.chatId}`)\n },\n})\n\nconst configCmd = defineCommand({\n meta: {\n name: 'config',\n description: 'Manage Telegram credentials (bot token + chat ID)',\n },\n subCommands: {\n set: setCmd,\n clear: clearCmd,\n show: showCmd,\n },\n})\n\nconst healthCmd = defineCommand({\n meta: {\n name: 'health',\n description: 'Run the four-step preflight against the Telegram Bot API',\n },\n async run() {\n const client = createClient()\n const h = await client.get<TelegramHealth>('/api/config/telegram/health')\n if (!h.configured) {\n console.log('not configured — run `bazilion telegram config set` first')\n process.exitCode = 1\n return\n }\n if (h.error) {\n console.error(`error at ${h.error.step}: ${h.error.message}`)\n process.exitCode = 1\n return\n }\n if (!h.preflight) {\n console.error('preflight returned no data')\n process.exitCode = 1\n return\n }\n const p = h.preflight\n const line = (ok: boolean, label: string, detail: string): string =>\n `${ok ? '✓' : '✕'} ${label.padEnd(30)} ${detail}`\n console.log(line(p.botUsername.length > 0, 'bot identity', `@${p.botUsername}`))\n console.log(line(p.chatTitle.length > 0, 'supergroup reachable', p.chatTitle))\n console.log(line(p.isForum, 'forum topics enabled', String(p.isForum)))\n console.log(line(p.hasManageTopics, 'can_manage_topics', String(p.hasManageTopics)))\n console.log(line(p.privacyModeOff, 'Privacy Mode is OFF', String(p.privacyModeOff)))\n console.log(line(p.chatIsPrivate, 'supergroup is private', String(p.chatIsPrivate)))\n console.log(line(p.memberCount === 2, 'one owner + bot', String(p.memberCount ?? 'unknown')))\n if (p.ownerPresent !== null) {\n console.log(line(p.ownerPresent, 'paired owner is present', String(p.ownerPresent)))\n }\n const allOk =\n p.botUsername.length > 0 &&\n p.chatTitle.length > 0 &&\n p.isForum &&\n p.hasManageTopics &&\n p.privacyModeOff &&\n p.chatIsPrivate &&\n p.memberCount === 2 &&\n p.ownerPresent !== false\n if (!allOk) process.exitCode = 1\n },\n})\n\nconst botStatusCmd = defineCommand({\n meta: {\n name: 'status',\n description: 'Show polling state of the live bot',\n },\n async run() {\n const client = createClient()\n const h = await client.get<TelegramHealth>('/api/config/telegram/health')\n if (!h.polling) {\n console.log('bot: not running')\n process.exitCode = 1\n return\n }\n const p = h.polling\n const startedAt = p.startedAt ? new Date(p.startedAt).toISOString() : '(never)'\n const lastPoll = p.lastSuccessfulPollAt\n ? new Date(p.lastSuccessfulPollAt).toISOString()\n : '(never)'\n console.log(`running: ${p.running}`)\n console.log(`activated: ${p.activated}`)\n console.log(`started at: ${startedAt}`)\n console.log(`last update id: ${p.lastUpdateId ?? '(none)'}`)\n console.log(`last successful: ${lastPoll}`)\n if (p.error) console.log(`error: ${p.error}`)\n if (!p.running) process.exitCode = 1\n },\n})\n\nconst botRestartCmd = defineCommand({\n meta: {\n name: 'restart',\n description: 'Force-restart the bot (tears down + brings up from current creds)',\n },\n async run() {\n const client = createClient()\n await client.post('/api/config/telegram/restart')\n console.log('restart requested')\n },\n})\n\nconst botCmd = defineCommand({\n meta: {\n name: 'bot',\n description: 'Inspect / control the live polling bot',\n },\n subCommands: {\n status: botStatusCmd,\n restart: botRestartCmd,\n },\n})\n\nconst bindCmd = defineCommand({\n meta: {\n name: 'bind',\n description: 'Create a Telegram topic for an agent (manual fallback for /talk)',\n },\n args: {\n agent: { type: 'positional', required: true, description: 'Agent id or prefix' },\n },\n async run({ args }) {\n const client = createClient()\n const result = await client.post<TelegramBindResponse>(\n `/api/agents/${args.agent}/telegram/bind`,\n )\n const verb = result.created ? 'created topic' : 'already bound to'\n console.log(`${verb} #${result.topicId} for agent ${result.agent.name} (${result.agent.id})`)\n console.log(` ${result.deepLink}`)\n },\n})\n\nconst unbindCmd = defineCommand({\n meta: {\n name: 'unbind',\n description: \"Clear an agent's Telegram topic binding (topic stays in Telegram as orphan)\",\n },\n args: {\n agent: { type: 'positional', required: true, description: 'Agent id or prefix' },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/agents/${args.agent}/telegram/binding`)\n console.log(`unbound agent ${args.agent}`)\n },\n})\n\nconst listBindingsCmd = defineCommand({\n meta: {\n name: 'list',\n description: 'List agents and their Telegram topic bindings',\n },\n async run() {\n const client = createClient()\n const agents = await client.get<Agent[]>('/api/agents')\n const bound = agents.filter((a) => a.telegramTopicId !== null)\n const unbound = agents.filter((a) => a.telegramTopicId === null)\n if (bound.length === 0 && unbound.length === 0) {\n console.log('(no agents)')\n return\n }\n if (bound.length > 0) {\n console.log('bound:')\n for (const a of bound) {\n console.log(` #${a.telegramTopicId}\\t${a.name}\\t(team: ${a.teamId})`)\n }\n }\n if (unbound.length > 0) {\n console.log('unbound:')\n for (const a of unbound) {\n console.log(` —\\t${a.name}\\t(team: ${a.teamId})`)\n }\n }\n },\n})\n\nconst allowCmd = defineCommand({\n meta: { name: 'allow', description: 'Add a Telegram user id to the allowlist' },\n args: {\n userId: { type: 'positional', required: true, description: 'Numeric Telegram user id' },\n label: { type: 'string', description: 'Optional human label' },\n },\n async run({ args }) {\n const client = createClient()\n const u = await client.post<TelegramAllowedUser>('/api/config/telegram/acl', {\n userId: Number(args.userId),\n label: args.label ?? null,\n role: 'member',\n })\n console.log(`allowed ${u.userId} (${u.role})`)\n },\n})\n\nconst denyCmd = defineCommand({\n meta: { name: 'deny', description: 'Remove a Telegram user id from the allowlist' },\n args: { userId: { type: 'positional', required: true } },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/config/telegram/acl/${Number(args.userId)}`)\n console.log(`removed ${args.userId}`)\n },\n})\n\nconst allowedCmd = defineCommand({\n meta: { name: 'allowed', description: 'List allowlisted Telegram users' },\n async run() {\n const client = createClient()\n const users = await client.get<TelegramAllowedUser[]>('/api/config/telegram/acl')\n if (users.length === 0) {\n console.log('(allowlist empty — unpaired and closed)')\n return\n }\n for (const u of users) {\n const who = u.label ?? (u.username ? `@${u.username}` : '—')\n console.log(`${u.userId}\\t${u.role}\\t${who}`)\n }\n },\n})\n\nconst pairingCreateCmd = defineCommand({\n meta: { name: 'create', description: 'Generate a one-time Telegram owner pairing code' },\n async run() {\n const result = await createClient().post<TelegramPairingChallenge>(\n '/api/config/telegram/pairing/challenge',\n )\n console.log(`pairing code: ${result.code}`)\n console.log(`expires: ${new Date(result.expiresAt).toISOString()}`)\n console.log('send `/pair <code>` in the configured ⚙ bazilion service topic')\n },\n})\n\nconst pairingStatusCmd = defineCommand({\n meta: { name: 'status', description: 'Show Telegram owner pairing status' },\n async run() {\n const result = await createClient().get<TelegramPairingStatus>('/api/config/telegram/pairing')\n console.log(`paired: ${result.paired}`)\n console.log(`owner: ${result.ownerUserId ?? '(none)'}`)\n console.log(`challenge active: ${result.challengeActive}`)\n if (result.challengeExpiresAt)\n console.log(`expires: ${new Date(result.challengeExpiresAt).toISOString()}`)\n },\n})\n\nconst pairingCancelCmd = defineCommand({\n meta: { name: 'cancel', description: 'Cancel the active Telegram pairing code' },\n async run() {\n await createClient().del('/api/config/telegram/pairing/challenge')\n console.log('pairing challenge cancelled')\n },\n})\n\nconst pairingResetCmd = defineCommand({\n meta: { name: 'reset', description: 'Revoke the Telegram owner and require re-pairing' },\n args: {\n yes: { type: 'boolean', description: 'Confirm destructive owner reset', required: true },\n },\n async run({ args }) {\n if (!args.yes) throw new Error('--yes is required')\n await createClient().post('/api/config/telegram/pairing/reset', { confirm: true })\n console.log('Telegram owner reset; ingress is closed until re-paired')\n },\n})\n\nconst pairingCmd = defineCommand({\n meta: { name: 'pairing', description: 'Manage single-owner Telegram pairing' },\n subCommands: {\n create: pairingCreateCmd,\n status: pairingStatusCmd,\n cancel: pairingCancelCmd,\n reset: pairingResetCmd,\n },\n})\n\nexport const telegramCommand = defineCommand({\n meta: {\n name: 'telegram',\n description: 'Telegram integration: credentials, health, bot lifecycle, bindings, access',\n },\n subCommands: {\n config: configCmd,\n health: healthCmd,\n bot: botCmd,\n reconnect: reconnectCmd,\n bind: bindCmd,\n unbind: unbindCmd,\n list: listBindingsCmd,\n allow: allowCmd,\n deny: denyCmd,\n allowed: allowedCmd,\n pairing: pairingCmd,\n },\n})\n","import type {\n CreateTokenRequest,\n CreateTokenResponse,\n ListTokensResponse,\n WebToken,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport qrcode from 'qrcode-terminal'\nimport { readAuthFile } from '../auth-file.ts'\nimport { createClient, loadClientConfig } from '../client.ts'\nimport { columnize } from '../columnize.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\nfunction tokenRow(t: WebToken): string[] {\n const last = t.lastUsedAt ? new Date(t.lastUsedAt).toISOString() : '(never)'\n const expired = t.expiresAt !== null && t.expiresAt <= Date.now()\n const state = t.revokedAt ? 'revoked' : expired ? 'expired' : 'active'\n const expires = t.expiresAt ? new Date(t.expiresAt).toISOString() : '(never)'\n return [t.id, t.kind, state, t.label, `expires: ${expires}`, `last: ${last}`]\n}\n\nfunction resolveQrServer(override: string | undefined): string {\n const raw = override ?? loadClientConfig().serverUrl\n const url = new URL(raw)\n const loopback = ['127.0.0.1', 'localhost', '[::1]', '::1'].includes(url.hostname)\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {\n throw new Error('pairing server must use HTTPS (HTTP is allowed only for loopback development)')\n }\n if (url.username || url.password || url.pathname !== '/' || url.search || url.hash) {\n throw new Error(\n 'pairing server must be an exact origin without credentials, path, query, or fragment',\n )\n }\n const cfg = loadClientConfig()\n if (loopback && !override && new URL(cfg.serverUrl).hostname === url.hostname) {\n throw new Error(\n 'server URL is loopback-only. Pass --server https://<private-tailnet-host> for mobile pairing.',\n )\n }\n return url.origin\n}\n\nconst createCmd = defineCommand({\n meta: { name: 'create', description: 'Mint a new web token (shown once)' },\n args: {\n label: { type: 'positional', required: true, description: 'Human-readable label' },\n qr: {\n type: 'boolean',\n description: 'Also render a pairing QR code for mobile clients (bazilion://pair?...)',\n },\n server: {\n type: 'string',\n description:\n 'Server URL to embed in the pairing QR (default: detect LAN IP; ignored without --qr)',\n },\n expiresDays: {\n type: 'string',\n description: 'Device lifetime in days (default 90, maximum 365)',\n },\n },\n async run({ args }) {\n const client = createClient()\n const expiresInDays = args.expiresDays === undefined ? undefined : Number(args.expiresDays)\n if (expiresInDays !== undefined && !Number.isInteger(expiresInDays)) {\n throw new Error('--expires-days must be an integer')\n }\n const body: CreateTokenRequest = { label: args.label, expiresInDays }\n const res = await client.post<CreateTokenResponse>('/api/tokens', body)\n console.log(`id: ${res.meta.id}`)\n console.log(`label: ${res.meta.label}`)\n console.log(`kind: ${res.meta.kind}`)\n console.log(\n `expires: ${res.meta.expiresAt ? new Date(res.meta.expiresAt).toISOString() : '(never)'}`,\n )\n console.log(`token: ${res.token}`)\n console.log('')\n console.log('store the token now — it is not recoverable later.')\n\n if (!args.qr) return\n\n const serverUrl = resolveQrServer(args.server)\n const pairUrl = `bazilion://pair?server=${encodeURIComponent(serverUrl)}&token=${encodeURIComponent(res.token)}`\n console.log('')\n console.log(`pairing URL: ${pairUrl}`)\n console.log('')\n qrcode.generate(pairUrl, { small: true }, (qr) => console.log(qr))\n },\n})\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List web tokens' },\n args: {\n all: { type: 'boolean', description: 'Include revoked tokens' },\n },\n async run({ args }) {\n const client = createClient()\n const qs = args.all ? '?includeRevoked=1' : ''\n const { tokens } = await client.get<ListTokensResponse>(`/api/tokens${qs}`)\n if (tokens.length === 0) {\n console.log('(no tokens)')\n return\n }\n for (const line of columnize(tokens.map(tokenRow))) console.log(line)\n },\n})\n\nconst showLocalCmd = defineCommand({\n meta: {\n name: 'show-local',\n description: 'Print the bootstrap web token stored in ~/.bazilion/auth.json',\n },\n run() {\n const paths = resolveCliPaths()\n console.log(readAuthFile(paths.authFile).token)\n },\n})\n\nconst revokeCmd = defineCommand({\n meta: { name: 'revoke', description: 'Revoke a web token' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/tokens/${args.id}`)\n console.log(`revoked token ${args.id}`)\n },\n})\n\nexport const tokenCommand = defineCommand({\n meta: { name: 'token', description: 'Manage web tokens for API/CLI clients' },\n subCommands: {\n create: createCmd,\n list: listCmd,\n revoke: revokeCmd,\n 'show-local': showLocalCmd,\n },\n})\n","import type {\n AgentTrigger,\n CreateTriggerRequest,\n CreateTriggerResponse,\n ListTriggerDispatchesResponse,\n ListTriggersResponse,\n UpdateTriggerRequest,\n} from '@bazilion/api-types'\nimport { defineCommand } from 'citty'\nimport { createClient } from '../client.ts'\nimport { columnize } from '../columnize.ts'\n\nconst addCmd = defineCommand({\n meta: { name: 'add', description: 'Add an interval / cron trigger to an agent' },\n args: {\n agent: { type: 'positional', required: true },\n every: {\n type: 'string',\n description: 'Interval in seconds (e.g. --every 300 = every 5 minutes)',\n },\n cron: {\n type: 'string',\n description: 'Cron expression (5 fields: minute hour dom month dow)',\n },\n message: {\n type: 'string',\n required: true,\n description: 'Message to inject when the trigger fires',\n },\n disabled: { type: 'boolean', description: 'Create in disabled state' },\n },\n async run({ args }) {\n if (!args.every === !args.cron) {\n throw new Error('specify exactly one of --every <seconds> or --cron \"<expr>\"')\n }\n const client = createClient()\n const body: CreateTriggerRequest = args.every\n ? {\n kind: 'interval',\n intervalSec: Number(args.every),\n message: args.message,\n enabled: !args.disabled,\n }\n : {\n kind: 'cron',\n cronExpr: args.cron as string,\n message: args.message,\n enabled: !args.disabled,\n }\n const res = await client.post<CreateTriggerResponse>(`/api/agents/${args.agent}/triggers`, body)\n const t = res.trigger\n const spec = t.kind === 'interval' ? `every ${t.intervalSec}s` : `cron \"${t.cronExpr}\"`\n console.log(`${t.id}\\t${spec}\\t${t.enabled ? 'enabled' : 'disabled'}`)\n },\n})\n\nfunction triggerRow(t: AgentTrigger): string[] {\n const spec = t.kind === 'interval' ? `every ${t.intervalSec}s` : `cron \"${t.cronExpr}\"`\n const last = t.lastFiredAt ? new Date(t.lastFiredAt).toISOString() : '(never)'\n const state = t.enabled ? 'enabled' : 'disabled'\n const msgPreview = t.message.length > 60 ? `${t.message.slice(0, 60)}…` : t.message\n return [t.id, state, spec, `last: ${last}`, `\"${msgPreview}\"`]\n}\n\nconst listCmd = defineCommand({\n meta: { name: 'list', description: 'List triggers for an agent' },\n args: {\n agent: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const { triggers } = await client.get<ListTriggersResponse>(\n `/api/agents/${args.agent}/triggers`,\n )\n if (triggers.length === 0) {\n console.log('(no triggers)')\n return\n }\n for (const line of columnize(triggers.map(triggerRow))) console.log(line)\n },\n})\n\nconst rmCmd = defineCommand({\n meta: { name: 'rm', description: 'Delete a trigger' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n await client.del(`/api/triggers/${args.id}`)\n console.log(`removed trigger ${args.id}`)\n },\n})\n\nconst enableCmd = defineCommand({\n meta: { name: 'enable', description: 'Enable a trigger' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const body: UpdateTriggerRequest = { enabled: true }\n await client.patch(`/api/triggers/${args.id}`, body)\n console.log(`enabled trigger ${args.id}`)\n },\n})\n\nconst disableCmd = defineCommand({\n meta: { name: 'disable', description: 'Disable a trigger' },\n args: {\n id: { type: 'positional', required: true },\n },\n async run({ args }) {\n const client = createClient()\n const body: UpdateTriggerRequest = { enabled: false }\n await client.patch(`/api/triggers/${args.id}`, body)\n console.log(`disabled trigger ${args.id}`)\n },\n})\n\nconst historyCmd = defineCommand({\n meta: { name: 'history', description: 'Show recent dispatches for a trigger' },\n args: {\n id: { type: 'positional', required: true },\n limit: { type: 'string', description: 'Maximum rows (default 20)' },\n },\n async run({ args }) {\n const limit = args.limit ? Number(args.limit) : 20\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error('--limit must be an integer from 1 to 100')\n }\n const client = createClient()\n const { dispatches } = await client.get<ListTriggerDispatchesResponse>(\n `/api/triggers/${args.id}/dispatches?limit=${limit}`,\n )\n if (dispatches.length === 0) {\n console.log('(no dispatches)')\n return\n }\n const rows = dispatches.map((dispatch) => [\n new Date(dispatch.scheduledAt).toISOString(),\n dispatch.status,\n `attempts: ${dispatch.attemptCount}`,\n dispatch.lastError ?? '',\n ])\n for (const line of columnize(rows)) console.log(line)\n },\n})\n\nexport const triggerCommand = defineCommand({\n meta: { name: 'trigger', description: 'Manage scheduled agent triggers' },\n subCommands: {\n add: addCmd,\n list: listCmd,\n rm: rmCmd,\n enable: enableCmd,\n disable: disableCmd,\n history: historyCmd,\n },\n})\n","import { existsSync, lstatSync, readdirSync, realpathSync, rmSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { isAbsolute, join, parse, relative, resolve, sep } from 'node:path'\nimport { defineCommand } from 'citty'\nimport { acquireHomeRestoreLock } from '../daemon-liveness.ts'\nimport { resolveCliPaths } from '../paths.ts'\n\n// Line-buffered stdin reader. `node:readline/promises` drops data after EOF\n// on piped input (a known Node quirk with back-to-back `question()` calls),\n// so we read chunks ourselves and emit one line per call.\nfunction makeLineReader(): () => Promise<string> {\n let buffer = ''\n let ended = false\n const queue: ((line: string) => void)[] = []\n\n const tryDeliver = (): void => {\n while (queue.length > 0) {\n const nlIdx = buffer.indexOf('\\n')\n if (nlIdx === -1) {\n if (ended) {\n const resolve = queue.shift()\n resolve?.(buffer)\n buffer = ''\n } else {\n return\n }\n } else {\n const line = buffer.slice(0, nlIdx)\n buffer = buffer.slice(nlIdx + 1)\n const resolve = queue.shift()\n resolve?.(line)\n }\n }\n }\n\n process.stdin.setEncoding('utf8')\n process.stdin.on('data', (chunk) => {\n buffer += chunk\n tryDeliver()\n })\n process.stdin.on('end', () => {\n ended = true\n tryDeliver()\n })\n\n return () =>\n new Promise<string>((resolve) => {\n queue.push(resolve)\n tryDeliver()\n })\n}\n\nasync function askYes(readLine: () => Promise<string>, prompt: string): Promise<boolean> {\n process.stdout.write(`${prompt} [y/N] `)\n const answer = (await readLine()).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n}\n\nfunction removePath(p: string): boolean {\n try {\n // Unlike existsSync(), lstatSync() sees dangling symlinks. Managed Team\n // and legacy Group slots may be symlinks; rmSync unlinks the slot without\n // traversing into or deleting its external target.\n lstatSync(p)\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') return false\n throw error\n }\n rmSync(p, { recursive: true, force: true })\n return true\n}\n\nfunction canonicalExistingPath(path: string): string {\n try {\n return realpathSync.native(path)\n } catch (error) {\n if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) throw error\n return resolve(path)\n }\n}\n\nfunction containsPath(container: string, candidate: string): boolean {\n const nested = relative(container, candidate)\n return nested === '' || (nested !== '..' && !nested.startsWith(`..${sep}`) && !isAbsolute(nested))\n}\n\nexport function assertSafeUninstallHome(home: string): string {\n const target = resolve(home)\n const canonical = canonicalExistingPath(target)\n const userHome = canonicalExistingPath(homedir())\n const workingDirectory = canonicalExistingPath(process.cwd())\n const exactForbidden = new Map<string, string>([\n [parse(canonical).root, 'filesystem root'],\n [userHome, 'user home directory'],\n [workingDirectory, 'current working directory'],\n ])\n const reason = exactForbidden.get(canonical)\n if (reason) throw new Error(`refusing to uninstall from ${reason}: ${target}`)\n if (containsPath(canonical, userHome)) {\n throw new Error(`refusing to uninstall from an ancestor of the user home directory: ${target}`)\n }\n if (containsPath(canonical, workingDirectory)) {\n throw new Error(\n `refusing to uninstall from an ancestor of the current working directory: ${target}`,\n )\n }\n return target\n}\n\nexport const uninstallCommand = defineCommand({\n meta: {\n name: 'uninstall',\n description: 'Wipe bazilion state from ~/.bazilion (or BAZILION_HOME)',\n },\n args: {\n home: { type: 'string', description: 'Override BAZILION_HOME' },\n yes: {\n type: 'boolean',\n description: 'Skip confirmations (reset tier only unless --all is set)',\n },\n all: {\n type: 'boolean',\n description: 'Also remove logs and skills (full wipe)',\n },\n },\n async run({ args }) {\n const paths = resolveCliPaths(args.home)\n const targetHome = assertSafeUninstallHome(paths.home)\n const dbFile = join(targetHome, 'bazilion.db')\n const profilesDir = join(targetHome, 'profiles')\n const agentsDir = join(targetHome, 'agents')\n const teamsDir = join(targetHome, 'teams')\n const legacyGroupsDir = join(targetHome, 'groups')\n const skillsDir = join(targetHome, 'skills')\n const logsDir = join(targetHome, 'logs')\n const legacyConfigFile = join(targetHome, 'config.json')\n const legacySecretsFile = join(targetHome, 'secrets.enc')\n\n if (!existsSync(targetHome)) {\n // A full wipe can remove the home and then be interrupted before its\n // sibling ownership record is released. Acquire the same operation so a\n // retry can reclaim that dead marker instead of leaving the home\n // permanently blocked from daemon startup and restore.\n const uninstallLock = await acquireHomeRestoreLock(targetHome, 'uninstalling')\n try {\n console.log(`nothing to remove: ${targetHome} does not exist`)\n uninstallLock.markUninstallComplete()\n } finally {\n uninstallLock.release()\n }\n return\n }\n const homeIsSymlink = lstatSync(targetHome).isSymbolicLink()\n\n console.log(`about to uninstall bazilion at ${targetHome}`)\n console.log('')\n\n const resetTargets = [\n dbFile,\n `${dbFile}-wal`,\n `${dbFile}-shm`,\n `${dbFile}-journal`,\n join(targetHome, 'auth.json'),\n legacyConfigFile,\n legacySecretsFile,\n profilesDir,\n agentsDir,\n teamsDir,\n legacyGroupsDir,\n ]\n\n const needsPrompt = !args.yes\n const readLine = needsPrompt ? makeLineReader() : null\n const wipeData =\n args.yes ||\n (await askYes(\n readLine as () => Promise<string>,\n 'remove DB + auth/config + agent / profile / team data?',\n ))\n if (!wipeData) {\n console.log('aborted')\n process.stdin.pause()\n return\n }\n\n // Tier 2: ask only after reset is confirmed. auth.json belongs to the DB's\n // bootstrap-token row, so both tiers remove it as one identity pair. Logs\n // and imported skills remain reusable across a clean bootstrap.\n const wipeAll =\n args.all ||\n (args.yes\n ? false\n : await askYes(\n readLine as () => Promise<string>,\n `also remove logs and skills? (full wipe of ${targetHome})`,\n ))\n\n process.stdin.pause()\n // Share the daemon/restore ownership primitive for the entire destructive\n // window. A daemon that is live or starting wins the lock and uninstall\n // fails closed before removing any state.\n const uninstallLock = await acquireHomeRestoreLock(targetHome, 'uninstalling')\n try {\n for (const p of resetTargets) {\n if (removePath(p)) console.log(`removed ${p}`)\n }\n\n if (wipeAll) {\n const fullWipeTargets = [logsDir, skillsDir]\n for (const p of fullWipeTargets) {\n if (removePath(p)) console.log(`removed ${p}`)\n }\n // If nothing else is left in $BAZILION_HOME, drop the empty dir too so\n // a subsequent `bazilion serve` re-bootstraps into a truly fresh home.\n if (readdirSync(targetHome).length === 0 && !homeIsSymlink) {\n rmSync(targetHome, { recursive: true, force: true })\n console.log(`removed ${targetHome}`)\n } else if (homeIsSymlink && readdirSync(targetHome).length === 0) {\n // The sibling ownership record is keyed to this symlink's canonical\n // target. Unlinking the alias before the record is released would\n // let an interrupted retry compute a different identity and bypass\n // the durable uninstall marker. Keep the empty root slot stable.\n console.log(`kept ${targetHome}: symlinked BAZILION_HOME root is now empty`)\n } else {\n console.log(`${targetHome} still has unmanaged files; left in place`)\n }\n } else {\n console.log('')\n console.log('kept: logs/, skills/')\n console.log(\n `re-run 'bazilion serve' to create a fresh DB and matching auth.json when you're ready.`,\n )\n }\n uninstallLock.markUninstallComplete()\n } finally {\n uninstallLock.release()\n }\n },\n})\n"],"mappings":"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","names":["defineCommand","createClient","readFileSync","row","readFileSync","createClient","list","decision","rl","resolve","defineCommand","defineCommand","createClient","defineCommand","list","defineCommand","createClient","defineCommand","resolve","defineCommand","createClient","createHash","randomUUID","chmodSync","closeSync","existsSync","fsyncSync","lstatSync","mkdirSync","openSync","readFileSync","renameSync","rmSync","writeFileSync","basename","dirname","resolve","defineCommand","list","row","createHash","readFileSync","basename","join","endpoint","defineCommand","resolve","existsSync","renameSync","dirname","basename","randomUUID","chmodSync","rmSync","list","entry","readFileSync","row","createHash","lstatSync","openSync","fsyncSync","closeSync","mkdirSync","writeFileSync","defineCommand","main","defineCommand","listCmd","defineCommand","createClient","existsSync","join","defineCommand","join","existsSync","entry","resolve","defineCommand","defineCommand","defineCommand","createClient","defineCommand","defineCommand","stdout","createClient","defineCommand","text","listCmd","defineCommand","createClient","showCmd","existsSync","readFileSync","writeFileSync","defineCommand","defineCommand","existsSync","readFileSync","writeFileSync","defineCommand","defineCommand","createClient","listCmd","showCmd","rmCmd","defineCommand","defineCommand","createClient","entry","readCmd","listCmd","rmCmd","spawn","randomBytes","readFileSync","rmSync","writeFileSync","tmpdir","join","defineCommand","createCmd","defineCommand","readFileSync","createClient","listCmd","list","showCmd","editCmd","join","tmpdir","randomBytes","writeFileSync","resolve","spawn","rmSync","deleteCmd","defineCommand","listCmd","defineCommand","createClient","enableCmd","disableCmd","testCmd","defineCommand","defineCommand","createClient","spawn","existsSync","join","defineCommand","bundledDaemonEntry","sourceDaemonEntry","daemonEntry","nodeArgs","resolve","defineCommand","listCmd","defineCommand","createClient","existsSync","readFileSync","basename","resolve","defineCommand","listCmd","defineCommand","createClient","rows","resolve","existsSync","readFileSync","basename","rmCmd","readFileSync","stdin","defineCommand","readFileSync","defineCommand","readFileSync","endpoint","show","defineCommand","createClient","diff","addCmd","defineCommand","createClient","listCmd","list","rmCmd","stdin","readFileSync","readFileSync","defineCommand","readFileSync","list","defineCommand","createClient","row","show","exportCommand","diff","importCommand","body","defineCommand","setCmd","defineCommand","createClient","showCmd","defineCommand","createCmd","defineCommand","createClient","listCmd","revokeCmd","defineCommand","addCmd","defineCommand","createClient","listCmd","rmCmd","enableCmd","disableCmd","existsSync","lstatSync","readdirSync","realpathSync","rmSync","homedir","isAbsolute","join","parse","relative","resolve","defineCommand","resolve","lstatSync","rmSync","realpathSync","relative","isAbsolute","homedir","parse","defineCommand","join","existsSync","uninstallLock","readdirSync","defineCommand"]}