@madarco/agentbox 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../packages/sandbox-docker/src/browser.ts","../../../packages/sandbox-docker/src/index.ts","../src/engine-override.ts","../src/help.ts","../src/commands/browser.ts","../src/box-ref.ts","../src/commands/_errors.ts","../src/commands/claude.ts","../src/auth.ts","../../../packages/core/src/agent.ts","../src/spinner-line.ts","../src/limits.ts","../src/wizard.ts","../src/commands/checkpoint.ts","../src/commands/code.ts","../src/commands/config.ts","../src/commands/create.ts","../src/commands/dashboard.ts","../src/dashboard/layout.ts","../src/dashboard/renderer.ts","../src/dashboard/input.ts","../src/dashboard/pty-session.ts","../src/dashboard/sidebar.ts","../src/dashboard/compositor.ts","../src/commands/destroy.ts","../src/commands/list.ts","../src/hyperlink.ts","../src/watch.ts","../src/commands/logs.ts","../src/commands/open.ts","../src/commands/path.ts","../src/commands/pause.ts","../src/commands/prune.ts","../src/commands/pull.ts","../src/commands/pull-claude.ts","../src/commands/pull-config.ts","../src/commands/pull-env.ts","../src/commands/screen.ts","../src/commands/shell.ts","../src/commands/start.ts","../src/commands/status.ts","../src/endpoints-render.ts","../src/fmt.ts","../src/commands/inspect.ts","../src/commands/stop.ts","../src/commands/top.ts","../src/commands/unpause.ts","../src/commands/update.ts","../src/exec-method.ts","../src/commands/wait.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { applyEngineOverrideAtStartup } from './engine-override.js';\nimport { buildGroupedHelp } from './help.js';\nimport { browserCommand } from './commands/browser.js';\nimport { claudeCommand } from './commands/claude.js';\nimport { checkpointCommand } from './commands/checkpoint.js';\nimport { codeCommand } from './commands/code.js';\nimport { configCommand } from './commands/config.js';\nimport { createCommand } from './commands/create.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { destroyCommand } from './commands/destroy.js';\nimport { listCommand } from './commands/list.js';\nimport { logsCommand } from './commands/logs.js';\nimport { openCommand } from './commands/open.js';\nimport { pauseCommand } from './commands/pause.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { pullCommand } from './commands/pull.js';\nimport { screenCommand } from './commands/screen.js';\nimport { shellCommand } from './commands/shell.js';\nimport { startCommand } from './commands/start.js';\nimport { statusCommand } from './commands/status.js';\nimport { stopCommand } from './commands/stop.js';\nimport { topCommand } from './commands/top.js';\nimport { unpauseCommand } from './commands/unpause.js';\nimport { updateCommand } from './commands/update.js';\nimport { waitCommand } from './commands/wait.js';\n\nconst program = new Command();\n\nprogram.name('agentbox').description('Launch coding agents in isolated sandboxes').version('0.0.0');\n\n// Required so `agentbox pull env --dry-run` binds --dry-run to the `env`\n// subcommand rather than the parent `pull` (both define it). Positional\n// options must be enabled on every ancestor in the chain.\nprogram.enablePositionalOptions();\n\nprogram.addCommand(createCommand);\nprogram.addCommand(claudeCommand);\nprogram.addCommand(codeCommand);\nprogram.addCommand(shellCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(openCommand);\nprogram.addCommand(browserCommand);\nprogram.addCommand(screenCommand);\nprogram.addCommand(pullCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(topCommand);\nprogram.addCommand(dashboardCommand);\nprogram.addCommand(waitCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(pauseCommand);\nprogram.addCommand(unpauseCommand);\nprogram.addCommand(stopCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(destroyCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(checkpointCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(updateCommand);\n\nprogram.configureHelp({ visibleCommands: () => [] });\nprogram.addHelpText('after', () => '\\n' + buildGroupedHelp(program));\n\nawait applyEngineOverrideAtStartup();\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\n","import { execInBox } from './docker.js';\n\nexport interface BoxBrowserResult {\n up: boolean;\n /** True when a session was already active, so we left the agent's browser untouched. */\n alreadyRunning?: boolean;\n reason?: string;\n}\n\n/**\n * Decide whether `agent-browser session list` reports a live session. Pure so\n * it can be unit-tested without docker. `agent-browser` exits 0 and prints\n * \"No active sessions\" when nothing is running; any other exit-0 output lists\n * one or more sessions (a persistent Chromium is up).\n */\nexport function browserSessionActive(stdout: string, exitCode: number): boolean {\n return exitCode === 0 && !/no active sessions/i.test(stdout);\n}\n\n/**\n * Ensure the box's in-box browser (agent-browser's persistent default-session\n * Chromium) is running, so the VNC view shows a browser instead of a blank X\n * screen. Idempotent: if a session is already active we do nothing — the agent\n * may be mid-task and we must not navigate its page away. Otherwise we open a\n * neutral page **headed** (agent-browser defaults to headless — a headless\n * Chromium renders nothing on the VNC display, defeating the whole point), so\n * the agent's subsequent `agent-browser open <url>` reuses the same visible\n * window (it just navigates it).\n *\n * Best-effort, mirroring {@link import('./vnc.js').launchVncDaemon} — the\n * caller warns on failure but never aborts (the noVNC client still connects).\n * `DISPLAY=:1` + `AGENT_BROWSER_EXECUTABLE_PATH` are image-baked env so the\n * exec inherits them; runs as `vscode` like the other in-box launches.\n */\nexport async function ensureBoxBrowser(\n container: string,\n timeoutMs = 8000,\n): Promise<BoxBrowserResult> {\n const list = await execInBox(container, ['agent-browser', 'session', 'list'], {\n user: 'vscode',\n timeoutMs,\n });\n if (browserSessionActive(list.stdout, list.exitCode)) {\n return { up: true, alreadyRunning: true };\n }\n\n const open = await execInBox(container, ['agent-browser', 'open', '--headed', 'about:blank'], {\n user: 'vscode',\n timeoutMs,\n });\n if (open.exitCode === 0) return { up: true };\n return {\n up: false,\n reason: `agent-browser open failed: ${open.stderr || open.stdout || `exit ${String(open.exitCode)}`}`,\n };\n}\n","import type { SandboxProvider } from '@agentbox/core';\n\nexport {\n attachClaudeSession,\n formatDetachNotice,\n buildClaudeAttachArgv,\n buildClaudeDashboardAttachArgv,\n buildClaudeMounts,\n buildClaudeStatusBarArgs,\n buildShellArgv,\n ClaudeSessionError,\n claudeSessionInfo,\n CONTAINER_USER,\n DEFAULT_CLAUDE_SESSION,\n ensureClaudeVolume,\n pullClaudeExtras,\n rebuildPluginNativeDeps,\n resolveClaudeVolume,\n scanPluginCacheForRebuild,\n SHARED_CLAUDE_VOLUME,\n startClaudeSession,\n type ClaudeConfigSpec,\n type ClaudeMountResult,\n type ClaudeSessionInfo,\n type EnsureClaudeVolumeOptions,\n type EnsureClaudeVolumeResult,\n type PullClaudeOptions,\n type PullClaudeResult,\n type RebuildPluginNativeDepsResult,\n type StartClaudeSessionOptions,\n} from './claude.js';\nexport { createBox, type CreateBoxOptions, type CreatedBox } from './create.js';\nexport {\n agentboxHomeBytes,\n allCheckpointVolumesBytes,\n boxResourceStats,\n parseDockerSize,\n projectCheckpointVolumeBytes,\n volumeSizeBytes,\n} from './stats.js';\nexport { getBoxEndpoints, type BoxEndpoint, type BoxEndpoints } from './endpoints.js';\nexport { execInBox, removeImage, type DockerExecResult } from './docker.js';\nexport {\n createBoxWorktree,\n detectGitRepos,\n GitWorktreeError,\n pickFreshBranch,\n removeBoxWorktree,\n type CreateBoxWorktreeArgs,\n type CreateBoxWorktreeResult,\n type DetectedGitRepo,\n type RemoveBoxWorktreeArgs,\n} from './git-worktree.js';\nexport { DEFAULT_BOX_IMAGE } from './image.js';\nexport {\n DEFAULT_RELAY_PORT,\n ensureRelay,\n forgetBoxFromRelay,\n generateRelayToken,\n registerBoxWithRelay,\n rehydrateRelayRegistry,\n RELAY_CONTAINER_NAME,\n RELAY_IMAGE_REF,\n RELAY_NETWORK_NAME,\n stopRelay,\n type EnsureRelayOptions,\n type RegisterBoxArgs,\n type RelayEndpoint,\n type StopRelayResult,\n} from './relay.js';\nexport { EXCLUDE_DIRS, SNAPSHOTS_ROOT, snapshotPathFor } from './snapshot.js';\nexport {\n CHECKPOINTS_ROOT,\n CHECKPOINT_MOUNT,\n CHECKPOINT_VOLUME_PREFIX,\n CheckpointError,\n checkpointVolumeName,\n computeNextCheckpointName,\n createCheckpoint,\n listCheckpoints,\n projectCheckpointsDir,\n removeCheckpoint,\n resolveCheckpoint,\n resolveCheckpointLower,\n type CheckpointInfo,\n type CheckpointLowerSpec,\n type CheckpointManifest,\n type CheckpointType,\n type CreateCheckpointOptions,\n} from './checkpoint.js';\nexport {\n STATE_DIR,\n STATE_FILE,\n allocateProjectIndex,\n autoPickProjectBox,\n findBox,\n readState,\n recordBox,\n removeBoxRecord,\n resolveBoxRef,\n type BoxRecord,\n type FindBoxResult,\n type GitWorktreeRecord,\n type StateFile,\n} from './state.js';\nexport {\n OverlayError,\n type MountOverlayOptions,\n type MountOverlayResult,\n type NestedWorktreeBind,\n type OverlayCheck,\n} from './overlay.js';\nexport {\n attachedContainerUri,\n buildFlavorMounts,\n buildIdeMounts,\n buildVscodeMounts,\n containerHex,\n cursorServerVolumeName,\n ensureAgentboxTasksFile,\n ensureIdeVolumes,\n ensureVscodeVolumes,\n ideProfile,\n IDE_FLAVORS,\n ideServerVolumeName,\n repairIdeOwnership,\n repairVscodeServerOwnership,\n SHARED_CURSOR_EXTENSIONS_VOLUME,\n SHARED_VSCODE_EXTENSIONS_VOLUME,\n vscodeServerVolumeName,\n type EnsureTasksFileResult,\n type IdeFlavor,\n type IdeMounts,\n type ServiceTailHint,\n type VscodeMounts,\n} from './vscode.js';\nexport {\n BOXES_ROOT,\n boxRunDirFor,\n boxStatusPathFor,\n readBoxStatus,\n buildHostEnvFindArgs,\n CONTAINER_EXPORT_MERGED,\n CONTAINER_EXPORT_UPPER,\n copyHostEnvFilesToBox,\n DEFAULT_ENV_PATTERNS,\n detectEngine,\n ExportError,\n getHostPaths,\n openInFinder,\n pullToHost,\n refreshExport,\n resolveUpperLiveOnHost,\n setEngineOverride,\n type DockerEngine,\n type ExportLayer,\n type HostPaths,\n type CopyHostEnvOptions,\n type OpenOptions,\n type OpenResult,\n type PullOptions,\n type PullResult,\n type RefreshOptions,\n type RefreshResult,\n} from './host-export.js';\nexport {\n AmbiguousBoxError,\n BoxNotFoundError,\n destroyBox,\n getBoxHostPaths,\n inspectBox,\n listBoxes,\n openBoxInFinder,\n pauseBox,\n pruneBoxes,\n snapshotPresent,\n startBox,\n stopBox,\n unpauseBox,\n type DestroyOptions,\n type DestroyResult,\n type InspectedBox,\n type ListedBox,\n type OpenedBox,\n type PruneOptions,\n type PruneResult,\n type StartedBox,\n} from './lifecycle.js';\nexport {\n buildVncUrls,\n generateVncPassword,\n launchVncDaemon,\n VNC_CONTAINER_PORT,\n type VncLaunchResult,\n type VncUrls,\n} from './vnc.js';\nexport { browserSessionActive, ensureBoxBrowser, type BoxBrowserResult } from './browser.js';\nexport {\n dockerVolumeName,\n launchDockerdDaemon,\n SHARED_DOCKER_CACHE_VOLUME,\n type DockerdLaunchResult,\n} from './dockerd.js';\n\nconst notYet = (op: string): never => {\n throw new Error(`@agentbox/sandbox-docker: ${op} is not yet implemented`);\n};\n\nexport const dockerProvider: SandboxProvider = {\n name: 'docker',\n async start(opts) {\n const { createBox } = await import('./create.js');\n const { record } = await createBox({\n workspacePath: opts.workspacePath,\n useSnapshot: false,\n });\n return {\n id: record.id,\n state: 'running',\n agent: opts.agent,\n workspacePath: record.workspacePath,\n createdAt: new Date(record.createdAt),\n };\n },\n async pause(id) {\n const { pauseBox } = await import('./lifecycle.js');\n await pauseBox(id);\n },\n async resume(id) {\n const { unpauseBox } = await import('./lifecycle.js');\n await unpauseBox(id);\n },\n async stop(id) {\n const { stopBox } = await import('./lifecycle.js');\n await stopBox(id);\n },\n async destroy(id) {\n const { destroyBox } = await import('./lifecycle.js');\n await destroyBox(id);\n },\n async list() {\n const { listBoxes } = await import('./lifecycle.js');\n const boxes = await listBoxes();\n return boxes.map((b) => ({\n id: b.id,\n state: b.state,\n agent: 'claude-code' as const,\n workspacePath: b.workspacePath,\n createdAt: new Date(b.createdAt),\n }));\n },\n async stats(id) {\n const { readState, findBox } = await import('./state.js');\n const { boxResourceStats } = await import('./stats.js');\n const found = findBox(id, await readState());\n if (found.kind !== 'ok') {\n throw new Error(`box not found: ${id}`);\n }\n return boxResourceStats(found.box);\n },\n};\n\n// notYet is no longer reachable from the public API. Keep it for now in case\n// future provider methods need it before they're implemented.\nvoid notYet;\n","import { loadEffectiveConfig } from '@agentbox/config';\nimport { setEngineOverride } from '@agentbox/sandbox-docker';\n\n/**\n * Pin the docker engine if the user has set `engine.kind` in any layer (other\n * than `auto`, which means \"let `docker info` decide\"). Called once from the\n * CLI entrypoint before commander parses argv. Errors are swallowed — if the\n * user's config is broken, the matching `agentbox config` subcommand will\n * surface a clean error when they next touch it.\n */\nexport async function applyEngineOverrideAtStartup(): Promise<void> {\n try {\n const loaded = await loadEffectiveConfig(process.cwd());\n const kind = loaded.effective.engine.kind;\n if (kind === 'auto') return;\n setEngineOverride(kind);\n } catch {\n /* best-effort: lint, --help, and other no-op invocations should never crash */\n }\n}\n","import type { Command } from 'commander';\n\n// Ordered command groups for the top-level `agentbox --help`. commander@12.1.0\n// has no native .helpGroup(); we suppress the flat Commands: list via\n// configureHelp({ visibleCommands: () => [] }) and render this instead.\n// Names must match the registered Command names in index.ts — the drift test\n// in test/commands.test.ts asserts this map covers every top-level command.\nexport interface HelpGroup {\n title: string;\n hint?: string;\n commands: string[];\n}\n\nexport const HELP_GROUPS: HelpGroup[] = [\n { title: 'Create & run', commands: ['create', 'claude'] },\n {\n title: 'Access',\n commands: ['dashboard', 'browser', 'screen', 'code', 'shell', 'open', 'logs'],\n },\n { title: 'Inspect', commands: ['list', 'status', 'top'] },\n { title: 'Lifecycle', commands: ['start', 'stop', 'destroy', 'pause', 'unpause'] },\n { title: 'Sync & state', commands: ['pull', 'checkpoint'] },\n {\n title: 'Advanced',\n commands: ['wait', 'prune', 'self-update', 'config'],\n },\n];\n\nfunction term(cmd: Command): string {\n const aliases = cmd.aliases();\n return aliases.length ? `${cmd.name()}|${aliases.join('|')}` : cmd.name();\n}\n\n// Builds the grouped Commands: block. Descriptions/aliases come straight from\n// the registered Command objects so help text never drifts from the source.\n// Any registered command missing from HELP_GROUPS lands in a trailing\n// \"Other\" group (fail-soft — the drift test fails if this is non-empty).\nexport function buildGroupedHelp(program: Command): string {\n const byName = new Map(program.commands.map((c) => [c.name(), c] as const));\n const grouped = new Set(HELP_GROUPS.flatMap((g) => g.commands));\n const orphans = program.commands.map((c) => c.name()).filter((n) => !grouped.has(n));\n\n const groups: HelpGroup[] = [...HELP_GROUPS];\n if (orphans.length) groups.push({ title: 'Other', commands: orphans });\n\n const terms: string[] = [];\n for (const g of groups) {\n for (const name of g.commands) {\n const cmd = byName.get(name);\n if (cmd) terms.push(term(cmd));\n }\n }\n const pad = Math.max(0, ...terms.map((t) => t.length)) + 2;\n\n const lines: string[] = ['Commands:'];\n for (const g of groups) {\n const title = g.hint ? `${g.title} (${g.hint})` : g.title;\n lines.push('', ` ${title}`);\n for (const name of g.commands) {\n const cmd = byName.get(name);\n if (!cmd) continue;\n lines.push(` ${term(cmd).padEnd(pad)}${cmd.description()}`);\n }\n }\n lines.push('', 'Run `agentbox <command> --help` for command-specific options.');\n return lines.join('\\n');\n}\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n detectEngine,\n getBoxHostPaths,\n inspectBox,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface BrowserOptions {\n print?: boolean;\n loopback?: boolean;\n}\n\nexport const browserCommand = new Command('browser')\n .description(\n \"Open a box's web app URL in the browser, even when no service declares `expose:` (auto-unpause/start)\",\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--print', 'print the URL to stdout instead of launching the browser')\n .option('--loopback', 'use the 127.0.0.1 URL instead of the OrbStack .orb.local URL')\n .action(async (idOrName: string | undefined, opts: BrowserOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // Re-read after a possible start: startBox re-resolves & persists the\n // reallocated webHostPort (lifecycle.ts).\n const { record } = await getBoxHostPaths(box.id);\n if (record.webContainerPort === undefined) {\n throw new Error(\n `box ${box.name} predates the reserved web port; recreate it to use \\`agentbox browser\\``,\n );\n }\n\n const engine = await detectEngine();\n let url: string;\n if (engine === 'orbstack' && !opts.loopback) {\n // OrbStack auto-routes <container>.orb.local to the container; :80 is\n // declared (EXPOSE 80) so no port suffix is needed.\n url = `http://${record.container}.orb.local`;\n } else {\n if (record.webHostPort === undefined) {\n throw new Error(\n `web port not resolved for box ${box.name}; is the container running? try \\`agentbox inspect ${box.name}\\``,\n );\n }\n url = `http://127.0.0.1:${String(record.webHostPort)}`;\n }\n\n if (opts.print) {\n process.stdout.write(`${url}\\n`);\n return;\n }\n\n const opened = spawnSync('open', [url], { stdio: 'inherit' });\n if (opened.status !== 0) {\n throw new Error(`open ${url} failed (exit ${String(opened.status ?? 'n/a')})`);\n }\n process.stdout.write(`opened ${url}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { findProjectRoot } from '@agentbox/config';\nimport {\n AmbiguousBoxError,\n BoxNotFoundError,\n readState,\n resolveBoxRef,\n type BoxRecord,\n type FindBoxResult,\n} from '@agentbox/sandbox-docker';\nimport { log } from '@clack/prompts';\n\ninterface ResolveOptions {\n /**\n * Override the cwd used for project-root resolution. Defaults to\n * `process.cwd()`. Commands that take `--workspace <path>` (e.g. create,\n * claude) can pass it here so the resolver matches the workspace's project,\n * not whatever shell dir the user happened to be in.\n */\n cwd?: string;\n}\n\n/**\n * One-stop resolver every box-arg command goes through.\n *\n * Resolution order:\n * 1. If `ref` is undefined → auto-pick the only box for the cwd's project\n * (errors with a chooser if 2+, errors clearly if 0).\n * 2. If `ref` is a positive integer → resolve as the cwd-project's\n * `projectIndex` (does NOT fall through to id-prefix; pure-numeric refs\n * are reserved for indices).\n * 3. Otherwise → existing `findBox` semantics (id → prefix → name → container).\n *\n * On any failure mode the helper prints a friendly message and `process.exit`s\n * with code 2, so callers can write `const box = await resolveBoxOrExit(...)`\n * without try/catch boilerplate.\n */\n/**\n * Special variant for `shell` and `logs` — the only two CLI verbs where\n * commander can't distinguish between \"user typed a box ref\" and \"user typed a\n * cmd/service after `--` and commander bound it to [box]\". When `ref` is set\n * but doesn't resolve as a box AND auto-pick yields exactly one box, return\n * that box plus a hint that `ref` should be re-treated as the first cmd/svc\n * token. On normal success / total miss it behaves like `resolveBoxOrExit`.\n */\nexport async function resolveBoxOrShift(\n ref: string | undefined,\n opts: ResolveOptions = {},\n): Promise<{ box: BoxRecord; shifted: boolean }> {\n const cwd = opts.cwd ?? process.cwd();\n const project = await findProjectRoot(cwd);\n const state = await readState();\n const firstTry: FindBoxResult = resolveBoxRef(ref, state, project.root);\n if (firstTry.kind === 'ok') return { box: firstTry.box, shifted: false };\n\n if (ref !== undefined) {\n // Maybe commander bound a post-`--` token to [box]; try auto-pick.\n const pick = resolveBoxRef(undefined, state, project.root);\n if (pick.kind === 'ok') return { box: pick.box, shifted: true };\n if (pick.kind === 'ambiguous') {\n // Auto-pick would have worked but it's ambiguous — strong signal the\n // user typed `shell -- cmd` (or `logs <svc>`) in a multi-box project.\n // Surface the chooser instead of the confusing \"no match for <cmd>\".\n log.error(`multiple boxes in this project — pick one:`);\n for (const b of pick.matches) {\n const idx = typeof b.projectIndex === 'number' ? `${String(b.projectIndex)})` : ' -)';\n process.stderr.write(` ${idx} ${b.name} (id ${b.id})\\n`);\n }\n log.info('try: agentbox <cmd> <n> -- <args> (or use the box name / id prefix)');\n process.exit(2);\n }\n }\n\n // Same error path as resolveBoxOrExit.\n const box = await resolveBoxOrExit(ref, opts);\n return { box, shifted: false };\n}\n\nexport async function resolveBoxOrExit(\n ref: string | undefined,\n opts: ResolveOptions = {},\n): Promise<BoxRecord> {\n const cwd = opts.cwd ?? process.cwd();\n // findProjectRoot tolerates non-existent dirs by walking up until\n // dirname(x) === x; the fallback root is the input itself. We treat any\n // walked path as the project root for resolution.\n const project = await findProjectRoot(cwd);\n const state = await readState();\n const result = resolveBoxRef(ref, state, project.root);\n\n if (result.kind === 'ok') return result.box;\n\n if (result.kind === 'ambiguous') {\n // Auto-pick ambiguous: the project has 2+ boxes and the user gave no ref.\n // For numeric / non-numeric explicit refs, an ambiguous result can only\n // come from findBox's id-prefix match (e.g. \"a1\" matches \"a1b…\" and\n // \"a1c…\"), in which case the user typed a real prefix and just needs to\n // disambiguate.\n if (ref === undefined) {\n log.error(`multiple boxes in this project — pick one:`);\n for (const b of result.matches) {\n const idx = typeof b.projectIndex === 'number' ? `${String(b.projectIndex)})` : ' -)';\n process.stderr.write(` ${idx} ${b.name} (id ${b.id})\\n`);\n }\n log.info('try: agentbox <cmd> <n> (or use the box name / id prefix)');\n process.exit(2);\n }\n // ref was provided → fall through to AmbiguousBoxError so handleLifecycleError\n // can render its existing hint about specifying more characters.\n throw new AmbiguousBoxError(ref, result.matches);\n }\n\n // kind === 'none'\n if (ref === undefined) {\n log.error(`no boxes in this project (${project.root})`);\n log.info('run `agentbox create` to make one, or pass a box ref explicitly');\n process.exit(2);\n }\n if (/^[1-9][0-9]*$/.test(ref.trim())) {\n log.error(`no box with index ${ref.trim()} in this project (${project.root})`);\n log.info('run `agentbox list` to see available indices');\n process.exit(2);\n }\n throw new BoxNotFoundError(ref);\n}\n","import { log } from '@clack/prompts';\nimport { AmbiguousBoxError, BoxNotFoundError, ClaudeSessionError } from '@agentbox/sandbox-docker';\n\n/**\n * Map common lifecycle errors to user-facing messages and the right exit code,\n * then exit. Shared by all lifecycle commands so error UX stays consistent.\n */\nexport function handleLifecycleError(err: unknown): never {\n if (err instanceof BoxNotFoundError) {\n log.error(err.message);\n log.info('Run `agentbox list` to see available boxes.');\n process.exit(2);\n }\n if (err instanceof AmbiguousBoxError) {\n log.error(err.message);\n log.info('Specify more characters of the id, or use the full name.');\n process.exit(2);\n }\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n process.exit(2);\n }\n const msg = err instanceof Error ? err.message : String(err);\n log.error(msg);\n process.exit(1);\n}\n","import { confirm, intro, isCancel, log, outro, password, spinner } from '@clack/prompts';\nimport { findProjectRoot, loadEffectiveConfig, type UserConfig } from '@agentbox/config';\nimport {\n attachClaudeSession,\n ClaudeSessionError,\n claudeSessionInfo,\n createBox,\n ensureClaudeVolume,\n inspectBox,\n rebuildPluginNativeDeps,\n SHARED_CLAUDE_VOLUME,\n startBox,\n startClaudeSession,\n unpauseBox,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport {\n AUTH_FILE,\n hostClaudeAvailable,\n isPlausibleOauthToken,\n resolveClaudeAuth,\n runHostSetupToken,\n writeAuthFile,\n type ResolvedClaudeAuth,\n} from '../auth.js';\nimport { resolveAgentLauncher } from '@agentbox/core';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybeRunSetupWizard } from '../wizard.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Ref shown in the detach notice: the per-project index `n` when set\n * (resolves from inside the project dir), else the globally-unique name. */\nfunction reattachRef(r: { projectIndex?: number; name: string }): string {\n return typeof r.projectIndex === 'number' ? String(r.projectIndex) : r.name;\n}\n\ninterface ClaudeCreateOptions {\n workspace: string;\n name?: string;\n hostSnapshot?: boolean;\n snapshot?: string; // --snapshot <ref>: start from this checkpoint\n image?: string;\n yes?: boolean;\n isolateClaudeConfig?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n}\n\nfunction buildClaudeCliOverrides(opts: ClaudeCreateOptions): Partial<UserConfig> {\n const box: NonNullable<UserConfig['box']> = {};\n if (opts.hostSnapshot !== undefined) box.hostSnapshot = opts.hostSnapshot;\n if (opts.image !== undefined) box.image = opts.image;\n if (opts.withPlaywright === true) box.withPlaywright = true;\n if (opts.withEnv === true) box.withEnv = true;\n if (opts.vnc === false) box.vnc = false;\n if (opts.isolateClaudeConfig === true) box.isolateClaudeConfig = true;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n const claude: NonNullable<UserConfig['claude']> = {};\n if (opts.sessionName !== undefined) claude.sessionName = opts.sessionName;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (Object.keys(claude).length > 0) out.claude = claude;\n return out;\n}\n\n\n/**\n * First-run onboarding. Spawn `claude setup-token` interactively (if the host has\n * Claude Code installed), then prompt the user to paste the token. Save it to\n * ~/.agentbox/auth.json (mode 0600) and return the env shape that should be\n * forwarded to the box. Returns null when the user declines or skips.\n */\nasync function offerSetupToken(): Promise<ResolvedClaudeAuth | null> {\n log.info('first time setup: setup token for Claude Code');\n\n const canRun = hostClaudeAvailable();\n if (canRun) {\n const yes = await confirm({\n message: 'Run `claude setup-token` now to save a token?',\n initialValue: true,\n });\n if (isCancel(yes) || !yes) {\n log.info('ok, continuing without a saved token; /login inside the box once and it persists in the shared volume.');\n return null;\n }\n const { exitCode } = runHostSetupToken();\n if (exitCode !== 0) {\n log.warn(`\\`claude setup-token\\` exited with code ${String(exitCode)}; you can still paste a token below if you have one.`);\n }\n } else {\n log.warn(\n 'Claude Code is not installed on the host, so I cannot run `claude setup-token` for you. ' +\n 'Run it on a machine that has Claude Code installed, then paste the token below — or skip and /login inside the box.',\n );\n }\n\n const pasted = await password({ message: 'Paste OAuth token (or empty to skip):' });\n if (isCancel(pasted) || !pasted) {\n log.info('ok, continuing without a saved token; /login inside the box once and it persists in the shared volume.');\n return null;\n }\n const token = pasted.trim();\n if (!isPlausibleOauthToken(token)) {\n log.warn(\"That doesn't look like an OAuth token (expected `sk-ant-oat…`); saving anyway — verify inside the box.\");\n }\n await writeAuthFile({ claudeCodeOauthToken: token });\n log.success(`saved to ${AUTH_FILE} (mode 0600)`);\n return { env: { CLAUDE_CODE_OAUTH_TOKEN: token }, source: 'auth-file' };\n}\n\nexport const claudeCommand = new Command('claude')\n .description('Create a sandboxed box and launch Claude Code in a detachable tmux session')\n // Mirror create's surface so users can swap the verb without re-learning flags.\n .option('-w, --workspace <path>', 'host workspace to mount', process.cwd())\n .option('-n, --name <name>', 'friendly box name (default: <workspace-basename>-<id>)')\n .option('--host-snapshot', 'use a frozen APFS clone of the host workspace as the overlay lower')\n .option('--no-host-snapshot', 'bind the live workspace directly (host edits leak into reads)')\n .option(\n '--snapshot <ref>',\n 'start from a project checkpoint (see `agentbox checkpoint`); overrides box.defaultCheckpoint',\n )\n .option('--image <ref>', 'override the box image')\n .option('-y, --yes', 'skip prompts, accept defaults (host-snapshot=on)')\n .option(\n '--isolate-claude-config',\n 'use a per-box ~/.claude volume instead of the shared agentbox-claude-config',\n )\n .option('--with-playwright', 'also install @playwright/cli@latest globally inside the box')\n .option(\n '--with-env',\n 'copy host env/config files (.env*, secrets.toml, agentbox.yaml, ...) into /workspace at create time (gitignore-bypassing)',\n )\n .option('--no-vnc', 'disable the per-box Xvnc + noVNC web client (on by default)')\n .option(\n '--shared-docker-cache',\n \"use the shared 'agentbox-docker-cache' volume for in-box docker images (preserved on destroy; only one box can run at a time when set)\",\n )\n .option('--session-name <name>', 'tmux session name (default from config; built-in: claude)')\n .option('--memory <size>', 'memory ceiling (e.g. 512m, 2g); unset = unlimited')\n .option('--cpus <n>', 'CPU count cap (fractional ok, e.g. 1.5); unset = unlimited')\n .option('--pids-limit <n>', 'max process count (PIDs cgroup); unset = unlimited')\n .option('--disk <size>', 'best-effort writable-layer size (e.g. 10g); no-op on overlay2/macOS')\n .argument(\n '[claude-args...]',\n \"extra args passed to claude inside the box; place after `--`, e.g. `agentbox claude -- --model sonnet`\",\n )\n .action(async (claudeArgs: string[], opts: ClaudeCreateOptions) => {\n intro('agentbox claude');\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildClaudeCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : cfg.effective.box.defaultCheckpoint.length > 0\n ? cfg.effective.box.defaultCheckpoint\n : undefined;\n\n // First-run wizard: when no agentbox.yaml exists, offer to inject an\n // initial user-message so claude reads /agentbox-setup and writes one.\n // Skipped when starting from a checkpoint (it already carries the config).\n const wiz = await maybeRunSetupWizard({\n workspace: opts.workspace,\n yes: !!opts.yes,\n command: 'claude',\n checkpointRef,\n });\n let effectiveClaudeArgs = claudeArgs;\n if (wiz.action === 'launch-with-prompt' && wiz.initialPrompt) {\n effectiveClaudeArgs = resolveAgentLauncher('claude-code').buildArgs(\n wiz.initialPrompt,\n claudeArgs,\n );\n }\n\n // For the create-and-launch verb the default is host-snapshot=on; explicit\n // --no-host-snapshot still wins. Config can also flip the default.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? true);\n const sessionName = cfg.effective.claude.sessionName;\n\n // Resolve auth from env or the saved auth file. On first run (nothing\n // saved, nothing in env), drive the user through `claude setup-token`\n // interactively — but only when we have a real TTY and the user didn't\n // pass `--yes` (which means \"no prompts; CI-friendly\").\n let resolved = await resolveClaudeAuth(process.env);\n if (resolved.source === 'none' && process.stdin.isTTY && !opts.yes) {\n const next = await offerSetupToken();\n if (next) resolved = next;\n }\n\n const s = spinner();\n s.start('creating box');\n let containerName = '';\n try {\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set in any layer.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n const result = await createBox({\n workspacePath: opts.workspace,\n name: opts.name,\n useSnapshot,\n checkpointRef,\n image: cfg.effective.box.image,\n claudeConfig: { isolate: cfg.effective.box.isolateClaudeConfig },\n claudeEnv: resolved.env,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => s.message(clampSpinnerLine(line)),\n });\n containerName = result.record.container;\n\n // Plugin native deps: the sync excludes `node_modules` (host darwin\n // binaries don't run on linux/amd64). First claude session in a fresh\n // box pays the npm-install cost for each plugin that ships a\n // package.json; subsequent attaches see node_modules already present\n // and exit immediately. Keep the same spinner alive — every phase\n // overwrites the one line instead of leaving a scroll of `●`/`◇` rows.\n s.message('checking plugin native deps');\n const rebuild = await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n s.message('starting claude session');\n await startClaudeSession({\n container: result.record.container,\n claudeArgs: effectiveClaudeArgs,\n sessionName,\n boxName: result.record.name,\n });\n\n const nSuffix =\n typeof result.record.projectIndex === 'number'\n ? ` · n ${String(result.record.projectIndex)}`\n : '';\n s.stop(`box ${result.record.container} ready${nSuffix}`);\n for (const f of rebuild.failed) {\n log.warn(`plugin install failed for ${f.dir}; claude may still load it. stderr:\\n${f.stderr.trim()}`);\n }\n\n outro('attaching — Ctrl-b d to detach, leaves claude running');\n attachClaudeSession(result.record.container, sessionName, reattachRef(result.record));\n } catch (err) {\n s.stop('failed');\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n if (containerName) {\n log.info(`The box ${containerName} is still running. Destroy it with:`);\n log.info(` agentbox destroy ${containerName} -y`);\n }\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\ninterface ClaudeStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n}\n\n// Shared by `claude start` and `claude attach`: if a session is already\n// running, just attach; otherwise auto-unpause/start the box, (optionally)\n// resync ~/.claude, rebuild plugin native deps, launch claude, then attach.\nasync function startOrAttachClaude(\n box: BoxRecord,\n claudeArgs: string[],\n opts: ClaudeStartOptions,\n): Promise<void> {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: opts.sessionName ? { claude: { sessionName: opts.sessionName } } : {},\n });\n const sessionName = cfg.effective.claude.sessionName;\n\n // Auto-unpause/start. Mirrors `agentbox shell` / `agentbox code`.\n // `startBox` re-mounts the FUSE overlay and relaunches ctl/vnc/dockerd\n // because those processes die with the container.\n const insp = await inspectBox(box.id);\n if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // If a tmux session already exists, just attach — no resync, no plugin\n // rebuild, ignore any post-`--` args (they only apply to a fresh claude).\n const existing = await claudeSessionInfo(box.container, sessionName);\n if (existing.running) {\n outro(`session \"${sessionName}\" already running — attaching (Ctrl-b d to detach)`);\n attachClaudeSession(box.container, sessionName, reattachRef(box));\n return;\n }\n\n // One spinner for the whole prepare→attach sequence: every phase overwrites\n // the single line instead of leaving a scroll of `●`/`◇` rows.\n const s = spinner();\n s.start('preparing box');\n\n // Auto-unpause/start. `startBox` re-mounts the FUSE overlay and relaunches\n // ctl/vnc/dockerd because those processes die with the container.\n if (insp.state === 'paused') {\n s.message('unpausing box');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n s.message('starting box (remounting overlay)');\n await startBox(box.id);\n }\n\n // Default: re-sync the host's ~/.claude into the box volume so any\n // updates the user made on the host (new MCP servers, refreshed\n // OAuth state in _claude.json, …) reach the in-box claude. Slow on\n // first sync; opt out with --no-sync-config to skip.\n const syncConfig = opts.syncConfig !== false;\n if (syncConfig) {\n s.message('syncing ~/.claude into box volume');\n // Use the box's recorded volume so isolated boxes hit their own\n // agentbox-claude-config-<id>, not the shared one.\n const volume = box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME;\n await ensureClaudeVolume(\n { volume },\n {\n syncFromHost: true,\n image: box.image,\n hostWorkspace: box.workspacePath,\n },\n );\n }\n\n // Plugin native deps: idempotent — gated by a per-plugin marker. No-op\n // on subsequent starts unless a new plugin was synced just now.\n s.message('checking plugin native deps');\n const rebuild = await rebuildPluginNativeDeps(box.container, {\n volume: box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n s.message('starting claude session');\n await startClaudeSession({\n container: box.container,\n claudeArgs,\n sessionName,\n boxName: box.name,\n });\n\n s.stop(`box ${box.container} ready`);\n for (const f of rebuild.failed) {\n log.warn(`plugin install failed for ${f.dir}; claude may still load it. stderr:\\n${f.stderr.trim()}`);\n }\n\n outro('attaching — Ctrl-b d to detach, leaves claude running');\n attachClaudeSession(box.container, sessionName, reattachRef(box));\n}\n\nconst claudeAttachCommand = new Command('attach')\n .description(\n 'Attach to a Claude Code tmux session in a box, starting one if none is running (auto-unpause/start)',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--session-name <name>', 'tmux session name (default from config; built-in: claude)')\n .option(\n '--no-sync-config',\n \"when starting a fresh session, skip rsyncing the host's ~/.claude into the box's volume (faster)\",\n )\n .action(async function (this: Command, idOrName: string | undefined) {\n // optsWithGlobals merges parent + own options — the parent `claude`\n // command also defines `--session-name`.\n const opts = this.optsWithGlobals() as ClaudeStartOptions;\n intro('agentbox claude attach');\n try {\n const box = await resolveBoxOrExit(idOrName);\n await startOrAttachClaude(box, [], opts);\n } catch (err) {\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst claudeStartCommand = new Command('start')\n .description(\n 'Start a Claude Code tmux session in an already-existing box (auto-unpause/start). If a session is already running, just attach.',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--session-name <name>', 'tmux session name (default from config; built-in: claude)')\n .option(\n '--no-sync-config',\n \"skip rsyncing the host's ~/.claude into the box's volume before starting (faster; use existing in-box state)\",\n )\n .argument(\n '[claude-args...]',\n \"extra args passed to claude when starting a new session; ignored if a session is already running. Place after `--`, e.g. `agentbox claude start 1 -- --model sonnet`\",\n )\n .action(async function (this: Command, idOrName: string | undefined, claudeArgs: string[]) {\n const opts = this.optsWithGlobals() as ClaudeStartOptions;\n intro('agentbox claude start');\n try {\n // Two positionals (`[box] [claude-args...]`) make commander bind the\n // first post-`--` token (e.g. `--model`) to `[box]`. resolveBoxOrShift\n // detects that, auto-picks the project's single box, and tells us to\n // treat the bound `idOrName` as the first claude-args token instead.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n const effectiveClaudeArgs = shifted && idOrName ? [idOrName, ...claudeArgs] : claudeArgs;\n await startOrAttachClaude(box, effectiveClaudeArgs, opts);\n } catch (err) {\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nclaudeCommand.addCommand(claudeAttachCommand);\nclaudeCommand.addCommand(claudeStartCommand);\n","import { spawnSync } from 'node:child_process';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { STATE_DIR } from '@agentbox/sandbox-docker';\n\nexport const AUTH_FILE = join(STATE_DIR, 'auth.json');\n\nexport interface AuthFile {\n claudeCodeOauthToken?: string;\n}\n\nexport interface ResolvedClaudeAuth {\n /** Env vars to inject into the box. Only includes keys with non-empty string values. */\n env: Record<string, string>;\n /** Where the value(s) came from. `'none'` means there's nothing to forward and the caller may prompt. */\n source: 'host-env' | 'auth-file' | 'none';\n}\n\n/**\n * Merge host env + ~/.agentbox/auth.json into a single effective env that the\n * `claude` command forwards to the box. Env wins over the file; either of the\n * two known keys (API key or OAuth token) counts as having auth.\n */\nexport async function resolveClaudeAuth(\n processEnv: NodeJS.ProcessEnv,\n opts: { authFilePath?: string } = {},\n): Promise<ResolvedClaudeAuth> {\n const env: Record<string, string> = {};\n const envApiKey = processEnv['ANTHROPIC_API_KEY'];\n const envOauth = processEnv['CLAUDE_CODE_OAUTH_TOKEN'];\n if (typeof envApiKey === 'string' && envApiKey.length > 0) env['ANTHROPIC_API_KEY'] = envApiKey;\n if (typeof envOauth === 'string' && envOauth.length > 0) env['CLAUDE_CODE_OAUTH_TOKEN'] = envOauth;\n if (Object.keys(env).length > 0) return { env, source: 'host-env' };\n\n const file = await readAuthFile(opts.authFilePath);\n if (file.claudeCodeOauthToken && file.claudeCodeOauthToken.length > 0) {\n return {\n env: { CLAUDE_CODE_OAUTH_TOKEN: file.claudeCodeOauthToken },\n source: 'auth-file',\n };\n }\n return { env: {}, source: 'none' };\n}\n\nexport async function readAuthFile(path: string = AUTH_FILE): Promise<AuthFile> {\n try {\n const raw = await readFile(path, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const t = (parsed as { claudeCodeOauthToken?: unknown }).claudeCodeOauthToken;\n return typeof t === 'string' && t.length > 0 ? { claudeCodeOauthToken: t } : {};\n }\n return {};\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return {};\n // A garbage / corrupted file shouldn't kill `agentbox claude`. Treat as empty.\n return {};\n }\n}\n\nexport async function writeAuthFile(next: AuthFile, path: string = AUTH_FILE): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(next, null, 2) + '\\n', { mode: 0o600, flag: 'w' });\n}\n\n/** True iff a `claude` binary is on the host PATH. */\nexport function hostClaudeAvailable(): boolean {\n // POSIX `command -v` would also work but needs a shell; `which` is in both\n // macOS base and any Linux box we'd realistically run on. We don't shell out\n // to claude itself — that would launch the binary unnecessarily.\n const r = spawnSync('which', ['claude'], { stdio: ['ignore', 'pipe', 'ignore'] });\n return r.status === 0 && (r.stdout?.toString().trim().length ?? 0) > 0;\n}\n\n/**\n * Run `claude setup-token` interactively. We inherit stdio so the user's\n * terminal drives the OAuth flow (browser open, code paste, etc.) just as if\n * they ran the command themselves. Returns the child exit code.\n */\nexport function runHostSetupToken(): { exitCode: number } {\n const child = spawnSync('claude', ['setup-token'], { stdio: 'inherit' });\n return { exitCode: child.status ?? -1 };\n}\n\n/**\n * Cheap shape check. Anthropic OAuth tokens currently look like\n * `sk-ant-oat01-…`. We don't validate cryptographically — if the user pastes\n * something nonsensical, the box itself will surface \"invalid token\" when\n * claude tries to use it. Better to save the typo than to block on a\n * regex that could go stale.\n */\nexport function isPlausibleOauthToken(s: string): boolean {\n const t = s.trim();\n return t.startsWith('sk-ant-oat') && t.length >= 40;\n}\n","import type { AgentKind } from './types.js';\n\nexport interface AgentLauncher {\n readonly kind: AgentKind;\n buildArgs(initialMessage: string, userArgs: string[]): string[];\n}\n\nconst claudeCodeLauncher: AgentLauncher = {\n kind: 'claude-code',\n // claude treats its first positional argument as the seed user turn in\n // interactive mode (`claude \"<message>\"`), so we slot the initial message\n // ahead of any user-passed flags.\n buildArgs(initialMessage, userArgs) {\n if (!initialMessage) return [...userArgs];\n return [initialMessage, ...userArgs];\n },\n};\n\nconst codexLauncher: AgentLauncher = {\n kind: 'codex',\n buildArgs() {\n throw new Error(\n 'codex agent is not yet supported by agentbox; install + wire the codex launcher first',\n );\n },\n};\n\nexport function resolveAgentLauncher(kind: AgentKind): AgentLauncher {\n if (kind === 'claude-code') return claudeCodeLauncher;\n if (kind === 'codex') return codexLauncher;\n throw new Error(`unknown agent kind: ${String(kind)}`);\n}\n","/**\n * Clamp a spinner message to fit on a single terminal row.\n *\n * @clack/prompts' spinner redraws in place by emitting cursor-up + clear-line\n * sequences sized to the lines it last drew. When a message is longer than the\n * terminal is wide, the terminal wraps it onto extra visual rows the spinner\n * doesn't know about — the next frame's clear hits only the last visual row\n * and the rest pile up in scrollback. Docker's build output during the apt-get\n * phase (Get:19 http://ports.ubuntu.com/... long URLs) routinely blows past\n * 100 columns, which is what triggers the symptom in `agentbox create` /\n * `agentbox claude` on the first run when the image is being built.\n *\n * Falls back to the raw line on non-TTY stdout (no spinner is drawn, so\n * wrapping is harmless).\n */\nconst SPINNER_CHROME = 6;\n\nexport function clampSpinnerLine(line: string): string {\n const cols = process.stdout.columns;\n if (!process.stdout.isTTY || !cols) return line;\n const trimmed = line.replace(/\\s+$/, '');\n const max = cols - SPINNER_CHROME;\n if (max <= 1 || trimmed.length <= max) return trimmed;\n return `${trimmed.slice(0, max - 1)}…`;\n}\n","import type { EffectiveConfig } from '@agentbox/config';\n\n/**\n * Engine-agnostic resource ceilings the CLI hands to createBox. Memory in\n * bytes, cpus fractional, pids a count, disk a raw size string. null = no cap.\n */\nexport interface ResolvedLimits {\n memoryBytes: number | null;\n cpus: number | null;\n pidsLimit: number | null;\n disk: string | null;\n}\n\n/**\n * Parse a docker-style memory size (`512`, `512b`, `64k`, `512m`, `2g`) into\n * bytes. Bare numbers are bytes (matches `docker run --memory`). Throws on\n * garbage so a typo'd `--memory` fails loudly instead of silently unlimited.\n */\nexport function parseMemoryToBytes(raw: string): number {\n const m = /^\\s*([\\d.]+)\\s*([bkmg]?)b?\\s*$/i.exec(raw);\n if (!m) throw new Error(`invalid --memory value \"${raw}\" (try e.g. 512m, 2g)`);\n const n = Number(m[1]);\n if (!Number.isFinite(n) || n < 0) {\n throw new Error(`invalid --memory value \"${raw}\"`);\n }\n const unit = (m[2] ?? '').toLowerCase();\n const factor =\n unit === 'k' ? 1024 : unit === 'm' ? 1024 ** 2 : unit === 'g' ? 1024 ** 3 : 1;\n return Math.floor(n * factor);\n}\n\nconst MIB = 1024 * 1024;\n\nexport interface LimitFlags {\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n}\n\n/**\n * Merge the layered config (`box.*`, ints/strings: 0/'' = unlimited) with raw\n * CLI flags. Flags win and carry richer types — `--memory 2g`, fractional\n * `--cpus 1.5` — that the integer-typed config keys can't express.\n */\nexport function resolveLimits(\n box: EffectiveConfig['box'],\n flags: LimitFlags,\n): ResolvedLimits {\n let memoryBytes: number | null = box.memory > 0 ? box.memory * MIB : null;\n if (flags.memory !== undefined && flags.memory !== '') {\n memoryBytes = parseMemoryToBytes(flags.memory);\n }\n\n let cpus: number | null = box.cpus > 0 ? box.cpus : null;\n if (flags.cpus !== undefined && flags.cpus !== '') {\n const n = Number(flags.cpus);\n if (!Number.isFinite(n) || n < 0) {\n throw new Error(`invalid --cpus value \"${flags.cpus}\"`);\n }\n cpus = n > 0 ? n : null;\n }\n\n let pidsLimit: number | null = box.pidsLimit > 0 ? box.pidsLimit : null;\n if (flags.pidsLimit !== undefined && flags.pidsLimit !== '') {\n const n = Number(flags.pidsLimit);\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(`invalid --pids-limit value \"${flags.pidsLimit}\"`);\n }\n pidsLimit = n > 0 ? n : null;\n }\n\n let disk: string | null = box.disk ? box.disk : null;\n if (flags.disk !== undefined && flags.disk !== '') disk = flags.disk;\n\n return { memoryBytes, cpus, pidsLimit, disk };\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport { copyFile, mkdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * In-box absolute path to the setup guide markdown (baked into the box image\n * by Dockerfile.box). Stable so the wizard's initial-prompt can reference it.\n */\nexport const IN_BOX_SETUP_GUIDE_PATH = '/usr/local/share/agentbox/setup-guide.md';\n\nconst HOST_SKILLS_DIR = join(homedir(), '.claude', 'skills', 'agentbox-setup');\nconst HOST_SKILL_FILE = join(HOST_SKILLS_DIR, 'SKILL.md');\n\n// `share/agentbox-setup/SKILL.md` sits next to `dist/` after tsup build and at\n// the package root after npm publish; both resolve via `../share/...` relative\n// to dist/index.js.\nfunction bundledSkillPath(): string {\n return fileURLToPath(new URL('../share/agentbox-setup/SKILL.md', import.meta.url));\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n const st = await stat(p);\n return st.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Idempotently install the host-side `/agentbox-setup` claude skill so the\n * user can re-invoke it later from any claude session. Never overwrites: a\n * pre-existing SKILL.md is assumed to be intentional (user customized it).\n * The existing `ensureClaudeVolume` rsync (packages/sandbox-docker/src/claude.ts)\n * propagates ~/.claude/skills/ into every box automatically.\n *\n * `opts.targetFile` and `opts.sourceFile` exist for tests.\n */\nexport async function installAgentboxSetupSkill(\n opts: { targetFile?: string; sourceFile?: string } = {},\n): Promise<{ installed: boolean; targetFile: string }> {\n const targetFile = opts.targetFile ?? HOST_SKILL_FILE;\n const targetDir = join(targetFile, '..');\n if (await fileExists(targetFile)) return { installed: false, targetFile };\n const src = opts.sourceFile ?? bundledSkillPath();\n if (!(await fileExists(src))) {\n // Bundled asset missing — happens if the user built without copying share/.\n // Don't crash the wizard, just skip the install silently.\n return { installed: false, targetFile };\n }\n await mkdir(targetDir, { recursive: true, mode: 0o700 });\n await copyFile(src, targetFile);\n return { installed: true, targetFile };\n}\n\nexport function buildSetupInitialPrompt(workspace: string): string {\n const name = basename(workspace);\n return (\n `The user just opened a new agentbox sandbox for \"${name}\" but the workspace has no agentbox.yaml yet. ` +\n `Please run the /agentbox-setup skill (or read ${IN_BOX_SETUP_GUIDE_PATH} if the skill is not loaded), ` +\n `then explore /workspace and propose an agentbox.yaml. Save the file to /workspace/agentbox.yaml. ` +\n `Then run \\`agentbox-ctl reload\\` from inside the box so the already-running supervisor applies the new config ` +\n `and immediately runs the declared tasks and autostarts the services (no box restart needed). ` +\n `When done, summarise what services and tasks you declared, and remind the user how to land the file on the host ` +\n `(commit through the bind-mounted .git, or \"agentbox pull env\" on the host).`\n );\n}\n\nexport type WizardAction = 'proceed' | 'switch-to-claude' | 'launch-with-prompt';\n\nexport interface WizardOutcome {\n action: WizardAction;\n initialPrompt?: string;\n}\n\ninterface WizardArgs {\n workspace: string;\n yes: boolean;\n command: 'create' | 'claude';\n /**\n * Resolved checkpoint ref this box will start from (explicit `--snapshot`\n * or the project's `box.defaultCheckpoint`), if any. When set, the project\n * is already configured: the checkpoint carries the warm state *and* the\n * agentbox.yaml that was present when it was captured, so we skip the\n * \"generate one?\" prompt entirely.\n */\n checkpointRef?: string;\n}\n\n/**\n * Sentinel env var set by `agentbox create` when it re-dispatches to\n * `agentbox claude`. It tells the inner wizard the user has already\n * confirmed: skip the prompts and slot the initial setup prompt for claude.\n */\nexport const WIZARD_AUTOLAUNCH_ENV = 'AGENTBOX_WIZARD_AUTOLAUNCH';\n\nexport async function maybeRunSetupWizard(args: WizardArgs): Promise<WizardOutcome> {\n // Re-entry from agentbox create → claude: outer pass already prompted +\n // installed the skill; just inject the initial prompt for claude.\n if (process.env[WIZARD_AUTOLAUNCH_ENV] === '1') {\n if (args.command !== 'claude') return { action: 'proceed' };\n if (args.checkpointRef) return { action: 'proceed' };\n const proj = await findProjectRoot(args.workspace);\n if (proj.hasAgentboxYaml) return { action: 'proceed' };\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n };\n }\n\n if (args.yes) return { action: 'proceed' };\n if (!process.stdin.isTTY) return { action: 'proceed' };\n\n const proj = await findProjectRoot(args.workspace);\n if (proj.hasAgentboxYaml) return { action: 'proceed' };\n\n // A configured default checkpoint means the project is already set up — the\n // checkpoint carries node_modules/env *and* the agentbox.yaml from when it\n // was captured. Don't nag to regenerate one.\n if (args.checkpointRef) {\n log.info(`starting from checkpoint \"${args.checkpointRef}\"; skipping agentbox.yaml setup`);\n return { action: 'proceed' };\n }\n\n const go = await confirm({\n message: 'Set up a new Agentbox environment?',\n initialValue: true,\n });\n if (isCancel(go) || !go) return { action: 'proceed' };\n\n // Install the skill once so the user can re-invoke /agentbox-setup later.\n // Silent on subsequent runs.\n try {\n const r = await installAgentboxSetupSkill();\n if (r.installed) {\n log.success(`installed /agentbox-setup skill at ${r.targetFile}`);\n }\n } catch (err) {\n log.warn(`could not install /agentbox-setup skill: ${(err as Error).message}`);\n }\n\n // For `agentbox create`, the only sensible yes-path is to hand off to\n // `agentbox claude` (that's where the agent runs). No second prompt — the\n // first confirm already captured the user's intent.\n if (args.command === 'create') return { action: 'switch-to-claude' };\n\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n };\n}\n\n/**\n * Map the create command's parsed options to an argv that can be re-dispatched\n * through `claudeCommand.parseAsync(['node', 'agentbox', 'claude', ...args])`.\n * `--yes` is intentionally NOT passed through here: the wizard already prompted\n * the user, and forwarding `--yes` would suppress claude's own setup-token\n * prompt that the user typically wants on first run.\n */\nexport interface CreatePassthroughOptions {\n workspace?: string;\n name?: string;\n hostSnapshot?: boolean;\n snapshot?: string;\n image?: string;\n withPlaywright?: boolean;\n vnc?: boolean;\n sharedDockerCache?: boolean;\n}\n\nexport function passthroughFlags(opts: CreatePassthroughOptions): string[] {\n const out: string[] = [];\n if (opts.workspace) out.push('--workspace', opts.workspace);\n if (opts.name) out.push('--name', opts.name);\n if (opts.hostSnapshot === true) out.push('--host-snapshot');\n if (opts.hostSnapshot === false) out.push('--no-host-snapshot');\n if (opts.snapshot) out.push('--snapshot', opts.snapshot);\n if (opts.image) out.push('--image', opts.image);\n if (opts.withPlaywright === true) out.push('--with-playwright');\n if (opts.vnc === false) out.push('--no-vnc');\n if (opts.sharedDockerCache === true) out.push('--shared-docker-cache');\n return out;\n}\n\n// Exposed for tests.\nexport const _internals = { HOST_SKILL_FILE, HOST_SKILLS_DIR, bundledSkillPath };\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n setConfigValue,\n unsetConfigValue,\n} from '@agentbox/config';\nimport {\n createCheckpoint,\n inspectBox,\n listCheckpoints,\n removeCheckpoint,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface CreateOpts {\n name?: string;\n merged?: boolean;\n setDefault?: boolean;\n}\n\nasync function projectRootFor(cwd: string, recordRoot?: string): Promise<string> {\n return recordRoot ?? (await findProjectRoot(cwd)).root;\n}\n\nconst createSub = new Command('create')\n .description('Capture a box state as a project checkpoint (<box-name>-<n>)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--name <name>', 'checkpoint name (default: <box-name>-<next>)')\n .option('--merged', 'flatten lower+upper into one tree instead of a layered delta')\n .option('--set-default', 'mark this checkpoint as the project default for new boxes')\n .action(async (idOrName: string | undefined, opts: CreateOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n const projectRoot = await projectRootFor(box.workspacePath, box.projectRoot);\n const cfg = await loadEffectiveConfig(projectRoot);\n\n const info = await createCheckpoint({\n box,\n projectRoot,\n name: opts.name,\n merged: opts.merged === true,\n setDefault: opts.setDefault === true,\n maxLayers: cfg.effective.checkpoint.maxLayers,\n onLog: (line) => log.info(line),\n });\n\n log.success(\n `checkpoint ${info.name} (${info.manifest.type}) -> ${info.dir}` +\n (opts.setDefault ? ' [project default]' : ''),\n );\n if (!opts.setDefault) {\n log.info(`make it the default for new boxes: agentbox checkpoint set-default ${info.name}`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst lsSub = new Command('ls')\n .description('List this project\\'s checkpoints')\n .action(async () => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n const cfg = await loadEffectiveConfig(projectRoot);\n const def = cfg.effective.box.defaultCheckpoint;\n const list = await listCheckpoints(projectRoot);\n if (list.length === 0) {\n process.stdout.write(`no checkpoints for ${projectRoot}\\n`);\n return;\n }\n for (const c of list) {\n const flag = c.name === def ? ' *default' : '';\n process.stdout.write(\n `${c.name} ${c.manifest.type} from ${c.manifest.sourceBoxName} ${c.manifest.createdAt}${flag}\\n`,\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst setDefaultSub = new Command('set-default')\n .description('Pin a checkpoint as the project default (box.defaultCheckpoint)')\n .argument('[ref]', 'checkpoint name (omit with --clear)')\n .option('--clear', 'unset the project default instead of setting one')\n .action(async (ref: string | undefined, opts: { clear?: boolean }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n if (opts.clear) {\n if (ref !== undefined) {\n throw new Error('pass either a <ref> or --clear, not both');\n }\n const r = await unsetConfigValue('project', 'box.defaultCheckpoint', projectRoot);\n process.stdout.write(\n r.existed\n ? `cleared project default checkpoint (wrote ${r.path})\\n`\n : `no project default checkpoint was set (${r.path})\\n`,\n );\n return;\n }\n if (ref === undefined) {\n throw new Error('missing <ref> (or pass --clear to unset the default)');\n }\n const list = await listCheckpoints(projectRoot);\n if (!list.some((c) => c.name === ref)) {\n throw new Error(`checkpoint not found: ${ref} (see \\`agentbox checkpoint ls\\`)`);\n }\n const r = await setConfigValue('project', 'box.defaultCheckpoint', ref, projectRoot);\n process.stdout.write(`project default checkpoint = ${ref} (wrote ${r.path})\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst rmSub = new Command('rm')\n .description('Delete a checkpoint')\n .argument('<ref>', 'checkpoint name')\n .option('-y, --yes', 'skip the confirmation prompt')\n .action(async (ref: string, opts: { yes?: boolean }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n if (!opts.yes) {\n const ok = await confirm({ message: `Delete checkpoint ${ref}?`, initialValue: false });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n const removed = await removeCheckpoint(projectRoot, ref);\n if (!removed) throw new Error(`checkpoint not found: ${ref}`);\n process.stdout.write(`removed checkpoint ${ref}\\n`);\n\n // Don't leave box.defaultCheckpoint dangling at a now-deleted ref —\n // future `agentbox create` would fail to resolve it. Clear it when the\n // project layer pointed here; warn (can't auto-edit) if it came from a\n // global / workspace-defaults layer instead.\n const cfg = await loadEffectiveConfig(projectRoot);\n if (cfg.layers.project.values.box?.defaultCheckpoint === ref) {\n await unsetConfigValue('project', 'box.defaultCheckpoint', projectRoot);\n log.info(`cleared project default checkpoint (was ${ref})`);\n } else if (cfg.effective.box.defaultCheckpoint === ref) {\n log.warn(\n `default checkpoint ${ref} is set outside the per-project config (global or agentbox.yaml defaults) — clear it manually`,\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nexport const checkpointCommand = new Command('checkpoint')\n .description('Capture and manage project checkpoints (warm box state new boxes can start from)')\n .addCommand(createSub, { isDefault: true })\n .addCommand(lsSub)\n .addCommand(setDefaultSub)\n .addCommand(rmSub);\n","import { spawn } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command, InvalidArgumentError } from 'commander';\nimport type { StatusReply, WaitReadyReply } from '@agentbox/ctl';\nimport { loadEffectiveConfig, type IdeFlavor as ConfigIdeFlavor, type UserConfig } from '@agentbox/config';\nimport {\n containerHex,\n ensureAgentboxTasksFile,\n execInBox,\n ideProfile,\n inspectBox,\n startBox,\n unpauseBox,\n type IdeFlavor,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface CodeOptions {\n noWait?: boolean;\n timeout?: string;\n noAutoTerminals?: boolean;\n regenTasks?: boolean;\n print?: boolean;\n ide?: IdeFlavor;\n}\n\nfunction buildCodeCliOverrides(opts: CodeOptions): Partial<UserConfig> {\n const code: NonNullable<UserConfig['code']> = {};\n if (opts.ide !== undefined) code.ide = opts.ide as ConfigIdeFlavor;\n if (opts.noWait === true) code.wait = false;\n if (opts.noAutoTerminals === true) code.autoTerminals = false;\n if (opts.timeout !== undefined) {\n const n = Number(opts.timeout);\n if (Number.isFinite(n) && Number.isInteger(n)) code.timeoutMs = n;\n }\n return Object.keys(code).length > 0 ? { code } : {};\n}\n\nfunction parseIdeFlavor(value: string): IdeFlavor {\n if (value === 'vscode' || value === 'cursor') return value;\n throw new InvalidArgumentError(`expected one of: vscode, cursor (got \"${value}\")`);\n}\n\nexport const codeCommand = new Command('code')\n .description('Open a box in VS Code or Cursor via the Dev Containers extension')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--no-wait', \"don't block on agentbox-ctl wait-ready before opening\")\n .option('--timeout <ms>', 'wait-ready timeout in milliseconds (default from config; built-in: 120000)')\n .option('--no-auto-terminals', \"don't generate /workspace/.vscode/tasks.json\")\n .option('--regen-tasks', 'overwrite a user-owned tasks.json (skips sentinel check)', false)\n .option(\n '--ide <flavor>',\n 'force a specific IDE: vscode | cursor (default from config; built-in: auto)',\n parseIdeFlavor,\n )\n .option(\n '--print',\n 'print the folder URI instead of launching the IDE (still refreshes/waits)',\n )\n .action(async (idOrName: string | undefined, opts: CodeOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // Layered config: workspace = the box's host workspace, not cwd, so\n // per-project defaults follow the box even if you run `agentbox code`\n // from elsewhere.\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: buildCodeCliOverrides(opts),\n });\n const wait = cfg.effective.code.wait;\n const autoTerminals = cfg.effective.code.autoTerminals;\n const timeoutMs = String(cfg.effective.code.timeoutMs);\n const ide = cfg.effective.code.ide;\n const forcedIde: IdeFlavor | undefined = ide === 'auto' ? undefined : (ide as IdeFlavor);\n\n // Bring the box online if it isn't already.\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info(`box is paused; unpausing`);\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info(`box is stopped; starting (remounting overlay)`);\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // Wait for tasks + autostart services to be ready.\n if (wait) {\n const reply = await runWaitReady(box.container, timeoutMs);\n if (!reply.ready) {\n const lines: string[] = [];\n if (reply.timedOut.length > 0) lines.push(`timed out: ${reply.timedOut.join(', ')}`);\n if (reply.failed.length > 0) lines.push(`failed: ${reply.failed.join(', ')}`);\n log.warn(`box not fully ready (${lines.join('; ')}). Opening anyway.`);\n } else {\n log.success('all units ready');\n }\n }\n\n // Inject .vscode/tasks.json so the IDE auto-opens terminal panels.\n // (Cursor reads the same .vscode/ path; it's a VS Code fork.)\n if (autoTerminals) {\n try {\n const services = await fetchServiceNames(box.container);\n const r = await ensureAgentboxTasksFile(box.container, services, {\n regen: opts.regenTasks,\n });\n if (r.status === 'wrote') {\n log.info(`wrote /workspace/.vscode/tasks.json (${String(services.length)} service(s))`);\n } else if (r.status === 'skipped-user-owned') {\n log.warn(\n 'user-owned .vscode/tasks.json detected; skipping auto-terminals (pass --regen-tasks to overwrite)',\n );\n }\n } catch (err) {\n log.warn(\n `auto-terminals failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const folderUri = `vscode-remote://attached-container+${containerHex(box.container)}/workspace`;\n if (opts.print) {\n process.stdout.write(folderUri + '\\n');\n return;\n }\n const exit = await launchIde(folderUri, forcedIde);\n if (exit.code !== 0) {\n log.error(`failed to launch ${exit.flavor ? ideProfile(exit.flavor).displayName : 'IDE'} via ${exit.via} (exit ${String(exit.code)})`);\n process.stdout.write(folderUri + '\\n');\n process.exit(1);\n }\n log.success(\n `opening ${box.container} in ${ideProfile(exit.flavor).displayName} (${exit.via})`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nasync function runWaitReady(container: string, timeoutMs: string): Promise<WaitReadyReply> {\n const proc = await execInBox(\n container,\n ['agentbox-ctl', 'wait-ready', '--json', '--timeout', timeoutMs],\n { user: 'vscode' },\n );\n try {\n return JSON.parse(proc.stdout) as WaitReadyReply;\n } catch {\n throw new Error(\n `agentbox-ctl wait-ready returned unparseable output: ${proc.stderr || proc.stdout}`,\n );\n }\n}\n\ninterface LaunchResult {\n code: number;\n flavor: IdeFlavor;\n via: 'cli' | 'open';\n}\n\n/**\n * Pick an IDE and launch it.\n *\n * - With `--ide <flavor>`: require that flavor's CLI; if it's missing,\n * fall back to its own protocol-handler `open` URL (the %2B bug may\n * surface) and warn.\n * - Without `--ide`: try `code` first, then `cursor`. Whichever is found\n * first wins. If neither, fall back to `open vscode://...` last.\n *\n * The folder URI passed in is the canonical `vscode-remote://` form; Cursor\n * accepts it verbatim because it inherits VS Code's URI handling.\n */\nasync function launchIde(folderUri: string, forced?: IdeFlavor): Promise<LaunchResult> {\n if (forced) {\n return launchOne(forced, folderUri);\n }\n const code = await tryCli('vscode', folderUri);\n if (code !== null) return code;\n const cursor = await tryCli('cursor', folderUri);\n if (cursor !== null) return cursor;\n // Neither CLI present. Last resort: protocol handler via `open`. We pick\n // vscode:// since that's the documented historical fallback.\n log.warn('neither `code` nor `cursor` found in PATH; falling back to `open vscode://...`');\n return launchOne('vscode', folderUri);\n}\n\n/**\n * Try the IDE's CLI. Returns null if the binary isn't in PATH so the caller\n * can try the next flavor; otherwise returns the launch result (success or\n * non-127 failure both count as \"we ran this one\").\n */\nasync function tryCli(flavor: IdeFlavor, folderUri: string): Promise<LaunchResult | null> {\n const profile = ideProfile(flavor);\n const code = await spawnCommand(profile.cli, ['--folder-uri', folderUri]);\n if (code === 127) return null;\n return { code, flavor, via: 'cli' };\n}\n\n/**\n * Run a specific flavor: CLI first; if missing (127), fall back to the\n * flavor-specific protocol handler. Surfaces the %2B-bug warning so the user\n * knows why attach may fail if it does.\n */\nasync function launchOne(flavor: IdeFlavor, folderUri: string): Promise<LaunchResult> {\n const profile = ideProfile(flavor);\n const cliCode = await spawnCommand(profile.cli, ['--folder-uri', folderUri]);\n if (cliCode !== 127) return { code: cliCode, flavor, via: 'cli' };\n log.warn(\n `\\`${profile.cli}\\` not found in PATH; falling back to \\`open ${profile.protocolScheme}://...\\` (the %2B URL-encoding bug may break attach)`,\n );\n const url = `${profile.protocolScheme}://${folderUri.replace(/^vscode-remote:\\/\\//, 'vscode-remote/')}`;\n const fallback = await spawnCommand('open', [url]);\n return { code: fallback, flavor, via: 'open' };\n}\n\nfunction spawnCommand(cmd: string, args: string[]): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { stdio: 'ignore' });\n child.once('error', () => resolve(127));\n child.once('exit', (code) => resolve(code ?? -1));\n });\n}\n\nasync function fetchServiceNames(container: string): Promise<{ name: string }[]> {\n const proc = await execInBox(container, ['agentbox-ctl', 'status', '--json'], {\n user: 'vscode',\n });\n if (proc.exitCode !== 0) return [];\n try {\n const reply = JSON.parse(proc.stdout) as StatusReply;\n return reply.services.map((s) => ({ name: s.name }));\n } catch {\n return [];\n }\n}\n","import { spawnSync } from 'node:child_process';\nimport {\n configPathFor,\n KEY_REGISTRY,\n loadEffectiveConfig,\n listProjectsConfigured,\n lookupKey,\n setConfigValue,\n unsetConfigValue,\n UserConfigError,\n type ConfigScope,\n type ConfigSource,\n type LoadedConfig,\n} from '@agentbox/config';\nimport { Command, InvalidArgumentError } from 'commander';\n\ntype EditScope = ConfigScope | 'workspace';\n\ninterface ScopeOptions {\n global?: boolean;\n project?: boolean;\n}\n\ninterface EditScopeOptions extends ScopeOptions {\n workspace?: boolean;\n}\n\ninterface GetOptions {\n all?: boolean;\n json?: boolean;\n}\n\ninterface SetOptions extends ScopeOptions {\n json?: boolean;\n}\n\ninterface ListOptions {\n scope?: 'global' | 'project' | 'workspace' | 'effective';\n includeAdvanced?: boolean;\n json?: boolean;\n}\n\ninterface PathOptions extends EditScopeOptions {\n json?: boolean;\n}\n\ninterface ListProjectsOptions {\n json?: boolean;\n}\n\nfunction resolveWriteScope(opts: ScopeOptions): ConfigScope {\n if (opts.global && opts.project) {\n fail('pass at most one of --global / --project');\n }\n if (opts.global) return 'global';\n return 'project'; // default per spec\n}\n\nfunction resolveEditScope(opts: EditScopeOptions): EditScope {\n const flags = [opts.global, opts.project, opts.workspace].filter(Boolean).length;\n if (flags > 1) fail('pass at most one of --global / --project / --workspace');\n if (opts.workspace) return 'workspace';\n if (opts.global) return 'global';\n return 'project';\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`error: ${message}\\n`);\n process.exit(1);\n}\n\nfunction leafValue(loaded: LoadedConfig, key: string): unknown {\n const idx = key.indexOf('.');\n const branch = key.slice(0, idx);\n const leaf = key.slice(idx + 1);\n return (loaded.effective as unknown as Record<string, Record<string, unknown>>)[branch]?.[leaf];\n}\n\nfunction rawLeafFromValues(\n values: Record<string, unknown> | undefined,\n key: string,\n): unknown {\n if (!values) return undefined;\n const idx = key.indexOf('.');\n const b = (values as Record<string, unknown>)[key.slice(0, idx)];\n if (!b || typeof b !== 'object') return undefined;\n return (b as Record<string, unknown>)[key.slice(idx + 1)];\n}\n\nfunction describeSource(source: ConfigSource, loaded: LoadedConfig): string {\n switch (source) {\n case 'cli':\n return 'cli flag';\n case 'workspace':\n return loaded.layers.workspace.path\n ? `workspace ${loaded.layers.workspace.path}`\n : 'workspace';\n case 'project':\n return `project ${loaded.layers.project.path}`;\n case 'global':\n return `global ${loaded.layers.global.path}`;\n case 'default':\n return 'built-in default';\n }\n}\n\nfunction fmtValue(v: unknown): string {\n if (v === undefined) return '<unset>';\n if (typeof v === 'string') return v;\n return String(v);\n}\n\nconst getCommand = new Command('get')\n .description('Print the effective value of a config key (with --all, show every layer)')\n .argument('<key>', 'dot-path key (e.g. box.hostSnapshot)')\n .option('--all', 'print every layer with its source')\n .option('--json', 'machine-readable output')\n .action(async (key: string, opts: GetOptions) => {\n const desc = lookupKey(key);\n if (!desc) fail(`unknown key \"${key}\"`);\n\n try {\n const loaded = await loadEffectiveConfig(process.cwd());\n const value = leafValue(loaded, key);\n const source = loaded.sources[key] ?? 'default';\n\n if (opts.json) {\n const layerView = (\n values: Record<string, unknown> | undefined,\n path: string | null,\n ): { value: unknown; path: string | null } => ({\n value: rawLeafFromValues(values, key) ?? null,\n path,\n });\n process.stdout.write(\n JSON.stringify(\n {\n key,\n value: value ?? null,\n source,\n layers: opts.all\n ? {\n cli: layerView(loaded.layers.cli.values as Record<string, unknown>, null),\n workspace: layerView(\n loaded.layers.workspace.values as Record<string, unknown>,\n loaded.layers.workspace.path,\n ),\n project: layerView(\n loaded.layers.project.values as Record<string, unknown>,\n loaded.layers.project.path,\n ),\n global: layerView(\n loaded.layers.global.values as Record<string, unknown>,\n loaded.layers.global.path,\n ),\n default: { value: leafValue({ ...loaded, effective: loaded.layers.defaults } as LoadedConfig, key) ?? null, path: null },\n }\n : undefined,\n },\n null,\n 2,\n ) + '\\n',\n );\n return;\n }\n\n if (opts.all) {\n const lines = [\n `${key}:`,\n ` effective: ${fmtValue(value)} (${describeSource(source, loaded)})`,\n ` cli: ${fmtValue(rawLeafFromValues(loaded.layers.cli.values as Record<string, unknown>, key))}`,\n ` workspace: ${fmtValue(rawLeafFromValues(loaded.layers.workspace.values as Record<string, unknown>, key))}` +\n (loaded.layers.workspace.path ? ` ${loaded.layers.workspace.path}` : ''),\n ` project: ${fmtValue(rawLeafFromValues(loaded.layers.project.values as Record<string, unknown>, key))} ${loaded.layers.project.path}`,\n ` global: ${fmtValue(rawLeafFromValues(loaded.layers.global.values as Record<string, unknown>, key))} ${loaded.layers.global.path}`,\n ` default: ${fmtValue(leafValue({ ...loaded, effective: loaded.layers.defaults } as LoadedConfig, key))}`,\n ];\n process.stdout.write(lines.join('\\n') + '\\n');\n return;\n }\n\n process.stdout.write(`${key} = ${fmtValue(value)} (from: ${describeSource(source, loaded)})\\n`);\n } catch (err) {\n handleError(err);\n }\n });\n\nconst setCommand = new Command('set')\n .description('Set a config key in the global or per-project file (default: --project)')\n .argument('<key>', 'dot-path key (e.g. box.hostSnapshot)')\n .argument('<value>', 'value to set; coerced to the key\\'s declared type')\n .option('--global', \"write to ~/.agentbox/config.yaml\")\n .option('--project', 'write to ~/.agentbox/projects/<hash>/config.yaml (default)')\n .action(async (key: string, value: string, opts: SetOptions) => {\n const scope = resolveWriteScope(opts);\n try {\n const r = await setConfigValue(scope, key, value, process.cwd(), { raw: true });\n if (opts.json) {\n process.stdout.write(\n JSON.stringify({ key, scope, value: r.coerced, path: r.path }, null, 2) + '\\n',\n );\n } else {\n process.stdout.write(`${key} = ${fmtValue(r.coerced)} (wrote ${r.path})\\n`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\nconst unsetCommand = new Command('unset')\n .description('Remove a config key from the global or per-project file (default: --project)')\n .argument('<key>', 'dot-path key (e.g. box.hostSnapshot)')\n .option('--global', \"edit ~/.agentbox/config.yaml\")\n .option('--project', 'edit ~/.agentbox/projects/<hash>/config.yaml (default)')\n .action(async (key: string, opts: ScopeOptions) => {\n const scope = resolveWriteScope(opts);\n try {\n const r = await unsetConfigValue(scope, key, process.cwd());\n if (r.existed) {\n process.stdout.write(`removed ${key} from ${r.path}\\n`);\n } else {\n process.stdout.write(`${key} was not set in ${r.path}\\n`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\nfunction parseListScope(value: string): ListOptions['scope'] {\n if (value === 'global' || value === 'project' || value === 'workspace' || value === 'effective') {\n return value;\n }\n throw new InvalidArgumentError(`expected one of: global, project, workspace, effective`);\n}\n\nconst listCommand = new Command('list')\n .description('List config values, either for a single layer or the merged effective view')\n .option(\n '--scope <s>',\n 'one of: global, project, workspace, effective (default: effective)',\n parseListScope,\n 'effective',\n )\n .option('--include-advanced', 'include advanced keys (image, ports)')\n .option('--json', 'machine-readable output')\n .action(async (opts: ListOptions) => {\n try {\n const loaded = await loadEffectiveConfig(process.cwd());\n const scope = opts.scope ?? 'effective';\n const showAdvanced = !!opts.includeAdvanced;\n const visibleKeys = KEY_REGISTRY.filter((d) => showAdvanced || !d.advanced);\n\n if (opts.json) {\n const obj: Record<string, unknown> = {};\n for (const desc of visibleKeys) {\n const value = pickFromScope(loaded, scope, desc.key);\n obj[desc.key] = scope === 'effective'\n ? { value: value ?? null, source: loaded.sources[desc.key] ?? 'default' }\n : { value: value ?? null };\n }\n process.stdout.write(JSON.stringify({ scope, keys: obj }, null, 2) + '\\n');\n return;\n }\n\n if (scope === 'effective') {\n const lines: string[] = [];\n for (const desc of visibleKeys) {\n const value = leafValue(loaded, desc.key);\n const source = loaded.sources[desc.key] ?? 'default';\n lines.push(`${desc.key.padEnd(28)} ${fmtValue(value).padEnd(20)} (${source})`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n return;\n }\n\n const layerPath =\n scope === 'global'\n ? loaded.layers.global.path\n : scope === 'project'\n ? loaded.layers.project.path\n : loaded.layers.workspace.path;\n process.stdout.write(`# ${scope} ${layerPath ?? '(no agentbox.yaml in ancestors)'}\\n`);\n let any = false;\n for (const desc of visibleKeys) {\n const v = pickFromScope(loaded, scope, desc.key);\n if (v === undefined) continue;\n any = true;\n process.stdout.write(`${desc.key.padEnd(28)} ${fmtValue(v)}\\n`);\n }\n if (!any) process.stdout.write('(no values set in this scope)\\n');\n } catch (err) {\n handleError(err);\n }\n });\n\nfunction pickFromScope(loaded: LoadedConfig, scope: ListOptions['scope'], key: string): unknown {\n switch (scope) {\n case 'global':\n return rawLeafFromValues(loaded.layers.global.values as Record<string, unknown>, key);\n case 'project':\n return rawLeafFromValues(loaded.layers.project.values as Record<string, unknown>, key);\n case 'workspace':\n return rawLeafFromValues(loaded.layers.workspace.values as Record<string, unknown>, key);\n case 'effective':\n default:\n return leafValue(loaded, key);\n }\n}\n\nconst pathCommand = new Command('path')\n .description('Print the file path for a config scope (default: --project)')\n .option('--global', \"~/.agentbox/config.yaml\")\n .option('--project', '~/.agentbox/projects/<hash>/config.yaml (default)')\n .option('--workspace', './agentbox.yaml (resolved by walking up to the nearest one)')\n .option('--json', 'machine-readable output')\n .action(async (opts: PathOptions) => {\n try {\n const scope = resolveEditScope(opts);\n const path = await configPathFor(scope, process.cwd());\n if (opts.json) process.stdout.write(JSON.stringify({ scope, path }, null, 2) + '\\n');\n else process.stdout.write(`${path}\\n`);\n } catch (err) {\n handleError(err);\n }\n });\n\nconst editCommand = new Command('edit')\n .description('Open a config file in $EDITOR (default: --project)')\n .option('--global', 'edit ~/.agentbox/config.yaml')\n .option('--project', 'edit ~/.agentbox/projects/<hash>/config.yaml (default)')\n .option('--workspace', \"edit ./agentbox.yaml (the resolved one — and remember to fill in the `defaults:` block)\")\n .action(async (opts: EditScopeOptions) => {\n try {\n const scope = resolveEditScope(opts);\n const path = await configPathFor(scope, process.cwd());\n const editor = process.env['EDITOR'] || process.env['VISUAL'] || 'vi';\n const child = spawnSync(editor, [path], { stdio: 'inherit' });\n process.exit(child.status ?? 0);\n } catch (err) {\n handleError(err);\n }\n });\n\nconst listProjectsCommand = new Command('list-projects')\n .description('List directories that have per-user-per-project config recorded under ~/.agentbox/projects/')\n .option('--json', 'machine-readable output')\n .action(async (opts: ListProjectsOptions) => {\n try {\n const projects = await listProjectsConfigured();\n if (opts.json) {\n process.stdout.write(JSON.stringify(projects, null, 2) + '\\n');\n return;\n }\n if (projects.length === 0) {\n process.stdout.write('(no per-project config recorded)\\n');\n return;\n }\n for (const p of projects) {\n process.stdout.write(\n `${p.hash} ${p.originalPath}${p.hasConfigFile ? '' : ' (meta only — no config.yaml)'}\\n`,\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n\nfunction handleError(err: unknown): never {\n if (err instanceof UserConfigError) {\n process.stderr.write(`error: ${err.message}\\n`);\n process.exit(2);\n }\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`error: ${msg}\\n`);\n process.exit(1);\n}\n\nexport const configCommand = new Command('config')\n .description('Read / write layered config (global, per-project, workspace `defaults:` block)')\n .addCommand(getCommand)\n .addCommand(setCommand)\n .addCommand(unsetCommand)\n .addCommand(listCommand)\n .addCommand(pathCommand)\n .addCommand(editCommand)\n .addCommand(listProjectsCommand);\n","import { intro, log, outro, spinner } from '@clack/prompts';\nimport {\n bumpProjectGcCounter,\n findProjectRoot,\n loadEffectiveConfig,\n pruneOrphanProjectConfigs,\n type UserConfig,\n} from '@agentbox/config';\nimport { createBox, listBoxes } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { execSync, spawnSync } from 'node:child_process';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { resolveLimits } from '../limits.js';\nimport {\n maybeRunSetupWizard,\n passthroughFlags,\n WIZARD_AUTOLAUNCH_ENV,\n} from '../wizard.js';\nimport { claudeCommand } from './claude.js';\n\ninterface CreateOptions {\n workspace: string;\n name?: string;\n hostSnapshot?: boolean; // commander: --host-snapshot / --no-host-snapshot => true / false / undefined\n snapshot?: string; // --snapshot <ref>: start from this checkpoint\n image?: string;\n attach?: boolean;\n yes?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n}\n\nfunction buildCliOverrides(opts: CreateOptions): Partial<UserConfig> {\n const box: NonNullable<UserConfig['box']> = {};\n if (opts.hostSnapshot !== undefined) box.hostSnapshot = opts.hostSnapshot;\n if (opts.image !== undefined) box.image = opts.image;\n if (opts.withPlaywright === true) box.withPlaywright = true;\n if (opts.withEnv === true) box.withEnv = true;\n if (opts.vnc === false) box.vnc = false;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n return Object.keys(box).length > 0 ? { box } : {};\n}\n\nfunction resolveUseSnapshot(\n opts: CreateOptions,\n configDefault: boolean | undefined,\n): boolean {\n // host-snapshot (frozen APFS clone of the host workspace): on by default;\n // explicit CLI flag wins, then config layers. No interactive prompt — power\n // users override via `--no-host-snapshot` or `box.hostSnapshot: false`.\n if (opts.hostSnapshot === false) return false;\n if (opts.hostSnapshot === true) return true;\n return configDefault ?? true;\n}\n\n/**\n * Checkpoint to start from: explicit `--snapshot <ref>` wins, else the\n * project's `box.defaultCheckpoint` (empty string = none).\n */\nfunction resolveCheckpointRef(\n opts: CreateOptions,\n configDefault: string,\n): string | undefined {\n if (opts.snapshot && opts.snapshot.length > 0) return opts.snapshot;\n return configDefault.length > 0 ? configDefault : undefined;\n}\n\nfunction attachShell(container: string): never {\n // execSync is fine here: we hand control to docker exec and exit on its exit.\n const child = spawnSync('docker', ['exec', '-it', container, 'bash'], {\n stdio: 'inherit',\n });\n process.exit(child.status ?? 0);\n}\n\nexport const createCommand = new Command('create')\n .description('Create and start a new agent box (Docker container with FUSE overlay)')\n .option('-w, --workspace <path>', 'host workspace to mount', process.cwd())\n .option('-n, --name <name>', 'friendly box name (default: <workspace-basename>-<id>)')\n .option('--host-snapshot', 'use a frozen APFS clone of the host workspace as the overlay lower')\n .option('--no-host-snapshot', 'bind the live workspace directly (host edits leak into reads)')\n .option(\n '--snapshot <ref>',\n 'start from a project checkpoint (see `agentbox checkpoint`); overrides box.defaultCheckpoint',\n )\n .option('--image <ref>', 'override the box image', undefined)\n .option('--attach', 'drop into a shell inside the box after it is ready')\n .option('--with-playwright', 'also install @playwright/cli@latest globally inside the box')\n .option(\n '--with-env',\n 'copy host env/config files (.env*, secrets.toml, agentbox.yaml, ...) into /workspace at create time (gitignore-bypassing)',\n )\n .option('--no-vnc', 'disable the per-box Xvnc + noVNC web client (on by default)')\n .option(\n '--shared-docker-cache',\n \"use the shared 'agentbox-docker-cache' volume for in-box docker images (preserved on destroy; only one box can run at a time when set)\",\n )\n .option('--memory <size>', 'memory ceiling (e.g. 512m, 2g); unset = unlimited')\n .option('--cpus <n>', 'CPU count cap (fractional ok, e.g. 1.5); unset = unlimited')\n .option('--pids-limit <n>', 'max process count (PIDs cgroup); unset = unlimited')\n .option('--disk <size>', 'best-effort writable-layer size (e.g. 10g); no-op on overlay2/macOS')\n .option('-y, --yes', 'skip prompts, accept defaults (host-snapshot=on)')\n .action(async (opts: CreateOptions) => {\n intro('agentbox create');\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const checkpointRef = resolveCheckpointRef(opts, cfg.effective.box.defaultCheckpoint);\n\n // First-run wizard: when no agentbox.yaml exists, optionally hand off to\n // `agentbox claude` so the agent can interactively generate one. Skipped\n // when starting from a checkpoint (it already carries the config).\n const wiz = await maybeRunSetupWizard({\n workspace: opts.workspace,\n yes: !!opts.yes,\n command: 'create',\n checkpointRef,\n });\n if (wiz.action === 'switch-to-claude') {\n process.env[WIZARD_AUTOLAUNCH_ENV] = '1';\n try {\n await claudeCommand.parseAsync(passthroughFlags(opts), { from: 'user' });\n } finally {\n delete process.env[WIZARD_AUTOLAUNCH_ENV];\n }\n return;\n }\n\n const useSnapshot = resolveUseSnapshot(opts, cfg.effective.box.hostSnapshot);\n\n const s = spinner();\n s.start('creating box');\n try {\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set in any layer.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n const result = await createBox({\n workspacePath: opts.workspace,\n name: opts.name,\n useSnapshot,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => s.message(clampSpinnerLine(line)),\n });\n s.stop(`box ${result.record.container} ready`);\n\n log.info(`id: ${result.record.id}`);\n if (typeof result.record.projectIndex === 'number') {\n log.info(`n: ${String(result.record.projectIndex)} (in ${projectRoot})`);\n }\n log.info(`container: ${result.record.container}`);\n log.info(`image: ${result.record.image}${result.imageBuilt ? ' (built just now)' : ''}`);\n log.info(`lower: ${result.record.lowerPath}`);\n log.info(`upper: ${result.record.upperVolume}`);\n if (result.record.snapshotDir) {\n log.info(`snapshot: ${result.record.snapshotDir}`);\n }\n if (result.record.checkpointSource) {\n log.info(\n `checkpoint: ${result.record.checkpointSource.ref} (${result.record.checkpointSource.type})`,\n );\n }\n\n for (const check of result.overlayChecks) {\n log.success(`${check.name} — ${check.detail}`);\n }\n\n log.message(\n [\n '',\n 'Try it:',\n ` docker exec -it ${result.record.container} bash`,\n ` docker exec ${result.record.container} ls /workspace`,\n '',\n 'Destroy:',\n ` docker rm -f ${result.record.container}`,\n ` docker volume rm ${result.record.upperVolume}`,\n ].join('\\n'),\n );\n\n // Periodic best-effort housekeeping: every Nth create, reap per-project\n // config dirs whose source workspace folder was deleted. Must never fail\n // or slow down create.\n const m = cfg.effective.maintenance;\n if (m.pruneProjectConfigs) {\n try {\n const n = await bumpProjectGcCounter();\n if (n % m.pruneProjectConfigsEvery === 0) {\n const boxes = await listBoxes();\n const protectedPaths = boxes\n .map((b) => b.projectRoot)\n .filter((p): p is string => typeof p === 'string');\n const res = await pruneOrphanProjectConfigs({ protectedPaths });\n if (res.removed.length > 0) {\n log.info(\n `cleaned ${String(res.removed.length)} orphan project config dir(s): ` +\n res.removed.map((r) => r.originalPath).join(', '),\n );\n }\n }\n } catch {\n /* best-effort: project-config GC must never break create */\n }\n }\n\n outro('done');\n\n if (opts.attach) {\n attachShell(result.record.container);\n }\n } catch (err) {\n s.stop('failed');\n const msg = err instanceof Error ? err.message : String(err);\n log.error(msg);\n // Help the user clean up partial state.\n try {\n const running = execSync('docker ps --format \"{{.Names}}\"', {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString()\n .split('\\n')\n .filter((n) => n.startsWith('agentbox-'));\n if (running.length > 0) {\n log.warn(`leftover containers: ${running.join(', ')}`);\n log.warn(`remove with: docker rm -f ${running.join(' ')}`);\n }\n } catch {\n /* best-effort */\n }\n process.exit(1);\n }\n });\n","import { spawn } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { findProjectRoot, loadEffectiveConfig } from '@agentbox/config';\nimport {\n buildClaudeDashboardAttachArgv,\n buildShellArgv,\n claudeSessionInfo,\n createBox,\n destroyBox,\n ensureBoxBrowser,\n listBoxes,\n pauseBox,\n rebuildPluginNativeDeps,\n startBox,\n startClaudeSession,\n stopBox,\n unpauseBox,\n type ListedBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { resolveClaudeAuth } from '../auth.js';\nimport { resolveLimits } from '../limits.js';\nimport { Compositor, type RightTarget } from '../dashboard/compositor.js';\nimport type { PtySpawn, TerminalCtor } from '../dashboard/pty-session.js';\nimport { NEW_BOX_ID, NEW_BOX_LABEL, type SidebarBox } from '../dashboard/sidebar.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DashboardOptions {\n project?: boolean;\n}\n\n/**\n * Sidebar / switch order: group by project (so the global view doesn't\n * interleave per-project indices), then projectIndex, then name.\n */\nfunction sortBoxes(boxes: ListedBox[]): ListedBox[] {\n return [...boxes].sort((a, b) => {\n const ap = a.projectRoot ?? '';\n const bp = b.projectRoot ?? '';\n if (ap !== bp) return ap.localeCompare(bp);\n const ai = a.projectIndex ?? Number.POSITIVE_INFINITY;\n const bi = b.projectIndex ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction scoped(all: boolean, projectRoot: string, boxes: ListedBox[]): ListedBox[] {\n return sortBoxes(all ? boxes : boxes.filter((b) => b.projectRoot === projectRoot));\n}\n\nfunction toSidebar(b: ListedBox): SidebarBox {\n return {\n id: b.id,\n name: b.name,\n state: b.state,\n claudeActivity: b.claudeActivity,\n sessionTitle: b.claudeSessionTitle,\n index: b.projectIndex,\n project: b.projectRoot,\n };\n}\n\nexport const dashboardCommand = new Command('dashboard')\n .description('Box list + the selected box live Agent session')\n .argument('[box]', 'initial box (default: first running box; -p restricts to the cwd project)')\n .option('-p, --project', \"only this project's boxes (default: all boxes globally)\")\n .action(async (idOrName: string | undefined, opts: DashboardOptions) => {\n try {\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n log.error('agentbox dashboard needs an interactive terminal');\n process.exit(2);\n }\n\n // node-pty is an optionalDependency and @xterm/headless is CJS — both are\n // dynamic-imported here so a missing native prebuild (or the CJS named\n // export issue) degrades only the dashboard, never the rest of the CLI.\n let ptySpawn: PtySpawn;\n let termCtor: TerminalCtor;\n try {\n const ptyMod = (await import('@homebridge/node-pty-prebuilt-multiarch')) as Record<\n string,\n unknown\n >;\n const xtermMod = (await import('@xterm/headless')) as Record<string, unknown>;\n const spawn =\n (ptyMod['spawn'] as unknown) ??\n (ptyMod['default'] as Record<string, unknown> | undefined)?.['spawn'];\n const Terminal =\n (xtermMod['Terminal'] as unknown) ??\n (xtermMod['default'] as Record<string, unknown> | undefined)?.['Terminal'];\n if (typeof spawn !== 'function' || typeof Terminal !== 'function') {\n throw new Error('terminal backend missing expected exports');\n }\n ptySpawn = spawn as unknown as PtySpawn;\n termCtor = Terminal as unknown as TerminalCtor;\n } catch {\n log.error(\n 'agentbox dashboard is unavailable here (native terminal backend failed to load)',\n );\n log.info('use `agentbox claude` / `agentbox claude attach` instead');\n process.exit(2);\n }\n\n const project = await findProjectRoot(process.cwd());\n let showAll = !opts.project; // default: every box globally; -p scopes to cwd project\n const full = await listBoxes();\n const scoped0 = scoped(showAll, project.root, full);\n\n let initialId: string;\n if (idOrName !== undefined) {\n const picked = await resolveBoxOrExit(idOrName);\n initialId = picked.id;\n if (!scoped0.some((b) => b.id === picked.id)) showAll = true; // widen so it shows\n } else if (scoped0.length === 0) {\n // No boxes yet — land on the synthetic create entry instead of bailing.\n initialId = NEW_BOX_ID;\n } else {\n initialId = (scoped0.find((b) => b.state === 'running') ?? scoped0[0]!).id;\n }\n\n const newBoxEntry: SidebarBox = { id: NEW_BOX_ID, name: NEW_BOX_LABEL, state: 'new' };\n const listCandidates = async (): Promise<SidebarBox[]> => [\n newBoxEntry,\n ...scoped(showAll, project.root, await listBoxes()).map(toSidebar),\n ];\n\n const resolveTarget = async (boxId: string): Promise<RightTarget> => {\n if (boxId === NEW_BOX_ID) return { kind: 'create-menu', where: project.root };\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return { kind: 'placeholder', lines: ['', ' box not found'] };\n if (box.state === 'paused' || box.state === 'stopped') {\n return { kind: 'lifecycle-menu', state: box.state };\n }\n if (box.state !== 'running') {\n return {\n kind: 'placeholder',\n lines: [\n '',\n ` box ${box.name} is ${box.state}.`,\n ` Start it: agentbox start ${box.name}`,\n ],\n };\n }\n const info = await claudeSessionInfo(box.container);\n if (info.running) {\n return {\n kind: 'attach',\n argv: buildClaudeDashboardAttachArgv(box.container, info.sessionName),\n };\n }\n return { kind: 'menu' };\n };\n\n const findBox = async (boxId: string): Promise<ListedBox> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) throw new Error('box not found');\n if (box.state !== 'running') throw new Error(`box is ${box.state}`);\n return box;\n };\n\n const startClaude = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n // Idempotent + marker-gated: needed the first time a box that never ran\n // Claude starts one; a no-op afterwards. (No host ~/.claude re-sync —\n // already synced at `agentbox create`; == `claude start --no-sync-config`.)\n await rebuildPluginNativeDeps(box.container, {\n volume: box.claudeConfigVolume,\n });\n await startClaudeSession({ container: box.container, claudeArgs: [], boxName: box.name });\n const info = await claudeSessionInfo(box.container);\n return {\n kind: 'attach',\n argv: buildClaudeDashboardAttachArgv(box.container, info.sessionName),\n mode: 'claude',\n };\n };\n\n const openShell = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n return { kind: 'attach', argv: buildShellArgv(box.container), mode: 'shell' };\n };\n\n // Non-interactive box creation from the \"+ New box\" entry: config\n // defaults only (no CLI overrides, no wizard, no setup-token prompt —\n // the TUI can't prompt). Mirrors the `agentbox claude` create block.\n const createNewBox = async (\n withClaude: boolean,\n onProgress: (line: string) => void,\n ): Promise<{ boxId: string; attach?: RightTarget }> => {\n const cfg = await loadEffectiveConfig(project.root);\n const auth = await resolveClaudeAuth(process.env);\n const checkpointRef =\n cfg.effective.box.defaultCheckpoint.length > 0\n ? cfg.effective.box.defaultCheckpoint\n : undefined;\n const result = await createBox({\n workspacePath: project.root,\n useSnapshot: cfg.effective.box.hostSnapshot ?? true,\n checkpointRef,\n image: cfg.effective.box.image,\n claudeConfig: { isolate: cfg.effective.box.isolateClaudeConfig },\n claudeEnv: auth.env,\n withPlaywright:\n cfg.effective.box.withPlaywright ||\n cfg.effective.browser.default !== 'agent-browser',\n withEnv: cfg.effective.box.withEnv,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n limits: resolveLimits(cfg.effective.box, {}),\n projectRoot: project.root,\n onLog: onProgress,\n });\n if (!withClaude) return { boxId: result.record.id };\n await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume,\n });\n await startClaudeSession({\n container: result.record.container,\n claudeArgs: [],\n boxName: result.record.name,\n });\n const info = await claudeSessionInfo(result.record.container);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n argv: buildClaudeDashboardAttachArgv(result.record.container, info.sessionName),\n mode: 'claude',\n },\n };\n };\n\n // Detached + stdio ignored: never blocks the dashboard loop and can't\n // write into the alt-screen. (`open` mirrors browser.ts but not\n // spawnSync/inherit, which would corrupt the TUI.)\n const detach = (cmd: string, args: string[]): void => {\n spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();\n };\n\n const findEndpointUrl = async (\n boxId: string,\n kind: 'vnc' | 'web',\n ): Promise<{ name: string; url: string | null }> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return { name: boxId, url: null };\n const ep = box.endpoints.endpoints.find((e) => e.kind === kind);\n return { name: box.name, url: ep && ep.reachable && ep.url ? ep.url : null };\n };\n\n // The box web-app URL plus whether a service actually declares `expose:`\n // (engine-independent: the `web` endpoint is only reachable+url'd when a\n // service is exposed and the host port is resolved). On OrbStack prefer\n // the stable <container>.orb.local domain (routes to :80; WebProxy\n // forwards to the exposed service) over the loopback port, which Docker\n // reallocates on every restart. Mirrors `agentbox browser`. Other\n // engines have no `.local` DNS, so use the published loopback endpoint.\n const webTarget = (box: ListedBox): { url: string; exposed: boolean } => {\n const ep = box.endpoints.endpoints.find((e) => e.kind === 'web');\n const exposed = Boolean(ep && ep.reachable && ep.url);\n const url = box.endpoints.domainIsOrb\n ? `http://${box.endpoints.domain}`\n : exposed && ep?.url\n ? ep.url\n : `http://${box.endpoints.domain}`;\n return { url, exposed };\n };\n\n const openVnc = async (boxId: string): Promise<string> => {\n const { url } = await findEndpointUrl(boxId, 'vnc');\n if (!url) return 'VNC not available for this box';\n let exposedWebUrl: string | null = null;\n try {\n const box = await findBox(boxId);\n const web = webTarget(box);\n if (web.exposed) exposedWebUrl = web.url;\n const br = await ensureBoxBrowser(box.container);\n if (!br.up) return `VNC: in-box browser unavailable (${br.reason ?? 'box not running?'})`;\n } catch {\n // Best-effort — still open the viewer even if the box isn't running.\n }\n detach('open', [url]);\n if (exposedWebUrl) {\n detach('open', [exposedWebUrl]);\n return 'Opening VNC + web in browser…';\n }\n return 'Opening VNC in browser…';\n };\n\n const openWeb = async (boxId: string): Promise<string> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return 'box not found';\n const { url } = webTarget(box);\n detach('open', [url]);\n return `Opening ${url.replace(/^https?:\\/\\//, '')}…`;\n };\n\n const openCode = async (boxId: string): Promise<string> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return 'box not found';\n // Reuse the real `agentbox code` out-of-process (IDE detection,\n // code→cursor fallback) without its up-to-120s wait-ready blocking us.\n detach(process.execPath, [process.argv[1]!, 'code', box.name, '--no-wait']);\n return 'Launching VS Code / Cursor…';\n };\n\n const resumeBox = async (boxId: string): Promise<void> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) throw new Error('box not found');\n if (box.state === 'paused') await unpauseBox(box.id);\n else await startBox(box.id);\n };\n\n const pauseBoxAction = async (boxId: string): Promise<void> => {\n await pauseBox(boxId);\n };\n\n const stopBoxAction = async (boxId: string): Promise<void> => {\n await stopBox(boxId);\n };\n\n const destroyBoxAction = async (boxId: string): Promise<void> => {\n await destroyBox(boxId);\n };\n\n const compositor = new Compositor(\n {\n ptySpawn,\n termCtor,\n listCandidates,\n resolveTarget,\n startClaude,\n openShell,\n createNewBox,\n resumeBox,\n pauseBox: pauseBoxAction,\n stopBox: stopBoxAction,\n destroyBox: destroyBoxAction,\n openVnc,\n openCode,\n openWeb,\n },\n initialId,\n );\n await compositor.run();\n process.exit(0);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","/** Rect in 0-based screen coordinates (top-left origin). */\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface DashboardLayout {\n cols: number;\n rows: number;\n sidebar: Rect;\n /** Single column separator between sidebar and right pane. */\n sepX: number;\n right: Rect;\n /** Full-width status line, single row at the bottom. */\n statusY: number;\n /** Right pane too small to host a usable terminal. */\n tooSmall: boolean;\n}\n\nexport const SIDEBAR_WIDTH = 32;\nconst MIN_RIGHT_W = 20;\nconst MIN_RIGHT_H = 4;\n\nexport function computeLayout(cols: number, rows: number): DashboardLayout {\n const sidebarW = Math.min(SIDEBAR_WIDTH, Math.max(0, cols - MIN_RIGHT_W - 1));\n const sepX = sidebarW;\n const rightX = sidebarW + 1;\n const rightW = Math.max(0, cols - rightX);\n const statusY = rows - 1;\n const paneH = Math.max(0, statusY); // rows above the status line\n return {\n cols,\n rows,\n sidebar: { x: 0, y: 0, w: sidebarW, h: paneH },\n sepX,\n right: { x: rightX, y: 0, w: rightW, h: paneH },\n statusY,\n tooSmall: rightW < MIN_RIGHT_W || paneH < MIN_RIGHT_H,\n };\n}\n","import type { Rect } from './layout.js';\n\n/**\n * A terminal cell, abstracted from @xterm/headless so the renderer stays pure\n * and unit-testable with a hand-rolled grid (no xterm, no docker).\n */\nexport interface CellLike {\n /** 1 normal, 2 wide (CJK), 0 = trailing half of a wide char (skip). */\n width: number;\n /** Glyph(s); '' for a never-written cell (render as space). */\n chars: string;\n fg: ColorSpec;\n bg: ColorSpec;\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n invisible: boolean;\n strike: boolean;\n}\n\nexport type ColorSpec =\n | { kind: 'default' }\n | { kind: 'palette'; n: number }\n | { kind: 'rgb'; rgb: number };\n\nexport interface ScreenSnapshot {\n cols: number;\n rows: number;\n cursor: { x: number; y: number; visible: boolean };\n cell(x: number, y: number): CellLike;\n}\n\nconst RESET = '\\x1b[0m';\n\nfunction fgParams(c: ColorSpec): string {\n if (c.kind === 'default') return '39';\n if (c.kind === 'palette') {\n const n = c.n;\n if (n < 8) return String(30 + n);\n if (n < 16) return String(90 + (n - 8));\n return `38;5;${String(n)}`;\n }\n return `38;2;${String((c.rgb >> 16) & 0xff)};${String((c.rgb >> 8) & 0xff)};${String(c.rgb & 0xff)}`;\n}\n\nfunction bgParams(c: ColorSpec): string {\n if (c.kind === 'default') return '49';\n if (c.kind === 'palette') {\n const n = c.n;\n if (n < 8) return String(40 + n);\n if (n < 16) return String(100 + (n - 8));\n return `48;5;${String(n)}`;\n }\n return `48;2;${String((c.rgb >> 16) & 0xff)};${String((c.rgb >> 8) & 0xff)};${String(c.rgb & 0xff)}`;\n}\n\n/** Full SGR (always reset-prefixed) for a cell. Run-length collapsed by caller. */\nexport function sgrFor(cell: CellLike): string {\n const parts = ['0', fgParams(cell.fg), bgParams(cell.bg)];\n if (cell.bold) parts.push('1');\n if (cell.dim) parts.push('2');\n if (cell.italic) parts.push('3');\n if (cell.underline) parts.push('4');\n if (cell.inverse) parts.push('7');\n if (cell.invisible) parts.push('8');\n if (cell.strike) parts.push('9');\n return `\\x1b[${parts.join(';')}m`;\n}\n\n/**\n * Compose one screen row into a payload string: SGR runs + glyphs, exactly\n * `cols` columns wide (NullCells render as spaces, so the row self-pads).\n * Emits a new SGR only when it changes from the previous cell (run-length).\n */\nexport function composeRow(snap: ScreenSnapshot, y: number): string {\n let out = '';\n let lastSgr = '';\n for (let x = 0; x < snap.cols; x++) {\n const cell = snap.cell(x, y);\n if (cell.width === 0) continue; // trailing half of a wide glyph\n const sgr = sgrFor(cell);\n if (sgr !== lastSgr) {\n out += sgr;\n lastSgr = sgr;\n }\n out += cell.chars === '' ? ' ' : cell.chars;\n }\n return out + RESET;\n}\n\nfunction cursorTo(row0: number, col0: number): string {\n // ANSI is 1-based.\n return `\\x1b[${String(row0 + 1)};${String(col0 + 1)}H`;\n}\n\nexport interface FrameResult {\n /** Bytes to write to the host terminal (may be empty if nothing changed). */\n out: string;\n /** New per-pane-row payload cache for the next diff. */\n rows: string[];\n}\n\n/**\n * Diff `snap` against the previous frame's row cache and produce the minimal\n * write to update the right-pane `rect`. Pass `prev = null` to force a full\n * repaint (initial draw / post-resize).\n */\nexport function diffFrame(\n prev: string[] | null,\n snap: ScreenSnapshot,\n rect: Rect,\n): FrameResult {\n const h = Math.min(rect.h, snap.rows);\n const rows: string[] = new Array<string>(h);\n let out = '\\x1b[?25l'; // hide cursor while painting to avoid streaking\n for (let i = 0; i < h; i++) {\n const payload = composeRow(snap, i);\n rows[i] = payload;\n if (prev && prev[i] === payload) continue;\n out += cursorTo(rect.y + i, rect.x) + RESET + payload + RESET;\n }\n if (snap.cursor.visible) {\n const cy = Math.min(Math.max(snap.cursor.y, 0), h - 1);\n const cx = Math.min(Math.max(snap.cursor.x, 0), rect.w - 1);\n out += cursorTo(rect.y + cy, rect.x + cx) + '\\x1b[?25h';\n }\n return { out, rows };\n}\n","export type InputEvent =\n | { type: 'switch'; dir: 'next' | 'prev' }\n | { type: 'quit' }\n | { type: 'action'; name: 'vnc' | 'code' | 'web' | 'pause' | 'stop' | 'destroy' }\n | { type: 'leader'; active: boolean }\n | { type: 'forward'; bytes: Buffer };\n\nexport interface InputParserOptions {\n onEvent: (e: InputEvent) => void;\n /**\n * Map a 1-based absolute screen coordinate from a host mouse report into the\n * right pane's 1-based local coordinate. Return null to drop the event (the\n * pointer is over the sidebar/status). Omit to forward mouse unchanged.\n */\n mouseTransform?: (x: number, y: number) => { x: number; y: number } | null;\n /** Timeout after a bare leader (Ctrl-a) before it's sent through (ms). */\n leaderMs?: number;\n /** Inter-byte timeout for an unfinished escape/mouse sequence (ms). */\n escMs?: number;\n /** Injected for unit tests; defaults to global timers. */\n setTimer?: (ms: number, fn: () => void) => unknown;\n clearTimer?: (h: unknown) => void;\n}\n\nconst LEADER = 0x01; // Ctrl-a\nconst ESC = 0x1b;\n\ntype State = 'normal' | 'leader' | 'esc' | 'mouseX10';\n\n/**\n * Byte-level host-stdin parser.\n *\n * - Switch boxes: `Ctrl+Option+Up/Down` (CSI `1;7A`/`1;7B`) — the one chord\n * macOS/iTerm2 reliably emits.\n * - Everything else (vnc/code/web/quit) is a `Ctrl-a <key>` leader chord —\n * `Ctrl+Option+<letter>` is too terminal-dependent to rely on.\n *\n * Unrecognized input is forwarded verbatim to the pty, with timeout buffering\n * so a real ESC or a forwarded escape sequence is never swallowed.\n */\nexport class InputParser {\n private state: State = 'normal';\n private esc: number[] = [];\n private fwd: number[] = [];\n private timer: unknown = null;\n private timerId = 0;\n private readonly leaderMs: number;\n private readonly escMs: number;\n private readonly setTimer: (ms: number, fn: () => void) => unknown;\n private readonly clearTimer: (h: unknown) => void;\n private readonly onEvent: (e: InputEvent) => void;\n private readonly mouseTransform?: (x: number, y: number) => { x: number; y: number } | null;\n\n constructor(opts: InputParserOptions) {\n this.onEvent = opts.onEvent;\n this.mouseTransform = opts.mouseTransform;\n this.leaderMs = opts.leaderMs ?? 700;\n this.escMs = opts.escMs ?? 50;\n this.setTimer = opts.setTimer ?? ((ms, fn) => setTimeout(fn, ms) as unknown);\n this.clearTimer =\n opts.clearTimer ?? ((h) => clearTimeout(h as ReturnType<typeof setTimeout>));\n }\n\n feed(buf: Buffer): void {\n let i = 0;\n while (i < buf.length) {\n const b = buf[i]!;\n if (this.state === 'normal') {\n if (b === LEADER) {\n this.flush();\n this.state = 'leader';\n this.onEvent({ type: 'leader', active: true });\n this.arm(this.leaderMs, 'leader');\n } else if (b === ESC) {\n this.flush();\n this.state = 'esc';\n this.esc = [ESC];\n this.arm(this.escMs, 'esc');\n } else {\n this.fwd.push(b);\n }\n i++;\n continue;\n }\n if (this.state === 'leader') {\n this.disarm();\n if (b === LEADER) {\n this.fwd.push(LEADER); // double Ctrl-a → one literal Ctrl-a\n this.flush();\n } else {\n const c = String.fromCharCode(b);\n if (c === 'v') this.onEvent({ type: 'action', name: 'vnc' });\n else if (c === 'w') this.onEvent({ type: 'action', name: 'web' });\n else if (c === 'c') this.onEvent({ type: 'action', name: 'code' });\n else if (c === 's') this.onEvent({ type: 'action', name: 'stop' });\n else if (c === 'p') this.onEvent({ type: 'action', name: 'pause' });\n else if (c === 'd') this.onEvent({ type: 'action', name: 'destroy' });\n else if (c === 'q') this.onEvent({ type: 'quit' });\n else if (c === 'k') this.onEvent({ type: 'switch', dir: 'prev' });\n else if (c === 'j' || c === 'n' || c === 'N') this.onEvent({ type: 'switch', dir: 'next' });\n else {\n // Unrecognized chord: leader consumed, forward this byte only.\n this.fwd.push(b);\n this.flush();\n }\n }\n this.onEvent({ type: 'leader', active: false });\n this.state = 'normal';\n i++;\n continue;\n }\n if (this.state === 'mouseX10') {\n this.esc.push(b);\n if (this.esc.length === 6) {\n this.disarm();\n this.emitMouseX10();\n this.reset();\n } else {\n this.arm(this.escMs, 'esc');\n }\n i++;\n continue;\n }\n // state === 'esc'\n if (this.esc.length === 1) {\n if (b === 0x5b /* [ */ || b === 0x4f /* O */) {\n this.esc.push(b);\n this.arm(this.escMs, 'esc');\n i++;\n continue;\n }\n this.disarm();\n this.forwardVerbatim([ESC]);\n this.reset();\n continue; // reprocess b in 'normal'\n }\n if (this.esc[1] === 0x5b && this.esc.length === 2 && b === 0x4d /* M */) {\n this.esc.push(b); // legacy X10 mouse: ESC [ M + 3 raw bytes\n this.state = 'mouseX10';\n this.arm(this.escMs, 'esc');\n i++;\n continue;\n }\n this.esc.push(b);\n const isFinal = this.esc[1] === 0x4f ? this.esc.length === 3 : b >= 0x40 && b <= 0x7e;\n const isParam = b >= 0x20 && b <= 0x3f;\n if (isFinal) {\n this.disarm();\n this.classifyCsi();\n this.reset();\n } else if (isParam || this.esc[1] === 0x4f) {\n this.arm(this.escMs, 'esc');\n } else {\n this.disarm();\n this.forwardVerbatim(this.esc);\n this.reset();\n }\n i++;\n }\n if (this.state === 'normal') this.flush();\n }\n\n dispose(): void {\n this.disarm();\n }\n\n private classifyCsi(): void {\n const s = String.fromCharCode(...this.esc);\n if (s === '\\x1b[1;7A') return void this.onEvent({ type: 'switch', dir: 'prev' });\n if (s === '\\x1b[1;7B') return void this.onEvent({ type: 'switch', dir: 'next' });\n const m = /^\\x1b\\[<(\\d+);(\\d+);(\\d+)([Mm])$/.exec(s);\n if (m) return this.emitMouseSgr(m);\n this.forwardVerbatim(this.esc);\n }\n\n private emitMouseSgr(m: RegExpExecArray): void {\n if (!this.mouseTransform) {\n this.forwardVerbatim(this.esc);\n return;\n }\n const t = this.mouseTransform(Number(m[2]), Number(m[3]));\n if (!t) return; // over sidebar/status — drop\n this.forwardVerbatim([\n ...Buffer.from(`\\x1b[<${m[1]!};${String(t.x)};${String(t.y)}${m[4]!}`, 'latin1'),\n ]);\n }\n\n private emitMouseX10(): void {\n const e = this.esc; // ESC [ M cb cx cy\n if (e.length !== 6 || !this.mouseTransform) {\n this.forwardVerbatim(e);\n return;\n }\n const t = this.mouseTransform(e[4]! - 32, e[5]! - 32);\n if (!t) return;\n this.forwardVerbatim([0x1b, 0x5b, 0x4d, e[3]!, t.x + 32, t.y + 32]);\n }\n\n private reset(): void {\n this.state = 'normal';\n this.esc = [];\n }\n\n private flush(): void {\n if (this.fwd.length === 0) return;\n this.onEvent({ type: 'forward', bytes: Buffer.from(this.fwd) });\n this.fwd = [];\n }\n\n private forwardVerbatim(bytes: number[]): void {\n for (const x of bytes) this.fwd.push(x);\n this.flush();\n }\n\n private arm(ms: number, kind: 'leader' | 'esc'): void {\n this.disarm();\n const id = ++this.timerId;\n this.timer = this.setTimer(ms, () => {\n if (id !== this.timerId) return; // stale\n this.timer = null;\n if (kind === 'leader' && this.state === 'leader') {\n this.fwd.push(LEADER); // lone Ctrl-a → send it through\n this.flush();\n this.onEvent({ type: 'leader', active: false });\n this.state = 'normal';\n } else if (kind === 'esc' && (this.state === 'esc' || this.state === 'mouseX10')) {\n this.forwardVerbatim(this.esc);\n this.reset();\n }\n });\n }\n\n private disarm(): void {\n this.timerId++;\n if (this.timer != null) {\n this.clearTimer(this.timer);\n this.timer = null;\n }\n }\n}\n","import type { Terminal as XtermTerminal } from '@xterm/headless';\nimport type { ScreenSnapshot, CellLike, ColorSpec } from './renderer.js';\n\n/**\n * The `@xterm/headless` `Terminal` class. Injected (not imported) because\n * @xterm/headless is CJS — a static ESM named import breaks Node's loader for\n * the whole CLI, so dashboard.ts dynamic-imports it and passes the ctor here.\n */\nexport type TerminalCtor = new (opts: {\n cols: number;\n rows: number;\n allowProposedApi: boolean;\n scrollback: number;\n convertEol: boolean;\n}) => XtermTerminal;\n\n/** Minimal shape of a node-pty IPty (avoids a hard type dep on the optional module). */\nexport interface IPtyLike {\n onData(cb: (d: string) => void): void;\n onExit(cb: (e: { exitCode: number }) => void): void;\n write(d: string): void;\n resize(cols: number, rows: number): void;\n kill(): void;\n}\n\nexport type PtySpawn = (\n file: string,\n args: string[],\n opts: { name: string; cols: number; rows: number; env: NodeJS.ProcessEnv },\n) => IPtyLike;\n\nfunction fgSpec(c: {\n isFgDefault(): boolean;\n isFgPalette(): boolean;\n isFgRGB(): boolean;\n getFgColor(): number;\n}): ColorSpec {\n if (c.isFgDefault()) return { kind: 'default' };\n if (c.isFgPalette()) return { kind: 'palette', n: c.getFgColor() };\n if (c.isFgRGB()) return { kind: 'rgb', rgb: c.getFgColor() };\n return { kind: 'default' };\n}\nfunction bgSpec(c: {\n isBgDefault(): boolean;\n isBgPalette(): boolean;\n isBgRGB(): boolean;\n getBgColor(): number;\n}): ColorSpec {\n if (c.isBgDefault()) return { kind: 'default' };\n if (c.isBgPalette()) return { kind: 'palette', n: c.getBgColor() };\n if (c.isBgRGB()) return { kind: 'rgb', rgb: c.getBgColor() };\n return { kind: 'default' };\n}\n\n/**\n * Host mouse reporting is owned by the compositor, not mirrored from the inner\n * app. We enable button + SGR-coordinate reporting once for the whole dashboard\n * (the right pane is always a terminal that wants the wheel) and clear the\n * whole family on teardown — mirroring the inner app's rapid on/off toggles\n * leaves frequent windows where the host falls back to native scroll.\n */\n// 1000 = click/wheel, 1002 = button-event tracking, 1006 = SGR coords. This is\n// the exact set real tmux emits — the combination iTerm2 honors reliably (1000\n// alone is enough for xterm/VS Code but iTerm2 wants 1002 present too).\nexport const MOUSE_ENABLE_SEQ = '\\x1b[?1000h\\x1b[?1002h\\x1b[?1006h';\nconst MOUSE_MODES = [1000, 1002, 1003, 1005, 1006, 1015];\nexport const MOUSE_DISABLE_SEQ = MOUSE_MODES.map((n) => `\\x1b[?${String(n)}l`).join('');\n\nconst BLANK: CellLike = {\n width: 1,\n chars: ' ',\n fg: { kind: 'default' },\n bg: { kind: 'default' },\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n invisible: false,\n strike: false,\n};\n\n/**\n * One box's live terminal: a node-pty running `docker exec … tmux attach`\n * feeding an @xterm/headless emulator we read back as a screen grid.\n */\nexport class PtySession {\n private readonly term: XtermTerminal;\n private readonly pty: IPtyLike;\n private disposed = false;\n // Reused per cell read — valid only until the next cell() call (the renderer\n // consumes it synchronously within composeRow).\n private readonly out: CellLike = { ...BLANK };\n\n constructor(\n spawn: PtySpawn,\n TerminalClass: TerminalCtor,\n dockerArgv: string[],\n cols: number,\n rows: number,\n onRenderable: () => void,\n onExit: () => void,\n ) {\n this.term = new TerminalClass({\n cols,\n rows,\n allowProposedApi: true,\n scrollback: 0,\n convertEol: false,\n });\n this.pty = spawn('docker', dockerArgv, {\n name: 'xterm-256color',\n cols,\n rows,\n env: process.env,\n });\n this.pty.onData((d) => {\n // Read the buffer only after the parser applied this chunk.\n this.term.write(d, () => onRenderable());\n });\n this.term.onData((d) => {\n if (!this.disposed) this.pty.write(d);\n });\n // Only surface *unexpected* exits. When we kill the pty ourselves (box\n // switch / teardown) `disposed` is already true; a stale exit from a\n // just-killed session must not tear down the session that replaced it.\n this.pty.onExit(() => {\n if (!this.disposed) onExit();\n });\n }\n\n write(bytes: Buffer): void {\n if (!this.disposed) this.pty.write(bytes.toString('utf8'));\n }\n\n resize(cols: number, rows: number): void {\n if (this.disposed) return;\n this.term.resize(cols, rows);\n this.pty.resize(cols, rows);\n }\n\n snapshot(): ScreenSnapshot {\n const buf = this.term.buffer.active;\n const base = buf.baseY;\n const cell = buf.getNullCell();\n const o = this.out;\n return {\n cols: this.term.cols,\n rows: this.term.rows,\n cursor: { x: buf.cursorX, y: buf.cursorY, visible: true },\n cell: (x: number, y: number): CellLike => {\n const line = buf.getLine(base + y);\n if (!line) return BLANK;\n line.getCell(x, cell);\n o.width = cell.getWidth();\n o.chars = cell.getChars();\n o.fg = fgSpec(cell);\n o.bg = bgSpec(cell);\n o.bold = Boolean(cell.isBold());\n o.dim = Boolean(cell.isDim());\n o.italic = Boolean(cell.isItalic());\n o.underline = Boolean(cell.isUnderline());\n o.inverse = Boolean(cell.isInverse());\n o.invisible = Boolean(cell.isInvisible());\n o.strike = Boolean(cell.isStrikethrough());\n return o;\n },\n };\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n try {\n this.pty.kill();\n } catch {\n /* already gone */\n }\n this.term.dispose();\n }\n}\n","export interface SidebarBox {\n id: string;\n name: string;\n /** Container state: 'running' | 'paused' | 'stopped' | 'missing' | … */\n state: string;\n /** 'working' | 'idle' | 'waiting' | 'unknown' | undefined */\n claudeActivity?: string;\n /** The in-box terminal title Claude set, or undefined when none. */\n sessionTitle?: string;\n /** 1-based per-project box number, shown as `[N]`; undefined for\n * pre-feature boxes and the synthetic \"+ New box\" entry. */\n index?: number;\n /** Absolute project root; used to group boxes under a project header.\n * Undefined for pre-feature boxes and the synthetic \"+ New box\" entry. */\n project?: string;\n}\n\n/** Per-row ownership + styling map returned alongside the rendered lines so\n * the compositor can highlight the selected box and style headers without\n * re-deriving the (now non-uniform) layout. */\nexport interface SidebarRender {\n lines: string[];\n /** boxId rendered on row `i`, else null (banner / group header / blank). */\n rowOwner: (string | null)[];\n /** true for the banner and project-header rows (styled like the banner). */\n headerRows: boolean[];\n}\n\n/** Truncate to `max` printable chars, appending `…` when it had to cut\n * (keeps the head). */\nfunction ellipsize(s: string, max: number): string {\n if (max <= 0) return '';\n if (s.length <= max) return s;\n if (max === 1) return '…';\n return s.slice(0, max - 1) + '…';\n}\n\n/** Truncate keeping the *tail* (the distinguishing part of a box name like\n * `…-78b94c78`), prepending `…` when it had to cut. */\nfunction ellipsizeHead(s: string, max: number): string {\n if (max <= 0) return '';\n if (s.length <= max) return s;\n if (max === 1) return '…';\n return '…' + s.slice(s.length - (max - 1));\n}\n\nexport function activityCell(b: SidebarBox): string {\n if (b.state !== 'running') return `[${b.state}]`;\n switch (b.claudeActivity) {\n case 'working':\n return '● working';\n case 'idle':\n return '○ idle';\n case 'waiting':\n return '◐ waiting';\n default:\n return '? unknown';\n }\n}\n\n/** Synthetic sidebar entry pinned at the top: selecting it opens the create\n * menu. Carried in the compositor's box list like a real box (sentinel id),\n * so selection/switch/highlight need no special-casing. */\nexport const NEW_BOX_ID = '__agentbox_new__';\nexport const NEW_BOX_LABEL = '+ New box';\n\n/** Sidebar banner label (rendered into the rounded top border). */\nexport const SIDEBAR_HEADER = 'AgentBox';\n\n/** Top border that simulates a rounded frame on the top + right only (no\n * left/bottom, to save space): `╭─── AgentBox ─────…` filling exactly `w`.\n * The matching rounded top-right corner (`╮`) is drawn by the compositor at\n * the sidebar separator column. */\nfunction topBorder(label: string, w: number): string {\n const lead = `╭─── ${label} `;\n if (lead.length >= w) return lead.slice(0, w);\n return lead + '─'.repeat(w - lead.length);\n}\n/** Lines `sidebarLines` reserves before the box rows (banner + blank). The\n * compositor uses this to locate the selected box row for highlighting. */\nexport const SIDEBAR_HEADER_LINES = 2;\n\nfunction fit(s: string, w: number): string {\n if (s.length === w) return s;\n if (s.length > w) return s.slice(0, w);\n return s + ' '.repeat(w - s.length);\n}\n\n/** `s` centered in a field of `w` columns (truncated if it doesn't fit). */\nfunction center(s: string, w: number): string {\n if (s.length >= w) return s.slice(0, w);\n const pad = w - s.length;\n const leftPad = Math.floor(pad / 2);\n return ' '.repeat(leftPad) + s + ' '.repeat(pad - leftPad);\n}\n\n/** `basename` of an absolute project root, for the group header label. */\nfunction projectLabel(project: string | undefined): string {\n if (!project) return '(no project)';\n const parts = project.split('/').filter(Boolean);\n return parts[parts.length - 1] ?? project;\n}\n\n/** Strip the leading decoration Claude prepends to its terminal title (the\n * spinner glyph, e.g. `✳ `) plus any leading symbols/asterisks/space, so the\n * sidebar shows just the words. Falls back to the trimmed original if the\n * title is all decoration. */\nfunction stripTitleGlyph(s: string): string {\n const t = s.replace(/^[\\s\\p{S}*·]+/u, '');\n return t.length > 0 ? t : s.trim();\n}\n\n/**\n * Render one box row: `marker<num> <title|name> <status>`. The number and\n * the status are width-protected; the middle (title, else the box name with\n * its meaningful tail kept) flexes and ellipsizes so the status is never\n * eaten. Compact: no brackets, no glyph, single-char marker.\n */\nfunction boxRow(b: SidebarBox, marker: string, w: number): string {\n const numStr = b.index != null ? `${b.index} ` : '';\n const status = activityCell(b);\n const left = `${marker}${numStr}`;\n const room = w - left.length - status.length - 1; // 1 = gap before status\n if (room <= 0) return fit(`${left}${status}`, w);\n const middle =\n b.state === 'running' && b.sessionTitle\n ? ellipsize(stripTitleGlyph(b.sessionTitle), room)\n : ellipsizeHead(b.name, room);\n // Left segment padded so the status sits flush right within `w`.\n return fit(`${left}${middle}`, w - status.length) + status;\n}\n\n/**\n * The sidebar region as exactly `h` lines, each exactly `w` columns, plus a\n * per-row ownership/style map. Pure — no ANSI positioning (the compositor\n * places it). Boxes are grouped under a ` ── <project> ── ` header (callers\n * pass them pre-sorted by project).\n */\nexport function sidebarLines(\n boxes: SidebarBox[],\n selectedId: string,\n w: number,\n h: number,\n): SidebarRender {\n const lines: string[] = [topBorder(SIDEBAR_HEADER, w), fit('', w)];\n const rowOwner: (string | null)[] = [null, null];\n const headerRows: boolean[] = [true, false];\n const push = (line: string, owner: string | null, header: boolean): void => {\n lines.push(fit(line, w));\n rowOwner.push(owner);\n headerRows.push(header);\n };\n\n let prevProject: string | undefined;\n let seenGroup = false;\n for (const b of boxes) {\n const marker = b.id === selectedId ? '▸' : ' ';\n if (b.id === NEW_BOX_ID) {\n push(`${marker}${NEW_BOX_LABEL}`, b.id, false);\n continue;\n }\n if (!seenGroup || b.project !== prevProject) {\n push(center(` ── ${projectLabel(b.project)} ── `, w), null, true);\n prevProject = b.project;\n seenGroup = true;\n }\n push(boxRow(b, marker, w), b.id, false);\n }\n if (boxes.length === 0) push(' (no boxes)', null, false);\n while (lines.length < h) push('', null, false);\n return {\n lines: lines.slice(0, h),\n rowOwner: rowOwner.slice(0, h),\n headerRows: headerRows.slice(0, h),\n };\n}\n\n/**\n * Centered action menu for a running box with no Claude session.\n * Exactly `h` lines, each exactly `w` columns. Pure.\n */\nexport function menuLines(boxName: string, w: number, h: number): string[] {\n const body = [\n '',\n ` No Claude session in ${boxName}.`,\n '',\n ' [c] Start Claude here',\n ' [s] Open a shell',\n '',\n ' Ctrl+Option+↑/↓ switch · Ctrl-a then v/c/w/q (vnc/code/web/quit)',\n ];\n const top = Math.max(0, Math.floor((h - body.length) / 2));\n const out: string[] = [];\n for (let i = 0; i < h; i++) out.push(fit(body[i - top] ?? '', w));\n return out;\n}\n\n/**\n * Centered action menu for a non-running box (paused/stopped): resume +\n * destroy, with a two-step destroy confirm (the TUI can't show a prompt).\n * Exactly `h` lines, each exactly `w` columns. Pure.\n */\nexport function lifecycleMenuLines(\n boxName: string,\n state: 'paused' | 'stopped',\n confirmDestroy: boolean,\n w: number,\n h: number,\n): string[] {\n const body = confirmDestroy\n ? [\n '',\n ` Destroy ${boxName}?`,\n ' This removes the container and its volumes.',\n '',\n ' [y] Yes, destroy',\n ' [any other key] Cancel',\n ]\n : [\n '',\n ` Box ${boxName} is ${state}.`,\n '',\n state === 'paused' ? ' [u] Unpause' : ' [s] Start',\n ' [d] Destroy',\n '',\n ' Ctrl+Option+↑/↓ switch · Ctrl-a then q quit',\n ];\n const top = Math.max(0, Math.floor((h - body.length) / 2));\n const out: string[] = [];\n for (let i = 0; i < h; i++) out.push(fit(body[i - top] ?? '', w));\n return out;\n}\n\n/**\n * Centered menu for the synthetic \"+ New box\" entry. Exactly `h` lines, each\n * exactly `w` columns. Pure.\n */\nexport function createMenuLines(where: string, w: number, h: number): string[] {\n const body = [\n '',\n ' Create a new box',\n '',\n ' [c] Create + launch Claude',\n ' [n] Create only',\n '',\n ` in ${where}`,\n '',\n ' Ctrl+Option+↑/↓ switch · Ctrl-a then q quit',\n ];\n const top = Math.max(0, Math.floor((h - body.length) / 2));\n const out: string[] = [];\n for (let i = 0; i < h; i++) out.push(fit(body[i - top] ?? '', w));\n return out;\n}\n\n// Status-bar palette — matches the in-box tmux footer\n// (`buildClaudeStatusBarArgs`): dark bar, blue brand block, dim-grey hints\n// with white key chords.\n/** The footer/sidebar background gray. Truecolor (not palette index 236) so\n * it pins an exact RGB — terminals can remap/shade indexed colors per\n * context, which made the sidebar and status bar look like different grays.\n * Single source so the two regions can't drift. */\nexport const BAR_BG = '\\x1b[48;2;48;48;48m';\nconst BAR_BASE = BAR_BG + '\\x1b[38;5;250m';\nconst BAR_BRAND = '\\x1b[48;5;39m\\x1b[38;5;16m'; // blue block (not bold)\nconst BRAND_BOLD = '\\x1b[1m'; // box name only\nconst BRAND_NOBOLD = '\\x1b[22m';\nconst HINT_KEY = '\\x1b[38;5;255m'; // white: the key chord\nconst HINT_TXT = '\\x1b[38;5;245m'; // gray: labels + separators\nconst BAR_RESET = '\\x1b[0m';\n\n// [key chord, label]. Modifiers spelled out (no ⌥/^ glyphs); arrows use the\n// ↑/↓ glyphs. Rendered as `KEYS: label` with the chord white, label gray.\nconst SWITCH_HINT: readonly [string, string] = ['Control+Option+↑/↓', 'switch'];\nconst HINT_GROUPS: ReadonlyArray<readonly [string, string]> = [\n SWITCH_HINT,\n ['Control+a c', 'code'],\n ['Control+a v', 'vnc'],\n ['Control+a w', 'web'],\n ['Control+a q', 'quit'],\n];\n\n/** Minimal hint tier when the bar is too narrow for the full `HINT_GROUPS`:\n * box switching (always important) + the leader. Pressing `Ctrl-a` then\n * expands to `ADVANCED_HINT_GROUPS` (the compositor swaps while the leader is\n * active). */\nexport const COLLAPSED_HINT_GROUPS: ReadonlyArray<readonly [string, string]> = [\n SWITCH_HINT,\n ['Control+a', 'more'],\n];\n\n/** The expanded \"which-key\" chord menu shown while the Ctrl-a leader is\n * pending — every chord, compact (`KEY: label`), reverts on the next key. */\nexport const ADVANCED_HINT_GROUPS: ReadonlyArray<readonly [string, string]> = [\n ['c', 'code'],\n ['v', 'vnc'],\n ['w', 'web'],\n ['s', 'stop'],\n ['p', 'pause'],\n ['d', 'destroy'],\n ['q', 'quit'],\n];\n\n/**\n * Status line, exactly `w` printable columns, colored to match the in-box tmux\n * footer (dark bar, blue ` agentbox ▸ … ` brand block on the left, dim-grey\n * shortcut hints on the right). `stateLabel` overrides the box's activity text\n * (used for `shell` / `menu` panes where claudeActivity would otherwise show a\n * misleading `unknown`).\n */\nexport function statusLine(\n box: SidebarBox | undefined,\n w: number,\n stateLabel?: string,\n groups: ReadonlyArray<readonly [string, string]> = HINT_GROUPS,\n): string {\n const state =\n stateLabel ?? (box ? (box.state === 'running' ? (box.claudeActivity ?? 'unknown') : box.state) : '');\n // \"agentbox ▸ \" stays normal weight; only the box name + state are bold.\n const brandPrefix = box ? ' agentbox ▸ ' : ' agentbox ';\n // Brand *core* (no title) — the width-protected segment. The title is the\n // lowest-priority segment: it only fills space left after brand + hints.\n const base = box ? `${box.name} (${state})` : '';\n const coreMain = box ? `${base} ` : '';\n const corePlain = brandPrefix + coreMain;\n\n const SEP = ' │ ';\n const renderHints = (\n g: ReadonlyArray<readonly [string, string]>,\n ): { plain: string; styled: string } => ({\n plain: g.map(([k, l]) => `${k}: ${l}`).join(SEP) + ' ',\n styled:\n g.map(([k, l]) => `${HINT_KEY}${k}${HINT_TXT}: ${l}`).join(`${HINT_TXT}${SEP}`) + ' ',\n });\n\n // Hint tier: shortcuts beat the title. Try the requested groups; if the\n // brand core + those hints overflow, fall back to the minimal leader hint;\n // if even that overflows, render brand-core-only (title can never push the\n // box name off-screen).\n let hints: { plain: string; styled: string } | null = null;\n for (const g of [groups, COLLAPSED_HINT_GROUPS]) {\n const h = renderHints(g);\n if (corePlain.length + h.plain.length + 1 <= w) {\n hints = h;\n break;\n }\n }\n if (!hints) {\n return BAR_BASE + BAR_BRAND + fit(corePlain, w) + BAR_RESET;\n }\n\n // Title fills only the leftover, ellipsized; dropped entirely when there's\n // no meaningful room (≈ ` — ` + a few chars). Capped at 40 cols as before.\n const room = w - corePlain.length - hints.plain.length - 1;\n let titleSeg = '';\n if (box?.sessionTitle && room >= 7) {\n titleSeg = ` — ${ellipsize(box.sessionTitle, Math.min(40, room - 3))}`;\n }\n\n const leftPlain = brandPrefix + base + titleSeg + (box ? ' ' : '');\n const leftStyled =\n BAR_BRAND + brandPrefix + BRAND_BOLD + base + titleSeg + (box ? ' ' : '') + BRAND_NOBOLD;\n const gap = w - leftPlain.length - hints.plain.length;\n // brand block (name + title bold) → base bar → gap → white/gray hints.\n return (\n BAR_BASE +\n leftStyled +\n BAR_BASE +\n ' '.repeat(gap) +\n hints.styled +\n BAR_RESET\n );\n}\n","import { computeLayout, type DashboardLayout } from './layout.js';\nimport { diffFrame } from './renderer.js';\nimport { InputParser } from './input.js';\nimport {\n PtySession,\n MOUSE_ENABLE_SEQ,\n MOUSE_DISABLE_SEQ,\n type PtySpawn,\n type TerminalCtor,\n} from './pty-session.js';\nimport {\n sidebarLines,\n statusLine,\n menuLines,\n lifecycleMenuLines,\n createMenuLines,\n NEW_BOX_ID,\n ADVANCED_HINT_GROUPS,\n BAR_BG,\n type SidebarBox,\n} from './sidebar.js';\n\n// Sidebar panel styling (256-color, portable). Each sidebar line is already\n// padded to the panel width, so wrapping it in a bg SGR tints the full column.\n// Background is the footer gray (`BAR_BG`) everywhere — uniform with the status\n// bar; the selected row reads via bold bright-white text + the `▸` marker.\nconst SB_BODY = BAR_BG + '\\x1b[38;5;250m';\nconst SB_HEADER = BAR_BG + '\\x1b[38;5;39m\\x1b[1m';\nconst SB_SELECTED = BAR_BG + '\\x1b[38;5;255m\\x1b[1m';\nconst SGR_RESET = '\\x1b[0m';\n\nexport type RightTarget =\n | { kind: 'attach'; argv: string[]; mode?: 'claude' | 'shell' }\n | { kind: 'menu' }\n | { kind: 'lifecycle-menu'; state: 'paused' | 'stopped' }\n | { kind: 'create-menu'; where: string }\n | { kind: 'placeholder'; lines: string[] };\n\nexport interface CompositorDeps {\n ptySpawn: PtySpawn;\n termCtor: TerminalCtor;\n /** Scoped + sorted candidate boxes (same order the sidebar renders). */\n listCandidates: () => Promise<SidebarBox[]>;\n /** What the right pane should show for a box (attach argv / menu / message). */\n resolveTarget: (boxId: string) => Promise<RightTarget>;\n /** Start a proper Claude tmux session in the box, then resolve to attach. */\n startClaude: (boxId: string) => Promise<RightTarget>;\n /** Open an interactive shell in the box, resolve to attach. */\n openShell: (boxId: string) => Promise<RightTarget>;\n /** Create a new box (config defaults). With Claude: also start + return an\n * attach target. `onProgress` streams createBox log lines. */\n createNewBox: (\n withClaude: boolean,\n onProgress: (line: string) => void,\n ) => Promise<{ boxId: string; attach?: RightTarget }>;\n /** Resume a non-running box (unpause if paused, start if stopped). */\n resumeBox: (boxId: string) => Promise<void>;\n /** Pause a running box. */\n pauseBox: (boxId: string) => Promise<void>;\n /** Stop a running box. */\n stopBox: (boxId: string) => Promise<void>;\n /** Destroy a box (container + volumes + record). Irreversible. */\n destroyBox: (boxId: string) => Promise<void>;\n /** Host-side actions for the selected box; return a short status message. */\n openVnc: (boxId: string) => Promise<string>;\n openCode: (boxId: string) => Promise<string>;\n openWeb: (boxId: string) => Promise<string>;\n}\n\nconst POLL_MS = 1000;\nconst FRAME_MS = 16;\nconst RESIZE_DEBOUNCE_MS = 120;\n/** Keep the expanded chord footer visible this long after the Ctrl-a leader\n * resolves, so it's actually readable instead of flashing by. */\nconst LEADER_LINGER_MS = 1500;\n\n// Synchronized Output (DECSET 2026): the terminal buffers everything between\n// begin/end and presents it in one go — no partial-frame flicker/tearing.\n// Unsupported terminals ignore the unknown private mode.\nconst SYNC_BEGIN = '\\x1b[?2026h';\nconst SYNC_END = '\\x1b[?2026l';\n\nfunction cursorTo(x: number, y: number): string {\n return `\\x1b[${String(y + 1)};${String(x + 1)}H`;\n}\n\nexport class Compositor {\n private readonly out = process.stdout;\n private readonly inp = process.stdin;\n private boxes: SidebarBox[] = [];\n private selectedId: string;\n private session: PtySession | null = null;\n private placeholder: string[] | null = null;\n private menu: { boxName: string } | null = null;\n private lifecycleMenu: {\n boxName: string;\n state: 'paused' | 'stopped';\n confirmDestroy: boolean;\n } | null = null;\n private createMenu: { where: string } | null = null;\n /** True while the Ctrl-a leader is pending — swaps the footer to the\n * expanded chord menu (chrome only; never touches the right pane). */\n private leaderActive = false;\n /** Holds the expanded footer for LEADER_LINGER_MS after the leader resolves\n * (so the chord menu doesn't flash by). */\n private leaderLingerTimer: ReturnType<typeof setTimeout> | null = null;\n /** Set while a destroy confirm is pending in the status bar. */\n private pendingConfirm: { boxId: string; name: string } | null = null;\n private activeMode: 'claude' | 'shell' = 'claude';\n private flashMsg: string | null = null;\n private flashTimer: ReturnType<typeof setTimeout> | null = null;\n /** True while a start-Claude / open-shell action is in flight (suppresses\n * the poll respawn so it can't interrupt the transition). */\n private busy = false;\n private layout: DashboardLayout;\n private prevRows: string[] | null = null;\n private renderTimer: ReturnType<typeof setTimeout> | null = null;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly parser: InputParser;\n private tornDown = false;\n private resolveDone: (() => void) | null = null;\n private readonly onData = (d: Buffer): void => this.parser.feed(d);\n private readonly onResize = (): void => this.scheduleResize();\n private readonly onSig = (): void => {\n this.teardown();\n process.exit(0);\n };\n private readonly onFatal = (err: unknown): void => {\n this.teardown();\n process.stderr.write(`dashboard: ${err instanceof Error ? err.stack ?? err.message : String(err)}\\n`);\n process.exit(1);\n };\n\n constructor(\n private readonly deps: CompositorDeps,\n initialId: string,\n ) {\n this.selectedId = initialId;\n this.layout = computeLayout(this.out.columns ?? 100, this.out.rows ?? 30);\n this.parser = new InputParser({\n onEvent: (e) => {\n if (e.type === 'leader') {\n if (this.leaderLingerTimer) {\n clearTimeout(this.leaderLingerTimer);\n this.leaderLingerTimer = null;\n }\n if (e.active) {\n this.leaderActive = true;\n } else {\n // Keep the expanded footer up briefly after the chord resolves.\n this.leaderLingerTimer = setTimeout(() => {\n this.leaderLingerTimer = null;\n this.leaderActive = false;\n this.drawChrome();\n }, LEADER_LINGER_MS);\n }\n this.drawChrome();\n return;\n }\n if (this.pendingConfirm) {\n if (e.type === 'forward') {\n this.handleConfirmKey(e.bytes);\n return;\n }\n // Any non-forward event cancels the confirm, then proceeds normally.\n this.pendingConfirm = null;\n this.drawChrome();\n }\n if (e.type === 'quit') this.onSig();\n else if (e.type === 'switch') this.switchBox(e.dir);\n else if (e.type === 'action') {\n if (e.name === 'pause' || e.name === 'stop' || e.name === 'destroy') {\n void this.doLifecycle(e.name);\n } else {\n void this.doAction(e.name);\n }\n } else if (this.createMenu) this.handleCreateMenuKey(e.bytes);\n else if (this.lifecycleMenu) this.handleLifecycleMenuKey(e.bytes);\n else if (this.menu) this.handleMenuKey(e.bytes);\n else this.session?.write(e.bytes);\n },\n // Absolute 1-based host coords → right-pane-local 1-based; null = the\n // pointer is over the sidebar/status, so Claude shouldn't see it.\n mouseTransform: (x, y) => {\n const r = this.layout.right;\n if (!this.session || this.layout.tooSmall) return null;\n const lx = x - r.x;\n const ly = y - r.y;\n if (lx < 1 || ly < 1 || lx > r.w || ly > r.h) return null;\n return { x: lx, y: ly };\n },\n });\n }\n\n async run(): Promise<void> {\n this.out.write('\\x1b[?1049h\\x1b[?25l\\x1b[2J' + MOUSE_ENABLE_SEQ);\n if (this.inp.isTTY) this.inp.setRawMode(true);\n this.inp.resume();\n this.inp.on('data', this.onData);\n this.out.on('resize', this.onResize);\n process.once('SIGINT', this.onSig);\n process.once('SIGTERM', this.onSig);\n process.once('uncaughtException', this.onFatal);\n process.once('unhandledRejection', this.onFatal);\n process.once('exit', () => this.teardown());\n\n await this.refreshBoxes();\n if (!this.boxes.some((b) => b.id === this.selectedId) && this.boxes[0]) {\n this.selectedId = this.boxes[0].id;\n }\n await this.spawnActive();\n this.drawChrome();\n this.scheduleRender();\n this.pollTimer = setInterval(() => void this.poll(), POLL_MS);\n\n await new Promise<void>((resolve) => {\n this.resolveDone = resolve;\n });\n }\n\n private async refreshBoxes(): Promise<void> {\n try {\n this.boxes = await this.deps.listCandidates();\n } catch {\n /* keep last known list */\n }\n }\n\n private selectedBox(): SidebarBox | undefined {\n return this.boxes.find((b) => b.id === this.selectedId);\n }\n\n private async poll(): Promise<void> {\n const before = JSON.stringify(\n this.boxes.map((b) => [b.id, b.state, b.claudeActivity, b.sessionTitle]),\n );\n await this.refreshBoxes();\n if (this.busy) {\n // A start/shell action is mid-flight — don't yank the right pane.\n } else if (!this.boxes.some((b) => b.id === this.selectedId) && this.boxes[0]) {\n this.selectedId = this.boxes[0].id;\n await this.spawnActive();\n } else {\n // Re-resolve when: an attached box died; a not-running placeholder\n // recovered; or the menu's box stopped. The menu itself is a stable\n // state while its box runs — never respawn it (would reset the screen).\n const box = this.selectedBox();\n const running = box?.state === 'running';\n const reresolve =\n (this.session && !running) ||\n (this.placeholder && running) ||\n (this.menu && !running) ||\n (this.lifecycleMenu != null && box?.state !== this.lifecycleMenu.state);\n if (reresolve) await this.spawnActive();\n }\n if (\n JSON.stringify(\n this.boxes.map((b) => [b.id, b.state, b.claudeActivity, b.sessionTitle]),\n ) !== before\n ) {\n this.drawChrome();\n }\n }\n\n private disposeSession(): void {\n if (!this.session) return;\n this.session.dispose();\n this.session = null;\n }\n\n private async spawnActive(): Promise<void> {\n this.disposeSession();\n this.placeholder = null;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.pendingConfirm = null;\n // Wipe the old agent now (synchronous, before the async resolve gap) so it\n // can't bleed through while the new attach redraws. Also resets prevRows.\n this.clearRightPane();\n const id = this.selectedId;\n const target = await this.deps.resolveTarget(id);\n if (this.selectedId !== id || this.tornDown) return; // user switched away\n this.applyTarget(target);\n }\n\n /** Turn a resolved/started target into the right-pane state. */\n private applyTarget(target: RightTarget): void {\n this.disposeSession();\n this.placeholder = null;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.pendingConfirm = null;\n if (target.kind === 'attach') {\n this.activeMode = target.mode ?? 'claude';\n this.session = new PtySession(\n this.deps.ptySpawn,\n this.deps.termCtor,\n target.argv,\n Math.max(1, this.layout.right.w),\n Math.max(1, this.layout.right.h),\n () => this.scheduleRender(),\n () => this.onSessionExit(),\n );\n } else if (target.kind === 'menu') {\n this.menu = { boxName: this.selectedBox()?.name ?? this.selectedId };\n } else if (target.kind === 'lifecycle-menu') {\n this.lifecycleMenu = {\n boxName: this.selectedBox()?.name ?? this.selectedId,\n state: target.state,\n confirmDestroy: false,\n };\n } else if (target.kind === 'create-menu') {\n this.createMenu = { where: target.where };\n } else {\n this.placeholder = target.lines;\n }\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n }\n\n private handleMenuKey(bytes: Buffer): void {\n for (const b of bytes) {\n if (b === 0x63 || b === 0x0d || b === 0x0a) {\n void this.chooseAction('claude');\n return;\n }\n if (b === 0x73) {\n void this.chooseAction('shell');\n return;\n }\n }\n }\n\n private async chooseAction(which: 'claude' | 'shell'): Promise<void> {\n if (this.busy) return;\n const id = this.selectedId;\n const name = this.selectedBox()?.name ?? id;\n this.busy = true;\n this.menu = null;\n this.createMenu = null;\n this.placeholder = ['', which === 'claude' ? ' Starting Claude…' : ' Opening shell…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n const target =\n which === 'claude'\n ? await this.deps.startClaude(id)\n : await this.deps.openShell(id);\n if (this.selectedId !== id || this.tornDown) return; // switched away\n this.applyTarget(target);\n } catch (err) {\n if (this.selectedId !== id || this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to ${which === 'claude' ? 'start Claude' : 'open a shell'} in ${name}:`,\n ` ${msg}`,\n '',\n which === 'claude'\n ? ` Try from a shell: agentbox claude start ${name}`\n : ` Try from a shell: agentbox shell ${name}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n private handleLifecycleMenuKey(bytes: Buffer): void {\n const m = this.lifecycleMenu;\n if (!m) return;\n for (const b of bytes) {\n if (m.confirmDestroy) {\n if (b === 0x79 || b === 0x0d || b === 0x0a) {\n void this.runDestroy(this.selectedId, this.selectedBox()?.name ?? this.selectedId);\n } else {\n // Any other key cancels the confirm and returns to the menu.\n m.confirmDestroy = false;\n this.drawChrome();\n this.scheduleRender();\n }\n return;\n }\n const resumeKey = m.state === 'paused' ? 0x75 /* u */ : 0x73 /* s */;\n if (b === resumeKey) {\n void this.resumeSelected();\n return;\n }\n if (b === 0x64 /* d */) {\n m.confirmDestroy = true;\n this.drawChrome();\n this.scheduleRender();\n return;\n }\n }\n }\n\n private async resumeSelected(): Promise<void> {\n if (this.busy) return;\n const id = this.selectedId;\n const name = this.selectedBox()?.name ?? id;\n const verb = this.lifecycleMenu?.state === 'stopped' ? 'start' : 'unpause';\n this.busy = true;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.placeholder = ['', ' Resuming…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n await this.deps.resumeBox(id);\n if (this.selectedId !== id || this.tornDown) return; // switched away\n await this.refreshBoxes();\n await this.spawnActive();\n } catch (err) {\n if (this.selectedId !== id || this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to ${verb} ${name}:`,\n ` ${msg}`,\n '',\n ` Try from a shell: agentbox ${verb} ${name}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n /** Destroy `id` and recover the selection. Shared by the lifecycle-menu\n * confirm and the running-box `Ctrl-a d` status-bar confirm. */\n private async runDestroy(id: string, name: string): Promise<void> {\n if (this.busy) return;\n this.busy = true;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.placeholder = ['', ' Destroying…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n await this.deps.destroyBox(id);\n if (this.tornDown) return;\n await this.refreshBoxes();\n // The box is gone from the list; fall back to the first entry (the\n // synthetic \"+ New box\", always boxes[0] via listCandidates).\n if (this.boxes[0]) this.selectedId = this.boxes[0].id;\n await this.spawnActive();\n this.flash(`destroyed ${name}`);\n } catch (err) {\n if (this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to destroy ${name}:`,\n ` ${msg}`,\n '',\n ` Try from a shell: agentbox destroy ${name}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n /** Ctrl-a p/s/d on the selected box. pause/stop transition state (the pane\n * re-resolves to the lifecycle menu); destroy asks to confirm first. */\n private async doLifecycle(name: 'pause' | 'stop' | 'destroy'): Promise<void> {\n if (this.selectedId === NEW_BOX_ID) {\n this.flash('select a box first');\n return;\n }\n const id = this.selectedId;\n const boxName = this.selectedBox()?.name ?? id;\n if (name === 'destroy') {\n this.pendingConfirm = { boxId: id, name: boxName };\n this.drawChrome();\n return;\n }\n if (this.selectedBox()?.state !== 'running') {\n this.flash(`${boxName} is not running`);\n return;\n }\n if (this.busy) return;\n this.busy = true;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.placeholder = ['', name === 'pause' ? ' Pausing…' : ' Stopping…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n if (name === 'pause') await this.deps.pauseBox(id);\n else await this.deps.stopBox(id);\n if (this.selectedId !== id || this.tornDown) return; // switched away\n await this.refreshBoxes();\n await this.spawnActive();\n this.flash(`${name === 'pause' ? 'paused' : 'stopped'} ${boxName}`);\n } catch (err) {\n if (this.selectedId !== id || this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to ${name} ${boxName}:`,\n ` ${msg}`,\n '',\n ` Try from a shell: agentbox ${name} ${boxName}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n private handleConfirmKey(bytes: Buffer): void {\n const c = this.pendingConfirm;\n if (!c) return;\n const b = bytes[0];\n this.pendingConfirm = null;\n if (b === 0x79 || b === 0x0d || b === 0x0a) {\n void this.runDestroy(c.boxId, c.name);\n } else {\n // Cancelled — restore the footer.\n this.drawChrome();\n }\n }\n\n private handleCreateMenuKey(bytes: Buffer): void {\n for (const b of bytes) {\n if (b === 0x63 || b === 0x0d || b === 0x0a) {\n void this.chooseCreate(true);\n return;\n }\n if (b === 0x6e) {\n void this.chooseCreate(false);\n return;\n }\n }\n }\n\n private async chooseCreate(withClaude: boolean): Promise<void> {\n if (this.busy) return;\n this.busy = true;\n this.menu = null;\n this.createMenu = null;\n this.placeholder = ['', ' Creating box…', ''];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n const { boxId, attach } = await this.deps.createNewBox(withClaude, (line) => {\n if (this.tornDown) return;\n this.placeholder = ['', ' Creating box…', ' ' + line];\n this.prevRows = null;\n this.scheduleRender();\n });\n if (this.tornDown) return;\n this.selectedId = boxId;\n await this.refreshBoxes();\n if (attach) {\n this.applyTarget(attach);\n } else {\n await this.spawnActive();\n this.flash('box created');\n }\n } catch (err) {\n if (this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = ['', ' Failed to create box:', ` ${msg}`, '', ' Try from a shell: agentbox create'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n private async doAction(name: 'vnc' | 'code' | 'web'): Promise<void> {\n if (this.selectedId === NEW_BOX_ID) {\n this.flash('select a box first');\n return;\n }\n const id = this.selectedId;\n let msg: string;\n try {\n msg =\n name === 'vnc'\n ? await this.deps.openVnc(id)\n : name === 'code'\n ? await this.deps.openCode(id)\n : await this.deps.openWeb(id);\n } catch (err) {\n msg = err instanceof Error ? err.message : String(err);\n }\n this.flash(msg);\n }\n\n /** Briefly show `msg` in the status row, then revert. */\n private flash(msg: string): void {\n this.flashMsg = msg;\n if (this.flashTimer) clearTimeout(this.flashTimer);\n this.flashTimer = setTimeout(() => {\n this.flashTimer = null;\n this.flashMsg = null;\n this.drawChrome();\n }, 2500);\n this.drawChrome();\n }\n\n private onSessionExit(): void {\n // Inner attach ended (container died / tmux session gone). Show a message;\n // the next poll reconciles box state.\n this.disposeSession();\n this.placeholder = ['', ' session ended — Ctrl-a ↑/↓ to switch boxes'];\n this.prevRows = null;\n this.scheduleRender();\n }\n\n private switchBox(dir: 'next' | 'prev'): void {\n if (this.boxes.length === 0) return;\n this.pendingConfirm = null;\n const i = Math.max(\n 0,\n this.boxes.findIndex((b) => b.id === this.selectedId),\n );\n const n = this.boxes.length;\n const next = dir === 'prev' ? (i - 1 + n) % n : (i + 1) % n;\n this.selectedId = this.boxes[next]!.id;\n this.drawChrome();\n void this.spawnActive();\n }\n\n /** Blank the right pane and drop the diff cache (next paint is full). */\n private clearRightPane(): void {\n const r = this.layout.right;\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) {\n s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + ' '.repeat(r.w);\n }\n this.out.write(s + SYNC_END);\n this.prevRows = null;\n }\n\n private scheduleRender(): void {\n if (this.renderTimer || this.tornDown) return;\n this.renderTimer = setTimeout(() => {\n this.renderTimer = null;\n this.render();\n }, FRAME_MS);\n }\n\n private render(): void {\n if (this.tornDown) return;\n const r = this.layout.right;\n if (this.layout.tooSmall) {\n this.out.write(cursorTo(0, 0) + '\\x1b[2J' + cursorTo(0, 0) + 'terminal too small');\n return;\n }\n if (this.session) {\n const { out, rows } = diffFrame(this.prevRows, this.session.snapshot(), r);\n this.prevRows = rows;\n if (out) this.out.write(SYNC_BEGIN + out + SYNC_END);\n } else if (this.menu) {\n const lines = menuLines(this.menu.boxName, r.w, r.h);\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + (lines[i] ?? '');\n this.out.write(s + SYNC_END);\n } else if (this.lifecycleMenu) {\n const lines = lifecycleMenuLines(\n this.lifecycleMenu.boxName,\n this.lifecycleMenu.state,\n this.lifecycleMenu.confirmDestroy,\n r.w,\n r.h,\n );\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + (lines[i] ?? '');\n this.out.write(s + SYNC_END);\n } else if (this.createMenu) {\n const lines = createMenuLines(this.createMenu.where, r.w, r.h);\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + (lines[i] ?? '');\n this.out.write(s + SYNC_END);\n } else if (this.placeholder) {\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) {\n const line = (this.placeholder[i] ?? '').slice(0, r.w);\n s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + line + ' '.repeat(Math.max(0, r.w - line.length));\n }\n this.out.write(s + SYNC_END);\n }\n }\n\n private drawChrome(): void {\n if (this.tornDown || this.layout.tooSmall) return;\n const { sidebar, sepX, statusY } = this.layout;\n const { lines, rowOwner, headerRows } = sidebarLines(\n this.boxes,\n this.selectedId,\n sidebar.w,\n sidebar.h,\n );\n let s = SYNC_BEGIN + '\\x1b[0m';\n for (let i = 0; i < lines.length; i++) {\n const style = headerRows[i]\n ? SB_HEADER\n : rowOwner[i] === this.selectedId\n ? SB_SELECTED\n : SB_BODY;\n s += cursorTo(0, i) + style + lines[i] + SGR_RESET;\n }\n // Rounded top-right corner connecting the sidebar's top border to the\n // right separator; plain `│` below (no bottom corner — saves a row).\n // Blue (SB_HEADER) so the whole right border matches the rounded header.\n for (let y = 0; y < sidebar.h; y++)\n s += cursorTo(sepX, y) + SB_HEADER + (y === 0 ? '╮' : '│') + SGR_RESET;\n let status: string;\n if (this.pendingConfirm) {\n const w = this.layout.cols;\n const txt = ` Destroy ${this.pendingConfirm.name}? y = confirm · any other key = cancel `\n .slice(0, w)\n .padEnd(w);\n status = `\\x1b[7m${txt}\\x1b[0m`;\n } else if (this.flashMsg) {\n const w = this.layout.cols;\n const txt = ` ${this.flashMsg} `.slice(0, w).padEnd(w);\n status = `\\x1b[7m${txt}\\x1b[0m`;\n } else {\n const stateLabel =\n this.selectedId === NEW_BOX_ID\n ? 'create'\n : this.menu\n ? 'menu'\n : this.session && this.activeMode === 'shell'\n ? 'shell'\n : undefined;\n status = statusLine(\n this.selectedBox(),\n this.layout.cols,\n stateLabel,\n this.leaderActive ? ADVANCED_HINT_GROUPS : undefined,\n );\n }\n s += cursorTo(0, statusY) + status;\n this.out.write(s + SYNC_END);\n }\n\n private scheduleResize(): void {\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.layout = computeLayout(this.out.columns ?? 100, this.out.rows ?? 30);\n this.prevRows = null;\n const r = this.layout.right;\n if (this.session && !this.layout.tooSmall) {\n this.session.resize(Math.max(1, r.w), Math.max(1, r.h));\n }\n this.out.write(SYNC_BEGIN + '\\x1b[2J' + SYNC_END);\n this.drawChrome();\n this.render();\n }, RESIZE_DEBOUNCE_MS);\n }\n\n private teardown(): void {\n if (this.tornDown) return;\n this.tornDown = true;\n if (this.renderTimer) clearTimeout(this.renderTimer);\n if (this.pollTimer) clearInterval(this.pollTimer);\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n if (this.flashTimer) clearTimeout(this.flashTimer);\n if (this.leaderLingerTimer) clearTimeout(this.leaderLingerTimer);\n this.parser.dispose();\n this.disposeSession();\n this.inp.off('data', this.onData);\n this.out.off('resize', this.onResize);\n if (this.inp.isTTY) this.inp.setRawMode(false);\n this.inp.pause();\n // Belt-and-suspenders: clear the whole mouse-mode family in case Claude\n // enabled one we didn't individually track.\n this.out.write(MOUSE_DISABLE_SEQ + '\\x1b[?25h\\x1b[0m\\x1b[?1049l');\n this.resolveDone?.();\n }\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { destroyBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DestroyOptions {\n yes?: boolean;\n keepSnapshot?: boolean;\n}\n\nexport const destroyCommand = new Command('destroy')\n .alias('rm')\n .description('Destroy a box and discard its upper volume')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--keep-snapshot', \"don't delete the snapshot dir under ~/.agentbox/snapshots/\")\n .action(async (idOrName: string | undefined, opts: DestroyOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n if (!opts.yes) {\n log.warn(`This will discard the upper volume — agent work-in-progress is lost.`);\n log.info(`id: ${box.id}`);\n log.info(`container: ${box.container}`);\n log.info(`upper: ${box.upperVolume}`);\n if (box.snapshotDir) {\n log.info(`snapshot: ${box.snapshotDir}${opts.keepSnapshot ? ' (will be kept)' : ''}`);\n }\n const ok = await confirm({\n message: 'Destroy this box?',\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await destroyBox(box.id, { keepSnapshot: opts.keepSnapshot });\n const out: string[] = [`destroyed ${result.record.container}`];\n if (result.removedContainer) out.push(' ✓ container removed');\n out.push(` ✓ volumes removed: ${result.removedVolumes.join(', ')}`);\n if (result.removedSnapshot) out.push(` ✓ snapshot removed: ${result.removedSnapshot}`);\n else if (box.snapshotDir && opts.keepSnapshot) {\n out.push(` · snapshot kept: ${box.snapshotDir}`);\n }\n process.stdout.write(out.join('\\n') + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport { listBoxes, type ListedBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { pathToFileURL } from 'node:url';\nimport { hyperlink } from '../hyperlink.js';\nimport { withWatchOptions, watchRender, type WatchableOptions } from '../watch.js';\n\ninterface ListOptions extends WatchableOptions {\n json?: boolean;\n all?: boolean;\n}\n\n/** A table cell: the (possibly OSC-8-wrapped) text to print + its visible width. */\ninterface Cell {\n text: string;\n width: number;\n}\n\nconst plain = (s: string): Cell => ({ text: s, width: s.length });\n\n/**\n * Shorten `s` to `n` visible chars, keeping the head and the final path\n * segment with `…` in the middle (`/Users/marco/Pr…/test-workspace`). Falls\n * back to a plain head+ellipsis when the tail alone won't fit.\n */\nfunction middleTruncate(s: string, n: number): string {\n if (s.length <= n) return s;\n if (n <= 1) return s.length > 0 ? '…' : '';\n const slash = s.lastIndexOf('/');\n const tail = slash >= 0 ? s.slice(slash) : '';\n // Need room for at least one head char + ellipsis + the whole tail.\n if (tail.length > 0 && tail.length + 2 <= n) {\n const head = s.slice(0, n - 1 - tail.length);\n return `${head}…${tail}`;\n }\n return s.slice(0, n - 1) + '…';\n}\n\n/**\n * Compact, clickable URL for the box: the `expose:`-flagged web endpoint when\n * present (the box's main app, explicitly declared), else the first reachable\n * service, followed by a `(VNC)` link to the noVNC URL when VNC is enabled.\n * Display is the bare `host[:port]` (no scheme, no query) so the VNC password in\n * the query string stays out of the table; the OSC-8 target keeps the full URL\n * so a click still works. Falls back to VNC alone when there's no service.\n */\nfunction urlCell(box: ListedBox, stream: NodeJS.WriteStream): Cell {\n const eps = box.endpoints.endpoints;\n const vnc = eps.find((e) => e.kind === 'vnc' && e.url);\n const primary =\n eps.find((e) => e.kind === 'web' && e.url) ??\n eps.find((e) => e.kind === 'service' && e.url) ??\n vnc;\n if (!primary?.url) return plain('');\n\n let display: string;\n try {\n display = new URL(primary.url).host;\n } catch {\n display = primary.url;\n }\n\n const parts: Cell[] = [\n { text: hyperlink(display, primary.url, stream), width: display.length },\n ];\n if (vnc?.url && vnc !== primary) {\n const label = '(VNC)';\n parts.push({ text: hyperlink(label, vnc.url, stream), width: label.length });\n }\n const sep = ' ';\n return {\n text: parts.map((p) => p.text).join(sep),\n width: parts.reduce((a, p) => a + p.width, 0) + sep.length * (parts.length - 1),\n };\n}\n\n/** Workspace path truncated to `target` and linked to its `file://` URL. */\nfunction workspaceCell(path: string, target: number, stream: NodeJS.WriteStream): Cell {\n const display = middleTruncate(path, target);\n let url: string;\n try {\n url = pathToFileURL(path).href;\n } catch {\n return { text: display, width: display.length };\n }\n return { text: hyperlink(display, url, stream), width: display.length };\n}\n\nfunction renderTable(boxes: ListedBox[], stream: NodeJS.WriteStream): string {\n const header = ['N', 'NAME', 'STATE', 'CLAUDE', 'URL', 'WORKSPACE'];\n const lead: Cell[][] = boxes.map((b) => [\n plain(typeof b.projectIndex === 'number' ? String(b.projectIndex) : ''),\n plain(b.name),\n plain(b.state),\n plain(b.claudeActivity ?? ''),\n urlCell(b, stream),\n ]);\n const leadHeader = header.slice(0, 5).map(plain);\n\n // Widths for the fixed columns (everything but WORKSPACE).\n const fixedWidths = [0, 1, 2, 3, 4].map((col) =>\n Math.max(leadHeader[col]?.width ?? 0, ...lead.map((r) => r[col]?.width ?? 0)),\n );\n\n // WORKSPACE budget: whatever's left of the terminal after the fixed columns\n // + the 2-space separators. Never below a usable floor.\n const term = stream.columns && stream.columns > 0 ? stream.columns : 120;\n const fixedTotal = fixedWidths.reduce((a, b) => a + b, 0) + header.length * 2;\n const naturalWs = Math.max(\n header[5]?.length ?? 0,\n ...boxes.map((b) => b.workspacePath.length),\n );\n const wsWidth = Math.min(naturalWs, Math.max(16, term - fixedTotal));\n\n const widths = [...fixedWidths, wsWidth];\n const rows: Cell[][] = boxes.map((b, idx) => [\n ...(lead[idx] as Cell[]),\n workspaceCell(b.workspacePath, wsWidth, stream),\n ]);\n const all: Cell[][] = [[...leadHeader, plain(header[5] as string)], ...rows];\n\n const padCell = (cell: Cell, col: number): string => {\n const target = widths[col] ?? 0;\n return cell.text + ' '.repeat(Math.max(0, target - cell.width));\n };\n\n return all\n .map((row) =>\n row\n .map((cell, i) => padCell(cell ?? plain(''), i))\n .join(' ')\n .trimEnd(),\n )\n .join('\\n');\n}\n\n/**\n * The boxes `list` should render: scoped to the cwd's project by default\n * (consistent with every other box-arg command, which routes through\n * `box-ref.ts`'s `findProjectRoot` + `resolveBoxRef`), or all boxes under\n * `--all`. Pre-feature boxes have no `projectRoot`, so they surface only under\n * `--all` — same as auto-pick, which never matches them implicitly.\n */\nasync function scopedBoxes(\n all: boolean,\n): Promise<{ boxes: ListedBox[]; projectRoot: string; scoped: boolean }> {\n const boxes = await listBoxes();\n if (all) return { boxes, projectRoot: '', scoped: false };\n const { root } = await findProjectRoot(process.cwd());\n return { boxes: boxes.filter((b) => b.projectRoot === root), projectRoot: root, scoped: true };\n}\n\nasync function buildListText(all: boolean): Promise<string> {\n const { boxes, projectRoot, scoped } = await scopedBoxes(all);\n if (boxes.length === 0) {\n if (scoped) {\n return `no boxes in this project (${projectRoot}) — run \\`agentbox create\\`, or \\`agentbox list --all\\` to see all`;\n }\n return 'no boxes — run `agentbox create` to make one';\n }\n return renderTable(boxes, process.stdout);\n}\n\nexport const listCommand = withWatchOptions(\n new Command('list')\n .alias('ls')\n .description('List agent boxes in the current project (-a for all)')\n .option('-j, --json', 'machine-readable JSON output')\n .option('-a, --all', 'include boxes from all projects'),\n).action(async (opts: ListOptions) => {\n if (opts.json && opts.watch) {\n log.error('cannot combine --json with --watch');\n process.exit(2);\n }\n const all = opts.all ?? false;\n if (opts.watch) {\n await watchRender(() => buildListText(all), opts.interval);\n return;\n }\n if (opts.json) {\n const { boxes } = await scopedBoxes(all);\n process.stdout.write(JSON.stringify(boxes, null, 2) + '\\n');\n return;\n }\n process.stdout.write((await buildListText(all)) + '\\n');\n});\n","import { supportsHyperlink } from 'supports-hyperlinks';\n\nconst ESC = '\\x1b';\nconst ST = `${ESC}\\\\`;\n\n/**\n * Wrap `label` in an OSC-8 hyperlink pointing at `url`, when the target stream\n * is a TTY whose terminal program is known to support OSC-8 (iTerm2, WezTerm,\n * Ghostty, recent VS Code, etc. — `supports-hyperlinks` does the detection).\n * Falls back to the plain label otherwise so piped output stays clean.\n */\nexport function hyperlink(label: string, url: string, stream?: NodeJS.WriteStream): string {\n const out = stream ?? process.stdout;\n if (!supportsHyperlink(out)) return label;\n return `${ESC}]8;;${url}${ST}${label}${ESC}]8;;${ST}`;\n}\n","import type { Command } from 'commander';\n\nexport interface WatchableOptions {\n watch?: boolean;\n interval?: string;\n}\n\n/** Add the shared `-w/--watch` + `--interval` options to a command. */\nexport function withWatchOptions(cmd: Command): Command {\n return cmd\n .option('-w, --watch', 'redraw continuously until interrupted (Ctrl-C)')\n .option('--interval <seconds>', 'refresh interval for --watch', '2');\n}\n\nfunction parseIntervalMs(raw: string | undefined): number {\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return 2000;\n // Floor at 250ms so a typo like `--interval 0.001` can't busy-spin.\n return Math.max(250, Math.round(n * 1000));\n}\n\n/**\n * Redraw `produce()`'s output on a fixed interval until the user hits Ctrl-C.\n * Clears the screen (and scrollback) each tick so the view stays put. A\n * `produce()` failure is shown inline and retried next tick — boxes routinely\n * disappear briefly during stop/start, and the persisted status is still\n * readable while paused, so a transient error shouldn't end the watch.\n */\nexport async function watchRender(\n produce: () => Promise<string>,\n rawInterval: string | undefined,\n): Promise<void> {\n const ms = parseIntervalMs(rawInterval);\n const intervalLabel = `${String(ms / 1000)}s`;\n process.stdout.write('\\x1b[?25l'); // hide cursor\n process.once('exit', () => process.stdout.write('\\x1b[?25h')); // restore on exit\n process.once('SIGINT', () => process.exit(0));\n const sleep = (d: number): Promise<void> => new Promise((r) => setTimeout(r, d));\n for (;;) {\n let body: string;\n try {\n body = await produce();\n } catch (err) {\n body = `error: ${err instanceof Error ? err.message : String(err)}`;\n }\n const ts = new Date().toLocaleTimeString();\n // 2J clear, 3J drop scrollback, H cursor home.\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H');\n process.stdout.write(\n `watching every ${intervalLabel} — ${ts} — Ctrl-C to exit\\n\\n${body.replace(/\\n+$/, '')}\\n`,\n );\n await sleep(ms);\n }\n}\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport { execInBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface LogsOptions {\n tail: string;\n follow?: boolean;\n}\n\nexport const logsCommand = new Command('logs')\n .description('Print recent log lines from a box service; -f to stream')\n // Both args optional so we can support `agentbox logs <service>` (auto-pick\n // the box) AND the original `agentbox logs <box> <service>`. Validation +\n // smart re-binding happens in the action handler.\n .argument(\n '[box]',\n 'box ref (optional when cwd has exactly 1 box): project index, id, id prefix, name, or container',\n )\n .argument('[service]', 'service name from agentbox.yaml')\n .option('-n, --tail <n>', 'how many recent lines to print first', '200')\n .option('-f, --follow', 'keep the connection open and stream new lines')\n .action(async (boxArg: string | undefined, serviceArg: string | undefined, opts: LogsOptions) => {\n try {\n // Smart parse: if only one positional was given, commander binds it to\n // `boxArg` (the first positional). Treat that as the service and\n // auto-pick the box from the current project.\n let idOrName: string | undefined;\n let service: string | undefined;\n if (serviceArg !== undefined) {\n idOrName = boxArg;\n service = serviceArg;\n } else {\n idOrName = undefined;\n service = boxArg;\n }\n if (!service) {\n log.error('missing <service> argument');\n log.info('usage: agentbox logs [box] <service> [-n N] [-f]');\n process.exit(2);\n }\n\n const box = await resolveBoxOrExit(idOrName);\n\n const tail = String(Number.parseInt(opts.tail, 10) || 200);\n const args = ['agentbox-ctl', 'logs', service, '--tail', tail];\n if (opts.follow) args.push('--follow');\n\n if (!opts.follow) {\n const proc = await execInBox(box.container, args, { user: 'vscode' });\n if (proc.exitCode !== 0) {\n log.error(`agentbox-ctl logs failed: ${proc.stderr || proc.stdout}`);\n process.exit(1);\n }\n process.stdout.write(proc.stdout);\n if (!proc.stdout.endsWith('\\n')) process.stdout.write('\\n');\n return;\n }\n\n // Streaming: hand stdio to `docker exec` directly so the user sees lines\n // as the daemon emits them, and Ctrl-C kills both ends cleanly.\n const child = spawn('docker', ['exec', '--user', 'vscode', box.container, ...args], {\n stdio: ['ignore', 'inherit', 'inherit'],\n });\n child.on('exit', (code) => process.exit(code ?? 0));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { openBoxInFinder } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { runPath } from './path.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface OpenOpts {\n upper?: boolean;\n refresh: boolean; // commander gives `--no-refresh` => refresh=false\n includeNodeModules?: boolean;\n print?: boolean;\n path?: boolean;\n}\n\nexport const openCommand = new Command('open')\n .description(\"Open a box's merged workspace in Finder (snapshot of the agent's view)\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--upper', 'open just the writes layer (live on OrbStack, snapshot on Docker Desktop)')\n .option('--no-refresh', \"skip the rsync; open whatever's already on disk\")\n .option(\n '--include-node-modules',\n 'include /workspace/node_modules in the merged export (off by default)',\n )\n .option('--path', 'print the host workspace path instead of launching Finder')\n .option('--print', 'alias of --path')\n .action(async (idOrName: string | undefined, opts: OpenOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n if (opts.path || opts.print) {\n await runPath(box, {\n upper: opts.upper,\n refresh: opts.refresh, // print refreshes by default; --no-refresh skips\n includeNodeModules: opts.includeNodeModules,\n });\n return;\n }\n\n const layer = opts.upper ? 'upper' : 'merged';\n const result = await openBoxInFinder(box.id, {\n layer,\n includeNodeModules: opts.includeNodeModules,\n noRefresh: !opts.refresh,\n noOpen: false,\n });\n\n const liveNote = !result.copied ? ' (live)' : result.usedFallback ? ' (tar fallback)' : '';\n process.stdout.write(`opened ${result.hostPath}${liveNote}\\n`);\n\n if (opts.upper && result.engine !== 'orbstack' && result.copied) {\n log.info(\n 'Tip: live upper-layer browsing requires OrbStack. Re-run `agentbox open --upper` to refresh.',\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { getBoxHostPaths, refreshExport } from '@agentbox/sandbox-docker';\nimport type { BoxRecord } from '@agentbox/sandbox-docker';\nimport { handleLifecycleError } from './_errors.js';\n\nexport interface PathOpts {\n upper?: boolean;\n refresh?: boolean;\n includeNodeModules?: boolean;\n}\n\n// The `path` command was folded into `agentbox open --path`; this is the\n// extracted body, called by open.ts with an already-resolved box.\nexport async function runPath(box: BoxRecord, opts: PathOpts): Promise<void> {\n try {\n const layer = opts.upper ? 'upper' : 'merged';\n const { record, paths } = await getBoxHostPaths(box.id);\n\n if (opts.refresh) {\n const refreshed = await refreshExport(record, {\n layer,\n includeNodeModules: opts.includeNodeModules,\n });\n process.stdout.write(`${refreshed.hostPath}\\n`);\n return;\n }\n\n const path =\n layer === 'upper' ? (paths.upperLiveOnHost ?? paths.upperExport) : paths.mergedExport;\n process.stdout.write(`${path}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n}\n","import { pauseBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const pauseCommand = new Command('pause')\n .description('Freeze a box (docker pause — 0 CPU, RAM stays mapped)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const record = await pauseBox(box.id);\n process.stdout.write(`paused ${record.container}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { pruneOrphanProjectConfigs } from '@agentbox/config';\nimport { listBoxes, pruneBoxes, type PruneResult } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PruneOptions {\n dryRun?: boolean;\n all?: boolean;\n yes?: boolean;\n}\n\nfunction totalRemovals(r: PruneResult, projectConfigs: string[]): number {\n return (\n r.removedRecords.length +\n r.removedContainers.length +\n r.removedVolumes.length +\n r.removedSnapshotDirs.length +\n r.removedBoxDirs.length +\n projectConfigs.length\n );\n}\n\nfunction summary(r: PruneResult, projectConfigs: string[]): string {\n const lines: string[] = [];\n if (r.removedRecords.length > 0) {\n lines.push(\n ` state records (${String(r.removedRecords.length)}): ${r.removedRecords.join(', ')}`,\n );\n }\n if (r.removedContainers.length > 0) {\n lines.push(\n ` containers (${String(r.removedContainers.length)}): ${r.removedContainers.join(', ')}`,\n );\n }\n if (r.removedVolumes.length > 0) {\n lines.push(\n ` volumes (${String(r.removedVolumes.length)}): ${r.removedVolumes.join(', ')}`,\n );\n }\n if (r.removedSnapshotDirs.length > 0) {\n lines.push(\n ` snapshot dirs (${String(r.removedSnapshotDirs.length)}): ${r.removedSnapshotDirs.join(', ')}`,\n );\n }\n if (r.removedBoxDirs.length > 0) {\n lines.push(\n ` box dirs (${String(r.removedBoxDirs.length)}): ${r.removedBoxDirs.join(', ')}`,\n );\n }\n if (projectConfigs.length > 0) {\n lines.push(\n ` project configs (${String(projectConfigs.length)}): ${projectConfigs.join(', ')}`,\n );\n }\n return lines.length > 0 ? lines.join('\\n') : ' (nothing to remove)';\n}\n\n/** Project roots of boxes still in state.json — their config must survive. */\nasync function liveProjectRoots(): Promise<string[]> {\n try {\n const boxes = await listBoxes();\n return boxes.map((b) => b.projectRoot).filter((p): p is string => typeof p === 'string');\n } catch {\n return [];\n }\n}\n\nexport const pruneCommand = new Command('prune')\n .description('Clean up orphan state.json records (and with --all, orphan docker resources)')\n .option('--dry-run', \"show what would be removed, don't change anything\")\n .option(\n '--all',\n 'also remove orphan agentbox-* containers, volumes, snapshot dirs, and orphan per-project config dirs',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .action(async (opts: PruneOptions) => {\n try {\n const dryRun = opts.dryRun ?? false;\n // Project-config GC is part of the destructive `--all` tier (it removes\n // ~/.agentbox/projects/<hash>/ dirs whose workspace folder was deleted).\n const protectedPaths = opts.all ? await liveProjectRoots() : [];\n\n const preview = await pruneBoxes({ dryRun: true, all: opts.all });\n const previewProjects = opts.all\n ? (await pruneOrphanProjectConfigs({ dryRun: true, protectedPaths })).removed.map(\n (r) => r.originalPath,\n )\n : [];\n if (totalRemovals(preview, previewProjects) === 0) {\n process.stdout.write('nothing to prune\\n');\n return;\n }\n\n log.info(`would remove:\\n${summary(preview, previewProjects)}`);\n if (dryRun) return;\n\n if (!opts.yes) {\n const ok = await confirm({ message: 'Proceed with prune?', initialValue: true });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pruneBoxes({ all: opts.all });\n const removedProjects = opts.all\n ? (await pruneOrphanProjectConfigs({ protectedPaths })).removed.map((r) => r.originalPath)\n : [];\n process.stdout.write(`pruned:\\n${summary(result, removedProjects)}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_ENV_PATTERNS,\n inspectBox,\n pullToHost,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\nimport { pullClaudeCommand } from './pull-claude.js';\nimport { pullConfigCommand } from './pull-config.js';\nimport { pullEnvCommand } from './pull-env.js';\n\ninterface PullOpts {\n yes?: boolean;\n dryRun?: boolean;\n respectGitignore: boolean; // commander gives `--no-respect-gitignore` => false\n includeNodeModules?: boolean;\n refresh: boolean; // commander gives `--no-refresh` => false\n withEnv?: boolean;\n pattern: string[];\n}\n\nexport const pullCommand = new Command('pull')\n // Parent and the `env` subcommand share option names (--dry-run, -y,\n // --pattern). Positional options make post-subcommand options bind to the\n // subcommand instead of being swallowed by this parent command.\n .enablePositionalOptions()\n .description(\"Pull a box's /workspace back into your host workspace dir (gitignore-aware)\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"print the change list and exit; don't write\")\n .option(\n '--no-respect-gitignore',\n 'disable git ls-files mode; use --exclude=node_modules,.git instead',\n )\n .option(\n '--include-node-modules',\n 'do not exclude node_modules in fallback mode (no effect in gitignore mode)',\n )\n .option('--no-refresh', \"skip the box->scratch-dir rsync step (use whatever's already there)\")\n .option(\n '--with-env',\n 'also pull env/config files (.env*, .envrc, secrets.toml, agentbox.yaml, ...) ignoring gitignore',\n )\n .option(\n '--pattern <glob>',\n 'extra env basename glob; only effective with --with-env (repeatable)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .action(async (idOrName: string | undefined, opts: PullOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n const rootWorktree = box.gitWorktrees?.find((w) => w.kind === 'root');\n if (rootWorktree) {\n log.warn(\n `This box has been committing to branch \\`${rootWorktree.branch}\\` in a separate worktree.\\n` +\n `For a git-aware merge instead of a file copy, run from your checkout:\\n` +\n ` git merge ${rootWorktree.branch}\\n` +\n `Continuing with rsync into ${box.workspacePath}`,\n );\n }\n\n const envPatterns = opts.withEnv\n ? [...DEFAULT_ENV_PATTERNS, ...opts.pattern]\n : undefined;\n\n const preview = await pullToHost(box, {\n dryRun: true,\n respectGitignore: opts.respectGitignore,\n includeNodeModules: opts.includeNodeModules,\n envPatterns,\n noRefresh: !opts.refresh,\n });\n\n if (preview.changes.length === 0) {\n process.stdout.write(`no changes to pull into ${box.workspacePath}\\n`);\n return;\n }\n\n if (opts.dryRun) {\n for (const line of preview.changes) process.stdout.write(`${line}\\n`);\n process.stdout.write(\n `\\n[dry-run] ${preview.changes.length} file(s) would change in ${box.workspacePath}\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.changes.length} changed file(s)${opts.withEnv ? ' (incl. env/config)' : ''} into ${box.workspacePath}?`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullToHost(box, {\n dryRun: false,\n respectGitignore: opts.respectGitignore,\n includeNodeModules: opts.includeNodeModules,\n envPatterns,\n // The dry-run pass above already refreshed (or intentionally skipped)\n // the scratch dir — don't rsync box->scratch a second time.\n noRefresh: true,\n });\n process.stdout.write(\n `updated ${result.changes.length} file(s) in ${result.hostPath}` +\n `${result.usedGitignore ? '' : ' (exclude-list mode)'}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n// `agentbox pull env [box]` — commander dispatches the `env` subcommand;\n// `agentbox pull [box]` / `agentbox pull` still hit the default action above.\npullCommand.addCommand(pullEnvCommand);\n\n// `agentbox pull claude [box]` — box -> host pull of newly-added Claude\n// skills/plugins/agents/commands (additive; reads the claude-config volume so\n// the box need not be running).\npullCommand.addCommand(pullClaudeCommand);\n\n// `agentbox pull config [box]` — box -> host pull of just agentbox.yaml\n// (gitignore-bypassing; for syncing back an in-box-edited/regenerated config).\npullCommand.addCommand(pullConfigCommand);\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_BOX_IMAGE,\n pullClaudeExtras,\n resolveClaudeVolume,\n SHARED_CLAUDE_VOLUME,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PullClaudeOpts {\n yes?: boolean;\n dryRun?: boolean;\n}\n\nfunction tag(item: { category: string; name: string }): string {\n const noun = item.category === 'plugins' ? 'plugin' : item.category.replace(/s$/, '');\n return ` ${item.category}/${item.name} (new ${noun})`;\n}\n\nexport const pullClaudeCommand = new Command('claude')\n .description(\n 'Pull box-installed Claude skills/plugins/agents/commands back to host ~/.claude (additive)',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"list new items and exit; don't write\")\n .action(async (idOrName: string | undefined, opts: PullClaudeOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // We read the claude-config *volume*, not the container, so the box can\n // be stopped — no unpause/start dance (unlike `pull` / `pull env`).\n const volume =\n box.claudeConfigVolume ?? resolveClaudeVolume({ isolate: false, boxId: box.id }).volume;\n if (volume === SHARED_CLAUDE_VOLUME) {\n log.warn(\n `Reading the shared ${SHARED_CLAUDE_VOLUME} volume — it aggregates Claude extensions installed in ANY box, not just ${box.name}.`,\n );\n }\n const image = box.image || DEFAULT_BOX_IMAGE;\n\n const preview = await pullClaudeExtras({ volume }, { image, dryRun: true });\n\n if (preview.newItems.length === 0 && preview.mergedRegistries.length === 0) {\n process.stdout.write('no new Claude extensions to pull into ~/.claude\\n');\n return;\n }\n\n for (const item of preview.newItems) process.stdout.write(`${tag(item)}\\n`);\n for (const reg of preview.mergedRegistries) {\n process.stdout.write(` plugins/${reg} (merge new entries)\\n`);\n }\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.newItems.length} item(s)` +\n `${preview.mergedRegistries.length > 0 ? ` + ${preview.mergedRegistries.length} registry merge(s)` : ''}` +\n ` would be pulled into ~/.claude\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.newItems.length} new Claude extension(s) into ~/.claude? (existing items are never overwritten)`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullClaudeExtras({ volume }, { image, dryRun: false });\n process.stdout.write(\n `pulled ${result.newItems.length} extension(s)` +\n `${result.mergedRegistries.length > 0 ? `, merged ${result.mergedRegistries.join(', ')}` : ''}` +\n ' into ~/.claude\\n',\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { inspectBox, pullToHost, startBox, unpauseBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PullConfigOpts {\n yes?: boolean;\n dryRun?: boolean;\n refresh: boolean; // commander gives `--no-refresh` => false\n}\n\n/**\n * rsync `-i` codes a brand-new file as `>f` followed by all `+` in the\n * attribute columns. The column count differs between rsync builds (macOS\n * emits 7, others 9), so match \"all +\" rather than a fixed width.\n */\nfunction tagChange(line: string): string {\n const sp = line.indexOf(' ');\n const code = sp === -1 ? line : line.slice(0, sp);\n const path = sp === -1 ? '' : line.slice(sp + 1);\n const isNew = /^>f\\++$/.test(code);\n return ` ${path} ${isNew ? '(new)' : '(overwrites host)'}`;\n}\n\n// `agentbox.yaml` lives in the box's overlay at /workspace and is normally\n// gitignored, so the gitignore-aware default pull skips it. This pulls just\n// that file (in-box `find` also picks up nested ones in a monorepo).\nconst CONFIG_PATTERNS = ['agentbox.yaml'];\n\nexport const pullConfigCommand = new Command('config')\n .description('Pull agentbox.yaml box -> host')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"list matched files and exit; don't write\")\n .option('--no-refresh', 'skip the box->scratch-dir rsync step')\n .action(async (idOrName: string | undefined, opts: PullConfigOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n log.info(`agentbox.yaml bypasses gitignore and copies directly into ${box.workspacePath}`);\n\n const preview = await pullToHost(box, {\n dryRun: true,\n respectGitignore: false,\n envPatterns: CONFIG_PATTERNS,\n noRefresh: !opts.refresh,\n });\n\n if (preview.changes.length === 0) {\n process.stdout.write(`no config file to pull into ${box.workspacePath}\\n`);\n return;\n }\n\n for (const line of preview.changes) process.stdout.write(`${tagChange(line)}\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.changes.length} config file(s) would change in ${box.workspacePath}\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.changes.length} config file(s) into ${box.workspacePath}? (existing files will be overwritten)`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullToHost(box, {\n dryRun: false,\n respectGitignore: false,\n envPatterns: CONFIG_PATTERNS,\n // The dry-run pass above already refreshed (or intentionally skipped)\n // the scratch dir — don't rsync box->scratch a second time.\n noRefresh: true,\n });\n process.stdout.write(\n `pulled ${result.changes.length} config file(s) into ${result.hostPath}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_ENV_PATTERNS,\n inspectBox,\n pullToHost,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PullEnvOpts {\n yes?: boolean;\n dryRun?: boolean;\n pattern: string[];\n refresh: boolean; // commander gives `--no-refresh` => false\n}\n\n/**\n * rsync `-i` codes a brand-new file as `>f` followed by all `+` in the\n * attribute columns. The column count differs between rsync builds (macOS\n * emits 7, others 9), so match \"all +\" rather than a fixed width.\n */\nfunction tagChange(line: string): string {\n const sp = line.indexOf(' ');\n const code = sp === -1 ? line : line.slice(0, sp);\n const path = sp === -1 ? '' : line.slice(sp + 1);\n const isNew = /^>f\\++$/.test(code);\n return ` ${path} ${isNew ? '(new)' : '(overwrites host)'}`;\n}\n\nexport const pullEnvCommand = new Command('env')\n .description(\n 'Pull gitignored env/config files (.env*, .envrc, secrets.toml, agentbox.yaml, ...) box -> host',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"list matched files and exit; don't write\")\n .option(\n '--pattern <glob>',\n 'extra basename glob to match (repeatable, adds to defaults)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option('--no-refresh', 'skip the box->scratch-dir rsync step')\n .action(async (idOrName: string | undefined, opts: PullEnvOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n log.info(\n `env/config files bypass gitignore and copy directly into ${box.workspacePath}`,\n );\n\n const patterns = [...DEFAULT_ENV_PATTERNS, ...opts.pattern];\n\n const preview = await pullToHost(box, {\n dryRun: true,\n respectGitignore: false,\n envPatterns: patterns,\n noRefresh: !opts.refresh,\n });\n\n if (preview.changes.length === 0) {\n process.stdout.write(`no env/config files to pull into ${box.workspacePath}\\n`);\n return;\n }\n\n for (const line of preview.changes) process.stdout.write(`${tagChange(line)}\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.changes.length} env/config file(s) would change in ${box.workspacePath}\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.changes.length} env/config file(s) into ${box.workspacePath}? (existing files will be overwritten)`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullToHost(box, {\n dryRun: false,\n respectGitignore: false,\n envPatterns: patterns,\n // The dry-run pass above already refreshed (or intentionally skipped)\n // the scratch dir — don't rsync box->scratch a second time.\n noRefresh: true,\n });\n process.stdout.write(\n `pulled ${result.changes.length} env/config file(s) into ${result.hostPath}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n buildVncUrls,\n detectEngine,\n ensureBoxBrowser,\n getBoxEndpoints,\n getBoxHostPaths,\n inspectBox,\n readBoxStatus,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface ScreenOptions {\n print?: boolean;\n loopback?: boolean;\n}\n\nexport const screenCommand = new Command('screen')\n .description(\"Open a box's VNC (noVNC) viewer in the browser (auto-unpause/start)\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--print', 'print the URL to stdout instead of launching the browser')\n .option('--loopback', 'use the 127.0.0.1 URL instead of the OrbStack .orb.local URL')\n .action(async (idOrName: string | undefined, opts: ScreenOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n if (!box.vncEnabled) {\n throw new Error(`VNC is disabled for box ${box.name} — recreate without \\`--no-vnc\\``);\n }\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n const br = await ensureBoxBrowser(box.container);\n if (br.up && !br.alreadyRunning) log.info('started in-box browser');\n else if (!br.up) log.warn(`could not start in-box browser: ${br.reason ?? 'unknown'}`);\n\n const engine = await detectEngine();\n const urls = buildVncUrls(box, engine);\n const url = opts.loopback ? urls.loopbackUrl : (urls.orbUrl ?? urls.loopbackUrl);\n if (!url) {\n throw new Error(\n `VNC URL unavailable (daemon may not be up); try \\`agentbox inspect ${box.name}\\``,\n );\n }\n\n if (opts.print) {\n process.stdout.write(`${url}\\n`);\n return;\n }\n\n const opened = spawnSync('open', [url], { stdio: 'inherit' });\n if (opened.status !== 0) {\n throw new Error(`open ${url} failed (exit ${String(opened.status ?? 'n/a')})`);\n }\n process.stdout.write(`opened ${url}\\n`);\n\n // Also pop the web app when a service declares `expose:`. The `web`\n // endpoint is only reachable+url'd in that case (startBox reallocates\n // webHostPort, so re-read the record). Best-effort: the VNC viewer\n // already opened, so a failure here must not fail the command.\n try {\n const { record } = await getBoxHostPaths(box.id);\n const persisted = await readBoxStatus(box.id);\n const eps = await getBoxEndpoints(record, engine, persisted);\n const webEp = eps.endpoints.find((e) => e.kind === 'web');\n if (webEp?.reachable && webEp.url) {\n const webUrl =\n engine === 'orbstack' && !opts.loopback\n ? `http://${record.container}.orb.local`\n : webEp.url;\n const w = spawnSync('open', [webUrl], { stdio: 'inherit' });\n if (w.status === 0) process.stdout.write(`also opened ${webUrl}\\n`);\n else log.warn(`could not open web app (${webUrl})`);\n }\n } catch (e) {\n log.warn(`could not open web app: ${e instanceof Error ? e.message : String(e)}`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { loadEffectiveConfig, type UserConfig } from '@agentbox/config';\nimport { inspectBox, startBox, unpauseBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrShift } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface ShellOptions {\n user?: string;\n login?: boolean;\n}\n\nfunction buildShellCliOverrides(opts: ShellOptions): Partial<UserConfig> {\n const shell: NonNullable<UserConfig['shell']> = {};\n if (opts.user !== undefined) shell.user = opts.user;\n if (opts.login === false) shell.login = false;\n return Object.keys(shell).length > 0 ? { shell } : {};\n}\n\nexport const shellCommand = new Command('shell')\n .description('Open an interactive bash shell in a box (auto-unpause/start)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .argument(\n '[cmd...]',\n 'optional one-shot command to run instead of an interactive shell; place after `--`, e.g. `agentbox shell smoke -- ls /workspace`',\n )\n .option('--user <name>', 'user inside the container (default from config; built-in: vscode)')\n .option('--no-login', 'invoke `bash` instead of `bash -l` (skip login profile)')\n .action(async (idOrName: string | undefined, cmd: string[], opts: ShellOptions) => {\n try {\n // resolveBoxOrShift handles the `agentbox shell -- ls` case: commander\n // binds \"ls\" to [box], which doesn't resolve; if auto-pick succeeds we\n // treat \"ls\" as the first cmd token instead.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n const effectiveCmd = shifted && idOrName ? [idOrName, ...cmd] : cmd;\n\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: buildShellCliOverrides(opts),\n });\n const user = cfg.effective.shell.user;\n const login = cfg.effective.shell.login;\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // Inherit TERM so bash declares the outer terminal's true-color +\n // hyperlink capabilities (docker exec defaults to TERM=xterm).\n const term = process.env['TERM'] ?? 'xterm-256color';\n const bashArgs: string[] = [];\n if (login) bashArgs.push('-l');\n if (effectiveCmd.length > 0) bashArgs.push('-c', effectiveCmd.join(' '));\n\n // -i always (so stdin pipes / heredocs work). -t only when stdout is a\n // real TTY — `docker exec -t` errors with \"cannot attach stdin to a\n // TTY-enabled container because stdin is not a terminal\" when run under\n // a script or another agent that piped its output.\n const ttyFlag = process.stdout.isTTY && process.stdin.isTTY ? '-it' : '-i';\n const child = spawnSync(\n 'docker',\n [\n 'exec',\n ttyFlag,\n '-e',\n `TERM=${term}`,\n '--user',\n user,\n box.container,\n 'bash',\n ...bashArgs,\n ],\n { stdio: 'inherit' },\n );\n process.exit(child.status ?? 0);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { startBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const startCommand = new Command('start')\n .description('Start a stopped box (docker start + re-mount the FUSE overlay)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const { record, overlayChecks } = await startBox(box.id);\n process.stdout.write(`started ${record.container}\\n`);\n const failed = overlayChecks.filter((c) => !c.ok);\n if (failed.length > 0) {\n for (const c of failed) {\n process.stderr.write(` ✗ ${c.name}: ${c.detail}\\n`);\n }\n process.exit(1);\n }\n for (const c of overlayChecks) {\n process.stdout.write(` ✓ ${c.name}\\n`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n renderPortsTable,\n renderStatusTable,\n renderTaskTable,\n type BoxStatus,\n type StatusReply,\n} from '@agentbox/ctl';\nimport {\n boxResourceStats,\n execInBox,\n inspectBox,\n type InspectedBox,\n} from '@agentbox/sandbox-docker';\nimport type { BoxResourceStats } from '@agentbox/core';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { renderEndpointLines } from '../endpoints-render.js';\nimport { fmtAgo, fmtBytes, fmtPercent } from '../fmt.js';\nimport { withWatchOptions, watchRender, type WatchableOptions } from '../watch.js';\nimport { runInspect } from './inspect.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface StatusOptions extends WatchableOptions {\n json?: boolean;\n inspect?: boolean;\n}\n\nexport const statusCommand = withWatchOptions(\n new Command('status')\n .description(\"Show service + task status from a box's agentbox-ctl daemon\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-j, --json', 'machine-readable JSON output')\n .option('--inspect', 'show detailed box info (volumes, limits, paths) instead of service/task status'),\n).action(async (idOrName: string | undefined, opts: StatusOptions) => {\n try {\n if (opts.json && opts.watch) {\n log.error('cannot combine --json with --watch');\n process.exit(2);\n }\n const box = await resolveBoxOrExit(idOrName);\n\n if (opts.inspect) {\n await runInspect(box, { json: opts.json, watch: opts.watch, interval: opts.interval });\n return;\n }\n\n if (opts.watch) {\n await watchRender(() => buildStatusText(box.id, box.container), opts.interval);\n return;\n }\n\n if (opts.json) {\n const inspected = await inspectBox(box.id);\n const live = await fetchLive(inspected.state, box.container);\n const resources = await boxResourceStats(inspected.record);\n process.stdout.write(\n JSON.stringify(\n {\n state: inspected.state,\n source: live ? 'live' : 'persisted',\n ...(live ?? {}),\n resources,\n claudeSession: inspected.claudeSession,\n persisted: inspected.persistedStatus,\n endpoints: inspected.endpoints,\n },\n null,\n 2,\n ) + '\\n',\n );\n return;\n }\n\n process.stdout.write((await buildStatusText(box.id, box.container)) + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n});\n\nasync function fetchLive(state: string, container: string): Promise<StatusReply | null> {\n // Only a running container is reachable via `docker exec` (macOS can see the\n // socket file but can't connect to it). Paused/stopped — or a failed exec —\n // falls back to the snapshot the relay persisted to disk.\n if (state !== 'running') return null;\n const proc = await execInBox(container, ['agentbox-ctl', 'status', '--json'], {\n user: 'vscode',\n });\n if (proc.exitCode !== 0) return null;\n try {\n return JSON.parse(proc.stdout) as StatusReply;\n } catch {\n return null;\n }\n}\n\nasync function buildStatusText(id: string, container: string): Promise<string> {\n const inspected = await inspectBox(id);\n const { state, endpoints, persistedStatus } = inspected;\n const live = await fetchLive(state, container);\n\n const out: string[] = [];\n const epLines = renderEndpointLines(endpoints, process.stdout);\n if (epLines.length > 0) {\n out.push('ENDPOINTS', epLines.join('\\n'), '');\n }\n out.push('RESOURCES', renderResources(await boxResourceStats(inspected.record)), '');\n out.push('CLAUDE', renderClaude(inspected, persistedStatus));\n\n if (live) {\n if (live.tasks.length > 0) {\n out.push('', 'TASKS', renderTaskTable(live.tasks));\n }\n out.push('', 'SERVICES', renderStatusTable(live.services));\n out.push('', 'PORTS', renderPortsTable(live.ports));\n return out.join('\\n');\n }\n\n if (!persistedStatus) {\n out.push(\n '',\n `box is ${state}; no persisted status ` +\n `(box predates this feature, or the relay never received a snapshot)`,\n );\n return out.join('\\n');\n }\n out.push('', renderPersisted(persistedStatus, state));\n return out.join('\\n');\n}\n\nfunction renderResources(s: BoxResourceStats): string {\n const lim = (v: string | number | null | undefined): string =>\n v ? ` (limit ${typeof v === 'number' ? String(v) : v})` : '';\n const seg: string[] = [];\n if (s.live) {\n seg.push(`cpu ${fmtPercent(s.cpuPercent)}${lim(s.limits.cpus)}`);\n seg.push(\n `mem ${fmtBytes(s.memUsedBytes)} / ${fmtBytes(s.memLimitBytes)} ` +\n `(${fmtPercent(s.memPercent)})${lim(s.limits.memoryBytes ? fmtBytes(s.limits.memoryBytes) : null)}`,\n );\n seg.push(`pids ${s.pids === null ? '—' : String(s.pids)}${lim(s.limits.pidsLimit)}`);\n } else {\n seg.push('not running');\n if (s.limits.memoryBytes) seg.push(`mem limit ${fmtBytes(s.limits.memoryBytes)}`);\n if (s.limits.cpus) seg.push(`cpu limit ${String(s.limits.cpus)}`);\n if (s.limits.pidsLimit) seg.push(`pids limit ${String(s.limits.pidsLimit)}`);\n }\n seg.push(\n `disk ${fmtBytes(s.diskUsedBytes)}${s.limits.disk ? ` (limit ${s.limits.disk}, no-op on overlay2/macOS)` : ''}`,\n );\n if (s.snapshotDiskBytes !== null) seg.push(`snapshot ${fmtBytes(s.snapshotDiskBytes)}`);\n if (s.checkpointVolumeBytes !== null) seg.push(`ckpt ${fmtBytes(s.checkpointVolumeBytes)}`);\n let line = ` ${seg.join(' ')}`;\n for (const w of s.warnings) line += `\\n note: ${w}`;\n return line;\n}\n\nfunction renderClaude(i: InspectedBox, persisted: BoxStatus | null): string {\n const s = i.claudeSession;\n let session: string;\n if (s === null) {\n session = 'no session (box not running)';\n } else if (!s.running) {\n session = `no session (\"${s.sessionName}\")`;\n } else {\n const ago = fmtAgo(s.startedAt);\n session = `running (\"${s.sessionName}\")${ago ? `, started ${ago}` : ''}`;\n }\n const lines = [` session ${session}`];\n if (persisted) {\n const c = persisted.claude;\n const ago = fmtAgo(c.updatedAt);\n lines.push(` activity ${c.state}${ago ? ` (${ago})` : ''}`);\n }\n return lines.join('\\n');\n}\n\nfunction renderPersisted(s: BoxStatus, state: string): string {\n const out: string[] = [`(persisted snapshot from ${s.timestamp}; box is ${state})`, ''];\n if (s.tasks.length > 0) {\n out.push('TASKS');\n out.push(...s.tasks.map((t) => ` ${t.name} ${t.state}`));\n out.push('');\n }\n out.push('SERVICES');\n if (s.services.length === 0) {\n out.push(' (none)');\n } else {\n out.push(\n ...s.services.map(\n (svc) => ` ${svc.name} ${svc.state}${svc.port !== null ? ` :${String(svc.port)}` : ''}`,\n ),\n );\n }\n out.push('');\n out.push('PORTS');\n if (s.ports.length === 0) {\n out.push(' (none listening)');\n } else {\n const other = s.ports\n .filter((p) => !p.service)\n .map((p) => p.port)\n .sort((a, b) => a - b);\n out.push(\n ...s.ports\n .filter((p) => p.service)\n .map((p) => ` :${String(p.port)} (${p.service})`),\n );\n if (other.length > 0) out.push(` other (${other.length}): ${other.join(', ')}`);\n }\n return out.join('\\n');\n}\n","import type { BoxEndpoints } from '@agentbox/sandbox-docker';\nimport { hyperlink } from './hyperlink.js';\n\n/**\n * Render the box's network surface as aligned `name value` lines (no section\n * header — callers prepend their own). URLs are OSC-8 clickable where the\n * terminal supports it. Returns [] when there's nothing to show so callers can\n * skip the whole block.\n */\nexport function renderEndpointLines(\n endpoints: BoxEndpoints,\n stream: NodeJS.WriteStream,\n): string[] {\n if (endpoints.endpoints.length === 0) return [];\n\n const entries: Array<{ name: string; value: string }> = [\n { name: 'domain', value: endpoints.domain },\n ];\n\n for (const ep of endpoints.endpoints) {\n if (ep.url) {\n entries.push({ name: ep.name, value: hyperlink(ep.url, ep.url, stream) });\n } else if (ep.kind === 'vnc') {\n entries.push({ name: ep.name, value: 'enabled (URL unavailable — daemon may not be up)' });\n } else if (ep.kind === 'web') {\n entries.push({\n name: 'web',\n value: 'reserved (set a service `expose:` in agentbox.yaml)',\n });\n } else {\n entries.push({\n name: ep.name,\n value: `port ${String(ep.containerPort)} (box-only — not reachable from host)`,\n });\n }\n }\n\n const nameWidth = Math.max(...entries.map((e) => e.name.length));\n return entries.map((e) => ` ${e.name.padEnd(nameWidth)} ${e.value}`);\n}\n","/** Human byte size (binary units). `n/a` for null. Shared by inspect/status/top. */\nexport function fmtBytes(n: number | null | undefined): string {\n if (n === null || n === undefined) return 'n/a';\n if (n < 1024) return `${String(n)} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`;\n if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MiB`;\n return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GiB`;\n}\n\n/** A percentage like `12.3%`, or `—` when unavailable. */\nexport function fmtPercent(n: number | null | undefined): string {\n return n === null || n === undefined ? '—' : `${n.toFixed(1)}%`;\n}\n\n/**\n * Human relative time from an ISO-8601 timestamp, e.g. \"10 minutes ago\",\n * \"just now\", \"3 days ago\". Returns null for missing/unparseable input so the\n * caller can omit the clause entirely.\n */\nexport function fmtAgo(iso: string | null | undefined): string | null {\n if (!iso) return null;\n const then = Date.parse(iso);\n if (Number.isNaN(then)) return null;\n const secs = Math.round((Date.now() - then) / 1000);\n if (secs < 0) return 'just now';\n if (secs < 45) return 'just now';\n const units: Array<[string, number]> = [\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n ];\n for (const [name, size] of units) {\n if (secs >= size) {\n const n = Math.round(secs / size);\n return `${String(n)} ${name}${n === 1 ? '' : 's'} ago`;\n }\n }\n return 'just now';\n}\n","import { log } from '@clack/prompts';\nimport { inspectBox, type BoxRecord, type InspectedBox } from '@agentbox/sandbox-docker';\nimport { projectCheckpointVolumeBytes } from '@agentbox/sandbox-docker';\nimport { renderEndpointLines } from '../endpoints-render.js';\nimport { fmtBytes } from '../fmt.js';\nimport { watchRender } from '../watch.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport interface InspectRunOptions {\n json?: boolean;\n watch?: boolean;\n interval?: string;\n}\n\nfunction fmtLimit(n: number | null | undefined, unit: string): string {\n return n && n > 0 ? `${String(n)}${unit}` : 'unlimited';\n}\n\nasync function renderText(i: InspectedBox): Promise<string> {\n const lim = i.record.resourceLimits;\n const projectRoot = i.record.projectRoot ?? i.record.workspacePath;\n const ckptBytes = await projectCheckpointVolumeBytes(projectRoot);\n const upperHost = i.hostPaths.upperLiveOnHost\n ? `${i.hostPaths.upperLiveOnHost} (live)`\n : `${i.hostPaths.upperExport} (run \\`agentbox open --upper\\` to refresh)`;\n const lines: string[] = [\n `id ${i.record.id}`,\n `name ${i.record.name}`,\n `container ${i.record.container}`,\n `image ${i.record.image}`,\n `state ${i.state}`,\n `overlay ${i.overlayMounted ? 'mounted at /workspace' : 'not mounted'}`,\n `workspace ${i.record.workspacePath}`,\n `project ${i.record.projectRoot ?? '(unset — pre-feature box)'}`,\n `n ${typeof i.record.projectIndex === 'number' ? String(i.record.projectIndex) : '(none)'}`,\n `lower ${i.record.lowerPath}`,\n `upper volume ${i.upperVolume.name}${i.upperVolume.mountpoint ? ` (${i.upperVolume.mountpoint})` : ''}`,\n `claude config ${i.record.claudeConfigVolume ?? '(none)'}`,\n `claude session ${renderClaudeSession(i)}`,\n `claude activity ${renderClaudeActivity(i)}`,\n `persisted ${renderPersisted(i)}`,\n `playwright ${i.record.withPlaywright ? 'yes' : 'no'}`,\n `env files ${i.record.withEnv ? 'yes' : 'no'}`,\n 'endpoints',\n ...renderEndpoints(i),\n `mem limit ${lim?.memoryBytes ? fmtBytes(lim.memoryBytes) : 'unlimited'}`,\n `cpu limit ${fmtLimit(lim?.cpus, '')}`,\n `pids limit ${fmtLimit(lim?.pidsLimit, '')}`,\n `disk limit ${lim?.disk ? `${lim.disk} (best-effort; no-op on overlay2/macOS)` : 'unlimited'}`,\n `snapshot dir ${i.record.snapshotDir ?? '(none — live workspace mount)'}`,\n `snapshot size ${fmtBytes(i.snapshotSizeBytes)}`,\n `checkpoint vol ${ckptBytes === null ? '(none)' : fmtBytes(ckptBytes)}`,\n `host export ${i.hostPaths.mergedExport} (run \\`agentbox open\\` to refresh)`,\n `upper host ${upperHost}`,\n `created ${i.record.createdAt}`,\n ];\n return lines.join('\\n');\n}\n\nfunction renderClaudeSession(i: InspectedBox): string {\n if (i.claudeSession === null) return '(n/a — box not running)';\n if (!i.claudeSession.running) return `not running (\"${i.claudeSession.sessionName}\")`;\n const since = i.claudeSession.startedAt ? ` since ${i.claudeSession.startedAt}` : '';\n return `running (\"${i.claudeSession.sessionName}\")${since}`;\n}\n\nfunction renderClaudeActivity(i: InspectedBox): string {\n const c = i.persistedStatus?.claude;\n if (!c) return '(none)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\n}\n\nfunction renderPersisted(i: InspectedBox): string {\n const s = i.persistedStatus;\n if (!s) return '(none)';\n return (\n `${s.timestamp} ` +\n `(${String(s.services.length)} svc, ${String(s.tasks.length)} tasks, ${String(s.ports.length)} ports)`\n );\n}\n\nfunction renderEndpoints(i: InspectedBox): string[] {\n const lines = renderEndpointLines(i.endpoints, process.stdout);\n return lines.length > 0 ? lines : [' (none)'];\n}\n\n// `agentbox inspect` was folded into `agentbox status --inspect`; this is the\n// extracted body, called by status.ts with an already-resolved box.\nexport async function runInspect(box: BoxRecord, opts: InspectRunOptions): Promise<void> {\n try {\n if (opts.json && opts.watch) {\n log.error('cannot combine --json with --watch');\n process.exit(2);\n }\n if (opts.watch) {\n await watchRender(async () => renderText(await inspectBox(box.id)), opts.interval);\n return;\n }\n const result = await inspectBox(box.id);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n } else {\n process.stdout.write((await renderText(result)) + '\\n');\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n}\n","import { stopBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const stopCommand = new Command('stop')\n .description('Stop a box (docker stop; preserves upper + node_modules volumes)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const record = await stopBox(box.id);\n process.stdout.write(\n `stopped ${record.container}\\nrestart with: agentbox start ${record.name}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { Command } from 'commander';\nimport { findProjectRoot } from '@agentbox/config';\nimport {\n agentboxHomeBytes,\n allCheckpointVolumesBytes,\n boxResourceStats,\n listBoxes,\n type ListedBox,\n} from '@agentbox/sandbox-docker';\nimport type { BoxResourceStats } from '@agentbox/core';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { fmtBytes, fmtPercent } from '../fmt.js';\nimport { watchRender } from '../watch.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface TopOptions {\n project?: boolean;\n once?: boolean;\n json?: boolean;\n interval?: string;\n}\n\nconst COLS = ['BOX', 'STATE', 'CPU%', 'MEM USAGE / LIMIT', 'MEM%', 'PIDS', 'DISK', 'NET I/O'];\n\nfunction row(name: string, state: string, s: BoxResourceStats): string[] {\n const mem = `${fmtBytes(s.memUsedBytes)} / ${fmtBytes(s.memLimitBytes)}`;\n const net =\n s.netRxBytes === null && s.netTxBytes === null\n ? '—'\n : `${fmtBytes(s.netRxBytes)} / ${fmtBytes(s.netTxBytes)}`;\n return [\n name,\n state,\n fmtPercent(s.cpuPercent),\n s.live ? mem : '—',\n fmtPercent(s.memPercent),\n s.pids === null ? '—' : String(s.pids),\n fmtBytes(s.diskUsedBytes),\n s.live ? net : '—',\n ];\n}\n\nfunction renderTable(rows: string[][]): string {\n const all = [COLS, ...rows];\n const widths = COLS.map((_, c) => Math.max(...all.map((r) => r[c]!.length)));\n return all\n .map((r) => r.map((cell, c) => cell.padEnd(widths[c]!)).join(' ').trimEnd())\n .join('\\n');\n}\n\nasync function selectBoxes(\n idOrName: string | undefined,\n opts: TopOptions,\n): Promise<ListedBox[]> {\n const boxes = await listBoxes();\n if (idOrName === undefined) {\n // Default: every box on the host. --project narrows to the cwd's project.\n // An empty result is not an error here: watch mode stays up and picks up\n // boxes as they're created. Callers render a placeholder.\n if (!opts.project) return boxes;\n const project = await findProjectRoot(process.cwd());\n return boxes.filter((b) => b.projectRoot === project.root);\n }\n const picked = await resolveBoxOrExit(idOrName);\n return boxes.filter((b) => b.id === picked.id);\n}\n\nasync function snapshot(\n idOrName: string | undefined,\n opts: TopOptions,\n): Promise<{ boxes: ListedBox[]; stats: BoxResourceStats[] }> {\n const boxes = await selectBoxes(idOrName, opts);\n const stats = await Promise.all(boxes.map((b) => boxResourceStats(b)));\n return { boxes, stats };\n}\n\nasync function renderProjectFooters(): Promise<string> {\n // Two independent disk numbers, no overlap: checkpoint volumes are Docker\n // named volumes (not under ~/.agentbox); everything else agentbox keeps on\n // the host — box run dirs, exports, worktrees, host clones — lives inside\n // ~/.agentbox and is summed there.\n const parts: string[] = [];\n const [ckpt, home] = await Promise.all([\n allCheckpointVolumesBytes(),\n agentboxHomeBytes(),\n ]);\n if (home !== null) parts.push(`~/.agentbox: ${fmtBytes(home)}`);\n if (ckpt !== null) parts.push(`checkpoints: ${fmtBytes(ckpt)}`);\n return parts.length > 0 ? `\\n\\nSYSTEM: ${parts.join(' - ')}` : '';\n}\n\nexport const topCommand = new Command('top')\n .description('Live resource monitor (cpu/mem/pids/disk) for a box, the project, or every box')\n .argument(\n '[box]',\n \"box ref (default: every box on the host; --project narrows to the cwd's project)\",\n )\n .option('-p, --project', \"show only boxes in the cwd's project\")\n .option('--once', 'print a single snapshot instead of watching')\n .option('-j, --json', 'machine-readable JSON (implies --once)')\n .option('--interval <seconds>', 'refresh interval', '2')\n .action(async (idOrName: string | undefined, opts: TopOptions) => {\n try {\n if (opts.json) {\n const { boxes, stats } = await snapshot(idOrName, opts);\n process.stdout.write(\n JSON.stringify(\n boxes.map((b, i) => ({ box: b.name, state: b.state, ...stats[i]! })),\n null,\n 2,\n ) + '\\n',\n );\n return;\n }\n\n const produce = async (watching: boolean): Promise<string> => {\n const { boxes, stats } = await snapshot(idOrName, opts);\n const scope = opts.project ? 'no boxes for this project' : 'no boxes';\n const header =\n boxes.length === 0\n ? watching\n ? `${scope} (waiting...)`\n : scope\n : renderTable(boxes.map((b, i) => row(b.name, b.state, stats[i]!)));\n return header + (await renderProjectFooters());\n };\n\n if (opts.once) {\n process.stdout.write((await produce(false)) + '\\n');\n return;\n }\n await watchRender(() => produce(true), opts.interval);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { unpauseBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const unpauseCommand = new Command('unpause')\n .description('Resume a paused box (docker unpause — sub-second)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const record = await unpauseBox(box.id);\n process.stdout.write(`unpaused ${record.container}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { spawn } from 'node:child_process';\nimport { confirm, intro, isCancel, log, outro, spinner } from '@clack/prompts';\nimport {\n DEFAULT_BOX_IMAGE,\n ensureRelay,\n removeImage,\n stopRelay,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { detectExecutionMethod, type ExecMethod } from '../exec-method.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface UpdateOptions {\n yes?: boolean;\n dryRun?: boolean;\n skipSelf?: boolean;\n}\n\n/** The published npm package name (apps/cli/package.json `name`). */\nconst PKG = '@madarco/agentbox';\n\nfunction selfUpdateCommand(method: ExecMethod): { cmd: string; args: string[] } | null {\n if (method === 'npm') return { cmd: 'npm', args: ['install', '-g', `${PKG}@latest`] };\n if (method === 'pnpm') return { cmd: 'pnpm', args: ['add', '-g', `${PKG}@latest`] };\n return null;\n}\n\nfunction describeSelfUpdate(method: ExecMethod): string {\n switch (method) {\n case 'npm':\n return 'self-update: npm install -g @madarco/agentbox@latest';\n case 'pnpm':\n return 'self-update: pnpm add -g @madarco/agentbox@latest';\n case 'npx':\n return 'self-update: skipped (running via npx — always the latest version)';\n case 'direct':\n return 'self-update: skipped (running from source — no global install to update)';\n }\n}\n\nfunction runInherit(cmd: string, args: string[]): Promise<number> {\n return new Promise<number>((resolveP, rejectP) => {\n const child = spawn(cmd, args, { stdio: 'inherit' });\n child.on('error', rejectP);\n child.on('close', (code) => resolveP(code ?? 0));\n });\n}\n\nexport const updateCommand = new Command('self-update')\n .description(\n 'Update agentbox: self-update via npm/pnpm (unless run via npx), wipe the box image so it rebuilds, and reload the relay',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"show what would happen, don't change anything\")\n .option('--skip-self', 'skip the package self-update; only refresh the image + relay')\n .action(async (opts: UpdateOptions) => {\n try {\n const method = detectExecutionMethod({\n userAgent: process.env.npm_config_user_agent,\n argv1: process.argv[1],\n });\n\n intro('agentbox self-update');\n\n const selfStep = opts.skipSelf\n ? 'self-update: skipped (--skip-self)'\n : describeSelfUpdate(method);\n log.info(\n [\n 'plan:',\n ` ${selfStep}`,\n ` image: docker image rm -f ${DEFAULT_BOX_IMAGE} (rebuilds on next create/claude)`,\n ' relay: stop, then respawn unless a self-update ran',\n ].join('\\n'),\n );\n\n if (opts.dryRun) {\n outro('dry run — nothing changed');\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({ message: 'Proceed with update?', initialValue: true });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n // Step 1: self-update. selfUpdated stays false unless an npm/pnpm global\n // install actually ran — that's what makes the running process stale and\n // forces the lazy image/relay path below.\n let selfUpdated = false;\n if (opts.skipSelf) {\n log.info('skipping self-update (--skip-self)');\n } else {\n const cmd = selfUpdateCommand(method);\n if (cmd === null) {\n log.info(describeSelfUpdate(method));\n } else {\n log.info(`running: ${cmd.cmd} ${cmd.args.join(' ')}`);\n const code = await runInherit(cmd.cmd, cmd.args);\n if (code !== 0) {\n throw new Error(`${cmd.cmd} exited with code ${String(code)}`);\n }\n selfUpdated = true;\n log.success(`updated ${PKG} via ${cmd.cmd}`);\n }\n }\n\n // Step 2: wipe the box image. Best-effort; the next create/claude\n // rebuilds it from the (now updated) Dockerfile via ensureImage().\n const s = spinner();\n s.start(`removing image ${DEFAULT_BOX_IMAGE}`);\n const removed = await removeImage(DEFAULT_BOX_IMAGE);\n s.stop(\n removed\n ? `removed image ${DEFAULT_BOX_IMAGE} (rebuilds on next create/claude)`\n : `image ${DEFAULT_BOX_IMAGE} not present (nothing to remove)`,\n );\n\n // Step 3: reload the relay. Always stop it. Only respawn here when no\n // self-update ran — after a self-update this process is the old build,\n // so respawning would relaunch the stale relay bin. In that case the\n // next `agentbox create`/`claude` (a fresh process) brings it back up.\n const sr = spinner();\n sr.start('stopping relay');\n const stop = await stopRelay();\n sr.stop(\n stop.stopped\n ? `stopped relay (pid ${String(stop.pid)})`\n : 'relay was not running',\n );\n\n if (selfUpdated) {\n log.info(\n 'relay will restart automatically (with the updated build) on your next `agentbox create` / `agentbox claude`',\n );\n } else {\n const sr2 = spinner();\n sr2.start('restarting relay');\n try {\n const ep = await ensureRelay();\n sr2.stop(`relay back up on ${ep.hostUrl}`);\n } catch (err) {\n sr2.stop('relay restart failed');\n log.warn(\n `${err instanceof Error ? err.message : String(err)} — it will retry on the next box command`,\n );\n }\n }\n\n outro('update complete');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","export type ExecMethod = 'npx' | 'pnpm' | 'npm' | 'direct';\n\nexport interface ExecMethodInput {\n /** `process.env.npm_config_user_agent` (or undefined). */\n userAgent?: string | undefined;\n /** `process.argv[1]` — the resolved bin path. */\n argv1?: string | undefined;\n}\n\n/**\n * Classify how this CLI was launched. The signals npm/pnpm/npx leave behind:\n *\n * - npx writes the bin into a `_npx` cache dir and tags the user-agent with\n * `npm/<v> ... npx/<v>` — so the argv path or the user-agent gives it away.\n * - pnpm sets `npm_config_user_agent` starting with `pnpm/`.\n * - npm (global install invoked directly) sets it starting with `npm/`.\n * - anything else (a dev clone run as `node dist/index.js`, a hand-made\n * symlink) leaves no package-manager user-agent → `direct`.\n *\n * npx is checked first because its user-agent also contains `npm/`.\n */\nexport function detectExecutionMethod(input: ExecMethodInput): ExecMethod {\n const ua = input.userAgent ?? '';\n const argv1 = input.argv1 ?? '';\n\n if (argv1.includes('/_npx/') || argv1.includes('/.npm/_npx') || /\\bnpx\\//.test(ua)) {\n return 'npx';\n }\n if (/\\bpnpm\\//.test(ua)) {\n return 'pnpm';\n }\n if (/\\bnpm\\//.test(ua)) {\n return 'npm';\n }\n return 'direct';\n}\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport type { WaitReadyReply } from '@agentbox/ctl';\nimport { execInBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface WaitOptions {\n timeout: string;\n units?: string[];\n json?: boolean;\n}\n\nexport const waitCommand = new Command('wait')\n .description('Block until the box reports all autostart units ready')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--timeout <ms>', 'overall timeout in milliseconds', '120000')\n .option('--units <names...>', 'restrict to the named units')\n .option('-j, --json', 'machine-readable JSON output')\n .action(async (idOrName: string | undefined, opts: WaitOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const ctlArgs = ['agentbox-ctl', 'wait-ready', '--json', '--timeout', opts.timeout];\n if (opts.units && opts.units.length > 0) {\n ctlArgs.push('--units', ...opts.units);\n }\n const proc = await execInBox(box.container, ctlArgs, { user: 'vscode' });\n // wait-ready exits 0 on ready, 1 on not-ready; both write JSON.\n let parsed: WaitReadyReply;\n try {\n parsed = JSON.parse(proc.stdout) as WaitReadyReply;\n } catch {\n log.error(`agentbox-ctl wait-ready failed: ${proc.stderr || proc.stdout}`);\n process.exit(1);\n }\n if (opts.json) {\n process.stdout.write(JSON.stringify(parsed, null, 2) + '\\n');\n } else if (parsed.ready) {\n process.stdout.write('ready\\n');\n } else {\n const lines: string[] = ['not ready'];\n if (parsed.timedOut.length > 0) lines.push(` timed out: ${parsed.timedOut.join(', ')}`);\n if (parsed.failed.length > 0) lines.push(` failed: ${parsed.failed.join(', ')}`);\n process.stdout.write(lines.join('\\n') + '\\n');\n }\n process.exit(parsed.ready ? 0 : 1);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n"],"mappings":"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","names":["Command","program","log","log","log","log","confirm","isCancel","log","Command","spawnSync","spawnSync","log","mkdir","join","proj","log","log","confirm","isCancel","Command","confirm","isCancel","log","Command","Command","log","r","confirm","isCancel","log","Command","Command","log","spawnSync","Command","InvalidArgumentError","spawnSync","intro","log","outro","spinner","Command","spawnSync","spawnSync","Command","intro","spinner","log","outro","spawn","log","Command","spawn","cursorTo","Command","log","spawn","findBox","confirm","isCancel","log","Command","Command","log","confirm","isCancel","log","Command","ESC","term","row","scoped","listCommand","Command","log","log","Command","spawn","Command","log","spawn","log","Command","Command","log","Command","Command","confirm","isCancel","log","Command","Command","log","confirm","isCancel","confirm","isCancel","log","Command","confirm","isCancel","log","Command","Command","log","confirm","isCancel","confirm","isCancel","log","Command","Command","log","confirm","isCancel","confirm","isCancel","log","Command","tagChange","Command","log","confirm","isCancel","Command","log","confirm","isCancel","spawnSync","log","Command","Command","log","spawnSync","spawnSync","log","Command","Command","log","term","spawnSync","Command","Command","log","Command","log","log","Command","log","renderPersisted","Command","Command","Command","renderTable","Command","Command","Command","spawn","confirm","intro","isCancel","log","outro","spinner","Command","spawn","Command","intro","log","outro","confirm","isCancel","spinner","log","Command","Command","log","Command","listCommand"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../packages/sandbox-docker/src/browser.ts","../../../packages/sandbox-docker/src/index.ts","../src/engine-override.ts","../src/help.ts","../src/commands/browser.ts","../src/box-ref.ts","../src/commands/_errors.ts","../src/commands/claude.ts","../src/auth.ts","../../../packages/core/src/agent.ts","../src/spinner-line.ts","../src/limits.ts","../src/wizard.ts","../src/commands/checkpoint.ts","../src/commands/code.ts","../src/commands/config.ts","../src/commands/create.ts","../src/commands/dashboard.ts","../src/dashboard/layout.ts","../src/dashboard/renderer.ts","../src/dashboard/input.ts","../src/dashboard/pty-session.ts","../src/dashboard/sidebar.ts","../src/dashboard/compositor.ts","../src/commands/destroy.ts","../src/commands/list.ts","../src/hyperlink.ts","../src/watch.ts","../src/commands/logs.ts","../src/commands/open.ts","../src/commands/path.ts","../src/commands/pause.ts","../src/commands/prune.ts","../src/commands/pull.ts","../src/commands/pull-claude.ts","../src/commands/pull-config.ts","../src/commands/pull-env.ts","../src/commands/screen.ts","../src/commands/shell.ts","../src/commands/start.ts","../src/commands/status.ts","../src/endpoints-render.ts","../src/fmt.ts","../src/commands/inspect.ts","../src/commands/stop.ts","../src/commands/top.ts","../src/commands/unpause.ts","../src/commands/update.ts","../src/exec-method.ts","../src/commands/wait.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { applyEngineOverrideAtStartup } from './engine-override.js';\nimport { buildGroupedHelp } from './help.js';\nimport { browserCommand } from './commands/browser.js';\nimport { claudeCommand } from './commands/claude.js';\nimport { checkpointCommand } from './commands/checkpoint.js';\nimport { codeCommand } from './commands/code.js';\nimport { configCommand } from './commands/config.js';\nimport { createCommand } from './commands/create.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { destroyCommand } from './commands/destroy.js';\nimport { listCommand } from './commands/list.js';\nimport { logsCommand } from './commands/logs.js';\nimport { openCommand } from './commands/open.js';\nimport { pauseCommand } from './commands/pause.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { pullCommand } from './commands/pull.js';\nimport { screenCommand } from './commands/screen.js';\nimport { shellCommand } from './commands/shell.js';\nimport { startCommand } from './commands/start.js';\nimport { statusCommand } from './commands/status.js';\nimport { stopCommand } from './commands/stop.js';\nimport { topCommand } from './commands/top.js';\nimport { unpauseCommand } from './commands/unpause.js';\nimport { updateCommand } from './commands/update.js';\nimport { waitCommand } from './commands/wait.js';\n\nconst program = new Command();\n\nprogram.name('agentbox').description('Launch coding agents in isolated sandboxes').version('0.0.0');\n\n// Required so `agentbox pull env --dry-run` binds --dry-run to the `env`\n// subcommand rather than the parent `pull` (both define it). Positional\n// options must be enabled on every ancestor in the chain.\nprogram.enablePositionalOptions();\n\nprogram.addCommand(createCommand);\nprogram.addCommand(claudeCommand);\nprogram.addCommand(codeCommand);\nprogram.addCommand(shellCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(openCommand);\nprogram.addCommand(browserCommand);\nprogram.addCommand(screenCommand);\nprogram.addCommand(pullCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(topCommand);\nprogram.addCommand(dashboardCommand);\nprogram.addCommand(waitCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(pauseCommand);\nprogram.addCommand(unpauseCommand);\nprogram.addCommand(stopCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(destroyCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(checkpointCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(updateCommand);\n\nprogram.configureHelp({ visibleCommands: () => [] });\nprogram.addHelpText('after', () => '\\n' + buildGroupedHelp(program));\n\nawait applyEngineOverrideAtStartup();\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\n","import { execInBox } from './docker.js';\n\nexport interface BoxBrowserResult {\n up: boolean;\n /** True when a session was already active, so we left the agent's browser untouched. */\n alreadyRunning?: boolean;\n reason?: string;\n}\n\n/**\n * Decide whether `agent-browser session list` reports a live session. Pure so\n * it can be unit-tested without docker. `agent-browser` exits 0 and prints\n * \"No active sessions\" when nothing is running; any other exit-0 output lists\n * one or more sessions (a persistent Chromium is up).\n */\nexport function browserSessionActive(stdout: string, exitCode: number): boolean {\n return exitCode === 0 && !/no active sessions/i.test(stdout);\n}\n\n/**\n * Ensure the box's in-box browser (agent-browser's persistent default-session\n * Chromium) is running, so the VNC view shows a browser instead of a blank X\n * screen. Idempotent: if a session is already active we do nothing — the agent\n * may be mid-task and we must not navigate its page away. Otherwise we open a\n * neutral page **headed** (agent-browser defaults to headless — a headless\n * Chromium renders nothing on the VNC display, defeating the whole point), so\n * the agent's subsequent `agent-browser open <url>` reuses the same visible\n * window (it just navigates it).\n *\n * Best-effort, mirroring {@link import('./vnc.js').launchVncDaemon} — the\n * caller warns on failure but never aborts (the noVNC client still connects).\n * `DISPLAY=:1` + `AGENT_BROWSER_EXECUTABLE_PATH` are image-baked env so the\n * exec inherits them; runs as `vscode` like the other in-box launches.\n */\nexport async function ensureBoxBrowser(\n container: string,\n timeoutMs = 8000,\n): Promise<BoxBrowserResult> {\n const list = await execInBox(container, ['agent-browser', 'session', 'list'], {\n user: 'vscode',\n timeoutMs,\n });\n if (browserSessionActive(list.stdout, list.exitCode)) {\n return { up: true, alreadyRunning: true };\n }\n\n const open = await execInBox(container, ['agent-browser', 'open', '--headed', 'about:blank'], {\n user: 'vscode',\n timeoutMs,\n });\n if (open.exitCode === 0) return { up: true };\n return {\n up: false,\n reason: `agent-browser open failed: ${open.stderr || open.stdout || `exit ${String(open.exitCode)}`}`,\n };\n}\n","import type { SandboxProvider } from '@agentbox/core';\n\nexport {\n attachClaudeSession,\n formatDetachNotice,\n buildClaudeAttachArgv,\n buildClaudeDashboardAttachArgv,\n buildClaudeMounts,\n buildClaudeStatusBarArgs,\n buildShellArgv,\n ClaudeSessionError,\n claudeSessionInfo,\n CONTAINER_USER,\n DEFAULT_CLAUDE_SESSION,\n ensureClaudeVolume,\n pullClaudeExtras,\n rebuildPluginNativeDeps,\n resolveClaudeVolume,\n scanPluginCacheForRebuild,\n SHARED_CLAUDE_VOLUME,\n startClaudeSession,\n type ClaudeConfigSpec,\n type ClaudeMountResult,\n type ClaudeSessionInfo,\n type EnsureClaudeVolumeOptions,\n type EnsureClaudeVolumeResult,\n type PullClaudeOptions,\n type PullClaudeResult,\n type RebuildPluginNativeDepsResult,\n type StartClaudeSessionOptions,\n} from './claude.js';\nexport { createBox, type CreateBoxOptions, type CreatedBox } from './create.js';\nexport {\n agentboxHomeBytes,\n allCheckpointVolumesBytes,\n boxResourceStats,\n parseDockerSize,\n projectCheckpointVolumeBytes,\n volumeSizeBytes,\n} from './stats.js';\nexport { getBoxEndpoints, type BoxEndpoint, type BoxEndpoints } from './endpoints.js';\nexport { execInBox, removeImage, type DockerExecResult } from './docker.js';\nexport {\n createBoxWorktree,\n detectGitRepos,\n GitWorktreeError,\n pickFreshBranch,\n removeBoxWorktree,\n type CreateBoxWorktreeArgs,\n type CreateBoxWorktreeResult,\n type DetectedGitRepo,\n type RemoveBoxWorktreeArgs,\n} from './git-worktree.js';\nexport { DEFAULT_BOX_IMAGE } from './image.js';\nexport {\n DEFAULT_RELAY_PORT,\n ensureRelay,\n forgetBoxFromRelay,\n generateRelayToken,\n registerBoxWithRelay,\n rehydrateRelayRegistry,\n RELAY_CONTAINER_NAME,\n RELAY_IMAGE_REF,\n RELAY_NETWORK_NAME,\n stopRelay,\n type EnsureRelayOptions,\n type RegisterBoxArgs,\n type RelayEndpoint,\n type StopRelayResult,\n} from './relay.js';\nexport { EXCLUDE_DIRS, SNAPSHOTS_ROOT, snapshotPathFor } from './snapshot.js';\nexport {\n CHECKPOINTS_ROOT,\n CHECKPOINT_MOUNT,\n CHECKPOINT_VOLUME_PREFIX,\n CheckpointError,\n checkpointVolumeName,\n computeNextCheckpointName,\n createCheckpoint,\n listCheckpoints,\n projectCheckpointsDir,\n removeCheckpoint,\n resolveCheckpoint,\n resolveCheckpointLower,\n type CheckpointInfo,\n type CheckpointLowerSpec,\n type CheckpointManifest,\n type CheckpointType,\n type CreateCheckpointOptions,\n} from './checkpoint.js';\nexport {\n STATE_DIR,\n STATE_FILE,\n allocateProjectIndex,\n autoPickProjectBox,\n findBox,\n readState,\n recordBox,\n removeBoxRecord,\n resolveBoxRef,\n type BoxRecord,\n type FindBoxResult,\n type GitWorktreeRecord,\n type StateFile,\n} from './state.js';\nexport {\n OverlayError,\n type MountOverlayOptions,\n type MountOverlayResult,\n type NestedWorktreeBind,\n type OverlayCheck,\n} from './overlay.js';\nexport {\n attachedContainerUri,\n buildFlavorMounts,\n buildIdeMounts,\n buildVscodeMounts,\n containerHex,\n cursorServerVolumeName,\n ensureAgentboxTasksFile,\n ensureIdeVolumes,\n ensureVscodeVolumes,\n ideProfile,\n IDE_FLAVORS,\n ideServerVolumeName,\n repairIdeOwnership,\n repairVscodeServerOwnership,\n SHARED_CURSOR_EXTENSIONS_VOLUME,\n SHARED_VSCODE_EXTENSIONS_VOLUME,\n vscodeServerVolumeName,\n type EnsureTasksFileResult,\n type IdeFlavor,\n type IdeMounts,\n type ServiceTailHint,\n type VscodeMounts,\n} from './vscode.js';\nexport {\n BOXES_ROOT,\n boxRunDirFor,\n boxStatusPathFor,\n readBoxStatus,\n buildHostEnvFindArgs,\n CONTAINER_EXPORT_MERGED,\n CONTAINER_EXPORT_UPPER,\n copyHostEnvFilesToBox,\n DEFAULT_ENV_PATTERNS,\n detectEngine,\n ExportError,\n getHostPaths,\n openInFinder,\n pullToHost,\n refreshExport,\n resolveUpperLiveOnHost,\n setEngineOverride,\n type DockerEngine,\n type ExportLayer,\n type HostPaths,\n type CopyHostEnvOptions,\n type OpenOptions,\n type OpenResult,\n type PullOptions,\n type PullResult,\n type RefreshOptions,\n type RefreshResult,\n} from './host-export.js';\nexport {\n AmbiguousBoxError,\n BoxNotFoundError,\n destroyBox,\n getBoxHostPaths,\n inspectBox,\n listBoxes,\n openBoxInFinder,\n pauseBox,\n pruneBoxes,\n snapshotPresent,\n startBox,\n stopBox,\n unpauseBox,\n type DestroyOptions,\n type DestroyResult,\n type InspectedBox,\n type ListedBox,\n type OpenedBox,\n type PruneOptions,\n type PruneResult,\n type StartedBox,\n} from './lifecycle.js';\nexport {\n buildVncUrls,\n generateVncPassword,\n launchVncDaemon,\n VNC_CONTAINER_PORT,\n type VncLaunchResult,\n type VncUrls,\n} from './vnc.js';\nexport { browserSessionActive, ensureBoxBrowser, type BoxBrowserResult } from './browser.js';\nexport {\n dockerVolumeName,\n launchDockerdDaemon,\n SHARED_DOCKER_CACHE_VOLUME,\n type DockerdLaunchResult,\n} from './dockerd.js';\n\nconst notYet = (op: string): never => {\n throw new Error(`@agentbox/sandbox-docker: ${op} is not yet implemented`);\n};\n\nexport const dockerProvider: SandboxProvider = {\n name: 'docker',\n async start(opts) {\n const { createBox } = await import('./create.js');\n const { record } = await createBox({\n workspacePath: opts.workspacePath,\n useSnapshot: false,\n });\n return {\n id: record.id,\n state: 'running',\n agent: opts.agent,\n workspacePath: record.workspacePath,\n createdAt: new Date(record.createdAt),\n };\n },\n async pause(id) {\n const { pauseBox } = await import('./lifecycle.js');\n await pauseBox(id);\n },\n async resume(id) {\n const { unpauseBox } = await import('./lifecycle.js');\n await unpauseBox(id);\n },\n async stop(id) {\n const { stopBox } = await import('./lifecycle.js');\n await stopBox(id);\n },\n async destroy(id) {\n const { destroyBox } = await import('./lifecycle.js');\n await destroyBox(id);\n },\n async list() {\n const { listBoxes } = await import('./lifecycle.js');\n const boxes = await listBoxes();\n return boxes.map((b) => ({\n id: b.id,\n state: b.state,\n agent: 'claude-code' as const,\n workspacePath: b.workspacePath,\n createdAt: new Date(b.createdAt),\n }));\n },\n async stats(id) {\n const { readState, findBox } = await import('./state.js');\n const { boxResourceStats } = await import('./stats.js');\n const found = findBox(id, await readState());\n if (found.kind !== 'ok') {\n throw new Error(`box not found: ${id}`);\n }\n return boxResourceStats(found.box);\n },\n};\n\n// notYet is no longer reachable from the public API. Keep it for now in case\n// future provider methods need it before they're implemented.\nvoid notYet;\n","import { loadEffectiveConfig } from '@agentbox/config';\nimport { setEngineOverride } from '@agentbox/sandbox-docker';\n\n/**\n * Pin the docker engine if the user has set `engine.kind` in any layer (other\n * than `auto`, which means \"let `docker info` decide\"). Called once from the\n * CLI entrypoint before commander parses argv. Errors are swallowed — if the\n * user's config is broken, the matching `agentbox config` subcommand will\n * surface a clean error when they next touch it.\n */\nexport async function applyEngineOverrideAtStartup(): Promise<void> {\n try {\n const loaded = await loadEffectiveConfig(process.cwd());\n const kind = loaded.effective.engine.kind;\n if (kind === 'auto') return;\n setEngineOverride(kind);\n } catch {\n /* best-effort: lint, --help, and other no-op invocations should never crash */\n }\n}\n","import type { Command } from 'commander';\n\n// Ordered command groups for the top-level `agentbox --help`. commander@12.1.0\n// has no native .helpGroup(); we suppress the flat Commands: list via\n// configureHelp({ visibleCommands: () => [] }) and render this instead.\n// Names must match the registered Command names in index.ts — the drift test\n// in test/commands.test.ts asserts this map covers every top-level command.\nexport interface HelpGroup {\n title: string;\n hint?: string;\n commands: string[];\n}\n\nexport const HELP_GROUPS: HelpGroup[] = [\n { title: 'Create & run', commands: ['create', 'claude'] },\n {\n title: 'Access',\n commands: ['dashboard', 'browser', 'screen', 'code', 'shell', 'open', 'logs'],\n },\n { title: 'Inspect', commands: ['list', 'status', 'top'] },\n { title: 'Lifecycle', commands: ['start', 'stop', 'destroy', 'pause', 'unpause'] },\n { title: 'Sync & state', commands: ['pull', 'checkpoint'] },\n {\n title: 'Advanced',\n commands: ['wait', 'prune', 'self-update', 'config'],\n },\n];\n\nfunction term(cmd: Command): string {\n const aliases = cmd.aliases();\n return aliases.length ? `${cmd.name()}|${aliases.join('|')}` : cmd.name();\n}\n\n// Builds the grouped Commands: block. Descriptions/aliases come straight from\n// the registered Command objects so help text never drifts from the source.\n// Any registered command missing from HELP_GROUPS lands in a trailing\n// \"Other\" group (fail-soft — the drift test fails if this is non-empty).\nexport function buildGroupedHelp(program: Command): string {\n const byName = new Map(program.commands.map((c) => [c.name(), c] as const));\n const grouped = new Set(HELP_GROUPS.flatMap((g) => g.commands));\n const orphans = program.commands.map((c) => c.name()).filter((n) => !grouped.has(n));\n\n const groups: HelpGroup[] = [...HELP_GROUPS];\n if (orphans.length) groups.push({ title: 'Other', commands: orphans });\n\n const terms: string[] = [];\n for (const g of groups) {\n for (const name of g.commands) {\n const cmd = byName.get(name);\n if (cmd) terms.push(term(cmd));\n }\n }\n const pad = Math.max(0, ...terms.map((t) => t.length)) + 2;\n\n const lines: string[] = ['Commands:'];\n for (const g of groups) {\n const title = g.hint ? `${g.title} (${g.hint})` : g.title;\n lines.push('', ` ${title}`);\n for (const name of g.commands) {\n const cmd = byName.get(name);\n if (!cmd) continue;\n lines.push(` ${term(cmd).padEnd(pad)}${cmd.description()}`);\n }\n }\n lines.push('', 'Run `agentbox <command> --help` for command-specific options.');\n return lines.join('\\n');\n}\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n detectEngine,\n getBoxHostPaths,\n inspectBox,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface BrowserOptions {\n print?: boolean;\n loopback?: boolean;\n}\n\nexport const browserCommand = new Command('browser')\n .description(\n \"Open a box's web app URL in the browser, even when no service declares `expose:` (auto-unpause/start)\",\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--print', 'print the URL to stdout instead of launching the browser')\n .option('--loopback', 'use the 127.0.0.1 URL instead of the OrbStack .orb.local URL')\n .action(async (idOrName: string | undefined, opts: BrowserOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // Re-read after a possible start: startBox re-resolves & persists the\n // reallocated webHostPort (lifecycle.ts).\n const { record } = await getBoxHostPaths(box.id);\n if (record.webContainerPort === undefined) {\n throw new Error(\n `box ${box.name} predates the reserved web port; recreate it to use \\`agentbox browser\\``,\n );\n }\n\n const engine = await detectEngine();\n let url: string;\n if (engine === 'orbstack' && !opts.loopback) {\n // OrbStack auto-routes <container>.orb.local to the container; :80 is\n // declared (EXPOSE 80) so no port suffix is needed.\n url = `http://${record.container}.orb.local`;\n } else {\n if (record.webHostPort === undefined) {\n throw new Error(\n `web port not resolved for box ${box.name}; is the container running? try \\`agentbox inspect ${box.name}\\``,\n );\n }\n url = `http://127.0.0.1:${String(record.webHostPort)}`;\n }\n\n if (opts.print) {\n process.stdout.write(`${url}\\n`);\n return;\n }\n\n const opened = spawnSync('open', [url], { stdio: 'inherit' });\n if (opened.status !== 0) {\n throw new Error(`open ${url} failed (exit ${String(opened.status ?? 'n/a')})`);\n }\n process.stdout.write(`opened ${url}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { findProjectRoot } from '@agentbox/config';\nimport {\n AmbiguousBoxError,\n BoxNotFoundError,\n readState,\n resolveBoxRef,\n type BoxRecord,\n type FindBoxResult,\n} from '@agentbox/sandbox-docker';\nimport { log } from '@clack/prompts';\n\ninterface ResolveOptions {\n /**\n * Override the cwd used for project-root resolution. Defaults to\n * `process.cwd()`. Commands that take `--workspace <path>` (e.g. create,\n * claude) can pass it here so the resolver matches the workspace's project,\n * not whatever shell dir the user happened to be in.\n */\n cwd?: string;\n}\n\n/**\n * One-stop resolver every box-arg command goes through.\n *\n * Resolution order:\n * 1. If `ref` is undefined → auto-pick the only box for the cwd's project\n * (errors with a chooser if 2+, errors clearly if 0).\n * 2. If `ref` is a positive integer → resolve as the cwd-project's\n * `projectIndex` (does NOT fall through to id-prefix; pure-numeric refs\n * are reserved for indices).\n * 3. Otherwise → existing `findBox` semantics (id → prefix → name → container).\n *\n * On any failure mode the helper prints a friendly message and `process.exit`s\n * with code 2, so callers can write `const box = await resolveBoxOrExit(...)`\n * without try/catch boilerplate.\n */\n/**\n * Special variant for `shell` and `logs` — the only two CLI verbs where\n * commander can't distinguish between \"user typed a box ref\" and \"user typed a\n * cmd/service after `--` and commander bound it to [box]\". When `ref` is set\n * but doesn't resolve as a box AND auto-pick yields exactly one box, return\n * that box plus a hint that `ref` should be re-treated as the first cmd/svc\n * token. On normal success / total miss it behaves like `resolveBoxOrExit`.\n */\nexport async function resolveBoxOrShift(\n ref: string | undefined,\n opts: ResolveOptions = {},\n): Promise<{ box: BoxRecord; shifted: boolean }> {\n const cwd = opts.cwd ?? process.cwd();\n const project = await findProjectRoot(cwd);\n const state = await readState();\n const firstTry: FindBoxResult = resolveBoxRef(ref, state, project.root);\n if (firstTry.kind === 'ok') return { box: firstTry.box, shifted: false };\n\n if (ref !== undefined) {\n // Maybe commander bound a post-`--` token to [box]; try auto-pick.\n const pick = resolveBoxRef(undefined, state, project.root);\n if (pick.kind === 'ok') return { box: pick.box, shifted: true };\n if (pick.kind === 'ambiguous') {\n // Auto-pick would have worked but it's ambiguous — strong signal the\n // user typed `shell -- cmd` (or `logs <svc>`) in a multi-box project.\n // Surface the chooser instead of the confusing \"no match for <cmd>\".\n log.error(`multiple boxes in this project — pick one:`);\n for (const b of pick.matches) {\n const idx = typeof b.projectIndex === 'number' ? `${String(b.projectIndex)})` : ' -)';\n process.stderr.write(` ${idx} ${b.name} (id ${b.id})\\n`);\n }\n log.info('try: agentbox <cmd> <n> -- <args> (or use the box name / id prefix)');\n process.exit(2);\n }\n }\n\n // Same error path as resolveBoxOrExit.\n const box = await resolveBoxOrExit(ref, opts);\n return { box, shifted: false };\n}\n\nexport async function resolveBoxOrExit(\n ref: string | undefined,\n opts: ResolveOptions = {},\n): Promise<BoxRecord> {\n const cwd = opts.cwd ?? process.cwd();\n // findProjectRoot tolerates non-existent dirs by walking up until\n // dirname(x) === x; the fallback root is the input itself. We treat any\n // walked path as the project root for resolution.\n const project = await findProjectRoot(cwd);\n const state = await readState();\n const result = resolveBoxRef(ref, state, project.root);\n\n if (result.kind === 'ok') return result.box;\n\n if (result.kind === 'ambiguous') {\n // Auto-pick ambiguous: the project has 2+ boxes and the user gave no ref.\n // For numeric / non-numeric explicit refs, an ambiguous result can only\n // come from findBox's id-prefix match (e.g. \"a1\" matches \"a1b…\" and\n // \"a1c…\"), in which case the user typed a real prefix and just needs to\n // disambiguate.\n if (ref === undefined) {\n log.error(`multiple boxes in this project — pick one:`);\n for (const b of result.matches) {\n const idx = typeof b.projectIndex === 'number' ? `${String(b.projectIndex)})` : ' -)';\n process.stderr.write(` ${idx} ${b.name} (id ${b.id})\\n`);\n }\n log.info('try: agentbox <cmd> <n> (or use the box name / id prefix)');\n process.exit(2);\n }\n // ref was provided → fall through to AmbiguousBoxError so handleLifecycleError\n // can render its existing hint about specifying more characters.\n throw new AmbiguousBoxError(ref, result.matches);\n }\n\n // kind === 'none'\n if (ref === undefined) {\n log.error(`no boxes in this project (${project.root})`);\n log.info('run `agentbox create` to make one, or pass a box ref explicitly');\n process.exit(2);\n }\n if (/^[1-9][0-9]*$/.test(ref.trim())) {\n log.error(`no box with index ${ref.trim()} in this project (${project.root})`);\n log.info('run `agentbox list` to see available indices');\n process.exit(2);\n }\n throw new BoxNotFoundError(ref);\n}\n","import { log } from '@clack/prompts';\nimport { AmbiguousBoxError, BoxNotFoundError, ClaudeSessionError } from '@agentbox/sandbox-docker';\n\n/**\n * Map common lifecycle errors to user-facing messages and the right exit code,\n * then exit. Shared by all lifecycle commands so error UX stays consistent.\n */\nexport function handleLifecycleError(err: unknown): never {\n if (err instanceof BoxNotFoundError) {\n log.error(err.message);\n log.info('Run `agentbox list` to see available boxes.');\n process.exit(2);\n }\n if (err instanceof AmbiguousBoxError) {\n log.error(err.message);\n log.info('Specify more characters of the id, or use the full name.');\n process.exit(2);\n }\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n process.exit(2);\n }\n const msg = err instanceof Error ? err.message : String(err);\n log.error(msg);\n process.exit(1);\n}\n","import { confirm, intro, isCancel, log, outro, password, spinner } from '@clack/prompts';\nimport { findProjectRoot, loadEffectiveConfig, type UserConfig } from '@agentbox/config';\nimport {\n attachClaudeSession,\n ClaudeSessionError,\n claudeSessionInfo,\n createBox,\n ensureClaudeVolume,\n inspectBox,\n rebuildPluginNativeDeps,\n SHARED_CLAUDE_VOLUME,\n startBox,\n startClaudeSession,\n unpauseBox,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport {\n AUTH_FILE,\n hostClaudeAvailable,\n isPlausibleOauthToken,\n resolveClaudeAuth,\n runHostSetupToken,\n writeAuthFile,\n type ResolvedClaudeAuth,\n} from '../auth.js';\nimport { resolveAgentLauncher } from '@agentbox/core';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybeRunSetupWizard } from '../wizard.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Ref shown in the detach notice: the per-project index `n` when set\n * (resolves from inside the project dir), else the globally-unique name. */\nfunction reattachRef(r: { projectIndex?: number; name: string }): string {\n return typeof r.projectIndex === 'number' ? String(r.projectIndex) : r.name;\n}\n\ninterface ClaudeCreateOptions {\n workspace: string;\n name?: string;\n hostSnapshot?: boolean;\n snapshot?: string; // --snapshot <ref>: start from this checkpoint\n image?: string;\n yes?: boolean;\n isolateClaudeConfig?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n}\n\nfunction buildClaudeCliOverrides(opts: ClaudeCreateOptions): Partial<UserConfig> {\n const box: NonNullable<UserConfig['box']> = {};\n if (opts.hostSnapshot !== undefined) box.hostSnapshot = opts.hostSnapshot;\n if (opts.image !== undefined) box.image = opts.image;\n if (opts.withPlaywright === true) box.withPlaywright = true;\n if (opts.withEnv === true) box.withEnv = true;\n if (opts.vnc === false) box.vnc = false;\n if (opts.isolateClaudeConfig === true) box.isolateClaudeConfig = true;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n const claude: NonNullable<UserConfig['claude']> = {};\n if (opts.sessionName !== undefined) claude.sessionName = opts.sessionName;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (Object.keys(claude).length > 0) out.claude = claude;\n return out;\n}\n\n\n/**\n * First-run onboarding. Spawn `claude setup-token` interactively (if the host has\n * Claude Code installed), then prompt the user to paste the token. Save it to\n * ~/.agentbox/auth.json (mode 0600) and return the env shape that should be\n * forwarded to the box. Returns null when the user declines or skips.\n */\nasync function offerSetupToken(): Promise<ResolvedClaudeAuth | null> {\n log.info('first time setup: setup token for Claude Code');\n\n const canRun = hostClaudeAvailable();\n if (canRun) {\n const yes = await confirm({\n message: 'Run `claude setup-token` now to save a token?',\n initialValue: true,\n });\n if (isCancel(yes) || !yes) {\n log.info('ok, continuing without a saved token; /login inside the box once and it persists in the shared volume.');\n return null;\n }\n const { exitCode } = runHostSetupToken();\n if (exitCode !== 0) {\n log.warn(`\\`claude setup-token\\` exited with code ${String(exitCode)}; you can still paste a token below if you have one.`);\n }\n } else {\n log.warn(\n 'Claude Code is not installed on the host, so I cannot run `claude setup-token` for you. ' +\n 'Run it on a machine that has Claude Code installed, then paste the token below — or skip and /login inside the box.',\n );\n }\n\n const pasted = await password({ message: 'Paste OAuth token (or empty to skip):' });\n if (isCancel(pasted) || !pasted) {\n log.info('ok, continuing without a saved token; /login inside the box once and it persists in the shared volume.');\n return null;\n }\n const token = pasted.trim();\n if (!isPlausibleOauthToken(token)) {\n log.warn(\"That doesn't look like an OAuth token (expected `sk-ant-oat…`); saving anyway — verify inside the box.\");\n }\n await writeAuthFile({ claudeCodeOauthToken: token });\n log.success(`saved to ${AUTH_FILE} (mode 0600)`);\n return { env: { CLAUDE_CODE_OAUTH_TOKEN: token }, source: 'auth-file' };\n}\n\nexport const claudeCommand = new Command('claude')\n .description('Create a sandboxed box and launch Claude Code in a detachable tmux session')\n // Mirror create's surface so users can swap the verb without re-learning flags.\n .option('-w, --workspace <path>', 'host workspace to mount', process.cwd())\n .option('-n, --name <name>', 'friendly box name (default: <workspace-basename>-<id>)')\n .option('--host-snapshot', 'use a frozen APFS clone of the host workspace as the overlay lower')\n .option('--no-host-snapshot', 'bind the live workspace directly (host edits leak into reads)')\n .option(\n '--snapshot <ref>',\n 'start from a project checkpoint (see `agentbox checkpoint`); overrides box.defaultCheckpoint',\n )\n .option('--image <ref>', 'override the box image')\n .option('-y, --yes', 'skip prompts, accept defaults (host-snapshot=on)')\n .option(\n '--isolate-claude-config',\n 'use a per-box ~/.claude volume instead of the shared agentbox-claude-config',\n )\n .option('--with-playwright', 'also install @playwright/cli@latest globally inside the box')\n .option(\n '--with-env',\n 'copy host env/config files (.env*, secrets.toml, agentbox.yaml, ...) into /workspace at create time (gitignore-bypassing)',\n )\n .option('--no-vnc', 'disable the per-box Xvnc + noVNC web client (on by default)')\n .option(\n '--shared-docker-cache',\n \"use the shared 'agentbox-docker-cache' volume for in-box docker images (preserved on destroy; only one box can run at a time when set)\",\n )\n .option('--session-name <name>', 'tmux session name (default from config; built-in: claude)')\n .option('--memory <size>', 'memory ceiling (e.g. 512m, 2g); unset = unlimited')\n .option('--cpus <n>', 'CPU count cap (fractional ok, e.g. 1.5); unset = unlimited')\n .option('--pids-limit <n>', 'max process count (PIDs cgroup); unset = unlimited')\n .option('--disk <size>', 'best-effort writable-layer size (e.g. 10g); no-op on overlay2/macOS')\n .argument(\n '[claude-args...]',\n \"extra args passed to claude inside the box; place after `--`, e.g. `agentbox claude -- --model sonnet`\",\n )\n .action(async (claudeArgs: string[], opts: ClaudeCreateOptions) => {\n intro('agentbox claude');\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildClaudeCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : cfg.effective.box.defaultCheckpoint.length > 0\n ? cfg.effective.box.defaultCheckpoint\n : undefined;\n\n // First-run wizard: when no agentbox.yaml exists, offer to inject an\n // initial user-message so claude reads /agentbox-setup and writes one.\n // Skipped when starting from a checkpoint (it already carries the config).\n const wiz = await maybeRunSetupWizard({\n workspace: opts.workspace,\n yes: !!opts.yes,\n command: 'claude',\n checkpointRef,\n });\n let effectiveClaudeArgs = claudeArgs;\n if (wiz.action === 'launch-with-prompt' && wiz.initialPrompt) {\n effectiveClaudeArgs = resolveAgentLauncher('claude-code').buildArgs(\n wiz.initialPrompt,\n claudeArgs,\n );\n }\n\n // For the create-and-launch verb the default is host-snapshot=on; explicit\n // --no-host-snapshot still wins. Config can also flip the default.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? true);\n const sessionName = cfg.effective.claude.sessionName;\n\n // Resolve auth from env or the saved auth file. On first run (nothing\n // saved, nothing in env), drive the user through `claude setup-token`\n // interactively — but only when we have a real TTY and the user didn't\n // pass `--yes` (which means \"no prompts; CI-friendly\").\n let resolved = await resolveClaudeAuth(process.env);\n if (resolved.source === 'none' && process.stdin.isTTY && !opts.yes) {\n const next = await offerSetupToken();\n if (next) resolved = next;\n }\n\n const s = spinner();\n s.start('creating box');\n let containerName = '';\n try {\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set in any layer.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n const result = await createBox({\n workspacePath: opts.workspace,\n name: opts.name,\n useSnapshot,\n checkpointRef,\n image: cfg.effective.box.image,\n claudeConfig: { isolate: cfg.effective.box.isolateClaudeConfig },\n claudeEnv: resolved.env,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => s.message(clampSpinnerLine(line)),\n });\n containerName = result.record.container;\n\n // Plugin native deps: the sync excludes `node_modules` (host darwin\n // binaries don't run on linux/amd64). First claude session in a fresh\n // box pays the npm-install cost for each plugin that ships a\n // package.json; subsequent attaches see node_modules already present\n // and exit immediately. Keep the same spinner alive — every phase\n // overwrites the one line instead of leaving a scroll of `●`/`◇` rows.\n s.message('checking plugin native deps');\n const rebuild = await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n s.message('starting claude session');\n await startClaudeSession({\n container: result.record.container,\n claudeArgs: effectiveClaudeArgs,\n sessionName,\n boxName: result.record.name,\n });\n\n const nSuffix =\n typeof result.record.projectIndex === 'number'\n ? ` · n ${String(result.record.projectIndex)}`\n : '';\n s.stop(`box ${result.record.container} ready${nSuffix}`);\n for (const f of rebuild.failed) {\n log.warn(`plugin install failed for ${f.dir}; claude may still load it. stderr:\\n${f.stderr.trim()}`);\n }\n\n outro('attaching — Control+a q to detach, leaves claude running');\n attachClaudeSession(result.record.container, sessionName, reattachRef(result.record));\n } catch (err) {\n s.stop('failed');\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n if (containerName) {\n log.info(`The box ${containerName} is still running. Destroy it with:`);\n log.info(` agentbox destroy ${containerName} -y`);\n }\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\ninterface ClaudeStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n}\n\n// Shared by `claude start` and `claude attach`: if a session is already\n// running, just attach; otherwise auto-unpause/start the box, (optionally)\n// resync ~/.claude, rebuild plugin native deps, launch claude, then attach.\nasync function startOrAttachClaude(\n box: BoxRecord,\n claudeArgs: string[],\n opts: ClaudeStartOptions,\n): Promise<void> {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: opts.sessionName ? { claude: { sessionName: opts.sessionName } } : {},\n });\n const sessionName = cfg.effective.claude.sessionName;\n\n // Auto-unpause/start. Mirrors `agentbox shell` / `agentbox code`.\n // `startBox` re-mounts the FUSE overlay and relaunches ctl/vnc/dockerd\n // because those processes die with the container.\n const insp = await inspectBox(box.id);\n if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // If a tmux session already exists, just attach — no resync, no plugin\n // rebuild, ignore any post-`--` args (they only apply to a fresh claude).\n const existing = await claudeSessionInfo(box.container, sessionName);\n if (existing.running) {\n outro(`session \"${sessionName}\" already running — attaching (Control+a q to detach)`);\n attachClaudeSession(box.container, sessionName, reattachRef(box));\n return;\n }\n\n // One spinner for the whole prepare→attach sequence: every phase overwrites\n // the single line instead of leaving a scroll of `●`/`◇` rows.\n const s = spinner();\n s.start('preparing box');\n\n // Auto-unpause/start. `startBox` re-mounts the FUSE overlay and relaunches\n // ctl/vnc/dockerd because those processes die with the container.\n if (insp.state === 'paused') {\n s.message('unpausing box');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n s.message('starting box (remounting overlay)');\n await startBox(box.id);\n }\n\n // Default: re-sync the host's ~/.claude into the box volume so any\n // updates the user made on the host (new MCP servers, refreshed\n // OAuth state in _claude.json, …) reach the in-box claude. Slow on\n // first sync; opt out with --no-sync-config to skip.\n const syncConfig = opts.syncConfig !== false;\n if (syncConfig) {\n s.message('syncing ~/.claude into box volume');\n // Use the box's recorded volume so isolated boxes hit their own\n // agentbox-claude-config-<id>, not the shared one.\n const volume = box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME;\n await ensureClaudeVolume(\n { volume },\n {\n syncFromHost: true,\n image: box.image,\n hostWorkspace: box.workspacePath,\n },\n );\n }\n\n // Plugin native deps: idempotent — gated by a per-plugin marker. No-op\n // on subsequent starts unless a new plugin was synced just now.\n s.message('checking plugin native deps');\n const rebuild = await rebuildPluginNativeDeps(box.container, {\n volume: box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n s.message('starting claude session');\n await startClaudeSession({\n container: box.container,\n claudeArgs,\n sessionName,\n boxName: box.name,\n });\n\n s.stop(`box ${box.container} ready`);\n for (const f of rebuild.failed) {\n log.warn(`plugin install failed for ${f.dir}; claude may still load it. stderr:\\n${f.stderr.trim()}`);\n }\n\n outro('attaching — Control+a q to detach, leaves claude running');\n attachClaudeSession(box.container, sessionName, reattachRef(box));\n}\n\nconst claudeAttachCommand = new Command('attach')\n .description(\n 'Attach to a Claude Code tmux session in a box, starting one if none is running (auto-unpause/start)',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--session-name <name>', 'tmux session name (default from config; built-in: claude)')\n .option(\n '--no-sync-config',\n \"when starting a fresh session, skip rsyncing the host's ~/.claude into the box's volume (faster)\",\n )\n .action(async function (this: Command, idOrName: string | undefined) {\n // optsWithGlobals merges parent + own options — the parent `claude`\n // command also defines `--session-name`.\n const opts = this.optsWithGlobals() as ClaudeStartOptions;\n intro('agentbox claude attach');\n try {\n const box = await resolveBoxOrExit(idOrName);\n await startOrAttachClaude(box, [], opts);\n } catch (err) {\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst claudeStartCommand = new Command('start')\n .description(\n 'Start a Claude Code tmux session in an already-existing box (auto-unpause/start). If a session is already running, just attach.',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--session-name <name>', 'tmux session name (default from config; built-in: claude)')\n .option(\n '--no-sync-config',\n \"skip rsyncing the host's ~/.claude into the box's volume before starting (faster; use existing in-box state)\",\n )\n .argument(\n '[claude-args...]',\n \"extra args passed to claude when starting a new session; ignored if a session is already running. Place after `--`, e.g. `agentbox claude start 1 -- --model sonnet`\",\n )\n .action(async function (this: Command, idOrName: string | undefined, claudeArgs: string[]) {\n const opts = this.optsWithGlobals() as ClaudeStartOptions;\n intro('agentbox claude start');\n try {\n // Two positionals (`[box] [claude-args...]`) make commander bind the\n // first post-`--` token (e.g. `--model`) to `[box]`. resolveBoxOrShift\n // detects that, auto-picks the project's single box, and tells us to\n // treat the bound `idOrName` as the first claude-args token instead.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n const effectiveClaudeArgs = shifted && idOrName ? [idOrName, ...claudeArgs] : claudeArgs;\n await startOrAttachClaude(box, effectiveClaudeArgs, opts);\n } catch (err) {\n if (err instanceof ClaudeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nclaudeCommand.addCommand(claudeAttachCommand);\nclaudeCommand.addCommand(claudeStartCommand);\n","import { spawnSync } from 'node:child_process';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { STATE_DIR } from '@agentbox/sandbox-docker';\n\nexport const AUTH_FILE = join(STATE_DIR, 'auth.json');\n\nexport interface AuthFile {\n claudeCodeOauthToken?: string;\n}\n\nexport interface ResolvedClaudeAuth {\n /** Env vars to inject into the box. Only includes keys with non-empty string values. */\n env: Record<string, string>;\n /** Where the value(s) came from. `'none'` means there's nothing to forward and the caller may prompt. */\n source: 'host-env' | 'auth-file' | 'none';\n}\n\n/**\n * Merge host env + ~/.agentbox/auth.json into a single effective env that the\n * `claude` command forwards to the box. Env wins over the file; either of the\n * two known keys (API key or OAuth token) counts as having auth.\n */\nexport async function resolveClaudeAuth(\n processEnv: NodeJS.ProcessEnv,\n opts: { authFilePath?: string } = {},\n): Promise<ResolvedClaudeAuth> {\n const env: Record<string, string> = {};\n const envApiKey = processEnv['ANTHROPIC_API_KEY'];\n const envOauth = processEnv['CLAUDE_CODE_OAUTH_TOKEN'];\n if (typeof envApiKey === 'string' && envApiKey.length > 0) env['ANTHROPIC_API_KEY'] = envApiKey;\n if (typeof envOauth === 'string' && envOauth.length > 0) env['CLAUDE_CODE_OAUTH_TOKEN'] = envOauth;\n if (Object.keys(env).length > 0) return { env, source: 'host-env' };\n\n const file = await readAuthFile(opts.authFilePath);\n if (file.claudeCodeOauthToken && file.claudeCodeOauthToken.length > 0) {\n return {\n env: { CLAUDE_CODE_OAUTH_TOKEN: file.claudeCodeOauthToken },\n source: 'auth-file',\n };\n }\n return { env: {}, source: 'none' };\n}\n\nexport async function readAuthFile(path: string = AUTH_FILE): Promise<AuthFile> {\n try {\n const raw = await readFile(path, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const t = (parsed as { claudeCodeOauthToken?: unknown }).claudeCodeOauthToken;\n return typeof t === 'string' && t.length > 0 ? { claudeCodeOauthToken: t } : {};\n }\n return {};\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return {};\n // A garbage / corrupted file shouldn't kill `agentbox claude`. Treat as empty.\n return {};\n }\n}\n\nexport async function writeAuthFile(next: AuthFile, path: string = AUTH_FILE): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(next, null, 2) + '\\n', { mode: 0o600, flag: 'w' });\n}\n\n/** True iff a `claude` binary is on the host PATH. */\nexport function hostClaudeAvailable(): boolean {\n // POSIX `command -v` would also work but needs a shell; `which` is in both\n // macOS base and any Linux box we'd realistically run on. We don't shell out\n // to claude itself — that would launch the binary unnecessarily.\n const r = spawnSync('which', ['claude'], { stdio: ['ignore', 'pipe', 'ignore'] });\n return r.status === 0 && (r.stdout?.toString().trim().length ?? 0) > 0;\n}\n\n/**\n * Run `claude setup-token` interactively. We inherit stdio so the user's\n * terminal drives the OAuth flow (browser open, code paste, etc.) just as if\n * they ran the command themselves. Returns the child exit code.\n */\nexport function runHostSetupToken(): { exitCode: number } {\n const child = spawnSync('claude', ['setup-token'], { stdio: 'inherit' });\n return { exitCode: child.status ?? -1 };\n}\n\n/**\n * Cheap shape check. Anthropic OAuth tokens currently look like\n * `sk-ant-oat01-…`. We don't validate cryptographically — if the user pastes\n * something nonsensical, the box itself will surface \"invalid token\" when\n * claude tries to use it. Better to save the typo than to block on a\n * regex that could go stale.\n */\nexport function isPlausibleOauthToken(s: string): boolean {\n const t = s.trim();\n return t.startsWith('sk-ant-oat') && t.length >= 40;\n}\n","import type { AgentKind } from './types.js';\n\nexport interface AgentLauncher {\n readonly kind: AgentKind;\n buildArgs(initialMessage: string, userArgs: string[]): string[];\n}\n\nconst claudeCodeLauncher: AgentLauncher = {\n kind: 'claude-code',\n // claude treats its first positional argument as the seed user turn in\n // interactive mode (`claude \"<message>\"`), so we slot the initial message\n // ahead of any user-passed flags.\n buildArgs(initialMessage, userArgs) {\n if (!initialMessage) return [...userArgs];\n return [initialMessage, ...userArgs];\n },\n};\n\nconst codexLauncher: AgentLauncher = {\n kind: 'codex',\n buildArgs() {\n throw new Error(\n 'codex agent is not yet supported by agentbox; install + wire the codex launcher first',\n );\n },\n};\n\nexport function resolveAgentLauncher(kind: AgentKind): AgentLauncher {\n if (kind === 'claude-code') return claudeCodeLauncher;\n if (kind === 'codex') return codexLauncher;\n throw new Error(`unknown agent kind: ${String(kind)}`);\n}\n","/**\n * Clamp a spinner message to fit on a single terminal row.\n *\n * @clack/prompts' spinner redraws in place by emitting cursor-up + clear-line\n * sequences sized to the lines it last drew. When a message is longer than the\n * terminal is wide, the terminal wraps it onto extra visual rows the spinner\n * doesn't know about — the next frame's clear hits only the last visual row\n * and the rest pile up in scrollback. Docker's build output during the apt-get\n * phase (Get:19 http://ports.ubuntu.com/... long URLs) routinely blows past\n * 100 columns, which is what triggers the symptom in `agentbox create` /\n * `agentbox claude` on the first run when the image is being built.\n *\n * Falls back to the raw line on non-TTY stdout (no spinner is drawn, so\n * wrapping is harmless).\n */\nconst SPINNER_CHROME = 6;\n\nexport function clampSpinnerLine(line: string): string {\n const cols = process.stdout.columns;\n if (!process.stdout.isTTY || !cols) return line;\n const trimmed = line.replace(/\\s+$/, '');\n const max = cols - SPINNER_CHROME;\n if (max <= 1 || trimmed.length <= max) return trimmed;\n return `${trimmed.slice(0, max - 1)}…`;\n}\n","import type { EffectiveConfig } from '@agentbox/config';\n\n/**\n * Engine-agnostic resource ceilings the CLI hands to createBox. Memory in\n * bytes, cpus fractional, pids a count, disk a raw size string. null = no cap.\n */\nexport interface ResolvedLimits {\n memoryBytes: number | null;\n cpus: number | null;\n pidsLimit: number | null;\n disk: string | null;\n}\n\n/**\n * Parse a docker-style memory size (`512`, `512b`, `64k`, `512m`, `2g`) into\n * bytes. Bare numbers are bytes (matches `docker run --memory`). Throws on\n * garbage so a typo'd `--memory` fails loudly instead of silently unlimited.\n */\nexport function parseMemoryToBytes(raw: string): number {\n const m = /^\\s*([\\d.]+)\\s*([bkmg]?)b?\\s*$/i.exec(raw);\n if (!m) throw new Error(`invalid --memory value \"${raw}\" (try e.g. 512m, 2g)`);\n const n = Number(m[1]);\n if (!Number.isFinite(n) || n < 0) {\n throw new Error(`invalid --memory value \"${raw}\"`);\n }\n const unit = (m[2] ?? '').toLowerCase();\n const factor =\n unit === 'k' ? 1024 : unit === 'm' ? 1024 ** 2 : unit === 'g' ? 1024 ** 3 : 1;\n return Math.floor(n * factor);\n}\n\nconst MIB = 1024 * 1024;\n\nexport interface LimitFlags {\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n}\n\n/**\n * Merge the layered config (`box.*`, ints/strings: 0/'' = unlimited) with raw\n * CLI flags. Flags win and carry richer types — `--memory 2g`, fractional\n * `--cpus 1.5` — that the integer-typed config keys can't express.\n */\nexport function resolveLimits(\n box: EffectiveConfig['box'],\n flags: LimitFlags,\n): ResolvedLimits {\n let memoryBytes: number | null = box.memory > 0 ? box.memory * MIB : null;\n if (flags.memory !== undefined && flags.memory !== '') {\n memoryBytes = parseMemoryToBytes(flags.memory);\n }\n\n let cpus: number | null = box.cpus > 0 ? box.cpus : null;\n if (flags.cpus !== undefined && flags.cpus !== '') {\n const n = Number(flags.cpus);\n if (!Number.isFinite(n) || n < 0) {\n throw new Error(`invalid --cpus value \"${flags.cpus}\"`);\n }\n cpus = n > 0 ? n : null;\n }\n\n let pidsLimit: number | null = box.pidsLimit > 0 ? box.pidsLimit : null;\n if (flags.pidsLimit !== undefined && flags.pidsLimit !== '') {\n const n = Number(flags.pidsLimit);\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(`invalid --pids-limit value \"${flags.pidsLimit}\"`);\n }\n pidsLimit = n > 0 ? n : null;\n }\n\n let disk: string | null = box.disk ? box.disk : null;\n if (flags.disk !== undefined && flags.disk !== '') disk = flags.disk;\n\n return { memoryBytes, cpus, pidsLimit, disk };\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport { copyFile, mkdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * In-box absolute path to the setup guide markdown (baked into the box image\n * by Dockerfile.box). Stable so the wizard's initial-prompt can reference it.\n */\nexport const IN_BOX_SETUP_GUIDE_PATH = '/usr/local/share/agentbox/setup-guide.md';\n\nconst HOST_SKILLS_DIR = join(homedir(), '.claude', 'skills', 'agentbox-setup');\nconst HOST_SKILL_FILE = join(HOST_SKILLS_DIR, 'SKILL.md');\n\n// `share/agentbox-setup/SKILL.md` sits next to `dist/` after tsup build and at\n// the package root after npm publish; both resolve via `../share/...` relative\n// to dist/index.js.\nfunction bundledSkillPath(): string {\n return fileURLToPath(new URL('../share/agentbox-setup/SKILL.md', import.meta.url));\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n const st = await stat(p);\n return st.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Idempotently install the host-side `/agentbox-setup` claude skill so the\n * user can re-invoke it later from any claude session. Never overwrites: a\n * pre-existing SKILL.md is assumed to be intentional (user customized it).\n * The existing `ensureClaudeVolume` rsync (packages/sandbox-docker/src/claude.ts)\n * propagates ~/.claude/skills/ into every box automatically.\n *\n * `opts.targetFile` and `opts.sourceFile` exist for tests.\n */\nexport async function installAgentboxSetupSkill(\n opts: { targetFile?: string; sourceFile?: string } = {},\n): Promise<{ installed: boolean; targetFile: string }> {\n const targetFile = opts.targetFile ?? HOST_SKILL_FILE;\n const targetDir = join(targetFile, '..');\n if (await fileExists(targetFile)) return { installed: false, targetFile };\n const src = opts.sourceFile ?? bundledSkillPath();\n if (!(await fileExists(src))) {\n // Bundled asset missing — happens if the user built without copying share/.\n // Don't crash the wizard, just skip the install silently.\n return { installed: false, targetFile };\n }\n await mkdir(targetDir, { recursive: true, mode: 0o700 });\n await copyFile(src, targetFile);\n return { installed: true, targetFile };\n}\n\nexport function buildSetupInitialPrompt(workspace: string): string {\n const name = basename(workspace);\n return (\n `The user just opened a new agentbox sandbox for \"${name}\" but the workspace has no agentbox.yaml yet. ` +\n `Please run the /agentbox-setup skill (or read ${IN_BOX_SETUP_GUIDE_PATH} if the skill is not loaded), ` +\n `then explore /workspace and propose an agentbox.yaml. Save the file to /workspace/agentbox.yaml. ` +\n `Then run \\`agentbox-ctl reload\\` from inside the box so the already-running supervisor applies the new config ` +\n `and immediately runs the declared tasks and autostarts the services (no box restart needed). ` +\n `When done, summarise what services and tasks you declared, and remind the user how to land the file on the host ` +\n `(commit through the bind-mounted .git, or \"agentbox pull env\" on the host).`\n );\n}\n\nexport type WizardAction = 'proceed' | 'switch-to-claude' | 'launch-with-prompt';\n\nexport interface WizardOutcome {\n action: WizardAction;\n initialPrompt?: string;\n}\n\ninterface WizardArgs {\n workspace: string;\n yes: boolean;\n command: 'create' | 'claude';\n /**\n * Resolved checkpoint ref this box will start from (explicit `--snapshot`\n * or the project's `box.defaultCheckpoint`), if any. When set, the project\n * is already configured: the checkpoint carries the warm state *and* the\n * agentbox.yaml that was present when it was captured, so we skip the\n * \"generate one?\" prompt entirely.\n */\n checkpointRef?: string;\n}\n\n/**\n * Sentinel env var set by `agentbox create` when it re-dispatches to\n * `agentbox claude`. It tells the inner wizard the user has already\n * confirmed: skip the prompts and slot the initial setup prompt for claude.\n */\nexport const WIZARD_AUTOLAUNCH_ENV = 'AGENTBOX_WIZARD_AUTOLAUNCH';\n\nexport async function maybeRunSetupWizard(args: WizardArgs): Promise<WizardOutcome> {\n // Re-entry from agentbox create → claude: outer pass already prompted +\n // installed the skill; just inject the initial prompt for claude.\n if (process.env[WIZARD_AUTOLAUNCH_ENV] === '1') {\n if (args.command !== 'claude') return { action: 'proceed' };\n if (args.checkpointRef) return { action: 'proceed' };\n const proj = await findProjectRoot(args.workspace);\n if (proj.hasAgentboxYaml) return { action: 'proceed' };\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n };\n }\n\n if (args.yes) return { action: 'proceed' };\n if (!process.stdin.isTTY) return { action: 'proceed' };\n\n const proj = await findProjectRoot(args.workspace);\n if (proj.hasAgentboxYaml) return { action: 'proceed' };\n\n // A configured default checkpoint means the project is already set up — the\n // checkpoint carries node_modules/env *and* the agentbox.yaml from when it\n // was captured. Don't nag to regenerate one.\n if (args.checkpointRef) {\n log.info(`starting from checkpoint \"${args.checkpointRef}\"; skipping agentbox.yaml setup`);\n return { action: 'proceed' };\n }\n\n const go = await confirm({\n message: 'Set up a new Agentbox environment?',\n initialValue: true,\n });\n if (isCancel(go) || !go) return { action: 'proceed' };\n\n // Install the skill once so the user can re-invoke /agentbox-setup later.\n // Silent on subsequent runs.\n try {\n const r = await installAgentboxSetupSkill();\n if (r.installed) {\n log.success(`installed /agentbox-setup skill at ${r.targetFile}`);\n }\n } catch (err) {\n log.warn(`could not install /agentbox-setup skill: ${(err as Error).message}`);\n }\n\n // For `agentbox create`, the only sensible yes-path is to hand off to\n // `agentbox claude` (that's where the agent runs). No second prompt — the\n // first confirm already captured the user's intent.\n if (args.command === 'create') return { action: 'switch-to-claude' };\n\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n };\n}\n\n/**\n * Map the create command's parsed options to an argv that can be re-dispatched\n * through `claudeCommand.parseAsync(['node', 'agentbox', 'claude', ...args])`.\n * `--yes` is intentionally NOT passed through here: the wizard already prompted\n * the user, and forwarding `--yes` would suppress claude's own setup-token\n * prompt that the user typically wants on first run.\n */\nexport interface CreatePassthroughOptions {\n workspace?: string;\n name?: string;\n hostSnapshot?: boolean;\n snapshot?: string;\n image?: string;\n withPlaywright?: boolean;\n vnc?: boolean;\n sharedDockerCache?: boolean;\n}\n\nexport function passthroughFlags(opts: CreatePassthroughOptions): string[] {\n const out: string[] = [];\n if (opts.workspace) out.push('--workspace', opts.workspace);\n if (opts.name) out.push('--name', opts.name);\n if (opts.hostSnapshot === true) out.push('--host-snapshot');\n if (opts.hostSnapshot === false) out.push('--no-host-snapshot');\n if (opts.snapshot) out.push('--snapshot', opts.snapshot);\n if (opts.image) out.push('--image', opts.image);\n if (opts.withPlaywright === true) out.push('--with-playwright');\n if (opts.vnc === false) out.push('--no-vnc');\n if (opts.sharedDockerCache === true) out.push('--shared-docker-cache');\n return out;\n}\n\n// Exposed for tests.\nexport const _internals = { HOST_SKILL_FILE, HOST_SKILLS_DIR, bundledSkillPath };\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n setConfigValue,\n unsetConfigValue,\n} from '@agentbox/config';\nimport {\n createCheckpoint,\n inspectBox,\n listCheckpoints,\n removeCheckpoint,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface CreateOpts {\n name?: string;\n merged?: boolean;\n setDefault?: boolean;\n}\n\nasync function projectRootFor(cwd: string, recordRoot?: string): Promise<string> {\n return recordRoot ?? (await findProjectRoot(cwd)).root;\n}\n\nconst createSub = new Command('create')\n .description('Capture a box state as a project checkpoint (<box-name>-<n>)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--name <name>', 'checkpoint name (default: <box-name>-<next>)')\n .option('--merged', 'flatten lower+upper into one tree instead of a layered delta')\n .option('--set-default', 'mark this checkpoint as the project default for new boxes')\n .action(async (idOrName: string | undefined, opts: CreateOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n const projectRoot = await projectRootFor(box.workspacePath, box.projectRoot);\n const cfg = await loadEffectiveConfig(projectRoot);\n\n const info = await createCheckpoint({\n box,\n projectRoot,\n name: opts.name,\n merged: opts.merged === true,\n setDefault: opts.setDefault === true,\n maxLayers: cfg.effective.checkpoint.maxLayers,\n onLog: (line) => log.info(line),\n });\n\n log.success(\n `checkpoint ${info.name} (${info.manifest.type}) -> ${info.dir}` +\n (opts.setDefault ? ' [project default]' : ''),\n );\n if (!opts.setDefault) {\n log.info(`make it the default for new boxes: agentbox checkpoint set-default ${info.name}`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst lsSub = new Command('ls')\n .description('List this project\\'s checkpoints')\n .action(async () => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n const cfg = await loadEffectiveConfig(projectRoot);\n const def = cfg.effective.box.defaultCheckpoint;\n const list = await listCheckpoints(projectRoot);\n if (list.length === 0) {\n process.stdout.write(`no checkpoints for ${projectRoot}\\n`);\n return;\n }\n for (const c of list) {\n const flag = c.name === def ? ' *default' : '';\n process.stdout.write(\n `${c.name} ${c.manifest.type} from ${c.manifest.sourceBoxName} ${c.manifest.createdAt}${flag}\\n`,\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst setDefaultSub = new Command('set-default')\n .description('Pin a checkpoint as the project default (box.defaultCheckpoint)')\n .argument('[ref]', 'checkpoint name (omit with --clear)')\n .option('--clear', 'unset the project default instead of setting one')\n .action(async (ref: string | undefined, opts: { clear?: boolean }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n if (opts.clear) {\n if (ref !== undefined) {\n throw new Error('pass either a <ref> or --clear, not both');\n }\n const r = await unsetConfigValue('project', 'box.defaultCheckpoint', projectRoot);\n process.stdout.write(\n r.existed\n ? `cleared project default checkpoint (wrote ${r.path})\\n`\n : `no project default checkpoint was set (${r.path})\\n`,\n );\n return;\n }\n if (ref === undefined) {\n throw new Error('missing <ref> (or pass --clear to unset the default)');\n }\n const list = await listCheckpoints(projectRoot);\n if (!list.some((c) => c.name === ref)) {\n throw new Error(`checkpoint not found: ${ref} (see \\`agentbox checkpoint ls\\`)`);\n }\n const r = await setConfigValue('project', 'box.defaultCheckpoint', ref, projectRoot);\n process.stdout.write(`project default checkpoint = ${ref} (wrote ${r.path})\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst rmSub = new Command('rm')\n .description('Delete a checkpoint')\n .argument('<ref>', 'checkpoint name')\n .option('-y, --yes', 'skip the confirmation prompt')\n .action(async (ref: string, opts: { yes?: boolean }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n if (!opts.yes) {\n const ok = await confirm({ message: `Delete checkpoint ${ref}?`, initialValue: false });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n const removed = await removeCheckpoint(projectRoot, ref);\n if (!removed) throw new Error(`checkpoint not found: ${ref}`);\n process.stdout.write(`removed checkpoint ${ref}\\n`);\n\n // Don't leave box.defaultCheckpoint dangling at a now-deleted ref —\n // future `agentbox create` would fail to resolve it. Clear it when the\n // project layer pointed here; warn (can't auto-edit) if it came from a\n // global / workspace-defaults layer instead.\n const cfg = await loadEffectiveConfig(projectRoot);\n if (cfg.layers.project.values.box?.defaultCheckpoint === ref) {\n await unsetConfigValue('project', 'box.defaultCheckpoint', projectRoot);\n log.info(`cleared project default checkpoint (was ${ref})`);\n } else if (cfg.effective.box.defaultCheckpoint === ref) {\n log.warn(\n `default checkpoint ${ref} is set outside the per-project config (global or agentbox.yaml defaults) — clear it manually`,\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nexport const checkpointCommand = new Command('checkpoint')\n .description('Capture and manage project checkpoints (warm box state new boxes can start from)')\n .addCommand(createSub, { isDefault: true })\n .addCommand(lsSub)\n .addCommand(setDefaultSub)\n .addCommand(rmSub);\n","import { spawn } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command, InvalidArgumentError } from 'commander';\nimport type { StatusReply, WaitReadyReply } from '@agentbox/ctl';\nimport { loadEffectiveConfig, type IdeFlavor as ConfigIdeFlavor, type UserConfig } from '@agentbox/config';\nimport {\n containerHex,\n ensureAgentboxTasksFile,\n execInBox,\n ideProfile,\n inspectBox,\n startBox,\n unpauseBox,\n type IdeFlavor,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface CodeOptions {\n noWait?: boolean;\n timeout?: string;\n noAutoTerminals?: boolean;\n regenTasks?: boolean;\n print?: boolean;\n ide?: IdeFlavor;\n}\n\nfunction buildCodeCliOverrides(opts: CodeOptions): Partial<UserConfig> {\n const code: NonNullable<UserConfig['code']> = {};\n if (opts.ide !== undefined) code.ide = opts.ide as ConfigIdeFlavor;\n if (opts.noWait === true) code.wait = false;\n if (opts.noAutoTerminals === true) code.autoTerminals = false;\n if (opts.timeout !== undefined) {\n const n = Number(opts.timeout);\n if (Number.isFinite(n) && Number.isInteger(n)) code.timeoutMs = n;\n }\n return Object.keys(code).length > 0 ? { code } : {};\n}\n\nfunction parseIdeFlavor(value: string): IdeFlavor {\n if (value === 'vscode' || value === 'cursor') return value;\n throw new InvalidArgumentError(`expected one of: vscode, cursor (got \"${value}\")`);\n}\n\nexport const codeCommand = new Command('code')\n .description('Open a box in VS Code or Cursor via the Dev Containers extension')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--no-wait', \"don't block on agentbox-ctl wait-ready before opening\")\n .option('--timeout <ms>', 'wait-ready timeout in milliseconds (default from config; built-in: 120000)')\n .option('--no-auto-terminals', \"don't generate /workspace/.vscode/tasks.json\")\n .option('--regen-tasks', 'overwrite a user-owned tasks.json (skips sentinel check)', false)\n .option(\n '--ide <flavor>',\n 'force a specific IDE: vscode | cursor (default from config; built-in: auto)',\n parseIdeFlavor,\n )\n .option(\n '--print',\n 'print the folder URI instead of launching the IDE (still refreshes/waits)',\n )\n .action(async (idOrName: string | undefined, opts: CodeOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // Layered config: workspace = the box's host workspace, not cwd, so\n // per-project defaults follow the box even if you run `agentbox code`\n // from elsewhere.\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: buildCodeCliOverrides(opts),\n });\n const wait = cfg.effective.code.wait;\n const autoTerminals = cfg.effective.code.autoTerminals;\n const timeoutMs = String(cfg.effective.code.timeoutMs);\n const ide = cfg.effective.code.ide;\n const forcedIde: IdeFlavor | undefined = ide === 'auto' ? undefined : (ide as IdeFlavor);\n\n // Bring the box online if it isn't already.\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info(`box is paused; unpausing`);\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info(`box is stopped; starting (remounting overlay)`);\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // Wait for tasks + autostart services to be ready.\n if (wait) {\n const reply = await runWaitReady(box.container, timeoutMs);\n if (!reply.ready) {\n const lines: string[] = [];\n if (reply.timedOut.length > 0) lines.push(`timed out: ${reply.timedOut.join(', ')}`);\n if (reply.failed.length > 0) lines.push(`failed: ${reply.failed.join(', ')}`);\n log.warn(`box not fully ready (${lines.join('; ')}). Opening anyway.`);\n } else {\n log.success('all units ready');\n }\n }\n\n // Inject .vscode/tasks.json so the IDE auto-opens terminal panels.\n // (Cursor reads the same .vscode/ path; it's a VS Code fork.)\n if (autoTerminals) {\n try {\n const services = await fetchServiceNames(box.container);\n const r = await ensureAgentboxTasksFile(box.container, services, {\n regen: opts.regenTasks,\n });\n if (r.status === 'wrote') {\n log.info(`wrote /workspace/.vscode/tasks.json (${String(services.length)} service(s))`);\n } else if (r.status === 'skipped-user-owned') {\n log.warn(\n 'user-owned .vscode/tasks.json detected; skipping auto-terminals (pass --regen-tasks to overwrite)',\n );\n }\n } catch (err) {\n log.warn(\n `auto-terminals failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const folderUri = `vscode-remote://attached-container+${containerHex(box.container)}/workspace`;\n if (opts.print) {\n process.stdout.write(folderUri + '\\n');\n return;\n }\n const exit = await launchIde(folderUri, forcedIde);\n if (exit.code !== 0) {\n log.error(`failed to launch ${exit.flavor ? ideProfile(exit.flavor).displayName : 'IDE'} via ${exit.via} (exit ${String(exit.code)})`);\n process.stdout.write(folderUri + '\\n');\n process.exit(1);\n }\n log.success(\n `opening ${box.container} in ${ideProfile(exit.flavor).displayName} (${exit.via})`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nasync function runWaitReady(container: string, timeoutMs: string): Promise<WaitReadyReply> {\n const proc = await execInBox(\n container,\n ['agentbox-ctl', 'wait-ready', '--json', '--timeout', timeoutMs],\n { user: 'vscode' },\n );\n try {\n return JSON.parse(proc.stdout) as WaitReadyReply;\n } catch {\n throw new Error(\n `agentbox-ctl wait-ready returned unparseable output: ${proc.stderr || proc.stdout}`,\n );\n }\n}\n\ninterface LaunchResult {\n code: number;\n flavor: IdeFlavor;\n via: 'cli' | 'open';\n}\n\n/**\n * Pick an IDE and launch it.\n *\n * - With `--ide <flavor>`: require that flavor's CLI; if it's missing,\n * fall back to its own protocol-handler `open` URL (the %2B bug may\n * surface) and warn.\n * - Without `--ide`: try `code` first, then `cursor`. Whichever is found\n * first wins. If neither, fall back to `open vscode://...` last.\n *\n * The folder URI passed in is the canonical `vscode-remote://` form; Cursor\n * accepts it verbatim because it inherits VS Code's URI handling.\n */\nasync function launchIde(folderUri: string, forced?: IdeFlavor): Promise<LaunchResult> {\n if (forced) {\n return launchOne(forced, folderUri);\n }\n const code = await tryCli('vscode', folderUri);\n if (code !== null) return code;\n const cursor = await tryCli('cursor', folderUri);\n if (cursor !== null) return cursor;\n // Neither CLI present. Last resort: protocol handler via `open`. We pick\n // vscode:// since that's the documented historical fallback.\n log.warn('neither `code` nor `cursor` found in PATH; falling back to `open vscode://...`');\n return launchOne('vscode', folderUri);\n}\n\n/**\n * Try the IDE's CLI. Returns null if the binary isn't in PATH so the caller\n * can try the next flavor; otherwise returns the launch result (success or\n * non-127 failure both count as \"we ran this one\").\n */\nasync function tryCli(flavor: IdeFlavor, folderUri: string): Promise<LaunchResult | null> {\n const profile = ideProfile(flavor);\n const code = await spawnCommand(profile.cli, ['--folder-uri', folderUri]);\n if (code === 127) return null;\n return { code, flavor, via: 'cli' };\n}\n\n/**\n * Run a specific flavor: CLI first; if missing (127), fall back to the\n * flavor-specific protocol handler. Surfaces the %2B-bug warning so the user\n * knows why attach may fail if it does.\n */\nasync function launchOne(flavor: IdeFlavor, folderUri: string): Promise<LaunchResult> {\n const profile = ideProfile(flavor);\n const cliCode = await spawnCommand(profile.cli, ['--folder-uri', folderUri]);\n if (cliCode !== 127) return { code: cliCode, flavor, via: 'cli' };\n log.warn(\n `\\`${profile.cli}\\` not found in PATH; falling back to \\`open ${profile.protocolScheme}://...\\` (the %2B URL-encoding bug may break attach)`,\n );\n const url = `${profile.protocolScheme}://${folderUri.replace(/^vscode-remote:\\/\\//, 'vscode-remote/')}`;\n const fallback = await spawnCommand('open', [url]);\n return { code: fallback, flavor, via: 'open' };\n}\n\nfunction spawnCommand(cmd: string, args: string[]): Promise<number> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { stdio: 'ignore' });\n child.once('error', () => resolve(127));\n child.once('exit', (code) => resolve(code ?? -1));\n });\n}\n\nasync function fetchServiceNames(container: string): Promise<{ name: string }[]> {\n const proc = await execInBox(container, ['agentbox-ctl', 'status', '--json'], {\n user: 'vscode',\n });\n if (proc.exitCode !== 0) return [];\n try {\n const reply = JSON.parse(proc.stdout) as StatusReply;\n return reply.services.map((s) => ({ name: s.name }));\n } catch {\n return [];\n }\n}\n","import { spawnSync } from 'node:child_process';\nimport {\n configPathFor,\n KEY_REGISTRY,\n loadEffectiveConfig,\n listProjectsConfigured,\n lookupKey,\n setConfigValue,\n unsetConfigValue,\n UserConfigError,\n type ConfigScope,\n type ConfigSource,\n type LoadedConfig,\n} from '@agentbox/config';\nimport { Command, InvalidArgumentError } from 'commander';\n\ntype EditScope = ConfigScope | 'workspace';\n\ninterface ScopeOptions {\n global?: boolean;\n project?: boolean;\n}\n\ninterface EditScopeOptions extends ScopeOptions {\n workspace?: boolean;\n}\n\ninterface GetOptions {\n all?: boolean;\n json?: boolean;\n}\n\ninterface SetOptions extends ScopeOptions {\n json?: boolean;\n}\n\ninterface ListOptions {\n scope?: 'global' | 'project' | 'workspace' | 'effective';\n includeAdvanced?: boolean;\n json?: boolean;\n}\n\ninterface PathOptions extends EditScopeOptions {\n json?: boolean;\n}\n\ninterface ListProjectsOptions {\n json?: boolean;\n}\n\nfunction resolveWriteScope(opts: ScopeOptions): ConfigScope {\n if (opts.global && opts.project) {\n fail('pass at most one of --global / --project');\n }\n if (opts.global) return 'global';\n return 'project'; // default per spec\n}\n\nfunction resolveEditScope(opts: EditScopeOptions): EditScope {\n const flags = [opts.global, opts.project, opts.workspace].filter(Boolean).length;\n if (flags > 1) fail('pass at most one of --global / --project / --workspace');\n if (opts.workspace) return 'workspace';\n if (opts.global) return 'global';\n return 'project';\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`error: ${message}\\n`);\n process.exit(1);\n}\n\nfunction leafValue(loaded: LoadedConfig, key: string): unknown {\n const idx = key.indexOf('.');\n const branch = key.slice(0, idx);\n const leaf = key.slice(idx + 1);\n return (loaded.effective as unknown as Record<string, Record<string, unknown>>)[branch]?.[leaf];\n}\n\nfunction rawLeafFromValues(\n values: Record<string, unknown> | undefined,\n key: string,\n): unknown {\n if (!values) return undefined;\n const idx = key.indexOf('.');\n const b = (values as Record<string, unknown>)[key.slice(0, idx)];\n if (!b || typeof b !== 'object') return undefined;\n return (b as Record<string, unknown>)[key.slice(idx + 1)];\n}\n\nfunction describeSource(source: ConfigSource, loaded: LoadedConfig): string {\n switch (source) {\n case 'cli':\n return 'cli flag';\n case 'workspace':\n return loaded.layers.workspace.path\n ? `workspace ${loaded.layers.workspace.path}`\n : 'workspace';\n case 'project':\n return `project ${loaded.layers.project.path}`;\n case 'global':\n return `global ${loaded.layers.global.path}`;\n case 'default':\n return 'built-in default';\n }\n}\n\nfunction fmtValue(v: unknown): string {\n if (v === undefined) return '<unset>';\n if (typeof v === 'string') return v;\n return String(v);\n}\n\nconst getCommand = new Command('get')\n .description('Print the effective value of a config key (with --all, show every layer)')\n .argument('<key>', 'dot-path key (e.g. box.hostSnapshot)')\n .option('--all', 'print every layer with its source')\n .option('--json', 'machine-readable output')\n .action(async (key: string, opts: GetOptions) => {\n const desc = lookupKey(key);\n if (!desc) fail(`unknown key \"${key}\"`);\n\n try {\n const loaded = await loadEffectiveConfig(process.cwd());\n const value = leafValue(loaded, key);\n const source = loaded.sources[key] ?? 'default';\n\n if (opts.json) {\n const layerView = (\n values: Record<string, unknown> | undefined,\n path: string | null,\n ): { value: unknown; path: string | null } => ({\n value: rawLeafFromValues(values, key) ?? null,\n path,\n });\n process.stdout.write(\n JSON.stringify(\n {\n key,\n value: value ?? null,\n source,\n layers: opts.all\n ? {\n cli: layerView(loaded.layers.cli.values as Record<string, unknown>, null),\n workspace: layerView(\n loaded.layers.workspace.values as Record<string, unknown>,\n loaded.layers.workspace.path,\n ),\n project: layerView(\n loaded.layers.project.values as Record<string, unknown>,\n loaded.layers.project.path,\n ),\n global: layerView(\n loaded.layers.global.values as Record<string, unknown>,\n loaded.layers.global.path,\n ),\n default: { value: leafValue({ ...loaded, effective: loaded.layers.defaults } as LoadedConfig, key) ?? null, path: null },\n }\n : undefined,\n },\n null,\n 2,\n ) + '\\n',\n );\n return;\n }\n\n if (opts.all) {\n const lines = [\n `${key}:`,\n ` effective: ${fmtValue(value)} (${describeSource(source, loaded)})`,\n ` cli: ${fmtValue(rawLeafFromValues(loaded.layers.cli.values as Record<string, unknown>, key))}`,\n ` workspace: ${fmtValue(rawLeafFromValues(loaded.layers.workspace.values as Record<string, unknown>, key))}` +\n (loaded.layers.workspace.path ? ` ${loaded.layers.workspace.path}` : ''),\n ` project: ${fmtValue(rawLeafFromValues(loaded.layers.project.values as Record<string, unknown>, key))} ${loaded.layers.project.path}`,\n ` global: ${fmtValue(rawLeafFromValues(loaded.layers.global.values as Record<string, unknown>, key))} ${loaded.layers.global.path}`,\n ` default: ${fmtValue(leafValue({ ...loaded, effective: loaded.layers.defaults } as LoadedConfig, key))}`,\n ];\n process.stdout.write(lines.join('\\n') + '\\n');\n return;\n }\n\n process.stdout.write(`${key} = ${fmtValue(value)} (from: ${describeSource(source, loaded)})\\n`);\n } catch (err) {\n handleError(err);\n }\n });\n\nconst setCommand = new Command('set')\n .description('Set a config key in the global or per-project file (default: --project)')\n .argument('<key>', 'dot-path key (e.g. box.hostSnapshot)')\n .argument('<value>', 'value to set; coerced to the key\\'s declared type')\n .option('--global', \"write to ~/.agentbox/config.yaml\")\n .option('--project', 'write to ~/.agentbox/projects/<hash>/config.yaml (default)')\n .action(async (key: string, value: string, opts: SetOptions) => {\n const scope = resolveWriteScope(opts);\n try {\n const r = await setConfigValue(scope, key, value, process.cwd(), { raw: true });\n if (opts.json) {\n process.stdout.write(\n JSON.stringify({ key, scope, value: r.coerced, path: r.path }, null, 2) + '\\n',\n );\n } else {\n process.stdout.write(`${key} = ${fmtValue(r.coerced)} (wrote ${r.path})\\n`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\nconst unsetCommand = new Command('unset')\n .description('Remove a config key from the global or per-project file (default: --project)')\n .argument('<key>', 'dot-path key (e.g. box.hostSnapshot)')\n .option('--global', \"edit ~/.agentbox/config.yaml\")\n .option('--project', 'edit ~/.agentbox/projects/<hash>/config.yaml (default)')\n .action(async (key: string, opts: ScopeOptions) => {\n const scope = resolveWriteScope(opts);\n try {\n const r = await unsetConfigValue(scope, key, process.cwd());\n if (r.existed) {\n process.stdout.write(`removed ${key} from ${r.path}\\n`);\n } else {\n process.stdout.write(`${key} was not set in ${r.path}\\n`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\nfunction parseListScope(value: string): ListOptions['scope'] {\n if (value === 'global' || value === 'project' || value === 'workspace' || value === 'effective') {\n return value;\n }\n throw new InvalidArgumentError(`expected one of: global, project, workspace, effective`);\n}\n\nconst listCommand = new Command('list')\n .description('List config values, either for a single layer or the merged effective view')\n .option(\n '--scope <s>',\n 'one of: global, project, workspace, effective (default: effective)',\n parseListScope,\n 'effective',\n )\n .option('--include-advanced', 'include advanced keys (image, ports)')\n .option('--json', 'machine-readable output')\n .action(async (opts: ListOptions) => {\n try {\n const loaded = await loadEffectiveConfig(process.cwd());\n const scope = opts.scope ?? 'effective';\n const showAdvanced = !!opts.includeAdvanced;\n const visibleKeys = KEY_REGISTRY.filter((d) => showAdvanced || !d.advanced);\n\n if (opts.json) {\n const obj: Record<string, unknown> = {};\n for (const desc of visibleKeys) {\n const value = pickFromScope(loaded, scope, desc.key);\n obj[desc.key] = scope === 'effective'\n ? { value: value ?? null, source: loaded.sources[desc.key] ?? 'default' }\n : { value: value ?? null };\n }\n process.stdout.write(JSON.stringify({ scope, keys: obj }, null, 2) + '\\n');\n return;\n }\n\n if (scope === 'effective') {\n const lines: string[] = [];\n for (const desc of visibleKeys) {\n const value = leafValue(loaded, desc.key);\n const source = loaded.sources[desc.key] ?? 'default';\n lines.push(`${desc.key.padEnd(28)} ${fmtValue(value).padEnd(20)} (${source})`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n return;\n }\n\n const layerPath =\n scope === 'global'\n ? loaded.layers.global.path\n : scope === 'project'\n ? loaded.layers.project.path\n : loaded.layers.workspace.path;\n process.stdout.write(`# ${scope} ${layerPath ?? '(no agentbox.yaml in ancestors)'}\\n`);\n let any = false;\n for (const desc of visibleKeys) {\n const v = pickFromScope(loaded, scope, desc.key);\n if (v === undefined) continue;\n any = true;\n process.stdout.write(`${desc.key.padEnd(28)} ${fmtValue(v)}\\n`);\n }\n if (!any) process.stdout.write('(no values set in this scope)\\n');\n } catch (err) {\n handleError(err);\n }\n });\n\nfunction pickFromScope(loaded: LoadedConfig, scope: ListOptions['scope'], key: string): unknown {\n switch (scope) {\n case 'global':\n return rawLeafFromValues(loaded.layers.global.values as Record<string, unknown>, key);\n case 'project':\n return rawLeafFromValues(loaded.layers.project.values as Record<string, unknown>, key);\n case 'workspace':\n return rawLeafFromValues(loaded.layers.workspace.values as Record<string, unknown>, key);\n case 'effective':\n default:\n return leafValue(loaded, key);\n }\n}\n\nconst pathCommand = new Command('path')\n .description('Print the file path for a config scope (default: --project)')\n .option('--global', \"~/.agentbox/config.yaml\")\n .option('--project', '~/.agentbox/projects/<hash>/config.yaml (default)')\n .option('--workspace', './agentbox.yaml (resolved by walking up to the nearest one)')\n .option('--json', 'machine-readable output')\n .action(async (opts: PathOptions) => {\n try {\n const scope = resolveEditScope(opts);\n const path = await configPathFor(scope, process.cwd());\n if (opts.json) process.stdout.write(JSON.stringify({ scope, path }, null, 2) + '\\n');\n else process.stdout.write(`${path}\\n`);\n } catch (err) {\n handleError(err);\n }\n });\n\nconst editCommand = new Command('edit')\n .description('Open a config file in $EDITOR (default: --project)')\n .option('--global', 'edit ~/.agentbox/config.yaml')\n .option('--project', 'edit ~/.agentbox/projects/<hash>/config.yaml (default)')\n .option('--workspace', \"edit ./agentbox.yaml (the resolved one — and remember to fill in the `defaults:` block)\")\n .action(async (opts: EditScopeOptions) => {\n try {\n const scope = resolveEditScope(opts);\n const path = await configPathFor(scope, process.cwd());\n const editor = process.env['EDITOR'] || process.env['VISUAL'] || 'vi';\n const child = spawnSync(editor, [path], { stdio: 'inherit' });\n process.exit(child.status ?? 0);\n } catch (err) {\n handleError(err);\n }\n });\n\nconst listProjectsCommand = new Command('list-projects')\n .description('List directories that have per-user-per-project config recorded under ~/.agentbox/projects/')\n .option('--json', 'machine-readable output')\n .action(async (opts: ListProjectsOptions) => {\n try {\n const projects = await listProjectsConfigured();\n if (opts.json) {\n process.stdout.write(JSON.stringify(projects, null, 2) + '\\n');\n return;\n }\n if (projects.length === 0) {\n process.stdout.write('(no per-project config recorded)\\n');\n return;\n }\n for (const p of projects) {\n process.stdout.write(\n `${p.hash} ${p.originalPath}${p.hasConfigFile ? '' : ' (meta only — no config.yaml)'}\\n`,\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n\nfunction handleError(err: unknown): never {\n if (err instanceof UserConfigError) {\n process.stderr.write(`error: ${err.message}\\n`);\n process.exit(2);\n }\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`error: ${msg}\\n`);\n process.exit(1);\n}\n\nexport const configCommand = new Command('config')\n .description('Read / write layered config (global, per-project, workspace `defaults:` block)')\n .addCommand(getCommand)\n .addCommand(setCommand)\n .addCommand(unsetCommand)\n .addCommand(listCommand)\n .addCommand(pathCommand)\n .addCommand(editCommand)\n .addCommand(listProjectsCommand);\n","import { intro, log, outro, spinner } from '@clack/prompts';\nimport {\n bumpProjectGcCounter,\n findProjectRoot,\n loadEffectiveConfig,\n pruneOrphanProjectConfigs,\n type UserConfig,\n} from '@agentbox/config';\nimport { createBox, listBoxes } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { execSync, spawnSync } from 'node:child_process';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { resolveLimits } from '../limits.js';\nimport {\n maybeRunSetupWizard,\n passthroughFlags,\n WIZARD_AUTOLAUNCH_ENV,\n} from '../wizard.js';\nimport { claudeCommand } from './claude.js';\n\ninterface CreateOptions {\n workspace: string;\n name?: string;\n hostSnapshot?: boolean; // commander: --host-snapshot / --no-host-snapshot => true / false / undefined\n snapshot?: string; // --snapshot <ref>: start from this checkpoint\n image?: string;\n attach?: boolean;\n yes?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n}\n\nfunction buildCliOverrides(opts: CreateOptions): Partial<UserConfig> {\n const box: NonNullable<UserConfig['box']> = {};\n if (opts.hostSnapshot !== undefined) box.hostSnapshot = opts.hostSnapshot;\n if (opts.image !== undefined) box.image = opts.image;\n if (opts.withPlaywright === true) box.withPlaywright = true;\n if (opts.withEnv === true) box.withEnv = true;\n if (opts.vnc === false) box.vnc = false;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n return Object.keys(box).length > 0 ? { box } : {};\n}\n\nfunction resolveUseSnapshot(\n opts: CreateOptions,\n configDefault: boolean | undefined,\n): boolean {\n // host-snapshot (frozen APFS clone of the host workspace): on by default;\n // explicit CLI flag wins, then config layers. No interactive prompt — power\n // users override via `--no-host-snapshot` or `box.hostSnapshot: false`.\n if (opts.hostSnapshot === false) return false;\n if (opts.hostSnapshot === true) return true;\n return configDefault ?? true;\n}\n\n/**\n * Checkpoint to start from: explicit `--snapshot <ref>` wins, else the\n * project's `box.defaultCheckpoint` (empty string = none).\n */\nfunction resolveCheckpointRef(\n opts: CreateOptions,\n configDefault: string,\n): string | undefined {\n if (opts.snapshot && opts.snapshot.length > 0) return opts.snapshot;\n return configDefault.length > 0 ? configDefault : undefined;\n}\n\nfunction attachShell(container: string): never {\n // execSync is fine here: we hand control to docker exec and exit on its exit.\n const child = spawnSync('docker', ['exec', '-it', container, 'bash'], {\n stdio: 'inherit',\n });\n process.exit(child.status ?? 0);\n}\n\nexport const createCommand = new Command('create')\n .description('Create and start a new agent box (Docker container with FUSE overlay)')\n .option('-w, --workspace <path>', 'host workspace to mount', process.cwd())\n .option('-n, --name <name>', 'friendly box name (default: <workspace-basename>-<id>)')\n .option('--host-snapshot', 'use a frozen APFS clone of the host workspace as the overlay lower')\n .option('--no-host-snapshot', 'bind the live workspace directly (host edits leak into reads)')\n .option(\n '--snapshot <ref>',\n 'start from a project checkpoint (see `agentbox checkpoint`); overrides box.defaultCheckpoint',\n )\n .option('--image <ref>', 'override the box image', undefined)\n .option('--attach', 'drop into a shell inside the box after it is ready')\n .option('--with-playwright', 'also install @playwright/cli@latest globally inside the box')\n .option(\n '--with-env',\n 'copy host env/config files (.env*, secrets.toml, agentbox.yaml, ...) into /workspace at create time (gitignore-bypassing)',\n )\n .option('--no-vnc', 'disable the per-box Xvnc + noVNC web client (on by default)')\n .option(\n '--shared-docker-cache',\n \"use the shared 'agentbox-docker-cache' volume for in-box docker images (preserved on destroy; only one box can run at a time when set)\",\n )\n .option('--memory <size>', 'memory ceiling (e.g. 512m, 2g); unset = unlimited')\n .option('--cpus <n>', 'CPU count cap (fractional ok, e.g. 1.5); unset = unlimited')\n .option('--pids-limit <n>', 'max process count (PIDs cgroup); unset = unlimited')\n .option('--disk <size>', 'best-effort writable-layer size (e.g. 10g); no-op on overlay2/macOS')\n .option('-y, --yes', 'skip prompts, accept defaults (host-snapshot=on)')\n .action(async (opts: CreateOptions) => {\n intro('agentbox create');\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const checkpointRef = resolveCheckpointRef(opts, cfg.effective.box.defaultCheckpoint);\n\n // First-run wizard: when no agentbox.yaml exists, optionally hand off to\n // `agentbox claude` so the agent can interactively generate one. Skipped\n // when starting from a checkpoint (it already carries the config).\n const wiz = await maybeRunSetupWizard({\n workspace: opts.workspace,\n yes: !!opts.yes,\n command: 'create',\n checkpointRef,\n });\n if (wiz.action === 'switch-to-claude') {\n process.env[WIZARD_AUTOLAUNCH_ENV] = '1';\n try {\n await claudeCommand.parseAsync(passthroughFlags(opts), { from: 'user' });\n } finally {\n delete process.env[WIZARD_AUTOLAUNCH_ENV];\n }\n return;\n }\n\n const useSnapshot = resolveUseSnapshot(opts, cfg.effective.box.hostSnapshot);\n\n const s = spinner();\n s.start('creating box');\n try {\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set in any layer.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n const result = await createBox({\n workspacePath: opts.workspace,\n name: opts.name,\n useSnapshot,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => s.message(clampSpinnerLine(line)),\n });\n s.stop(`box ${result.record.container} ready`);\n\n log.info(`id: ${result.record.id}`);\n if (typeof result.record.projectIndex === 'number') {\n log.info(`n: ${String(result.record.projectIndex)} (in ${projectRoot})`);\n }\n log.info(`container: ${result.record.container}`);\n log.info(`image: ${result.record.image}${result.imageBuilt ? ' (built just now)' : ''}`);\n log.info(`lower: ${result.record.lowerPath}`);\n log.info(`upper: ${result.record.upperVolume}`);\n if (result.record.snapshotDir) {\n log.info(`snapshot: ${result.record.snapshotDir}`);\n }\n if (result.record.checkpointSource) {\n log.info(\n `checkpoint: ${result.record.checkpointSource.ref} (${result.record.checkpointSource.type})`,\n );\n }\n\n for (const check of result.overlayChecks) {\n log.success(`${check.name} — ${check.detail}`);\n }\n\n log.message(\n [\n '',\n 'Try it:',\n ` docker exec -it ${result.record.container} bash`,\n ` docker exec ${result.record.container} ls /workspace`,\n '',\n 'Destroy:',\n ` docker rm -f ${result.record.container}`,\n ` docker volume rm ${result.record.upperVolume}`,\n ].join('\\n'),\n );\n\n // Periodic best-effort housekeeping: every Nth create, reap per-project\n // config dirs whose source workspace folder was deleted. Must never fail\n // or slow down create.\n const m = cfg.effective.maintenance;\n if (m.pruneProjectConfigs) {\n try {\n const n = await bumpProjectGcCounter();\n if (n % m.pruneProjectConfigsEvery === 0) {\n const boxes = await listBoxes();\n const protectedPaths = boxes\n .map((b) => b.projectRoot)\n .filter((p): p is string => typeof p === 'string');\n const res = await pruneOrphanProjectConfigs({ protectedPaths });\n if (res.removed.length > 0) {\n log.info(\n `cleaned ${String(res.removed.length)} orphan project config dir(s): ` +\n res.removed.map((r) => r.originalPath).join(', '),\n );\n }\n }\n } catch {\n /* best-effort: project-config GC must never break create */\n }\n }\n\n outro('done');\n\n if (opts.attach) {\n attachShell(result.record.container);\n }\n } catch (err) {\n s.stop('failed');\n const msg = err instanceof Error ? err.message : String(err);\n log.error(msg);\n // Help the user clean up partial state.\n try {\n const running = execSync('docker ps --format \"{{.Names}}\"', {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString()\n .split('\\n')\n .filter((n) => n.startsWith('agentbox-'));\n if (running.length > 0) {\n log.warn(`leftover containers: ${running.join(', ')}`);\n log.warn(`remove with: docker rm -f ${running.join(' ')}`);\n }\n } catch {\n /* best-effort */\n }\n process.exit(1);\n }\n });\n","import { spawn } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { findProjectRoot, loadEffectiveConfig } from '@agentbox/config';\nimport {\n buildClaudeDashboardAttachArgv,\n buildShellArgv,\n claudeSessionInfo,\n createBox,\n destroyBox,\n ensureBoxBrowser,\n listBoxes,\n pauseBox,\n rebuildPluginNativeDeps,\n startBox,\n startClaudeSession,\n stopBox,\n unpauseBox,\n type ListedBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { resolveClaudeAuth } from '../auth.js';\nimport { resolveLimits } from '../limits.js';\nimport { Compositor, type RightTarget } from '../dashboard/compositor.js';\nimport type { PtySpawn, TerminalCtor } from '../dashboard/pty-session.js';\nimport { NEW_BOX_ID, NEW_BOX_LABEL, type SidebarBox } from '../dashboard/sidebar.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DashboardOptions {\n project?: boolean;\n}\n\n/**\n * Sidebar / switch order: group by project (so the global view doesn't\n * interleave per-project indices), then projectIndex, then name.\n */\nfunction sortBoxes(boxes: ListedBox[]): ListedBox[] {\n return [...boxes].sort((a, b) => {\n const ap = a.projectRoot ?? '';\n const bp = b.projectRoot ?? '';\n if (ap !== bp) return ap.localeCompare(bp);\n const ai = a.projectIndex ?? Number.POSITIVE_INFINITY;\n const bi = b.projectIndex ?? Number.POSITIVE_INFINITY;\n if (ai !== bi) return ai - bi;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction scoped(all: boolean, projectRoot: string, boxes: ListedBox[]): ListedBox[] {\n return sortBoxes(all ? boxes : boxes.filter((b) => b.projectRoot === projectRoot));\n}\n\nfunction toSidebar(b: ListedBox): SidebarBox {\n return {\n id: b.id,\n name: b.name,\n state: b.state,\n claudeActivity: b.claudeActivity,\n sessionTitle: b.claudeSessionTitle,\n index: b.projectIndex,\n project: b.projectRoot,\n };\n}\n\nexport const dashboardCommand = new Command('dashboard')\n .description('Box list + the selected box live Agent session')\n .argument('[box]', 'initial box (default: first running box; -p restricts to the cwd project)')\n .option('-p, --project', \"only this project's boxes (default: all boxes globally)\")\n .action(async (idOrName: string | undefined, opts: DashboardOptions) => {\n try {\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n log.error('agentbox dashboard needs an interactive terminal');\n process.exit(2);\n }\n\n // node-pty is an optionalDependency and @xterm/headless is CJS — both are\n // dynamic-imported here so a missing native prebuild (or the CJS named\n // export issue) degrades only the dashboard, never the rest of the CLI.\n let ptySpawn: PtySpawn;\n let termCtor: TerminalCtor;\n try {\n const ptyMod = (await import('@homebridge/node-pty-prebuilt-multiarch')) as Record<\n string,\n unknown\n >;\n const xtermMod = (await import('@xterm/headless')) as Record<string, unknown>;\n const spawn =\n (ptyMod['spawn'] as unknown) ??\n (ptyMod['default'] as Record<string, unknown> | undefined)?.['spawn'];\n const Terminal =\n (xtermMod['Terminal'] as unknown) ??\n (xtermMod['default'] as Record<string, unknown> | undefined)?.['Terminal'];\n if (typeof spawn !== 'function' || typeof Terminal !== 'function') {\n throw new Error('terminal backend missing expected exports');\n }\n ptySpawn = spawn as unknown as PtySpawn;\n termCtor = Terminal as unknown as TerminalCtor;\n } catch {\n log.error(\n 'agentbox dashboard is unavailable here (native terminal backend failed to load)',\n );\n log.info('use `agentbox claude` / `agentbox claude attach` instead');\n process.exit(2);\n }\n\n const project = await findProjectRoot(process.cwd());\n let showAll = !opts.project; // default: every box globally; -p scopes to cwd project\n const full = await listBoxes();\n const scoped0 = scoped(showAll, project.root, full);\n\n let initialId: string;\n if (idOrName !== undefined) {\n const picked = await resolveBoxOrExit(idOrName);\n initialId = picked.id;\n if (!scoped0.some((b) => b.id === picked.id)) showAll = true; // widen so it shows\n } else if (scoped0.length === 0) {\n // No boxes yet — land on the synthetic create entry instead of bailing.\n initialId = NEW_BOX_ID;\n } else {\n initialId = (scoped0.find((b) => b.state === 'running') ?? scoped0[0]!).id;\n }\n\n const newBoxEntry: SidebarBox = { id: NEW_BOX_ID, name: NEW_BOX_LABEL, state: 'new' };\n const listCandidates = async (): Promise<SidebarBox[]> => [\n newBoxEntry,\n ...scoped(showAll, project.root, await listBoxes()).map(toSidebar),\n ];\n\n const resolveTarget = async (boxId: string): Promise<RightTarget> => {\n if (boxId === NEW_BOX_ID) return { kind: 'create-menu', where: project.root };\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return { kind: 'placeholder', lines: ['', ' box not found'] };\n if (box.state === 'paused' || box.state === 'stopped') {\n return { kind: 'lifecycle-menu', state: box.state };\n }\n if (box.state !== 'running') {\n return {\n kind: 'placeholder',\n lines: [\n '',\n ` box ${box.name} is ${box.state}.`,\n ` Start it: agentbox start ${box.name}`,\n ],\n };\n }\n const info = await claudeSessionInfo(box.container);\n if (info.running) {\n return {\n kind: 'attach',\n argv: buildClaudeDashboardAttachArgv(box.container, info.sessionName),\n };\n }\n return { kind: 'menu' };\n };\n\n const findBox = async (boxId: string): Promise<ListedBox> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) throw new Error('box not found');\n if (box.state !== 'running') throw new Error(`box is ${box.state}`);\n return box;\n };\n\n const startClaude = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n // Idempotent + marker-gated: needed the first time a box that never ran\n // Claude starts one; a no-op afterwards. (No host ~/.claude re-sync —\n // already synced at `agentbox create`; == `claude start --no-sync-config`.)\n await rebuildPluginNativeDeps(box.container, {\n volume: box.claudeConfigVolume,\n });\n await startClaudeSession({ container: box.container, claudeArgs: [], boxName: box.name });\n const info = await claudeSessionInfo(box.container);\n return {\n kind: 'attach',\n argv: buildClaudeDashboardAttachArgv(box.container, info.sessionName),\n mode: 'claude',\n };\n };\n\n const openShell = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n return { kind: 'attach', argv: buildShellArgv(box.container), mode: 'shell' };\n };\n\n // Non-interactive box creation from the \"+ New box\" entry: config\n // defaults only (no CLI overrides, no wizard, no setup-token prompt —\n // the TUI can't prompt). Mirrors the `agentbox claude` create block.\n const createNewBox = async (\n withClaude: boolean,\n onProgress: (line: string) => void,\n ): Promise<{ boxId: string; attach?: RightTarget }> => {\n const cfg = await loadEffectiveConfig(project.root);\n const auth = await resolveClaudeAuth(process.env);\n const checkpointRef =\n cfg.effective.box.defaultCheckpoint.length > 0\n ? cfg.effective.box.defaultCheckpoint\n : undefined;\n const result = await createBox({\n workspacePath: project.root,\n useSnapshot: cfg.effective.box.hostSnapshot ?? true,\n checkpointRef,\n image: cfg.effective.box.image,\n claudeConfig: { isolate: cfg.effective.box.isolateClaudeConfig },\n claudeEnv: auth.env,\n withPlaywright:\n cfg.effective.box.withPlaywright ||\n cfg.effective.browser.default !== 'agent-browser',\n withEnv: cfg.effective.box.withEnv,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n limits: resolveLimits(cfg.effective.box, {}),\n projectRoot: project.root,\n onLog: onProgress,\n });\n if (!withClaude) return { boxId: result.record.id };\n await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume,\n });\n await startClaudeSession({\n container: result.record.container,\n claudeArgs: [],\n boxName: result.record.name,\n });\n const info = await claudeSessionInfo(result.record.container);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n argv: buildClaudeDashboardAttachArgv(result.record.container, info.sessionName),\n mode: 'claude',\n },\n };\n };\n\n // Detached + stdio ignored: never blocks the dashboard loop and can't\n // write into the alt-screen. (`open` mirrors browser.ts but not\n // spawnSync/inherit, which would corrupt the TUI.)\n const detach = (cmd: string, args: string[]): void => {\n spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();\n };\n\n const findEndpointUrl = async (\n boxId: string,\n kind: 'vnc' | 'web',\n ): Promise<{ name: string; url: string | null }> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return { name: boxId, url: null };\n const ep = box.endpoints.endpoints.find((e) => e.kind === kind);\n return { name: box.name, url: ep && ep.reachable && ep.url ? ep.url : null };\n };\n\n // The box web-app URL plus whether a service actually declares `expose:`\n // (engine-independent: the `web` endpoint is only reachable+url'd when a\n // service is exposed and the host port is resolved). On OrbStack prefer\n // the stable <container>.orb.local domain (routes to :80; WebProxy\n // forwards to the exposed service) over the loopback port, which Docker\n // reallocates on every restart. Mirrors `agentbox browser`. Other\n // engines have no `.local` DNS, so use the published loopback endpoint.\n const webTarget = (box: ListedBox): { url: string; exposed: boolean } => {\n const ep = box.endpoints.endpoints.find((e) => e.kind === 'web');\n const exposed = Boolean(ep && ep.reachable && ep.url);\n const url = box.endpoints.domainIsOrb\n ? `http://${box.endpoints.domain}`\n : exposed && ep?.url\n ? ep.url\n : `http://${box.endpoints.domain}`;\n return { url, exposed };\n };\n\n const openVnc = async (boxId: string): Promise<string> => {\n const { url } = await findEndpointUrl(boxId, 'vnc');\n if (!url) return 'VNC not available for this box';\n let exposedWebUrl: string | null = null;\n try {\n const box = await findBox(boxId);\n const web = webTarget(box);\n if (web.exposed) exposedWebUrl = web.url;\n const br = await ensureBoxBrowser(box.container);\n if (!br.up) return `VNC: in-box browser unavailable (${br.reason ?? 'box not running?'})`;\n } catch {\n // Best-effort — still open the viewer even if the box isn't running.\n }\n detach('open', [url]);\n if (exposedWebUrl) {\n detach('open', [exposedWebUrl]);\n return 'Opening VNC + web in browser…';\n }\n return 'Opening VNC in browser…';\n };\n\n const openWeb = async (boxId: string): Promise<string> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return 'box not found';\n const { url } = webTarget(box);\n detach('open', [url]);\n return `Opening ${url.replace(/^https?:\\/\\//, '')}…`;\n };\n\n const openCode = async (boxId: string): Promise<string> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) return 'box not found';\n // Reuse the real `agentbox code` out-of-process (IDE detection,\n // code→cursor fallback) without its up-to-120s wait-ready blocking us.\n detach(process.execPath, [process.argv[1]!, 'code', box.name, '--no-wait']);\n return 'Launching VS Code / Cursor…';\n };\n\n const resumeBox = async (boxId: string): Promise<void> => {\n const box = (await listBoxes()).find((b) => b.id === boxId);\n if (!box) throw new Error('box not found');\n if (box.state === 'paused') await unpauseBox(box.id);\n else await startBox(box.id);\n };\n\n const pauseBoxAction = async (boxId: string): Promise<void> => {\n await pauseBox(boxId);\n };\n\n const stopBoxAction = async (boxId: string): Promise<void> => {\n await stopBox(boxId);\n };\n\n const destroyBoxAction = async (boxId: string): Promise<void> => {\n await destroyBox(boxId);\n };\n\n const compositor = new Compositor(\n {\n ptySpawn,\n termCtor,\n listCandidates,\n resolveTarget,\n startClaude,\n openShell,\n createNewBox,\n resumeBox,\n pauseBox: pauseBoxAction,\n stopBox: stopBoxAction,\n destroyBox: destroyBoxAction,\n openVnc,\n openCode,\n openWeb,\n },\n initialId,\n );\n await compositor.run();\n process.exit(0);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","/** Rect in 0-based screen coordinates (top-left origin). */\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface DashboardLayout {\n cols: number;\n rows: number;\n sidebar: Rect;\n /** Single column separator between sidebar and right pane. */\n sepX: number;\n right: Rect;\n /** Full-width status line, single row at the bottom. */\n statusY: number;\n /** Right pane too small to host a usable terminal. */\n tooSmall: boolean;\n}\n\nexport const SIDEBAR_WIDTH = 32;\nconst MIN_RIGHT_W = 20;\nconst MIN_RIGHT_H = 4;\n\nexport function computeLayout(cols: number, rows: number): DashboardLayout {\n const sidebarW = Math.min(SIDEBAR_WIDTH, Math.max(0, cols - MIN_RIGHT_W - 1));\n const sepX = sidebarW;\n const rightX = sidebarW + 1;\n const rightW = Math.max(0, cols - rightX);\n const statusY = rows - 1;\n const paneH = Math.max(0, statusY); // rows above the status line\n return {\n cols,\n rows,\n sidebar: { x: 0, y: 0, w: sidebarW, h: paneH },\n sepX,\n right: { x: rightX, y: 0, w: rightW, h: paneH },\n statusY,\n tooSmall: rightW < MIN_RIGHT_W || paneH < MIN_RIGHT_H,\n };\n}\n","import type { Rect } from './layout.js';\n\n/**\n * A terminal cell, abstracted from @xterm/headless so the renderer stays pure\n * and unit-testable with a hand-rolled grid (no xterm, no docker).\n */\nexport interface CellLike {\n /** 1 normal, 2 wide (CJK), 0 = trailing half of a wide char (skip). */\n width: number;\n /** Glyph(s); '' for a never-written cell (render as space). */\n chars: string;\n fg: ColorSpec;\n bg: ColorSpec;\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n invisible: boolean;\n strike: boolean;\n}\n\nexport type ColorSpec =\n | { kind: 'default' }\n | { kind: 'palette'; n: number }\n | { kind: 'rgb'; rgb: number };\n\nexport interface ScreenSnapshot {\n cols: number;\n rows: number;\n cursor: { x: number; y: number; visible: boolean };\n cell(x: number, y: number): CellLike;\n}\n\nconst RESET = '\\x1b[0m';\n\nfunction fgParams(c: ColorSpec): string {\n if (c.kind === 'default') return '39';\n if (c.kind === 'palette') {\n const n = c.n;\n if (n < 8) return String(30 + n);\n if (n < 16) return String(90 + (n - 8));\n return `38;5;${String(n)}`;\n }\n return `38;2;${String((c.rgb >> 16) & 0xff)};${String((c.rgb >> 8) & 0xff)};${String(c.rgb & 0xff)}`;\n}\n\nfunction bgParams(c: ColorSpec): string {\n if (c.kind === 'default') return '49';\n if (c.kind === 'palette') {\n const n = c.n;\n if (n < 8) return String(40 + n);\n if (n < 16) return String(100 + (n - 8));\n return `48;5;${String(n)}`;\n }\n return `48;2;${String((c.rgb >> 16) & 0xff)};${String((c.rgb >> 8) & 0xff)};${String(c.rgb & 0xff)}`;\n}\n\n/** Full SGR (always reset-prefixed) for a cell. Run-length collapsed by caller. */\nexport function sgrFor(cell: CellLike): string {\n const parts = ['0', fgParams(cell.fg), bgParams(cell.bg)];\n if (cell.bold) parts.push('1');\n if (cell.dim) parts.push('2');\n if (cell.italic) parts.push('3');\n if (cell.underline) parts.push('4');\n if (cell.inverse) parts.push('7');\n if (cell.invisible) parts.push('8');\n if (cell.strike) parts.push('9');\n return `\\x1b[${parts.join(';')}m`;\n}\n\n/**\n * Compose one screen row into a payload string: SGR runs + glyphs, exactly\n * `cols` columns wide (NullCells render as spaces, so the row self-pads).\n * Emits a new SGR only when it changes from the previous cell (run-length).\n */\nexport function composeRow(snap: ScreenSnapshot, y: number): string {\n let out = '';\n let lastSgr = '';\n for (let x = 0; x < snap.cols; x++) {\n const cell = snap.cell(x, y);\n if (cell.width === 0) continue; // trailing half of a wide glyph\n const sgr = sgrFor(cell);\n if (sgr !== lastSgr) {\n out += sgr;\n lastSgr = sgr;\n }\n out += cell.chars === '' ? ' ' : cell.chars;\n }\n return out + RESET;\n}\n\nfunction cursorTo(row0: number, col0: number): string {\n // ANSI is 1-based.\n return `\\x1b[${String(row0 + 1)};${String(col0 + 1)}H`;\n}\n\nexport interface FrameResult {\n /** Bytes to write to the host terminal (may be empty if nothing changed). */\n out: string;\n /** New per-pane-row payload cache for the next diff. */\n rows: string[];\n}\n\n/**\n * Diff `snap` against the previous frame's row cache and produce the minimal\n * write to update the right-pane `rect`. Pass `prev = null` to force a full\n * repaint (initial draw / post-resize).\n */\nexport function diffFrame(\n prev: string[] | null,\n snap: ScreenSnapshot,\n rect: Rect,\n): FrameResult {\n const h = Math.min(rect.h, snap.rows);\n const rows: string[] = new Array<string>(h);\n let out = '\\x1b[?25l'; // hide cursor while painting to avoid streaking\n for (let i = 0; i < h; i++) {\n const payload = composeRow(snap, i);\n rows[i] = payload;\n if (prev && prev[i] === payload) continue;\n out += cursorTo(rect.y + i, rect.x) + RESET + payload + RESET;\n }\n if (snap.cursor.visible) {\n const cy = Math.min(Math.max(snap.cursor.y, 0), h - 1);\n const cx = Math.min(Math.max(snap.cursor.x, 0), rect.w - 1);\n out += cursorTo(rect.y + cy, rect.x + cx) + '\\x1b[?25h';\n }\n return { out, rows };\n}\n","export type InputEvent =\n | { type: 'switch'; dir: 'next' | 'prev' }\n | { type: 'quit' }\n | { type: 'action'; name: 'vnc' | 'code' | 'web' | 'pause' | 'stop' | 'destroy' }\n | { type: 'leader'; active: boolean }\n | { type: 'forward'; bytes: Buffer };\n\nexport interface InputParserOptions {\n onEvent: (e: InputEvent) => void;\n /**\n * Map a 1-based absolute screen coordinate from a host mouse report into the\n * right pane's 1-based local coordinate. Return null to drop the event (the\n * pointer is over the sidebar/status). Omit to forward mouse unchanged.\n */\n mouseTransform?: (x: number, y: number) => { x: number; y: number } | null;\n /** Timeout after a bare leader (Ctrl-a) before it's sent through (ms). */\n leaderMs?: number;\n /** Inter-byte timeout for an unfinished escape/mouse sequence (ms). */\n escMs?: number;\n /** Injected for unit tests; defaults to global timers. */\n setTimer?: (ms: number, fn: () => void) => unknown;\n clearTimer?: (h: unknown) => void;\n}\n\nconst LEADER = 0x01; // Ctrl-a\nconst ESC = 0x1b;\n\ntype State = 'normal' | 'leader' | 'esc' | 'mouseX10';\n\n/**\n * Byte-level host-stdin parser.\n *\n * - Switch boxes: `Ctrl+Option+Up/Down` (CSI `1;7A`/`1;7B`) — the one chord\n * macOS/iTerm2 reliably emits.\n * - Everything else (vnc/code/web/quit) is a `Ctrl-a <key>` leader chord —\n * `Ctrl+Option+<letter>` is too terminal-dependent to rely on.\n *\n * Unrecognized input is forwarded verbatim to the pty, with timeout buffering\n * so a real ESC or a forwarded escape sequence is never swallowed.\n */\nexport class InputParser {\n private state: State = 'normal';\n private esc: number[] = [];\n private fwd: number[] = [];\n private timer: unknown = null;\n private timerId = 0;\n private readonly leaderMs: number;\n private readonly escMs: number;\n private readonly setTimer: (ms: number, fn: () => void) => unknown;\n private readonly clearTimer: (h: unknown) => void;\n private readonly onEvent: (e: InputEvent) => void;\n private readonly mouseTransform?: (x: number, y: number) => { x: number; y: number } | null;\n\n constructor(opts: InputParserOptions) {\n this.onEvent = opts.onEvent;\n this.mouseTransform = opts.mouseTransform;\n this.leaderMs = opts.leaderMs ?? 700;\n this.escMs = opts.escMs ?? 50;\n this.setTimer = opts.setTimer ?? ((ms, fn) => setTimeout(fn, ms) as unknown);\n this.clearTimer =\n opts.clearTimer ?? ((h) => clearTimeout(h as ReturnType<typeof setTimeout>));\n }\n\n feed(buf: Buffer): void {\n let i = 0;\n while (i < buf.length) {\n const b = buf[i]!;\n if (this.state === 'normal') {\n if (b === LEADER) {\n this.flush();\n this.state = 'leader';\n this.onEvent({ type: 'leader', active: true });\n this.arm(this.leaderMs, 'leader');\n } else if (b === ESC) {\n this.flush();\n this.state = 'esc';\n this.esc = [ESC];\n this.arm(this.escMs, 'esc');\n } else {\n this.fwd.push(b);\n }\n i++;\n continue;\n }\n if (this.state === 'leader') {\n this.disarm();\n if (b === LEADER) {\n this.fwd.push(LEADER); // double Ctrl-a → one literal Ctrl-a\n this.flush();\n } else {\n const c = String.fromCharCode(b);\n if (c === 'v') this.onEvent({ type: 'action', name: 'vnc' });\n else if (c === 'w') this.onEvent({ type: 'action', name: 'web' });\n else if (c === 'c') this.onEvent({ type: 'action', name: 'code' });\n else if (c === 's') this.onEvent({ type: 'action', name: 'stop' });\n else if (c === 'p') this.onEvent({ type: 'action', name: 'pause' });\n else if (c === 'd') this.onEvent({ type: 'action', name: 'destroy' });\n else if (c === 'q') this.onEvent({ type: 'quit' });\n else if (c === 'k') this.onEvent({ type: 'switch', dir: 'prev' });\n else if (c === 'j' || c === 'n' || c === 'N') this.onEvent({ type: 'switch', dir: 'next' });\n else {\n // Unrecognized chord: leader consumed, forward this byte only.\n this.fwd.push(b);\n this.flush();\n }\n }\n this.onEvent({ type: 'leader', active: false });\n this.state = 'normal';\n i++;\n continue;\n }\n if (this.state === 'mouseX10') {\n this.esc.push(b);\n if (this.esc.length === 6) {\n this.disarm();\n this.emitMouseX10();\n this.reset();\n } else {\n this.arm(this.escMs, 'esc');\n }\n i++;\n continue;\n }\n // state === 'esc'\n if (this.esc.length === 1) {\n if (b === 0x5b /* [ */ || b === 0x4f /* O */) {\n this.esc.push(b);\n this.arm(this.escMs, 'esc');\n i++;\n continue;\n }\n this.disarm();\n this.forwardVerbatim([ESC]);\n this.reset();\n continue; // reprocess b in 'normal'\n }\n if (this.esc[1] === 0x5b && this.esc.length === 2 && b === 0x4d /* M */) {\n this.esc.push(b); // legacy X10 mouse: ESC [ M + 3 raw bytes\n this.state = 'mouseX10';\n this.arm(this.escMs, 'esc');\n i++;\n continue;\n }\n this.esc.push(b);\n const isFinal = this.esc[1] === 0x4f ? this.esc.length === 3 : b >= 0x40 && b <= 0x7e;\n const isParam = b >= 0x20 && b <= 0x3f;\n if (isFinal) {\n this.disarm();\n this.classifyCsi();\n this.reset();\n } else if (isParam || this.esc[1] === 0x4f) {\n this.arm(this.escMs, 'esc');\n } else {\n this.disarm();\n this.forwardVerbatim(this.esc);\n this.reset();\n }\n i++;\n }\n if (this.state === 'normal') this.flush();\n }\n\n dispose(): void {\n this.disarm();\n }\n\n private classifyCsi(): void {\n const s = String.fromCharCode(...this.esc);\n if (s === '\\x1b[1;7A') return void this.onEvent({ type: 'switch', dir: 'prev' });\n if (s === '\\x1b[1;7B') return void this.onEvent({ type: 'switch', dir: 'next' });\n const m = /^\\x1b\\[<(\\d+);(\\d+);(\\d+)([Mm])$/.exec(s);\n if (m) return this.emitMouseSgr(m);\n this.forwardVerbatim(this.esc);\n }\n\n private emitMouseSgr(m: RegExpExecArray): void {\n if (!this.mouseTransform) {\n this.forwardVerbatim(this.esc);\n return;\n }\n const t = this.mouseTransform(Number(m[2]), Number(m[3]));\n if (!t) return; // over sidebar/status — drop\n this.forwardVerbatim([\n ...Buffer.from(`\\x1b[<${m[1]!};${String(t.x)};${String(t.y)}${m[4]!}`, 'latin1'),\n ]);\n }\n\n private emitMouseX10(): void {\n const e = this.esc; // ESC [ M cb cx cy\n if (e.length !== 6 || !this.mouseTransform) {\n this.forwardVerbatim(e);\n return;\n }\n const t = this.mouseTransform(e[4]! - 32, e[5]! - 32);\n if (!t) return;\n this.forwardVerbatim([0x1b, 0x5b, 0x4d, e[3]!, t.x + 32, t.y + 32]);\n }\n\n private reset(): void {\n this.state = 'normal';\n this.esc = [];\n }\n\n private flush(): void {\n if (this.fwd.length === 0) return;\n this.onEvent({ type: 'forward', bytes: Buffer.from(this.fwd) });\n this.fwd = [];\n }\n\n private forwardVerbatim(bytes: number[]): void {\n for (const x of bytes) this.fwd.push(x);\n this.flush();\n }\n\n private arm(ms: number, kind: 'leader' | 'esc'): void {\n this.disarm();\n const id = ++this.timerId;\n this.timer = this.setTimer(ms, () => {\n if (id !== this.timerId) return; // stale\n this.timer = null;\n if (kind === 'leader' && this.state === 'leader') {\n this.fwd.push(LEADER); // lone Ctrl-a → send it through\n this.flush();\n this.onEvent({ type: 'leader', active: false });\n this.state = 'normal';\n } else if (kind === 'esc' && (this.state === 'esc' || this.state === 'mouseX10')) {\n this.forwardVerbatim(this.esc);\n this.reset();\n }\n });\n }\n\n private disarm(): void {\n this.timerId++;\n if (this.timer != null) {\n this.clearTimer(this.timer);\n this.timer = null;\n }\n }\n}\n","import type { Terminal as XtermTerminal } from '@xterm/headless';\nimport type { ScreenSnapshot, CellLike, ColorSpec } from './renderer.js';\n\n/**\n * The `@xterm/headless` `Terminal` class. Injected (not imported) because\n * @xterm/headless is CJS — a static ESM named import breaks Node's loader for\n * the whole CLI, so dashboard.ts dynamic-imports it and passes the ctor here.\n */\nexport type TerminalCtor = new (opts: {\n cols: number;\n rows: number;\n allowProposedApi: boolean;\n scrollback: number;\n convertEol: boolean;\n}) => XtermTerminal;\n\n/** Minimal shape of a node-pty IPty (avoids a hard type dep on the optional module). */\nexport interface IPtyLike {\n onData(cb: (d: string) => void): void;\n onExit(cb: (e: { exitCode: number }) => void): void;\n write(d: string): void;\n resize(cols: number, rows: number): void;\n kill(): void;\n}\n\nexport type PtySpawn = (\n file: string,\n args: string[],\n opts: { name: string; cols: number; rows: number; env: NodeJS.ProcessEnv },\n) => IPtyLike;\n\nfunction fgSpec(c: {\n isFgDefault(): boolean;\n isFgPalette(): boolean;\n isFgRGB(): boolean;\n getFgColor(): number;\n}): ColorSpec {\n if (c.isFgDefault()) return { kind: 'default' };\n if (c.isFgPalette()) return { kind: 'palette', n: c.getFgColor() };\n if (c.isFgRGB()) return { kind: 'rgb', rgb: c.getFgColor() };\n return { kind: 'default' };\n}\nfunction bgSpec(c: {\n isBgDefault(): boolean;\n isBgPalette(): boolean;\n isBgRGB(): boolean;\n getBgColor(): number;\n}): ColorSpec {\n if (c.isBgDefault()) return { kind: 'default' };\n if (c.isBgPalette()) return { kind: 'palette', n: c.getBgColor() };\n if (c.isBgRGB()) return { kind: 'rgb', rgb: c.getBgColor() };\n return { kind: 'default' };\n}\n\n/**\n * Host mouse reporting is owned by the compositor, not mirrored from the inner\n * app. We enable button + SGR-coordinate reporting once for the whole dashboard\n * (the right pane is always a terminal that wants the wheel) and clear the\n * whole family on teardown — mirroring the inner app's rapid on/off toggles\n * leaves frequent windows where the host falls back to native scroll.\n */\n// 1000 = click/wheel, 1002 = button-event tracking, 1006 = SGR coords. This is\n// the exact set real tmux emits — the combination iTerm2 honors reliably (1000\n// alone is enough for xterm/VS Code but iTerm2 wants 1002 present too).\nexport const MOUSE_ENABLE_SEQ = '\\x1b[?1000h\\x1b[?1002h\\x1b[?1006h';\nconst MOUSE_MODES = [1000, 1002, 1003, 1005, 1006, 1015];\nexport const MOUSE_DISABLE_SEQ = MOUSE_MODES.map((n) => `\\x1b[?${String(n)}l`).join('');\n\nconst BLANK: CellLike = {\n width: 1,\n chars: ' ',\n fg: { kind: 'default' },\n bg: { kind: 'default' },\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n invisible: false,\n strike: false,\n};\n\n/**\n * One box's live terminal: a node-pty running `docker exec … tmux attach`\n * feeding an @xterm/headless emulator we read back as a screen grid.\n */\nexport class PtySession {\n private readonly term: XtermTerminal;\n private readonly pty: IPtyLike;\n private disposed = false;\n // Reused per cell read — valid only until the next cell() call (the renderer\n // consumes it synchronously within composeRow).\n private readonly out: CellLike = { ...BLANK };\n\n constructor(\n spawn: PtySpawn,\n TerminalClass: TerminalCtor,\n dockerArgv: string[],\n cols: number,\n rows: number,\n onRenderable: () => void,\n onExit: () => void,\n ) {\n this.term = new TerminalClass({\n cols,\n rows,\n allowProposedApi: true,\n scrollback: 0,\n convertEol: false,\n });\n this.pty = spawn('docker', dockerArgv, {\n name: 'xterm-256color',\n cols,\n rows,\n env: process.env,\n });\n this.pty.onData((d) => {\n // Read the buffer only after the parser applied this chunk.\n this.term.write(d, () => onRenderable());\n });\n this.term.onData((d) => {\n if (!this.disposed) this.pty.write(d);\n });\n // Only surface *unexpected* exits. When we kill the pty ourselves (box\n // switch / teardown) `disposed` is already true; a stale exit from a\n // just-killed session must not tear down the session that replaced it.\n this.pty.onExit(() => {\n if (!this.disposed) onExit();\n });\n }\n\n write(bytes: Buffer): void {\n if (!this.disposed) this.pty.write(bytes.toString('utf8'));\n }\n\n resize(cols: number, rows: number): void {\n if (this.disposed) return;\n this.term.resize(cols, rows);\n this.pty.resize(cols, rows);\n }\n\n snapshot(): ScreenSnapshot {\n const buf = this.term.buffer.active;\n const base = buf.baseY;\n const cell = buf.getNullCell();\n const o = this.out;\n return {\n cols: this.term.cols,\n rows: this.term.rows,\n cursor: { x: buf.cursorX, y: buf.cursorY, visible: true },\n cell: (x: number, y: number): CellLike => {\n const line = buf.getLine(base + y);\n if (!line) return BLANK;\n line.getCell(x, cell);\n o.width = cell.getWidth();\n o.chars = cell.getChars();\n o.fg = fgSpec(cell);\n o.bg = bgSpec(cell);\n o.bold = Boolean(cell.isBold());\n o.dim = Boolean(cell.isDim());\n o.italic = Boolean(cell.isItalic());\n o.underline = Boolean(cell.isUnderline());\n o.inverse = Boolean(cell.isInverse());\n o.invisible = Boolean(cell.isInvisible());\n o.strike = Boolean(cell.isStrikethrough());\n return o;\n },\n };\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n try {\n this.pty.kill();\n } catch {\n /* already gone */\n }\n this.term.dispose();\n }\n}\n","export interface SidebarBox {\n id: string;\n name: string;\n /** Container state: 'running' | 'paused' | 'stopped' | 'missing' | … */\n state: string;\n /** 'working' | 'idle' | 'waiting' | 'unknown' | undefined */\n claudeActivity?: string;\n /** The in-box terminal title Claude set, or undefined when none. */\n sessionTitle?: string;\n /** 1-based per-project box number, shown as `[N]`; undefined for\n * pre-feature boxes and the synthetic \"+ New box\" entry. */\n index?: number;\n /** Absolute project root; used to group boxes under a project header.\n * Undefined for pre-feature boxes and the synthetic \"+ New box\" entry. */\n project?: string;\n}\n\n/** Per-row ownership + styling map returned alongside the rendered lines so\n * the compositor can highlight the selected box and style headers without\n * re-deriving the (now non-uniform) layout. */\nexport interface SidebarRender {\n lines: string[];\n /** boxId rendered on row `i`, else null (banner / group header / blank). */\n rowOwner: (string | null)[];\n /** true for the banner and project-header rows (styled like the banner). */\n headerRows: boolean[];\n}\n\n/** Truncate to `max` printable chars, appending `…` when it had to cut\n * (keeps the head). */\nfunction ellipsize(s: string, max: number): string {\n if (max <= 0) return '';\n if (s.length <= max) return s;\n if (max === 1) return '…';\n return s.slice(0, max - 1) + '…';\n}\n\n/** Truncate keeping the *tail* (the distinguishing part of a box name like\n * `…-78b94c78`), prepending `…` when it had to cut. */\nfunction ellipsizeHead(s: string, max: number): string {\n if (max <= 0) return '';\n if (s.length <= max) return s;\n if (max === 1) return '…';\n return '…' + s.slice(s.length - (max - 1));\n}\n\nexport function activityCell(b: SidebarBox): string {\n if (b.state !== 'running') return `[${b.state}]`;\n switch (b.claudeActivity) {\n case 'working':\n return '● working';\n case 'idle':\n return '○ idle';\n case 'waiting':\n return '◐ waiting';\n default:\n return '? unknown';\n }\n}\n\n/** Synthetic sidebar entry pinned at the top: selecting it opens the create\n * menu. Carried in the compositor's box list like a real box (sentinel id),\n * so selection/switch/highlight need no special-casing. */\nexport const NEW_BOX_ID = '__agentbox_new__';\nexport const NEW_BOX_LABEL = '+ New box';\n\n/** Sidebar banner label (rendered into the rounded top border). */\nexport const SIDEBAR_HEADER = 'AgentBox';\n\n/** Top border that simulates a rounded frame on the top + right only (no\n * left/bottom, to save space): `╭─── AgentBox ─────…` filling exactly `w`.\n * The matching rounded top-right corner (`╮`) is drawn by the compositor at\n * the sidebar separator column. */\nfunction topBorder(label: string, w: number): string {\n const lead = `╭─── ${label} `;\n if (lead.length >= w) return lead.slice(0, w);\n return lead + '─'.repeat(w - lead.length);\n}\n/** Lines `sidebarLines` reserves before the box rows (banner + blank). The\n * compositor uses this to locate the selected box row for highlighting. */\nexport const SIDEBAR_HEADER_LINES = 2;\n\nfunction fit(s: string, w: number): string {\n if (s.length === w) return s;\n if (s.length > w) return s.slice(0, w);\n return s + ' '.repeat(w - s.length);\n}\n\n/** `s` centered in a field of `w` columns (truncated if it doesn't fit). */\nfunction center(s: string, w: number): string {\n if (s.length >= w) return s.slice(0, w);\n const pad = w - s.length;\n const leftPad = Math.floor(pad / 2);\n return ' '.repeat(leftPad) + s + ' '.repeat(pad - leftPad);\n}\n\n/** `basename` of an absolute project root, for the group header label. */\nfunction projectLabel(project: string | undefined): string {\n if (!project) return '(no project)';\n const parts = project.split('/').filter(Boolean);\n return parts[parts.length - 1] ?? project;\n}\n\n/** Strip the leading decoration Claude prepends to its terminal title (the\n * spinner glyph, e.g. `✳ `) plus any leading symbols/asterisks/space, so the\n * sidebar shows just the words. Falls back to the trimmed original if the\n * title is all decoration. */\nfunction stripTitleGlyph(s: string): string {\n const t = s.replace(/^[\\s\\p{S}*·]+/u, '');\n return t.length > 0 ? t : s.trim();\n}\n\n/**\n * Render one box row: `marker<num> <title|name> <status>`. The number and\n * the status are width-protected; the middle (title, else the box name with\n * its meaningful tail kept) flexes and ellipsizes so the status is never\n * eaten. Compact: no brackets, no glyph, single-char marker.\n */\nfunction boxRow(b: SidebarBox, marker: string, w: number): string {\n const numStr = b.index != null ? `${b.index} ` : '';\n const status = activityCell(b);\n const left = `${marker}${numStr}`;\n const room = w - left.length - status.length - 1; // 1 = gap before status\n if (room <= 0) return fit(`${left}${status}`, w);\n const middle =\n b.state === 'running' && b.sessionTitle\n ? ellipsize(stripTitleGlyph(b.sessionTitle), room)\n : ellipsizeHead(b.name, room);\n // Left segment padded so the status sits flush right within `w`.\n return fit(`${left}${middle}`, w - status.length) + status;\n}\n\n/**\n * The sidebar region as exactly `h` lines, each exactly `w` columns, plus a\n * per-row ownership/style map. Pure — no ANSI positioning (the compositor\n * places it). Boxes are grouped under a ` ── <project> ── ` header (callers\n * pass them pre-sorted by project).\n */\nexport function sidebarLines(\n boxes: SidebarBox[],\n selectedId: string,\n w: number,\n h: number,\n): SidebarRender {\n const lines: string[] = [topBorder(SIDEBAR_HEADER, w), fit('', w)];\n const rowOwner: (string | null)[] = [null, null];\n const headerRows: boolean[] = [true, false];\n const push = (line: string, owner: string | null, header: boolean): void => {\n lines.push(fit(line, w));\n rowOwner.push(owner);\n headerRows.push(header);\n };\n\n let prevProject: string | undefined;\n let seenGroup = false;\n for (const b of boxes) {\n const marker = b.id === selectedId ? '▸' : ' ';\n if (b.id === NEW_BOX_ID) {\n push(`${marker}${NEW_BOX_LABEL}`, b.id, false);\n continue;\n }\n if (!seenGroup || b.project !== prevProject) {\n push(center(` ── ${projectLabel(b.project)} ── `, w), null, true);\n prevProject = b.project;\n seenGroup = true;\n }\n push(boxRow(b, marker, w), b.id, false);\n }\n if (boxes.length === 0) push(' (no boxes)', null, false);\n while (lines.length < h) push('', null, false);\n return {\n lines: lines.slice(0, h),\n rowOwner: rowOwner.slice(0, h),\n headerRows: headerRows.slice(0, h),\n };\n}\n\n/**\n * Centered action menu for a running box with no Claude session.\n * Exactly `h` lines, each exactly `w` columns. Pure.\n */\nexport function menuLines(boxName: string, w: number, h: number): string[] {\n const body = [\n '',\n ` No Claude session in ${boxName}.`,\n '',\n ' [c] Start Claude here',\n ' [s] Open a shell',\n '',\n ' Ctrl+Option+↑/↓ switch · Ctrl-a then v/c/w/q (vnc/code/web/quit)',\n ];\n const top = Math.max(0, Math.floor((h - body.length) / 2));\n const out: string[] = [];\n for (let i = 0; i < h; i++) out.push(fit(body[i - top] ?? '', w));\n return out;\n}\n\n/**\n * Centered action menu for a non-running box (paused/stopped): resume +\n * destroy, with a two-step destroy confirm (the TUI can't show a prompt).\n * Exactly `h` lines, each exactly `w` columns. Pure.\n */\nexport function lifecycleMenuLines(\n boxName: string,\n state: 'paused' | 'stopped',\n confirmDestroy: boolean,\n w: number,\n h: number,\n): string[] {\n const body = confirmDestroy\n ? [\n '',\n ` Destroy ${boxName}?`,\n ' This removes the container and its volumes.',\n '',\n ' [y] Yes, destroy',\n ' [any other key] Cancel',\n ]\n : [\n '',\n ` Box ${boxName} is ${state}.`,\n '',\n state === 'paused' ? ' [u] Unpause' : ' [s] Start',\n ' [d] Destroy',\n '',\n ' Ctrl+Option+↑/↓ switch · Ctrl-a then q quit',\n ];\n const top = Math.max(0, Math.floor((h - body.length) / 2));\n const out: string[] = [];\n for (let i = 0; i < h; i++) out.push(fit(body[i - top] ?? '', w));\n return out;\n}\n\n/**\n * Centered menu for the synthetic \"+ New box\" entry. Exactly `h` lines, each\n * exactly `w` columns. Pure.\n */\nexport function createMenuLines(where: string, w: number, h: number): string[] {\n const body = [\n '',\n ' Create a new box',\n '',\n ' [c] Create + launch Claude',\n ' [n] Create only',\n '',\n ` in ${where}`,\n '',\n ' Ctrl+Option+↑/↓ switch · Ctrl-a then q quit',\n ];\n const top = Math.max(0, Math.floor((h - body.length) / 2));\n const out: string[] = [];\n for (let i = 0; i < h; i++) out.push(fit(body[i - top] ?? '', w));\n return out;\n}\n\n// Status-bar palette — matches the in-box tmux footer\n// (`buildClaudeStatusBarArgs`): dark bar, blue brand block, dim-grey hints\n// with white key chords.\n/** The footer/sidebar background gray. Truecolor (not palette index 236) so\n * it pins an exact RGB — terminals can remap/shade indexed colors per\n * context, which made the sidebar and status bar look like different grays.\n * Single source so the two regions can't drift. */\nexport const BAR_BG = '\\x1b[48;2;48;48;48m';\nconst BAR_BASE = BAR_BG + '\\x1b[38;5;250m';\nconst BAR_BRAND = '\\x1b[48;5;39m\\x1b[38;5;16m'; // blue block (not bold)\nconst BRAND_BOLD = '\\x1b[1m'; // box name only\nconst BRAND_NOBOLD = '\\x1b[22m';\nconst HINT_KEY = '\\x1b[38;5;255m'; // white: the key chord\nconst HINT_TXT = '\\x1b[38;5;245m'; // gray: labels + separators\nconst BAR_RESET = '\\x1b[0m';\n\n// [key chord, label]. Modifiers spelled out (no ⌥/^ glyphs); arrows use the\n// ↑/↓ glyphs. Rendered as `KEYS: label` with the chord white, label gray.\nconst SWITCH_HINT: readonly [string, string] = ['Control+Option+↑/↓', 'switch'];\nconst HINT_GROUPS: ReadonlyArray<readonly [string, string]> = [\n SWITCH_HINT,\n ['Control+a c', 'code'],\n ['Control+a v', 'vnc'],\n ['Control+a w', 'web'],\n ['Control+a q', 'quit'],\n];\n\n/** Minimal hint tier when the bar is too narrow for the full `HINT_GROUPS`:\n * box switching (always important) + the leader. Pressing `Ctrl-a` then\n * expands to `ADVANCED_HINT_GROUPS` (the compositor swaps while the leader is\n * active). */\nexport const COLLAPSED_HINT_GROUPS: ReadonlyArray<readonly [string, string]> = [\n SWITCH_HINT,\n ['Control+a', 'more'],\n];\n\n/** The expanded \"which-key\" chord menu shown while the Ctrl-a leader is\n * pending — every chord, compact (`KEY: label`), reverts on the next key. */\nexport const ADVANCED_HINT_GROUPS: ReadonlyArray<readonly [string, string]> = [\n ['c', 'code'],\n ['v', 'vnc'],\n ['w', 'web'],\n ['s', 'stop'],\n ['p', 'pause'],\n ['d', 'destroy'],\n ['q', 'quit'],\n];\n\n/**\n * Status line, exactly `w` printable columns, colored to match the in-box tmux\n * footer (dark bar, blue ` agentbox ▸ … ` brand block on the left, dim-grey\n * shortcut hints on the right). `stateLabel` overrides the box's activity text\n * (used for `shell` / `menu` panes where claudeActivity would otherwise show a\n * misleading `unknown`).\n */\nexport function statusLine(\n box: SidebarBox | undefined,\n w: number,\n stateLabel?: string,\n groups: ReadonlyArray<readonly [string, string]> = HINT_GROUPS,\n): string {\n const state =\n stateLabel ?? (box ? (box.state === 'running' ? (box.claudeActivity ?? 'unknown') : box.state) : '');\n // \"agentbox ▸ \" stays normal weight; only the box name + state are bold.\n const brandPrefix = box ? ' agentbox ▸ ' : ' agentbox ';\n // Brand *core* (no title) — the width-protected segment. The title is the\n // lowest-priority segment: it only fills space left after brand + hints.\n const base = box ? `${box.name} (${state})` : '';\n const coreMain = box ? `${base} ` : '';\n const corePlain = brandPrefix + coreMain;\n\n const SEP = ' │ ';\n const renderHints = (\n g: ReadonlyArray<readonly [string, string]>,\n ): { plain: string; styled: string } => ({\n plain: g.map(([k, l]) => `${k}: ${l}`).join(SEP) + ' ',\n styled:\n g.map(([k, l]) => `${HINT_KEY}${k}${HINT_TXT}: ${l}`).join(`${HINT_TXT}${SEP}`) + ' ',\n });\n\n // Hint tier: shortcuts beat the title. Try the requested groups; if the\n // brand core + those hints overflow, fall back to the minimal leader hint;\n // if even that overflows, render brand-core-only (title can never push the\n // box name off-screen).\n let hints: { plain: string; styled: string } | null = null;\n for (const g of [groups, COLLAPSED_HINT_GROUPS]) {\n const h = renderHints(g);\n if (corePlain.length + h.plain.length + 1 <= w) {\n hints = h;\n break;\n }\n }\n if (!hints) {\n return BAR_BASE + BAR_BRAND + fit(corePlain, w) + BAR_RESET;\n }\n\n // Title fills only the leftover, ellipsized; dropped entirely when there's\n // no meaningful room (≈ ` — ` + a few chars). Capped at 40 cols as before.\n const room = w - corePlain.length - hints.plain.length - 1;\n let titleSeg = '';\n if (box?.sessionTitle && room >= 7) {\n titleSeg = ` — ${ellipsize(box.sessionTitle, Math.min(40, room - 3))}`;\n }\n\n const leftPlain = brandPrefix + base + titleSeg + (box ? ' ' : '');\n const leftStyled =\n BAR_BRAND + brandPrefix + BRAND_BOLD + base + titleSeg + (box ? ' ' : '') + BRAND_NOBOLD;\n const gap = w - leftPlain.length - hints.plain.length;\n // brand block (name + title bold) → base bar → gap → white/gray hints.\n return (\n BAR_BASE +\n leftStyled +\n BAR_BASE +\n ' '.repeat(gap) +\n hints.styled +\n BAR_RESET\n );\n}\n","import { computeLayout, type DashboardLayout } from './layout.js';\nimport { diffFrame } from './renderer.js';\nimport { InputParser } from './input.js';\nimport {\n PtySession,\n MOUSE_ENABLE_SEQ,\n MOUSE_DISABLE_SEQ,\n type PtySpawn,\n type TerminalCtor,\n} from './pty-session.js';\nimport {\n sidebarLines,\n statusLine,\n menuLines,\n lifecycleMenuLines,\n createMenuLines,\n NEW_BOX_ID,\n ADVANCED_HINT_GROUPS,\n BAR_BG,\n type SidebarBox,\n} from './sidebar.js';\n\n// Sidebar panel styling (256-color, portable). Each sidebar line is already\n// padded to the panel width, so wrapping it in a bg SGR tints the full column.\n// Background is the footer gray (`BAR_BG`) everywhere — uniform with the status\n// bar; the selected row reads via bold bright-white text + the `▸` marker.\nconst SB_BODY = BAR_BG + '\\x1b[38;5;250m';\nconst SB_HEADER = BAR_BG + '\\x1b[38;5;39m\\x1b[1m';\nconst SB_SELECTED = BAR_BG + '\\x1b[38;5;255m\\x1b[1m';\nconst SGR_RESET = '\\x1b[0m';\n\nexport type RightTarget =\n | { kind: 'attach'; argv: string[]; mode?: 'claude' | 'shell' }\n | { kind: 'menu' }\n | { kind: 'lifecycle-menu'; state: 'paused' | 'stopped' }\n | { kind: 'create-menu'; where: string }\n | { kind: 'placeholder'; lines: string[] };\n\nexport interface CompositorDeps {\n ptySpawn: PtySpawn;\n termCtor: TerminalCtor;\n /** Scoped + sorted candidate boxes (same order the sidebar renders). */\n listCandidates: () => Promise<SidebarBox[]>;\n /** What the right pane should show for a box (attach argv / menu / message). */\n resolveTarget: (boxId: string) => Promise<RightTarget>;\n /** Start a proper Claude tmux session in the box, then resolve to attach. */\n startClaude: (boxId: string) => Promise<RightTarget>;\n /** Open an interactive shell in the box, resolve to attach. */\n openShell: (boxId: string) => Promise<RightTarget>;\n /** Create a new box (config defaults). With Claude: also start + return an\n * attach target. `onProgress` streams createBox log lines. */\n createNewBox: (\n withClaude: boolean,\n onProgress: (line: string) => void,\n ) => Promise<{ boxId: string; attach?: RightTarget }>;\n /** Resume a non-running box (unpause if paused, start if stopped). */\n resumeBox: (boxId: string) => Promise<void>;\n /** Pause a running box. */\n pauseBox: (boxId: string) => Promise<void>;\n /** Stop a running box. */\n stopBox: (boxId: string) => Promise<void>;\n /** Destroy a box (container + volumes + record). Irreversible. */\n destroyBox: (boxId: string) => Promise<void>;\n /** Host-side actions for the selected box; return a short status message. */\n openVnc: (boxId: string) => Promise<string>;\n openCode: (boxId: string) => Promise<string>;\n openWeb: (boxId: string) => Promise<string>;\n}\n\nconst POLL_MS = 1000;\nconst FRAME_MS = 16;\nconst RESIZE_DEBOUNCE_MS = 120;\n/** Keep the expanded chord footer visible this long after the Ctrl-a leader\n * resolves, so it's actually readable instead of flashing by. */\nconst LEADER_LINGER_MS = 1500;\n\n// Synchronized Output (DECSET 2026): the terminal buffers everything between\n// begin/end and presents it in one go — no partial-frame flicker/tearing.\n// Unsupported terminals ignore the unknown private mode.\nconst SYNC_BEGIN = '\\x1b[?2026h';\nconst SYNC_END = '\\x1b[?2026l';\n\nfunction cursorTo(x: number, y: number): string {\n return `\\x1b[${String(y + 1)};${String(x + 1)}H`;\n}\n\nexport class Compositor {\n private readonly out = process.stdout;\n private readonly inp = process.stdin;\n private boxes: SidebarBox[] = [];\n private selectedId: string;\n private session: PtySession | null = null;\n private placeholder: string[] | null = null;\n private menu: { boxName: string } | null = null;\n private lifecycleMenu: {\n boxName: string;\n state: 'paused' | 'stopped';\n confirmDestroy: boolean;\n } | null = null;\n private createMenu: { where: string } | null = null;\n /** True while the Ctrl-a leader is pending — swaps the footer to the\n * expanded chord menu (chrome only; never touches the right pane). */\n private leaderActive = false;\n /** Holds the expanded footer for LEADER_LINGER_MS after the leader resolves\n * (so the chord menu doesn't flash by). */\n private leaderLingerTimer: ReturnType<typeof setTimeout> | null = null;\n /** Set while a destroy confirm is pending in the status bar. */\n private pendingConfirm: { boxId: string; name: string } | null = null;\n private activeMode: 'claude' | 'shell' = 'claude';\n private flashMsg: string | null = null;\n private flashTimer: ReturnType<typeof setTimeout> | null = null;\n /** True while a start-Claude / open-shell action is in flight (suppresses\n * the poll respawn so it can't interrupt the transition). */\n private busy = false;\n private layout: DashboardLayout;\n private prevRows: string[] | null = null;\n private renderTimer: ReturnType<typeof setTimeout> | null = null;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly parser: InputParser;\n private tornDown = false;\n private resolveDone: (() => void) | null = null;\n private readonly onData = (d: Buffer): void => this.parser.feed(d);\n private readonly onResize = (): void => this.scheduleResize();\n private readonly onSig = (): void => {\n this.teardown();\n process.exit(0);\n };\n private readonly onFatal = (err: unknown): void => {\n this.teardown();\n process.stderr.write(`dashboard: ${err instanceof Error ? err.stack ?? err.message : String(err)}\\n`);\n process.exit(1);\n };\n\n constructor(\n private readonly deps: CompositorDeps,\n initialId: string,\n ) {\n this.selectedId = initialId;\n this.layout = computeLayout(this.out.columns ?? 100, this.out.rows ?? 30);\n this.parser = new InputParser({\n onEvent: (e) => {\n if (e.type === 'leader') {\n if (this.leaderLingerTimer) {\n clearTimeout(this.leaderLingerTimer);\n this.leaderLingerTimer = null;\n }\n if (e.active) {\n this.leaderActive = true;\n } else {\n // Keep the expanded footer up briefly after the chord resolves.\n this.leaderLingerTimer = setTimeout(() => {\n this.leaderLingerTimer = null;\n this.leaderActive = false;\n this.drawChrome();\n }, LEADER_LINGER_MS);\n }\n this.drawChrome();\n return;\n }\n if (this.pendingConfirm) {\n if (e.type === 'forward') {\n this.handleConfirmKey(e.bytes);\n return;\n }\n // Any non-forward event cancels the confirm, then proceeds normally.\n this.pendingConfirm = null;\n this.drawChrome();\n }\n if (e.type === 'quit') this.onSig();\n else if (e.type === 'switch') this.switchBox(e.dir);\n else if (e.type === 'action') {\n if (e.name === 'pause' || e.name === 'stop' || e.name === 'destroy') {\n void this.doLifecycle(e.name);\n } else {\n void this.doAction(e.name);\n }\n } else if (this.createMenu) this.handleCreateMenuKey(e.bytes);\n else if (this.lifecycleMenu) this.handleLifecycleMenuKey(e.bytes);\n else if (this.menu) this.handleMenuKey(e.bytes);\n else this.session?.write(e.bytes);\n },\n // Absolute 1-based host coords → right-pane-local 1-based; null = the\n // pointer is over the sidebar/status, so Claude shouldn't see it.\n mouseTransform: (x, y) => {\n const r = this.layout.right;\n if (!this.session || this.layout.tooSmall) return null;\n const lx = x - r.x;\n const ly = y - r.y;\n if (lx < 1 || ly < 1 || lx > r.w || ly > r.h) return null;\n return { x: lx, y: ly };\n },\n });\n }\n\n async run(): Promise<void> {\n this.out.write('\\x1b[?1049h\\x1b[?25l\\x1b[2J' + MOUSE_ENABLE_SEQ);\n if (this.inp.isTTY) this.inp.setRawMode(true);\n this.inp.resume();\n this.inp.on('data', this.onData);\n this.out.on('resize', this.onResize);\n process.once('SIGINT', this.onSig);\n process.once('SIGTERM', this.onSig);\n process.once('uncaughtException', this.onFatal);\n process.once('unhandledRejection', this.onFatal);\n process.once('exit', () => this.teardown());\n\n await this.refreshBoxes();\n if (!this.boxes.some((b) => b.id === this.selectedId) && this.boxes[0]) {\n this.selectedId = this.boxes[0].id;\n }\n await this.spawnActive();\n this.drawChrome();\n this.scheduleRender();\n this.pollTimer = setInterval(() => void this.poll(), POLL_MS);\n\n await new Promise<void>((resolve) => {\n this.resolveDone = resolve;\n });\n }\n\n private async refreshBoxes(): Promise<void> {\n try {\n this.boxes = await this.deps.listCandidates();\n } catch {\n /* keep last known list */\n }\n }\n\n private selectedBox(): SidebarBox | undefined {\n return this.boxes.find((b) => b.id === this.selectedId);\n }\n\n private async poll(): Promise<void> {\n const before = JSON.stringify(\n this.boxes.map((b) => [b.id, b.state, b.claudeActivity, b.sessionTitle]),\n );\n await this.refreshBoxes();\n if (this.busy) {\n // A start/shell action is mid-flight — don't yank the right pane.\n } else if (!this.boxes.some((b) => b.id === this.selectedId) && this.boxes[0]) {\n this.selectedId = this.boxes[0].id;\n await this.spawnActive();\n } else {\n // Re-resolve when: an attached box died; a not-running placeholder\n // recovered; or the menu's box stopped. The menu itself is a stable\n // state while its box runs — never respawn it (would reset the screen).\n const box = this.selectedBox();\n const running = box?.state === 'running';\n const reresolve =\n (this.session && !running) ||\n (this.placeholder && running) ||\n (this.menu && !running) ||\n (this.lifecycleMenu != null && box?.state !== this.lifecycleMenu.state);\n if (reresolve) await this.spawnActive();\n }\n if (\n JSON.stringify(\n this.boxes.map((b) => [b.id, b.state, b.claudeActivity, b.sessionTitle]),\n ) !== before\n ) {\n this.drawChrome();\n }\n }\n\n private disposeSession(): void {\n if (!this.session) return;\n this.session.dispose();\n this.session = null;\n }\n\n private async spawnActive(): Promise<void> {\n this.disposeSession();\n this.placeholder = null;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.pendingConfirm = null;\n // Wipe the old agent now (synchronous, before the async resolve gap) so it\n // can't bleed through while the new attach redraws. Also resets prevRows.\n this.clearRightPane();\n const id = this.selectedId;\n const target = await this.deps.resolveTarget(id);\n if (this.selectedId !== id || this.tornDown) return; // user switched away\n this.applyTarget(target);\n }\n\n /** Turn a resolved/started target into the right-pane state. */\n private applyTarget(target: RightTarget): void {\n this.disposeSession();\n this.placeholder = null;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.pendingConfirm = null;\n if (target.kind === 'attach') {\n this.activeMode = target.mode ?? 'claude';\n this.session = new PtySession(\n this.deps.ptySpawn,\n this.deps.termCtor,\n target.argv,\n Math.max(1, this.layout.right.w),\n Math.max(1, this.layout.right.h),\n () => this.scheduleRender(),\n () => this.onSessionExit(),\n );\n } else if (target.kind === 'menu') {\n this.menu = { boxName: this.selectedBox()?.name ?? this.selectedId };\n } else if (target.kind === 'lifecycle-menu') {\n this.lifecycleMenu = {\n boxName: this.selectedBox()?.name ?? this.selectedId,\n state: target.state,\n confirmDestroy: false,\n };\n } else if (target.kind === 'create-menu') {\n this.createMenu = { where: target.where };\n } else {\n this.placeholder = target.lines;\n }\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n }\n\n private handleMenuKey(bytes: Buffer): void {\n for (const b of bytes) {\n if (b === 0x63 || b === 0x0d || b === 0x0a) {\n void this.chooseAction('claude');\n return;\n }\n if (b === 0x73) {\n void this.chooseAction('shell');\n return;\n }\n }\n }\n\n private async chooseAction(which: 'claude' | 'shell'): Promise<void> {\n if (this.busy) return;\n const id = this.selectedId;\n const name = this.selectedBox()?.name ?? id;\n this.busy = true;\n this.menu = null;\n this.createMenu = null;\n this.placeholder = ['', which === 'claude' ? ' Starting Claude…' : ' Opening shell…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n const target =\n which === 'claude'\n ? await this.deps.startClaude(id)\n : await this.deps.openShell(id);\n if (this.selectedId !== id || this.tornDown) return; // switched away\n this.applyTarget(target);\n } catch (err) {\n if (this.selectedId !== id || this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to ${which === 'claude' ? 'start Claude' : 'open a shell'} in ${name}:`,\n ` ${msg}`,\n '',\n which === 'claude'\n ? ` Try from a shell: agentbox claude start ${name}`\n : ` Try from a shell: agentbox shell ${name}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n private handleLifecycleMenuKey(bytes: Buffer): void {\n const m = this.lifecycleMenu;\n if (!m) return;\n for (const b of bytes) {\n if (m.confirmDestroy) {\n if (b === 0x79 || b === 0x0d || b === 0x0a) {\n void this.runDestroy(this.selectedId, this.selectedBox()?.name ?? this.selectedId);\n } else {\n // Any other key cancels the confirm and returns to the menu.\n m.confirmDestroy = false;\n this.drawChrome();\n this.scheduleRender();\n }\n return;\n }\n const resumeKey = m.state === 'paused' ? 0x75 /* u */ : 0x73 /* s */;\n if (b === resumeKey) {\n void this.resumeSelected();\n return;\n }\n if (b === 0x64 /* d */) {\n m.confirmDestroy = true;\n this.drawChrome();\n this.scheduleRender();\n return;\n }\n }\n }\n\n private async resumeSelected(): Promise<void> {\n if (this.busy) return;\n const id = this.selectedId;\n const name = this.selectedBox()?.name ?? id;\n const verb = this.lifecycleMenu?.state === 'stopped' ? 'start' : 'unpause';\n this.busy = true;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.placeholder = ['', ' Resuming…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n await this.deps.resumeBox(id);\n if (this.selectedId !== id || this.tornDown) return; // switched away\n await this.refreshBoxes();\n await this.spawnActive();\n } catch (err) {\n if (this.selectedId !== id || this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to ${verb} ${name}:`,\n ` ${msg}`,\n '',\n ` Try from a shell: agentbox ${verb} ${name}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n /** Destroy `id` and recover the selection. Shared by the lifecycle-menu\n * confirm and the running-box `Ctrl-a d` status-bar confirm. */\n private async runDestroy(id: string, name: string): Promise<void> {\n if (this.busy) return;\n this.busy = true;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.placeholder = ['', ' Destroying…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n await this.deps.destroyBox(id);\n if (this.tornDown) return;\n await this.refreshBoxes();\n // The box is gone from the list; fall back to the first entry (the\n // synthetic \"+ New box\", always boxes[0] via listCandidates).\n if (this.boxes[0]) this.selectedId = this.boxes[0].id;\n await this.spawnActive();\n this.flash(`destroyed ${name}`);\n } catch (err) {\n if (this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to destroy ${name}:`,\n ` ${msg}`,\n '',\n ` Try from a shell: agentbox destroy ${name}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n /** Ctrl-a p/s/d on the selected box. pause/stop transition state (the pane\n * re-resolves to the lifecycle menu); destroy asks to confirm first. */\n private async doLifecycle(name: 'pause' | 'stop' | 'destroy'): Promise<void> {\n if (this.selectedId === NEW_BOX_ID) {\n this.flash('select a box first');\n return;\n }\n const id = this.selectedId;\n const boxName = this.selectedBox()?.name ?? id;\n if (name === 'destroy') {\n this.pendingConfirm = { boxId: id, name: boxName };\n this.drawChrome();\n return;\n }\n if (this.selectedBox()?.state !== 'running') {\n this.flash(`${boxName} is not running`);\n return;\n }\n if (this.busy) return;\n this.busy = true;\n this.menu = null;\n this.lifecycleMenu = null;\n this.createMenu = null;\n this.placeholder = ['', name === 'pause' ? ' Pausing…' : ' Stopping…'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n if (name === 'pause') await this.deps.pauseBox(id);\n else await this.deps.stopBox(id);\n if (this.selectedId !== id || this.tornDown) return; // switched away\n await this.refreshBoxes();\n await this.spawnActive();\n this.flash(`${name === 'pause' ? 'paused' : 'stopped'} ${boxName}`);\n } catch (err) {\n if (this.selectedId !== id || this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = [\n '',\n ` Failed to ${name} ${boxName}:`,\n ` ${msg}`,\n '',\n ` Try from a shell: agentbox ${name} ${boxName}`,\n ];\n this.prevRows = null;\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n private handleConfirmKey(bytes: Buffer): void {\n const c = this.pendingConfirm;\n if (!c) return;\n const b = bytes[0];\n this.pendingConfirm = null;\n if (b === 0x79 || b === 0x0d || b === 0x0a) {\n void this.runDestroy(c.boxId, c.name);\n } else {\n // Cancelled — restore the footer.\n this.drawChrome();\n }\n }\n\n private handleCreateMenuKey(bytes: Buffer): void {\n for (const b of bytes) {\n if (b === 0x63 || b === 0x0d || b === 0x0a) {\n void this.chooseCreate(true);\n return;\n }\n if (b === 0x6e) {\n void this.chooseCreate(false);\n return;\n }\n }\n }\n\n private async chooseCreate(withClaude: boolean): Promise<void> {\n if (this.busy) return;\n this.busy = true;\n this.menu = null;\n this.createMenu = null;\n this.placeholder = ['', ' Creating box…', ''];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n const { boxId, attach } = await this.deps.createNewBox(withClaude, (line) => {\n if (this.tornDown) return;\n this.placeholder = ['', ' Creating box…', ' ' + line];\n this.prevRows = null;\n this.scheduleRender();\n });\n if (this.tornDown) return;\n this.selectedId = boxId;\n await this.refreshBoxes();\n if (attach) {\n this.applyTarget(attach);\n } else {\n await this.spawnActive();\n this.flash('box created');\n }\n } catch (err) {\n if (this.tornDown) return;\n const msg = err instanceof Error ? err.message : String(err);\n this.placeholder = ['', ' Failed to create box:', ` ${msg}`, '', ' Try from a shell: agentbox create'];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n } finally {\n this.busy = false;\n }\n }\n\n private async doAction(name: 'vnc' | 'code' | 'web'): Promise<void> {\n if (this.selectedId === NEW_BOX_ID) {\n this.flash('select a box first');\n return;\n }\n const id = this.selectedId;\n let msg: string;\n try {\n msg =\n name === 'vnc'\n ? await this.deps.openVnc(id)\n : name === 'code'\n ? await this.deps.openCode(id)\n : await this.deps.openWeb(id);\n } catch (err) {\n msg = err instanceof Error ? err.message : String(err);\n }\n this.flash(msg);\n }\n\n /** Briefly show `msg` in the status row, then revert. */\n private flash(msg: string): void {\n this.flashMsg = msg;\n if (this.flashTimer) clearTimeout(this.flashTimer);\n this.flashTimer = setTimeout(() => {\n this.flashTimer = null;\n this.flashMsg = null;\n this.drawChrome();\n }, 2500);\n this.drawChrome();\n }\n\n private onSessionExit(): void {\n // Inner attach ended (container died / tmux session gone). Show a message;\n // the next poll reconciles box state.\n this.disposeSession();\n this.placeholder = ['', ' session ended — Ctrl-a ↑/↓ to switch boxes'];\n this.prevRows = null;\n this.scheduleRender();\n }\n\n private switchBox(dir: 'next' | 'prev'): void {\n if (this.boxes.length === 0) return;\n this.pendingConfirm = null;\n const i = Math.max(\n 0,\n this.boxes.findIndex((b) => b.id === this.selectedId),\n );\n const n = this.boxes.length;\n const next = dir === 'prev' ? (i - 1 + n) % n : (i + 1) % n;\n this.selectedId = this.boxes[next]!.id;\n this.drawChrome();\n void this.spawnActive();\n }\n\n /** Blank the right pane and drop the diff cache (next paint is full). */\n private clearRightPane(): void {\n const r = this.layout.right;\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) {\n s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + ' '.repeat(r.w);\n }\n this.out.write(s + SYNC_END);\n this.prevRows = null;\n }\n\n private scheduleRender(): void {\n if (this.renderTimer || this.tornDown) return;\n this.renderTimer = setTimeout(() => {\n this.renderTimer = null;\n this.render();\n }, FRAME_MS);\n }\n\n private render(): void {\n if (this.tornDown) return;\n const r = this.layout.right;\n if (this.layout.tooSmall) {\n this.out.write(cursorTo(0, 0) + '\\x1b[2J' + cursorTo(0, 0) + 'terminal too small');\n return;\n }\n if (this.session) {\n const { out, rows } = diffFrame(this.prevRows, this.session.snapshot(), r);\n this.prevRows = rows;\n if (out) this.out.write(SYNC_BEGIN + out + SYNC_END);\n } else if (this.menu) {\n const lines = menuLines(this.menu.boxName, r.w, r.h);\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + (lines[i] ?? '');\n this.out.write(s + SYNC_END);\n } else if (this.lifecycleMenu) {\n const lines = lifecycleMenuLines(\n this.lifecycleMenu.boxName,\n this.lifecycleMenu.state,\n this.lifecycleMenu.confirmDestroy,\n r.w,\n r.h,\n );\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + (lines[i] ?? '');\n this.out.write(s + SYNC_END);\n } else if (this.createMenu) {\n const lines = createMenuLines(this.createMenu.where, r.w, r.h);\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + (lines[i] ?? '');\n this.out.write(s + SYNC_END);\n } else if (this.placeholder) {\n let s = SYNC_BEGIN + '\\x1b[?25l';\n for (let i = 0; i < r.h; i++) {\n const line = (this.placeholder[i] ?? '').slice(0, r.w);\n s += cursorTo(r.x, r.y + i) + '\\x1b[0m' + line + ' '.repeat(Math.max(0, r.w - line.length));\n }\n this.out.write(s + SYNC_END);\n }\n }\n\n private drawChrome(): void {\n if (this.tornDown || this.layout.tooSmall) return;\n const { sidebar, sepX, statusY } = this.layout;\n const { lines, rowOwner, headerRows } = sidebarLines(\n this.boxes,\n this.selectedId,\n sidebar.w,\n sidebar.h,\n );\n let s = SYNC_BEGIN + '\\x1b[0m';\n for (let i = 0; i < lines.length; i++) {\n const style = headerRows[i]\n ? SB_HEADER\n : rowOwner[i] === this.selectedId\n ? SB_SELECTED\n : SB_BODY;\n s += cursorTo(0, i) + style + lines[i] + SGR_RESET;\n }\n // Rounded top-right corner connecting the sidebar's top border to the\n // right separator; plain `│` below (no bottom corner — saves a row).\n // Blue (SB_HEADER) so the whole right border matches the rounded header.\n for (let y = 0; y < sidebar.h; y++)\n s += cursorTo(sepX, y) + SB_HEADER + (y === 0 ? '╮' : '│') + SGR_RESET;\n let status: string;\n if (this.pendingConfirm) {\n const w = this.layout.cols;\n const txt = ` Destroy ${this.pendingConfirm.name}? y = confirm · any other key = cancel `\n .slice(0, w)\n .padEnd(w);\n status = `\\x1b[7m${txt}\\x1b[0m`;\n } else if (this.flashMsg) {\n const w = this.layout.cols;\n const txt = ` ${this.flashMsg} `.slice(0, w).padEnd(w);\n status = `\\x1b[7m${txt}\\x1b[0m`;\n } else {\n const stateLabel =\n this.selectedId === NEW_BOX_ID\n ? 'create'\n : this.menu\n ? 'menu'\n : this.session && this.activeMode === 'shell'\n ? 'shell'\n : undefined;\n status = statusLine(\n this.selectedBox(),\n this.layout.cols,\n stateLabel,\n this.leaderActive ? ADVANCED_HINT_GROUPS : undefined,\n );\n }\n s += cursorTo(0, statusY) + status;\n this.out.write(s + SYNC_END);\n }\n\n private scheduleResize(): void {\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.layout = computeLayout(this.out.columns ?? 100, this.out.rows ?? 30);\n this.prevRows = null;\n const r = this.layout.right;\n if (this.session && !this.layout.tooSmall) {\n this.session.resize(Math.max(1, r.w), Math.max(1, r.h));\n }\n this.out.write(SYNC_BEGIN + '\\x1b[2J' + SYNC_END);\n this.drawChrome();\n this.render();\n }, RESIZE_DEBOUNCE_MS);\n }\n\n private teardown(): void {\n if (this.tornDown) return;\n this.tornDown = true;\n if (this.renderTimer) clearTimeout(this.renderTimer);\n if (this.pollTimer) clearInterval(this.pollTimer);\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n if (this.flashTimer) clearTimeout(this.flashTimer);\n if (this.leaderLingerTimer) clearTimeout(this.leaderLingerTimer);\n this.parser.dispose();\n this.disposeSession();\n this.inp.off('data', this.onData);\n this.out.off('resize', this.onResize);\n if (this.inp.isTTY) this.inp.setRawMode(false);\n this.inp.pause();\n // Belt-and-suspenders: clear the whole mouse-mode family in case Claude\n // enabled one we didn't individually track.\n this.out.write(MOUSE_DISABLE_SEQ + '\\x1b[?25h\\x1b[0m\\x1b[?1049l');\n this.resolveDone?.();\n }\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { destroyBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DestroyOptions {\n yes?: boolean;\n keepSnapshot?: boolean;\n}\n\nexport const destroyCommand = new Command('destroy')\n .alias('rm')\n .description('Destroy a box and discard its upper volume')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--keep-snapshot', \"don't delete the snapshot dir under ~/.agentbox/snapshots/\")\n .action(async (idOrName: string | undefined, opts: DestroyOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n if (!opts.yes) {\n log.warn(`This will discard the upper volume — agent work-in-progress is lost.`);\n log.info(`id: ${box.id}`);\n log.info(`container: ${box.container}`);\n log.info(`upper: ${box.upperVolume}`);\n if (box.snapshotDir) {\n log.info(`snapshot: ${box.snapshotDir}${opts.keepSnapshot ? ' (will be kept)' : ''}`);\n }\n const ok = await confirm({\n message: 'Destroy this box?',\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await destroyBox(box.id, { keepSnapshot: opts.keepSnapshot });\n const out: string[] = [`destroyed ${result.record.container}`];\n if (result.removedContainer) out.push(' ✓ container removed');\n out.push(` ✓ volumes removed: ${result.removedVolumes.join(', ')}`);\n if (result.removedSnapshot) out.push(` ✓ snapshot removed: ${result.removedSnapshot}`);\n else if (box.snapshotDir && opts.keepSnapshot) {\n out.push(` · snapshot kept: ${box.snapshotDir}`);\n }\n process.stdout.write(out.join('\\n') + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport { listBoxes, type ListedBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { pathToFileURL } from 'node:url';\nimport { hyperlink } from '../hyperlink.js';\nimport { withWatchOptions, watchRender, type WatchableOptions } from '../watch.js';\n\ninterface ListOptions extends WatchableOptions {\n json?: boolean;\n all?: boolean;\n}\n\n/** A table cell: the (possibly OSC-8-wrapped) text to print + its visible width. */\ninterface Cell {\n text: string;\n width: number;\n}\n\nconst plain = (s: string): Cell => ({ text: s, width: s.length });\n\n/**\n * Shorten `s` to `n` visible chars, keeping the head and the final path\n * segment with `…` in the middle (`/Users/marco/Pr…/test-workspace`). Falls\n * back to a plain head+ellipsis when the tail alone won't fit.\n */\nfunction middleTruncate(s: string, n: number): string {\n if (s.length <= n) return s;\n if (n <= 1) return s.length > 0 ? '…' : '';\n const slash = s.lastIndexOf('/');\n const tail = slash >= 0 ? s.slice(slash) : '';\n // Need room for at least one head char + ellipsis + the whole tail.\n if (tail.length > 0 && tail.length + 2 <= n) {\n const head = s.slice(0, n - 1 - tail.length);\n return `${head}…${tail}`;\n }\n return s.slice(0, n - 1) + '…';\n}\n\n/**\n * Compact, clickable URL for the box: the `expose:`-flagged web endpoint when\n * present (the box's main app, explicitly declared), else the first reachable\n * service, followed by a `(VNC)` link to the noVNC URL when VNC is enabled.\n * Display is the bare `host[:port]` (no scheme, no query) so the VNC password in\n * the query string stays out of the table; the OSC-8 target keeps the full URL\n * so a click still works. Falls back to VNC alone when there's no service.\n */\nfunction urlCell(box: ListedBox, stream: NodeJS.WriteStream): Cell {\n const eps = box.endpoints.endpoints;\n const vnc = eps.find((e) => e.kind === 'vnc' && e.url);\n const primary =\n eps.find((e) => e.kind === 'web' && e.url) ??\n eps.find((e) => e.kind === 'service' && e.url) ??\n vnc;\n if (!primary?.url) return plain('');\n\n let display: string;\n try {\n display = new URL(primary.url).host;\n } catch {\n display = primary.url;\n }\n\n const parts: Cell[] = [\n { text: hyperlink(display, primary.url, stream), width: display.length },\n ];\n if (vnc?.url && vnc !== primary) {\n const label = '(VNC)';\n parts.push({ text: hyperlink(label, vnc.url, stream), width: label.length });\n }\n const sep = ' ';\n return {\n text: parts.map((p) => p.text).join(sep),\n width: parts.reduce((a, p) => a + p.width, 0) + sep.length * (parts.length - 1),\n };\n}\n\n/** Workspace path truncated to `target` and linked to its `file://` URL. */\nfunction workspaceCell(path: string, target: number, stream: NodeJS.WriteStream): Cell {\n const display = middleTruncate(path, target);\n let url: string;\n try {\n url = pathToFileURL(path).href;\n } catch {\n return { text: display, width: display.length };\n }\n return { text: hyperlink(display, url, stream), width: display.length };\n}\n\nfunction renderTable(boxes: ListedBox[], stream: NodeJS.WriteStream): string {\n const header = ['N', 'NAME', 'STATE', 'CLAUDE', 'URL', 'WORKSPACE'];\n const lead: Cell[][] = boxes.map((b) => [\n plain(typeof b.projectIndex === 'number' ? String(b.projectIndex) : ''),\n plain(b.name),\n plain(b.state),\n plain(b.claudeActivity ?? ''),\n urlCell(b, stream),\n ]);\n const leadHeader = header.slice(0, 5).map(plain);\n\n // Widths for the fixed columns (everything but WORKSPACE).\n const fixedWidths = [0, 1, 2, 3, 4].map((col) =>\n Math.max(leadHeader[col]?.width ?? 0, ...lead.map((r) => r[col]?.width ?? 0)),\n );\n\n // WORKSPACE budget: whatever's left of the terminal after the fixed columns\n // + the 2-space separators. Never below a usable floor.\n const term = stream.columns && stream.columns > 0 ? stream.columns : 120;\n const fixedTotal = fixedWidths.reduce((a, b) => a + b, 0) + header.length * 2;\n const naturalWs = Math.max(\n header[5]?.length ?? 0,\n ...boxes.map((b) => b.workspacePath.length),\n );\n const wsWidth = Math.min(naturalWs, Math.max(16, term - fixedTotal));\n\n const widths = [...fixedWidths, wsWidth];\n const rows: Cell[][] = boxes.map((b, idx) => [\n ...(lead[idx] as Cell[]),\n workspaceCell(b.workspacePath, wsWidth, stream),\n ]);\n const all: Cell[][] = [[...leadHeader, plain(header[5] as string)], ...rows];\n\n const padCell = (cell: Cell, col: number): string => {\n const target = widths[col] ?? 0;\n return cell.text + ' '.repeat(Math.max(0, target - cell.width));\n };\n\n return all\n .map((row) =>\n row\n .map((cell, i) => padCell(cell ?? plain(''), i))\n .join(' ')\n .trimEnd(),\n )\n .join('\\n');\n}\n\n/**\n * The boxes `list` should render: scoped to the cwd's project by default\n * (consistent with every other box-arg command, which routes through\n * `box-ref.ts`'s `findProjectRoot` + `resolveBoxRef`), or all boxes under\n * `--all`. Pre-feature boxes have no `projectRoot`, so they surface only under\n * `--all` — same as auto-pick, which never matches them implicitly.\n */\nasync function scopedBoxes(\n all: boolean,\n): Promise<{ boxes: ListedBox[]; projectRoot: string; scoped: boolean }> {\n const boxes = await listBoxes();\n if (all) return { boxes, projectRoot: '', scoped: false };\n const { root } = await findProjectRoot(process.cwd());\n return { boxes: boxes.filter((b) => b.projectRoot === root), projectRoot: root, scoped: true };\n}\n\nasync function buildListText(all: boolean): Promise<string> {\n const { boxes, projectRoot, scoped } = await scopedBoxes(all);\n if (boxes.length === 0) {\n if (scoped) {\n return `no boxes in this project (${projectRoot}) — run \\`agentbox create\\`, or \\`agentbox list --all\\` to see all`;\n }\n return 'no boxes — run `agentbox create` to make one';\n }\n return renderTable(boxes, process.stdout);\n}\n\nexport const listCommand = withWatchOptions(\n new Command('list')\n .alias('ls')\n .description('List agent boxes in the current project (-a for all)')\n .option('-j, --json', 'machine-readable JSON output')\n .option('-a, --all', 'include boxes from all projects'),\n).action(async (opts: ListOptions) => {\n if (opts.json && opts.watch) {\n log.error('cannot combine --json with --watch');\n process.exit(2);\n }\n const all = opts.all ?? false;\n if (opts.watch) {\n await watchRender(() => buildListText(all), opts.interval);\n return;\n }\n if (opts.json) {\n const { boxes } = await scopedBoxes(all);\n process.stdout.write(JSON.stringify(boxes, null, 2) + '\\n');\n return;\n }\n process.stdout.write((await buildListText(all)) + '\\n');\n});\n","import { supportsHyperlink } from 'supports-hyperlinks';\n\nconst ESC = '\\x1b';\nconst ST = `${ESC}\\\\`;\n\n/**\n * Wrap `label` in an OSC-8 hyperlink pointing at `url`, when the target stream\n * is a TTY whose terminal program is known to support OSC-8 (iTerm2, WezTerm,\n * Ghostty, recent VS Code, etc. — `supports-hyperlinks` does the detection).\n * Falls back to the plain label otherwise so piped output stays clean.\n */\nexport function hyperlink(label: string, url: string, stream?: NodeJS.WriteStream): string {\n const out = stream ?? process.stdout;\n if (!supportsHyperlink(out)) return label;\n return `${ESC}]8;;${url}${ST}${label}${ESC}]8;;${ST}`;\n}\n","import type { Command } from 'commander';\n\nexport interface WatchableOptions {\n watch?: boolean;\n interval?: string;\n}\n\n/** Add the shared `-w/--watch` + `--interval` options to a command. */\nexport function withWatchOptions(cmd: Command): Command {\n return cmd\n .option('-w, --watch', 'redraw continuously until interrupted (Ctrl-C)')\n .option('--interval <seconds>', 'refresh interval for --watch', '2');\n}\n\nfunction parseIntervalMs(raw: string | undefined): number {\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return 2000;\n // Floor at 250ms so a typo like `--interval 0.001` can't busy-spin.\n return Math.max(250, Math.round(n * 1000));\n}\n\n/**\n * Redraw `produce()`'s output on a fixed interval until the user hits Ctrl-C.\n * Clears the screen (and scrollback) each tick so the view stays put. A\n * `produce()` failure is shown inline and retried next tick — boxes routinely\n * disappear briefly during stop/start, and the persisted status is still\n * readable while paused, so a transient error shouldn't end the watch.\n */\nexport async function watchRender(\n produce: () => Promise<string>,\n rawInterval: string | undefined,\n): Promise<void> {\n const ms = parseIntervalMs(rawInterval);\n const intervalLabel = `${String(ms / 1000)}s`;\n process.stdout.write('\\x1b[?25l'); // hide cursor\n process.once('exit', () => process.stdout.write('\\x1b[?25h')); // restore on exit\n process.once('SIGINT', () => process.exit(0));\n const sleep = (d: number): Promise<void> => new Promise((r) => setTimeout(r, d));\n for (;;) {\n let body: string;\n try {\n body = await produce();\n } catch (err) {\n body = `error: ${err instanceof Error ? err.message : String(err)}`;\n }\n const ts = new Date().toLocaleTimeString();\n // 2J clear, 3J drop scrollback, H cursor home.\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H');\n process.stdout.write(\n `watching every ${intervalLabel} — ${ts} — Ctrl-C to exit\\n\\n${body.replace(/\\n+$/, '')}\\n`,\n );\n await sleep(ms);\n }\n}\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport { execInBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface LogsOptions {\n tail: string;\n follow?: boolean;\n}\n\nexport const logsCommand = new Command('logs')\n .description('Print recent log lines from a box service; -f to stream')\n // Both args optional so we can support `agentbox logs <service>` (auto-pick\n // the box) AND the original `agentbox logs <box> <service>`. Validation +\n // smart re-binding happens in the action handler.\n .argument(\n '[box]',\n 'box ref (optional when cwd has exactly 1 box): project index, id, id prefix, name, or container',\n )\n .argument('[service]', 'service name from agentbox.yaml')\n .option('-n, --tail <n>', 'how many recent lines to print first', '200')\n .option('-f, --follow', 'keep the connection open and stream new lines')\n .action(async (boxArg: string | undefined, serviceArg: string | undefined, opts: LogsOptions) => {\n try {\n // Smart parse: if only one positional was given, commander binds it to\n // `boxArg` (the first positional). Treat that as the service and\n // auto-pick the box from the current project.\n let idOrName: string | undefined;\n let service: string | undefined;\n if (serviceArg !== undefined) {\n idOrName = boxArg;\n service = serviceArg;\n } else {\n idOrName = undefined;\n service = boxArg;\n }\n if (!service) {\n log.error('missing <service> argument');\n log.info('usage: agentbox logs [box] <service> [-n N] [-f]');\n process.exit(2);\n }\n\n const box = await resolveBoxOrExit(idOrName);\n\n const tail = String(Number.parseInt(opts.tail, 10) || 200);\n const args = ['agentbox-ctl', 'logs', service, '--tail', tail];\n if (opts.follow) args.push('--follow');\n\n if (!opts.follow) {\n const proc = await execInBox(box.container, args, { user: 'vscode' });\n if (proc.exitCode !== 0) {\n log.error(`agentbox-ctl logs failed: ${proc.stderr || proc.stdout}`);\n process.exit(1);\n }\n process.stdout.write(proc.stdout);\n if (!proc.stdout.endsWith('\\n')) process.stdout.write('\\n');\n return;\n }\n\n // Streaming: hand stdio to `docker exec` directly so the user sees lines\n // as the daemon emits them, and Ctrl-C kills both ends cleanly.\n const child = spawn('docker', ['exec', '--user', 'vscode', box.container, ...args], {\n stdio: ['ignore', 'inherit', 'inherit'],\n });\n child.on('exit', (code) => process.exit(code ?? 0));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { openBoxInFinder } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { runPath } from './path.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface OpenOpts {\n upper?: boolean;\n refresh: boolean; // commander gives `--no-refresh` => refresh=false\n includeNodeModules?: boolean;\n print?: boolean;\n path?: boolean;\n}\n\nexport const openCommand = new Command('open')\n .description(\"Open a box's merged workspace in Finder (snapshot of the agent's view)\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--upper', 'open just the writes layer (live on OrbStack, snapshot on Docker Desktop)')\n .option('--no-refresh', \"skip the rsync; open whatever's already on disk\")\n .option(\n '--include-node-modules',\n 'include /workspace/node_modules in the merged export (off by default)',\n )\n .option('--path', 'print the host workspace path instead of launching Finder')\n .option('--print', 'alias of --path')\n .action(async (idOrName: string | undefined, opts: OpenOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n if (opts.path || opts.print) {\n await runPath(box, {\n upper: opts.upper,\n refresh: opts.refresh, // print refreshes by default; --no-refresh skips\n includeNodeModules: opts.includeNodeModules,\n });\n return;\n }\n\n const layer = opts.upper ? 'upper' : 'merged';\n const result = await openBoxInFinder(box.id, {\n layer,\n includeNodeModules: opts.includeNodeModules,\n noRefresh: !opts.refresh,\n noOpen: false,\n });\n\n const liveNote = !result.copied ? ' (live)' : result.usedFallback ? ' (tar fallback)' : '';\n process.stdout.write(`opened ${result.hostPath}${liveNote}\\n`);\n\n if (opts.upper && result.engine !== 'orbstack' && result.copied) {\n log.info(\n 'Tip: live upper-layer browsing requires OrbStack. Re-run `agentbox open --upper` to refresh.',\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { getBoxHostPaths, refreshExport } from '@agentbox/sandbox-docker';\nimport type { BoxRecord } from '@agentbox/sandbox-docker';\nimport { handleLifecycleError } from './_errors.js';\n\nexport interface PathOpts {\n upper?: boolean;\n refresh?: boolean;\n includeNodeModules?: boolean;\n}\n\n// The `path` command was folded into `agentbox open --path`; this is the\n// extracted body, called by open.ts with an already-resolved box.\nexport async function runPath(box: BoxRecord, opts: PathOpts): Promise<void> {\n try {\n const layer = opts.upper ? 'upper' : 'merged';\n const { record, paths } = await getBoxHostPaths(box.id);\n\n if (opts.refresh) {\n const refreshed = await refreshExport(record, {\n layer,\n includeNodeModules: opts.includeNodeModules,\n });\n process.stdout.write(`${refreshed.hostPath}\\n`);\n return;\n }\n\n const path =\n layer === 'upper' ? (paths.upperLiveOnHost ?? paths.upperExport) : paths.mergedExport;\n process.stdout.write(`${path}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n}\n","import { pauseBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const pauseCommand = new Command('pause')\n .description('Freeze a box (docker pause — 0 CPU, RAM stays mapped)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const record = await pauseBox(box.id);\n process.stdout.write(`paused ${record.container}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { pruneOrphanProjectConfigs } from '@agentbox/config';\nimport { listBoxes, pruneBoxes, type PruneResult } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PruneOptions {\n dryRun?: boolean;\n all?: boolean;\n yes?: boolean;\n}\n\nfunction totalRemovals(r: PruneResult, projectConfigs: string[]): number {\n return (\n r.removedRecords.length +\n r.removedContainers.length +\n r.removedVolumes.length +\n r.removedSnapshotDirs.length +\n r.removedBoxDirs.length +\n projectConfigs.length\n );\n}\n\nfunction summary(r: PruneResult, projectConfigs: string[]): string {\n const lines: string[] = [];\n if (r.removedRecords.length > 0) {\n lines.push(\n ` state records (${String(r.removedRecords.length)}): ${r.removedRecords.join(', ')}`,\n );\n }\n if (r.removedContainers.length > 0) {\n lines.push(\n ` containers (${String(r.removedContainers.length)}): ${r.removedContainers.join(', ')}`,\n );\n }\n if (r.removedVolumes.length > 0) {\n lines.push(\n ` volumes (${String(r.removedVolumes.length)}): ${r.removedVolumes.join(', ')}`,\n );\n }\n if (r.removedSnapshotDirs.length > 0) {\n lines.push(\n ` snapshot dirs (${String(r.removedSnapshotDirs.length)}): ${r.removedSnapshotDirs.join(', ')}`,\n );\n }\n if (r.removedBoxDirs.length > 0) {\n lines.push(\n ` box dirs (${String(r.removedBoxDirs.length)}): ${r.removedBoxDirs.join(', ')}`,\n );\n }\n if (projectConfigs.length > 0) {\n lines.push(\n ` project configs (${String(projectConfigs.length)}): ${projectConfigs.join(', ')}`,\n );\n }\n return lines.length > 0 ? lines.join('\\n') : ' (nothing to remove)';\n}\n\n/** Project roots of boxes still in state.json — their config must survive. */\nasync function liveProjectRoots(): Promise<string[]> {\n try {\n const boxes = await listBoxes();\n return boxes.map((b) => b.projectRoot).filter((p): p is string => typeof p === 'string');\n } catch {\n return [];\n }\n}\n\nexport const pruneCommand = new Command('prune')\n .description('Clean up orphan state.json records (and with --all, orphan docker resources)')\n .option('--dry-run', \"show what would be removed, don't change anything\")\n .option(\n '--all',\n 'also remove orphan agentbox-* containers, volumes, snapshot dirs, and orphan per-project config dirs',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .action(async (opts: PruneOptions) => {\n try {\n const dryRun = opts.dryRun ?? false;\n // Project-config GC is part of the destructive `--all` tier (it removes\n // ~/.agentbox/projects/<hash>/ dirs whose workspace folder was deleted).\n const protectedPaths = opts.all ? await liveProjectRoots() : [];\n\n const preview = await pruneBoxes({ dryRun: true, all: opts.all });\n const previewProjects = opts.all\n ? (await pruneOrphanProjectConfigs({ dryRun: true, protectedPaths })).removed.map(\n (r) => r.originalPath,\n )\n : [];\n if (totalRemovals(preview, previewProjects) === 0) {\n process.stdout.write('nothing to prune\\n');\n return;\n }\n\n log.info(`would remove:\\n${summary(preview, previewProjects)}`);\n if (dryRun) return;\n\n if (!opts.yes) {\n const ok = await confirm({ message: 'Proceed with prune?', initialValue: true });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pruneBoxes({ all: opts.all });\n const removedProjects = opts.all\n ? (await pruneOrphanProjectConfigs({ protectedPaths })).removed.map((r) => r.originalPath)\n : [];\n process.stdout.write(`pruned:\\n${summary(result, removedProjects)}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_ENV_PATTERNS,\n inspectBox,\n pullToHost,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\nimport { pullClaudeCommand } from './pull-claude.js';\nimport { pullConfigCommand } from './pull-config.js';\nimport { pullEnvCommand } from './pull-env.js';\n\ninterface PullOpts {\n yes?: boolean;\n dryRun?: boolean;\n respectGitignore: boolean; // commander gives `--no-respect-gitignore` => false\n includeNodeModules?: boolean;\n refresh: boolean; // commander gives `--no-refresh` => false\n withEnv?: boolean;\n pattern: string[];\n}\n\nexport const pullCommand = new Command('pull')\n // Parent and the `env` subcommand share option names (--dry-run, -y,\n // --pattern). Positional options make post-subcommand options bind to the\n // subcommand instead of being swallowed by this parent command.\n .enablePositionalOptions()\n .description(\"Pull a box's /workspace back into your host workspace dir (gitignore-aware)\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"print the change list and exit; don't write\")\n .option(\n '--no-respect-gitignore',\n 'disable git ls-files mode; use --exclude=node_modules,.git instead',\n )\n .option(\n '--include-node-modules',\n 'do not exclude node_modules in fallback mode (no effect in gitignore mode)',\n )\n .option('--no-refresh', \"skip the box->scratch-dir rsync step (use whatever's already there)\")\n .option(\n '--with-env',\n 'also pull env/config files (.env*, .envrc, secrets.toml, agentbox.yaml, ...) ignoring gitignore',\n )\n .option(\n '--pattern <glob>',\n 'extra env basename glob; only effective with --with-env (repeatable)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .action(async (idOrName: string | undefined, opts: PullOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n const rootWorktree = box.gitWorktrees?.find((w) => w.kind === 'root');\n if (rootWorktree) {\n log.warn(\n `This box has been committing to branch \\`${rootWorktree.branch}\\` in a separate worktree.\\n` +\n `For a git-aware merge instead of a file copy, run from your checkout:\\n` +\n ` git merge ${rootWorktree.branch}\\n` +\n `Continuing with rsync into ${box.workspacePath}`,\n );\n }\n\n const envPatterns = opts.withEnv\n ? [...DEFAULT_ENV_PATTERNS, ...opts.pattern]\n : undefined;\n\n const preview = await pullToHost(box, {\n dryRun: true,\n respectGitignore: opts.respectGitignore,\n includeNodeModules: opts.includeNodeModules,\n envPatterns,\n noRefresh: !opts.refresh,\n });\n\n if (preview.changes.length === 0) {\n process.stdout.write(`no changes to pull into ${box.workspacePath}\\n`);\n return;\n }\n\n if (opts.dryRun) {\n for (const line of preview.changes) process.stdout.write(`${line}\\n`);\n process.stdout.write(\n `\\n[dry-run] ${preview.changes.length} file(s) would change in ${box.workspacePath}\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.changes.length} changed file(s)${opts.withEnv ? ' (incl. env/config)' : ''} into ${box.workspacePath}?`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullToHost(box, {\n dryRun: false,\n respectGitignore: opts.respectGitignore,\n includeNodeModules: opts.includeNodeModules,\n envPatterns,\n // The dry-run pass above already refreshed (or intentionally skipped)\n // the scratch dir — don't rsync box->scratch a second time.\n noRefresh: true,\n });\n process.stdout.write(\n `updated ${result.changes.length} file(s) in ${result.hostPath}` +\n `${result.usedGitignore ? '' : ' (exclude-list mode)'}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n// `agentbox pull env [box]` — commander dispatches the `env` subcommand;\n// `agentbox pull [box]` / `agentbox pull` still hit the default action above.\npullCommand.addCommand(pullEnvCommand);\n\n// `agentbox pull claude [box]` — box -> host pull of newly-added Claude\n// skills/plugins/agents/commands (additive; reads the claude-config volume so\n// the box need not be running).\npullCommand.addCommand(pullClaudeCommand);\n\n// `agentbox pull config [box]` — box -> host pull of just agentbox.yaml\n// (gitignore-bypassing; for syncing back an in-box-edited/regenerated config).\npullCommand.addCommand(pullConfigCommand);\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_BOX_IMAGE,\n pullClaudeExtras,\n resolveClaudeVolume,\n SHARED_CLAUDE_VOLUME,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PullClaudeOpts {\n yes?: boolean;\n dryRun?: boolean;\n}\n\nfunction tag(item: { category: string; name: string }): string {\n const noun = item.category === 'plugins' ? 'plugin' : item.category.replace(/s$/, '');\n return ` ${item.category}/${item.name} (new ${noun})`;\n}\n\nexport const pullClaudeCommand = new Command('claude')\n .description(\n 'Pull box-installed Claude skills/plugins/agents/commands back to host ~/.claude (additive)',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"list new items and exit; don't write\")\n .action(async (idOrName: string | undefined, opts: PullClaudeOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // We read the claude-config *volume*, not the container, so the box can\n // be stopped — no unpause/start dance (unlike `pull` / `pull env`).\n const volume =\n box.claudeConfigVolume ?? resolveClaudeVolume({ isolate: false, boxId: box.id }).volume;\n if (volume === SHARED_CLAUDE_VOLUME) {\n log.warn(\n `Reading the shared ${SHARED_CLAUDE_VOLUME} volume — it aggregates Claude extensions installed in ANY box, not just ${box.name}.`,\n );\n }\n const image = box.image || DEFAULT_BOX_IMAGE;\n\n const preview = await pullClaudeExtras({ volume }, { image, dryRun: true });\n\n if (preview.newItems.length === 0 && preview.mergedRegistries.length === 0) {\n process.stdout.write('no new Claude extensions to pull into ~/.claude\\n');\n return;\n }\n\n for (const item of preview.newItems) process.stdout.write(`${tag(item)}\\n`);\n for (const reg of preview.mergedRegistries) {\n process.stdout.write(` plugins/${reg} (merge new entries)\\n`);\n }\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.newItems.length} item(s)` +\n `${preview.mergedRegistries.length > 0 ? ` + ${preview.mergedRegistries.length} registry merge(s)` : ''}` +\n ` would be pulled into ~/.claude\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.newItems.length} new Claude extension(s) into ~/.claude? (existing items are never overwritten)`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullClaudeExtras({ volume }, { image, dryRun: false });\n process.stdout.write(\n `pulled ${result.newItems.length} extension(s)` +\n `${result.mergedRegistries.length > 0 ? `, merged ${result.mergedRegistries.join(', ')}` : ''}` +\n ' into ~/.claude\\n',\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { inspectBox, pullToHost, startBox, unpauseBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PullConfigOpts {\n yes?: boolean;\n dryRun?: boolean;\n refresh: boolean; // commander gives `--no-refresh` => false\n}\n\n/**\n * rsync `-i` codes a brand-new file as `>f` followed by all `+` in the\n * attribute columns. The column count differs between rsync builds (macOS\n * emits 7, others 9), so match \"all +\" rather than a fixed width.\n */\nfunction tagChange(line: string): string {\n const sp = line.indexOf(' ');\n const code = sp === -1 ? line : line.slice(0, sp);\n const path = sp === -1 ? '' : line.slice(sp + 1);\n const isNew = /^>f\\++$/.test(code);\n return ` ${path} ${isNew ? '(new)' : '(overwrites host)'}`;\n}\n\n// `agentbox.yaml` lives in the box's overlay at /workspace and is normally\n// gitignored, so the gitignore-aware default pull skips it. This pulls just\n// that file (in-box `find` also picks up nested ones in a monorepo).\nconst CONFIG_PATTERNS = ['agentbox.yaml'];\n\nexport const pullConfigCommand = new Command('config')\n .description('Pull agentbox.yaml box -> host')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"list matched files and exit; don't write\")\n .option('--no-refresh', 'skip the box->scratch-dir rsync step')\n .action(async (idOrName: string | undefined, opts: PullConfigOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n log.info(`agentbox.yaml bypasses gitignore and copies directly into ${box.workspacePath}`);\n\n const preview = await pullToHost(box, {\n dryRun: true,\n respectGitignore: false,\n envPatterns: CONFIG_PATTERNS,\n noRefresh: !opts.refresh,\n });\n\n if (preview.changes.length === 0) {\n process.stdout.write(`no config file to pull into ${box.workspacePath}\\n`);\n return;\n }\n\n for (const line of preview.changes) process.stdout.write(`${tagChange(line)}\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.changes.length} config file(s) would change in ${box.workspacePath}\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.changes.length} config file(s) into ${box.workspacePath}? (existing files will be overwritten)`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullToHost(box, {\n dryRun: false,\n respectGitignore: false,\n envPatterns: CONFIG_PATTERNS,\n // The dry-run pass above already refreshed (or intentionally skipped)\n // the scratch dir — don't rsync box->scratch a second time.\n noRefresh: true,\n });\n process.stdout.write(\n `pulled ${result.changes.length} config file(s) into ${result.hostPath}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_ENV_PATTERNS,\n inspectBox,\n pullToHost,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface PullEnvOpts {\n yes?: boolean;\n dryRun?: boolean;\n pattern: string[];\n refresh: boolean; // commander gives `--no-refresh` => false\n}\n\n/**\n * rsync `-i` codes a brand-new file as `>f` followed by all `+` in the\n * attribute columns. The column count differs between rsync builds (macOS\n * emits 7, others 9), so match \"all +\" rather than a fixed width.\n */\nfunction tagChange(line: string): string {\n const sp = line.indexOf(' ');\n const code = sp === -1 ? line : line.slice(0, sp);\n const path = sp === -1 ? '' : line.slice(sp + 1);\n const isNew = /^>f\\++$/.test(code);\n return ` ${path} ${isNew ? '(new)' : '(overwrites host)'}`;\n}\n\nexport const pullEnvCommand = new Command('env')\n .description(\n 'Pull gitignored env/config files (.env*, .envrc, secrets.toml, agentbox.yaml, ...) box -> host',\n )\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"list matched files and exit; don't write\")\n .option(\n '--pattern <glob>',\n 'extra basename glob to match (repeatable, adds to defaults)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option('--no-refresh', 'skip the box->scratch-dir rsync step')\n .action(async (idOrName: string | undefined, opts: PullEnvOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n log.info(\n `env/config files bypass gitignore and copy directly into ${box.workspacePath}`,\n );\n\n const patterns = [...DEFAULT_ENV_PATTERNS, ...opts.pattern];\n\n const preview = await pullToHost(box, {\n dryRun: true,\n respectGitignore: false,\n envPatterns: patterns,\n noRefresh: !opts.refresh,\n });\n\n if (preview.changes.length === 0) {\n process.stdout.write(`no env/config files to pull into ${box.workspacePath}\\n`);\n return;\n }\n\n for (const line of preview.changes) process.stdout.write(`${tagChange(line)}\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.changes.length} env/config file(s) would change in ${box.workspacePath}\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Pull ${preview.changes.length} env/config file(s) into ${box.workspacePath}? (existing files will be overwritten)`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n const result = await pullToHost(box, {\n dryRun: false,\n respectGitignore: false,\n envPatterns: patterns,\n // The dry-run pass above already refreshed (or intentionally skipped)\n // the scratch dir — don't rsync box->scratch a second time.\n noRefresh: true,\n });\n process.stdout.write(\n `pulled ${result.changes.length} env/config file(s) into ${result.hostPath}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n buildVncUrls,\n detectEngine,\n ensureBoxBrowser,\n getBoxEndpoints,\n getBoxHostPaths,\n inspectBox,\n readBoxStatus,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface ScreenOptions {\n print?: boolean;\n loopback?: boolean;\n}\n\nexport const screenCommand = new Command('screen')\n .description(\"Open a box's VNC (noVNC) viewer in the browser (auto-unpause/start)\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--print', 'print the URL to stdout instead of launching the browser')\n .option('--loopback', 'use the 127.0.0.1 URL instead of the OrbStack .orb.local URL')\n .action(async (idOrName: string | undefined, opts: ScreenOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n if (!box.vncEnabled) {\n throw new Error(`VNC is disabled for box ${box.name} — recreate without \\`--no-vnc\\``);\n }\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n const br = await ensureBoxBrowser(box.container);\n if (br.up && !br.alreadyRunning) log.info('started in-box browser');\n else if (!br.up) log.warn(`could not start in-box browser: ${br.reason ?? 'unknown'}`);\n\n const engine = await detectEngine();\n const urls = buildVncUrls(box, engine);\n const url = opts.loopback ? urls.loopbackUrl : (urls.orbUrl ?? urls.loopbackUrl);\n if (!url) {\n throw new Error(\n `VNC URL unavailable (daemon may not be up); try \\`agentbox inspect ${box.name}\\``,\n );\n }\n\n if (opts.print) {\n process.stdout.write(`${url}\\n`);\n return;\n }\n\n const opened = spawnSync('open', [url], { stdio: 'inherit' });\n if (opened.status !== 0) {\n throw new Error(`open ${url} failed (exit ${String(opened.status ?? 'n/a')})`);\n }\n process.stdout.write(`opened ${url}\\n`);\n\n // Also pop the web app when a service declares `expose:`. The `web`\n // endpoint is only reachable+url'd in that case (startBox reallocates\n // webHostPort, so re-read the record). Best-effort: the VNC viewer\n // already opened, so a failure here must not fail the command.\n try {\n const { record } = await getBoxHostPaths(box.id);\n const persisted = await readBoxStatus(box.id);\n const eps = await getBoxEndpoints(record, engine, persisted);\n const webEp = eps.endpoints.find((e) => e.kind === 'web');\n if (webEp?.reachable && webEp.url) {\n const webUrl =\n engine === 'orbstack' && !opts.loopback\n ? `http://${record.container}.orb.local`\n : webEp.url;\n const w = spawnSync('open', [webUrl], { stdio: 'inherit' });\n if (w.status === 0) process.stdout.write(`also opened ${webUrl}\\n`);\n else log.warn(`could not open web app (${webUrl})`);\n }\n } catch (e) {\n log.warn(`could not open web app: ${e instanceof Error ? e.message : String(e)}`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { loadEffectiveConfig, type UserConfig } from '@agentbox/config';\nimport { inspectBox, startBox, unpauseBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrShift } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface ShellOptions {\n user?: string;\n login?: boolean;\n}\n\nfunction buildShellCliOverrides(opts: ShellOptions): Partial<UserConfig> {\n const shell: NonNullable<UserConfig['shell']> = {};\n if (opts.user !== undefined) shell.user = opts.user;\n if (opts.login === false) shell.login = false;\n return Object.keys(shell).length > 0 ? { shell } : {};\n}\n\nexport const shellCommand = new Command('shell')\n .description('Open an interactive bash shell in a box (auto-unpause/start)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .argument(\n '[cmd...]',\n 'optional one-shot command to run instead of an interactive shell; place after `--`, e.g. `agentbox shell smoke -- ls /workspace`',\n )\n .option('--user <name>', 'user inside the container (default from config; built-in: vscode)')\n .option('--no-login', 'invoke `bash` instead of `bash -l` (skip login profile)')\n .action(async (idOrName: string | undefined, cmd: string[], opts: ShellOptions) => {\n try {\n // resolveBoxOrShift handles the `agentbox shell -- ls` case: commander\n // binds \"ls\" to [box], which doesn't resolve; if auto-pick succeeds we\n // treat \"ls\" as the first cmd token instead.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n const effectiveCmd = shifted && idOrName ? [idOrName, ...cmd] : cmd;\n\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: buildShellCliOverrides(opts),\n });\n const user = cfg.effective.shell.user;\n const login = cfg.effective.shell.login;\n\n const insp = await inspectBox(box.id);\n if (insp.state === 'paused') {\n log.info('box is paused; unpausing');\n await unpauseBox(box.id);\n } else if (insp.state === 'stopped') {\n log.info('box is stopped; starting (remounting overlay)');\n await startBox(box.id);\n } else if (insp.state === 'missing') {\n throw new Error(`box ${box.name} has no container; was it destroyed?`);\n }\n\n // Inherit TERM so bash declares the outer terminal's true-color +\n // hyperlink capabilities (docker exec defaults to TERM=xterm).\n const term = process.env['TERM'] ?? 'xterm-256color';\n const bashArgs: string[] = [];\n if (login) bashArgs.push('-l');\n if (effectiveCmd.length > 0) bashArgs.push('-c', effectiveCmd.join(' '));\n\n // -i always (so stdin pipes / heredocs work). -t only when stdout is a\n // real TTY — `docker exec -t` errors with \"cannot attach stdin to a\n // TTY-enabled container because stdin is not a terminal\" when run under\n // a script or another agent that piped its output.\n const ttyFlag = process.stdout.isTTY && process.stdin.isTTY ? '-it' : '-i';\n const child = spawnSync(\n 'docker',\n [\n 'exec',\n ttyFlag,\n '-e',\n `TERM=${term}`,\n '--user',\n user,\n box.container,\n 'bash',\n ...bashArgs,\n ],\n { stdio: 'inherit' },\n );\n process.exit(child.status ?? 0);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { startBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const startCommand = new Command('start')\n .description('Start a stopped box (docker start + re-mount the FUSE overlay)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const { record, overlayChecks } = await startBox(box.id);\n process.stdout.write(`started ${record.container}\\n`);\n const failed = overlayChecks.filter((c) => !c.ok);\n if (failed.length > 0) {\n for (const c of failed) {\n process.stderr.write(` ✗ ${c.name}: ${c.detail}\\n`);\n }\n process.exit(1);\n }\n for (const c of overlayChecks) {\n process.stdout.write(` ✓ ${c.name}\\n`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n renderPortsTable,\n renderStatusTable,\n renderTaskTable,\n type BoxStatus,\n type StatusReply,\n} from '@agentbox/ctl';\nimport {\n boxResourceStats,\n execInBox,\n inspectBox,\n type InspectedBox,\n} from '@agentbox/sandbox-docker';\nimport type { BoxResourceStats } from '@agentbox/core';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { renderEndpointLines } from '../endpoints-render.js';\nimport { fmtAgo, fmtBytes, fmtPercent } from '../fmt.js';\nimport { withWatchOptions, watchRender, type WatchableOptions } from '../watch.js';\nimport { runInspect } from './inspect.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface StatusOptions extends WatchableOptions {\n json?: boolean;\n inspect?: boolean;\n}\n\nexport const statusCommand = withWatchOptions(\n new Command('status')\n .description(\"Show service + task status from a box's agentbox-ctl daemon\")\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('-j, --json', 'machine-readable JSON output')\n .option('--inspect', 'show detailed box info (volumes, limits, paths) instead of service/task status'),\n).action(async (idOrName: string | undefined, opts: StatusOptions) => {\n try {\n if (opts.json && opts.watch) {\n log.error('cannot combine --json with --watch');\n process.exit(2);\n }\n const box = await resolveBoxOrExit(idOrName);\n\n if (opts.inspect) {\n await runInspect(box, { json: opts.json, watch: opts.watch, interval: opts.interval });\n return;\n }\n\n if (opts.watch) {\n await watchRender(() => buildStatusText(box.id, box.container), opts.interval);\n return;\n }\n\n if (opts.json) {\n const inspected = await inspectBox(box.id);\n const live = await fetchLive(inspected.state, box.container);\n const resources = await boxResourceStats(inspected.record);\n process.stdout.write(\n JSON.stringify(\n {\n state: inspected.state,\n source: live ? 'live' : 'persisted',\n ...(live ?? {}),\n resources,\n claudeSession: inspected.claudeSession,\n persisted: inspected.persistedStatus,\n endpoints: inspected.endpoints,\n },\n null,\n 2,\n ) + '\\n',\n );\n return;\n }\n\n process.stdout.write((await buildStatusText(box.id, box.container)) + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n});\n\nasync function fetchLive(state: string, container: string): Promise<StatusReply | null> {\n // Only a running container is reachable via `docker exec` (macOS can see the\n // socket file but can't connect to it). Paused/stopped — or a failed exec —\n // falls back to the snapshot the relay persisted to disk.\n if (state !== 'running') return null;\n const proc = await execInBox(container, ['agentbox-ctl', 'status', '--json'], {\n user: 'vscode',\n });\n if (proc.exitCode !== 0) return null;\n try {\n return JSON.parse(proc.stdout) as StatusReply;\n } catch {\n return null;\n }\n}\n\nasync function buildStatusText(id: string, container: string): Promise<string> {\n const inspected = await inspectBox(id);\n const { state, endpoints, persistedStatus } = inspected;\n const live = await fetchLive(state, container);\n\n const out: string[] = [];\n const epLines = renderEndpointLines(endpoints, process.stdout);\n if (epLines.length > 0) {\n out.push('ENDPOINTS', epLines.join('\\n'), '');\n }\n out.push('RESOURCES', renderResources(await boxResourceStats(inspected.record)), '');\n out.push('CLAUDE', renderClaude(inspected, persistedStatus));\n\n if (live) {\n if (live.tasks.length > 0) {\n out.push('', 'TASKS', renderTaskTable(live.tasks));\n }\n out.push('', 'SERVICES', renderStatusTable(live.services));\n out.push('', 'PORTS', renderPortsTable(live.ports));\n return out.join('\\n');\n }\n\n if (!persistedStatus) {\n out.push(\n '',\n `box is ${state}; no persisted status ` +\n `(box predates this feature, or the relay never received a snapshot)`,\n );\n return out.join('\\n');\n }\n out.push('', renderPersisted(persistedStatus, state));\n return out.join('\\n');\n}\n\nfunction renderResources(s: BoxResourceStats): string {\n const lim = (v: string | number | null | undefined): string =>\n v ? ` (limit ${typeof v === 'number' ? String(v) : v})` : '';\n const seg: string[] = [];\n if (s.live) {\n seg.push(`cpu ${fmtPercent(s.cpuPercent)}${lim(s.limits.cpus)}`);\n seg.push(\n `mem ${fmtBytes(s.memUsedBytes)} / ${fmtBytes(s.memLimitBytes)} ` +\n `(${fmtPercent(s.memPercent)})${lim(s.limits.memoryBytes ? fmtBytes(s.limits.memoryBytes) : null)}`,\n );\n seg.push(`pids ${s.pids === null ? '—' : String(s.pids)}${lim(s.limits.pidsLimit)}`);\n } else {\n seg.push('not running');\n if (s.limits.memoryBytes) seg.push(`mem limit ${fmtBytes(s.limits.memoryBytes)}`);\n if (s.limits.cpus) seg.push(`cpu limit ${String(s.limits.cpus)}`);\n if (s.limits.pidsLimit) seg.push(`pids limit ${String(s.limits.pidsLimit)}`);\n }\n seg.push(\n `disk ${fmtBytes(s.diskUsedBytes)}${s.limits.disk ? ` (limit ${s.limits.disk}, no-op on overlay2/macOS)` : ''}`,\n );\n if (s.snapshotDiskBytes !== null) seg.push(`snapshot ${fmtBytes(s.snapshotDiskBytes)}`);\n if (s.checkpointVolumeBytes !== null) seg.push(`ckpt ${fmtBytes(s.checkpointVolumeBytes)}`);\n let line = ` ${seg.join(' ')}`;\n for (const w of s.warnings) line += `\\n note: ${w}`;\n return line;\n}\n\nfunction renderClaude(i: InspectedBox, persisted: BoxStatus | null): string {\n const s = i.claudeSession;\n let session: string;\n if (s === null) {\n session = 'no session (box not running)';\n } else if (!s.running) {\n session = `no session (\"${s.sessionName}\")`;\n } else {\n const ago = fmtAgo(s.startedAt);\n session = `running (\"${s.sessionName}\")${ago ? `, started ${ago}` : ''}`;\n }\n const lines = [` session ${session}`];\n if (persisted) {\n const c = persisted.claude;\n const ago = fmtAgo(c.updatedAt);\n lines.push(` activity ${c.state}${ago ? ` (${ago})` : ''}`);\n }\n return lines.join('\\n');\n}\n\nfunction renderPersisted(s: BoxStatus, state: string): string {\n const out: string[] = [`(persisted snapshot from ${s.timestamp}; box is ${state})`, ''];\n if (s.tasks.length > 0) {\n out.push('TASKS');\n out.push(...s.tasks.map((t) => ` ${t.name} ${t.state}`));\n out.push('');\n }\n out.push('SERVICES');\n if (s.services.length === 0) {\n out.push(' (none)');\n } else {\n out.push(\n ...s.services.map(\n (svc) => ` ${svc.name} ${svc.state}${svc.port !== null ? ` :${String(svc.port)}` : ''}`,\n ),\n );\n }\n out.push('');\n out.push('PORTS');\n if (s.ports.length === 0) {\n out.push(' (none listening)');\n } else {\n const other = s.ports\n .filter((p) => !p.service)\n .map((p) => p.port)\n .sort((a, b) => a - b);\n out.push(\n ...s.ports\n .filter((p) => p.service)\n .map((p) => ` :${String(p.port)} (${p.service})`),\n );\n if (other.length > 0) out.push(` other (${other.length}): ${other.join(', ')}`);\n }\n return out.join('\\n');\n}\n","import type { BoxEndpoints } from '@agentbox/sandbox-docker';\nimport { hyperlink } from './hyperlink.js';\n\n/**\n * Render the box's network surface as aligned `name value` lines (no section\n * header — callers prepend their own). URLs are OSC-8 clickable where the\n * terminal supports it. Returns [] when there's nothing to show so callers can\n * skip the whole block.\n */\nexport function renderEndpointLines(\n endpoints: BoxEndpoints,\n stream: NodeJS.WriteStream,\n): string[] {\n if (endpoints.endpoints.length === 0) return [];\n\n const entries: Array<{ name: string; value: string }> = [\n { name: 'domain', value: endpoints.domain },\n ];\n\n for (const ep of endpoints.endpoints) {\n if (ep.url) {\n entries.push({ name: ep.name, value: hyperlink(ep.url, ep.url, stream) });\n } else if (ep.kind === 'vnc') {\n entries.push({ name: ep.name, value: 'enabled (URL unavailable — daemon may not be up)' });\n } else if (ep.kind === 'web') {\n entries.push({\n name: 'web',\n value: 'reserved (set a service `expose:` in agentbox.yaml)',\n });\n } else {\n entries.push({\n name: ep.name,\n value: `port ${String(ep.containerPort)} (box-only — not reachable from host)`,\n });\n }\n }\n\n const nameWidth = Math.max(...entries.map((e) => e.name.length));\n return entries.map((e) => ` ${e.name.padEnd(nameWidth)} ${e.value}`);\n}\n","/** Human byte size (binary units). `n/a` for null. Shared by inspect/status/top. */\nexport function fmtBytes(n: number | null | undefined): string {\n if (n === null || n === undefined) return 'n/a';\n if (n < 1024) return `${String(n)} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`;\n if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MiB`;\n return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GiB`;\n}\n\n/** A percentage like `12.3%`, or `—` when unavailable. */\nexport function fmtPercent(n: number | null | undefined): string {\n return n === null || n === undefined ? '—' : `${n.toFixed(1)}%`;\n}\n\n/**\n * Human relative time from an ISO-8601 timestamp, e.g. \"10 minutes ago\",\n * \"just now\", \"3 days ago\". Returns null for missing/unparseable input so the\n * caller can omit the clause entirely.\n */\nexport function fmtAgo(iso: string | null | undefined): string | null {\n if (!iso) return null;\n const then = Date.parse(iso);\n if (Number.isNaN(then)) return null;\n const secs = Math.round((Date.now() - then) / 1000);\n if (secs < 0) return 'just now';\n if (secs < 45) return 'just now';\n const units: Array<[string, number]> = [\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n ];\n for (const [name, size] of units) {\n if (secs >= size) {\n const n = Math.round(secs / size);\n return `${String(n)} ${name}${n === 1 ? '' : 's'} ago`;\n }\n }\n return 'just now';\n}\n","import { log } from '@clack/prompts';\nimport { inspectBox, type BoxRecord, type InspectedBox } from '@agentbox/sandbox-docker';\nimport { projectCheckpointVolumeBytes } from '@agentbox/sandbox-docker';\nimport { renderEndpointLines } from '../endpoints-render.js';\nimport { fmtBytes } from '../fmt.js';\nimport { watchRender } from '../watch.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport interface InspectRunOptions {\n json?: boolean;\n watch?: boolean;\n interval?: string;\n}\n\nfunction fmtLimit(n: number | null | undefined, unit: string): string {\n return n && n > 0 ? `${String(n)}${unit}` : 'unlimited';\n}\n\nasync function renderText(i: InspectedBox): Promise<string> {\n const lim = i.record.resourceLimits;\n const projectRoot = i.record.projectRoot ?? i.record.workspacePath;\n const ckptBytes = await projectCheckpointVolumeBytes(projectRoot);\n const upperHost = i.hostPaths.upperLiveOnHost\n ? `${i.hostPaths.upperLiveOnHost} (live)`\n : `${i.hostPaths.upperExport} (run \\`agentbox open --upper\\` to refresh)`;\n const lines: string[] = [\n `id ${i.record.id}`,\n `name ${i.record.name}`,\n `container ${i.record.container}`,\n `image ${i.record.image}`,\n `state ${i.state}`,\n `overlay ${i.overlayMounted ? 'mounted at /workspace' : 'not mounted'}`,\n `workspace ${i.record.workspacePath}`,\n `project ${i.record.projectRoot ?? '(unset — pre-feature box)'}`,\n `n ${typeof i.record.projectIndex === 'number' ? String(i.record.projectIndex) : '(none)'}`,\n `lower ${i.record.lowerPath}`,\n `upper volume ${i.upperVolume.name}${i.upperVolume.mountpoint ? ` (${i.upperVolume.mountpoint})` : ''}`,\n `claude config ${i.record.claudeConfigVolume ?? '(none)'}`,\n `claude session ${renderClaudeSession(i)}`,\n `claude activity ${renderClaudeActivity(i)}`,\n `persisted ${renderPersisted(i)}`,\n `playwright ${i.record.withPlaywright ? 'yes' : 'no'}`,\n `env files ${i.record.withEnv ? 'yes' : 'no'}`,\n 'endpoints',\n ...renderEndpoints(i),\n `mem limit ${lim?.memoryBytes ? fmtBytes(lim.memoryBytes) : 'unlimited'}`,\n `cpu limit ${fmtLimit(lim?.cpus, '')}`,\n `pids limit ${fmtLimit(lim?.pidsLimit, '')}`,\n `disk limit ${lim?.disk ? `${lim.disk} (best-effort; no-op on overlay2/macOS)` : 'unlimited'}`,\n `snapshot dir ${i.record.snapshotDir ?? '(none — live workspace mount)'}`,\n `snapshot size ${fmtBytes(i.snapshotSizeBytes)}`,\n `checkpoint vol ${ckptBytes === null ? '(none)' : fmtBytes(ckptBytes)}`,\n `host export ${i.hostPaths.mergedExport} (run \\`agentbox open\\` to refresh)`,\n `upper host ${upperHost}`,\n `created ${i.record.createdAt}`,\n ];\n return lines.join('\\n');\n}\n\nfunction renderClaudeSession(i: InspectedBox): string {\n if (i.claudeSession === null) return '(n/a — box not running)';\n if (!i.claudeSession.running) return `not running (\"${i.claudeSession.sessionName}\")`;\n const since = i.claudeSession.startedAt ? ` since ${i.claudeSession.startedAt}` : '';\n return `running (\"${i.claudeSession.sessionName}\")${since}`;\n}\n\nfunction renderClaudeActivity(i: InspectedBox): string {\n const c = i.persistedStatus?.claude;\n if (!c) return '(none)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\n}\n\nfunction renderPersisted(i: InspectedBox): string {\n const s = i.persistedStatus;\n if (!s) return '(none)';\n return (\n `${s.timestamp} ` +\n `(${String(s.services.length)} svc, ${String(s.tasks.length)} tasks, ${String(s.ports.length)} ports)`\n );\n}\n\nfunction renderEndpoints(i: InspectedBox): string[] {\n const lines = renderEndpointLines(i.endpoints, process.stdout);\n return lines.length > 0 ? lines : [' (none)'];\n}\n\n// `agentbox inspect` was folded into `agentbox status --inspect`; this is the\n// extracted body, called by status.ts with an already-resolved box.\nexport async function runInspect(box: BoxRecord, opts: InspectRunOptions): Promise<void> {\n try {\n if (opts.json && opts.watch) {\n log.error('cannot combine --json with --watch');\n process.exit(2);\n }\n if (opts.watch) {\n await watchRender(async () => renderText(await inspectBox(box.id)), opts.interval);\n return;\n }\n const result = await inspectBox(box.id);\n if (opts.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n } else {\n process.stdout.write((await renderText(result)) + '\\n');\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n}\n","import { stopBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const stopCommand = new Command('stop')\n .description('Stop a box (docker stop; preserves upper + node_modules volumes)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const record = await stopBox(box.id);\n process.stdout.write(\n `stopped ${record.container}\\nrestart with: agentbox start ${record.name}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { Command } from 'commander';\nimport { findProjectRoot } from '@agentbox/config';\nimport {\n agentboxHomeBytes,\n allCheckpointVolumesBytes,\n boxResourceStats,\n listBoxes,\n type ListedBox,\n} from '@agentbox/sandbox-docker';\nimport type { BoxResourceStats } from '@agentbox/core';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { fmtBytes, fmtPercent } from '../fmt.js';\nimport { watchRender } from '../watch.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface TopOptions {\n project?: boolean;\n once?: boolean;\n json?: boolean;\n interval?: string;\n}\n\nconst COLS = ['BOX', 'STATE', 'CPU%', 'MEM USAGE / LIMIT', 'MEM%', 'PIDS', 'DISK', 'NET I/O'];\n\nfunction row(name: string, state: string, s: BoxResourceStats): string[] {\n const mem = `${fmtBytes(s.memUsedBytes)} / ${fmtBytes(s.memLimitBytes)}`;\n const net =\n s.netRxBytes === null && s.netTxBytes === null\n ? '—'\n : `${fmtBytes(s.netRxBytes)} / ${fmtBytes(s.netTxBytes)}`;\n return [\n name,\n state,\n fmtPercent(s.cpuPercent),\n s.live ? mem : '—',\n fmtPercent(s.memPercent),\n s.pids === null ? '—' : String(s.pids),\n fmtBytes(s.diskUsedBytes),\n s.live ? net : '—',\n ];\n}\n\nfunction renderTable(rows: string[][]): string {\n const all = [COLS, ...rows];\n const widths = COLS.map((_, c) => Math.max(...all.map((r) => r[c]!.length)));\n return all\n .map((r) => r.map((cell, c) => cell.padEnd(widths[c]!)).join(' ').trimEnd())\n .join('\\n');\n}\n\nasync function selectBoxes(\n idOrName: string | undefined,\n opts: TopOptions,\n): Promise<ListedBox[]> {\n const boxes = await listBoxes();\n if (idOrName === undefined) {\n // Default: every box on the host. --project narrows to the cwd's project.\n // An empty result is not an error here: watch mode stays up and picks up\n // boxes as they're created. Callers render a placeholder.\n if (!opts.project) return boxes;\n const project = await findProjectRoot(process.cwd());\n return boxes.filter((b) => b.projectRoot === project.root);\n }\n const picked = await resolveBoxOrExit(idOrName);\n return boxes.filter((b) => b.id === picked.id);\n}\n\nasync function snapshot(\n idOrName: string | undefined,\n opts: TopOptions,\n): Promise<{ boxes: ListedBox[]; stats: BoxResourceStats[] }> {\n const boxes = await selectBoxes(idOrName, opts);\n const stats = await Promise.all(boxes.map((b) => boxResourceStats(b)));\n return { boxes, stats };\n}\n\nasync function renderProjectFooters(): Promise<string> {\n // Two independent disk numbers, no overlap: checkpoint volumes are Docker\n // named volumes (not under ~/.agentbox); everything else agentbox keeps on\n // the host — box run dirs, exports, worktrees, host clones — lives inside\n // ~/.agentbox and is summed there.\n const parts: string[] = [];\n const [ckpt, home] = await Promise.all([\n allCheckpointVolumesBytes(),\n agentboxHomeBytes(),\n ]);\n if (home !== null) parts.push(`~/.agentbox: ${fmtBytes(home)}`);\n if (ckpt !== null) parts.push(`checkpoints: ${fmtBytes(ckpt)}`);\n return parts.length > 0 ? `\\n\\nSYSTEM: ${parts.join(' - ')}` : '';\n}\n\nexport const topCommand = new Command('top')\n .description('Live resource monitor (cpu/mem/pids/disk) for a box, the project, or every box')\n .argument(\n '[box]',\n \"box ref (default: every box on the host; --project narrows to the cwd's project)\",\n )\n .option('-p, --project', \"show only boxes in the cwd's project\")\n .option('--once', 'print a single snapshot instead of watching')\n .option('-j, --json', 'machine-readable JSON (implies --once)')\n .option('--interval <seconds>', 'refresh interval', '2')\n .action(async (idOrName: string | undefined, opts: TopOptions) => {\n try {\n if (opts.json) {\n const { boxes, stats } = await snapshot(idOrName, opts);\n process.stdout.write(\n JSON.stringify(\n boxes.map((b, i) => ({ box: b.name, state: b.state, ...stats[i]! })),\n null,\n 2,\n ) + '\\n',\n );\n return;\n }\n\n const produce = async (watching: boolean): Promise<string> => {\n const { boxes, stats } = await snapshot(idOrName, opts);\n const scope = opts.project ? 'no boxes for this project' : 'no boxes';\n const header =\n boxes.length === 0\n ? watching\n ? `${scope} (waiting...)`\n : scope\n : renderTable(boxes.map((b, i) => row(b.name, b.state, stats[i]!)));\n return header + (await renderProjectFooters());\n };\n\n if (opts.once) {\n process.stdout.write((await produce(false)) + '\\n');\n return;\n }\n await watchRender(() => produce(true), opts.interval);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { unpauseBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const unpauseCommand = new Command('unpause')\n .description('Resume a paused box (docker unpause — sub-second)')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const record = await unpauseBox(box.id);\n process.stdout.write(`unpaused ${record.container}\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { spawn } from 'node:child_process';\nimport { confirm, intro, isCancel, log, outro, spinner } from '@clack/prompts';\nimport {\n DEFAULT_BOX_IMAGE,\n ensureRelay,\n removeImage,\n stopRelay,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { detectExecutionMethod, type ExecMethod } from '../exec-method.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface UpdateOptions {\n yes?: boolean;\n dryRun?: boolean;\n skipSelf?: boolean;\n}\n\n/** The published npm package name (apps/cli/package.json `name`). */\nconst PKG = '@madarco/agentbox';\n\nfunction selfUpdateCommand(method: ExecMethod): { cmd: string; args: string[] } | null {\n if (method === 'npm') return { cmd: 'npm', args: ['install', '-g', `${PKG}@latest`] };\n if (method === 'pnpm') return { cmd: 'pnpm', args: ['add', '-g', `${PKG}@latest`] };\n return null;\n}\n\nfunction describeSelfUpdate(method: ExecMethod): string {\n switch (method) {\n case 'npm':\n return 'self-update: npm install -g @madarco/agentbox@latest';\n case 'pnpm':\n return 'self-update: pnpm add -g @madarco/agentbox@latest';\n case 'npx':\n return 'self-update: skipped (running via npx — always the latest version)';\n case 'direct':\n return 'self-update: skipped (running from source — no global install to update)';\n }\n}\n\nfunction runInherit(cmd: string, args: string[]): Promise<number> {\n return new Promise<number>((resolveP, rejectP) => {\n const child = spawn(cmd, args, { stdio: 'inherit' });\n child.on('error', rejectP);\n child.on('close', (code) => resolveP(code ?? 0));\n });\n}\n\nexport const updateCommand = new Command('self-update')\n .description(\n 'Update agentbox: self-update via npm/pnpm (unless run via npx), wipe the box image so it rebuilds, and reload the relay',\n )\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--dry-run', \"show what would happen, don't change anything\")\n .option('--skip-self', 'skip the package self-update; only refresh the image + relay')\n .action(async (opts: UpdateOptions) => {\n try {\n const method = detectExecutionMethod({\n userAgent: process.env.npm_config_user_agent,\n argv1: process.argv[1],\n });\n\n intro('agentbox self-update');\n\n const selfStep = opts.skipSelf\n ? 'self-update: skipped (--skip-self)'\n : describeSelfUpdate(method);\n log.info(\n [\n 'plan:',\n ` ${selfStep}`,\n ` image: docker image rm -f ${DEFAULT_BOX_IMAGE} (rebuilds on next create/claude)`,\n ' relay: stop, then respawn unless a self-update ran',\n ].join('\\n'),\n );\n\n if (opts.dryRun) {\n outro('dry run — nothing changed');\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({ message: 'Proceed with update?', initialValue: true });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n\n // Step 1: self-update. selfUpdated stays false unless an npm/pnpm global\n // install actually ran — that's what makes the running process stale and\n // forces the lazy image/relay path below.\n let selfUpdated = false;\n if (opts.skipSelf) {\n log.info('skipping self-update (--skip-self)');\n } else {\n const cmd = selfUpdateCommand(method);\n if (cmd === null) {\n log.info(describeSelfUpdate(method));\n } else {\n log.info(`running: ${cmd.cmd} ${cmd.args.join(' ')}`);\n const code = await runInherit(cmd.cmd, cmd.args);\n if (code !== 0) {\n throw new Error(`${cmd.cmd} exited with code ${String(code)}`);\n }\n selfUpdated = true;\n log.success(`updated ${PKG} via ${cmd.cmd}`);\n }\n }\n\n // Step 2: wipe the box image. Best-effort; the next create/claude\n // rebuilds it from the (now updated) Dockerfile via ensureImage().\n const s = spinner();\n s.start(`removing image ${DEFAULT_BOX_IMAGE}`);\n const removed = await removeImage(DEFAULT_BOX_IMAGE);\n s.stop(\n removed\n ? `removed image ${DEFAULT_BOX_IMAGE} (rebuilds on next create/claude)`\n : `image ${DEFAULT_BOX_IMAGE} not present (nothing to remove)`,\n );\n\n // Step 3: reload the relay. Always stop it. Only respawn here when no\n // self-update ran — after a self-update this process is the old build,\n // so respawning would relaunch the stale relay bin. In that case the\n // next `agentbox create`/`claude` (a fresh process) brings it back up.\n const sr = spinner();\n sr.start('stopping relay');\n const stop = await stopRelay();\n sr.stop(\n stop.stopped\n ? `stopped relay (pid ${String(stop.pid)})`\n : 'relay was not running',\n );\n\n if (selfUpdated) {\n log.info(\n 'relay will restart automatically (with the updated build) on your next `agentbox create` / `agentbox claude`',\n );\n } else {\n const sr2 = spinner();\n sr2.start('restarting relay');\n try {\n const ep = await ensureRelay();\n sr2.stop(`relay back up on ${ep.hostUrl}`);\n } catch (err) {\n sr2.stop('relay restart failed');\n log.warn(\n `${err instanceof Error ? err.message : String(err)} — it will retry on the next box command`,\n );\n }\n }\n\n outro('update complete');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","export type ExecMethod = 'npx' | 'pnpm' | 'npm' | 'direct';\n\nexport interface ExecMethodInput {\n /** `process.env.npm_config_user_agent` (or undefined). */\n userAgent?: string | undefined;\n /** `process.argv[1]` — the resolved bin path. */\n argv1?: string | undefined;\n}\n\n/**\n * Classify how this CLI was launched. The signals npm/pnpm/npx leave behind:\n *\n * - npx writes the bin into a `_npx` cache dir and tags the user-agent with\n * `npm/<v> ... npx/<v>` — so the argv path or the user-agent gives it away.\n * - pnpm sets `npm_config_user_agent` starting with `pnpm/`.\n * - npm (global install invoked directly) sets it starting with `npm/`.\n * - anything else (a dev clone run as `node dist/index.js`, a hand-made\n * symlink) leaves no package-manager user-agent → `direct`.\n *\n * npx is checked first because its user-agent also contains `npm/`.\n */\nexport function detectExecutionMethod(input: ExecMethodInput): ExecMethod {\n const ua = input.userAgent ?? '';\n const argv1 = input.argv1 ?? '';\n\n if (argv1.includes('/_npx/') || argv1.includes('/.npm/_npx') || /\\bnpx\\//.test(ua)) {\n return 'npx';\n }\n if (/\\bpnpm\\//.test(ua)) {\n return 'pnpm';\n }\n if (/\\bnpm\\//.test(ua)) {\n return 'npm';\n }\n return 'direct';\n}\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport type { WaitReadyReply } from '@agentbox/ctl';\nimport { execInBox } from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface WaitOptions {\n timeout: string;\n units?: string[];\n json?: boolean;\n}\n\nexport const waitCommand = new Command('wait')\n .description('Block until the box reports all autostart units ready')\n .argument(\n '[box]',\n 'box ref: project index, id, id prefix, name, or container (default: the only box in this project)',\n )\n .option('--timeout <ms>', 'overall timeout in milliseconds', '120000')\n .option('--units <names...>', 'restrict to the named units')\n .option('-j, --json', 'machine-readable JSON output')\n .action(async (idOrName: string | undefined, opts: WaitOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n const ctlArgs = ['agentbox-ctl', 'wait-ready', '--json', '--timeout', opts.timeout];\n if (opts.units && opts.units.length > 0) {\n ctlArgs.push('--units', ...opts.units);\n }\n const proc = await execInBox(box.container, ctlArgs, { user: 'vscode' });\n // wait-ready exits 0 on ready, 1 on not-ready; both write JSON.\n let parsed: WaitReadyReply;\n try {\n parsed = JSON.parse(proc.stdout) as WaitReadyReply;\n } catch {\n log.error(`agentbox-ctl wait-ready failed: ${proc.stderr || proc.stdout}`);\n process.exit(1);\n }\n if (opts.json) {\n process.stdout.write(JSON.stringify(parsed, null, 2) + '\\n');\n } else if (parsed.ready) {\n process.stdout.write('ready\\n');\n } else {\n const lines: string[] = ['not ready'];\n if (parsed.timedOut.length > 0) lines.push(` timed out: ${parsed.timedOut.join(', ')}`);\n if (parsed.failed.length > 0) lines.push(` failed: ${parsed.failed.join(', ')}`);\n process.stdout.write(lines.join('\\n') + '\\n');\n }\n process.exit(parsed.ready ? 0 : 1);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n"],"mappings":"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","names":["Command","program","log","log","log","log","confirm","isCancel","log","Command","spawnSync","spawnSync","log","mkdir","join","proj","log","log","confirm","isCancel","Command","confirm","isCancel","log","Command","Command","log","r","confirm","isCancel","log","Command","Command","log","spawnSync","Command","InvalidArgumentError","spawnSync","intro","log","outro","spinner","Command","spawnSync","spawnSync","Command","intro","spinner","log","outro","spawn","log","Command","spawn","cursorTo","Command","log","spawn","findBox","confirm","isCancel","log","Command","Command","log","confirm","isCancel","log","Command","ESC","term","row","scoped","listCommand","Command","log","log","Command","spawn","Command","log","spawn","log","Command","Command","log","Command","Command","confirm","isCancel","log","Command","Command","log","confirm","isCancel","confirm","isCancel","log","Command","confirm","isCancel","log","Command","Command","log","confirm","isCancel","confirm","isCancel","log","Command","Command","log","confirm","isCancel","confirm","isCancel","log","Command","tagChange","Command","log","confirm","isCancel","Command","log","confirm","isCancel","spawnSync","log","Command","Command","log","spawnSync","spawnSync","log","Command","Command","log","term","spawnSync","Command","Command","log","Command","log","log","Command","log","renderPersisted","Command","Command","Command","renderTable","Command","Command","Command","spawn","confirm","intro","isCancel","log","outro","spinner","Command","spawn","Command","intro","log","outro","confirm","isCancel","spinner","log","Command","Command","log","Command","listCommand"]}