@madarco/agentbox 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{_cloud-attach-T727ZPRV.js → _cloud-attach-ZXBCNWJX.js} +4 -4
- package/dist/{chunk-67N47KUS.js → chunk-BXQMIEHC.js} +106 -31
- package/dist/chunk-BXQMIEHC.js.map +1 -0
- package/dist/{chunk-FODMEHD3.js → chunk-GU5LW4B5.js} +341 -25
- package/dist/chunk-GU5LW4B5.js.map +1 -0
- package/dist/{chunk-BGK32PZE.js → chunk-KL36BRN4.js} +2 -2
- package/dist/chunk-KL36BRN4.js.map +1 -0
- package/dist/chunk-MTVI44DW.js +662 -0
- package/dist/chunk-MTVI44DW.js.map +1 -0
- package/dist/{chunk-6OZDFNBF.js → chunk-NCJP5MTN.js} +201 -44
- package/dist/chunk-NCJP5MTN.js.map +1 -0
- package/dist/{dist-LOZBWMBF.js → dist-32EZBYG4.js} +9 -3
- package/dist/{dist-L4LCG5SJ.js → dist-CX5CGVEB.js} +4 -4
- package/dist/{dist-ZODPD2I6.js → dist-GDHP34ZK.js} +8 -10
- package/dist/dist-GDHP34ZK.js.map +1 -0
- package/dist/dist-XML54CNB.js +849 -0
- package/dist/dist-XML54CNB.js.map +1 -0
- package/dist/index.js +636 -340
- package/dist/index.js.map +1 -1
- package/dist/{prepared-state-CL4CWXQA-ME4HSKDE.js → prepared-state-CL4CWXQA-H5THETIM.js} +2 -2
- package/package.json +7 -5
- package/runtime/docker/packages/ctl/dist/bin.cjs +98 -29
- package/runtime/docker/packages/sandbox-docker/scripts/agentbox-vnc-start +15 -1
- package/runtime/hetzner/agentbox-vnc-start +15 -1
- package/runtime/hetzner/ctl.cjs +98 -29
- package/runtime/relay/bin.cjs +229 -37
- package/runtime/vercel/agentbox-checkpoint-cleanup +52 -0
- package/runtime/vercel/agentbox-codex-hooks.json +68 -0
- package/runtime/vercel/agentbox-open +28 -0
- package/runtime/vercel/agentbox-setup-skill.md +196 -0
- package/runtime/vercel/agentbox-vnc-start +91 -0
- package/runtime/vercel/claude-managed-settings.json +115 -0
- package/runtime/vercel/ctl.cjs +23466 -0
- package/runtime/vercel/custom-system-CLAUDE.md +50 -0
- package/runtime/vercel/gh-shim +263 -0
- package/runtime/vercel/git-shim +131 -0
- package/runtime/vercel/scripts/provision.sh +274 -0
- package/dist/chunk-67N47KUS.js.map +0 -1
- package/dist/chunk-6OZDFNBF.js.map +0 -1
- package/dist/chunk-BGK32PZE.js.map +0 -1
- package/dist/chunk-FODMEHD3.js.map +0 -1
- package/dist/dist-ZODPD2I6.js.map +0 -1
- /package/dist/{_cloud-attach-T727ZPRV.js.map → _cloud-attach-ZXBCNWJX.js.map} +0 -0
- /package/dist/{dist-LOZBWMBF.js.map → dist-32EZBYG4.js.map} +0 -0
- /package/dist/{dist-L4LCG5SJ.js.map → dist-CX5CGVEB.js.map} +0 -0
- /package/dist/{prepared-state-CL4CWXQA-ME4HSKDE.js.map → prepared-state-CL4CWXQA-H5THETIM.js.map} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/index.ts","../src/engine-override.ts","../src/help.ts","../src/commands/agent.ts","../src/box-ref.ts","../src/lib/wait/agent-state.ts","../src/lib/wait/events.ts","../src/commands/_errors.ts","../src/commands/claude.ts","../src/auth.ts","../src/lib/queue/assert-creds.ts","../src/lib/queue/build-prompt-args.ts","../src/lib/queue/submit.ts","../src/commands/_attach-in.ts","../src/commands/_cloud-agent-create.ts","../src/lib/progress.ts","../src/spinner-line.ts","../src/lib/carry-gate.ts","../src/carry-prompt.ts","../src/fmt.ts","../src/lib/carry-resolve.ts","../src/lib/from-branch.ts","../src/session-teleport/claude.ts","../src/session-teleport/cwd-encoding.ts","../src/session-teleport/types.ts","../src/session-teleport/codex.ts","../src/session-teleport/opencode.ts","../src/session-teleport/index.ts","../src/lib/install-hint.ts","../src/lib/log-file.ts","../src/limits.ts","../src/portless-prompt.ts","../src/wizard.ts","../src/checkpoint-lookup.ts","../src/commands/checkpoint.ts","../src/commands/code.ts","../src/ssh-config.ts","../src/commands/codex.ts","../src/commands/opencode.ts","../src/commands/config.ts","../src/commands/cp.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/compositor.ts","../../../packages/sandbox-daytona/src/cli.ts","../src/commands/docker.ts","../../../packages/sandbox-hetzner/src/cli.ts","../src/commands/destroy.ts","../src/commands/download.ts","../src/commands/download-claude.ts","../src/commands/download-codex.ts","../src/commands/download-opencode.ts","../src/commands/download-config.ts","../src/commands/download-env.ts","../src/commands/drive.ts","../src/lib/drive/keys.ts","../src/lib/drive/tmux.ts","../src/lib/drive/session.ts","../src/commands/fork.ts","../src/commands/install.ts","../src/commands/git.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/prepare.ts","../src/commands/prune.ts","../src/commands/queue.ts","../src/commands/relay.ts","../src/commands/_run-queued-job.ts","../src/commands/screen.ts","../src/commands/shell.ts","../src/commands/_provider-guard.ts","../src/commands/start.ts","../src/commands/status.ts","../src/endpoints-render.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/url.ts","../src/commands/wait.ts","../src/provider/argv-prefix.ts"],"sourcesContent":["/**\n * Build-time injected CLI version constants. tsup's `define` (apps/cli/tsup.config.ts)\n * replaces these identifiers at bundle time:\n *\n * __AGENTBOX_VERSION__ ← apps/cli/package.json `version`\n * __AGENTBOX_COMMIT__ ← `git rev-parse --short HEAD` at build time\n *\n * The `declare` lines below are for the typecheck of the unbundled source —\n * tsup substitutes the literals before esbuild ever sees this file. The\n * `?? '...'` fallbacks cover the unbundled dev case (running `tsx src/index.ts`\n * before `pnpm build` populates the defines).\n */\n\ndeclare const __AGENTBOX_VERSION__: string | undefined;\ndeclare const __AGENTBOX_COMMIT__: string | undefined;\n\nexport const AGENTBOX_VERSION: string =\n typeof __AGENTBOX_VERSION__ === 'string' ? __AGENTBOX_VERSION__ : '0.0.0-dev';\n\nexport const AGENTBOX_COMMIT: string =\n typeof __AGENTBOX_COMMIT__ === 'string' ? __AGENTBOX_COMMIT__ : 'dev';\n","// Suppress Docker CLI hints (the \"What's next?\" / promotional lines that\n// appear after some docker subcommands). Affects every `docker …` we spawn\n// because the var inherits via process.env. We use `??=` so a user who\n// explicitly set DOCKER_CLI_HINTS in their shell still wins.\nprocess.env.DOCKER_CLI_HINTS ??= 'false';\n\n// Build-time CLI version stamps. The provider packages (sandbox-docker,\n// sandbox-hetzner, sandbox-daytona) read these lazily — at prepare/create/\n// checkpoint time, never at import — so the ESM-hoists-imports-first order\n// is fine. Set via env so the provider packages don't need a compile-time\n// dep on apps/cli's bundled-only version module.\nimport { AGENTBOX_COMMIT, AGENTBOX_VERSION } from './version.js';\nprocess.env.AGENTBOX_CLI_VERSION = AGENTBOX_VERSION;\nprocess.env.AGENTBOX_CLI_COMMIT = AGENTBOX_COMMIT;\n\nimport { Command } from 'commander';\nimport { applyEngineOverrideAtStartup } from './engine-override.js';\nimport { buildGroupedHelp } from './help.js';\nimport { agentCommand } from './commands/agent.js';\nimport { claudeCommand } from './commands/claude.js';\nimport { checkpointCommand } from './commands/checkpoint.js';\nimport { codeCommand } from './commands/code.js';\nimport { codexCommand } from './commands/codex.js';\nimport { opencodeCommand } from './commands/opencode.js';\nimport { configCommand } from './commands/config.js';\nimport { cpCommand } from './commands/cp.js';\nimport { createCommand } from './commands/create.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { daytonaCommand } from '@agentbox/sandbox-daytona/cli';\nimport { dockerCommand } from './commands/docker.js';\nimport { hetznerCommand } from '@agentbox/sandbox-hetzner/cli';\nimport { destroyCommand } from './commands/destroy.js';\nimport { downloadCommand } from './commands/download.js';\nimport { driveCommand } from './commands/drive.js';\nimport { forkCommand } from './commands/fork.js';\nimport { installCommand } from './commands/install.js';\nimport { gitCommand } from './commands/git.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 { prepareCommand } from './commands/prepare.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { queueCommand } from './commands/queue.js';\nimport { relayCommand } from './commands/relay.js';\nimport { runQueuedJobCommand } from './commands/_run-queued-job.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 { urlCommand } from './commands/url.js';\nimport { waitCommand } from './commands/wait.js';\nimport { rewriteProviderPrefix } from './provider/argv-prefix.js';\n\nconst program = new Command();\n\nprogram\n .name('agentbox')\n .description('Launch coding agents in isolated sandboxes')\n .version(AGENTBOX_VERSION);\n\n// Required so `agentbox download env --dry-run` binds --dry-run to the `env`\n// subcommand rather than the parent `download` (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(forkCommand);\nprogram.addCommand(codexCommand);\nprogram.addCommand(gitCommand);\nprogram.addCommand(opencodeCommand);\nprogram.addCommand(codeCommand);\nprogram.addCommand(shellCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(openCommand);\nprogram.addCommand(urlCommand);\nprogram.addCommand(screenCommand);\nprogram.addCommand(downloadCommand);\nprogram.addCommand(cpCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(topCommand);\nprogram.addCommand(dashboardCommand);\nprogram.addCommand(driveCommand);\nprogram.addCommand(agentCommand);\nprogram.addCommand(waitCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(pauseCommand);\nprogram.addCommand(unpauseCommand);\nprogram.addCommand(stopCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(destroyCommand);\nprogram.addCommand(prepareCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(checkpointCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(queueCommand);\nprogram.addCommand(relayCommand);\n// Internal worker spawned by the relay's queue scheduler. Hidden from\n// `--help` (it shows nothing user-facing — see _run-queued-job.ts).\nprogram.addCommand(runQueuedJobCommand, { hidden: true });\nprogram.addCommand(daytonaCommand);\nprogram.addCommand(hetznerCommand);\nprogram.addCommand(dockerCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(installCommand);\n\nprogram.configureHelp({ visibleCommands: () => [] });\nprogram.addHelpText('after', () => '\\n' + buildGroupedHelp(program));\n\nawait applyEngineOverrideAtStartup();\n\nprogram.parseAsync(rewriteProviderPrefix(process.argv)).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\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', 'fork', 'codex', 'opencode'] },\n {\n title: 'Access',\n commands: ['dashboard', 'url', 'screen', 'code', 'shell', 'open', 'logs', 'drive'],\n },\n { title: 'Inspect', commands: ['list', 'status', 'top', 'agent'] },\n { title: 'Lifecycle', commands: ['start', 'stop', 'destroy', 'pause', 'unpause'] },\n { title: 'Sync & state', commands: ['download', 'cp', 'checkpoint', 'queue'] },\n {\n title: 'Advanced',\n commands: [\n 'prepare',\n 'wait',\n 'prune',\n 'self-update',\n 'install',\n 'config',\n 'relay',\n 'docker',\n 'daytona',\n 'hetzner',\n ],\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/**\n * True when a command was registered with `program.addCommand(cmd, { hidden: true })`.\n * commander v12 stores this on the private `_hidden` property; the cast keeps\n * the lint clean without exposing commander internals across the codebase.\n */\nfunction isHiddenCommand(cmd: Command): boolean {\n return (cmd as unknown as { _hidden?: boolean })._hidden === true;\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// Hidden commands (`addCommand(cmd, { hidden: true })`) are excluded — that's\n// how internal-only commands like `_run-queued-job` stay out of help. Any\n// registered visible 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 visible = program.commands.filter((c) => !isHiddenCommand(c));\n const byName = new Map(visible.map((c) => [c.name(), c] as const));\n const grouped = new Set(HELP_GROUPS.flatMap((g) => g.commands));\n const orphans = visible.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 { log } from '@clack/prompts';\nimport {\n BOX_STATUS_EVENT,\n type BoxStatus,\n type BoxStatusClaude,\n} from '@agentbox/ctl';\nimport { readBoxStatus } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport {\n AGENT_WAIT_STATES,\n derivedAgentState,\n isAgentWaitState,\n matchesAgentWaitState,\n type AgentWaitState,\n} from '../lib/wait/agent-state.js';\nimport { waitForEvent, WaitTimeoutError } from '../lib/wait/events.js';\nimport { handleLifecycleError } from './_errors.js';\n\nconst DEFAULT_WAIT_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport const agentCommand = new Command('agent').description(\n 'Query and wait on the in-box coding agent\\'s state (Claude Code plan-mode end, AskUserQuestion, idle/prompt-ready).',\n);\n\ninterface BoxRefOpts {\n json?: boolean;\n}\n\nconst agentStateCommand = new Command('state')\n .description('Print the current claude activity state for a box (or full status with --json).')\n .argument('[box]', 'box ref (default: only box in this project)')\n .option('--json', 'emit the full BoxStatusClaude payload as JSON')\n .action(async (boxRef: string | undefined, opts: BoxRefOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const status = await readBoxStatus(box);\n const claude = status?.claude;\n if (opts.json === true) {\n process.stdout.write(JSON.stringify(claude ?? null) + '\\n');\n return;\n }\n if (!claude) {\n log.info('no status snapshot yet for this box (hooks may not have fired)');\n return;\n }\n process.stdout.write(statusDisplay(claude) + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ninterface WaitForOpts {\n timeout?: string;\n json?: boolean;\n}\n\nconst agentWaitForCommand = new Command('wait-for')\n .description(`Block until the agent reaches a state. One of: ${AGENT_WAIT_STATES.join(' | ')}.`)\n .argument('<state>', `target state: ${AGENT_WAIT_STATES.join(' | ')}`)\n .argument('[box]', 'box ref (default: only box in this project)')\n .option('--timeout <ms>', `wall-clock cap (default: ${String(DEFAULT_WAIT_TIMEOUT_MS)})`)\n .option('--json', 'emit the matched claude payload as JSON')\n .action(async (state: string, boxRef: string | undefined, opts: WaitForOpts) => {\n try {\n if (!isAgentWaitState(state)) {\n log.error(`unknown state '${state}' (one of: ${AGENT_WAIT_STATES.join(', ')})`);\n process.exit(2);\n }\n const target: AgentWaitState = state;\n const box = await resolveBoxOrExit(boxRef);\n const timeoutMs =\n opts.timeout !== undefined ? parsePositiveInt(opts.timeout, '--timeout') : DEFAULT_WAIT_TIMEOUT_MS;\n\n // Fast path: maybe the box is already in the target state.\n const current = await readBoxStatus(box);\n if (current?.claude && matchesAgentWaitState(current.claude, target)) {\n emitMatch(current.claude, opts.json === true);\n return;\n }\n\n // Subscribe to relay events. Filter to box-status events for this box,\n // re-check on each push.\n try {\n const claude = await waitForEvent<BoxStatusClaude>(\n (ev) => {\n if (ev.boxId !== box.id) return undefined;\n if (ev.type !== BOX_STATUS_EVENT) return undefined;\n const payload = ev.payload as BoxStatus | undefined;\n if (!payload?.claude) return undefined;\n return matchesAgentWaitState(payload.claude, target) ? payload.claude : undefined;\n },\n { boxId: box.id, timeoutMs },\n );\n emitMatch(claude, opts.json === true);\n } catch (err) {\n if (err instanceof WaitTimeoutError) {\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ matched: false, elapsedMs: err.elapsedMs }) + '\\n',\n );\n } else {\n log.error(`agent did not reach '${target}' within ${String(timeoutMs)}ms`);\n }\n process.exit(1);\n }\n throw err;\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst agentGetPlanQuestionCommand = new Command('get-plan-question')\n .description(\"Print the active ExitPlanMode plan body or AskUserQuestion content (whichever is current).\")\n .argument('[box]', 'box ref (default: only box in this project)')\n .option('--json', 'emit the structured payload as JSON instead of a human render')\n .action(async (boxRef: string | undefined, opts: BoxRefOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const status = await readBoxStatus(box);\n const claude = status?.claude;\n if (opts.json === true) {\n const out = claude?.plan ?? claude?.question ?? null;\n process.stdout.write(JSON.stringify(out) + '\\n');\n return;\n }\n if (claude?.plan) {\n process.stdout.write(claude.plan.plan + '\\n');\n return;\n }\n if (claude?.question) {\n for (const q of claude.question.questions) {\n process.stdout.write(`${q.question}\\n`);\n for (const o of q.options) {\n process.stdout.write(` - ${o.label}${o.description ? ` — ${o.description}` : ''}\\n`);\n }\n }\n return;\n }\n log.info('no pending plan or question for this box');\n process.exit(1);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nagentCommand.addCommand(agentStateCommand);\nagentCommand.addCommand(agentWaitForCommand);\nagentCommand.addCommand(agentGetPlanQuestionCommand);\n\nfunction emitMatch(claude: BoxStatusClaude, asJson: boolean): void {\n if (asJson) {\n process.stdout.write(JSON.stringify(claude) + '\\n');\n } else {\n process.stdout.write(derivedAgentState(claude) + '\\n');\n }\n}\n\nfunction statusDisplay(claude: BoxStatusClaude): string {\n return derivedAgentState(claude);\n}\n\nfunction parsePositiveInt(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || String(n) !== raw.trim()) {\n throw new Error(`${label} must be a positive integer (got: ${raw})`);\n }\n return n;\n}\n","import { findProjectRoot } from '@agentbox/config';\nimport {\n AmbiguousBoxError,\n BoxNotFoundError,\n type BoxRecord,\n type FindBoxResult,\n} from '@agentbox/core';\nimport { readState, resolveBoxRef } from '@agentbox/sandbox-core';\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","// Pure state-matching helpers for `agentbox agent`. Extracted so they have a\n// unit-testable surface — see test/agent-state.test.ts.\n\nimport type { BoxStatusClaude, ClaudeActivityState } from '@agentbox/ctl';\n\nexport const AGENT_WAIT_STATES = [\n 'working',\n 'idle',\n 'waiting',\n 'end-plan',\n 'question',\n 'prompt',\n 'compacting',\n 'error',\n] as const;\nexport type AgentWaitState = (typeof AGENT_WAIT_STATES)[number];\n\nexport function isAgentWaitState(s: string): s is AgentWaitState {\n return (AGENT_WAIT_STATES as readonly string[]).includes(s);\n}\n\n/**\n * `prompt` means \"ready for a new user message\": Claude is idle, the tmux\n * session is up, and there's no pending plan or question payload. Used both\n * by `agent wait-for prompt` and as the human-readable label in `agent state`\n * when those conditions hold.\n */\nexport function isPromptReady(claude: BoxStatusClaude): boolean {\n return (\n claude.state === 'idle' &&\n claude.sessionRunning &&\n claude.plan === undefined &&\n claude.question === undefined\n );\n}\n\nexport function matchesAgentWaitState(claude: BoxStatusClaude, target: AgentWaitState): boolean {\n if (target === 'prompt') return isPromptReady(claude);\n if (target === 'end-plan') {\n // ExitPlanMode triggers Notification:permission_prompt → state=waiting\n // almost immediately. The plan payload is what tells us the user is\n // parked at \"approve the plan\", so accept either signal.\n return claude.plan !== undefined || claude.state === 'end-plan';\n }\n if (target === 'question') {\n return claude.question !== undefined || claude.state === 'question';\n }\n return claude.state === (target as ClaudeActivityState);\n}\n\n/**\n * Display string used when no `--json` is requested. Prefers the semantic\n * label (`prompt` / `end-plan` / `question`) over the raw `waiting` flicker.\n */\nexport function derivedAgentState(claude: BoxStatusClaude): string {\n if (isPromptReady(claude)) return 'prompt';\n if (claude.plan !== undefined) return 'end-plan';\n if (claude.question !== undefined) return 'question';\n return claude.state;\n}\n","// Long-poll subscription to the host relay's `/admin/events` ring buffer.\n// Used by `agentbox agent wait-for` and `agentbox queue wait-for` to block on\n// state transitions without inventing a new endpoint. Polling is fine here:\n// the relay buffers 1000 events in memory, and the cursor-based query is\n// dependency-free (plain GET).\n\nimport { ensureRelay } from '@agentbox/sandbox-docker';\n\nconst POLL_INTERVAL_MS = 500;\n\nexport interface RelayEvent {\n id: number;\n boxId: string;\n type: string;\n receivedAt: string;\n ts?: string;\n payload?: unknown;\n}\n\nexport interface SubscribeOptions {\n /** Filter to a single box id (else all). */\n boxId?: string;\n /** Wall-clock cap. Throws AbortError when reached. */\n timeoutMs?: number;\n /** Optional starting cursor; defaults to \"current head\" (skip historical events). */\n sinceId?: number;\n}\n\nexport class WaitTimeoutError extends Error {\n constructor(public readonly elapsedMs: number) {\n super(`wait-for timed out after ${String(elapsedMs)}ms`);\n this.name = 'WaitTimeoutError';\n }\n}\n\n/**\n * Block until `predicate` returns truthy for one of the events streaming out\n * of `/admin/events`. The predicate's return value is what `waitForEvent`\n * resolves to — handy for \"match + decode\" in one step.\n *\n * Race-handling note: when the caller doesn't pass `sinceId`, the first fetch\n * is `since=0` — which returns the whole buffer. We evaluate the predicate\n * against the LATEST event in that batch (not the rest, to avoid replaying\n * stale historical transitions) so a state change that was broadcast to the\n * ring buffer but whose `status.json` atomic write was still in flight when\n * the caller's fast-path read happened is still caught here. Subsequent\n * fetches then long-poll from the head cursor as usual.\n */\nexport async function waitForEvent<T>(\n predicate: (ev: RelayEvent) => T | undefined,\n opts: SubscribeOptions = {},\n): Promise<T> {\n const relayUrl = await getRelayUrl();\n const start = Date.now();\n let cursor = opts.sinceId ?? 0;\n let bootstrapped = opts.sinceId !== undefined;\n while (true) {\n const remaining = opts.timeoutMs !== undefined ? opts.timeoutMs - (Date.now() - start) : Infinity;\n if (remaining <= 0) throw new WaitTimeoutError(Date.now() - start);\n\n const events = await fetchEvents(relayUrl, cursor, opts.boxId);\n\n if (!bootstrapped) {\n // First sweep with no caller-supplied cursor: only the most recent\n // event represents \"current state\" — older buffered events are stale\n // transitions. Match against the head, advance cursor past it, and\n // proceed to long-poll for future transitions.\n const last = events[events.length - 1];\n if (last) {\n const matched = predicate(last);\n if (matched !== undefined) return matched;\n cursor = last.id;\n }\n bootstrapped = true;\n } else {\n for (const ev of events) {\n const matched = predicate(ev);\n if (matched !== undefined) return matched;\n cursor = Math.max(cursor, ev.id);\n }\n }\n // No match in this batch — sleep and re-poll (or wake early on timeout).\n const sleepMs = Math.min(POLL_INTERVAL_MS, remaining);\n if (sleepMs > 0) await sleep(sleepMs);\n }\n}\n\nasync function fetchEvents(\n relayUrl: string,\n since: number,\n boxId: string | undefined,\n): Promise<RelayEvent[]> {\n const url = new URL('/admin/events', relayUrl);\n url.searchParams.set('since', String(since));\n if (boxId) url.searchParams.set('box', boxId);\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`relay /admin/events: HTTP ${String(res.status)}`);\n }\n const body = (await res.json()) as { events?: RelayEvent[] };\n return body.events ?? [];\n}\n\nasync function getRelayUrl(): Promise<string> {\n // ensureRelay is idempotent: it spawns the host relay process if it's not\n // already running. `hostUrl` is the loopback view from this side; `url` is\n // the host.docker.internal view used inside boxes.\n const ep = await ensureRelay();\n return ep.hostUrl;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\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, spinner } from '@clack/prompts';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type AttachOpenIn,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n buildClaudeAttachArgv,\n buildClaudeLoginRunArgv,\n ClaudeSessionError,\n claudeSessionInfo,\n createBox,\n DEFAULT_RELAY_PORT,\n detectEngine,\n ensureClaudeVolume,\n ensureImage,\n formatDetachNotice,\n hostBackupHasCredentials,\n inspectBox,\n rebuildPluginNativeDeps,\n runInteractiveClaudeLogin,\n seedSetupSkillIntoVolume,\n SHARED_CLAUDE_VOLUME,\n startBox,\n startClaudeSession,\n syncClaudeCredentials,\n unpauseBox,\n warmUpClaudeCredentials,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveClaudeAuth, type ResolvedClaudeAuth } from '../auth.js';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport {\n assertAgentCredsAvailable,\n MissingAgentCredsError,\n} from '../lib/queue/assert-creds.js';\nimport { buildPromptArgs } from '../lib/queue/build-prompt-args.js';\nimport { submitQueueJob } from '../lib/queue/submit.js';\nimport {\n ATTACH_IN_HELP,\n INLINE_HELP,\n NO_ATTACH_HELP,\n resolveAttachInOption,\n} from './_attach-in.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\nimport { cloudAgentCreate } from './_cloud-agent-create.js';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, resolveFromBranch } from '../lib/from-branch.js';\nimport { providerForBox, providerForCreate } from '../provider/registry.js';\nimport {\n prepareTeleport,\n TeleportError,\n uploadTeleport,\n type ResolvedTeleport,\n type ResumeMode,\n} from '../session-teleport/index.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { maybeShowInstallHint } from '../lib/install-hint.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybePromptPortless } from '../portless-prompt.js';\nimport { maybeRunSetupWizard } from '../wizard.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.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\n/** Validate `--max-running <n>` from commander into a positive integer; throws on garbage. */\nfunction parseMaxRunningOption(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`--max-running: expected a positive integer, got \"${raw}\"`);\n }\n return n;\n}\n\n/** Project an agent-create options struct down to what the queue worker needs. */\nfunction pickCreateOpts(opts: ClaudeCreateOptions): import('@agentbox/relay').QueueJobCreateOpts {\n return {\n workspace: opts.workspace,\n name: opts.name,\n hostSnapshot: opts.hostSnapshot,\n snapshot: opts.snapshot,\n image: opts.image,\n withPlaywright: opts.withPlaywright,\n withEnv: opts.withEnv,\n vnc: opts.vnc,\n sharedDockerCache: opts.sharedDockerCache,\n portless: opts.portless,\n sessionName: opts.sessionName,\n memory: opts.memory,\n cpus: opts.cpus,\n pidsLimit: opts.pidsLimit,\n disk: opts.disk,\n };\n}\n\n/** Log how much the plugin-cache prune reclaimed, when it reclaimed anything. */\nfunction logPrune(rebuild: { pruned: string[]; prunedBytes: number }): void {\n if (rebuild.prunedBytes <= 0) return;\n const mb = Math.round(rebuild.prunedBytes / 1024 / 1024);\n const n = rebuild.pruned.length;\n log.info(`pruned ${String(n)} stale plugin cache${n === 1 ? '' : 's'} (${String(mb)} MB freed)`);\n}\n\n/** Host-side URL for the relay (always loopback for the wrapper's SSE subscription). */\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/**\n * Replacement for the old `attachClaudeSession`: builds the docker tmux-\n * attach argv, hands it to the node-pty wrapper for the footer + prompt\n * channel, then exits with the inner pty's exit code. Falls back\n * transparently to plain spawnSync inside `runWrappedAttach` when stdio\n * isn't a TTY or node-pty isn't installed.\n */\nasync function attachClaudeWrapped(\n box: { id: string; name: string; container: string; projectIndex?: number },\n sessionName: string | undefined,\n reattach: string,\n onError?: (msg: string) => void,\n openIn?: AttachOpenIn,\n): Promise<never> {\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildClaudeAttachArgv(box.container, sessionName),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'claude',\n detachNotice: formatDetachNotice(reattach),\n onError,\n openIn,\n });\n process.exit(code);\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 /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** Sandbox backend: `docker` (default) or `daytona`. */\n provider?: string;\n /** --from-branch <ref>: base the box's per-box branch on this ref instead of HEAD. */\n fromBranch?: string;\n /** -v / --verbose: bypass the spinner and stream raw provider output. */\n verbose?: boolean;\n /** Raw `--attach-in <mode>` value; validated by `parseAttachInOption`. */\n attachIn?: string;\n /** --inline: shortcut for `--attach-in same` (long-form only — `-i` is `--initial-prompt`). */\n inline?: boolean;\n /** Commander parses `-b, --no-attach` as `attach: false` (defaults true). */\n attach?: boolean;\n /**\n * `-i, --initial-prompt <text>`: seed the claude TUI with this user turn\n * and run in background mode (no attach). Jobs go through the host-wide\n * queue; `--max-running` overrides `queue.maxConcurrent` for this job.\n */\n initialPrompt?: string;\n /** Per-invocation override of `queue.maxConcurrent` (number string from commander). */\n maxRunning?: string;\n /** `-c, --continue`: teleport and resume the most recent host claude session for this cwd. */\n continue?: boolean;\n /** `--resume <id>`: teleport and resume the specified host claude session by id. */\n resume?: 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 if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n const attachIn = resolveAttachInOption(opts);\n if (attachIn !== undefined) out.attach = { openIn: attachIn };\n return out;\n}\n\n/**\n * Run `claude auth login` in a throwaway container against the shared\n * claude-config volume, then extract the result to the host backup so every\n * future box (shared or isolate) is seeded from it. Returns the login\n * command's exit code.\n */\nasync function runClaudeLoginContainer(image: string, extraArgs: string[]): Promise<number> {\n const { exitCode } = runInteractiveClaudeLogin(\n buildClaudeLoginRunArgv({ volume: SHARED_CLAUDE_VOLUME, image, extraArgs }),\n );\n if (exitCode === 0) {\n // Absorb the fresh-token first-request 400 in a throwaway container before\n // any box uses these credentials (see warmUpClaudeCredentials). Runs before\n // syncClaudeCredentials so the host backup captures any token the warm-up\n // refreshes.\n const s = spinner();\n s.start('checking credentials');\n const warm = await warmUpClaudeCredentials(SHARED_CLAUDE_VOLUME, image, {\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n s.stop(warm.warmed ? 'credentials ready' : 'credentials check incomplete — continuing');\n await syncClaudeCredentials({ volume: SHARED_CLAUDE_VOLUME }, { image, isolate: false });\n }\n return exitCode;\n}\n\n/**\n * First-run sign-in offer, shown before box creation / the setup wizard. When\n * no credentials are available yet, prompts the user and (on confirm) runs\n * `claude auth login` in a throwaway container — the result seeds every future\n * box via the host backup. Silent no-op when credentials already exist, in\n * non-interactive runs, or when the user provided auth via host env.\n */\nasync function maybeRunClaudeLogin(args: {\n image: string;\n authSource: ResolvedClaudeAuth['source'];\n yes: boolean;\n /** Host workspace path — seeds the project-scoped `/workspace` alias into\n * the volume's `_claude.json` before the login container runs. */\n hostWorkspace: string;\n}): Promise<void> {\n // Skip when: non-interactive / --yes; the user explicitly provided auth via\n // host env (respect an intentional ANTHROPIC_API_KEY); or the host backup\n // already holds real credentials (every box gets seeded from it). A legacy\n // auth.json setup-token (`auth-file`) still gets the offer — that is the\n // \"Claude API\" -> subscription upgrade.\n if (!process.stdin.isTTY || args.yes) return;\n if (args.authSource === 'host-env') return;\n if (await hostBackupHasCredentials()) return;\n\n const message =\n args.authSource === 'auth-file'\n ? \"You're on a legacy API token (shows as 'Claude API'). Sign in with your Claude subscription instead?\"\n : 'Sign in with your Claude subscription? (saved and reused by every box)';\n const answer = await confirm({ message, initialValue: true });\n if (isCancel(answer) || !answer) {\n log.info('Skipped sign-in — claude will prompt you to /login inside the box.');\n return;\n }\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(args.image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Seed the shared claude-config volume from the host's ~/.claude *before*\n // the login container runs, so `claude auth login` writes its oauthAccount\n // on top of the host config (trust, installMethod, project alias) rather\n // than into an empty volume. ensureClaudeVolume is write-once for\n // _claude.json, so the later createBox sync can't clobber the login's work.\n s.message('preparing claude config');\n await ensureClaudeVolume(\n { volume: SHARED_CLAUDE_VOLUME },\n { syncFromHost: true, image: args.image, hostWorkspace: args.hostWorkspace },\n );\n s.stop('image ready');\n\n const exitCode = await runClaudeLoginContainer(args.image, ['--claudeai']);\n if (exitCode !== 0) {\n log.warn('Claude login did not complete; continuing — run `agentbox claude login` to retry.');\n return;\n }\n log.success('Signed in with your Claude subscription — saved for future boxes.');\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', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\n .option('--no-host-snapshot', 'tar-pipe directly from the live host workspace at create time')\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')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\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 .option(\n '--provider <name>',\n \"sandbox backend: 'docker' (default) or 'daytona' for a cloud box\",\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-v, --verbose',\n 'bypass the spinner and stream raw provider output (docker build / Daytona snapshot create) to stderr. The same content always lands in ~/.agentbox/logs/claude.log.',\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('--inline', INLINE_HELP)\n .option('-b, --no-attach', NO_ATTACH_HELP)\n .option(\n '-i, --initial-prompt <text>',\n 'seed the claude session with this initial user turn and run in background (no attach). Jobs go through the host-wide queue (queue.maxConcurrent). NOTE: this is NOT claude\\'s own `-p` headless print mode — for that, pass `-- -p ...`.',\n )\n .option(\n '--max-running <n>',\n 'per-invocation override of queue.maxConcurrent; only honored when `-i` is set',\n )\n .option(\n '-c, --continue',\n 'teleport the most recent host Claude Code session for this cwd into the box and resume from it',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Claude Code session id into the box and resume from it',\n )\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 const cmdLog = openCommandLog('claude');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Starting Claude in a box...');\n\n // -c / --continue / --resume <id>: handled by agentbox (the teleport runs\n // after box creation, below) and forwarded to the in-box claude as the\n // canonical `--resume <id>` tuple. The in-box claude never sees `-c`.\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n cmdLog.close();\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n if (resumeMode && opts.initialPrompt && opts.initialPrompt.length > 0) {\n log.error('-i / --initial-prompt cannot be combined with -c / --resume (seeding a new turn into a resumed session is not supported).');\n cmdLog.close();\n process.exit(2);\n }\n // Pre-flight: resolve the host session BEFORE any box work so a missing\n // session id fails fast (the user doesn't pay for a doomed box).\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'claude',\n hostCwd: opts.workspace,\n mode: resumeMode,\n log: (line) => cmdLog.write(line),\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildClaudeCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n // Resolve provider once. The --provider flag wins, then box.provider config,\n // then default 'docker'. The Docker-only fast path below skips entirely on\n // cloud — we delegate to the cloud-agent-create helper after running the\n // (provider-agnostic) setup wizard.\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const isCloud = providerName !== 'docker';\n\n // -i / --initial-prompt: background mode. Write a queue manifest and exit;\n // the relay's queue loop spawns the worker as a slot frees. Docker-only\n // for v1 — the cloud `cloudAgentCreate` path starts the tmux session\n // lazily on first attach, so a \"create but don't attach\" cloud run has no\n // chance to seed the prompt.\n if (opts.initialPrompt && opts.initialPrompt.length > 0) {\n if (isCloud) {\n log.error('-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).');\n cmdLog.close();\n process.exit(2);\n }\n try {\n await assertAgentCredsAvailable({\n agent: 'claude-code',\n image: cfg.effective.box.image,\n });\n } catch (err) {\n if (err instanceof MissingAgentCredsError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const maxRunningOverride = parseMaxRunningOption(opts.maxRunning);\n const result = await submitQueueJob({\n agent: 'claude-code',\n boxName: opts.name ?? '',\n providerName,\n prompt: opts.initialPrompt,\n agentArgs: claudeArgs,\n createOpts: pickCreateOpts(opts),\n maxRunningOverride,\n });\n outro(\n `job ${result.job.id} queued (${String(result.runningCount)}/${String(result.maxConcurrent)} running); log: ${result.job.logPath}`,\n );\n cmdLog.close();\n return;\n }\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n // Resolve auth from host env or the legacy ~/.agentbox/auth.json\n // setup-token (the dormant CI fallback).\n const resolved = await resolveClaudeAuth(process.env);\n\n // First-run sign-in offer is Docker-only — the cloud path seeds creds via\n // the per-agent Daytona volume (see ensureAgentVolumesForCloud).\n if (!isCloud) {\n await maybeRunClaudeLogin({\n image: cfg.effective.box.image,\n authSource: resolved.source,\n yes: !!opts.yes,\n hostWorkspace: opts.workspace,\n });\n }\n\n // Portless is Docker Desktop-only — skip on cloud.\n const portlessEnabled = isCloud\n ? undefined\n : await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask BEFORE the\n // wizard so the user sees the host-secrets prompt while still in the\n // pre-create phase. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\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 provider: providerName,\n withEnv: cfg.effective.box.withEnv,\n });\n let effectiveClaudeArgs = claudeArgs;\n if (wiz.action === 'launch-with-prompt' && wiz.initialPrompt) {\n effectiveClaudeArgs = buildPromptArgs('claude-code', wiz.initialPrompt, claudeArgs);\n }\n\n // Validate --from-branch before any provider work so a typo doesn't\n // leave a half-created box.\n let fromBranch: string | undefined;\n try {\n fromBranch = await resolveFromBranch(opts.fromBranch, { repo: opts.workspace });\n } catch (err) {\n if (err instanceof FromBranchError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n\n if (isCloud) {\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n await cloudAgentCreate({\n provider,\n request: {\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n envFilesToImport: wiz.envFilesToImport,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n fromBranch,\n projectRoot,\n },\n binary: 'claude',\n sessionName: cfg.effective.claude.sessionName,\n mode: 'claude',\n extraArgs: effectiveClaudeArgs,\n verbose: opts.verbose === true,\n openIn: cfg.effective.attach.openIn,\n attach: opts.attach !== false,\n beforeStart: resumePrepared\n ? async (box) => {\n try {\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared!,\n log: (line) => cmdLog.write(line),\n });\n return { agentArgsPrefix: resumePrepared!.forwardArgs };\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n : undefined,\n });\n return;\n }\n\n // host-snapshot default off: with the overlay retired, the snapshot is\n // only the tar-pipe source for the no-git case, and skipped entirely for\n // git-detected workspaces. Explicit flag/config still wins.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n const sessionName = cfg.effective.claude.sessionName;\n\n const s = makeProgressReporter(opts.verbose === true);\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 fromBranch,\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 envFilesToImport: wiz.envFilesToImport,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\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 cmdLog.write('checking plugin native deps');\n const rebuild = await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n\n if (resumePrepared) {\n s.message('uploading claude session into box');\n cmdLog.write('uploading claude session into box');\n try {\n const provider = await providerForBox(result.record);\n await uploadTeleport({\n box: result.record,\n provider,\n resolved: resumePrepared,\n log: (line) => {\n s.message(clampSpinnerLine(line));\n cmdLog.write(line);\n },\n });\n effectiveClaudeArgs = [...resumePrepared.forwardArgs, ...effectiveClaudeArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n log.info(\n `The box ${result.record.container} is up but unused. Destroy it with: agentbox destroy ${result.record.container} -y`,\n );\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\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 logPrune(rebuild);\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 maybeShowInstallHint();\n\n if (opts.attach === false) {\n outro(\n `session started — attach with: agentbox claude attach ${reattachRef(result.record)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves claude running');\n await attachClaudeWrapped(\n result.record,\n sessionName,\n reattachRef(result.record),\n (m) => cmdLog.write(m),\n cfg.effective.attach.openIn,\n );\n } catch (err) {\n s.stop('failed');\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);\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 cmdLog.close();\n process.exit(1);\n }\n handleLifecycleError(err);\n } finally {\n cmdLog.close();\n }\n });\n\ninterface ClaudeStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n attachIn?: string; // raw `--attach-in <mode>` value, validated below.\n inline?: boolean; // -i / --inline: shortcut for --attach-in same.\n attach?: boolean; // commander: --no-attach => false; default true.\n continue?: boolean; // -c / --continue: teleport newest session for cwd.\n resume?: string; // --resume <id>: teleport specific session.\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 resumePrepared?: ResolvedTeleport | null,\n): Promise<void> {\n const attachIn = resolveAttachInOption(opts);\n const cliOverrides: Partial<UserConfig> = {};\n if (opts.sessionName) cliOverrides.claude = { sessionName: opts.sessionName };\n if (attachIn !== undefined) cliOverrides.attach = { openIn: attachIn };\n const cfg = await loadEffectiveConfig(box.workspacePath, { cliOverrides });\n const sessionName = cfg.effective.claude.sessionName;\n const openIn = cfg.effective.attach.openIn;\n const wantAttach = opts.attach !== false;\n // Read-only — used to gate the first-run login offer (respect an intentional\n // host ANTHROPIC_API_KEY). The box already exists, so `resolved.env` is not\n // forwarded here.\n const resolved = await resolveClaudeAuth(process.env);\n\n // Auto-unpause/start. Mirrors `agentbox shell` / `agentbox code`.\n // `startBox` 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 // A login can't be inserted into a live session; an unauthenticated one\n // shows claude's own in-TUI `/login` on attach.\n const existing = await claudeSessionInfo(box.container, sessionName);\n if (existing.running) {\n if (resumePrepared) {\n throw new Error(\n `cannot resume into ${box.name}: a Claude session is already running. Detach and kill the session first (Control+a then :kill-session), or use \\`agentbox claude attach\\` to reattach to the live one.`,\n );\n }\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" already running — attach with: agentbox claude attach ${reattachRef(box)}`,\n );\n return;\n }\n outro(`session \"${sessionName}\" already running — attaching (Control+a d to detach)`);\n await attachClaudeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n return;\n }\n\n // First-run sign-in offer — before any box prep, so the user signs in up\n // front. No-op when credentials already exist or this isn't interactive.\n await maybeRunClaudeLogin({\n image: box.image,\n authSource: resolved.source,\n yes: false,\n hostWorkspace: box.workspacePath,\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` 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');\n await startBox(box.id);\n }\n\n // Re-sync the host's ~/.claude into the box volume so any updates the user\n // made on the host (new MCP servers, refreshed OAuth state in _claude.json,\n // …) reach the in-box claude. This runs for `claude start` (default; opt out\n // with --no-sync-config) — NOT for `claude attach`, which always passes\n // syncConfig: false: a plain reattach must never clobber the in-box claude's\n // accumulated _claude.json (prompt history) with the host copy.\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 // Box-only: ensure /agentbox-setup is in the volume (image-seeded, never\n // on the host). Re-copied every run so an image upgrade propagates.\n const claudeVolume = box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME;\n await seedSetupSkillIntoVolume(claudeVolume, box.image);\n\n // Mirror the in-box OAuth credentials with the host backup. Runs regardless\n // of --no-sync-config (this is not the host ~/.claude rsync) — it keeps the\n // backup fresh as the in-box claude rotates its token, and seeds an isolate\n // box's volume from an up-front `maybeRunClaudeLogin`.\n await syncClaudeCredentials(\n { volume: claudeVolume },\n { image: box.image, isolate: claudeVolume !== SHARED_CLAUDE_VOLUME },\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 let effectiveArgs = claudeArgs;\n if (resumePrepared) {\n s.message('uploading claude session into box');\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared,\n log: (line) => s.message(clampSpinnerLine(line)),\n });\n effectiveArgs = [...resumePrepared.forwardArgs, ...effectiveArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n\n s.message('starting claude session');\n await startClaudeSession({\n container: box.container,\n claudeArgs: effectiveArgs,\n sessionName,\n boxName: box.name,\n });\n\n s.stop(`box ${box.container} ready`);\n logPrune(rebuild);\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 if (!wantAttach) {\n outro(\n `session \"${sessionName}\" started — attach with: agentbox claude attach ${reattachRef(box)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves claude running');\n await attachClaudeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\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; never re-syncs ~/.claude — use `claude start` for that)',\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('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\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('Attaching to Claude session...');\n try {\n const attachIn = resolveAttachInOption(opts);\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') !== 'docker') {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'claude',\n sessionName: opts.sessionName ?? 'claude',\n mode: 'claude',\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n // A plain reattach must never touch host config. Force syncConfig off so\n // the no-session path starts a fresh session without the host->volume\n // rsync (which would overwrite the in-box _claude.json / prompt history).\n await startOrAttachClaude(box, [], { ...opts, syncConfig: false });\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 .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .option('-b, --no-attach', NO_ATTACH_HELP)\n .option(\n '-c, --continue',\n 'teleport the most recent host Claude Code session for this cwd into the box and resume',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Claude Code session id into the box and resume',\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('Starting Claude in a box...');\n try {\n const attachIn = resolveAttachInOption(opts);\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 let effectiveClaudeArgs = shifted && idOrName ? [idOrName, ...claudeArgs] : claudeArgs;\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'claude',\n hostCwd: box.workspacePath,\n mode: resumeMode,\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n if ((box.provider ?? 'docker') !== 'docker') {\n if (opts.attach === false) {\n outro(\n `--no-attach: cloud agent sessions are started lazily on attach. Run: agentbox claude attach ${reattachRef(box)}`,\n );\n return;\n }\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n if (resumePrepared) {\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({ box, provider, resolved: resumePrepared });\n effectiveClaudeArgs = [...resumePrepared.forwardArgs, ...effectiveClaudeArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n await cloudAgentAttach({\n box,\n binary: 'claude',\n sessionName: opts.sessionName ?? 'claude',\n mode: 'claude',\n extraArgs: effectiveClaudeArgs,\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachClaude(box, effectiveClaudeArgs, opts, resumePrepared);\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 claudeLoginCommand = new Command('login')\n .description(\n 'Sign in to Claude for use in sandboxes (forwards args to `claude auth login`, e.g. --sso, --console). Runs in a throwaway container against the shared claude-config volume — usable before the first `agentbox claude`.',\n )\n .argument(\n '[args...]',\n 'extra args forwarded to `claude auth login`; place after `--`, e.g. `agentbox claude login -- --sso`',\n )\n .action(async (args: string[]) => {\n intro('Signing in to Claude...');\n if (!process.stdin.isTTY) {\n log.error('`agentbox claude login` needs an interactive terminal.');\n process.exit(1);\n }\n try {\n const cfg = await loadEffectiveConfig(process.cwd());\n const image = cfg.effective.box.image;\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n s.stop('image ready');\n\n // Throwaway `docker run` against the shared volume — the written\n // credentials persist there and `syncClaudeCredentials` mirrors them to\n // the host backup, so every later box (shared or isolate) is seeded.\n const exitCode = await runClaudeLoginContainer(image, args);\n if (exitCode !== 0) {\n log.warn(`\\`claude auth login\\` exited with code ${String(exitCode)}`);\n process.exit(exitCode);\n }\n outro('signed in — credentials saved for future boxes');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nclaudeCommand.addCommand(claudeAttachCommand);\nclaudeCommand.addCommand(claudeStartCommand);\nclaudeCommand.addCommand(claudeLoginCommand);\n","import { readFile } from 'node:fs/promises';\nimport { 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. */\n source: 'host-env' | 'auth-file' | 'none';\n}\n\n/**\n * Merge host env + the legacy `~/.agentbox/auth.json` setup-token into the\n * effective env that the `claude` command forwards to the box. Env wins over\n * the file; either of the two known keys (API key or OAuth token) counts as\n * having auth.\n *\n * This is the **dormant fallback** path. The primary auth flow is the in-box\n * interactive OAuth login, persisted by `syncClaudeCredentials` — a box that\n * has real credentials in its claude-config volume ignores any forwarded\n * `CLAUDE_CODE_OAUTH_TOKEN` anyway. `auth.json` is only ever read here, never\n * written, kept so existing users and CI keep working.\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","import { stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n hostBackupHasCredentials,\n OPENCODE_FORWARDED_ENV_KEYS,\n SHARED_CODEX_VOLUME,\n SHARED_OPENCODE_VOLUME,\n volumeHasCodexAuth,\n volumeHasOpencodeAuth,\n} from '@agentbox/sandbox-docker';\nimport type { QueueAgentKind } from '@agentbox/relay';\nimport { resolveClaudeAuth } from '../../auth.js';\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * True when Claude is already authenticated on the host: a forwarded env var\n * (`ANTHROPIC_API_KEY` / `CLAUDE_CODE_OAUTH_TOKEN`), the legacy\n * `~/.agentbox/auth.json` setup-token, or a real OAuth refresh token in the\n * host backup (`~/.agentbox/claude-credentials.json`). The backup is what the\n * foreground sync writes whenever a box's claude logs in, so its presence is\n * the load-bearing signal that the shared volume has been seeded.\n */\nexport async function claudeAuthAvailable(env: NodeJS.ProcessEnv): Promise<boolean> {\n const resolved = await resolveClaudeAuth(env);\n if (resolved.source !== 'none') return true;\n return hostBackupHasCredentials();\n}\n\n/**\n * True when Codex is already authenticated: `OPENAI_API_KEY` in env, a host\n * `~/.codex/auth.json`, or an `auth.json` already in the shared codex-config\n * volume. Mirrors the foreground command's local helper so the `-i`\n * pre-flight and the interactive login offer agree on what counts as\n * \"seeded\".\n */\nexport async function codexAuthAvailable(\n image: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<boolean> {\n if ((env['OPENAI_API_KEY'] ?? '').length > 0) return true;\n if (await fileExists(join(homedir(), '.codex', 'auth.json'))) return true;\n return volumeHasCodexAuth(SHARED_CODEX_VOLUME, image);\n}\n\n/**\n * True when OpenCode is already authenticated: any of its forwarded provider\n * env keys, a host `~/.local/share/opencode/auth.json`, or an `auth.json`\n * already in the shared opencode volume.\n */\nexport async function opencodeAuthAvailable(\n image: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<boolean> {\n for (const k of OPENCODE_FORWARDED_ENV_KEYS) {\n if ((env[k] ?? '').length > 0) return true;\n }\n if (await fileExists(join(homedir(), '.local', 'share', 'opencode', 'auth.json'))) return true;\n return volumeHasOpencodeAuth(SHARED_OPENCODE_VOLUME, image);\n}\n\nconst MESSAGES: Record<QueueAgentKind, string> = {\n 'claude-code':\n '-i / --initial-prompt: no Claude credentials on host. Run `agentbox claude login` first (or `agentbox claude` interactively) to seed them, then retry.',\n codex:\n '-i / --initial-prompt: no Codex credentials on host. Run `agentbox codex login` first (or set OPENAI_API_KEY) to seed them, then retry.',\n opencode:\n '-i / --initial-prompt: no OpenCode credentials on host. Run `agentbox opencode login` first to seed them, then retry.',\n};\n\nexport class MissingAgentCredsError extends Error {\n readonly agent: QueueAgentKind;\n constructor(agent: QueueAgentKind, message: string) {\n super(message);\n this.name = 'MissingAgentCredsError';\n this.agent = agent;\n }\n}\n\nexport interface AssertAgentCredsInput {\n agent: QueueAgentKind;\n image: string;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Pre-flight for the background `-i` path: throw `MissingAgentCredsError`\n * when the chosen agent has no host-side credentials to seed into the box.\n * The worker (`_run-queued-job.ts`) runs in detached mode with no attach, so\n * an unauthenticated in-box agent would silently sit on its `/login` UI with\n * the user's prompt unprocessed until the user re-attaches — that is the UX\n * this guard prevents.\n */\nexport async function assertAgentCredsAvailable(input: AssertAgentCredsInput): Promise<void> {\n const env = input.env ?? process.env;\n let ok = false;\n if (input.agent === 'claude-code') {\n ok = await claudeAuthAvailable(env);\n } else if (input.agent === 'codex') {\n ok = await codexAuthAvailable(input.image, env);\n } else {\n ok = await opencodeAuthAvailable(input.image, env);\n }\n if (!ok) throw new MissingAgentCredsError(input.agent, MESSAGES[input.agent]);\n}\n","import { resolveAgentLauncher, type AgentKind } from '@agentbox/core';\n\n/**\n * Build the argv the in-box agent CLI is launched with, slotting `prompt` as\n * the first positional so claude/codex/opencode all pick it up as the seed\n * user turn. Mirrors what the setup-wizard path already does in claude.ts;\n * lifted here so the three commands and the queued worker all agree on the\n * shape. Empty prompt is a no-op — userArgs are returned as-is.\n */\nexport function buildPromptArgs(\n agentKind: AgentKind,\n prompt: string,\n userArgs: string[],\n): string[] {\n return resolveAgentLauncher(agentKind).buildArgs(prompt, userArgs);\n}\n","import { randomBytes } from 'node:crypto';\nimport { request as httpRequest } from 'node:http';\nimport {\n defaultCountRunningBoxes,\n loadQueueConfig,\n queueLogPath,\n writeJob,\n type QueueAgentKind,\n type QueueJob,\n type QueueJobCreateOpts,\n} from '@agentbox/relay';\nimport { DEFAULT_RELAY_PORT, ensureRelay } from '@agentbox/sandbox-docker';\n\nexport interface SubmitQueueJobInput {\n agent: QueueAgentKind;\n boxName: string;\n providerName: string;\n prompt: string;\n agentArgs: string[];\n createOpts: QueueJobCreateOpts;\n /** Per-invocation override of queue.maxConcurrent. */\n maxRunningOverride?: number;\n}\n\nexport interface SubmitQueueJobResult {\n job: QueueJob;\n /** Cross-provider running count at the time of submit (informational only). */\n runningCount: number;\n /** Effective ceiling used for the job (override or global). */\n maxConcurrent: number;\n /** Whether the manifest was visible to the relay's scheduler immediately. */\n pokedRelay: boolean;\n}\n\n/**\n * Write a queued job manifest, ensure the host relay is running, and notify\n * it via `POST /admin/queue/enqueue` so the scheduler picks up the new entry\n * without waiting for the next periodic tick. Best-effort on the HTTP call:\n * if the relay is unreachable the manifest still lives on disk and the next\n * tick (after the relay starts) will see it.\n */\nexport async function submitQueueJob(\n input: SubmitQueueJobInput,\n): Promise<SubmitQueueJobResult> {\n const cfg = await loadQueueConfig();\n const ceiling =\n typeof input.maxRunningOverride === 'number' && input.maxRunningOverride > 0\n ? input.maxRunningOverride\n : cfg.maxConcurrent;\n\n const id = newJobId();\n const job: QueueJob = {\n id,\n agent: input.agent,\n status: 'queued',\n boxName: input.boxName,\n providerName: input.providerName,\n prompt: input.prompt,\n agentArgs: input.agentArgs,\n createOpts: input.createOpts,\n maxConcurrent: ceiling,\n createdAt: new Date().toISOString(),\n logPath: queueLogPath(id),\n };\n await writeJob(job);\n\n let runningCount = 0;\n try {\n runningCount = await defaultCountRunningBoxes();\n } catch {\n runningCount = 0;\n }\n\n let pokedRelay = false;\n try {\n await ensureRelay();\n await postEnqueue(id);\n pokedRelay = true;\n } catch {\n // Manifest is on disk; next relay tick (after a future `ensureRelay`)\n // picks it up. Suppress the noise on a relay-down case — the CLI's\n // outer command already prints a `log: <path>` for the per-job log.\n }\n\n return { job, runningCount, maxConcurrent: ceiling, pokedRelay };\n}\n\nfunction newJobId(): string {\n // 9-byte URL-safe id (18 hex). Short enough to type, wide enough to never\n // collide in practice. Mirrors the existing per-box mnemonic id length.\n return randomBytes(9).toString('hex');\n}\n\nfunction postEnqueue(id: string): Promise<void> {\n const json = JSON.stringify({ id });\n return new Promise<void>((resolveP, rejectP) => {\n const req = httpRequest(\n {\n host: '127.0.0.1',\n port: DEFAULT_RELAY_PORT,\n method: 'POST',\n path: '/admin/queue/enqueue',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(json).toString(),\n },\n timeout: 2_000,\n },\n (res) => {\n res.resume();\n const status = res.statusCode ?? 0;\n if (status >= 200 && status < 300) resolveP();\n else rejectP(new Error(`enqueue → ${String(status)}`));\n },\n );\n req.on('error', rejectP);\n req.on('timeout', () => {\n req.destroy();\n rejectP(new Error('enqueue timeout'));\n });\n req.write(json);\n req.end();\n });\n}\n","import type { AttachOpenIn } from '@agentbox/config';\n\nconst VALUES: readonly AttachOpenIn[] = ['split', 'window', 'tab', 'same'] as const;\n\nexport const ATTACH_IN_HELP =\n 'where to open the attached session: split | window | tab | same (default from attach.openIn, built-in: split). Only effective when running inside tmux or iTerm2; falls back to inline attach otherwise.';\n\nexport const INLINE_HELP =\n 'attach inline in the current terminal (shortcut for --attach-in same; useful when attach.openIn defaults to split/window/tab). The short `-i` form was reassigned to `--initial-prompt` on the create-style commands (claude/codex/opencode).';\n\nexport const NO_ATTACH_HELP =\n 'create the box and start the agent session, but do not attach (background mode); prints the box ref and exits 0. Re-attach later with `agentbox <agent> attach <box>`.';\n\n/**\n * Validate a `--attach-in` value as it comes off commander. Returns\n * `undefined` when the flag was absent (so it doesn't clobber the config-layer\n * value); throws a clear error on a typo.\n */\nexport function parseAttachInOption(raw: string | undefined): AttachOpenIn | undefined {\n if (raw === undefined) return undefined;\n if (!(VALUES as readonly string[]).includes(raw)) {\n throw new Error(\n `--attach-in: expected one of ${VALUES.join(', ')}, got \"${raw}\"`,\n );\n }\n return raw as AttachOpenIn;\n}\n\n/**\n * Resolve `--attach-in <mode>` + `--inline`/`-i` into a single `AttachOpenIn`.\n * `--attach-in` wins when both are given (more specific overrides the\n * shortcut); `--inline` alone maps to `'same'`; absent flags resolve to\n * `undefined` so the config-layer value still applies.\n */\nexport function resolveAttachInOption(opts: {\n attachIn?: string;\n inline?: boolean;\n}): AttachOpenIn | undefined {\n if (opts.attachIn !== undefined) return parseAttachInOption(opts.attachIn);\n if (opts.inline === true) return 'same';\n return undefined;\n}\n","/**\n * Shared \"cloud create + agent attach\" path for `agentbox claude`,\n * `agentbox codex`, `agentbox opencode` when `--provider` resolves to a\n * non-docker backend (today only `daytona`). Without it those default actions\n * silently fall through to docker — `agentbox claude --provider daytona` would\n * make a docker box, ignoring the flag.\n *\n * What this does:\n * 1. Calls `provider.create(req)` (provider-neutral — credential volumes,\n * env-files, workspace seed, ctl daemon all happen inside).\n * 2. Hands the resulting `BoxRecord` to `cloudAgentAttach` which SSH+tmux-\n * attaches the agent CLI. Extra `<agent>-args` are threaded through via\n * the base64-encoded launcher (see `buildCloudAttachInnerCommand`).\n *\n * The Docker fast path in each agent command stays untouched: this helper\n * only runs when the caller pre-resolved a non-docker provider.\n */\n\nimport { log, outro } from '@clack/prompts';\nimport type { BoxRecord, CreateBoxRequest, Provider } from '@agentbox/core';\nimport type { AttachOpenIn } from '@agentbox/config';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\n\nexport interface CloudAgentCreateArgs {\n /** Pre-resolved provider (from `providerForCreate`). */\n provider: Provider;\n /** Box create request; `onLog` is overwritten by this helper. */\n request: Omit<CreateBoxRequest, 'onLog'>;\n /** Agent binary inside the sandbox (`claude`, `codex`, `opencode`). */\n binary: string;\n /** Tmux session name (e.g. `claude`). */\n sessionName: string;\n /** Mode label for the wrapper's footer. */\n mode: 'claude' | 'codex' | 'opencode';\n /** Args passed to the agent after `--`. Threaded through to the attached CLI. */\n extraArgs?: string[];\n /** Bypass the spinner and stream raw provider output to stderr. */\n verbose?: boolean;\n /** Where to open the attached session; forwarded to `cloudAgentAttach`. */\n openIn?: AttachOpenIn;\n /** When `false`, create the cloud box and skip the agent attach (background\n * mode). Defaults to `true`. On cloud providers the agent's tmux session is\n * created lazily by `cloudAgentAttach`; with `attach: false` the session\n * isn't started yet — a later `agentbox <agent> attach <box>` starts it on\n * first attach. */\n attach?: boolean;\n /**\n * Hook fired AFTER the box is provisioned and BEFORE the agent attach starts\n * the in-box tmux session. Used by the session-teleport path to upload a\n * host session file into the new sandbox before the agent CLI launches. May\n * mutate `extraArgs` indirectly via the returned `agentArgsPrefix`.\n */\n beforeStart?: (box: BoxRecord) => Promise<{ agentArgsPrefix?: string[] } | void>;\n}\n\n/**\n * Provision a cloud box and attach the requested agent. Calls process.exit\n * via `cloudAgentAttach` → `runWrappedAttach`; this function does not return\n * on the happy path.\n */\nexport async function cloudAgentCreate(args: CloudAgentCreateArgs): Promise<void> {\n const s = makeProgressReporter(args.verbose === true);\n s.start('creating cloud box');\n try {\n const result = await args.provider.create({\n ...args.request,\n onLog: (line) => s.message(line),\n });\n const nSuffix =\n typeof result.record.projectIndex === 'number'\n ? ` · n ${String(result.record.projectIndex)}`\n : '';\n s.stop(`box ${result.record.name} ready${nSuffix}`);\n log.info(`id: ${result.record.id}`);\n log.info(`provider: ${result.record.provider}`);\n if (result.record.cloud?.sandboxId) {\n log.info(`sandboxId: ${result.record.cloud.sandboxId}`);\n }\n let extraArgs = args.extraArgs;\n if (args.beforeStart) {\n const hook = await args.beforeStart(result.record);\n if (hook && hook.agentArgsPrefix && hook.agentArgsPrefix.length > 0) {\n extraArgs = [...hook.agentArgsPrefix, ...(extraArgs ?? [])];\n }\n }\n if (args.attach === false) {\n outro(\n `session not started — attach with: agentbox ${args.mode} attach ${result.record.name}`,\n );\n return;\n }\n outro(`attaching ${args.mode} — Control+a d to detach, leaves the agent running`);\n await cloudAgentAttach({\n box: result.record,\n binary: args.binary,\n sessionName: args.sessionName,\n mode: args.mode,\n extraArgs,\n openIn: args.openIn,\n });\n } catch (err) {\n s.stop('cloud box create failed');\n throw err;\n }\n}\n","/**\n * `makeProgressReporter(verbose)` — small adapter around the clack spinner\n * that lets long-running commands (`create`, `claude`, `codex`,\n * `opencode`) opt into a `-v / --verbose` mode that bypasses the spinner\n * entirely and streams raw output to stderr.\n *\n * Without `--verbose` the returned object proxies a clack `spinner()`:\n * - `start(label)` → `s.start(label)`\n * - `message(line)` → `s.message(clampSpinnerLine(line))`\n * - `stop(label)` → `s.stop(label)`\n *\n * With `--verbose` the spinner is never created. `start` / `stop` write a\n * single status line to stderr; `message` writes the raw, unclamped line\n * (preserving any newlines from the provider). This is the right mode\n * for the ~7-min cold cloud create where users want to see real progress.\n *\n * Either way, callers should still write every line to `cmdLog` so the\n * full transcript lands in `~/.agentbox/logs/<command>.log`. This helper\n * only handles the user-visible surface.\n */\nimport { spinner } from '@clack/prompts';\nimport { clampSpinnerLine } from '../spinner-line.js';\n\nexport interface ProgressReporter {\n start(label: string): void;\n message(line: string): void;\n stop(label: string): void;\n}\n\nexport function makeProgressReporter(verbose: boolean): ProgressReporter {\n if (!verbose) {\n const s = spinner();\n return {\n start: (label) => s.start(label),\n message: (line) => s.message(clampSpinnerLine(line)),\n stop: (label) => s.stop(label),\n };\n }\n return {\n start: (label) => process.stderr.write(`${label} (verbose)\\n`),\n message: (line) => process.stderr.write(line.endsWith('\\n') ? line : line + '\\n'),\n stop: (label) => process.stderr.write(`${label}\\n`),\n };\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. Two ways the redraw gets out of\n * sync with the actual rendered output:\n *\n * 1. When a single-line message is longer than the terminal is wide, the\n * terminal wraps it onto extra visual rows the spinner doesn't know\n * about — the next frame's clear hits only the last visual row and the\n * 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\n * past 100 columns.\n *\n * 2. When the message itself contains embedded newlines (multi-line),\n * clack only redraws the *first* line; subsequent lines from the\n * previous frame stay on the terminal, producing the \"stair-stepped\"\n * pile-up seen during `agentbox create --provider daytona` where\n * Daytona's `Image.fromDockerfile` callback hands us whole multi-line\n * chunks.\n *\n * The fix is to collapse multi-line input to its last non-empty line (the\n * most recent progress signal) and then clamp width.\n *\n * Falls back to the raw single-line input on non-TTY stdout (no spinner is\n * drawn, so wrapping is harmless).\n */\nconst SPINNER_CHROME = 6;\n\nexport function clampSpinnerLine(line: string): string {\n // Collapse to a single line first — the last non-empty line is almost\n // always the freshest progress signal (e.g. \"Get:21 http://... [49 kB]\").\n const collapsed = collapseToLastLine(line);\n const cols = process.stdout.columns;\n if (!process.stdout.isTTY || !cols) return collapsed;\n const trimmed = collapsed.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\nfunction collapseToLastLine(s: string): string {\n // Strip CR (so CRLF and bare \\r progress bars both fold) and split on \\n.\n const lines = s.replace(/\\r/g, '\\n').split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line && line.trim().length > 0) return line;\n }\n return '';\n}\n","import { join } from 'node:path';\nimport { loadCarrySection } from '@agentbox/ctl';\nimport type { ResolvedCarryEntry } from '@agentbox/core';\nimport { promptForCarry } from '../carry-prompt.js';\nimport { resolveCarry } from './carry-resolve.js';\n\nexport interface CarryGateArgs {\n /** Absolute project root (dir holding agentbox.yaml). */\n projectRoot: string;\n /** `-y` / `--yes` — does NOT auto-approve carry. */\n yes: boolean;\n /** `--carry-yes` or AGENTBOX_CARRY_YES=1 — auto-approves. */\n carryYesFlag?: boolean;\n /** `--carry skip` or AGENTBOX_CARRY=skip — skip carry for this run. */\n carrySkipFlag?: boolean;\n onLog?: (line: string) => void;\n}\n\nexport type CarryGateResult =\n | { decision: 'approve'; entries: ResolvedCarryEntry[] }\n | { decision: 'skip'; entries: [] }\n | { decision: 'cancel' };\n\n/**\n * Run the host-side carry gate once for a `create`-style command:\n * 1. read `<projectRoot>/agentbox.yaml`'s `carry:` block (empty when missing),\n * 2. resolve + safety-check each entry,\n * 3. prompt the user (or honor --carry-yes / --carry=skip / env vars),\n * 4. return the approved entries (or signal cancel).\n *\n * Throws on hard resolver errors (non-optional missing src, denylist hit, size\n * cap, etc.) so the caller can abort *before* the box is created.\n */\nexport async function runCarryGate(args: CarryGateArgs): Promise<CarryGateResult> {\n const log = args.onLog ?? (() => {});\n const yamlPath = join(args.projectRoot, 'agentbox.yaml');\n\n const items = await loadCarrySection(yamlPath);\n if (items.length === 0) return { decision: 'approve', entries: [] };\n\n const resolved = await resolveCarry(items, { projectRoot: args.projectRoot });\n if (resolved.errors.length > 0) {\n const msg = ['carry: refused to proceed:', ...resolved.errors.map((e) => ` - ${e}`)].join('\\n');\n throw new Error(msg);\n }\n\n const carryYesEnv = process.env.AGENTBOX_CARRY_YES === '1';\n const carrySkipEnv = process.env.AGENTBOX_CARRY === 'skip';\n const carryYes = args.carryYesFlag ?? carryYesEnv;\n const carrySkip = args.carrySkipFlag ?? carrySkipEnv;\n\n const decision = await promptForCarry({\n resolved: resolved.entries,\n yes: args.yes,\n carryYes,\n carrySkip,\n });\n\n if (decision === 'cancel') return { decision: 'cancel' };\n if (decision === 'skip-this-run') {\n log(`carry: skipped for this box (${String(resolved.entries.length)} entry/entries not copied)`);\n return { decision: 'skip', entries: [] };\n }\n return { decision: 'approve', entries: resolved.entries };\n}\n","import { isCancel, log, select } from '@clack/prompts';\nimport { fmtBytes } from './fmt.js';\nimport type { ResolvedCarryEntry } from './lib/carry-resolve.js';\n\nexport type CarryDecision = 'approve' | 'cancel' | 'skip-this-run';\n\nexport interface CarryPromptArgs {\n resolved: ResolvedCarryEntry[];\n /** --carry-yes flag (or AGENTBOX_CARRY_YES=1) — auto-approves the carry. */\n carryYes?: boolean;\n /** --carry=skip flag (or AGENTBOX_CARRY=skip) — proceed with carry disabled. */\n carrySkip?: boolean;\n /** The generic --yes / -y flag (does NOT auto-approve carry). */\n yes?: boolean;\n /** Caller-controlled TTY check; default: process.stdin.isTTY. */\n isTTY?: boolean;\n}\n\n/**\n * Decide whether to carry the resolved entries. Caller invokes this once per\n * `create`-style command. The returned decision tells the caller to proceed\n * with the entries, skip them, or abort the whole create.\n *\n * Throws when `--yes` is passed on a non-TTY with non-empty carry entries —\n * `-y` MUST NOT silently exfiltrate host secrets. The error message tells the\n * user the explicit env var to set.\n */\nexport async function promptForCarry(args: CarryPromptArgs): Promise<CarryDecision> {\n // Empty carry: nothing to ask. Always approve so the caller's branch is\n // uniform (\"if decision === 'approve' && entries.length\") regardless of\n // whether the user has a carry: block at all.\n if (args.resolved.length === 0) return 'approve';\n\n if (args.carrySkip) return 'skip-this-run';\n if (args.carryYes) return 'approve';\n\n const tty = args.isTTY ?? process.stdin.isTTY;\n\n if (args.yes) {\n if (!tty) {\n throw new Error(\n 'carry: requires approval but stdin is not a TTY and --carry-yes was not set. ' +\n 'In CI, set AGENTBOX_CARRY_YES=1 to opt in to copying host secrets/files into this box, ' +\n 'or AGENTBOX_CARRY=skip to skip the carry block.',\n );\n }\n // -y on a TTY still falls through to the prompt — the prompt is the\n // user's explicit gate, not a \"wizard default\".\n }\n\n if (!tty) {\n throw new Error(\n 'carry: requires approval but stdin is not a TTY. ' +\n 'Set AGENTBOX_CARRY_YES=1 to opt in, or AGENTBOX_CARRY=skip to skip.',\n );\n }\n\n printSummary(args.resolved);\n\n const choice = await select<CarryDecision>({\n message: 'Copy these files inside the box?',\n options: [\n { value: 'approve', label: 'yes' },\n { value: 'skip-this-run', label: 'skip' },\n { value: 'cancel', label: 'cancel' },\n ],\n initialValue: 'approve',\n });\n\n if (isCancel(choice)) return 'cancel';\n return choice;\n}\n\nfunction printSummary(entries: ResolvedCarryEntry[]): void {\n const rows: string[] = [];\n const srcW = Math.max(3, ...entries.map((e) => e.rawSrc.length));\n const destW = Math.max(4, ...entries.map((e) => e.rawDest.length));\n rows.push(` ${pad('src', srcW)} → ${pad('dest', destW)} size flags`);\n for (const e of entries) {\n const flags: string[] = [];\n if (e.kind === 'missing') flags.push('optional');\n else if (e.optional) flags.push('optional');\n if (e.kind === 'dir') flags.push('dir');\n if (e.mode !== undefined) flags.push(`mode ${e.mode.toString(8).padStart(4, '0')}`);\n // Default user is 1000 (vscode); only show in flags when explicitly set\n // to something else, to keep the table calm in the common case.\n if (e.user !== undefined && e.user !== 1000) flags.push(`user ${String(e.user)}`);\n if (e.symlinkInfo === 'outside-home') flags.push('symlink → outside $HOME!');\n const size = e.kind === 'missing' ? '—' : fmtBytes(e.bytes ?? 0);\n rows.push(\n ` ${pad(e.rawSrc, srcW)} → ${pad(e.rawDest, destW)} ${pad(size, 9)} ${flags.join(', ')}`,\n );\n }\n log.message(rows.join('\\n'));\n}\n\nfunction pad(s: string, w: number): string {\n if (s.length >= w) return s;\n return s + ' '.repeat(w - s.length);\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 { realpath, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, join, normalize, resolve } from 'node:path';\nimport type { CarryItem } from '@agentbox/ctl';\n\n/**\n * One fully resolved carry entry, ready for the prompt and the per-provider\n * copy step. `rawSrc` / `rawDest` preserve what the user typed (for the prompt\n * to display); `absSrc` is the host-resolved path, `absDest` is the box-side\n * path with `~/` left intact (expanded inside the container at execute time\n * against the in-box `$HOME`).\n */\nexport interface ResolvedCarryEntry {\n rawSrc: string;\n rawDest: string;\n absSrc: string;\n absDest: string;\n kind: 'file' | 'dir' | 'missing';\n bytes?: number;\n mode?: number;\n /**\n * Numeric uid that should own the carried file inside the box. Mirrors\n * the field on `@agentbox/core`'s `ResolvedCarryEntry`. `resolveOne()`\n * below already forwards `item.user` into the result; this field made\n * the contract explicit so `carry-prompt.ts` can render the flag.\n */\n user?: number;\n optional: boolean;\n symlinkInfo?: 'safe' | 'outside-home';\n}\n\nexport interface ResolveOptions {\n /** Absolute path to the dir holding `agentbox.yaml`. `./` srcs anchor here. */\n projectRoot: string;\n /** Resolved $HOME for the user. Injected so tests can stub it. */\n homeDir?: string;\n /** Per-entry size cap in bytes; env override AGENTBOX_CARRY_MAX_BYTES. Default 50 MiB. */\n maxBytes?: number;\n}\n\nexport interface ResolveResult {\n entries: ResolvedCarryEntry[];\n errors: string[];\n}\n\nconst DEFAULT_MAX_BYTES = 50 * 1024 * 1024;\n\nconst DENYLIST_DEST_PREFIXES = ['/proc', '/sys', '/dev'];\nconst DENYLIST_DEST_EXACT = new Set(['/etc/passwd', '/etc/shadow']);\n\nexport async function resolveCarry(\n items: CarryItem[],\n opts: ResolveOptions,\n): Promise<ResolveResult> {\n const home = opts.homeDir ?? homedir();\n const cap = opts.maxBytes ?? readMaxBytesFromEnv() ?? DEFAULT_MAX_BYTES;\n const projectRoot = opts.projectRoot;\n\n const entries: ResolvedCarryEntry[] = [];\n const errors: string[] = [];\n\n for (const [i, item] of items.entries()) {\n const where = `carry[${String(i)}]`;\n try {\n const entry = await resolveOne(item, { projectRoot, home, cap, where });\n entries.push(entry);\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n }\n\n return { entries, errors };\n}\n\nfunction readMaxBytesFromEnv(): number | undefined {\n const raw = process.env.AGENTBOX_CARRY_MAX_BYTES;\n if (!raw) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return undefined;\n return Math.floor(n);\n}\n\ninterface OneCtx {\n projectRoot: string;\n home: string;\n cap: number;\n where: string;\n}\n\nasync function resolveOne(item: CarryItem, ctx: OneCtx): Promise<ResolvedCarryEntry> {\n const absSrc = expandHostPath(item.src, ctx);\n if (containsDotDot(absSrc)) {\n throw new Error(`${ctx.where}: resolved src \"${absSrc}\" contains .. — refused`);\n }\n\n validateBoxDest(item.dest, ctx);\n\n const optional = item.optional;\n const rawSrc = item.src;\n const rawDest = item.dest;\n const absDest = item.dest;\n\n let st: Awaited<ReturnType<typeof stat>>;\n try {\n st = await stat(absSrc);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n if (optional) {\n return {\n rawSrc,\n rawDest,\n absSrc,\n absDest,\n kind: 'missing',\n ...(item.mode !== undefined ? { mode: item.mode } : {}),\n ...(item.user !== undefined ? { user: item.user } : {}),\n optional: true,\n };\n }\n throw new Error(`${ctx.where}: host src \"${absSrc}\" does not exist (use optional: true to skip)`);\n }\n throw err;\n }\n\n // Symlink containment: a symlink whose target leaves both $HOME and\n // projectRoot is suspicious. Mark, don't reject — the prompt makes it loud.\n // Containment is computed in canonicalized space because macOS's /var\n // symlink to /private/var would otherwise make every tmpdir-rooted symlink\n // look \"outside\" its own project root.\n let symlinkInfo: 'safe' | 'outside-home' | undefined;\n try {\n const real = await realpath(absSrc);\n if (real !== absSrc) {\n const homeReal = await realpathSafe(ctx.home);\n const rootReal = await realpathSafe(ctx.projectRoot);\n if (!isInside(real, homeReal) && !isInside(real, rootReal)) {\n symlinkInfo = 'outside-home';\n } else {\n symlinkInfo = 'safe';\n }\n }\n } catch {\n /* best-effort; missing realpath shouldn't block carry */\n }\n\n if (st.isDirectory()) {\n const bytes = await dirSizeCapped(absSrc, ctx.cap);\n if (bytes > ctx.cap) {\n throw new Error(\n `${ctx.where}: dir \"${absSrc}\" exceeds ${String(ctx.cap)} bytes (set AGENTBOX_CARRY_MAX_BYTES to raise the cap or narrow the path)`,\n );\n }\n return {\n rawSrc,\n rawDest,\n absSrc,\n absDest,\n kind: 'dir',\n bytes,\n ...(item.mode !== undefined ? { mode: item.mode } : {}),\n ...(item.user !== undefined ? { user: item.user } : {}),\n optional,\n ...(symlinkInfo ? { symlinkInfo } : {}),\n };\n }\n\n if (st.isFile()) {\n if (st.size > ctx.cap) {\n throw new Error(\n `${ctx.where}: file \"${absSrc}\" is ${String(st.size)} bytes, exceeds cap ${String(ctx.cap)} (set AGENTBOX_CARRY_MAX_BYTES to raise)`,\n );\n }\n return {\n rawSrc,\n rawDest,\n absSrc,\n absDest,\n kind: 'file',\n bytes: st.size,\n ...(item.mode !== undefined ? { mode: item.mode } : {}),\n ...(item.user !== undefined ? { user: item.user } : {}),\n optional,\n ...(symlinkInfo ? { symlinkInfo } : {}),\n };\n }\n\n throw new Error(`${ctx.where}: src \"${absSrc}\" is neither a regular file nor a directory`);\n}\n\nfunction expandHostPath(src: string, ctx: OneCtx): string {\n if (src.startsWith('~/')) {\n return resolve(ctx.home, src.slice(2));\n }\n if (src.startsWith('./')) {\n return resolve(ctx.projectRoot, src.slice(2));\n }\n if (isAbsolute(src)) return resolve(src);\n // Schema rejects this shape, but defensive anyway.\n throw new Error(`${ctx.where}: src \"${src}\" must start with /, ~/, or ./`);\n}\n\nfunction containsDotDot(p: string): boolean {\n // After normalize, any `..` segment that survived is suspicious.\n const segs = normalize(p).split('/');\n return segs.some((s) => s === '..');\n}\n\nfunction validateBoxDest(dest: string, ctx: OneCtx): void {\n if (dest.length === 0) {\n throw new Error(`${ctx.where}.dest must not be empty`);\n }\n if (!dest.startsWith('/') && !dest.startsWith('~/')) {\n throw new Error(`${ctx.where}.dest \"${dest}\" must start with / or ~/`);\n }\n // Check the RAW path for `..` segments — must not normalize first because\n // normalize() collapses `a/../b` to `b`, hiding the traversal attempt.\n const rawTail = dest.startsWith('~/') ? dest.slice(2) : dest.slice(1);\n if (rawTail.split('/').some((s) => s === '..')) {\n throw new Error(`${ctx.where}.dest \"${dest}\" contains .. — refused`);\n }\n if (DENYLIST_DEST_EXACT.has(dest)) {\n throw new Error(`${ctx.where}.dest \"${dest}\" is on the denylist`);\n }\n for (const p of DENYLIST_DEST_PREFIXES) {\n if (dest === p || dest.startsWith(`${p}/`)) {\n throw new Error(`${ctx.where}.dest \"${dest}\" is on the denylist (prefix ${p})`);\n }\n }\n}\n\nfunction isInside(child: string, parent: string): boolean {\n const c = resolve(child);\n const p = resolve(parent);\n if (c === p) return true;\n return c.startsWith(p + '/');\n}\n\nasync function realpathSafe(p: string): Promise<string> {\n try {\n return await realpath(p);\n } catch {\n return resolve(p);\n }\n}\n\nasync function dirSizeCapped(dir: string, cap: number): Promise<number> {\n let total = 0;\n const seen = new Set<string>();\n async function walk(d: string): Promise<void> {\n if (total > cap) return;\n const { readdir } = await import('node:fs/promises');\n let names: string[];\n try {\n names = await readdir(d);\n } catch {\n return;\n }\n for (const name of names) {\n if (total > cap) return;\n const full = join(d, name);\n let st: Awaited<ReturnType<typeof stat>>;\n try {\n st = await stat(full);\n } catch {\n continue;\n }\n // Loop guard for symlink cycles via the symlink-resolved inode pair.\n const key = `${String(st.dev)}:${String(st.ino)}`;\n if (seen.has(key)) continue;\n seen.add(key);\n if (st.isDirectory()) {\n await walk(full);\n } else if (st.isFile()) {\n total += st.size;\n if (total > cap) return;\n }\n }\n }\n await walk(dir);\n return total;\n}\n","/**\n * Host-side validation for `--from-branch <ref>` on `create` / `claude` /\n * `codex` / `opencode` / `code`.\n *\n * The flag tells the provider what base ref to fork the box's per-box branch\n * from instead of the host's current `HEAD`. We validate the ref *here*,\n * before any provider work, so a typo doesn't leave a half-created box.\n *\n * Behavior:\n * - undefined / empty → no-op, returns undefined.\n * - SHA-shaped (40-hex prefix, ≥7 chars): skip the fetch (a SHA either\n * resolves locally or never will; fetching `<remote> <SHA>` isn't a\n * standard refspec). Validate with `git rev-parse --verify <ref>^{commit}`.\n * - Otherwise (branch / tag name): run `git fetch <remote> <ref>` best-\n * effort so a stale clone of `origin/main` still picks up new commits.\n * Then validate.\n *\n * Returns the ref verbatim on success (the provider passes it to `git\n * worktree add` / `git clone --branch`). Throws with a friendly message on\n * any failure — the caller surfaces it via the usual error path.\n */\n\nimport { execa } from 'execa';\n\nconst SHA_RE = /^[0-9a-f]{7,40}$/i;\n\nexport class FromBranchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FromBranchError';\n }\n}\n\nexport interface ResolveFromBranchOpts {\n /** Host repo path; usually the workspace root. Used as `git -C <repo>`. */\n repo: string;\n /** Remote to fetch from for non-SHA refs. Defaults to 'origin'. */\n remote?: string;\n}\n\n/**\n * Validate / fetch the requested base ref. Returns the (verbatim) ref so the\n * caller can thread it into `req.fromBranch`. `undefined` input → returns\n * `undefined` without touching git.\n */\nexport async function resolveFromBranch(\n ref: string | undefined,\n opts: ResolveFromBranchOpts,\n): Promise<string | undefined> {\n if (!ref || ref.length === 0) return undefined;\n const remote = opts.remote ?? 'origin';\n const isSha = SHA_RE.test(ref);\n\n // For branch/tag refs, fetch first so `origin/main` (etc.) reflect the\n // remote's actual tip — boxes started from `--from-branch main` should\n // pick up new commits the user hasn't pulled locally yet.\n if (!isSha) {\n const fetched = await execa(\n 'git',\n ['-C', opts.repo, 'fetch', '--quiet', remote, ref],\n { reject: false },\n );\n if (fetched.exitCode !== 0) {\n // Soft-fail: the ref might be local-only (e.g. a private branch) — fall\n // through to the rev-parse check below so we still error clearly when\n // the ref is fully unknown.\n }\n }\n\n const verify = await execa(\n 'git',\n ['-C', opts.repo, 'rev-parse', '--verify', `${ref}^{commit}`],\n { reject: false },\n );\n if (verify.exitCode !== 0) {\n throw new FromBranchError(\n `--from-branch: unknown ref \"${ref}\" (not found in ${opts.repo} after fetch). ` +\n `Provide a branch, tag, or SHA reachable from the host repo.`,\n );\n }\n return ref;\n}\n","/**\n * Claude Code session teleport. Finds a host session JSONL under\n * `~/.claude/projects/<encoded host cwd>/<id>.jsonl`, rewrites each line's\n * top-level `cwd` field to `/workspace`, and writes the result to a host tmp\n * file ready for upload into the box's `/home/vscode/.claude/projects/-workspace/`.\n *\n * Claude session files are line-delimited JSON. We parse each line, swap\n * `cwd` if present, and re-serialize. Lines that don't parse cleanly are\n * forwarded verbatim — the file may contain forward-compatible variants we\n * don't recognize and shouldn't drop.\n */\n\nimport { mkdir, mkdtemp, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { BOX_WORKSPACE, BOX_WORKSPACE_ENCODED, encodeClaudeProjectsDir } from './cwd-encoding.js';\nimport { TeleportError, type ResolvedTeleport, type ResumeMode, type TeleportLogger } from './types.js';\n\n/** In-box `~/.claude/projects/-workspace/` directory. */\nexport const BOX_CLAUDE_PROJECTS_DIR = `/home/vscode/.claude/projects/${BOX_WORKSPACE_ENCODED}`;\n\ninterface ClaudeResolveOptions {\n hostCwd: string;\n mode: ResumeMode;\n /** Override for tests. */\n hostHome?: string;\n log?: TeleportLogger;\n}\n\nexport async function resolveClaudeTeleport(\n opts: ClaudeResolveOptions,\n): Promise<ResolvedTeleport> {\n const hostHome = opts.hostHome ?? homedir();\n const projectDir = join(\n hostHome,\n '.claude',\n 'projects',\n encodeClaudeProjectsDir(opts.hostCwd),\n );\n\n if (!existsSync(projectDir)) {\n throw new TeleportError(\n `no Claude session history found on the host for ${opts.hostCwd} (expected at ${projectDir}). Run \\`claude\\` here at least once before using -c / --resume.`,\n );\n }\n\n const sessionPath = await pickSessionFile(projectDir, opts.mode);\n const sessionId = sessionPath.replace(/\\.jsonl$/u, '').split('/').pop() ?? '';\n\n // Stage the rewritten copy in a host tmp dir. The caller will upload from\n // here via `provider.uploadPath`.\n const stage = await mkdtemp(join(tmpdir(), 'agentbox-teleport-claude-'));\n const stagedFile = join(stage, `${sessionId}.jsonl`);\n await rewriteSessionFile(sessionPath, stagedFile, opts.hostCwd);\n opts.log?.(`teleport: claude session ${sessionId} staged for upload`);\n\n return {\n agent: 'claude',\n sessionId,\n hostFile: stagedFile,\n boxPath: `${BOX_CLAUDE_PROJECTS_DIR}/${sessionId}.jsonl`,\n boxParentDir: BOX_CLAUDE_PROJECTS_DIR,\n forwardArgs: ['--resume', sessionId],\n };\n}\n\nasync function pickSessionFile(projectDir: string, mode: ResumeMode): Promise<string> {\n if (mode.kind === 'resume') {\n const target = join(projectDir, `${mode.id}.jsonl`);\n if (!existsSync(target)) {\n throw new TeleportError(\n `Claude session \"${mode.id}\" not found in ${projectDir}. List available sessions with: ls \"${projectDir}\"`,\n );\n }\n return target;\n }\n const entries = await readdir(projectDir);\n const jsonl = entries.filter((e) => e.endsWith('.jsonl'));\n if (jsonl.length === 0) {\n throw new TeleportError(\n `no Claude sessions found in ${projectDir} — nothing to continue. Run \\`claude\\` here once first.`,\n );\n }\n const stats = await Promise.all(\n jsonl.map(async (name) => {\n const full = join(projectDir, name);\n const s = await stat(full);\n return { full, mtimeMs: s.mtimeMs };\n }),\n );\n stats.sort((a, b) => b.mtimeMs - a.mtimeMs);\n return stats[0]!.full;\n}\n\nasync function rewriteSessionFile(\n src: string,\n dst: string,\n hostCwd: string,\n): Promise<void> {\n const raw = await readFile(src, 'utf8');\n // Preserve original line endings — split on \\n keeps a trailing empty entry\n // when the file ends with \\n; we restore that on join.\n const lines = raw.split('\\n');\n const out: string[] = [];\n for (const line of lines) {\n if (line.length === 0) {\n out.push(line);\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n out.push(line);\n continue;\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as Record<string, unknown>;\n if (obj.cwd === hostCwd) {\n obj.cwd = BOX_WORKSPACE;\n out.push(JSON.stringify(obj));\n continue;\n }\n }\n out.push(line);\n }\n await mkdir(join(dst, '..'), { recursive: true });\n await writeFile(dst, out.join('\\n'), 'utf8');\n}\n","/**\n * Claude Code encodes the working-directory absolute path into the\n * `~/.claude/projects/<encoded>/` directory name by replacing every\n * non-alphanumeric character with `-`. E.g. `/Users/marco/Projects/foo` →\n * `-Users-marco-Projects-foo`; `/Users/marco/.agents/skills` →\n * `-Users-marco--agents-skills` (the dot AND the slash both become `-`).\n */\nexport function encodeClaudeProjectsDir(absPath: string): string {\n return absPath.replace(/[^a-zA-Z0-9]/g, '-');\n}\n\n/** Encoded form of `/workspace` — the in-box project key for any AgentBox sandbox. */\nexport const BOX_WORKSPACE_ENCODED = encodeClaudeProjectsDir('/workspace');\n\n/** In-box absolute workspace path (matches the bind-mount in every provider). */\nexport const BOX_WORKSPACE = '/workspace';\n","/**\n * Shared types/errors for the session-teleport module. Kept separate so the\n * per-agent files (`claude.ts` / `codex.ts` / `opencode.ts`) don't form an\n * import cycle through `index.ts`.\n */\n\nexport type TeleportAgent = 'claude' | 'codex' | 'opencode';\n\nexport type TeleportLogger = (line: string) => void;\n\n/**\n * Caller-supplied \"what resume mode is this\" struct. Mirrors the user-facing\n * flag set:\n * - `{ kind: 'continue' }` for `-c` / `--continue` (newest session for cwd)\n * - `{ kind: 'resume', id }` for `--resume <id>` (specific session)\n */\nexport type ResumeMode =\n | { kind: 'continue' }\n | { kind: 'resume'; id: string };\n\nexport interface ResolvedTeleport {\n agent: TeleportAgent;\n /** The session id we resolved (uuid). */\n sessionId: string;\n /**\n * Host-side path to the rewritten session file ready for upload. Lives in a\n * tmp dir under `os.tmpdir()` — the caller does not need to clean it up;\n * normal tmp cleanup applies.\n */\n hostFile: string;\n /** Absolute in-box destination path including filename. */\n boxPath: string;\n /** Absolute in-box destination directory — useful for `mkdir -p` before upload. */\n boxParentDir: string;\n /**\n * Canonical argv tokens to prepend to the agent's argv inside the box, e.g.\n * `['--resume', '<uuid>']` for claude or `['resume', '<uuid>']` for codex.\n */\n forwardArgs: string[];\n}\n\nexport class TeleportError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TeleportError';\n }\n}\n","/**\n * Codex CLI session teleport. Codex stores sessions at\n * `~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl`, flat across\n * all projects. The cwd lives inside the first line's `session_meta.payload.cwd`\n * field, so:\n * - `-c` filters by `payload.cwd === hostCwd`, sorts by mtime, picks newest.\n * - `--resume <uuid>` globs for `*<uuid>.jsonl` and warns if cwd mismatches.\n *\n * Resume tokens forward to `codex resume <id>` (the subcommand form Codex\n * actually uses — not `--resume <id>`).\n */\n\nimport { mkdtemp, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { BOX_WORKSPACE } from './cwd-encoding.js';\nimport { TeleportError, type ResolvedTeleport, type ResumeMode, type TeleportLogger } from './types.js';\n\ninterface CodexResolveOptions {\n hostCwd: string;\n mode: ResumeMode;\n hostHome?: string;\n log?: TeleportLogger;\n}\n\ninterface CodexSessionFile {\n hostPath: string;\n /** Relative to `~/.codex/sessions/` — preserved when uploading into the box. */\n relPath: string;\n uuid: string;\n cwd: string | null;\n mtimeMs: number;\n}\n\nexport async function resolveCodexTeleport(\n opts: CodexResolveOptions,\n): Promise<ResolvedTeleport> {\n const hostHome = opts.hostHome ?? homedir();\n const sessionsRoot = join(hostHome, '.codex', 'sessions');\n\n if (!existsSync(sessionsRoot)) {\n throw new TeleportError(\n `no Codex session history found on the host (expected at ${sessionsRoot}). Run \\`codex\\` at least once before using -c / --resume.`,\n );\n }\n\n const all = await listCodexSessions(sessionsRoot);\n if (all.length === 0) {\n throw new TeleportError(\n `no Codex sessions found in ${sessionsRoot}. Run \\`codex\\` here at least once first.`,\n );\n }\n\n let picked: CodexSessionFile;\n if (opts.mode.kind === 'resume') {\n // Alias to a local const so the narrowed type survives into the\n // `.filter` callback. TS can't keep narrowing on a property access\n // (`opts.mode`) across closures because the property could in principle\n // be mutated between the check and each callback invocation.\n const mode = opts.mode;\n const matches = all.filter((s) => s.uuid === mode.id || s.uuid.startsWith(mode.id));\n if (matches.length === 0) {\n throw new TeleportError(\n `Codex session \"${mode.id}\" not found under ${sessionsRoot}.`,\n );\n }\n if (matches.length > 1) {\n throw new TeleportError(\n `Codex session id \"${mode.id}\" matched multiple files; pass the full uuid.`,\n );\n }\n picked = matches[0]!;\n if (picked.cwd !== null && picked.cwd !== opts.hostCwd) {\n opts.log?.(\n `teleport: WARN codex session ${picked.uuid} was recorded at ${picked.cwd}, not ${opts.hostCwd}; rewriting cwd anyway`,\n );\n }\n } else {\n const matching = all.filter((s) => s.cwd === opts.hostCwd);\n if (matching.length === 0) {\n throw new TeleportError(\n `no Codex session found whose cwd matches ${opts.hostCwd}. Run \\`codex\\` here first, or pass --resume <id> explicitly.`,\n );\n }\n matching.sort((a, b) => b.mtimeMs - a.mtimeMs);\n picked = matching[0]!;\n }\n\n const stage = await mkdtemp(join(tmpdir(), 'agentbox-teleport-codex-'));\n const stagedFile = join(stage, posixBasename(picked.relPath));\n await rewriteCodexSession(picked.hostPath, stagedFile, opts.hostCwd);\n opts.log?.(`teleport: codex session ${picked.uuid} staged for upload`);\n\n const boxParentDir = `/home/vscode/.codex/sessions/${posixDirname(picked.relPath)}`;\n\n return {\n agent: 'codex',\n sessionId: picked.uuid,\n hostFile: stagedFile,\n boxPath: `${boxParentDir}/${posixBasename(picked.relPath)}`,\n boxParentDir,\n forwardArgs: ['resume', picked.uuid],\n };\n}\n\nfunction posixBasename(p: string): string {\n const i = p.lastIndexOf('/');\n return i === -1 ? p : p.slice(i + 1);\n}\n\nfunction posixDirname(p: string): string {\n const i = p.lastIndexOf('/');\n return i === -1 ? '.' : p.slice(0, i);\n}\n\nasync function listCodexSessions(sessionsRoot: string): Promise<CodexSessionFile[]> {\n const out: CodexSessionFile[] = [];\n // Sessions live three levels deep: YYYY/MM/DD/rollout-*.jsonl. Walk that\n // depth explicitly — no recursive scan, no globbing dependency.\n const years = await safeReaddir(sessionsRoot);\n for (const y of years) {\n if (!/^\\d{4}$/u.test(y)) continue;\n const yDir = join(sessionsRoot, y);\n const months = await safeReaddir(yDir);\n for (const m of months) {\n if (!/^\\d{2}$/u.test(m)) continue;\n const mDir = join(yDir, m);\n const days = await safeReaddir(mDir);\n for (const d of days) {\n if (!/^\\d{2}$/u.test(d)) continue;\n const dDir = join(mDir, d);\n const files = await safeReaddir(dDir);\n for (const name of files) {\n if (!name.startsWith('rollout-') || !name.endsWith('.jsonl')) continue;\n const uuid = extractCodexUuid(name);\n if (uuid === null) continue;\n const hostPath = join(dDir, name);\n let mtimeMs = 0;\n try {\n mtimeMs = (await stat(hostPath)).mtimeMs;\n } catch {\n continue;\n }\n const cwd = await peekCodexCwd(hostPath);\n out.push({\n hostPath,\n relPath: `${y}/${m}/${d}/${name}`,\n uuid,\n cwd,\n mtimeMs,\n });\n }\n }\n }\n }\n return out;\n}\n\nasync function safeReaddir(dir: string): Promise<string[]> {\n try {\n return await readdir(dir);\n } catch {\n return [];\n }\n}\n\nfunction extractCodexUuid(filename: string): string | null {\n // `rollout-YYYY-MM-DDTHH-MM-SS-<uuid>.jsonl` — the uuid is the trailing\n // 36-char dashed hex segment. Match it explicitly so we don't pick up the\n // date-time prefix.\n const m = filename.match(\n /-([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\\.jsonl$/u,\n );\n return m ? m[1]! : null;\n}\n\nasync function peekCodexCwd(file: string): Promise<string | null> {\n // First line is the session_meta record with payload.cwd. Read just enough\n // bytes to capture it — the rest of the file is potentially huge.\n let firstLine: string;\n try {\n const buf = await readFile(file, 'utf8');\n const nl = buf.indexOf('\\n');\n firstLine = nl === -1 ? buf : buf.slice(0, nl);\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(firstLine) as {\n type?: string;\n payload?: { cwd?: string };\n };\n if (parsed.type === 'session_meta' && typeof parsed.payload?.cwd === 'string') {\n return parsed.payload.cwd;\n }\n } catch {\n /* fall through */\n }\n return null;\n}\n\nasync function rewriteCodexSession(\n src: string,\n dst: string,\n hostCwd: string,\n): Promise<void> {\n const raw = await readFile(src, 'utf8');\n const lines = raw.split('\\n');\n const out: string[] = [];\n for (const line of lines) {\n if (line.length === 0) {\n out.push(line);\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n out.push(line);\n continue;\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as { type?: unknown; payload?: unknown };\n if (\n obj.type === 'session_meta' &&\n obj.payload &&\n typeof obj.payload === 'object' &&\n !Array.isArray(obj.payload)\n ) {\n const payload = obj.payload as Record<string, unknown>;\n if (payload.cwd === hostCwd) {\n payload.cwd = BOX_WORKSPACE;\n out.push(JSON.stringify(obj));\n continue;\n }\n }\n }\n out.push(line);\n }\n await writeFile(dst, out.join('\\n'), 'utf8');\n}\n","/**\n * OpenCode session teleport — v1 stub. OpenCode stores sessions in a\n * multi-tenant SQLite DB at `~/.local/share/opencode/opencode.db` with sibling\n * `storage/`, `snapshot/`, `repos/` directories. A naive teleport would copy\n * the entire DB (leaking every other project's sessions into the sandbox), and\n * row-level extraction is real work (foreign keys, FTS indices, snapshot\n * artifacts on disk that live outside the DB).\n *\n * Tracked for v2; for v1 we fail fast with a clear message.\n */\n\nimport { TeleportError } from './types.js';\n\nexport function resolveOpencodeTeleport(): never {\n throw new TeleportError(\n 'OpenCode session teleport is not yet supported in agentbox (sessions live in a multi-tenant SQLite DB at ~/.local/share/opencode/opencode.db; per-project extraction is tracked for a follow-up). Run `agentbox opencode` without -c / --resume to start a fresh session, or open an issue if you need this feature.',\n );\n}\n","/**\n * Session-teleport entry point. The agent commands call this AFTER the box is\n * provisioned (so `provider.uploadPath` has a target) and BEFORE the in-box\n * agent CLI launches. It:\n * 1. Resolves the matching host session file (claude/codex/opencode-specific).\n * 2. Stages a rewritten copy on the host (cwd → /workspace).\n * 3. Uploads it into the box at the agent-CLI-expected location via\n * `provider.uploadPath`.\n * 4. Returns the canonical argv tokens the agent command should prepend to\n * the in-box invocation.\n *\n * v1 supports `-c` and `--resume <id>` for claude + codex. opencode throws a\n * \"not yet supported\" `TeleportError`.\n */\n\nimport type { BoxRecord, Provider } from '@agentbox/core';\nimport { resolveClaudeTeleport } from './claude.js';\nimport { resolveCodexTeleport } from './codex.js';\nimport { resolveOpencodeTeleport } from './opencode.js';\nimport {\n TeleportError,\n type ResolvedTeleport,\n type ResumeMode,\n type TeleportAgent,\n type TeleportLogger,\n} from './types.js';\n\nexport {\n TeleportError,\n type ResolvedTeleport,\n type ResumeMode,\n type TeleportAgent,\n type TeleportLogger,\n} from './types.js';\n\nexport interface PrepareTeleportInput {\n agent: TeleportAgent;\n hostCwd: string;\n mode: ResumeMode;\n log?: TeleportLogger;\n}\n\nexport interface UploadTeleportInput {\n box: BoxRecord;\n provider: Provider;\n resolved: ResolvedTeleport;\n log?: TeleportLogger;\n}\n\n/**\n * Host-side resolve: finds the matching host session, rewrites cwd to\n * `/workspace`, stages a tmp copy ready for upload. No box / provider needed\n * — call this BEFORE box creation as a pre-flight so users don't pay for a\n * doomed box. Throws `TeleportError` on missing/unmatchable sessions.\n */\nexport async function prepareTeleport(\n input: PrepareTeleportInput,\n): Promise<ResolvedTeleport> {\n switch (input.agent) {\n case 'claude':\n return resolveClaudeTeleport({\n hostCwd: input.hostCwd,\n mode: input.mode,\n log: input.log,\n });\n case 'codex':\n return resolveCodexTeleport({\n hostCwd: input.hostCwd,\n mode: input.mode,\n log: input.log,\n });\n case 'opencode':\n // Throws TeleportError immediately — v1 stub.\n resolveOpencodeTeleport();\n }\n}\n\n/**\n * Provider-side upload: pushes the prepared session file into the live box.\n * Call AFTER box creation, before the in-box agent CLI launches.\n */\nexport async function uploadTeleport(input: UploadTeleportInput): Promise<void> {\n if (!input.provider.uploadPath) {\n throw new TeleportError(\n `provider '${input.provider.name}' does not support file upload; session teleport is unavailable on this backend.`,\n );\n }\n // Trailing slash → uploadPath treats dst as a directory and lands the file\n // under its existing basename, which already matches the in-box filename.\n await input.provider.uploadPath(input.box, input.resolved.hostFile, `${input.resolved.boxParentDir}/`);\n input.log?.(\n `teleport: uploaded ${input.resolved.sessionId} into ${input.resolved.boxParentDir}/`,\n );\n}\n","import { log } from '@clack/prompts';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/**\n * Print a one-time tip pointing at `agentbox install` when the host `/agentbox`\n * fork skill isn't installed yet. Gated by a marker file so it shows at most\n * once per host. Best-effort — never throws into the caller's happy path.\n */\nexport function maybeShowInstallHint(): void {\n try {\n const skill = join(homedir(), '.claude', 'skills', 'agentbox', 'SKILL.md');\n if (existsSync(skill)) return;\n const marker = join(homedir(), '.agentbox', 'install-hint-shown');\n if (existsSync(marker)) return;\n mkdirSync(join(homedir(), '.agentbox'), { recursive: true });\n writeFileSync(marker, '');\n log.info(\"tip: run 'agentbox install' to enable the /agentbox fork command in host Claude\");\n } catch {\n // Non-fatal: a missing HOME or unwritable dir must not break create.\n }\n}\n","import { closeSync, mkdirSync, openSync, renameSync, symlinkSync, unlinkSync, writeFileSync, writeSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface CommandLog {\n /** Absolute path agents can tail. */\n path: string;\n /** Append a line with an ISO timestamp prefix; a trailing newline is added if missing. */\n write(line: string): void;\n /** Append raw bytes verbatim — for subprocess streams that already carry their own newlines. */\n raw(chunk: string): void;\n /** Time a step; emits BEGIN/END markers and elapsed ms. On throw, emits FAIL and rethrows. */\n step<T>(name: string, fn: () => Promise<T>): Promise<T>;\n /** Idempotent. */\n close(): void;\n}\n\nfunction stateDir(): string {\n return process.env.AGENTBOX_HOME ?? join(homedir(), '.agentbox');\n}\n\nfunction logsDir(): string {\n return join(stateDir(), 'logs');\n}\n\n/**\n * Open a fresh, tee'd log file for a CLI command. Rotates one generation:\n * any prior `<command>.log` becomes `<command>.log.prev`, replacing an\n * older prev. Also updates `<logsDir>/latest.log` to point at the active\n * file so an agent can tail one stable path without knowing the command.\n *\n * Writes are synchronous; callers can fire-and-forget from spinner\n * callbacks. The fd is closed on `close()` and on `process.exit` so a\n * crash still flushes everything that was written.\n */\nexport function openCommandLog(command: string): CommandLog {\n const dir = logsDir();\n mkdirSync(dir, { recursive: true });\n\n const path = join(dir, `${command}.log`);\n const prev = join(dir, `${command}.log.prev`);\n try {\n // Move the previous run aside. EEXIST on rename is the typical case\n // (a `.prev` from the run before that) — overwrite it.\n renameSync(path, prev);\n } catch {\n /* nothing to rotate */\n }\n\n const fd = openSync(path, 'a');\n const startedAt = new Date().toISOString();\n writeSync(fd, `${startedAt} --- BEGIN ${command} (pid ${String(process.pid)}) ---\\n`);\n\n updateLatestSymlink(dir, path);\n\n let closed = false;\n const closeOnce = (): void => {\n if (closed) return;\n closed = true;\n try {\n writeSync(fd, `${new Date().toISOString()} --- END ${command} ---\\n`);\n } catch {\n /* fd already gone */\n }\n try {\n closeSync(fd);\n } catch {\n /* already closed */\n }\n };\n // Last-resort flush. Don't unhook anything else; this is purely additive.\n process.on('exit', closeOnce);\n\n return {\n path,\n write(line: string): void {\n if (closed) return;\n const ts = new Date().toISOString();\n const body = line.endsWith('\\n') ? line : line + '\\n';\n try {\n writeSync(fd, `${ts} ${body}`);\n } catch {\n /* swallow — never break the command on log write failure */\n }\n },\n raw(chunk: string): void {\n if (closed) return;\n try {\n writeSync(fd, chunk);\n } catch {\n /* swallow */\n }\n },\n async step<T>(name: string, fn: () => Promise<T>): Promise<T> {\n const t0 = Date.now();\n this.write(`--- BEGIN ${name} ---`);\n try {\n const out = await fn();\n this.write(`--- END ${name} (${String(Date.now() - t0)}ms) ---`);\n return out;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.write(`--- FAIL ${name} (${String(Date.now() - t0)}ms): ${msg} ---`);\n throw err;\n }\n },\n close: closeOnce,\n };\n}\n\nfunction updateLatestSymlink(dir: string, target: string): void {\n const link = join(dir, 'latest.log');\n try {\n unlinkSync(link);\n } catch {\n /* not present */\n }\n try {\n symlinkSync(target, link);\n } catch {\n // Windows or restricted FS: leave a text pointer instead. Best-effort.\n try {\n writeFileSync(link, target + '\\n');\n } catch {\n /* give up — symlink is a convenience, not a contract */\n }\n }\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, spinner } from '@clack/prompts';\nimport { setConfigValue } from '@agentbox/config';\nimport {\n detectPortless,\n type DockerEngine,\n installPortless,\n portlessInstallHint,\n portlessStartHint,\n resetPortlessCache,\n startPortlessProxy,\n} from '@agentbox/sandbox-docker';\n\nexport interface PortlessPromptArgs {\n engine: DockerEngine;\n /** Effective `portless.enabled` — `undefined` means \"never prompted\". */\n enabled: boolean | undefined;\n yes: boolean;\n /** cwd for the config write (global scope resolves a fixed path regardless). */\n cwd: string;\n}\n\n/**\n * Bring the host Portless into a usable state after the user opts in: install\n * the CLI if missing, then start a proxy if none is running. The proxy is\n * started with `--no-tls` on a high port so it never needs root or a CA-trust\n * prompt (box web apps are then served at `http://<box>.localhost:1355`).\n * Best-effort — any failure degrades to a printed hint, never throws.\n */\nexport async function setupPortlessHost(): Promise<void> {\n let state = await detectPortless();\n\n if (!state.installed) {\n const s = spinner();\n s.start('installing portless (npm install -g portless)');\n const ok = await installPortless();\n resetPortlessCache();\n s.stop(ok ? 'portless installed' : 'portless install failed');\n if (!ok) {\n log.warn(`Could not install Portless — run \\`${portlessInstallHint()}\\` yourself.`);\n return;\n }\n state = await detectPortless();\n }\n\n if (state.proxyRunning) {\n log.info('Portless proxy already running — boxes will use it.');\n return;\n }\n\n const s = spinner();\n s.start('starting portless proxy (no TLS, port 1355 — no root needed)');\n await startPortlessProxy();\n resetPortlessCache();\n state = await detectPortless();\n if (state.proxyRunning) {\n s.stop('portless proxy started');\n } else {\n s.stop('portless proxy did not start');\n log.warn(`Could not start the Portless proxy — run \\`${portlessStartHint()}\\` yourself.`);\n }\n}\n\n/**\n * First-run opt-in for Portless. On Docker Desktop there is no per-container\n * DNS, so we offer to give box web apps a friendly `<box>.localhost` URL. The\n * answer — yes or no — is persisted to the *global* config so the prompt fires\n * exactly once per machine; a \"yes\" also installs the CLI and starts the proxy\n * (see `setupPortlessHost`). Returns the resolved enabled flag.\n *\n * Silent no-op (returns the effective value) when: already decided in any\n * config layer or via --portless/--no-portless; non-interactive or --yes; or\n * the engine is OrbStack (which already has .orb.local).\n */\nexport async function maybePromptPortless(args: PortlessPromptArgs): Promise<boolean> {\n if (args.enabled !== undefined) return args.enabled;\n if (args.engine === 'orbstack') return false;\n if (!process.stdin.isTTY || args.yes) return false;\n\n const answer = await confirm({\n message:\n 'Use Portless to give box web apps a friendly local URL? ' +\n '(installs the portless CLI and starts a local proxy if needed)',\n initialValue: true,\n });\n // Cancel (Ctrl-C) leaves the key unset so the prompt reappears next time.\n if (isCancel(answer)) return false;\n\n try {\n await setConfigValue('global', 'portless.enabled', answer, args.cwd, { raw: false });\n } catch (err) {\n log.warn(\n `Could not save the Portless preference: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (answer) await setupPortlessHost();\n return answer;\n}\n","import { confirm, isCancel, log, multiselect } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport type { ProviderName } from '@agentbox/core';\nimport { DEFAULT_ENV_PATTERNS, scanHostEnvFiles } from '@agentbox/sandbox-docker';\nimport { basename } from 'node:path';\nimport { checkpointExistsForProvider } from './checkpoint-lookup.js';\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 *\n * The `/agentbox-setup` skill is installed **box-only**: at create /\n * `claude start` time `seedSetupSkillIntoVolume()`\n * (packages/sandbox-docker/src/claude.ts) copies this same file into the\n * claude-config volume's `skills/agentbox-setup/SKILL.md`. We deliberately\n * never write it to the host's ~/.claude so `agentbox` doesn't pollute the\n * user's machine.\n */\nexport const IN_BOX_SETUP_GUIDE_PATH = '/usr/local/share/agentbox/setup-guide.md';\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 download 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 * Files the user picked in the env-import multiselect (relative to the\n * workspace, NUL-safe). Empty/undefined = no copy. Threaded into\n * `createBox(opts.envFilesToImport)` so the box is seeded with just the\n * selection. Independent of `withEnv` / the wizard's yes/no answer.\n */\n envFilesToImport?: 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 AND the\n * checkpoint exists for the active provider, the project is already\n * configured: the checkpoint carries the warm state *and* the agentbox.yaml\n * that was present when it was captured, so we skip the \"generate one?\"\n * prompt entirely. When the checkpoint doesn't exist for the active\n * provider (e.g. a Docker `setup` checkpoint and the user is creating a\n * cloud box), the wizard falls through silently to normal setup.\n */\n checkpointRef?: string;\n /**\n * The provider this box will be created on. Used to scope the\n * `checkpointRef` lookup so the wizard only announces \"starting from\n * checkpoint …\" when the artifact actually exists for the target.\n */\n provider?: ProviderName;\n /**\n * True when the caller already opted in to importing the full\n * DEFAULT_ENV_PATTERNS set (`--with-env` / `box.withEnv: true`). The\n * env-file multiselect is suppressed in that case — the user pre-decided.\n */\n withEnv?: boolean;\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\n/**\n * Sibling sentinel to `WIZARD_AUTOLAUNCH_ENV`: when `agentbox create`\n * re-dispatches to `agentbox claude`, the user's env-file multiselect picks\n * ride across the boundary in this env var, NUL-delimited (filenames can\n * contain newlines but never NUL). The inner wizard parses + acts on it,\n * then the caller is expected to delete it (mirrors the autolaunch sentinel).\n */\nexport const WIZARD_ENV_FILES_ENV = 'AGENTBOX_WIZARD_ENV_FILES';\n\n/**\n * Patterns scanned for the wizard's env-file multiselect. Same set as\n * `--with-env` minus `agentbox.yaml`: the wizard fires precisely *because*\n * there's no agentbox.yaml on the host, so it can never be a match.\n */\nconst WIZARD_ENV_SCAN_PATTERNS = DEFAULT_ENV_PATTERNS.filter((p) => p !== 'agentbox.yaml');\n\nexport async function maybeRunSetupWizard(args: WizardArgs): Promise<WizardOutcome> {\n // Re-entry from agentbox create → claude: outer pass already prompted;\n // just inject the initial prompt for claude. Env-file picks were stashed by\n // the outer pass in WIZARD_ENV_FILES_ENV and need to flow through this\n // outcome so claude's action handler can pass them to createBox.\n if (process.env[WIZARD_AUTOLAUNCH_ENV] === '1') {\n if (args.command !== 'claude') return { action: 'proceed' };\n const envFiles = parseEnvFilesFromEnv(process.env[WIZARD_ENV_FILES_ENV]);\n if (args.checkpointRef && (await checkpointAppliesHere(args))) {\n return { action: 'proceed', envFilesToImport: envFiles };\n }\n const proj = await findProjectRoot(args.workspace);\n if (proj.hasAgentboxYaml) return { action: 'proceed', envFilesToImport: envFiles };\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n envFilesToImport: envFiles,\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. Skip env-file picker too: the\n // checkpoint already has whatever was on disk when it was captured.\n //\n // …but only if the checkpoint exists for the ACTIVE provider. A\n // `box.defaultCheckpoint` resolved against the wrong provider's store would\n // mislead the user — wizard announces the skip, then the cloud-provider\n // create silently drops the ref because the snapshot doesn't exist for\n // daytona. Silently fall through to normal setup instead.\n if (args.checkpointRef && (await checkpointAppliesHere(args))) {\n log.info(`starting from checkpoint \"${args.checkpointRef}\"; skipping agentbox.yaml setup`);\n return { action: 'proceed' };\n }\n\n // Env-file multiselect — runs *before* the \"run setup wizard?\" confirm so\n // it's independent of that answer. Suppressed when --with-env is on\n // (the user already opted in to importing the full DEFAULT_ENV_PATTERNS\n // set). Skipped silently when nothing matched.\n let envFilesToImport: string[] | undefined;\n if (!args.withEnv) {\n const found = await scanHostEnvFiles(proj.root, WIZARD_ENV_SCAN_PATTERNS);\n if (found.length > 0) {\n const picked = await multiselect<string>({\n message: 'Import host env/secret files into the box? (space to toggle, enter to confirm)',\n options: found.map((p) => ({ value: p, label: p })),\n initialValues: found,\n required: false,\n });\n if (!isCancel(picked) && Array.isArray(picked) && picked.length > 0) {\n envFilesToImport = picked;\n }\n }\n }\n\n const go = await confirm({\n message: 'New project detected, run setup wizard?',\n initialValue: true,\n });\n if (isCancel(go) || !go) return { action: 'proceed', envFilesToImport };\n\n // The /agentbox-setup skill is seeded into the box's claude-config volume\n // by seedSetupSkillIntoVolume() (sandbox-docker) — box-only, never written\n // to the host's ~/.claude.\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', envFilesToImport };\n\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n envFilesToImport,\n };\n}\n\n/**\n * True when `args.checkpointRef` resolves to an artifact in the active\n * provider's checkpoint store. Falls back to `true` only when no `checkpointRef`\n * is set (caller checked already). Resolves the project root from the workspace\n * so the lookup uses the same hash the `agentbox checkpoint create` flow\n * persists under.\n */\nasync function checkpointAppliesHere(args: WizardArgs): Promise<boolean> {\n if (!args.checkpointRef) return false;\n const proj = await findProjectRoot(args.workspace);\n const provider = args.provider ?? 'docker';\n return checkpointExistsForProvider(provider, proj.root, args.checkpointRef);\n}\n\n/** Serialize the multiselect picks for the create→claude re-dispatch. */\nexport function serializeEnvFilesForEnv(files: string[] | undefined): string | undefined {\n if (!files || files.length === 0) return undefined;\n // NUL is illegal in POSIX filenames so it's a safe delimiter even though\n // env-var values can contain newlines (which legal filenames also can).\n return files.join('\\0');\n}\n\n/** Inverse of `serializeEnvFilesForEnv`. Empty/undefined input → undefined. */\nexport function parseEnvFilesFromEnv(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined;\n const out = raw.split('\\0').filter((p) => p.length > 0);\n return out.length > 0 ? out : undefined;\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 the first-run auth guidance\n * that the user typically wants.\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 portless?: 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 if (opts.portless === true) out.push('--portless');\n if (opts.portless === false) out.push('--no-portless');\n return out;\n}\n","/**\n * Provider-aware checkpoint existence check used by the wizard. The default\n * checkpoint name lives in a single config field (`box.defaultCheckpoint`),\n * but the actual artifact may exist for Docker, for Daytona, both, or\n * neither. The wizard consults this helper before announcing \"starting from\n * checkpoint …\" — if the named checkpoint doesn't exist for the active\n * provider, the wizard falls through to the normal setup flow instead of\n * misleadingly skipping it.\n */\n\nimport type { ProviderName } from '@agentbox/core';\nimport { resolveCheckpoint } from '@agentbox/sandbox-docker';\nimport { resolveCloudCheckpoint } from '@agentbox/sandbox-cloud';\n\nexport async function checkpointExistsForProvider(\n provider: ProviderName,\n projectRoot: string,\n ref: string,\n): Promise<boolean> {\n if (provider === 'docker') {\n return (await resolveCheckpoint(projectRoot, ref)) !== null;\n }\n // v1: every cloud backend ships its checkpoints under the\n // `~/.agentbox/cloud-checkpoints/<backend>/…` tree. The provider name is\n // also the backend name so the lookup is a 1:1 mapping.\n return (await resolveCloudCheckpoint(projectRoot, provider, ref)) !== null;\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n defaultCheckpointConfigKey,\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n setConfigValue,\n unsetConfigValue,\n} from '@agentbox/config';\nimport type { ProviderKind } from '@agentbox/config';\nimport type { BoxRecord } from '@agentbox/core';\nimport {\n clearRelayNotice,\n createCheckpoint,\n inspectBox,\n listCheckpoints,\n removeCheckpoint,\n setRelayNotice,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { listCloudCheckpoints, resolveCloudCheckpoint } from '@agentbox/sandbox-cloud';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Footer warning shown in attached sessions while a checkpoint runs. */\nconst CHECKPOINT_NOTICE = 'Checkpoint in progress — the box will be unresponsive for a moment';\n/**\n * Notice TTL backstop: longer than the relay's checkpoint RPC timeout\n * (600s) so a stale notice self-clears even if this CLI is SIGKILLed\n * before its `finally` runs.\n */\nconst CHECKPOINT_NOTICE_TTL_MS = 660_000;\n\ninterface CreateOpts {\n name?: string;\n merged?: boolean;\n setDefault?: boolean;\n replace?: 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 .option(\n '--replace',\n \"if a checkpoint with the same name exists, rm it first (idempotent recapture; safe to retry when the previous run's stdout was lost)\",\n )\n .action(async (idOrName: string | undefined, opts: CreateOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const providerName = box.provider ?? 'docker';\n\n if (providerName !== 'docker') {\n await runCloudCheckpointCreate(box, opts);\n return;\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');\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 // Warn attached sessions (agentbox claude footer / dashboard) that the\n // box is about to freeze — `docker commit` pauses the container. Best-\n // effort: a null id means the relay is down and there's nothing to clear.\n const noticeId = await setRelayNotice(\n box.id,\n 'checkpoint',\n CHECKPOINT_NOTICE,\n CHECKPOINT_NOTICE_TTL_MS,\n );\n let signalled = false;\n const onSignal = (): void => {\n if (signalled) return;\n signalled = true;\n void (async () => {\n if (noticeId) await clearRelayNotice(box.id, noticeId);\n process.exit(130);\n })();\n };\n if (noticeId) {\n process.once('SIGINT', onSignal);\n process.once('SIGTERM', onSignal);\n }\n\n try {\n const info = await createCheckpoint({\n box,\n projectRoot,\n name: opts.name,\n merged: opts.merged === true,\n setDefault: opts.setDefault === true,\n replace: opts.replace === 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(\n `make it the default for new boxes: agentbox checkpoint set-default ${info.name}`,\n );\n }\n } finally {\n if (noticeId) {\n await clearRelayNotice(box.id, noticeId);\n process.removeListener('SIGINT', onSignal);\n process.removeListener('SIGTERM', onSignal);\n }\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst lsSub = new Command('ls')\n .description(\"List this project's checkpoints (both docker and cloud)\")\n .action(async () => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n const cfg = await loadEffectiveConfig(projectRoot);\n // Resolve per-provider so the `*default` marker tracks which one the\n // wizard would actually pick for that provider's row.\n const defDocker = resolveDefaultCheckpoint(cfg.effective, 'docker');\n const defDaytona = resolveDefaultCheckpoint(cfg.effective, 'daytona');\n const dockerList = await listCheckpoints(projectRoot);\n // Merge in cloud-backend checkpoints. v1: only Daytona is known. Future\n // backends slot in here once they implement `createSnapshot`.\n const daytonaList = await listCloudCheckpoints(projectRoot, 'daytona');\n\n if (dockerList.length === 0 && daytonaList.length === 0) {\n process.stdout.write(`no checkpoints for ${projectRoot}\\n`);\n return;\n }\n for (const c of dockerList) {\n const flag = c.name === defDocker ? ' *default' : '';\n process.stdout.write(\n `${c.name} docker (${c.manifest.type}) from ${c.manifest.sourceBoxName} ${c.manifest.createdAt}${flag}\\n`,\n );\n }\n for (const c of daytonaList) {\n const flag = c.name === defDaytona ? ' *default' : '';\n process.stdout.write(\n `${c.name} daytona (snapshot) 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 .option(\n '--provider <name>',\n 'set the default for only this provider (docker|daytona); without it, sets the cross-provider fallback',\n )\n .action(async (ref: string | undefined, opts: { clear?: boolean; provider?: string }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n const providerArg = opts.provider as ProviderKind | undefined;\n if (providerArg !== undefined && providerArg !== 'docker' && providerArg !== 'daytona') {\n throw new Error(`unknown provider '${opts.provider ?? ''}' (known: docker, daytona)`);\n }\n const configKey = defaultCheckpointConfigKey(providerArg);\n const label = providerArg ? `${providerArg} default checkpoint` : 'project default checkpoint';\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', configKey, projectRoot);\n process.stdout.write(\n r.existed\n ? `cleared ${label} (wrote ${r.path})\\n`\n : `no ${label} 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 // Accept the name if it exists in the store(s) we'd resolve against.\n // For --provider, restrict to that provider's store; without --provider,\n // accept if EITHER store has it (matches existing back-compat behavior).\n const checkDocker = providerArg === undefined || providerArg === 'docker';\n const checkDaytona = providerArg === undefined || providerArg === 'daytona';\n const dockerList = checkDocker ? await listCheckpoints(projectRoot) : [];\n const daytonaList = checkDaytona ? await listCloudCheckpoints(projectRoot, 'daytona') : [];\n if (\n !dockerList.some((c) => c.name === ref) &&\n !daytonaList.some((c) => c.name === ref)\n ) {\n throw new Error(`checkpoint not found: ${ref} (see \\`agentbox checkpoint ls\\`)`);\n }\n const r = await setConfigValue('project', configKey, ref, projectRoot);\n process.stdout.write(`${label} = ${ref} (wrote ${r.path})\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst rmSub = new Command('rm')\n .description('Delete a checkpoint (any provider that has it)')\n .argument('<ref>', 'checkpoint name')\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--provider <name>', \"delete only from this provider's store (default: all)\")\n .action(async (ref: string, opts: { yes?: boolean; provider?: string }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n // Look up both stores so the confirm + removal can act on whichever has it.\n const dockerInfo = !opts.provider || opts.provider === 'docker';\n const daytonaInfo =\n (!opts.provider || opts.provider === 'daytona') &&\n (await resolveCloudCheckpoint(projectRoot, 'daytona', ref));\n\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 let any = false;\n if (dockerInfo) {\n const removed = await removeCheckpoint(projectRoot, ref);\n if (removed) {\n any = true;\n process.stdout.write(`removed docker checkpoint ${ref}\\n`);\n }\n }\n if (daytonaInfo) {\n const { daytonaProvider } = await import('@agentbox/sandbox-daytona');\n try {\n await daytonaProvider.checkpoint?.remove(projectRoot, ref);\n any = true;\n process.stdout.write(`removed daytona checkpoint ${ref}\\n`);\n } catch (err) {\n log.warn(\n `daytona checkpoint remove failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n if (!any) throw new Error(`checkpoint not found: ${ref}`);\n\n // Don't leave any default-checkpoint pointer dangling at a now-deleted\n // ref — future `agentbox create` would fail to resolve it. Sweep the\n // global + per-provider keys, clear whichever the project layer set\n // to this ref, warn if the dangling pointer lives in a layer we can't\n // auto-edit (global or agentbox.yaml defaults).\n const cfg = await loadEffectiveConfig(projectRoot);\n const projectBox = cfg.layers.project.values.box;\n const defKeys = [\n ['box.defaultCheckpoint', projectBox?.defaultCheckpoint, cfg.effective.box.defaultCheckpoint],\n ['box.defaultCheckpointDocker', projectBox?.defaultCheckpointDocker, cfg.effective.box.defaultCheckpointDocker],\n ['box.defaultCheckpointDaytona', projectBox?.defaultCheckpointDaytona, cfg.effective.box.defaultCheckpointDaytona],\n ['box.defaultCheckpointHetzner', projectBox?.defaultCheckpointHetzner, cfg.effective.box.defaultCheckpointHetzner],\n ] as const;\n for (const [key, projectValue, effectiveValue] of defKeys) {\n if (projectValue === ref) {\n await unsetConfigValue('project', key, projectRoot);\n log.info(`cleared project ${key} (was ${ref})`);\n } else if (effectiveValue === ref) {\n log.warn(\n `${key} = ${ref} is set outside the per-project config (global or agentbox.yaml defaults) — clear it manually`,\n );\n }\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n/**\n * Cloud checkpoint create: delegate to `provider.checkpoint.create`. The cloud\n * provider's implementation captures via the backend's `createSnapshot` and\n * writes the manifest under `~/.agentbox/cloud-checkpoints/<backend>/…`.\n * Unlike Docker, there's no `--merged` (Daytona snapshots are flattened by\n * construction) and no `--replace` rerun yet (the underlying snapshot delete\n * is async on Daytona's side — keep it explicit: `agentbox checkpoint rm <name>`\n * then re-create).\n */\nasync function runCloudCheckpointCreate(box: BoxRecord, opts: CreateOpts): Promise<void> {\n if (opts.merged) {\n log.warn('--merged is Docker-only (cloud snapshots are always flattened); ignoring');\n }\n const projectRoot = await projectRootFor(box.workspacePath, box.projectRoot);\n const name = opts.name ?? `${box.name}-${String(Date.now()).slice(-6)}`;\n\n // Make sure the sandbox is running — `_experimental_createSnapshot` requires\n // a started sandbox. The provider's `probeState` + `start` handles the\n // pause/stop/missing branches with the same shape `agentbox url` / `screen`\n // use today.\n const provider = await providerForBox(box);\n const state = await provider.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await provider.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await provider.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n\n if (!provider.checkpoint) {\n throw new Error(`provider '${box.provider ?? 'docker'}' doesn't support checkpoints`);\n }\n\n // Daytona's snapshot capture pauses the sandbox while writing the image.\n // Warn attached sessions the same way the docker path does.\n const noticeId = await setRelayNotice(\n box.id,\n 'checkpoint',\n CHECKPOINT_NOTICE,\n CHECKPOINT_NOTICE_TTL_MS,\n );\n try {\n log.info(`capturing cloud snapshot '${name}' (this may take a few minutes)`);\n const result = await provider.checkpoint.create(box, name);\n log.success(`checkpoint ${result.ref} (daytona snapshot) captured`);\n if (opts.setDefault) {\n // Cloud snapshots aren't usable by docker boxes — pin the daytona-\n // specific default so `agentbox create --provider docker` in the same\n // project doesn't trip over a snapshot it can't resolve.\n const key = defaultCheckpointConfigKey(box.provider ?? 'daytona');\n await setConfigValue('project', key, result.ref, projectRoot);\n log.info(`set project default checkpoint (${key}) -> ${result.ref}`);\n } else {\n log.info(\n `make it the default for new boxes: agentbox checkpoint set-default --provider ${box.provider ?? 'daytona'} ${result.ref}`,\n );\n }\n } finally {\n if (noticeId) await clearRelayNotice(box.id, noticeId);\n }\n}\n\nexport const checkpointCommand = new Command('checkpoint')\n .alias('checkpoints')\n .description('List and manage project checkpoints (warm box state new boxes can start from)')\n .addCommand(createSub)\n .addCommand(lsSub, { isDefault: true })\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 { BoxRecord } from '@agentbox/core';\nimport type { StatusReply, WaitReadyReply } from '@agentbox/ctl';\nimport { loadEffectiveConfig, type IdeFlavor as ConfigIdeFlavor, type UserConfig } from '@agentbox/config';\nimport {\n attachedContainerUri,\n ensureAgentboxTasksFile,\n execInBox,\n getDockerContext,\n ideProfile,\n inspectBox,\n startBox,\n unpauseBox,\n type IdeFlavor,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { agentboxAliasFor, parseSshTarget, writeAgentboxSshAlias } from '../ssh-config.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface CodeOptions {\n // commander stores `--no-wait` / `--no-auto-terminals` under the positive\n // key (`wait` / `autoTerminals`), defaulting to true and flipping to false.\n wait?: boolean;\n timeout?: string;\n autoTerminals?: 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.wait === false) code.wait = false;\n if (opts.autoTerminals === false) 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 const provider = box.provider ?? 'docker';\n const folderUri =\n provider === 'docker'\n ? await prepareDockerAttach(box, { wait, autoTerminals, timeoutMs, regenTasks: opts.regenTasks })\n : await prepareCloudAttach(box, { wait, timeoutMs });\n\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.name} in ${ideProfile(exit.flavor).displayName} (${exit.via})`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ninterface PrepareDockerOptions {\n wait: boolean;\n autoTerminals: boolean;\n timeoutMs: string;\n regenTasks?: boolean;\n}\n\nasync function prepareDockerAttach(box: BoxRecord, opts: PrepareDockerOptions): Promise<string> {\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`);\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 (opts.wait) {\n const reply = await runWaitReadyDocker(box.container, opts.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 (opts.autoTerminals) {\n try {\n const services = await fetchServiceNamesDocker(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 // Embed the active Docker context so the Dev Containers extension\n // attaches via the same daemon agentbox used — without it, switching\n // engines (OrbStack ⇄ Docker Desktop) makes it probe the wrong daemon\n // and report the container as non-existent.\n const dockerContext = await getDockerContext();\n return attachedContainerUri(box.container, { dockerContext });\n}\n\ninterface PrepareCloudOptions {\n wait: boolean;\n timeoutMs: string;\n}\n\nasync function prepareCloudAttach(box: BoxRecord, opts: PrepareCloudOptions): Promise<string> {\n const p = await providerForBox(box);\n const state = await p.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await p.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await p.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n\n if (opts.wait) {\n try {\n const r = await p.exec(box, ['agentbox-ctl', 'wait-ready', '--json', '--timeout', opts.timeoutMs]);\n const reply = JSON.parse(r.stdout) as WaitReadyReply;\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 } catch (err) {\n log.warn(`wait-ready failed (continuing): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Auto-terminals is docker-only for v1 — writing tasks.json requires a\n // `writeFileInBox` over `backend.exec`. Not load-bearing for the editor\n // attach itself; user can author `.vscode/tasks.json` manually.\n\n if (!p.buildAttach) {\n throw new Error(\n `cloud provider '${p.name}' does not support SSH attach — \\`agentbox code\\` requires it`,\n );\n }\n // buildAttach mints a fresh 60-min SSH token via the backend's `attachArgv`.\n // We only want the connect argv here; the inner tmux command is irrelevant\n // (Remote-SSH starts its own session). `noTmux` skips the tmux wrap so\n // argv is the plain `ssh ... <user>@<host>` form.\n const spec = await p.buildAttach(box, 'shell', { noTmux: true });\n const target = parseSshTarget(spec.argv);\n if (!target) {\n throw new Error(\n `could not parse <user>@<host> from cloud SSH argv: ${spec.argv.join(' ')}`,\n );\n }\n\n const alias = agentboxAliasFor(box.name);\n await writeAgentboxSshAlias({\n alias,\n hostname: target.host,\n user: target.user,\n identityFile: target.identityFile,\n });\n log.info(`updated ~/.ssh/config alias ${alias}`);\n\n return `vscode-remote://ssh-remote+${alias}/workspace`;\n}\n\nasync function runWaitReadyDocker(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 fetchServiceNamesDocker(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 { promises as fs } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/**\n * Host-side helper for maintaining one `Host <alias>` block per cloud box in\n * `~/.ssh/config`. Daytona's SSH gateway authenticates per-token (the User\n * field carries an ephemeral 60-min token from `sb.createSshAccess(60)`), so\n * we rewrite the block every `agentbox code` invocation to keep the alias\n * mapped to a live token. BEGIN/END markers around each managed block let us\n * coexist with user-authored entries.\n */\n\nexport interface SshAliasOptions {\n /** Host alias the user (and VS Code Remote-SSH) refers to, e.g. `agentbox-cloud-myname`. */\n alias: string;\n /** Daytona SSH gateway, typically `ssh.app.daytona.io`. */\n hostname: string;\n /** Ephemeral Daytona token (used as the SSH User). Rotates every call. */\n user: string;\n /**\n * Per-box private key path for providers that authenticate by identity\n * file (Hetzner). Omit for token-in-User auth (Daytona) — without this\n * field VSCode's Remote-SSH would try ~/.ssh/id_* defaults and fail with\n * \"permission denied\" against a Hetzner VPS that only trusts the per-box\n * key under `~/.agentbox/boxes/<id>/ssh/id_ed25519`.\n */\n identityFile?: string;\n}\n\nfunction sshConfigPath(): string {\n return join(homedir(), '.ssh', 'config');\n}\n\nfunction beginMarker(alias: string): string {\n return `# BEGIN agentbox cloud box ${alias}`;\n}\n\nfunction endMarker(alias: string): string {\n return `# END agentbox cloud box ${alias}`;\n}\n\n/** Stable alias derived from a box name. Box names are already kebab-safe. */\nexport function agentboxAliasFor(boxName: string): string {\n return `agentbox-cloud-${boxName}`;\n}\n\nasync function readConfig(): Promise<string> {\n try {\n return await fs.readFile(sshConfigPath(), 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return '';\n throw err;\n }\n}\n\n/**\n * Strip an existing managed block for `alias`. Returns the file contents with\n * any block bracketed by our BEGIN/END markers for this alias removed.\n *\n * Anchored at the start of a line (`m` flag) so the preceding newline stays\n * attached to whatever came before — removing a block between two pieces of\n * content must not collapse the separating newline.\n */\nfunction stripBlock(contents: string, alias: string): string {\n const begin = beginMarker(alias);\n const end = endMarker(alias);\n const escape = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(\n `^${escape(begin)}\\\\n[\\\\s\\\\S]*?${escape(end)}\\\\n?`,\n 'gm',\n );\n return contents.replace(pattern, '');\n}\n\nfunction buildBlock(opts: SshAliasOptions): string {\n // `UserKnownHostsFile /dev/null` + `LogLevel ERROR` is the Vagrant / dev-tool\n // convention: many sandboxes sit behind one DNS name, so pinning a host key\n // locally generates noise + false-positive HostKeyVerificationFailed errors.\n const lines: string[] = [\n beginMarker(opts.alias),\n `Host ${opts.alias}`,\n ` HostName ${opts.hostname}`,\n ` User ${opts.user}`,\n ];\n if (opts.identityFile) {\n // `IdentitiesOnly yes` stops ssh-agent from offering unrelated keys\n // first — some sshd configs cap auth attempts and would lock us out\n // before the right key is tried.\n lines.push(` IdentityFile ${opts.identityFile}`);\n lines.push(` IdentitiesOnly yes`);\n }\n lines.push(\n ` StrictHostKeyChecking accept-new`,\n ` UserKnownHostsFile /dev/null`,\n ` LogLevel ERROR`,\n endMarker(opts.alias),\n '',\n );\n return lines.join('\\n');\n}\n\nexport async function writeAgentboxSshAlias(opts: SshAliasOptions): Promise<void> {\n const path = sshConfigPath();\n await fs.mkdir(join(homedir(), '.ssh'), { recursive: true, mode: 0o700 });\n const existing = await readConfig();\n const stripped = stripBlock(existing, opts.alias);\n const separator = stripped.length === 0 || stripped.endsWith('\\n') ? '' : '\\n';\n const next = `${stripped}${separator}${buildBlock(opts)}`;\n await fs.writeFile(path, next, { mode: 0o600 });\n // Re-assert mode in case the file existed with broader perms.\n await fs.chmod(path, 0o600);\n}\n\nexport interface SshTarget {\n user: string;\n host: string;\n /** Path from `-i <path>` if the argv carries one (Hetzner). Undefined for\n * Daytona where auth is via token-in-User. */\n identityFile?: string;\n}\n\n/**\n * Pluck the SSH connect target (and identity file, if any) out of an argv\n * returned by a provider's `attachArgv` / `buildAttach`. The argv shape is\n * `ssh [-i <path>] [-o ...] <user>@<host> [command...]` — we walk from the\n * end to find the user@host token and scan forward for `-i`.\n */\nexport function parseSshTarget(argv: readonly string[]): SshTarget | undefined {\n let target: { user: string; host: string } | undefined;\n for (let i = argv.length - 1; i >= 0; i--) {\n const v = argv[i];\n if (!v || v.startsWith('-')) continue;\n const at = v.indexOf('@');\n if (at <= 0) continue;\n target = { user: v.slice(0, at), host: v.slice(at + 1) };\n break;\n }\n if (!target) return undefined;\n let identityFile: string | undefined;\n for (let i = 0; i < argv.length - 1; i++) {\n if (argv[i] === '-i') {\n identityFile = argv[i + 1];\n break;\n }\n }\n return { ...target, identityFile };\n}\n\nexport async function removeAgentboxSshAlias(alias: string): Promise<void> {\n const path = sshConfigPath();\n const existing = await readConfig();\n if (existing === '') return;\n const next = stripBlock(existing, alias);\n if (next === existing) return; // no managed block matched\n await fs.writeFile(path, next, { mode: 0o600 });\n}\n","import { confirm, intro, isCancel, log, outro, spinner } from '@clack/prompts';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type AttachOpenIn,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n buildCodexAttachArgv,\n buildCodexLoginRunArgv,\n CodexSessionError,\n codexSessionInfo,\n createBox,\n DEFAULT_RELAY_PORT,\n detectEngine,\n ensureCodexInstalled,\n ensureCodexVolume,\n ensureImage,\n formatDetachNotice,\n inspectBox,\n runInteractiveCodexLogin,\n seedCodexHooks,\n SHARED_CODEX_VOLUME,\n startBox,\n startCodexSession,\n unpauseBox,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport {\n assertAgentCredsAvailable,\n codexAuthAvailable,\n MissingAgentCredsError,\n} from '../lib/queue/assert-creds.js';\nimport { submitQueueJob } from '../lib/queue/submit.js';\nimport {\n ATTACH_IN_HELP,\n INLINE_HELP,\n NO_ATTACH_HELP,\n resolveAttachInOption,\n} from './_attach-in.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\nimport { cloudAgentCreate } from './_cloud-agent-create.js';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, resolveFromBranch } from '../lib/from-branch.js';\nimport { providerForBox, providerForCreate } from '../provider/registry.js';\nimport {\n prepareTeleport,\n TeleportError,\n uploadTeleport,\n type ResolvedTeleport,\n type ResumeMode,\n} from '../session-teleport/index.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybePromptPortless } from '../portless-prompt.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Ref shown in the detach notice: the per-project index `n` when set, else the name. */\nfunction reattachRef(r: { projectIndex?: number; name: string }): string {\n return typeof r.projectIndex === 'number' ? String(r.projectIndex) : r.name;\n}\n\nfunction parseMaxRunningOption(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`--max-running: expected a positive integer, got \"${raw}\"`);\n }\n return n;\n}\n\nfunction pickCodexCreateOpts(opts: CodexCreateOptions): import('@agentbox/relay').QueueJobCreateOpts {\n return {\n workspace: opts.workspace,\n name: opts.name,\n hostSnapshot: opts.hostSnapshot,\n snapshot: opts.snapshot,\n image: opts.image,\n withPlaywright: opts.withPlaywright,\n withEnv: opts.withEnv,\n vnc: opts.vnc,\n sharedDockerCache: opts.sharedDockerCache,\n portless: opts.portless,\n sessionName: opts.sessionName,\n memory: opts.memory,\n cpus: opts.cpus,\n pidsLimit: opts.pidsLimit,\n disk: opts.disk,\n };\n}\n\n/** Host-side URL for the relay (loopback for the wrapper's SSE subscription). */\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/**\n * Attach to a box's Codex tmux session through the wrapped-pty footer (same\n * channel `agentbox claude` uses for the host-action prompts), then exit with\n * the inner pty's code. The footer + relay prompt channel are box-level, not\n * claude-specific, so codex reuses them with `mode: 'codex'`.\n */\nasync function attachCodexWrapped(\n box: { id: string; name: string; container: string; projectIndex?: number },\n sessionName: string | undefined,\n reattach: string,\n onError?: (msg: string) => void,\n openIn?: AttachOpenIn,\n): Promise<never> {\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildCodexAttachArgv(box.container, sessionName),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'codex',\n detachable: true,\n detachNotice: formatDetachNotice(reattach, 'codex'),\n onError,\n openIn,\n });\n process.exit(code);\n}\n\ninterface CodexCreateOptions {\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 isolateCodexConfig?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** Sandbox backend: `docker` (default) or `daytona`. */\n provider?: string;\n /** --from-branch <ref>: base the box's per-box branch on this ref instead of HEAD. */\n fromBranch?: string;\n /** -v / --verbose: bypass the spinner and stream raw provider output. */\n verbose?: boolean;\n /** Raw `--attach-in <mode>` value; validated by `parseAttachInOption`. */\n attachIn?: string;\n /** --inline: shortcut for `--attach-in same` (long-form only — `-i` is `--initial-prompt`). */\n inline?: boolean;\n /** Commander parses `-b, --no-attach` as `attach: false` (defaults true). */\n attach?: boolean;\n /** `-i, --initial-prompt <text>`: seed codex with this user turn; runs in background. */\n initialPrompt?: string;\n /** Per-invocation override of `queue.maxConcurrent`. */\n maxRunning?: string;\n /** `-c, --continue`: teleport and resume the most recent host codex session for this cwd. */\n continue?: boolean;\n /** `--resume <id>`: teleport and resume the specified host codex session uuid. */\n resume?: string;\n}\n\nfunction buildCodexCliOverrides(opts: CodexCreateOptions): 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.isolateCodexConfig === true) box.isolateCodexConfig = true;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n const codex: NonNullable<UserConfig['codex']> = {};\n if (opts.sessionName !== undefined) codex.sessionName = opts.sessionName;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (Object.keys(codex).length > 0) out.codex = codex;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n const attachIn = resolveAttachInOption(opts);\n if (attachIn !== undefined) out.attach = { openIn: attachIn };\n return out;\n}\n\n/**\n * Run `codex login` in a throwaway container against the shared codex-config\n * volume — credentials persist there and seed every later box. Defaults to the\n * `--device-auth` device-code flow (see {@link buildCodexLoginRunArgv}).\n */\nasync function runCodexLoginContainer(image: string, extraArgs: string[]): Promise<number> {\n const { exitCode } = runInteractiveCodexLogin(\n buildCodexLoginRunArgv({ volume: SHARED_CODEX_VOLUME, image, extraArgs }),\n );\n return exitCode;\n}\n\n/**\n * First-run sign-in offer, shown before box creation. When no Codex\n * credentials are available, prompts the user and (on confirm) runs\n * `codex login` in a throwaway container — the result seeds every future box\n * via the shared volume. Silent no-op when already authenticated, in\n * non-interactive runs, or with `--yes`.\n */\nasync function maybeRunCodexLogin(args: { image: string; yes: boolean }): Promise<void> {\n if (!process.stdin.isTTY || args.yes) return;\n if (await codexAuthAvailable(args.image)) return;\n\n const answer = await confirm({\n message: 'Sign in to Codex? (saved and reused by every box)',\n initialValue: true,\n });\n if (isCancel(answer) || !answer) {\n log.info('Skipped sign-in — codex will prompt you to sign in inside the box.');\n return;\n }\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(args.image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists (and is vscode-writable) before the login\n // container writes auth.json into it.\n s.message('preparing codex config');\n await ensureCodexVolume({ volume: SHARED_CODEX_VOLUME }, { syncFromHost: true, image: args.image });\n s.stop('image ready');\n\n const exitCode = await runCodexLoginContainer(args.image, []);\n if (exitCode !== 0) {\n log.warn('Codex login did not complete; continuing — run `agentbox codex login` to retry.');\n return;\n }\n log.success('Signed in to Codex — saved for future boxes.');\n}\n\nexport const codexCommand = new Command('codex')\n .description('Create a sandboxed box and launch OpenAI Codex 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', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\n .option('--no-host-snapshot', 'tar-pipe directly from the live host workspace at create time')\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')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\n .option(\n '--isolate-codex-config',\n 'use a per-box ~/.codex volume instead of the shared agentbox-codex-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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\n .option('--session-name <name>', 'tmux session name (default from config; built-in: codex)')\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(\n '--provider <name>',\n \"sandbox backend: 'docker' (default) or 'daytona' for a cloud box\",\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-v, --verbose',\n 'bypass the spinner and stream raw provider output to stderr. The same content always lands in ~/.agentbox/logs/codex.log.',\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('--inline', INLINE_HELP)\n .option('-b, --no-attach', NO_ATTACH_HELP)\n .option(\n '-i, --initial-prompt <text>',\n 'seed the codex session with this initial user turn and run in background (no attach). Jobs go through the host-wide queue (queue.maxConcurrent).',\n )\n .option(\n '--max-running <n>',\n 'per-invocation override of queue.maxConcurrent; only honored when `-i` is set',\n )\n .option(\n '-c, --continue',\n 'teleport the most recent host Codex session for this cwd into the box and resume from it',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Codex session uuid into the box and resume from it',\n )\n .argument(\n '[codex-args...]',\n \"extra args passed to codex inside the box; place after `--`, e.g. `agentbox codex -- -m gpt-5.4`\",\n )\n .action(async (codexArgs: string[], opts: CodexCreateOptions) => {\n const cmdLog = openCommandLog('codex');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Starting Codex in a box...');\n\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n cmdLog.close();\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n if (resumeMode && opts.initialPrompt && opts.initialPrompt.length > 0) {\n log.error('-i / --initial-prompt cannot be combined with -c / --resume.');\n cmdLog.close();\n process.exit(2);\n }\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'codex',\n hostCwd: opts.workspace,\n mode: resumeMode,\n log: (line) => cmdLog.write(line),\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildCodexCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n // Resolve provider. Cloud path skips docker-only steps (login offer,\n // Portless, createBox) and delegates to cloudAgentCreate.\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const isCloud = providerName !== 'docker';\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n if (opts.initialPrompt && opts.initialPrompt.length > 0) {\n if (isCloud) {\n log.error('-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).');\n cmdLog.close();\n process.exit(2);\n }\n try {\n await assertAgentCredsAvailable({\n agent: 'codex',\n image: cfg.effective.box.image,\n });\n } catch (err) {\n if (err instanceof MissingAgentCredsError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const maxRunningOverride = parseMaxRunningOption(opts.maxRunning);\n const result = await submitQueueJob({\n agent: 'codex',\n boxName: opts.name ?? '',\n providerName,\n prompt: opts.initialPrompt,\n agentArgs: codexArgs,\n createOpts: pickCodexCreateOpts(opts),\n maxRunningOverride,\n });\n outro(\n `job ${result.job.id} queued (${String(result.runningCount)}/${String(result.maxConcurrent)} running); log: ${result.job.logPath}`,\n );\n cmdLog.close();\n return;\n }\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask before any\n // box work. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\n\n let fromBranch: string | undefined;\n try {\n fromBranch = await resolveFromBranch(opts.fromBranch, { repo: opts.workspace });\n } catch (err) {\n if (err instanceof FromBranchError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n\n if (isCloud) {\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n await cloudAgentCreate({\n provider,\n request: {\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n fromBranch,\n projectRoot,\n },\n binary: 'codex',\n sessionName: cfg.effective.codex.sessionName,\n mode: 'codex',\n extraArgs: codexArgs,\n verbose: opts.verbose === true,\n openIn: cfg.effective.attach.openIn,\n attach: opts.attach !== false,\n beforeStart: resumePrepared\n ? async (box) => {\n try {\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared!,\n log: (line) => cmdLog.write(line),\n });\n return { agentArgsPrefix: resumePrepared!.forwardArgs };\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n : undefined,\n });\n return;\n }\n\n // First-run sign-in offer — before any box work, so the user signs in up\n // front. Uses a throwaway container; the result seeds every future box.\n await maybeRunCodexLogin({ image: cfg.effective.box.image, yes: !!opts.yes });\n\n // First-run Portless opt-in (Docker Desktop only).\n const portlessEnabled = await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n\n // host-snapshot default off: explicit flag/config wins.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n const sessionName = cfg.effective.codex.sessionName;\n\n const s = makeProgressReporter(opts.verbose === true);\n s.start('creating box');\n let containerName = '';\n try {\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 fromBranch,\n image: cfg.effective.box.image,\n codexConfig: { isolate: cfg.effective.box.isolateCodexConfig },\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n containerName = result.record.container;\n\n // Codex is baked into the current base image, but a box built from a\n // checkpoint captured before Codex support won't have it — install it\n // into the box's writable layer in that case (fast no-op otherwise).\n s.message('checking codex');\n cmdLog.write('checking codex');\n await ensureCodexInstalled(result.record.container, {\n onProgress: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n\n let effectiveCodexArgs = codexArgs;\n if (resumePrepared) {\n s.message('uploading codex session into box');\n cmdLog.write('uploading codex session into box');\n try {\n const provider = await providerForBox(result.record);\n await uploadTeleport({\n box: result.record,\n provider,\n resolved: resumePrepared,\n log: (line) => {\n s.message(clampSpinnerLine(line));\n cmdLog.write(line);\n },\n });\n effectiveCodexArgs = [...resumePrepared.forwardArgs, ...effectiveCodexArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n log.info(\n `The box ${result.record.container} is up but unused. Destroy it with: agentbox destroy ${result.record.container} -y`,\n );\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n s.message('starting codex session');\n await startCodexSession({\n container: result.record.container,\n codexArgs: effectiveCodexArgs,\n sessionName,\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\n if (opts.attach === false) {\n outro(\n `session started — attach with: agentbox codex attach ${reattachRef(result.record)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves codex running');\n await attachCodexWrapped(\n result.record,\n sessionName,\n reattachRef(result.record),\n (m) => cmdLog.write(m),\n cfg.effective.attach.openIn,\n );\n } catch (err) {\n s.stop('failed');\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);\n if (err instanceof CodexSessionError) {\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 cmdLog.close();\n process.exit(1);\n }\n handleLifecycleError(err);\n } finally {\n cmdLog.close();\n }\n });\n\ninterface CodexStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n attachIn?: string; // raw `--attach-in <mode>` value, validated below.\n inline?: boolean; // -i / --inline: shortcut for --attach-in same.\n attach?: boolean; // commander: --no-attach => false; default true.\n continue?: boolean;\n resume?: string;\n}\n\n// Shared by `codex start` and `codex attach`: if a session is already running,\n// just attach; otherwise auto-unpause/start the box, (optionally) resync\n// ~/.codex, launch codex, then attach.\nasync function startOrAttachCodex(\n box: BoxRecord,\n codexArgs: string[],\n opts: CodexStartOptions,\n resumePrepared?: ResolvedTeleport | null,\n): Promise<void> {\n const attachIn = resolveAttachInOption(opts);\n const cliOverrides: Partial<UserConfig> = {};\n if (opts.sessionName) cliOverrides.codex = { sessionName: opts.sessionName };\n if (attachIn !== undefined) cliOverrides.attach = { openIn: attachIn };\n const cfg = await loadEffectiveConfig(box.workspacePath, { cliOverrides });\n const sessionName = cfg.effective.codex.sessionName;\n const openIn = cfg.effective.attach.openIn;\n const wantAttach = opts.attach !== false;\n\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, ignore any\n // post-`--` args (they only apply to a fresh codex).\n const existing = await codexSessionInfo(box.container, sessionName);\n if (existing.running) {\n if (resumePrepared) {\n throw new Error(\n `cannot resume into ${box.name}: a Codex session is already running. Kill it first or use \\`agentbox codex attach\\`.`,\n );\n }\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" already running — attach with: agentbox codex attach ${reattachRef(box)}`,\n );\n return;\n }\n outro(`session \"${sessionName}\" already running — attaching (Control+a d to detach)`);\n await attachCodexWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n return;\n }\n\n // First-run sign-in offer — before any box prep.\n await maybeRunCodexLogin({ image: box.image, yes: false });\n\n const s = spinner();\n s.start('preparing box');\n\n // Auto-unpause/start. `startBox` relaunches ctl/vnc/dockerd.\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');\n await startBox(box.id);\n }\n\n // Re-sync host ~/.codex into the box volume (default; opt out with\n // --no-sync-config). Skipped for `codex attach`, and for boxes that have no\n // codex volume mounted (created via a plain `agentbox create` on a host\n // without ~/.codex) — codex still runs against the container-local ~/.codex.\n const syncConfig = opts.syncConfig !== false;\n if (syncConfig && box.codexConfigVolume) {\n s.message('syncing ~/.codex into box volume');\n await ensureCodexVolume(\n { volume: box.codexConfigVolume },\n { syncFromHost: true, image: box.image },\n );\n }\n // Re-seed the Codex activity hooks (box-only, image-versioned — runs even\n // with --no-sync-config so an image upgrade still propagates).\n if (box.codexConfigVolume) {\n await seedCodexHooks(box.codexConfigVolume, box.image);\n }\n\n // Install codex if the box image lacks it (checkpoint predating Codex).\n s.message('checking codex');\n await ensureCodexInstalled(box.container, {\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n let effectiveArgs = codexArgs;\n if (resumePrepared) {\n s.message('uploading codex session into box');\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared,\n log: (line) => s.message(clampSpinnerLine(line)),\n });\n effectiveArgs = [...resumePrepared.forwardArgs, ...effectiveArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n\n s.message('starting codex session');\n await startCodexSession({ container: box.container, codexArgs: effectiveArgs, sessionName });\n\n s.stop(`box ${box.container} ready`);\n\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" started — attach with: agentbox codex attach ${reattachRef(box)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves codex running');\n await attachCodexWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n}\n\nconst codexAttachCommand = new Command('attach')\n .description(\n 'Attach to a Codex tmux session in a box, starting one if none is running (auto-unpause/start; never re-syncs ~/.codex — use `codex start` for that)',\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: codex)')\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .action(async function (this: Command, idOrName: string | undefined) {\n const opts = this.optsWithGlobals() as CodexStartOptions;\n intro('Attaching to Codex session...');\n try {\n const attachIn = resolveAttachInOption(opts);\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') !== 'docker') {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'codex',\n sessionName: opts.sessionName ?? 'codex',\n mode: 'codex',\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachCodex(box, [], { ...opts, syncConfig: false });\n } catch (err) {\n if (err instanceof CodexSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst codexStartCommand = new Command('start')\n .description(\n 'Start a Codex 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: codex)')\n .option(\n '--no-sync-config',\n \"skip rsyncing the host's ~/.codex into the box's volume before starting (faster; use existing in-box state)\",\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .option('-b, --no-attach', NO_ATTACH_HELP)\n .option(\n '-c, --continue',\n 'teleport the most recent host Codex session for this cwd into the box and resume',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Codex session uuid into the box and resume',\n )\n .argument(\n '[codex-args...]',\n \"extra args passed to codex when starting a new session; ignored if a session is already running. Place after `--`, e.g. `agentbox codex start 1 -- -m gpt-5.4`\",\n )\n .action(async function (this: Command, idOrName: string | undefined, codexArgs: string[]) {\n const opts = this.optsWithGlobals() as CodexStartOptions;\n intro('Starting Codex in a box...');\n try {\n const attachIn = resolveAttachInOption(opts);\n // Two positionals make commander bind the first post-`--` token to\n // `[box]`; resolveBoxOrShift detects that and auto-picks the box.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n let effectiveCodexArgs = shifted && idOrName ? [idOrName, ...codexArgs] : codexArgs;\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'codex',\n hostCwd: box.workspacePath,\n mode: resumeMode,\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n if ((box.provider ?? 'docker') !== 'docker') {\n if (opts.attach === false) {\n outro(\n `--no-attach: cloud agent sessions are started lazily on attach. Run: agentbox codex attach ${reattachRef(box)}`,\n );\n return;\n }\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n if (resumePrepared) {\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({ box, provider, resolved: resumePrepared });\n effectiveCodexArgs = [...resumePrepared.forwardArgs, ...effectiveCodexArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n await cloudAgentAttach({\n box,\n binary: 'codex',\n sessionName: opts.sessionName ?? 'codex',\n mode: 'codex',\n extraArgs: effectiveCodexArgs,\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachCodex(box, effectiveCodexArgs, opts, resumePrepared);\n } catch (err) {\n if (err instanceof CodexSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst codexLoginCommand = new Command('login')\n .description(\n 'Sign in to Codex for use in sandboxes. Runs `codex login` in a throwaway container against the shared codex-config volume (default: --device-auth; pass e.g. `-- --api-key`). Usable before the first `agentbox codex`.',\n )\n .argument(\n '[args...]',\n 'extra args forwarded to `codex login` (default: --device-auth); place after `--`, e.g. `agentbox codex login -- --api-key`',\n )\n .action(async (args: string[]) => {\n intro('Signing in to Codex...');\n if (!process.stdin.isTTY) {\n log.error('`agentbox codex login` needs an interactive terminal.');\n process.exit(1);\n }\n try {\n const cfg = await loadEffectiveConfig(process.cwd());\n const image = cfg.effective.box.image;\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists + is vscode-writable before the login\n // container writes auth.json into it.\n s.message('preparing codex config');\n await ensureCodexVolume({ volume: SHARED_CODEX_VOLUME }, { syncFromHost: true, image });\n s.stop('image ready');\n\n const exitCode = await runCodexLoginContainer(image, args);\n if (exitCode !== 0) {\n log.warn(`\\`codex login\\` exited with code ${String(exitCode)}`);\n process.exit(exitCode);\n }\n outro('signed in — credentials saved for future boxes');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ncodexCommand.addCommand(codexAttachCommand);\ncodexCommand.addCommand(codexStartCommand);\ncodexCommand.addCommand(codexLoginCommand);\n","import { confirm, intro, isCancel, log, outro, spinner } from '@clack/prompts';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type AttachOpenIn,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n buildOpencodeAttachArgv,\n buildOpencodeLoginRunArgv,\n createBox,\n DEFAULT_RELAY_PORT,\n detectEngine,\n ensureImage,\n ensureOpencodeInstalled,\n ensureOpencodeVolume,\n formatDetachNotice,\n inspectBox,\n OpencodeSessionError,\n opencodeSessionInfo,\n runInteractiveOpencodeLogin,\n SHARED_OPENCODE_VOLUME,\n startBox,\n startOpencodeSession,\n unpauseBox,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport {\n assertAgentCredsAvailable,\n MissingAgentCredsError,\n opencodeAuthAvailable,\n} from '../lib/queue/assert-creds.js';\nimport { submitQueueJob } from '../lib/queue/submit.js';\nimport {\n ATTACH_IN_HELP,\n INLINE_HELP,\n NO_ATTACH_HELP,\n resolveAttachInOption,\n} from './_attach-in.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\nimport { cloudAgentCreate } from './_cloud-agent-create.js';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, resolveFromBranch } from '../lib/from-branch.js';\nimport { providerForCreate } from '../provider/registry.js';\nimport { prepareTeleport, TeleportError } from '../session-teleport/index.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybePromptPortless } from '../portless-prompt.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Ref shown in the detach notice: the per-project index `n` when set, else the name. */\nfunction reattachRef(r: { projectIndex?: number; name: string }): string {\n return typeof r.projectIndex === 'number' ? String(r.projectIndex) : r.name;\n}\n\nfunction parseMaxRunningOption(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`--max-running: expected a positive integer, got \"${raw}\"`);\n }\n return n;\n}\n\nfunction pickOpencodeCreateOpts(opts: OpencodeCreateOptions): import('@agentbox/relay').QueueJobCreateOpts {\n return {\n workspace: opts.workspace,\n name: opts.name,\n hostSnapshot: opts.hostSnapshot,\n snapshot: opts.snapshot,\n image: opts.image,\n withPlaywright: opts.withPlaywright,\n withEnv: opts.withEnv,\n vnc: opts.vnc,\n sharedDockerCache: opts.sharedDockerCache,\n portless: opts.portless,\n sessionName: opts.sessionName,\n memory: opts.memory,\n cpus: opts.cpus,\n pidsLimit: opts.pidsLimit,\n disk: opts.disk,\n };\n}\n\n/** Host-side URL for the relay (loopback for the wrapper's SSE subscription). */\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/**\n * Attach to a box's OpenCode tmux session through the wrapped-pty footer (same\n * channel `agentbox claude`/`codex` use for host-action prompts), then exit\n * with the inner pty's code.\n */\nasync function attachOpencodeWrapped(\n box: { id: string; name: string; container: string; projectIndex?: number },\n sessionName: string | undefined,\n reattach: string,\n onError?: (msg: string) => void,\n openIn?: AttachOpenIn,\n): Promise<never> {\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildOpencodeAttachArgv(box.container, sessionName),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'opencode',\n detachable: true,\n detachNotice: formatDetachNotice(reattach, 'opencode'),\n onError,\n openIn,\n });\n process.exit(code);\n}\n\ninterface OpencodeCreateOptions {\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 isolateOpencodeConfig?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** Sandbox backend: `docker` (default) or `daytona`. */\n provider?: string;\n /** --from-branch <ref>: base the box's per-box branch on this ref instead of HEAD. */\n fromBranch?: string;\n /** -v / --verbose: bypass the spinner and stream raw provider output. */\n verbose?: boolean;\n /** Raw `--attach-in <mode>` value; validated by `parseAttachInOption`. */\n attachIn?: string;\n /** --inline: shortcut for `--attach-in same` (long-form only — `-i` is `--initial-prompt`). */\n inline?: boolean;\n /** Commander parses `-b, --no-attach` as `attach: false` (defaults true). */\n attach?: boolean;\n /** `-i, --initial-prompt <text>`: seed opencode with this user turn; runs in background. */\n initialPrompt?: string;\n /** Per-invocation override of `queue.maxConcurrent`. */\n maxRunning?: string;\n /** `-c, --continue`: detected then refused (v1 stub). */\n continue?: boolean;\n /** `--resume <id>`: detected then refused (v1 stub). */\n resume?: string;\n}\n\nfunction buildOpencodeCliOverrides(opts: OpencodeCreateOptions): 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.isolateOpencodeConfig === true) box.isolateOpencodeConfig = true;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n const opencode: NonNullable<UserConfig['opencode']> = {};\n if (opts.sessionName !== undefined) opencode.sessionName = opts.sessionName;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (Object.keys(opencode).length > 0) out.opencode = opencode;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n const attachIn = resolveAttachInOption(opts);\n if (attachIn !== undefined) out.attach = { openIn: attachIn };\n return out;\n}\n\n/**\n * Run `opencode auth login` in a throwaway container against the shared\n * opencode-config volume — credentials persist there and seed every later box.\n * Interactive provider picker; `extraArgs` (e.g. `--provider anthropic`) are\n * forwarded verbatim.\n */\nasync function runOpencodeLoginContainer(image: string, extraArgs: string[]): Promise<number> {\n const { exitCode } = runInteractiveOpencodeLogin(\n buildOpencodeLoginRunArgv({ volume: SHARED_OPENCODE_VOLUME, image, extraArgs }),\n );\n return exitCode;\n}\n\n/**\n * First-run sign-in offer, shown before box creation. When no OpenCode\n * credentials are available, prompts the user and (on confirm) runs\n * `opencode auth login` in a throwaway container — the result seeds every\n * future box via the shared volume. Silent no-op when already authenticated,\n * in non-interactive runs, or with `--yes`.\n */\nasync function maybeRunOpencodeLogin(args: { image: string; yes: boolean }): Promise<void> {\n if (!process.stdin.isTTY || args.yes) return;\n if (await opencodeAuthAvailable(args.image)) return;\n\n const answer = await confirm({\n message: 'Sign in to OpenCode? (pick a provider; saved and reused by every box)',\n initialValue: true,\n });\n if (isCancel(answer) || !answer) {\n log.info('Skipped sign-in — opencode will prompt you to sign in inside the box.');\n return;\n }\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(args.image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists (and is vscode-writable) before the login\n // container writes auth.json into it.\n s.message('preparing opencode config');\n await ensureOpencodeVolume(\n { volume: SHARED_OPENCODE_VOLUME },\n { syncFromHost: true, image: args.image },\n );\n s.stop('image ready');\n\n const exitCode = await runOpencodeLoginContainer(args.image, []);\n if (exitCode !== 0) {\n log.warn('OpenCode login did not complete; continuing — run `agentbox opencode login` to retry.');\n return;\n }\n log.success('Signed in to OpenCode — saved for future boxes.');\n}\n\nexport const opencodeCommand = new Command('opencode')\n .description('Create a sandboxed box and launch OpenCode 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', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\n .option('--no-host-snapshot', 'tar-pipe directly from the live host workspace at create time')\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')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\n .option(\n '--isolate-opencode-config',\n 'use a per-box OpenCode volume instead of the shared agentbox-opencode-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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\n .option('--session-name <name>', 'tmux session name (default from config; built-in: opencode)')\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(\n '--provider <name>',\n \"sandbox backend: 'docker' (default) or 'daytona' for a cloud box\",\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-v, --verbose',\n 'bypass the spinner and stream raw provider output to stderr. The same content always lands in ~/.agentbox/logs/opencode.log.',\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('--inline', INLINE_HELP)\n .option('-b, --no-attach', NO_ATTACH_HELP)\n .option(\n '-i, --initial-prompt <text>',\n 'seed the opencode session with this initial user turn and run in background (no attach). Jobs go through the host-wide queue (queue.maxConcurrent).',\n )\n .option(\n '--max-running <n>',\n 'per-invocation override of queue.maxConcurrent; only honored when `-i` is set',\n )\n .option(\n '-c, --continue',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .option(\n '--resume <id>',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .argument(\n '[opencode-args...]',\n \"extra args passed to opencode inside the box; place after `--`, e.g. `agentbox opencode -- -m anthropic/claude-sonnet-4-5`\",\n )\n .action(async (opencodeArgs: string[], opts: OpencodeCreateOptions) => {\n const cmdLog = openCommandLog('opencode');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Starting OpenCode in a box...');\n\n // OpenCode session teleport is not yet supported (v1 stub). Detect resume\n // flags early and bail with a clear message before any box work happens.\n if (opts.continue === true || opts.resume) {\n try {\n await prepareTeleport({\n agent: 'opencode',\n hostCwd: opts.workspace,\n mode:\n opts.continue === true\n ? { kind: 'continue' }\n : { kind: 'resume', id: opts.resume! },\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildOpencodeCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n // Resolve provider. Cloud path skips docker-only steps (login offer,\n // Portless, createBox) and delegates to cloudAgentCreate.\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const isCloud = providerName !== 'docker';\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n if (opts.initialPrompt && opts.initialPrompt.length > 0) {\n if (isCloud) {\n log.error('-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).');\n cmdLog.close();\n process.exit(2);\n }\n try {\n await assertAgentCredsAvailable({\n agent: 'opencode',\n image: cfg.effective.box.image,\n });\n } catch (err) {\n if (err instanceof MissingAgentCredsError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const maxRunningOverride = parseMaxRunningOption(opts.maxRunning);\n const result = await submitQueueJob({\n agent: 'opencode',\n boxName: opts.name ?? '',\n providerName,\n prompt: opts.initialPrompt,\n agentArgs: opencodeArgs,\n createOpts: pickOpencodeCreateOpts(opts),\n maxRunningOverride,\n });\n outro(\n `job ${result.job.id} queued (${String(result.runningCount)}/${String(result.maxConcurrent)} running); log: ${result.job.logPath}`,\n );\n cmdLog.close();\n return;\n }\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask before any\n // box work. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\n\n let fromBranch: string | undefined;\n try {\n fromBranch = await resolveFromBranch(opts.fromBranch, { repo: opts.workspace });\n } catch (err) {\n if (err instanceof FromBranchError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n\n if (isCloud) {\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n await cloudAgentCreate({\n provider,\n request: {\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n fromBranch,\n projectRoot,\n },\n binary: 'opencode',\n sessionName: cfg.effective.opencode.sessionName,\n mode: 'opencode',\n extraArgs: opencodeArgs,\n verbose: opts.verbose === true,\n openIn: cfg.effective.attach.openIn,\n attach: opts.attach !== false,\n });\n return;\n }\n\n // First-run sign-in offer — before any box work, so the user signs in up\n // front. Uses a throwaway container; the result seeds every future box.\n await maybeRunOpencodeLogin({ image: cfg.effective.box.image, yes: !!opts.yes });\n\n // First-run Portless opt-in (Docker Desktop only).\n const portlessEnabled = await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n\n // host-snapshot default off: explicit flag/config wins.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n const sessionName = cfg.effective.opencode.sessionName;\n\n const s = makeProgressReporter(opts.verbose === true);\n s.start('creating box');\n let containerName = '';\n try {\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 fromBranch,\n image: cfg.effective.box.image,\n opencodeConfig: { isolate: cfg.effective.box.isolateOpencodeConfig },\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n containerName = result.record.container;\n\n // OpenCode is baked into the current base image, but a box built from a\n // checkpoint captured before OpenCode support won't have it — install it\n // into the box's writable layer in that case (fast no-op otherwise).\n s.message('checking opencode');\n cmdLog.write('checking opencode');\n await ensureOpencodeInstalled(result.record.container, {\n onProgress: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n\n s.message('starting opencode session');\n await startOpencodeSession({\n container: result.record.container,\n opencodeArgs,\n sessionName,\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\n if (opts.attach === false) {\n outro(\n `session started — attach with: agentbox opencode attach ${reattachRef(result.record)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves opencode running');\n await attachOpencodeWrapped(\n result.record,\n sessionName,\n reattachRef(result.record),\n (m) => cmdLog.write(m),\n cfg.effective.attach.openIn,\n );\n } catch (err) {\n s.stop('failed');\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);\n if (err instanceof OpencodeSessionError) {\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 cmdLog.close();\n process.exit(1);\n }\n handleLifecycleError(err);\n } finally {\n cmdLog.close();\n }\n });\n\ninterface OpencodeStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n attachIn?: string; // raw `--attach-in <mode>` value, validated below.\n inline?: boolean; // -i / --inline: shortcut for --attach-in same.\n attach?: boolean; // commander: --no-attach => false; default true.\n continue?: boolean;\n resume?: string;\n}\n\n// Shared by `opencode start` and `opencode attach`: if a session is already\n// running, just attach; otherwise auto-unpause/start the box, (optionally)\n// resync the OpenCode config, launch opencode, then attach.\nasync function startOrAttachOpencode(\n box: BoxRecord,\n opencodeArgs: string[],\n opts: OpencodeStartOptions,\n): Promise<void> {\n const attachIn = resolveAttachInOption(opts);\n const cliOverrides: Partial<UserConfig> = {};\n if (opts.sessionName) cliOverrides.opencode = { sessionName: opts.sessionName };\n if (attachIn !== undefined) cliOverrides.attach = { openIn: attachIn };\n const cfg = await loadEffectiveConfig(box.workspacePath, { cliOverrides });\n const sessionName = cfg.effective.opencode.sessionName;\n const openIn = cfg.effective.attach.openIn;\n const wantAttach = opts.attach !== false;\n\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, ignore any\n // post-`--` args (they only apply to a fresh opencode).\n const existing = await opencodeSessionInfo(box.container, sessionName);\n if (existing.running) {\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" already running — attach with: agentbox opencode attach ${reattachRef(box)}`,\n );\n return;\n }\n outro(`session \"${sessionName}\" already running — attaching (Control+a d to detach)`);\n await attachOpencodeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n return;\n }\n\n // First-run sign-in offer — before any box prep.\n await maybeRunOpencodeLogin({ image: box.image, yes: false });\n\n const s = spinner();\n s.start('preparing box');\n\n // Auto-unpause/start. `startBox` relaunches ctl/vnc/dockerd.\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');\n await startBox(box.id);\n }\n\n // Re-sync the host's OpenCode config/auth into the box volume (default; opt\n // out with --no-sync-config). Skipped for `opencode attach`, and for boxes\n // with no OpenCode volume mounted — opencode still runs against container-\n // local config in that case.\n const syncConfig = opts.syncConfig !== false;\n if (syncConfig && box.opencodeConfigVolume) {\n s.message('syncing OpenCode config into box volume');\n await ensureOpencodeVolume(\n { volume: box.opencodeConfigVolume },\n { syncFromHost: true, image: box.image },\n );\n }\n\n // Install opencode if the box image lacks it (checkpoint predating OpenCode).\n s.message('checking opencode');\n await ensureOpencodeInstalled(box.container, {\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n s.message('starting opencode session');\n await startOpencodeSession({ container: box.container, opencodeArgs, sessionName });\n\n s.stop(`box ${box.container} ready`);\n\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" started — attach with: agentbox opencode attach ${reattachRef(box)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves opencode running');\n await attachOpencodeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n}\n\nconst opencodeAttachCommand = new Command('attach')\n .description(\n 'Attach to an OpenCode tmux session in a box, starting one if none is running (auto-unpause/start; never re-syncs config — use `opencode start` for that)',\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: opencode)')\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .action(async function (this: Command, idOrName: string | undefined) {\n const opts = this.optsWithGlobals() as OpencodeStartOptions;\n intro('Attaching to OpenCode session...');\n try {\n const attachIn = resolveAttachInOption(opts);\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') !== 'docker') {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'opencode',\n sessionName: opts.sessionName ?? 'opencode',\n mode: 'opencode',\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachOpencode(box, [], { ...opts, syncConfig: false });\n } catch (err) {\n if (err instanceof OpencodeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst opencodeStartCommand = new Command('start')\n .description(\n 'Start an OpenCode 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: opencode)')\n .option(\n '--no-sync-config',\n \"skip rsyncing the host's OpenCode config into the box's volume before starting (faster; use existing in-box state)\",\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .option('-b, --no-attach', NO_ATTACH_HELP)\n .option(\n '-c, --continue',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .option(\n '--resume <id>',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .argument(\n '[opencode-args...]',\n \"extra args passed to opencode when starting a new session; ignored if a session is already running. Place after `--`, e.g. `agentbox opencode start 1 -- -m anthropic/claude-sonnet-4-5`\",\n )\n .action(async function (this: Command, idOrName: string | undefined, opencodeArgs: string[]) {\n const opts = this.optsWithGlobals() as OpencodeStartOptions;\n intro('Starting OpenCode in a box...');\n try {\n const attachIn = resolveAttachInOption(opts);\n // Two positionals make commander bind the first post-`--` token to\n // `[box]`; resolveBoxOrShift detects that and auto-picks the box.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n const effectiveOpencodeArgs = shifted && idOrName ? [idOrName, ...opencodeArgs] : opencodeArgs;\n if (opts.continue === true || opts.resume) {\n try {\n await prepareTeleport({\n agent: 'opencode',\n hostCwd: box.workspacePath,\n mode:\n opts.continue === true\n ? { kind: 'continue' }\n : { kind: 'resume', id: opts.resume! },\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n if ((box.provider ?? 'docker') !== 'docker') {\n if (opts.attach === false) {\n outro(\n `--no-attach: cloud agent sessions are started lazily on attach. Run: agentbox opencode attach ${reattachRef(box)}`,\n );\n return;\n }\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'opencode',\n sessionName: opts.sessionName ?? 'opencode',\n mode: 'opencode',\n extraArgs: effectiveOpencodeArgs,\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachOpencode(box, effectiveOpencodeArgs, opts);\n } catch (err) {\n if (err instanceof OpencodeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst opencodeLoginCommand = new Command('login')\n .description(\n 'Sign in to OpenCode for use in sandboxes. Runs `opencode auth login` in a throwaway container against the shared opencode-config volume (interactive provider picker; pass e.g. `-- --provider anthropic`). Usable before the first `agentbox opencode`.',\n )\n .argument(\n '[args...]',\n 'extra args forwarded to `opencode auth login`; place after `--`, e.g. `agentbox opencode login -- --provider anthropic`',\n )\n .action(async (args: string[]) => {\n intro('Signing in to OpenCode...');\n if (!process.stdin.isTTY) {\n log.error('`agentbox opencode login` needs an interactive terminal.');\n process.exit(1);\n }\n try {\n const cfg = await loadEffectiveConfig(process.cwd());\n const image = cfg.effective.box.image;\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists + is vscode-writable before the login\n // container writes auth.json into it.\n s.message('preparing opencode config');\n await ensureOpencodeVolume({ volume: SHARED_OPENCODE_VOLUME }, { syncFromHost: true, image });\n s.stop('image ready');\n\n const exitCode = await runOpencodeLoginContainer(image, args);\n if (exitCode !== 0) {\n log.warn(`\\`opencode auth login\\` exited with code ${String(exitCode)}`);\n process.exit(exitCode);\n }\n outro('signed in — credentials saved for future boxes');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nopencodeCommand.addCommand(opencodeAttachCommand);\nopencodeCommand.addCommand(opencodeStartCommand);\nopencodeCommand.addCommand(opencodeLoginCommand);\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 { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n downloadFromBox,\n inspectBox,\n startBox,\n unpauseBox,\n uploadToBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/**\n * A `<box>:<path>` arg has a `:` in it AND no `/` before that colon. Anything\n * starting with `./`, `/`, or `../` is unambiguously a host path. Box names\n * are kebab-case identifiers (validated at create), so they can't contain\n * `/`. Empty box ref or missing path → returns null and the caller errors out.\n */\nfunction parseBoxArg(arg: string): { boxRef: string; path: string } | null {\n const idx = arg.indexOf(':');\n if (idx === -1) return null;\n const prefix = arg.slice(0, idx);\n if (prefix.includes('/')) return null;\n if (prefix.length === 0) return null;\n const p = arg.slice(idx + 1);\n if (p.length === 0) return null;\n return { boxRef: prefix, path: p };\n}\n\ninterface Parsed {\n direction: 'download' | 'upload';\n boxRef: string;\n boxPath: string;\n hostPath: string | undefined; // undefined only on download with no dst (= cwd)\n}\n\nfunction parseArgs(src: string, dst: string | undefined): Parsed {\n const srcBox = parseBoxArg(src);\n const dstBox = dst === undefined ? null : parseBoxArg(dst);\n\n if (srcBox && dstBox) {\n throw new Error(\n 'box-to-box copy is not supported; both arguments look like box paths (`name:/path`).',\n );\n }\n if (!srcBox && !dstBox) {\n throw new Error(\n 'one argument must be a box path of the form `<box>:/path` (e.g. `mybox:/workspace/foo`).',\n );\n }\n if (srcBox) {\n return {\n direction: 'download',\n boxRef: srcBox.boxRef,\n boxPath: srcBox.path,\n hostPath: dst,\n };\n }\n if (dst === undefined) {\n throw new Error('host -> box copy requires a destination, e.g. `agentbox cp ./foo box:/dst`.');\n }\n return {\n direction: 'upload',\n boxRef: dstBox!.boxRef,\n boxPath: dstBox!.path,\n hostPath: src,\n };\n}\n\nexport const cpCommand = new Command('cp')\n .description('Copy files between host and box (like `docker cp`; direction picked by `name:` prefix)')\n .argument('<src>', '`box:/path` (download) or host path (upload)')\n .argument(\n '[dst]',\n '`box:/path` (upload) or host path (download); defaults to cwd when downloading',\n )\n .addHelpText(\n 'after',\n [\n '',\n 'Examples:',\n ' agentbox cp mybox:/etc/foo ./foo # download (host path optional)',\n ' agentbox cp mybox:/workspace/.env # download into cwd',\n ' agentbox cp ./local.txt mybox:/workspace/ # upload (host path required)',\n ' agentbox cp ./dir mybox:/workspace/ # upload directory (recursive)',\n ].join('\\n'),\n )\n .action(async (src: string, dst: string | undefined) => {\n try {\n const parsed = parseArgs(src, dst);\n const box = await resolveBoxOrExit(parsed.boxRef);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n if (isCloud) {\n // Cloud cp: provider.uploadPath / downloadPath handle the tar +\n // backend.uploadFile/downloadFile dance. No docker exec, no pause-\n // probe — Daytona sandboxes don't have a Docker container state to\n // probe and the SDK handles the running/archived states itself.\n const provider = await providerForBox(box);\n if (!provider.uploadPath || !provider.downloadPath) {\n throw new Error(`provider '${provider.name}' does not support cp`);\n }\n if (parsed.direction === 'upload') {\n const result = await provider.uploadPath(box, parsed.hostPath!, parsed.boxPath);\n process.stdout.write(`copied to ${box.name}:${result.finalPath}\\n`);\n } else {\n const result = await provider.downloadPath(\n box,\n parsed.boxPath,\n parsed.hostPath ?? process.cwd(),\n );\n process.stdout.write(`copied to ${result.finalPath}\\n`);\n }\n return;\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');\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 if (parsed.direction === 'upload') {\n const result = await uploadToBox(box, parsed.hostPath!, parsed.boxPath);\n if (result.warn) {\n log.warn(`copied to ${box.name}:${result.finalPath}, but ${result.warn}`);\n } else {\n process.stdout.write(`copied to ${box.name}:${result.finalPath}\\n`);\n }\n } else {\n // Download: default dst to cwd (POSIX `cp` convention).\n const result = await downloadFromBox(box, parsed.boxPath, parsed.hostPath ?? process.cwd());\n process.stdout.write(`copied to ${result.finalPath}\\n`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { intro, log, outro } from '@clack/prompts';\nimport {\n bumpProjectGcCounter,\n findProjectRoot,\n loadEffectiveConfig,\n pruneOrphanProjectConfigs,\n resolveDefaultCheckpoint,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n DEFAULT_RELAY_PORT,\n detectEngine,\n listBoxes,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { execSync, spawnSync } from 'node:child_process';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, resolveFromBranch } from '../lib/from-branch.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { maybePromptPortless, setupPortlessHost } from '../portless-prompt.js';\nimport { providerForCreate } from '../provider/registry.js';\nimport { resolveLimits } from '../limits.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport {\n maybeRunSetupWizard,\n passthroughFlags,\n serializeEnvFilesForEnv,\n WIZARD_AUTOLAUNCH_ENV,\n WIZARD_ENV_FILES_ENV,\n} from '../wizard.js';\nimport { claudeCommand } from './claude.js';\n\ninterface CreateOptions {\n workspace: string;\n name?: string;\n /** Override the sandbox backend. Resolved via the provider registry. */\n provider?: 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 /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block prompt. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** --bundle-depth <n>: cap commits in the cloud-seed git bundle. 0 = full history. */\n bundleDepth?: number;\n /** --from-branch <ref>: base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. */\n fromBranch?: string;\n /** -v / --verbose: also stream raw build / provision output to stderr. */\n verbose?: boolean;\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 if (opts.bundleDepth !== undefined) box.bundleDepth = opts.bundleDepth;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n return out;\n}\n\nfunction resolveUseSnapshot(\n opts: CreateOptions,\n configDefault: boolean | undefined,\n): boolean {\n // host-snapshot used to be on by default because the snapshot was the\n // overlay lower (the box read directly from it). With the new model the\n // snapshot is only the tar-pipe source for the no-git case, so default off:\n // the live host workspace is a fine source for a 1-2s tar pipe. Users who\n // want the clone-then-tar dance still get it via `--host-snapshot` or\n // `box.hostSnapshot: true`.\n if (opts.hostSnapshot === false) return false;\n if (opts.hostSnapshot === true) return true;\n return configDefault ?? false;\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\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\nasync function attachShell(record: BoxRecord): Promise<never> {\n const dockerArgv = ['exec', '-it', record.container, 'bash'];\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n // Non-TTY (scripted create --attach piping somewhere): preserve\n // bit-for-bit current behavior — the wrapper's own fallback would do\n // the same, but bypassing avoids the node-pty optional-dep load.\n const child = spawnSync('docker', dockerArgv, { stdio: 'inherit' });\n process.exit(child.status ?? 0);\n }\n const code = await runWrappedAttach({\n container: record.container,\n dockerArgv,\n relayBaseUrl: RELAY_HOST_URL,\n boxId: record.id,\n boxName: record.name,\n projectIndex: record.projectIndex,\n mode: 'shell',\n });\n process.exit(code);\n}\n\nexport const createCommand = new Command('create')\n .description('Create and start a new agent box (Docker container with /workspace seeded via in-container git worktree)')\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('--provider <name>', \"sandbox backend: 'docker' (default) or 'daytona' (cloud)\")\n .option('--host-snapshot', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\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 container writable-layer size (e.g. 10g); no-op on overlay2/macOS')\n .option(\n '--bundle-depth <n>',\n 'cap commits shipped in the cloud-seed git bundle (daytona, hetzner). 0 = full history. Unset = adaptive (200 commits, re-bundle at 100 if >20 MB). Ignored for docker.',\n (v) => {\n const n = Number.parseInt(v, 10);\n if (!Number.isInteger(n) || n < 0) throw new Error(`--bundle-depth: expected a non-negative integer, got \"${v}\"`);\n return n;\n },\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option('-y, --yes', 'skip prompts, accept defaults')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\n .option(\n '-v, --verbose',\n 'also stream the raw provider output (docker build / Daytona snapshot create) to stderr. The same content always lands in ~/.agentbox/logs/create.log — pass -v when you want to watch it live without tailing the log.',\n )\n .action(async (opts: CreateOptions) => {\n const cmdLog = openCommandLog('create');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Setting up a new box...');\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const checkpointRef = resolveCheckpointRef(\n opts,\n resolveDefaultCheckpoint(cfg.effective, providerName as 'docker' | 'daytona' | 'hetzner'),\n );\n\n // Cloud providers that use the Daytona public-URL path don't need\n // Portless; the URL is already reachable from anywhere. The wizard's\n // first-run `agentbox claude` hand-off is also Docker-only.\n const isDocker = providerName === 'docker';\n const isHetzner = providerName === 'hetzner';\n\n // Resolve Portless. Docker: classic prompt-once-then-persist flow.\n // Hetzner: default-on (per the \"safe defaults for cloud providers\"\n // policy) — silently set up the host proxy when undefined; respect\n // explicit --no-portless / config `portless.enabled: false`.\n let portlessEnabled: boolean | undefined;\n if (isDocker) {\n portlessEnabled = await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n } else if (isHetzner) {\n portlessEnabled = cfg.effective.portless.enabled ?? true;\n if (portlessEnabled) await setupPortlessHost();\n }\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask BEFORE the\n // wizard so the user sees the host-secrets prompt while still in the\n // pre-create phase. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n // Pass undefined when the flag wasn't set so the env-var fallback in\n // runCarryGate (?? carryYesEnv / ?? carrySkipEnv) actually fires.\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\n\n // First-run wizard: when no agentbox.yaml exists, optionally hand off to\n // `agentbox claude` so the agent can interactively generate one. The\n // wizard runs for every provider — it's the env-file picker + first-run\n // claude offer, both of which are useful for cloud boxes too.\n const wiz = await maybeRunSetupWizard({\n workspace: opts.workspace,\n yes: !!opts.yes,\n command: 'create',\n checkpointRef,\n provider: providerName,\n withEnv: cfg.effective.box.withEnv,\n });\n if (wiz.action === 'switch-to-claude' && isDocker) {\n // Docker: hand off to `agentbox claude` whose default action creates +\n // attaches in one go. For non-docker providers we fall through to the\n // normal create flow below and attach claude post-create, because\n // `agentbox claude`'s default action ignores --provider.\n process.env[WIZARD_AUTOLAUNCH_ENV] = '1';\n const serialized = serializeEnvFilesForEnv(wiz.envFilesToImport);\n if (serialized !== undefined) process.env[WIZARD_ENV_FILES_ENV] = serialized;\n try {\n await claudeCommand.parseAsync(passthroughFlags(opts), { from: 'user' });\n } finally {\n delete process.env[WIZARD_AUTOLAUNCH_ENV];\n delete process.env[WIZARD_ENV_FILES_ENV];\n }\n return;\n }\n // Cloud + switch-to-claude: provision the cloud box now, then attach\n // claude via the cloud SSH path once the box is ready.\n const attachClaudeAfter = wiz.action === 'switch-to-claude' && !isDocker;\n\n const useSnapshot = resolveUseSnapshot(opts, cfg.effective.box.hostSnapshot);\n\n // Verbose mode bypasses the spinner entirely: a cold cloud create\n // streams ~7 minutes of Dockerfile build output that's interesting to\n // watch and reassures the user that progress is happening. Without\n // --verbose, the spinner shows only the latest collapsed status line\n // (full output still lands in cmdLog) — calmer default.\n const s = makeProgressReporter(opts.verbose === true);\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 // --provider flag wins over box.provider config. The registry hands back\n // a DockerProvider for 'docker' and (once Phase 5 wires it) a cloud\n // provider for 'daytona'; everything below is provider-neutral.\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n let fromBranch: string | undefined;\n try {\n fromBranch = await resolveFromBranch(opts.fromBranch, { repo: opts.workspace });\n } catch (err) {\n if (err instanceof FromBranchError) {\n s.stop('aborting: invalid --from-branch');\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const result = await provider.create({\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n envFilesToImport: wiz.envFilesToImport,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n bundleDepth: cfg.effective.box.bundleDepth,\n fromBranch,\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n providerOptions: {\n useSnapshot,\n sharedCache: cfg.effective.box.dockerCacheShared,\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n },\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 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}) → ${result.record.checkpointImage ?? '(missing)'}`,\n );\n }\n\n const tryLines = isDocker\n ? [\n ` docker exec -it ${result.record.container} bash`,\n ` docker exec ${result.record.container} ls /workspace`,\n ]\n : [\n ` agentbox shell ${result.record.name}`,\n ` agentbox claude attach ${result.record.name}`,\n ` agentbox url ${result.record.name}`,\n ];\n log.message(\n [\n '',\n 'Try it:',\n ...tryLines,\n '',\n 'Destroy:',\n ` agentbox destroy ${result.record.name}`,\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 // Cloud: when the wizard offered \"switch to claude\" and we accepted,\n // attach claude over SSH now that the box is provisioned. Docker takes\n // the redispatch-to-`agentbox claude` path above (which already\n // attaches), so this branch only fires for cloud providers.\n if (attachClaudeAfter) {\n const { cloudAgentAttach } = await import('./_cloud-attach.js');\n await cloudAgentAttach({\n box: result.record,\n binary: 'claude',\n sessionName: 'claude',\n mode: 'claude',\n });\n return;\n }\n\n if (opts.attach) {\n await attachShell(result.record);\n }\n } catch (err) {\n s.stop('failed');\n const msg = err instanceof Error ? err.message : String(err);\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? 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 cmdLog.close();\n process.exit(1);\n } finally {\n cmdLog.close();\n }\n });\n","import { spawn } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { findProjectRoot, loadEffectiveConfig, resolveDefaultCheckpoint } from '@agentbox/config';\nimport {\n buildDashboardAttachArgv,\n buildShellSessionAttachArgv,\n claudeSessionInfo,\n createBox,\n DEFAULT_CODEX_SESSION,\n DEFAULT_OPENCODE_SESSION,\n DEFAULT_RELAY_PORT,\n destroyBox,\n ensureBoxBrowser,\n ensureCodexInstalled,\n ensureOpencodeInstalled,\n listBoxes,\n pauseBox,\n rebuildPluginNativeDeps,\n seedCodexHooks,\n SHARED_CLAUDE_VOLUME,\n shellSessionInfo,\n startBox,\n startClaudeSession,\n startCodexSession,\n startOpencodeSession,\n startShellSession,\n stopBox,\n syncClaudeCredentials,\n unpauseBox,\n waitForTmuxPaneContent,\n type ListedBox,\n} from '@agentbox/sandbox-docker';\nimport { readState } from '@agentbox/sandbox-core';\nimport type { BoxRecord } from '@agentbox/core';\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 { loadPtyBackend, type PtySpawn, type TerminalCtor } from '../pty/pty-backend.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { NEW_BOX_ID, NEW_BOX_LABEL, type SidebarBox } from '../dashboard/sidebar.js';\nimport { buildCloudAttachInnerCommand } from './_cloud-attach.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\n/**\n * Pick the box's primary agent and return its activity + session title for the\n * sidebar. A box runs one agent in practice; priority is claude > codex >\n * opencode. `unknown` activity is not positive evidence (the supervisor seeds\n * it for every box), so it never pins claude over a running codex/opencode.\n */\nfunction resolveAgent(b: ListedBox): { activity?: string; sessionTitle?: string } {\n const real = (s?: string): boolean => !!s && s !== 'unknown';\n if (real(b.claudeActivity) || b.claudeSessionTitle) {\n return { activity: b.claudeActivity, sessionTitle: b.claudeSessionTitle };\n }\n if (b.codexSession?.running || real(b.codexActivity)) {\n return { activity: b.codexActivity, sessionTitle: b.codexSessionTitle };\n }\n if (b.opencodeSession?.running) {\n // OpenCode reports no activity (no plugin) — title only.\n return { sessionTitle: b.opencodeSessionTitle };\n }\n // No positive evidence — fall back to claude's fields, matching today's\n // behavior for a plain box (`? unknown`, name shown).\n return { activity: b.claudeActivity, sessionTitle: b.claudeSessionTitle };\n}\n\nfunction toSidebar(b: ListedBox): SidebarBox {\n const agent = resolveAgent(b);\n return {\n id: b.id,\n name: b.name,\n state: b.state,\n activity: agent.activity,\n sessionTitle: agent.sessionTitle,\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 via the shared backend loader so a missing native\n // prebuild (or the CJS named export issue) degrades only the dashboard,\n // never the rest of the CLI. Same loader is used by wrapped-pty.\n const backend = await loadPtyBackend();\n let ptySpawn: PtySpawn;\n let termCtor: TerminalCtor;\n if (backend) {\n ptySpawn = backend.ptySpawn;\n termCtor = backend.termCtor;\n } else {\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 // Cloud boxes are surfaced read-only in the sidebar — selecting one\n // shows a \"live panels are docker-only\" placeholder via\n // resolveTarget. Don't refuse the ref here.\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 // Cloud boxes: probe the box's live tmux sessions over SSH and pick\n // the highest-priority agent (claude > codex > opencode) — mirrors\n // the docker branch below. One round-trip per selection; cheap with\n // the hetzner ControlMaster warm. Falls back to the menu if no\n // session is up (or the probe failed).\n if ((box.provider ?? 'docker') !== 'docker') {\n const record = await loadBoxRecord(box.id);\n const sessions = await probeCloudSessions(record);\n for (const which of ['claude', 'codex', 'opencode'] as const) {\n if (sessions.has(which)) {\n return buildCloudAttachTarget(record, which);\n }\n }\n return { kind: 'menu' };\n }\n // Docker: probe whichever agent session is live — priority\n // claude > codex > opencode. claude needs a fresh probe (not in\n // listBoxes()); codex / opencode were already live-probed by listBoxes().\n const claude = await claudeSessionInfo(box.container);\n if (claude.running) {\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, claude.sessionName),\n mode: 'claude',\n };\n }\n if (box.codexSession?.running) {\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, box.codexSession.sessionName),\n mode: 'codex',\n };\n }\n if (box.opencodeSession?.running) {\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, box.opencodeSession.sessionName),\n mode: 'opencode',\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 // The cloud attach path needs the full BoxRecord (sandboxId, ssh control\n // socket path, etc.) — ListedBox is the enriched view used for the\n // sidebar and lifecycle ops only.\n const loadBoxRecord = async (boxId: string): Promise<BoxRecord> => {\n const rec = (await readState()).boxes.find((b) => b.id === boxId);\n if (!rec) throw new Error('box not found');\n return rec;\n };\n\n // Cloud equivalent of buildDashboardAttachArgv. Reuses the same\n // base64+mapfile inner-command pattern as `agentbox claude/codex/\n // opencode` so positional args (wizard prompts) survive every quoting\n // layer. For `shell`, attach to/create the box's tracked `shell` tmux\n // session so the dashboard's shell pane is the same detachable session\n // `agentbox shell` sees from the CLI — matching the docker UX.\n const buildCloudAttachTarget = async (\n record: BoxRecord,\n which: 'claude' | 'codex' | 'opencode' | 'shell',\n ): Promise<RightTarget> => {\n const provider = await providerForBox(record);\n if (!provider.buildAttach) {\n throw new Error(`provider '${provider.name}' does not support interactive attach`);\n }\n const sessionName = which;\n const kind = which === 'shell' ? 'shell' : 'agent';\n // `bash -l` for shell — login shell so /etc/profile.d/agentbox.sh\n // exports AGENTBOX_BOX_* env. For agents, the base64+mapfile launcher\n // (extraArgs is always [] from the dashboard — no `--` passthrough).\n const innerCommand =\n which === 'shell' ? 'bash -l' : buildCloudAttachInnerCommand(which);\n const spec = await provider.buildAttach(record, kind, {\n sessionName,\n command: innerCommand,\n });\n return {\n kind: 'attach',\n command: spec.argv[0]!,\n args: spec.argv.slice(1),\n ...(spec.cleanup ? { cleanup: spec.cleanup } : {}),\n mode: which,\n };\n };\n\n const isCloudBox = (box: ListedBox): boolean =>\n (box.provider ?? 'docker') !== 'docker';\n\n // Cloud equivalent of claudeSessionInfo / box.codexSession.running for\n // the docker path: probe the box over SSH for live tmux sessions, so\n // resolveTarget can land directly on the running agent's pane instead\n // of the menu. One round-trip per box selection; cheap once the\n // hetzner ControlMaster is warm.\n const probeCloudSessions = async (record: BoxRecord): Promise<Set<string>> => {\n try {\n const provider = await providerForBox(record);\n const r = await provider.exec(record, [\n 'tmux',\n 'list-sessions',\n '-F',\n '#{session_name}',\n ]);\n if (r.exitCode !== 0) return new Set();\n return new Set(\n r.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n );\n } catch {\n return new Set();\n }\n };\n\n const startClaude = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'claude');\n }\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 // Mirror the in-box OAuth credentials with the host backup.\n const claudeVolume = box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME;\n await syncClaudeCredentials(\n { volume: claudeVolume },\n { image: box.image, isolate: claudeVolume !== SHARED_CLAUDE_VOLUME },\n );\n await startClaudeSession({ container: box.container, claudeArgs: [], boxName: box.name });\n const info = await claudeSessionInfo(box.container);\n // Attach only once the agent TUI has drawn — see waitForTmuxPaneContent.\n await waitForTmuxPaneContent(box.container, info.sessionName);\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, info.sessionName),\n mode: 'claude',\n };\n };\n\n const startCodex = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'codex');\n }\n // Install codex if the box image lacks it (checkpoint predating Codex).\n await ensureCodexInstalled(box.container);\n if (box.codexConfigVolume) await seedCodexHooks(box.codexConfigVolume, box.image);\n await startCodexSession({ container: box.container, codexArgs: [] });\n await waitForTmuxPaneContent(box.container, DEFAULT_CODEX_SESSION);\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, DEFAULT_CODEX_SESSION),\n mode: 'codex',\n };\n };\n\n const startOpencode = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'opencode');\n }\n await ensureOpencodeInstalled(box.container);\n await startOpencodeSession({ container: box.container, opencodeArgs: [] });\n await waitForTmuxPaneContent(box.container, DEFAULT_OPENCODE_SESSION);\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, DEFAULT_OPENCODE_SESSION),\n mode: 'opencode',\n };\n };\n\n const openShell = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'shell');\n }\n // Start-or-attach the box's tracked tmux `shell` session, so a shell\n // opened from the dashboard is the same detachable session the CLI\n // sees (`agentbox shell` / `agentbox shell ls`), not a throwaway exec.\n const info = await shellSessionInfo(box.container);\n if (!info.running) {\n await startShellSession({ container: box.container });\n }\n return {\n kind: 'attach',\n command: 'docker',\n args: buildShellSessionAttachArgv(box.container),\n mode: 'shell',\n };\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 <agent>` create block.\n const createNewBox = async (\n agent: 'claude' | 'codex' | 'opencode' | undefined,\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 // Dashboard create flow is docker-only — use the docker per-provider\n // default with the global fallback.\n const dockerDefault = resolveDefaultCheckpoint(cfg.effective, 'docker');\n const checkpointRef = dockerDefault.length > 0 ? dockerDefault : 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 // Pass the agent's config so createBox mounts + syncs its volume\n // (codex/opencode mount on detection too, but this makes it explicit\n // and applies the `--isolate-*-config` preference).\n ...(agent === 'codex'\n ? { codexConfig: { isolate: cfg.effective.box.isolateCodexConfig } }\n : {}),\n ...(agent === 'opencode'\n ? { opencodeConfig: { isolate: cfg.effective.box.isolateOpencodeConfig } }\n : {}),\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 const ctr = result.record.container;\n if (!agent) return { boxId: result.record.id };\n if (agent === 'codex') {\n await ensureCodexInstalled(ctr, { onProgress });\n await startCodexSession({ container: ctr, codexArgs: [] });\n // Attach only once the agent TUI has drawn — see waitForTmuxPaneContent.\n await waitForTmuxPaneContent(ctr, DEFAULT_CODEX_SESSION);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(ctr, DEFAULT_CODEX_SESSION),\n mode: 'codex',\n },\n };\n }\n if (agent === 'opencode') {\n await ensureOpencodeInstalled(ctr, { onProgress });\n await startOpencodeSession({ container: ctr, opencodeArgs: [] });\n await waitForTmuxPaneContent(ctr, DEFAULT_OPENCODE_SESSION);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(ctr, DEFAULT_OPENCODE_SESSION),\n mode: 'opencode',\n },\n };\n }\n await rebuildPluginNativeDeps(ctr, { volume: result.record.claudeConfigVolume });\n await startClaudeSession({ container: ctr, claudeArgs: [], boxName: result.record.name });\n const info = await claudeSessionInfo(ctr);\n await waitForTmuxPaneContent(ctr, info.sessionName);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(ctr, 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 url.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 url`. 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 openScreen = 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 // Show the app inside the VNC desktop on the same URL the host uses;\n // ensureBoxBrowser routes a Portless `.localhost` URL via the host proxy.\n const br = await ensureBoxBrowser(\n box.container,\n undefined,\n web.exposed ? web.url : 'about:blank',\n );\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 openUrl = 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 // Lifecycle actions dispatch on provider: docker boxes go through the\n // sandbox-docker helpers (rich container/volume teardown for destroy,\n // etc.); cloud boxes go through `Provider.{pause,stop,start,resume,\n // destroy}(record)`. Mirrors the docker-vs-cloud split in `commands/\n // destroy.ts:46-75`.\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 (isCloudBox(box)) {\n const record = await loadBoxRecord(boxId);\n const provider = await providerForBox(record);\n if (box.state === 'paused') await provider.resume(record);\n else await provider.start(record);\n return;\n }\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 const record = await loadBoxRecord(boxId);\n if ((record.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(record);\n await provider.pause(record);\n return;\n }\n await pauseBox(boxId);\n };\n\n const stopBoxAction = async (boxId: string): Promise<void> => {\n const record = await loadBoxRecord(boxId);\n if ((record.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(record);\n await provider.stop(record);\n return;\n }\n await stopBox(boxId);\n };\n\n const destroyBoxAction = async (boxId: string): Promise<void> => {\n const record = await loadBoxRecord(boxId);\n if ((record.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(record);\n await provider.destroy(record);\n return;\n }\n await destroyBox(boxId);\n };\n\n const compositor = new Compositor(\n {\n ptySpawn,\n termCtor,\n // Host-side loopback URL the per-box SSE subscriptions connect to.\n // The relay binds 0.0.0.0; loopback is the admin/* path's required\n // source. Same constant the wrapped-pty wrappers use.\n relayBaseUrl: `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`,\n listCandidates,\n resolveTarget,\n startClaude,\n startCodex,\n startOpencode,\n openShell,\n createNewBox,\n resumeBox,\n pauseBox: pauseBoxAction,\n stopBox: stopBoxAction,\n destroyBox: destroyBoxAction,\n openScreen,\n openCode,\n openUrl,\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 = 33;\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: 'screen' | 'code' | 'url' | '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 (screen/code/url/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 === 's') this.onEvent({ type: 'action', name: 'screen' });\n else if (c === 'u') this.onEvent({ type: 'action', name: 'url' });\n else if (c === 'c') this.onEvent({ type: 'action', name: 'code' });\n else if (c === 't') 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';\nimport type { IPtyLike, PtySpawn, TerminalCtor } from '../pty/pty-backend.js';\n\n// Re-export types so dashboard-internal imports don't have to know about the\n// shared module split. New code should import directly from ../pty/pty-backend.\nexport type { IPtyLike, PtySpawn, TerminalCtor };\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\n// modifyOtherKeys=1 — ask the outer terminal to disambiguate modifier+key combos\n// that have no legacy encoding (notably Shift+Enter / Ctrl+Enter, which would\n// otherwise collapse to plain `\\r`). Mode 1 (not 2) is deliberate: mode 2 also\n// rewrites Ctrl+letter as CSI sequences, which would break the dashboard's\n// `Ctrl-a` leader chord (see LEADER = 0x01 in input.ts). Mode 1 preserves the\n// legacy Ctrl+letter bytes and only escapes keys that would otherwise be\n// ambiguous, so Shift+Enter arrives as `\\x1b[27;2;13~` (or `\\x1b[13;2u`\n// depending on the terminal) and Ctrl+a still arrives as `\\x01`.\n//\n// Why the dashboard has to emit this at all: the in-box tmux already runs with\n// `extended-keys on` (see buildTmuxSessionArgs in\n// packages/sandbox-docker/src/claude.ts), which decodes either CSI form when\n// tmux receives it. In the wrapped-pty attach path tmux's own output reaches\n// the host terminal, which is enough to coax most terminals into emitting the\n// extended encodings. In the dashboard the inner PTY's output flows only into\n// @xterm/headless (this file, constructor below) and the compositor renders a\n// cell grid from the parsed state — so any mode-set request from tmux is\n// consumed by the headless parser and never reaches the user's real terminal.\n// The compositor emits it itself on start (and the reset on teardown).\nexport const EXT_KEYS_ENABLE_SEQ = '\\x1b[>4;1m';\nexport const EXT_KEYS_DISABLE_SEQ = '\\x1b[>4m';\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 either `docker exec … tmux\n * attach` (docker provider) or `ssh … tmux …` (cloud providers via\n * `Provider.buildAttach`) and feeding an @xterm/headless emulator we read\n * back as a screen grid. The optional `cleanup` callback fires from\n * `dispose()` — daytona's `buildAttach` returns a `revokeAttachToken`\n * cleanup so its 60-min ephemeral SSH token doesn't outlive the attach.\n */\nexport class PtySession {\n private readonly term: XtermTerminal;\n private readonly pty: IPtyLike;\n private readonly cleanup?: () => Promise<void>;\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 command: string,\n args: string[],\n cols: number,\n rows: number,\n onRenderable: () => void,\n onExit: () => void,\n cleanup?: () => Promise<void>,\n ) {\n this.term = new TerminalClass({\n cols,\n rows,\n allowProposedApi: true,\n scrollback: 0,\n convertEol: false,\n });\n this.cleanup = cleanup;\n this.pty = spawn(command, args, {\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 if (this.cleanup) void this.cleanup().catch(() => {});\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 EXT_KEYS_ENABLE_SEQ,\n EXT_KEYS_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 type SidebarBox,\n} from './sidebar.js';\nimport { renderFooter } from '../wrapped-pty/footer.js';\nimport { postAnswer, subscribePrompts, type PromptStream } from '../wrapped-pty/prompt-client.js';\nimport type { BoxNoticeEvent, PromptAskEvent } from '@agentbox/relay';\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 pure black (truecolor, so terminals can't shade it per\n// context); the selected row reads via bold bright-white text + the `▸` marker.\nconst SB_BG = '\\x1b[48;2;0;0;0m';\nconst SB_BODY = SB_BG + '\\x1b[38;5;250m';\nconst SB_HEADER = SB_BG + '\\x1b[38;5;39m\\x1b[1m';\nconst SB_SELECTED = SB_BG + '\\x1b[38;5;255m\\x1b[1m';\n// Bright yellow + bold for non-selected rows that have a pending relay\n// prompt — same palette index as the [!] tag in the wrapped-pty footer\n// (renderFooter URGENT). Reads as \"this box needs your attention\".\nconst SB_PROMPT = SB_BG + '\\x1b[38;5;220m\\x1b[1m';\n// Bright cyan + bold for the agent's own \"awaiting input\" state\n// (activity === 'waiting'). Distinct hue from yellow so the user can\n// triage at a glance: yellow ▲ = relay needs a decision NOW; cyan ◐ =\n// the agent is idle waiting for the user's direction (less urgent).\nconst SB_AWAITING = SB_BG + '\\x1b[38;5;51m\\x1b[1m';\nconst SGR_RESET = '\\x1b[0m';\n\nexport type RightTarget =\n | {\n kind: 'attach';\n /** Program to spawn — `'docker'` for docker boxes, `'ssh'` for cloud. */\n command: string;\n /** Args passed to `command` (everything after `argv[0]`). */\n args: string[];\n /** Fires when the PtySession is disposed. Used by daytona to revoke the\n * ephemeral SSH token its `buildAttach` mints. */\n cleanup?: () => Promise<void>;\n mode?: 'claude' | 'shell' | 'codex' | 'opencode';\n }\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 /** Relay base URL the per-box SSE subscriptions hit. Typically\n * `http://127.0.0.1:8787` (built from DEFAULT_RELAY_PORT). When absent\n * (legacy callers) the compositor skips prompt subscriptions entirely\n * — the dashboard still works, just without relay-prompt overlay. */\n relayBaseUrl?: string;\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 Claude / Codex / OpenCode tmux session in the box, resolve to attach. */\n startClaude: (boxId: string) => Promise<RightTarget>;\n startCodex: (boxId: string) => Promise<RightTarget>;\n startOpencode: (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). When `agent` is set, also start that\n * agent's session + return an attach target; `undefined` = create only.\n * `onProgress` streams createBox log lines. */\n createNewBox: (\n agent: 'claude' | 'codex' | 'opencode' | undefined,\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 openScreen: (boxId: string) => Promise<string>;\n openCode: (boxId: string) => Promise<string>;\n openUrl: (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/** Spinner advance cadence while a box has an active relay notice. */\nconst NOTICE_SPINNER_MS = 120;\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 /**\n * Per-box relay-prompt state. Populated by SSE `prompt-ask` events,\n * cleared by `prompt-resolved` events or by the local user answering.\n * The sidebar reads it to mark rows; drawChrome's status-line picker\n * reads it to swap to [!] mode when the SELECTED box is in this map.\n * Subscriptions are tracked separately in {@link promptStreams} so\n * we can dispose them when boxes disappear from the list.\n */\n private readonly activePrompts = new Map<string, PromptAskEvent>();\n /**\n * Per-box active relay notice (currently: a checkpoint freezing the box).\n * Drives the `◆ checkpoint` sidebar cell and the animated status-bar\n * warning. Shares the SSE subscriptions in {@link promptStreams}.\n */\n private readonly activeNotices = new Map<string, BoxNoticeEvent>();\n /** Monotonic spinner counter for the notice status bar. */\n private noticeFrame = 0;\n /** Drives the spinner animation while {@link activeNotices} is non-empty. */\n private noticeTimer: ReturnType<typeof setInterval> | null = null;\n private readonly promptStreams = new Map<string, PromptStream>();\n private activeMode: 'claude' | 'shell' | 'codex' | 'opencode' = '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 // Relay prompt for the selected box: intercept y/N/Esc/Ctrl-c\n // single-byte keystrokes. Multi-byte chunks starting with ESC\n // (CSI: mouse, arrows, Ctrl+Option+↑↓, focus events) fall through\n // — they're not user \"answer\" intent. Same byte-classification as\n // the wrapped-pty input-router so behavior matches.\n if (e.type === 'forward' && this.activePrompts.has(this.selectedId)) {\n if (this.handlePromptKey(e.bytes)) return;\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 + EXT_KEYS_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 this.syncPromptSubscriptions();\n }\n\n /**\n * Diff the current box list against {@link promptStreams}: subscribe to\n * any newcomer (skipping the synthetic + New box entry and pre-relay\n * boxes), dispose any departed subscription. Idempotent — safe to call\n * after every poll. Disposed boxes also clear their {@link activePrompts}\n * entry so the sidebar marker doesn't linger.\n */\n private syncPromptSubscriptions(): void {\n if (this.tornDown) return;\n const url = this.deps.relayBaseUrl;\n if (!url) return; // legacy callers: skip the feature entirely.\n const wanted = new Set<string>();\n for (const b of this.boxes) {\n if (b.id === NEW_BOX_ID) continue;\n wanted.add(b.id);\n }\n // Drop subscriptions for boxes no longer in the list.\n for (const [boxId, stream] of this.promptStreams) {\n if (!wanted.has(boxId)) {\n stream.close();\n this.promptStreams.delete(boxId);\n let changed = this.activePrompts.delete(boxId);\n if (this.activeNotices.delete(boxId)) changed = true;\n if (this.activeNotices.size === 0) this.stopNoticeSpinner();\n if (changed) this.drawChrome();\n }\n }\n // Open subscriptions for boxes we don't already track.\n for (const boxId of wanted) {\n if (this.promptStreams.has(boxId)) continue;\n const stream = subscribePrompts({\n relayBaseUrl: url,\n boxId,\n onPrompt: (ev) => {\n if (this.tornDown) return;\n this.activePrompts.set(boxId, ev);\n this.drawChrome();\n },\n onResolved: (id) => {\n if (this.tornDown) return;\n const current = this.activePrompts.get(boxId);\n if (current && current.id === id) {\n this.activePrompts.delete(boxId);\n this.drawChrome();\n }\n },\n onNotice: (ev) => {\n if (this.tornDown) return;\n this.activeNotices.set(boxId, ev);\n this.startNoticeSpinner();\n this.drawChrome();\n },\n onNoticeCleared: (id) => {\n if (this.tornDown) return;\n const current = this.activeNotices.get(boxId);\n if (current && current.id === id) {\n this.activeNotices.delete(boxId);\n if (this.activeNotices.size === 0) this.stopNoticeSpinner();\n this.drawChrome();\n }\n },\n onError: () => {\n /* subscribePrompts already reconnects with backoff; nothing to do */\n },\n });\n this.promptStreams.set(boxId, stream);\n }\n }\n\n private startNoticeSpinner(): void {\n if (this.noticeTimer) return;\n this.noticeTimer = setInterval(() => {\n this.noticeFrame++;\n this.drawChrome();\n }, NOTICE_SPINNER_MS);\n if (typeof this.noticeTimer.unref === 'function') this.noticeTimer.unref();\n }\n\n private stopNoticeSpinner(): void {\n if (this.noticeTimer) {\n clearInterval(this.noticeTimer);\n this.noticeTimer = null;\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.activity, 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.activity, 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.command,\n target.args,\n Math.max(1, this.layout.right.w),\n Math.max(1, this.layout.right.h),\n () => this.scheduleRender(),\n () => this.onSessionExit(),\n target.cleanup,\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 === 0x78) {\n void this.chooseAction('codex');\n return;\n }\n if (b === 0x6f) {\n void this.chooseAction('opencode');\n return;\n }\n if (b === 0x73) {\n void this.chooseAction('shell');\n return;\n }\n }\n }\n\n private async chooseAction(which: 'claude' | 'codex' | 'opencode' | '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 const label =\n which === 'shell'\n ? 'shell'\n : which === 'opencode'\n ? 'OpenCode'\n : which === 'codex'\n ? 'Codex'\n : 'Claude';\n this.placeholder = ['', which === 'shell' ? ' Opening shell…' : ` Starting ${label}…`];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n const target =\n which === 'shell'\n ? await this.deps.openShell(id)\n : which === 'codex'\n ? await this.deps.startCodex(id)\n : which === 'opencode'\n ? await this.deps.startOpencode(id)\n : await this.deps.startClaude(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 === 'shell' ? 'open a shell' : `start ${label}`} in ${name}:`,\n ` ${msg}`,\n '',\n which === 'shell'\n ? ` Try from a shell: agentbox shell ${name}`\n : ` Try from a shell: agentbox ${which} start ${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 /**\n * Try to consume `bytes` as an answer to the selected box's active relay\n * prompt. Returns true when the bytes were a recognized answer key (the\n * caller stops further dispatch); false when the bytes should flow on to\n * the pty / other handlers.\n *\n * Single-byte chunks only: y/Y/Enter accept, n/N deny, Esc/Ctrl-c deny\n * with `cancelled: true`. Multi-byte chunks starting with ESC (mouse,\n * arrows, focus events, etc.) are passed through — exact same rule the\n * wrapped-pty input-router uses.\n */\n private handlePromptKey(bytes: Buffer): boolean {\n if (bytes.length > 1 && bytes[0] === 0x1b) return false;\n if (bytes.length === 0) return false;\n const b = bytes[0];\n let answer: 'y' | 'n' | null = null;\n let cancelled = false;\n if (b === 0x79 || b === 0x59) answer = 'y'; // 'y'/'Y'\n else if (b === 0x6e || b === 0x4e) answer = 'n'; // 'n'/'N'\n else if (b === 0x1b || b === 0x03) {\n answer = 'n';\n cancelled = true;\n } else if (b === 0x0d || b === 0x0a) {\n // Enter accepts the default; defaultAnswer falls back to 'n' so this\n // matches the [y/N] hint.\n const ev = this.activePrompts.get(this.selectedId);\n answer = ev?.defaultAnswer ?? 'n';\n }\n if (answer === null) return false;\n const ev = this.activePrompts.get(this.selectedId);\n if (!ev) return false;\n // Optimistic local clear so the footer/sidebar update immediately;\n // the relay's prompt-resolved SSE event will arrive afterwards and\n // hit a no-op (already cleared).\n this.activePrompts.delete(this.selectedId);\n this.drawChrome();\n const url = this.deps.relayBaseUrl;\n if (url) {\n void postAnswer({\n relayBaseUrl: url,\n body: { id: ev.id, answer, ...(cancelled ? { cancelled: true } : {}) },\n });\n }\n return true;\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('claude');\n return;\n }\n if (b === 0x78) {\n void this.chooseCreate('codex');\n return;\n }\n if (b === 0x6f) {\n void this.chooseCreate('opencode');\n return;\n }\n if (b === 0x6e) {\n void this.chooseCreate(undefined);\n return;\n }\n }\n }\n\n private async chooseCreate(agent: 'claude' | 'codex' | 'opencode' | undefined): 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(agent, (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: 'screen' | 'code' | 'url'): 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 === 'screen'\n ? await this.deps.openScreen(id)\n : name === 'code'\n ? await this.deps.openCode(id)\n : await this.deps.openUrl(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 // Inject the per-box pendingPrompt / checkpointing flags at render time\n // so sidebarLines' activityCell shows `▲ prompt` / `◆ checkpoint`. We\n // don't mutate this.boxes directly — keeps the polling diff in poll()\n // simple (it compares state/activity/sessionTitle only).\n const decorate = this.activePrompts.size > 0 || this.activeNotices.size > 0;\n const boxesWithPrompt: SidebarBox[] = decorate\n ? this.boxes.map((b) => {\n const pendingPrompt = this.activePrompts.has(b.id);\n const checkpointing = this.activeNotices.has(b.id);\n return pendingPrompt || checkpointing\n ? { ...b, pendingPrompt, checkpointing }\n : b;\n })\n : this.boxes;\n const { lines, rowOwner, headerRows } = sidebarLines(\n boxesWithPrompt,\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 owner = rowOwner[i] ?? null;\n const isSelected = owner === this.selectedId;\n const hasPrompt = owner !== null && this.activePrompts.has(owner);\n // Lookup the box's activity for `awaiting` styling. We already have\n // `boxesWithPrompt` from the inject pass above (same list passed to\n // sidebarLines), so just match on owner.\n const ownerBox = owner !== null ? boxesWithPrompt.find((b) => b.id === owner) : undefined;\n const isAwaiting = ownerBox?.activity === 'waiting';\n // Priority: header > selected > pending prompt > awaiting input > body.\n // Selected wins over both attention states because the status-line\n // already shows what the selected box needs; double-yelling would\n // just clutter. Pending prompt outranks awaiting because it's a\n // hard block (the agent's RPC is paused) vs. a soft \"I'm idle\".\n const style = headerRows[i]\n ? SB_HEADER\n : isSelected\n ? SB_SELECTED\n : hasPrompt\n ? SB_PROMPT\n : isAwaiting\n ? SB_AWAITING\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 const activePromptForSelected = this.activePrompts.get(this.selectedId);\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 if (activePromptForSelected) {\n // Selected box has a pending relay prompt — reuse the wrapped-pty's\n // `[!] <message> <detail> [y/N]` renderer so the two surfaces look\n // identical. y/Y/Enter/n/N/Esc/Ctrl-c are intercepted in onEvent's\n // forward branch above.\n status = renderFooter(\n { kind: 'prompt', prompt: activePromptForSelected },\n this.layout.cols,\n );\n } else if (this.activeNotices.has(this.selectedId)) {\n // Selected box is busy with a relay notice (e.g. checkpoint) — reuse\n // the wrapped-pty's animated notice renderer. Informational, so it\n // sits below a pending prompt in the priority chain.\n const notice = this.activeNotices.get(this.selectedId)!;\n status = renderFooter(\n { kind: 'notice', message: notice.message, frame: this.noticeFrame },\n this.layout.cols,\n );\n } else {\n const stateLabel =\n this.selectedId === NEW_BOX_ID\n ? 'create'\n : this.menu\n ? 'menu'\n : // Attached to a non-claude session → label it (shell/codex/\n // opencode); claude → undefined so claude activity shows.\n this.session && this.activeMode !== 'claude'\n ? this.activeMode\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 if (this.noticeTimer) clearInterval(this.noticeTimer);\n for (const stream of this.promptStreams.values()) stream.close();\n this.promptStreams.clear();\n this.activePrompts.clear();\n this.activeNotices.clear();\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(EXT_KEYS_DISABLE_SEQ + MOUSE_DISABLE_SEQ + '\\x1b[?25h\\x1b[0m\\x1b[?1049l');\n this.resolveDone?.();\n }\n}\n","import { log, spinner } from '@clack/prompts';\nimport {\n agentSpecsForCloud,\n ensureAgentVolumesForCloud,\n seedAgentVolumesIfFresh,\n type CloudAgentKind,\n} from '@agentbox/sandbox-cloud';\nimport { Command } from 'commander';\nimport { daytonaBackend } from './backend.js';\nimport {\n ensureDaytonaCredentials,\n maskKey,\n readDaytonaCredStatus,\n secretsPath,\n} from './credentials.js';\n\ninterface LoginOpts {\n status?: boolean;\n}\n\nfunction reportError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n log.error(message);\n process.exitCode = 1;\n}\n\nconst loginSub = new Command('login')\n .description('Set up (or rotate) Daytona credentials for cloud boxes')\n .option('--status', 'show what is currently configured (masked) and exit')\n .action(async (opts: LoginOpts) => {\n try {\n if (opts.status) {\n printStatus();\n return;\n }\n if (!process.stdin.isTTY) {\n process.stderr.write(\n 'daytona login needs an interactive terminal — set DAYTONA_API_KEY in the environment for non-interactive use.\\n',\n );\n process.exitCode = 1;\n return;\n }\n await ensureDaytonaCredentials({ force: true });\n } catch (err) {\n reportError(err);\n }\n });\n\nfunction printStatus(): void {\n const s = readDaytonaCredStatus();\n if (s.source === 'none') {\n process.stdout.write(\n 'daytona: not configured\\n' +\n ' run `agentbox daytona login` to set up credentials\\n',\n );\n return;\n }\n const lines = ['daytona: configured', ` source: ${s.source}`];\n if (s.source === 'secrets.env') lines.push(` file: ${secretsPath()}`);\n if (s.apiKey) lines.push(` apiKey: ${maskKey(s.apiKey)}`);\n if (s.jwtToken) lines.push(` jwt: ${maskKey(s.jwtToken)}`);\n if (s.organizationId) lines.push(` orgId: ${s.organizationId}`);\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\ninterface ResyncOpts {\n agent?: string;\n}\n\nconst KNOWN_AGENTS: readonly CloudAgentKind[] = ['claude', 'codex', 'opencode'];\n\n/**\n * Parse `--agent` into the list of agents to refresh. Defaults to all three;\n * accepts a single name or 'all'. Throws on unknown agent name so a typo\n * surfaces immediately instead of silently resyncing nothing.\n */\nfunction resolveAgentSelection(raw: string | undefined): CloudAgentKind[] {\n if (!raw || raw === 'all') return [...KNOWN_AGENTS];\n if (!(KNOWN_AGENTS as readonly string[]).includes(raw)) {\n throw new Error(\n `unknown agent '${raw}'. Expected one of: ${KNOWN_AGENTS.join(', ')}, all.`,\n );\n }\n return [raw as CloudAgentKind];\n}\n\nconst resyncSub = new Command('resync')\n .description(\n 'Re-upload host agent credentials (~/.claude, ~/.codex, opencode) into the shared Daytona volumes.',\n )\n .option(\n '-a, --agent <name>',\n 'which agent to refresh: claude | codex | opencode | all',\n 'all',\n )\n .action(async (opts: ResyncOpts) => {\n try {\n const agents = resolveAgentSelection(opts.agent);\n const specs = agentSpecsForCloud().filter((s) => agents.includes(s.kind));\n\n // Spin up a single throwaway sandbox with all selected volumes mounted.\n // One sandbox amortizes the snapshot/start cost across multiple agents;\n // seedAgentVolumesIfFresh with force:true overwrites each one in turn.\n // Image: the same default `agentbox/box:dev` used for normal cloud\n // boxes. Daytona's snapshot cache should hit if the user has provisioned\n // a real box recently. Resources are minimal — we only need tar + chown.\n const sb = spinner();\n sb.start(`provisioning throwaway sandbox to refresh: ${agents.join(', ')}`);\n\n const ensured = await ensureAgentVolumesForCloud(daytonaBackend, {\n onLog: (line) => log.info(line),\n });\n if (ensured.agents.length === 0) {\n sb.stop('no agent volumes available — the daytona backend has no volume primitive');\n return;\n }\n // Restrict to only what the user asked for.\n const mounts = ensured.mounts.filter((m) =>\n specs.some((s) => s.credentialsMountPath === m.mountPath),\n );\n\n const handle = await daytonaBackend.provision({\n name: `agentbox-resync-${Date.now().toString(36)}`,\n image: 'agentbox/box:dev',\n resources: { cpu: 1, memory: 1, disk: 4 },\n env: {},\n volumes: mounts,\n onLog: (line) => sb.message(line.slice(0, 80)),\n });\n sb.stop(`throwaway sandbox ${handle.sandboxId} provisioned`);\n\n try {\n const sb2 = spinner();\n sb2.start('re-seeding host credentials into volumes (force)');\n await seedAgentVolumesIfFresh(daytonaBackend, handle, {\n agents,\n force: true,\n onLog: (line) => sb2.message(line.slice(0, 80)),\n });\n sb2.stop('credentials refreshed');\n } finally {\n const sb3 = spinner();\n sb3.start('destroying throwaway sandbox');\n try {\n await daytonaBackend.destroy(handle);\n } catch (err) {\n sb3.stop(\n `destroy failed (sandbox may linger): ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n sb3.stop('throwaway sandbox destroyed');\n }\n\n log.success(\n `Daytona agent volumes refreshed: ${agents.join(', ')}. ` +\n `Next \\`agentbox create --provider daytona\\` will use the updated credentials.`,\n );\n } catch (err) {\n reportError(err);\n }\n });\n\n// NB: the old `agentbox daytona publish-snapshot` subcommand has been removed.\n// Daytona deprecated the `_experimental_createSnapshot` API it relied on\n// (`POST /api/sandbox/<id>/snapshot` now 404s). The replacement is\n// `agentbox prepare --provider daytona`, which uses the documented\n// `daytona.snapshot.create({ name, image })` API with a layered `Image`\n// (Dockerfile.box + addLocalFile + runCommands) — no sandbox involved.\n\nexport const daytonaCommand = new Command('daytona')\n .description(\n 'Daytona cloud provider — credentials, plus sugar for `--provider daytona` (e.g. `agentbox daytona create|claude|codex|opencode`)',\n )\n .addCommand(loginSub, { isDefault: true })\n .addCommand(resyncSub);\n","import { Command } from 'commander';\n\n// Help-discoverable entry point for the `agentbox docker <subcmd>` sugar.\n// The actual rewrite happens before commander parses (see\n// provider/argv-prefix.ts), so this command has no action handler — it only\n// shows up when the user types `agentbox docker` (or `agentbox docker --help`)\n// without one of the sugared subcommands.\nexport const dockerCommand = new Command('docker')\n .description(\n 'Local Docker provider — sugar for `--provider docker` (e.g. `agentbox docker create|claude|codex|opencode`)',\n )\n .action(() => {\n dockerCommand.help();\n });\n","/**\n * `agentbox hetzner` CLI surface — registered as a top-level subcommand by\n * `apps/cli/src/index.ts` (same pattern as `daytonaCommand`).\n *\n * Subcommands:\n * - `login` — interactive `HCLOUD_TOKEN` setup + persist.\n * - `login --status` — show the currently-configured token (masked).\n * - `firewall sync <box>` — re-detect egress IP, update the box's\n * firewall rules (no VPS restart).\n * - `firewall show <box>` — diagnostic: print the box's firewall.\n *\n * The firewall subcommands rely on `BoxRecord.cloud.hetzner.firewallId` /\n * `BoxRecord.cloud.hetzner.firewallSource` being populated by the create\n * flow — that wiring lands in Phase 4. Until then these subcommands throw\n * a clear error pointing at the backlog. The `login` subcommand is fully\n * functional now.\n */\n\nimport { log } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport { readState, resolveBoxRef } from '@agentbox/sandbox-core';\nimport { Command } from 'commander';\nimport { makeHetznerClient } from './client.js';\nimport {\n ensureHetznerCredentials,\n maskKey,\n readHetznerCredStatus,\n secretsPath,\n} from './credentials.js';\nimport { detectEgressIp } from './egress-ip.js';\nimport { normalizeSourceCidr, syncFirewallSource } from './firewall.js';\n\ninterface LoginOpts {\n status?: boolean;\n}\n\nfunction reportError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n log.error(message);\n process.exitCode = 1;\n}\n\nconst loginSub = new Command('login')\n .description('Set up (or rotate) Hetzner Cloud credentials for VPS boxes')\n .option('--status', 'show what is currently configured (masked) and exit')\n .action(async (opts: LoginOpts) => {\n try {\n if (opts.status) {\n printStatus();\n return;\n }\n if (!process.stdin.isTTY) {\n process.stderr.write(\n 'hetzner login needs an interactive terminal — set HCLOUD_TOKEN in the environment for non-interactive use.\\n',\n );\n process.exitCode = 1;\n return;\n }\n await ensureHetznerCredentials({ force: true });\n } catch (err) {\n reportError(err);\n }\n });\n\nfunction printStatus(): void {\n const s = readHetznerCredStatus();\n if (s.source === 'none') {\n process.stdout.write(\n 'hetzner: not configured\\n' +\n ' run `agentbox hetzner login` to set up credentials\\n',\n );\n return;\n }\n const lines = ['hetzner: configured', ` source: ${s.source}`];\n if (s.source === 'secrets.env') lines.push(` file: ${secretsPath()}`);\n if (s.token) lines.push(` token: ${maskKey(s.token)}`);\n if (s.endpoint) lines.push(` api: ${s.endpoint}`);\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\ninterface FirewallSyncOpts {\n source?: string;\n}\n\nconst firewallSyncSub = new Command('sync')\n .description('Re-detect the host egress IP and update the box firewall (no reboot)')\n .argument('<box>', 'box name or id')\n .option(\n '--source <cidr>',\n 'override the auto-detected egress IP (e.g. 1.2.3.4/32, or 0.0.0.0/0 for open opt-in)',\n )\n .action(async (boxRef: string, opts: FirewallSyncOpts) => {\n try {\n const { box, server } = await resolveHetznerBox(boxRef);\n const firewallId = parseFirewallIdFromServer(server.labels);\n if (firewallId === undefined) {\n throw new Error(\n `box '${boxRef}' has no recorded firewall id (label agentbox.firewall is missing on the Hetzner server). ` +\n `This is unusual — the box may have been provisioned outside agentbox.`,\n );\n }\n const source = opts.source\n ? normalizeSourceCidr(opts.source)\n : `${await detectEgressIp({ onLog: (l) => process.stdout.write(`hetzner: ${l}\\n`) })}/32`;\n const client = makeHetznerClient();\n process.stdout.write(`hetzner: updating firewall ${String(firewallId)} for box '${box.name}' → source ${source}\\n`);\n await syncFirewallSource(client, firewallId, source);\n process.stdout.write(`hetzner: firewall ${String(firewallId)} now allows SSH from ${source} only\\n`);\n } catch (err) {\n reportError(err);\n }\n });\n\nconst firewallShowSub = new Command('show')\n .description('Print the Hetzner firewall rules currently attached to a box')\n .argument('<box>', 'box name or id')\n .action(async (boxRef: string) => {\n try {\n const { box, server } = await resolveHetznerBox(boxRef);\n const firewallId = parseFirewallIdFromServer(server.labels);\n if (firewallId === undefined) {\n throw new Error(`box '${boxRef}' has no recorded firewall id (label agentbox.firewall missing)`);\n }\n const client = makeHetznerClient();\n const firewall = await client.getFirewall(firewallId);\n if (!firewall) {\n process.stdout.write(`hetzner: firewall ${String(firewallId)} for box '${box.name}' is gone on Hetzner\\n`);\n return;\n }\n const lines: string[] = [\n `box: ${box.name} (sandbox ${box.cloud?.sandboxId ?? '—'})`,\n `vpsIp: ${server.public_net.ipv4?.ip ?? '—'}`,\n `firewall: ${firewall.name} (id ${String(firewall.id)})`,\n 'rules:',\n ];\n for (const rule of firewall.rules) {\n const sources = rule.source_ips?.join(', ') ?? '—';\n const dests = rule.destination_ips?.join(', ') ?? '';\n lines.push(\n ` ${rule.direction} ${rule.protocol}${rule.port ? `:${rule.port}` : ''} from=${sources}${dests ? ` to=${dests}` : ''}`,\n );\n }\n // Show the host's current egress IP for comparison — common diagnostic\n // when the user's laptop moved networks and ssh started timing out.\n try {\n const currentEgress = await detectEgressIp({});\n lines.push(`host egress IP (now): ${currentEgress}/32`);\n const wantCidr = `${currentEgress}/32`;\n const allowed = firewall.rules.find(\n (r) => r.direction === 'in' && r.port === '22' && r.source_ips?.includes(wantCidr),\n );\n if (!allowed) {\n lines.push(\n ` WARN: current egress IP does not match the firewall — run \\`agentbox hetzner firewall sync ${box.name}\\` to update`,\n );\n }\n } catch (egressErr) {\n lines.push(`host egress IP: <detection failed: ${egressErr instanceof Error ? egressErr.message : String(egressErr)}>`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n } catch (err) {\n reportError(err);\n }\n });\n\n/**\n * Resolve a CLI box ref into the BoxRecord + the live Hetzner server.\n * Errors out cleanly if the box isn't a hetzner box or if it's already\n * destroyed on the Hetzner side.\n */\nasync function resolveHetznerBox(boxRef: string): Promise<{\n box: import('@agentbox/core').BoxRecord;\n server: import('./client.js').HetznerServer;\n}> {\n const cwd = process.cwd();\n const project = await findProjectRoot(cwd);\n const state = await readState();\n const res = resolveBoxRef(boxRef, state, project.root);\n if (res.kind !== 'ok') {\n throw new Error(`no box matched '${boxRef}'`);\n }\n const box = res.box;\n if (box.provider !== 'hetzner') {\n throw new Error(`box '${box.name}' has provider '${box.provider ?? 'docker'}', not 'hetzner'`);\n }\n const sandboxId = box.cloud?.sandboxId;\n if (!sandboxId) {\n throw new Error(`box '${box.name}' has no recorded sandboxId`);\n }\n const id = Number.parseInt(sandboxId, 10);\n if (!Number.isFinite(id)) {\n throw new Error(`box '${box.name}' has non-numeric hetzner sandboxId '${sandboxId}'`);\n }\n const server = await makeHetznerClient().getServer(id);\n if (!server) {\n throw new Error(`hetzner server ${String(id)} for box '${box.name}' is gone (already destroyed?)`);\n }\n return { box, server };\n}\n\nfunction parseFirewallIdFromServer(labels: Record<string, string>): number | undefined {\n const raw = labels['agentbox.firewall'];\n if (!raw) return undefined;\n const id = Number.parseInt(raw, 10);\n return Number.isFinite(id) ? id : undefined;\n}\n\nconst firewallSub = new Command('firewall')\n .description('Manage the Hetzner Cloud Firewall attached to each box')\n .addCommand(firewallSyncSub)\n .addCommand(firewallShowSub);\n\nexport const hetznerCommand = new Command('hetzner')\n .description(\n 'Hetzner Cloud VPS provider — credentials, firewall, plus sugar for `--provider hetzner` (e.g. `agentbox hetzner create|claude|codex|opencode`)',\n )\n .addCommand(loginSub, { isDefault: true })\n .addCommand(firewallSub);\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 { providerForBox } from '../provider/registry.js';\nimport { agentboxAliasFor, removeAgentboxSshAlias } from '../ssh-config.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 container writable layer (where /workspace lived)\")\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(\n 'This will wipe the container writable layer — /workspace contents and agent work-in-progress are lost.',\n );\n log.info(`id: ${box.id}`);\n log.info(`container: ${box.container}`);\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 // Docker boxes still use the rich `destroyBox` path so the user sees\n // container/volume/snapshot accounting. Cloud boxes go through the\n // provider's `destroy`, which deletes the remote sandbox and removes\n // the local record but has no Docker-shaped output to enumerate.\n const providerName = box.provider ?? 'docker';\n if (providerName === 'docker') {\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 } else {\n const provider = await providerForBox(box);\n await provider.destroy(box);\n // Best-effort: remove the `~/.ssh/config` block `agentbox code` may\n // have written for this cloud box. A missing block isn't an error\n // and a file failure shouldn't block destroy.\n try {\n await removeAgentboxSshAlias(agentboxAliasFor(box.name));\n } catch {\n /* best-effort */\n }\n process.stdout.write(\n `destroyed ${box.name} (${providerName} sandbox ${box.cloud?.sandboxId ?? '<unknown>'})\\n`,\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\nimport { downloadClaudeCommand } from './download-claude.js';\nimport { downloadCodexCommand } from './download-codex.js';\nimport { downloadOpencodeCommand } from './download-opencode.js';\nimport { downloadConfigCommand } from './download-config.js';\nimport { downloadEnvCommand } from './download-env.js';\n\ninterface DownloadOpts {\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 downloadCommand = new Command('download')\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(\"Download 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 download 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: DownloadOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n if (isCloud) {\n // Cloud download (workspace): we don't have rsync over docker exec, so\n // gitignore-aware change-detection isn't wired. Fall back to a bulk\n // tar of `/workspace` via provider.downloadPath — overwrites the host\n // workspace dir. The user already gets git-aware sync-back via\n // `agentbox-ctl git push` inside the box for tracked files; this is\n // for grabbing untracked or env artifacts.\n if (opts.dryRun) {\n throw new Error('cloud download does not yet support --dry-run; omit to bulk-pull /workspace.');\n }\n if (!opts.respectGitignore || opts.includeNodeModules || opts.withEnv || opts.pattern.length > 0) {\n log.warn(\n 'cloud download ignores gitignore/--with-env/--pattern filters in v1 — pulling the whole /workspace tree (Phase 6 polish).',\n );\n }\n if (!opts.yes) {\n const ok = await confirm({\n message: `Overwrite ${box.workspacePath} with the cloud box's /workspace contents?`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n const provider = await providerForBox(box);\n if (!provider.downloadDirContents) {\n throw new Error(`provider '${provider.name}' does not support bulk workspace download`);\n }\n // Pull the *contents* of /workspace into box.workspacePath — files\n // land directly, not under a `workspace/` subdir.\n const result = await provider.downloadDirContents(\n box,\n '/workspace',\n box.workspacePath,\n );\n process.stdout.write(`downloaded /workspace contents to ${result.finalPath}\\n`);\n return;\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');\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 download 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: `Download ${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 download env [box]` — commander dispatches the `env` subcommand;\n// `agentbox download [box]` / `agentbox download` still hit the default action above.\ndownloadCommand.addCommand(downloadEnvCommand);\n\n// `agentbox download 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).\ndownloadCommand.addCommand(downloadClaudeCommand);\n\n// `agentbox download codex [box]` — box -> host pull of Codex config/auth\n// (additive; reads the codex-config volume so the box need not be running).\ndownloadCommand.addCommand(downloadCodexCommand);\n\n// `agentbox download opencode [box]` — box -> host pull of OpenCode config/auth\n// (additive; reads the opencode-config volume so the box need not be running).\ndownloadCommand.addCommand(downloadOpencodeCommand);\n\n// `agentbox download config [box]` — box -> host pull of just agentbox.yaml\n// (gitignore-bypassing; for syncing back an in-box-edited/regenerated config).\ndownloadCommand.addCommand(downloadConfigCommand);\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 DownloadClaudeOpts {\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 downloadClaudeCommand = new Command('claude')\n .description(\n 'Download 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: DownloadClaudeOpts) => {\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 `download` / `download 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 download 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 downloaded into ~/.claude\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Download ${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 `downloaded ${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 {\n DEFAULT_BOX_IMAGE,\n pullCodexConfig,\n resolveCodexVolume,\n SHARED_CODEX_VOLUME,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DownloadCodexOpts {\n yes?: boolean;\n dryRun?: boolean;\n}\n\nexport const downloadCodexCommand = new Command('codex')\n .description(\n 'Download box-side Codex config/auth (config.toml, auth.json, prompts) back to host ~/.codex (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: DownloadCodexOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // We read the codex-config *volume*, not the container, so the box can\n // be stopped — no unpause/start dance.\n const volume =\n box.codexConfigVolume ?? resolveCodexVolume({ isolate: false, boxId: box.id }).volume;\n if (volume === SHARED_CODEX_VOLUME) {\n log.warn(\n `Reading the shared ${SHARED_CODEX_VOLUME} volume — it aggregates Codex config from ANY box, not just ${box.name}.`,\n );\n }\n const image = box.image || DEFAULT_BOX_IMAGE;\n\n const preview = await pullCodexConfig({ volume }, { image, dryRun: true });\n\n if (preview.newItems.length === 0) {\n process.stdout.write('no new Codex config to download into ~/.codex\\n');\n return;\n }\n\n for (const item of preview.newItems) process.stdout.write(` ${item} (new)\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.newItems.length} item(s) would be downloaded into ~/.codex\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Download ${preview.newItems.length} Codex item(s) into ~/.codex? (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 pullCodexConfig({ volume }, { image, dryRun: false });\n process.stdout.write(`downloaded ${result.newItems.length} item(s) into ~/.codex\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_BOX_IMAGE,\n pullOpencodeConfig,\n resolveOpencodeVolume,\n SHARED_OPENCODE_VOLUME,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DownloadOpencodeOpts {\n yes?: boolean;\n dryRun?: boolean;\n}\n\nexport const downloadOpencodeCommand = new Command('opencode')\n .description(\n 'Download box-side OpenCode config/auth (auth.json, opencode.json, agents, commands, themes) back to host ~/.config + ~/.local/share opencode (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: DownloadOpencodeOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // We read the opencode-config *volume*, not the container, so the box can\n // be stopped — no unpause/start dance.\n const volume =\n box.opencodeConfigVolume ?? resolveOpencodeVolume({ isolate: false, boxId: box.id }).volume;\n if (volume === SHARED_OPENCODE_VOLUME) {\n log.warn(\n `Reading the shared ${SHARED_OPENCODE_VOLUME} volume — it aggregates OpenCode config from ANY box, not just ${box.name}.`,\n );\n }\n const image = box.image || DEFAULT_BOX_IMAGE;\n\n const preview = await pullOpencodeConfig({ volume }, { image, dryRun: true });\n\n if (preview.newItems.length === 0) {\n process.stdout.write('no new OpenCode config to download\\n');\n return;\n }\n\n for (const item of preview.newItems) process.stdout.write(` ${item} (new)\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.newItems.length} item(s) would be downloaded\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Download ${preview.newItems.length} OpenCode item(s) into ~/.config + ~/.local/share opencode? (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 pullOpencodeConfig({ volume }, { image, dryRun: false });\n process.stdout.write(`downloaded ${result.newItems.length} item(s)\\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 DownloadConfigOpts {\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 download 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 downloadConfigCommand = new Command('config')\n .description('Download 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: DownloadConfigOpts) => {\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');\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 download 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: `Download ${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 `downloaded ${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 DownloadEnvOpts {\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 downloadEnvCommand = new Command('env')\n .description(\n 'Download 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: DownloadEnvOpts) => {\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');\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 download 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: `Download ${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 `downloaded ${result.changes.length} env/config file(s) into ${result.hostPath}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { parseKeysList } from '../lib/drive/keys.js';\nimport { resolveDriveSession, SessionNotFoundError } from '../lib/drive/session.js';\nimport {\n captureSession,\n paneInfo,\n resizeWindow,\n sendKey,\n sendLiteral,\n type CaptureOptions,\n} from '../lib/drive/tmux.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n// Default settle delay before `drive prompt` sends its trailing Enter. Some\n// agent TUIs debounce stdin for a few frames after first input lands; without\n// the gap the Enter fires before the text is composed and gets swallowed.\nconst PROMPT_ENTER_DELAY_MS = 200;\n\nconst POLL_INTERVAL_MS = 250;\n\nexport const driveCommand = new Command('drive')\n .description(\n 'Drive a running tmux session inside a box: snapshot the screen, send keystrokes, type text, or wait for output. Targets the agent session by default (claude → codex → opencode).',\n );\n\nconst sessionOption = ['--session <name>', 'tmux session to target (default: first running agent session)'] as const;\n\ninterface SnapshotOpts {\n session?: string;\n ansi?: boolean;\n withCursor?: boolean;\n rows?: string;\n json?: boolean;\n}\n\nconst driveSnapshotCommand = new Command('snapshot')\n .description('Print the rendered terminal contents of the box\\'s active tmux session.')\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(sessionOption[0], sessionOption[1])\n .option('--ansi', 'preserve ANSI color/style escape sequences (default: plain text)')\n .option('--with-cursor', 'include cursor coordinates and pane size (implies --json)')\n .option('--rows <range>', 'inclusive row range \"FROM:TO\" (negative numbers walk into scrollback)')\n .option('--json', 'emit a JSON envelope { session, cols, rows, cursor?, screen }')\n .action(async (boxRef: string | undefined, opts: SnapshotOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n\n const captureOpts: CaptureOptions = {};\n if (opts.ansi) captureOpts.ansi = true;\n if (opts.rows !== undefined) captureOpts.rows = parseRowRange(opts.rows);\n\n const screen = await captureSession(provider, box, session.name, captureOpts);\n\n const wantJson = opts.json === true || opts.withCursor === true;\n if (!wantJson) {\n process.stdout.write(screen + '\\n');\n return;\n }\n const envelope: {\n session: string;\n screen: string;\n cols?: number;\n rows?: number;\n cursor?: { x: number; y: number };\n } = { session: session.name, screen };\n if (opts.withCursor) {\n const info = await paneInfo(provider, box, session.name);\n envelope.cols = info.cols;\n envelope.rows = info.rows;\n envelope.cursor = info.cursor;\n }\n process.stdout.write(JSON.stringify(envelope) + '\\n');\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ninterface SessionOpts {\n session?: string;\n}\n\nconst driveKeypressCommand = new Command('keypress')\n .description('Send keystrokes parsed via the DSL (e.g. \"<C-a>q\", \"ls<Enter>\"). Each arg is concatenated with no spaces.')\n .argument(\n '<box>',\n 'box ref: project index, id, id prefix, name, or container',\n )\n .argument('<keys...>', 'one or more DSL tokens / literal text; `<<` escapes a literal `<`')\n .option(sessionOption[0], sessionOption[1])\n .action(async (boxRef: string, keys: string[], opts: SessionOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const literal = parseKeysList(keys);\n await sendLiteral(provider, box, session.name, literal);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\nconst driveSendTextCommand = new Command('send-text')\n .description('Type literal text into the session (no DSL parsing, no trailing Enter).')\n .argument('<box>', 'box ref')\n .argument('<text>', 'literal text to type')\n .option(sessionOption[0], sessionOption[1])\n .action(async (boxRef: string, text: string, opts: SessionOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n await sendLiteral(provider, box, session.name, text);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ninterface PromptOpts extends SessionOpts {\n delay?: string;\n}\n\nconst drivePromptCommand = new Command('prompt')\n .description('Type text into the agent session and press Enter — convenience for \"send a message to the running agent\".')\n .argument('<box>', 'box ref')\n .argument('<text>', 'prompt text to send (literal; no DSL parsing)')\n .option(sessionOption[0], sessionOption[1])\n .option('--delay <ms>', `milliseconds to wait between text and Enter (default: ${String(PROMPT_ENTER_DELAY_MS)})`)\n .action(async (boxRef: string, text: string, opts: PromptOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const delay = opts.delay !== undefined ? parsePositiveInt(opts.delay, '--delay') : PROMPT_ENTER_DELAY_MS;\n await sendLiteral(provider, box, session.name, text);\n if (delay > 0) await sleep(delay);\n await sendKey(provider, box, session.name, 'Enter');\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ninterface WaitOpts extends SessionOpts {\n text: string;\n timeout?: string;\n json?: boolean;\n}\n\nconst driveWaitCommand = new Command('wait')\n .description('Block until --text appears in the session\\'s rendered screen, or exit non-zero on timeout.')\n .argument('<box>', 'box ref')\n .requiredOption('--text <str>', 'substring to wait for')\n .option('--timeout <ms>', 'wall-clock cap in milliseconds (default: 5000)')\n .option(sessionOption[0], sessionOption[1])\n .option('--json', 'emit a JSON envelope { matched, elapsedMs, session, screen? }')\n .action(async (boxRef: string, opts: WaitOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const timeoutMs = opts.timeout !== undefined ? parsePositiveInt(opts.timeout, '--timeout') : 5000;\n const start = Date.now();\n const deadline = start + timeoutMs;\n let lastScreen = '';\n while (Date.now() < deadline) {\n lastScreen = await captureSession(provider, box, session.name);\n if (lastScreen.includes(opts.text)) {\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ matched: true, elapsedMs, session: session.name }) + '\\n',\n );\n }\n return;\n }\n await sleep(POLL_INTERVAL_MS);\n }\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({\n matched: false,\n elapsedMs,\n session: session.name,\n screen: lastScreen,\n }) + '\\n',\n );\n } else {\n log.error(`text not found within ${String(timeoutMs)}ms: ${opts.text}`);\n }\n process.exit(1);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\nconst driveResizeCommand = new Command('resize')\n .description('Resize the tmux window to <cols> x <rows>.')\n .argument('<box>', 'box ref')\n .argument('<cols>', 'columns (positive int)')\n .argument('<rows>', 'rows (positive int)')\n .option(sessionOption[0], sessionOption[1])\n .action(async (boxRef: string, colsStr: string, rowsStr: string, opts: SessionOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const cols = parsePositiveInt(colsStr, '<cols>');\n const rows = parsePositiveInt(rowsStr, '<rows>');\n await resizeWindow(provider, box, session.name, cols, rows);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ndriveCommand.addCommand(driveSnapshotCommand);\ndriveCommand.addCommand(driveKeypressCommand);\ndriveCommand.addCommand(driveSendTextCommand);\ndriveCommand.addCommand(drivePromptCommand);\ndriveCommand.addCommand(driveWaitCommand);\ndriveCommand.addCommand(driveResizeCommand);\n\nfunction handleDriveError(err: unknown): never {\n if (err instanceof SessionNotFoundError) {\n log.error(err.message);\n log.info(\"start an agent first (e.g. `agentbox claude <box>`) or pass --session.\");\n process.exit(2);\n }\n handleLifecycleError(err);\n}\n\nfunction parseRowRange(raw: string): { from: number; to: number } {\n const m = /^(-?\\d+):(-?\\d+)$/.exec(raw);\n if (!m || !m[1] || !m[2]) {\n throw new Error(`--rows expects FROM:TO (got: ${raw})`);\n }\n return { from: Number(m[1]), to: Number(m[2]) };\n}\n\nfunction parsePositiveInt(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || String(n) !== raw.trim()) {\n throw new Error(`${label} must be a positive integer (got: ${raw})`);\n }\n return n;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","// Translate a small keystroke DSL into the bytes a terminal expects.\n// Literal text passes through as-is; `<...>` tokens map to control bytes\n// or xterm escape sequences. Tokens are case-insensitive.\n//\n// <Enter> <Tab> <Esc> <Space> <BS> <Del>\n// <C-x> Ctrl+x for any letter a-z (0x01..0x1a)\n// <Up|Down|Left|Right>\n// <Home|End|PageUp|PageDown>\n// <F1>..<F12>\n//\n// Use `<` literally by escaping as `<<`.\n\nconst NAMED: Record<string, string> = {\n enter: '\\r',\n return: '\\r',\n tab: '\\t',\n esc: '\\x1b',\n escape: '\\x1b',\n space: ' ',\n bs: '\\x7f',\n backspace: '\\x7f',\n del: '\\x1b[3~',\n delete: '\\x1b[3~',\n up: '\\x1b[A',\n down: '\\x1b[B',\n right: '\\x1b[C',\n left: '\\x1b[D',\n home: '\\x1b[H',\n end: '\\x1b[F',\n pageup: '\\x1b[5~',\n pagedown: '\\x1b[6~',\n f1: '\\x1bOP',\n f2: '\\x1bOQ',\n f3: '\\x1bOR',\n f4: '\\x1bOS',\n f5: '\\x1b[15~',\n f6: '\\x1b[17~',\n f7: '\\x1b[18~',\n f8: '\\x1b[19~',\n f9: '\\x1b[20~',\n f10: '\\x1b[21~',\n f11: '\\x1b[23~',\n f12: '\\x1b[24~',\n};\n\nexport function parseKeys(input: string): string {\n let out = '';\n let i = 0;\n while (i < input.length) {\n const ch = input[i];\n if (ch === '<') {\n if (input[i + 1] === '<') {\n out += '<';\n i += 2;\n continue;\n }\n const close = input.indexOf('>', i + 1);\n if (close === -1) {\n out += ch;\n i += 1;\n continue;\n }\n const tok = input.slice(i + 1, close);\n out += resolveToken(tok);\n i = close + 1;\n continue;\n }\n out += ch;\n i += 1;\n }\n return out;\n}\n\n// Concatenate-and-parse: lets callers pass multiple shell args without\n// the shell sneaking in spaces between them. `[\"ls\", \"<Enter>\"] -> \"ls\\r\"`.\nexport function parseKeysList(input: string[]): string {\n return parseKeys(input.join(''));\n}\n\nfunction resolveToken(raw: string): string {\n const tok = raw.trim().toLowerCase();\n if (NAMED[tok] !== undefined) return NAMED[tok];\n const ctl = /^c-([a-z])$/.exec(tok);\n if (ctl && ctl[1]) {\n const code = ctl[1].charCodeAt(0) - 'a'.charCodeAt(0) + 1;\n return String.fromCharCode(code);\n }\n return `<${raw}>`;\n}\n","// Thin wrappers around `Provider.exec` that build the in-box tmux argv for the\n// `agentbox drive` commands. One place to maintain the tmux invocations so the\n// subcommands stay declarative. Everything runs as the `vscode` user inside the\n// box — that's the user that owns the tmux server socket under /tmp/tmux-1000/.\n\nimport type { BoxRecord, Provider } from '@agentbox/core';\n\nconst TMUX_USER = 'vscode';\n\nexport interface CaptureOptions {\n /** Re-encode escape sequences in the output (`-e`). */\n ansi?: boolean;\n /** Inclusive line range; passed to tmux as `-S <from> -E <to>` (rows count from 0 at the top of the visible pane; negative numbers walk into the scrollback). */\n rows?: { from: number; to: number };\n}\n\nexport interface CursorInfo {\n x: number;\n y: number;\n}\n\nexport interface PaneInfo {\n cols: number;\n rows: number;\n cursor: CursorInfo;\n}\n\n/**\n * `tmux capture-pane -p` on the named session/window. Plain by default; with\n * `--ansi` (`-pe`) tmux re-encodes color/style escape sequences so a caller\n * can pipe back through a renderer if needed.\n */\nexport async function captureSession(\n provider: Provider,\n box: BoxRecord,\n session: string,\n opts: CaptureOptions = {},\n): Promise<string> {\n const argv = ['tmux', 'capture-pane', opts.ansi ? '-pe' : '-p', '-t', session];\n if (opts.rows) {\n argv.push('-S', String(opts.rows.from), '-E', String(opts.rows.to));\n }\n const res = await provider.exec(box, argv, { user: TMUX_USER });\n if (res.exitCode !== 0) {\n throw new Error(failure('capture-pane', session, res.stderr || res.stdout));\n }\n // tmux always appends a trailing newline — strip it so callers can `String.includes`\n // without snagging on a phantom empty last line.\n return res.stdout.replace(/\\n$/, '');\n}\n\n/**\n * Read cols, rows, and cursor position from `tmux display-message -p`. Used by\n * `drive snapshot --with-cursor` to emit a structured JSON envelope.\n */\nexport async function paneInfo(\n provider: Provider,\n box: BoxRecord,\n session: string,\n): Promise<PaneInfo> {\n const fmt = '#{pane_width},#{pane_height},#{cursor_x},#{cursor_y}';\n const res = await provider.exec(box, ['tmux', 'display-message', '-p', '-t', session, fmt], {\n user: TMUX_USER,\n });\n if (res.exitCode !== 0) {\n throw new Error(failure('display-message', session, res.stderr || res.stdout));\n }\n const m = /^(\\d+),(\\d+),(\\d+),(\\d+)/.exec(res.stdout.trim());\n if (!m) throw new Error(`tmux display-message returned unexpected output: ${res.stdout}`);\n return {\n cols: Number(m[1]),\n rows: Number(m[2]),\n cursor: { x: Number(m[3]), y: Number(m[4]) },\n };\n}\n\n/**\n * `tmux send-keys -l` writes the bytes verbatim — no key-table translation —\n * so control bytes already encoded in the DSL (e.g. 0x01 for Ctrl-a) reach the\n * inner program intact. Pass the resolved DSL string here, not a raw user\n * argv.\n */\nexport async function sendLiteral(\n provider: Provider,\n box: BoxRecord,\n session: string,\n literal: string,\n): Promise<void> {\n if (literal.length === 0) return;\n const res = await provider.exec(box, ['tmux', 'send-keys', '-t', session, '-l', '--', literal], {\n user: TMUX_USER,\n });\n if (res.exitCode !== 0) {\n throw new Error(failure('send-keys -l', session, res.stderr || res.stdout));\n }\n}\n\n/**\n * `tmux send-keys` with key-table translation enabled. Use for symbolic keys\n * like `Enter` / `BSpace`; the DSL parser produces literal bytes that go\n * through `sendLiteral`, so this is mostly used by the `prompt` subcommand to\n * append a trailing Enter.\n */\nexport async function sendKey(\n provider: Provider,\n box: BoxRecord,\n session: string,\n key: string,\n): Promise<void> {\n const res = await provider.exec(box, ['tmux', 'send-keys', '-t', session, key], {\n user: TMUX_USER,\n });\n if (res.exitCode !== 0) {\n throw new Error(failure('send-keys', session, res.stderr || res.stdout));\n }\n}\n\n/**\n * `tmux resize-window -t <session>:0 -x <cols> -y <rows>`. tmux 3.0+ ships\n * `resize-window`; the box image is already on 3.2.\n */\nexport async function resizeWindow(\n provider: Provider,\n box: BoxRecord,\n session: string,\n cols: number,\n rows: number,\n): Promise<void> {\n const res = await provider.exec(\n box,\n ['tmux', 'resize-window', '-t', session, '-x', String(cols), '-y', String(rows)],\n { user: TMUX_USER },\n );\n if (res.exitCode !== 0) {\n throw new Error(failure('resize-window', session, res.stderr || res.stdout));\n }\n}\n\n/**\n * `tmux list-sessions -F \"#{session_name}\"` — one session name per line.\n * Empty list when no tmux server is running (exit 1 on the box; we swallow it).\n */\nexport async function listSessions(provider: Provider, box: BoxRecord): Promise<string[]> {\n const res = await provider.exec(\n box,\n ['tmux', 'list-sessions', '-F', '#{session_name}'],\n { user: TMUX_USER },\n );\n if (res.exitCode !== 0) return [];\n return res.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nfunction failure(op: string, session: string, detail: string): string {\n const tail = detail.trim();\n return `tmux ${op} failed for session '${session}'${tail ? `: ${tail}` : ''}`;\n}\n","// Resolve which tmux session inside a box the `drive` subcommands should\n// target. The explicit `--session` flag always wins; otherwise we pick the\n// first running well-known agent session (claude → codex → opencode) and fall\n// back to whatever single session exists if none of those names match.\n\nimport type { BoxRecord, Provider } from '@agentbox/core';\nimport { listSessions } from './tmux.js';\n\n// Mirrors the DEFAULT_*_SESSION constants in `@agentbox/sandbox-docker`. Kept\n// inline so this module has no dep on the docker package (it runs against\n// any provider).\nconst AGENT_SESSION_PRIORITY = ['claude', 'codex', 'opencode'] as const;\n\nexport interface ResolvedSession {\n name: string;\n /** All sessions tmux reported, in tmux's order. */\n available: string[];\n}\n\nexport async function resolveDriveSession(\n provider: Provider,\n box: BoxRecord,\n explicit: string | undefined,\n): Promise<ResolvedSession> {\n const sessions = await listSessions(provider, box);\n\n if (explicit !== undefined && explicit !== '') {\n if (!sessions.includes(explicit)) {\n throw new SessionNotFoundError(explicit, sessions);\n }\n return { name: explicit, available: sessions };\n }\n\n for (const candidate of AGENT_SESSION_PRIORITY) {\n if (sessions.includes(candidate)) {\n return { name: candidate, available: sessions };\n }\n }\n // No agent session, but maybe a custom one started by the user. Auto-pick\n // when there's exactly one to choose from; otherwise fail loud with the list.\n if (sessions.length === 1 && sessions[0]) {\n return { name: sessions[0], available: sessions };\n }\n throw new SessionNotFoundError(undefined, sessions);\n}\n\nexport class SessionNotFoundError extends Error {\n readonly wanted: string | undefined;\n readonly available: string[];\n\n constructor(wanted: string | undefined, available: string[]) {\n const head = wanted\n ? `no tmux session '${wanted}' in this box`\n : 'no agent tmux session running in this box';\n const tail = available.length\n ? ` (running: ${available.join(', ')})`\n : ' (tmux server not running or no sessions)';\n super(head + tail);\n this.name = 'SessionNotFoundError';\n this.wanted = wanted;\n this.available = available;\n }\n}\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { detectHostTerminal } from '../terminal/host.js';\nimport { encodeClaudeProjectsDir } from '../session-teleport/cwd-encoding.js';\nimport { claudeCommand } from './claude.js';\nimport { codexCommand } from './codex.js';\nimport { opencodeCommand } from './opencode.js';\n\ntype ForkAgent = 'claude' | 'codex' | 'opencode';\nconst FORK_AGENTS = ['claude', 'codex', 'opencode'] as const;\n\n/** The create-style command each agent forks through. fork forwards a curated\n * argv and lets the delegate run its own create+teleport+attach pipeline\n * (incl. the new-tab spawn, tagged with that agent's attach mode). */\nconst AGENT_COMMAND: Record<ForkAgent, Command> = {\n claude: claudeCommand,\n codex: codexCommand,\n opencode: opencodeCommand,\n};\n\ninterface ForkOptions {\n workspace: string;\n session?: string;\n provider?: string;\n name?: string;\n attachIn?: string;\n carryYes?: boolean;\n agent?: string;\n}\n\n/** fork's attach modes: claude's split|window|tab|same plus `background`\n * (never attach — always leave Claude running in the box). */\nconst FORK_ATTACH_VALUES = ['window', 'tab', 'split', 'background', 'same'] as const;\n\n/** Two host JSONLs both touched inside this window means we can't safely guess\n * which Claude window the user meant — they must pass --session. */\nconst RECENT_SESSION_MS = 5 * 60 * 1000;\n\n/** Session args fork forwards to the delegate command, per agent:\n * - claude: `--resume <id>` when given; else `--continue`, but refuse first if\n * several sessions in this cwd were written to recently (the newest-by-mtime\n * heuristic claude's `--continue` uses would be a guess). The Codex/OpenCode\n * paths can't read the cwd's session list the same way, so they're simpler.\n * - codex: `--resume <uuid>` when given; else `--continue` (codex teleport is\n * already cwd-scoped). The Codex `/agentbox` prompt resolves the live uuid\n * and passes it, since Codex exposes no session-id variable.\n * - opencode: no resume — teleport is a stub, so fork starts a fresh box.\n * `--session` is rejected (resume isn't possible yet). */\nfunction resolveSessionArgs(agent: ForkAgent, opts: ForkOptions): string[] {\n if (agent === 'opencode') {\n if (opts.session) {\n throw new Error(\n 'OpenCode session resume is not supported yet; `agentbox fork --agent opencode` starts a fresh box. Drop --session.',\n );\n }\n return [];\n }\n if (opts.session) return ['--resume', opts.session];\n if (agent === 'codex') return ['--continue'];\n // claude: guard against an ambiguous newest-by-mtime pick.\n const dir = join(homedir(), '.claude', 'projects', encodeClaudeProjectsDir(opts.workspace));\n if (!existsSync(dir)) return ['--continue']; // claude emits the clear \"run claude here first\" error\n const now = Date.now();\n const recent = readdirSync(dir)\n .filter((f) => f.endsWith('.jsonl'))\n .map((f) => {\n try {\n return statSync(join(dir, f)).mtimeMs;\n } catch {\n return 0;\n }\n })\n .filter((m) => now - m < RECENT_SESSION_MS);\n if (recent.length > 1) {\n throw new Error(\n `multiple recent Claude sessions for this cwd — pass --session <id> to choose. List them with: ls \"${dir}\"`,\n );\n }\n return ['--continue'];\n}\n\n/** Default box name when -n is omitted: tags forks distinctly in `agentbox list`. */\nfunction defaultForkName(): string {\n const now = new Date();\n const hh = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n return `fork-${hh}${mm}${ss}`;\n}\n\n/**\n * Translate fork's `--attach-in` + the detected host terminal into the claude\n * flag that produces the right behavior. The key difference from a bare\n * `agentbox claude --attach-in window` is the fallback: when no tmux/iTerm is\n * present, fork goes to **background** (`--no-attach`) rather than inline\n * attach — fork is typically driven from another Claude (the `/agentbox`\n * slash command's subagent), whose terminal must not be taken over.\n */\nfunction resolveAttachArgs(attachIn: string): string[] {\n if (attachIn === 'background') return ['--no-attach'];\n if (attachIn === 'same') return ['--attach-in', 'same'];\n // window | tab | split: spawn a new pane only if we can; else background.\n return detectHostTerminal() === 'unknown' ? ['--no-attach'] : ['--attach-in', attachIn];\n}\n\nexport const forkCommand = new Command('fork')\n .description(\n 'Fork the current host agent session into a new box and resume it there. Opens the box in a new terminal tab under iTerm/tmux; otherwise starts it in the background.',\n )\n .option('-w, --workspace <path>', 'host workspace to mount', process.cwd())\n .option(\n '--agent <name>',\n 'which agent to fork: claude (default), codex, or opencode. OpenCode starts a fresh box (session resume not supported yet).',\n )\n .option(\n '--session <id>',\n 'host agent session id to resume (default: the newest session for this cwd; claude refuses if several were used recently). Ignored for --agent opencode.',\n )\n .option('--provider <name>', \"sandbox backend: 'docker' (default), 'daytona', or 'hetzner'\")\n .option('-n, --name <name>', 'box name (default: fork-<HHMMSS>)')\n .option(\n '--attach-in <mode>',\n 'where to open the forked session: window | tab | split | background | same (default: tab). Falls back to background outside tmux/iTerm.',\n )\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's carry: block (fork skips carry by default — it does not silently re-copy host files into the new box)\",\n )\n .action(async (opts: ForkOptions) => {\n // Box→box guard: AGENTBOX_RELAY_URL is only set inside a box. Fork teleports\n // a *host* agent session into a new box; it can't run from inside one yet.\n // Checked here (not just in the /agentbox skill) so an LLM that calls the\n // CLI directly still gets a clear refusal instead of a confusing failure.\n if ((process.env.AGENTBOX_RELAY_URL ?? '').trim().length > 0) {\n log.error(\n 'agentbox fork runs on the host only: it teleports a host agent session into a new box. You appear to be inside a box (AGENTBOX_RELAY_URL is set) — box→box fork is not supported yet.',\n );\n process.exit(2);\n }\n\n const agent = (opts.agent?.trim() || 'claude') as ForkAgent;\n if (!(FORK_AGENTS as readonly string[]).includes(agent)) {\n log.error(`--agent: expected one of ${FORK_AGENTS.join(', ')}, got \"${opts.agent ?? ''}\"`);\n process.exit(2);\n }\n\n const attachIn = opts.attachIn ?? 'tab';\n if (!(FORK_ATTACH_VALUES as readonly string[]).includes(attachIn)) {\n log.error(`--attach-in: expected one of ${FORK_ATTACH_VALUES.join(', ')}, got \"${attachIn}\"`);\n process.exit(2);\n }\n\n // Tolerate an LLM passing `--provider \"\"` (or whitespace): treat a blank\n // value as \"not passed\" so it falls through to the default docker provider.\n const provider = opts.provider?.trim();\n\n let sessionArgs: string[];\n try {\n sessionArgs = resolveSessionArgs(agent, opts);\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(2);\n }\n\n const subArgv = [\n '-y',\n ...(opts.carryYes ? ['--carry-yes'] : ['--carry', 'skip']),\n '-w',\n opts.workspace,\n '-n',\n opts.name ?? defaultForkName(),\n ...(provider ? ['--provider', provider] : []),\n ...sessionArgs,\n ...resolveAttachArgs(attachIn),\n ];\n\n // Delegate to the chosen agent's existing create+teleport+attach pipeline.\n // It runs prepareTeleport (pre-flight) -> createBox -> uploadTeleport ->\n // startSession, and (for --attach-in tab/window) spawnInNewTerminal tagged\n // with that agent's attach mode. The action terminates the process itself\n // (process.exit) on every path.\n await AGENT_COMMAND[agent].parseAsync(subArgv, { from: 'user' });\n });\n","import { intro, log, outro } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** Marker on the line after the frontmatter of every skill we ship. Its\n * presence in an existing target means we wrote it and may overwrite freely. */\nconst MANAGED_SENTINEL = '<!-- agentbox-managed:v1 -->';\n\n/** Substring unique to the pre-rename `agentbox` host skill. Lets `install`\n * replace it in place during the agentbox → agentbox-info rename even though\n * that old file predates the sentinel. */\nconst LEGACY_INFO_MARKER = 'Drive AgentBox from the host:';\n\ninterface InstallTarget {\n /** Path relative to the bundled `share/host-skills/` dir. */\n src: string;\n /** Absolute destination on the host. */\n dest: string;\n /** When set, install only if this directory exists — i.e. the tool is set up\n * on this host. Absent dir = silently skip (don't write configs for a tool\n * the user doesn't use). */\n gateDir?: string;\n}\n\n/** The files `agentbox install` writes. Claude skills always install; the Codex\n * prompt and OpenCode command install only when that tool's config dir exists.\n * All three surface the same `/agentbox` fork command in their respective\n * agent UIs (Codex shows it under `/prompts:`). */\nfunction installTargets(): InstallTarget[] {\n const home = homedir();\n const claudeSkills = join(home, '.claude', 'skills');\n return [\n { src: join('agentbox', 'SKILL.md'), dest: join(claudeSkills, 'agentbox', 'SKILL.md') },\n { src: join('agentbox-info', 'SKILL.md'), dest: join(claudeSkills, 'agentbox-info', 'SKILL.md') },\n {\n src: join('codex', 'agentbox.md'),\n dest: join(home, '.codex', 'prompts', 'agentbox.md'),\n gateDir: join(home, '.codex'),\n },\n {\n src: join('opencode', 'agentbox.md'),\n dest: join(home, '.config', 'opencode', 'commands', 'agentbox.md'),\n gateDir: join(home, '.config', 'opencode'),\n },\n ];\n}\n\n/**\n * Locate the bundled `share/host-skills/` directory. This module is bundled\n * into the CLI at `<root>/dist/index.js`; `share/` ships as a sibling of\n * `dist/` in both the dev tree and the published package. The src-tree\n * candidate covers running unbundled (e.g. tsx).\n */\nfunction resolveHostSkillsDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(here, '..', 'share', 'host-skills'), // bundled: dist/ -> ../share\n resolve(here, '..', '..', 'share', 'host-skills'), // src: src/commands/ -> ../../share\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n throw new Error(\n `could not locate bundled host skills; tried:\\n ${candidates.join('\\n ')}`,\n );\n}\n\ninterface InstallOptions {\n force?: boolean;\n dryRun?: boolean;\n}\n\n/** Decide whether we may write `target`. Missing or AgentBox-managed/legacy\n * files are writable; a user-authored file is left alone unless --force. */\nfunction writableReason(target: string, force: boolean): 'new' | 'managed' | 'forced' | 'skip' {\n if (!existsSync(target)) return 'new';\n const existing = readFileSync(target, 'utf8');\n if (existing.includes(MANAGED_SENTINEL) || existing.includes(LEGACY_INFO_MARKER)) {\n return 'managed';\n }\n return force ? 'forced' : 'skip';\n}\n\nexport const installCommand = new Command('install')\n .description(\n \"Install AgentBox's host-side /agentbox fork command into Claude (~/.claude/skills), and — when detected — into Codex (~/.codex/prompts) and OpenCode (~/.config/opencode/commands). Idempotent.\",\n )\n .option('--force', 'overwrite existing files even if not AgentBox-managed')\n .option('--dry-run', 'print what would be written without changing anything')\n .action((opts: InstallOptions) => {\n intro('Installing AgentBox host commands...');\n const force = opts.force === true;\n const dryRun = opts.dryRun === true;\n\n let srcDir: string;\n try {\n srcDir = resolveHostSkillsDir();\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n const written: string[] = [];\n let skipped = 0;\n\n for (const t of installTargets()) {\n const src = join(srcDir, t.src);\n if (!existsSync(src)) {\n log.warn(`bundled file missing (skipped): ${src}`);\n skipped++;\n continue;\n }\n // Tool not set up on this host — skip silently (don't seed configs for a\n // tool the user doesn't use).\n if (t.gateDir && !existsSync(t.gateDir)) continue;\n const reason = writableReason(t.dest, force);\n if (reason === 'skip') {\n log.warn(`user-modified file at ${t.dest}, skipping; pass --force to overwrite`);\n skipped++;\n continue;\n }\n if (dryRun) {\n log.info(`would write ${t.dest} (${reason})`);\n written.push(t.dest);\n continue;\n }\n mkdirSync(dirname(t.dest), { recursive: true });\n writeFileSync(t.dest, readFileSync(src, 'utf8'));\n written.push(t.dest);\n }\n\n if (dryRun) {\n outro(`dry-run: ${String(written.length)} file(s) would be written, ${String(skipped)} skipped`);\n return;\n }\n if (written.length === 0) {\n outro(`nothing installed (${String(skipped)} skipped)`);\n return;\n }\n outro(`installed: ${written.join(', ')}`);\n });\n","import type { BoxRecord, ExecResult } from '@agentbox/core';\nimport { GH_PR_OPS, hashRpcParams, type GhPrOp } from '@agentbox/relay';\nimport { mintHostInitiatedToken } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/**\n * `agentbox git <subcommand> <box>` — host-side proxy for git/PR operations\n * against a specific box. Every subcommand resolves the box, attaches the\n * provider, and runs the matching `agentbox-ctl git` / `agentbox-ctl gh pr`\n * (or raw `git`) inside the box's /workspace.\n *\n * Credentialed RPCs (push, fetch, pull-fetch, gh pr) carry a one-time scoped\n * token minted by the host via `mintHostInitiatedToken`; the relay validates\n * the token and skips its confirm prompt on match. A simple \"host-initiated\"\n * boolean would be forgeable by the box agent (the agent sees the argv); the\n * one-time token isn't (the mint endpoint is loopback-only). If the relay\n * can't mint (older relay / not running), the call still proceeds — it just\n * goes through the normal prompt path on the wrapper side.\n */\n\nconst WORKSPACE = '/workspace';\n/** Generous TTL: a slow push over a flaky uplink can easily take 60s. */\nconst TOKEN_TTL_MS = 120_000;\n\nasync function runInBox(box: BoxRecord, argv: string[]): Promise<ExecResult> {\n const provider = await providerForBox(box);\n return provider.exec(box, argv, { cwd: WORKSPACE });\n}\n\nasync function runAndStream(box: BoxRecord, argv: string[]): Promise<number> {\n const r = await runInBox(box, argv);\n if (r.stdout) process.stdout.write(r.stdout);\n if (r.stderr) process.stderr.write(r.stderr);\n return r.exitCode;\n}\n\n/**\n * Shape of the RPC params `agentbox-ctl` will send to the relay. The host\n * CLI must compute this *exactly* so the hash binding round-trips. Kept in\n * lockstep with `buildParams` in `packages/ctl/src/commands/git.ts` and the\n * action body in `packages/ctl/src/commands/pr-subcommands.ts`. The `cwd` is\n * always `/workspace` because our `provider.exec` call below sets it\n * explicitly; ctl mirrors `process.cwd()` into `params.path`.\n */\ninterface PredictedGitParams {\n path: string;\n remote?: string;\n args?: string[];\n}\ninterface PredictedGhPrParams {\n path: string;\n args?: string[];\n}\n\n/**\n * Mint a host-initiated token bound to the exact params hash + return the\n * `--host-initiated-token <tok>` argv fragment to splice into an\n * `agentbox-ctl` invocation. Empty fragment on mint failure — the call\n * still works, the relay just prompts instead of auto-approving.\n *\n * Why CLI arg (not env): envs propagate to children, so a `git push`\n * pre-push hook would inherit the token. Why bound to paramsHash: /proc/<pid>\n * /cmdline is world-readable, so a malicious in-box process could harvest\n * the token mid-flight and replay with mutated args (e.g. `--force`). The\n * paramsHash binding means a harvested token is only usable for the exact\n * params the host CLI committed to.\n */\nasync function hostInitiatedArgs(\n boxId: string,\n method: string,\n predictedParams: PredictedGitParams | PredictedGhPrParams,\n): Promise<string[]> {\n const paramsHash = hashRpcParams(predictedParams);\n const token = await mintHostInitiatedToken(boxId, method, paramsHash, TOKEN_TTL_MS);\n return token ? ['--host-initiated-token', token] : [];\n}\n\n/** Build the `{ path, remote?, args? }` ctl will send for git RPCs. */\nfunction buildPredictedGitParams(remote: string | undefined, extraArgs: string[]): PredictedGitParams {\n const out: PredictedGitParams = { path: WORKSPACE };\n if (remote) out.remote = remote;\n if (extraArgs.length > 0) out.args = extraArgs;\n return out;\n}\n\n/** Build the `{ path, args? }` ctl will send for gh.pr.<op> RPCs. */\nfunction buildPredictedGhPrParams(ghArgs: string[]): PredictedGhPrParams {\n const out: PredictedGhPrParams = { path: WORKSPACE };\n if (ghArgs.length > 0) out.args = ghArgs;\n return out;\n}\n\nasync function exitWith(code: number): Promise<never> {\n process.exit(code);\n}\n\n// ---- subcommands -----------------------------------------------------------\n\nconst pushCommand = new Command('push')\n .description(\"Push the box's branch via the host relay (host creds, no prompt)\")\n .argument('<box>', 'box ref: project index, id, id prefix, name, or container')\n .argument('[args...]', 'extra flags forwarded to `agentbox-ctl git push` (e.g. --force-with-lease, --tags)')\n .option('--remote <name>', 'remote name (default: origin)')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[], opts: { remote?: string }) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const predicted = buildPredictedGitParams(opts.remote, args);\n const tokenArgs = await hostInitiatedArgs(box.id, 'git.push', predicted);\n const argv = ['agentbox-ctl', 'git', 'push', ...tokenArgs];\n if (opts.remote) argv.push('--remote', opts.remote);\n argv.push(...args);\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst fetchCommand = new Command('fetch')\n .description('Fetch via the host relay (refs land in the shared .git)')\n .argument('<box>', 'box ref')\n .argument('[args...]', 'extra flags forwarded to `agentbox-ctl git fetch` (e.g. --prune)')\n .option('--remote <name>', 'remote name (default: origin)')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[], opts: { remote?: string }) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n // Fetch is read-only host-side and the relay doesn't prompt for it; we\n // still mint a token so future relay hardening that adds a prompt\n // doesn't break this command silently.\n const predicted = buildPredictedGitParams(opts.remote, args);\n const tokenArgs = await hostInitiatedArgs(box.id, 'git.fetch', predicted);\n const argv = ['agentbox-ctl', 'git', 'fetch', ...tokenArgs];\n if (opts.remote) argv.push('--remote', opts.remote);\n argv.push(...args);\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst pullCommand = new Command('pull')\n .description(\n \"Fetch via the relay then merge in /workspace. With <branch>: first `git checkout <branch>` so the box switches base branch and pulls latest — useful for reusing a box on a new task.\",\n )\n .argument('<box>', 'box ref')\n .argument('[branch]', 'optional branch to switch to before pulling (e.g. main)')\n .argument('[args...]', 'extra flags forwarded to `agentbox-ctl git pull`')\n .option('--remote <name>', 'remote name (default: origin)')\n .option('--ff-only', 'pass --ff-only to the in-box merge')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(\n async (\n boxRef: string,\n branch: string | undefined,\n args: string[],\n opts: { remote?: string; ffOnly?: boolean },\n ) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n if (branch) {\n const switchCode = await runAndStream(box, ['git', 'checkout', branch]);\n if (switchCode !== 0) await exitWith(switchCode);\n }\n // ctl's `git pull` runs `git.fetch` internally then a local merge —\n // the relay only sees `git.fetch`. Match the scope to that. Note\n // `--ff-only` is consumed by ctl (not forwarded to the relay), so\n // it's excluded from the predicted params hash.\n const predicted = buildPredictedGitParams(opts.remote, args);\n const tokenArgs = await hostInitiatedArgs(box.id, 'git.fetch', predicted);\n const argv = ['agentbox-ctl', 'git', 'pull', ...tokenArgs];\n if (opts.remote) argv.push('--remote', opts.remote);\n if (opts.ffOnly) argv.push('--ff-only');\n argv.push(...args);\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n },\n );\n\nconst checkoutCommand = new Command('checkout')\n .description('Change the box\\'s working branch (runs `git checkout <branch>` in /workspace)')\n .argument('<box>', 'box ref')\n .argument('<branch>', 'branch to check out inside the box')\n .argument('[args...]', 'extra flags forwarded to `git checkout`')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, branch: string, args: string[]) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n // No relay involvement: branch switching is local to the worktree.\n await exitWith(await runAndStream(box, ['git', 'checkout', branch, ...args]));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst statusCommand = new Command('status')\n .description('Run `git status` in the box\\'s /workspace (read-only, no relay)')\n .argument('<box>', 'box ref')\n .argument('[args...]', 'extra flags forwarded to `git status`')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[]) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n await exitWith(await runAndStream(box, ['git', 'status', ...args]));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n// ---- pr group --------------------------------------------------------------\n//\n// Mirrors the in-box `agentbox-ctl gh pr <op>` surface 1:1. `create` is the\n// default subcommand so `agentbox git pr <box>` is sugar for\n// `agentbox git pr create <box>` — matches how users naturally describe it.\n\nconst PR_OP_DESCRIPTIONS: Record<GhPrOp, string> = {\n create: \"Open a PR for the box's branch (host `gh pr create`, no prompt).\",\n view: 'Show a PR (read-only).',\n list: 'List PRs (read-only).',\n comment: 'Comment on a PR.',\n review: 'Review a PR.',\n merge:\n 'Merge a PR (host `gh pr merge`). AGENTBOX_PROMPT=off bypass still requires AGENTBOX_GH_FORCE=1.',\n checkout:\n \"Check out a PR's branch on the host main repo (opt-in via AGENTBOX_GH_PR_CHECKOUT=allow; switches the host repo branch).\",\n close: 'Close a PR.',\n reopen: 'Reopen a PR.',\n};\n\n/**\n * Default to the box's root branch as `--head` on `gh pr create` so the PR\n * is for the box's branch, not whatever the host happens to have checked\n * out (gh's default infers head from the cwd's HEAD, which is `feat/test`\n * or similar when the user is mid-task). Only injected when the user hasn't\n * already passed `--head`, and only for `create`. The relay's\n * `worktree.hostMainRepo` is the cwd `gh` runs in, so passing `--head` is\n * sufficient — base stays whatever the user picked / repo default.\n */\nfunction injectPrCreateHead(op: GhPrOp, box: { gitWorktrees?: { kind: string; branch: string }[] }, args: string[]): string[] {\n if (op !== 'create') return args;\n if (args.some((a) => a === '--head' || a.startsWith('--head='))) return args;\n const rootWt = (box.gitWorktrees ?? []).find((w) => w.kind === 'root');\n if (!rootWt) return args;\n return ['--head', rootWt.branch, ...args];\n}\n\nfunction buildPrSubcommand(op: GhPrOp): Command {\n return new Command(op)\n .description(PR_OP_DESCRIPTIONS[op])\n .argument('<box>', 'box ref')\n .argument(\n '[args...]',\n 'extra flags forwarded to `gh pr <op>` (e.g. --title, --body, --label, --draft, --json)',\n )\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[]) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const ghArgs = injectPrCreateHead(op, box, args);\n // Hash the args *after* injection so the bound paramsHash matches\n // what ctl will end up sending.\n const predicted = buildPredictedGhPrParams(ghArgs);\n const tokenArgs = await hostInitiatedArgs(box.id, `gh.pr.${op}`, predicted);\n const argv = ['agentbox-ctl', 'gh', 'pr', op, ...tokenArgs, ...ghArgs];\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n}\n\nconst prCommand = new Command('pr').description(\n \"PR operations against a box's branch via the host `gh` CLI\",\n);\nfor (const op of GH_PR_OPS) {\n const sub = buildPrSubcommand(op);\n prCommand.addCommand(sub, op === 'create' ? { isDefault: true } : undefined);\n}\n\n// ---- root ------------------------------------------------------------------\n\nexport const gitCommand = new Command('git')\n .description('Run git / gh pr operations against a box from the host')\n .addCommand(pushCommand)\n .addCommand(fetchCommand)\n .addCommand(pullCommand)\n .addCommand(checkoutCommand)\n .addCommand(statusCommand)\n .addCommand(prCommand);\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 global?: 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\n/**\n * The merged AGENT column: every active agent session, claude annotated with\n * its activity state (working/idle/…), codex/opencode with just their name\n * (running/not is all they expose). Comma-joined when more than one is up;\n * `-` when none.\n *\n * `claudeActivity === 'unknown'` is treated as \"no claude\" — the supervisor\n * seeds that default for *every* box (even codex/opencode boxes), so showing\n * it would put a spurious `claude:unknown` on nearly every row.\n */\nfunction agentSummary(b: ListedBox): string {\n const agents: string[] = [];\n if (b.claudeActivity && b.claudeActivity !== 'unknown') {\n agents.push(`claude:${b.claudeActivity}`);\n }\n // Codex: show its activity when a hook has reported one; otherwise fall back\n // to a plain `codex` so a running codex box stays visible before the first\n // hook fires (or on boxes whose image predates the codex hooks).\n if (b.codexActivity && b.codexActivity !== 'unknown') {\n agents.push(`codex:${b.codexActivity}`);\n } else if (b.codexSession?.running) {\n agents.push('codex');\n }\n if (b.opencodeSession?.running) agents.push('opencode');\n return agents.length > 0 ? agents.join(', ') : '-';\n}\n\nfunction renderTable(boxes: ListedBox[], stream: NodeJS.WriteStream): string {\n const header = ['N', 'NAME', 'STATE', 'AGENT', 'SHELLS', 'PROVIDER', 'URL', 'WORKSPACE'];\n const wsCol = header.length - 1;\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 // One column for every agent (claude / codex / opencode) — see agentSummary.\n plain(agentSummary(b)),\n // Live shell-session count; `-` for none (or a non-running box). Detail\n // lives in `agentbox shell ls <box>`.\n plain(b.shellSessions.length > 0 ? String(b.shellSessions.length) : '-'),\n plain(b.provider ?? 'docker'),\n urlCell(b, stream),\n ]);\n const leadHeader = header.slice(0, wsCol).map(plain);\n\n // Widths for the fixed columns (everything but WORKSPACE).\n const fixedCols = leadHeader.map((_, i) => i);\n const fixedWidths = fixedCols.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[wsCol]?.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[wsCol] 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 * `--global`. Pre-feature boxes have no `projectRoot`, so they surface only\n * under `--global` — 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 --global\\` to see all`;\n }\n return 'no boxes — run `agentbox create` to make one';\n }\n const table = renderTable(boxes, process.stdout);\n if (!scoped) return table;\n // basename of projectRoot — matches dashboard sidebar's projectLabel().\n const name = projectRoot.split('/').filter(Boolean).pop() ?? projectRoot;\n return `Project: ${name}\\n${table}`;\n}\n\nexport const listCommand = withWatchOptions(\n new Command('list')\n .alias('ls')\n .description('List agent boxes in the current project (-g for all)')\n .option('-j, --json', 'machine-readable JSON output')\n .option('-g, --global', '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.global ?? 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 { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface LogsOptions {\n tail: string;\n follow?: boolean;\n daemon?: boolean;\n}\n\nconst DAEMON_LOG_PATH = '/var/log/agentbox/ctl-daemon.log';\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 .option(\n '--daemon',\n \"tail the in-box agentbox-ctl daemon log instead of a service log (the supervisor's own stdout/stderr)\",\n )\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 // `--daemon` reads the supervisor's own log file, not a service from\n // agentbox.yaml — accept no service arg in that case.\n if (!service && !opts.daemon) {\n log.error('missing <service> argument');\n log.info('usage: agentbox logs [box] <service> [-n N] [-f]');\n log.info(' agentbox logs [box] --daemon [-n N] [-f]');\n process.exit(2);\n }\n\n const box = await resolveBoxOrExit(idOrName);\n const provider = await providerForBox(box);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n const tail = String(Number.parseInt(opts.tail, 10) || 200);\n // For --daemon: tail the raw file (the daemon log isn't managed by\n // the in-box ctl's structured logs pipeline — it's stdout/stderr).\n const args = opts.daemon\n ? opts.follow\n ? ['tail', '-n', tail, '-F', DAEMON_LOG_PATH]\n : ['tail', '-n', tail, DAEMON_LOG_PATH]\n : opts.follow\n ? ['agentbox-ctl', 'logs', service!, '--tail', tail, '--follow']\n : ['agentbox-ctl', 'logs', service!, '--tail', tail];\n\n if (!opts.follow) {\n // Non-follow returns once the snapshot dump is done — safe to round-trip\n // through provider.exec on both docker and cloud.\n const proc = await provider.exec(box, args, { user: 'vscode' });\n if (proc.exitCode !== 0) {\n log.error(\n `${opts.daemon ? 'daemon log' : 'agentbox-ctl logs'} failed: ${proc.stderr || proc.stdout}`,\n );\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. Docker keeps the spawn-docker-exec fast path so Ctrl-C\n // tears both ends down cleanly. Cloud goes through `provider.buildAttach`\n // which mints a fresh SSH token and runs `agentbox-ctl logs --follow`\n // directly (no tmux wrap — `kind: 'logs'` skips the tmux render).\n if (!isCloud) {\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 return;\n }\n\n if (!provider.buildAttach) {\n throw new Error(\n `provider '${provider.name}' does not support follow-mode log streaming`,\n );\n }\n // For --daemon over cloud we don't have a `logs` kind that maps to\n // tail-file. Use the `shell` kind in non-tmux mode and run the tail\n // argv directly via SSH.\n const spec = opts.daemon\n ? await provider.buildAttach(box, 'shell', {\n sessionName: 'daemon-logs',\n user: 'vscode',\n command: `tail -n ${tail} -F ${DAEMON_LOG_PATH}`,\n noTmux: true,\n })\n : await provider.buildAttach(box, 'logs', {\n service: service!,\n tail: Number.parseInt(tail, 10),\n follow: true,\n user: 'vscode',\n });\n const [argv0, ...rest] = spec.argv;\n if (!argv0) throw new Error('provider.buildAttach returned an empty argv');\n const child = spawn(argv0, rest, { stdio: ['ignore', 'inherit', 'inherit'] });\n const cleanup = async (): Promise<void> => {\n if (spec.cleanup) await spec.cleanup();\n };\n child.on('exit', async (code) => {\n await cleanup();\n process.exit(code ?? 0);\n });\n const term = (): void => {\n child.kill('SIGTERM');\n };\n process.on('SIGINT', term);\n process.on('SIGTERM', term);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { execa } from 'execa';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { BoxRecord } from '@agentbox/core';\nimport { openBoxInFinder } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { agentboxAliasFor, parseSshTarget, writeAgentboxSshAlias } from '../ssh-config.js';\nimport { runPath } from './path.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface OpenOpts {\n refresh: boolean; // commander gives `--no-refresh` => refresh=false\n includeNodeModules?: boolean;\n print?: boolean;\n path?: boolean;\n unmount?: boolean;\n}\n\nexport const openCommand = new Command('open')\n .description(\"Open a box's /workspace in Finder (docker: rsync'd snapshot; cloud: sshfs mount)\")\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-refresh', \"skip the rsync; open whatever's already on disk (docker only)\")\n .option(\n '--include-node-modules',\n 'include /workspace/node_modules in the merged export (docker only; off by default)',\n )\n .option('--path', 'print the host workspace / mount path instead of launching Finder')\n .option('--print', 'alias of --path')\n .option(\n '--unmount',\n 'cloud only: unmount any existing sshfs mount for the box and exit',\n )\n .action(async (idOrName: string | undefined, opts: OpenOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const provider = await providerForBox(box);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n if (isCloud) {\n await runCloudOpen(box, provider, opts);\n return;\n }\n\n if (opts.path || opts.print) {\n await runPath(box, {\n refresh: opts.refresh, // print refreshes by default; --no-refresh skips\n includeNodeModules: opts.includeNodeModules,\n });\n return;\n }\n\n const result = await openBoxInFinder(box.id, {\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 } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n/**\n * Cloud `open`: mount the sandbox's `/workspace` via sshfs at a per-box host\n * path (`~/.agentbox/mounts/<box-name>/`) and reveal in Finder. Reuses the\n * SSH alias `agentbox code` already manages — the alias maps to a fresh\n * 60-min Daytona SSH token, written into `~/.ssh/config` per call so sshfs\n * has a live target without baking the token into the mount itself.\n */\nasync function runCloudOpen(\n box: BoxRecord,\n provider: { name: string; buildAttach?: NonNullable<Awaited<ReturnType<typeof providerForBox>>['buildAttach']> },\n opts: OpenOpts,\n): Promise<void> {\n const mountRoot = join(homedir(), '.agentbox', 'mounts', box.name);\n\n if (opts.unmount) {\n const ok = await tryUnmount(mountRoot);\n if (ok) process.stdout.write(`unmounted ${mountRoot}\\n`);\n else process.stdout.write(`nothing mounted at ${mountRoot}\\n`);\n return;\n }\n\n if (opts.path || opts.print) {\n // Don't mount when we only print — print is meant to be lightweight.\n process.stdout.write(`${mountRoot}\\n`);\n return;\n }\n\n // sshfs is the load-bearing dep; macFUSE + sshfs are typically installed\n // via `brew install macfuse sshfs`. Fail with a clear hint instead of\n // a cryptic ENOENT.\n const sshfsBin = await locateBinary('sshfs');\n if (!sshfsBin) {\n throw new Error(\n 'sshfs not found on PATH. Install with `brew install macfuse sshfs` (macOS) or your distro\\'s package manager, then retry. Cloud `agentbox open` mounts the sandbox /workspace via sshfs.',\n );\n }\n\n if (!provider.buildAttach) {\n throw new Error(\n `cloud provider '${provider.name}' does not support SSH attach — \\`agentbox open\\` requires it for cloud boxes`,\n );\n }\n // Same SSH alias machinery `agentbox code` uses — mint a fresh 60-min token\n // and rewrite the alias every call so the user gets a live mount target.\n const spec = await provider.buildAttach(box, 'shell', { noTmux: true });\n const target = parseSshTarget(spec.argv);\n if (!target) {\n throw new Error(`could not parse <user>@<host> from cloud SSH argv: ${spec.argv.join(' ')}`);\n }\n const alias = agentboxAliasFor(box.name);\n await writeAgentboxSshAlias({\n alias,\n hostname: target.host,\n user: target.user,\n identityFile: target.identityFile,\n });\n\n // Ensure the mount dir exists. If something's already mounted there (a\n // stale mount from a previous run) we tear it down before re-mounting —\n // sshfs would otherwise error with \"mountpoint is not empty\".\n if (!existsSync(mountRoot)) {\n mkdirSync(mountRoot, { recursive: true, mode: 0o755 });\n } else if (await isMounted(mountRoot)) {\n log.info(`re-mounting (stale mount detected at ${mountRoot})`);\n await tryUnmount(mountRoot);\n }\n\n log.info(`mounting ${alias}:/workspace at ${mountRoot}`);\n const mount = await execa(\n sshfsBin,\n [\n `${alias}:/workspace`,\n mountRoot,\n // Foreground would block the CLI; default backgrounds the helper.\n '-o',\n 'reconnect',\n '-o',\n // `volname` makes Finder show a friendly label instead of `osxfuseN`.\n `volname=agentbox-${box.name}`,\n '-o',\n 'noappledouble',\n ],\n { reject: false },\n );\n if (mount.exitCode !== 0) {\n throw new Error(`sshfs mount failed (exit ${String(mount.exitCode)}): ${mount.stderr || mount.stdout}`);\n }\n // `open` on macOS reveals the dir in Finder. On non-macOS this is a no-op\n // / error — degrade silently because the mount path is already printed.\n await execa('open', [mountRoot], { reject: false });\n process.stdout.write(`opened ${mountRoot}\\n`);\n process.stdout.write(`unmount later with: agentbox open ${box.name} --unmount\\n`);\n}\n\nasync function locateBinary(name: string): Promise<string | null> {\n const r = await execa('which', [name], { reject: false });\n if (r.exitCode !== 0) return null;\n const path = (r.stdout ?? '').trim();\n return path.length > 0 ? path : null;\n}\n\nasync function isMounted(path: string): Promise<boolean> {\n // `mount` prints \"on <path>\" entries; grep for the mountpoint. macOS and\n // Linux both report it. Fallback to \"false\" on any exec error so we don't\n // wedge on a missing util.\n const r = await execa('sh', ['-c', `mount | grep -F \" on ${path} \"`], { reject: false });\n return r.exitCode === 0;\n}\n\nasync function tryUnmount(path: string): Promise<boolean> {\n // macOS prefers `umount`; some setups need `diskutil unmount`. Try both.\n if (await isMounted(path)) {\n const u = await execa('umount', [path], { reject: false });\n if (u.exitCode === 0) return true;\n const d = await execa('diskutil', ['unmount', path], { reject: false });\n return d.exitCode === 0;\n }\n return false;\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 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 { record, paths } = await getBoxHostPaths(box.id);\n\n if (opts.refresh) {\n const refreshed = await refreshExport(record, {\n includeNodeModules: opts.includeNodeModules,\n });\n process.stdout.write(`${refreshed.hostPath}\\n`);\n return;\n }\n\n process.stdout.write(`${paths.mergedExport}\\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const pauseCommand = new Command('pause')\n .description(\n 'Pause a box. Docker: `docker pause` (cgroup freeze — sub-second resume). Cloud: backend.pause (Daytona archive — cold storage; resume is slower but uses no quota while archived).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const record = await pauseBox(box.id);\n process.stdout.write(`paused ${record.container}\\n`);\n } else {\n await (await providerForBox(box)).pause(box);\n process.stdout.write(`paused ${box.name} (${box.provider} sandbox archived)\\n`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","/**\n * `agentbox prepare` — provider-neutral \"build the base image\" command.\n *\n * Three modes:\n *\n * - `agentbox prepare` → status only: show the inventory of\n * prepared base images / shared\n * volumes across all providers, plus\n * the project's pinned `box.image`.\n * - `agentbox prepare --provider X` → run prepare for X, then re-print\n * the relevant status section.\n * - `agentbox prepare --status` → status only (explicit; same as\n * no-args, but useful when scripted).\n *\n * Docker `prepare` builds `agentbox/box:dev` locally. Daytona `prepare`\n * builds a layered `Image` (Dockerfile.box + the three agent static tarballs)\n * and registers it via `daytona.snapshot.create({ name, image })`, then pins\n * `box.image: <name>` into the project config.\n *\n * Replaces the old `agentbox daytona publish-snapshot` (which used the\n * broken `_experimental_createSnapshot` API).\n */\n\nimport { intro, log, spinner } from '@clack/prompts';\nimport { loadEffectiveConfig, setConfigValue } from '@agentbox/config';\nimport {\n DEFAULT_BOX_IMAGE,\n SHARED_CLAUDE_VOLUME,\n SHARED_CODEX_VOLUME,\n SHARED_OPENCODE_VOLUME,\n imageInfo,\n volumeExists,\n type ImageInfo,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { getProvider, isKnownProvider } from '../provider/registry.js';\n\ninterface PrepareOptions {\n provider?: string;\n name?: string;\n force?: boolean;\n yes?: boolean;\n status?: boolean;\n}\n\ninterface DockerStatus {\n daemon: 'reachable' | 'unreachable';\n image?: ImageInfo;\n volumes: Array<{ name: string; exists: boolean }>;\n}\n\nasync function dockerStatus(): Promise<DockerStatus> {\n let img: ImageInfo;\n try {\n img = await imageInfo(DEFAULT_BOX_IMAGE);\n } catch {\n return { daemon: 'unreachable', volumes: [] };\n }\n const names = [SHARED_CLAUDE_VOLUME, SHARED_CODEX_VOLUME, SHARED_OPENCODE_VOLUME];\n const volumes = await Promise.all(\n names.map(async (name) => ({ name, exists: await volumeExists(name).catch(() => false) })),\n );\n return { daemon: 'reachable', image: img, volumes };\n}\n\nfunction humanBytes(n?: number): string {\n if (n === undefined || !Number.isFinite(n)) return '—';\n if (n >= 1024 ** 3) return `${(n / 1024 ** 3).toFixed(2)} GB`;\n if (n >= 1024 ** 2) return `${(n / 1024 ** 2).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${String(n)} B`;\n}\n\nfunction humanAge(iso?: string): string {\n if (!iso) return '—';\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return iso;\n const ageSec = Math.max(0, (Date.now() - t) / 1000);\n if (ageSec < 60) return `${ageSec.toFixed(0)}s ago`;\n if (ageSec < 3600) return `${(ageSec / 60).toFixed(0)}m ago`;\n if (ageSec < 86400) return `${(ageSec / 3600).toFixed(1)}h ago`;\n return `${(ageSec / 86400).toFixed(1)}d ago`;\n}\n\nfunction pad(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\nasync function renderDocker(status: DockerStatus): Promise<string[]> {\n const out: string[] = ['docker:'];\n if (status.daemon === 'unreachable') {\n out.push(' docker daemon unreachable (is Docker running?)');\n return out;\n }\n if (!status.image?.exists) {\n out.push(` image ${DEFAULT_BOX_IMAGE} (not built — run \\`agentbox prepare --provider docker\\`)`);\n } else {\n out.push(\n ` image ${pad(DEFAULT_BOX_IMAGE, 30)} ${pad(humanBytes(status.image.sizeBytes), 10)} built ${humanAge(status.image.createdAt)}`,\n );\n }\n for (const v of status.volumes) {\n if (v.exists) {\n out.push(` vol ${pad(v.name, 30)} present`);\n } else {\n out.push(` vol ${pad(v.name, 30)} (none — seeded lazily on first \\`agentbox claude/codex/opencode\\`)`);\n }\n }\n return out;\n}\n\ninterface DaytonaStatusUnknown {\n configured: false;\n reason?: string;\n}\ninterface DaytonaStatusOk {\n configured: true;\n snapshots: Array<{ name: string; state?: string; sizeGb?: number; createdAt?: string; errorReason?: string }>;\n volumes: Array<{ name: string; state?: string; lastUsedAt?: string }>;\n reason?: string;\n}\ntype DaytonaStatusResult = DaytonaStatusUnknown | DaytonaStatusOk;\n\nasync function daytonaStatus(): Promise<DaytonaStatusResult> {\n try {\n const mod = await import('@agentbox/sandbox-daytona');\n return (await mod.getDaytonaStatus()) as DaytonaStatusResult;\n } catch (err) {\n return { configured: false, reason: err instanceof Error ? err.message.split('\\n')[0] : String(err) };\n }\n}\n\nfunction renderDaytona(status: DaytonaStatusResult, pinnedImage?: string): string[] {\n const out: string[] = ['daytona:'];\n if (!status.configured) {\n out.push(\n ` (not configured — \\`agentbox daytona login\\` to set up${status.reason ? `; ${status.reason}` : ''})`,\n );\n return out;\n }\n if (status.reason) out.push(` warn: ${status.reason}`);\n if (status.snapshots.length === 0) {\n out.push(' no agentbox snapshots — run `agentbox prepare --provider daytona`');\n } else {\n for (const s of status.snapshots) {\n const sizeStr = s.sizeGb !== undefined ? `${s.sizeGb.toFixed(2)} GB` : '—';\n const pinned = pinnedImage && pinnedImage === s.name ? ' (pinned in project)' : '';\n const tail =\n s.state === 'error' && s.errorReason\n ? ` error: ${s.errorReason.slice(0, 80)}`\n : ` ${humanAge(s.createdAt)}`;\n out.push(\n ` snap ${pad(s.name, 40)} ${pad(s.state ?? '—', 10)} ${pad(sizeStr, 10)}${tail}${pinned}`,\n );\n }\n }\n if (status.volumes.length === 0) {\n out.push(' no agentbox volumes — created lazily on first cloud `agentbox create`');\n } else {\n for (const v of status.volumes) {\n const last = v.lastUsedAt ? ` last used ${humanAge(v.lastUsedAt)}` : '';\n out.push(` vol ${pad(v.name, 40)} ${pad(v.state ?? '—', 10)}${last}`);\n }\n }\n return out;\n}\n\nasync function showStatus(opts: { onlyProvider?: string }): Promise<void> {\n const cfg = await loadEffectiveConfig(process.cwd()).catch(() => null);\n const pinnedRaw = cfg?.effective.box.image;\n // Only treat as \"user-pinned\" if it differs from the docker default tag\n // — that one is just the fallback ref the docker provider builds locally.\n const pinned =\n typeof pinnedRaw === 'string' && pinnedRaw.length > 0 && pinnedRaw !== DEFAULT_BOX_IMAGE\n ? pinnedRaw\n : undefined;\n const lines: string[] = [];\n\n const wantDocker = !opts.onlyProvider || opts.onlyProvider === 'docker';\n const wantDaytona = !opts.onlyProvider || opts.onlyProvider === 'daytona';\n\n if (wantDocker) {\n const status = await dockerStatus();\n lines.push(...(await renderDocker(status)));\n }\n if (wantDaytona) {\n if (lines.length > 0) lines.push('');\n const status = await daytonaStatus();\n lines.push(...renderDaytona(status, pinned));\n }\n if (pinned) {\n lines.push('');\n lines.push(`project pin: box.image = ${pinned}`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nexport const prepareCommand = new Command('prepare')\n .description(\n 'Build base sandbox images / snapshots, or show what is already prepared across providers.',\n )\n .option(\n '-p, --provider <name>',\n 'provider to prepare (docker | daytona | hetzner). Omit for status-only.',\n )\n .option(\n '-n, --name <name>',\n 'snapshot name (Daytona only; default: agentbox-base-<timestamp>)',\n )\n .option('-f, --force', 'rebuild even if the image / snapshot already exists')\n .option('-y, --yes', 'skip confirmation prompts (cost / time warnings)')\n .option('--status', 'show status without preparing anything')\n .action(async (opts: PrepareOptions) => {\n // Status-only path: no provider, or explicit --status.\n if (!opts.provider || opts.status) {\n await showStatus({});\n return;\n }\n\n const providerName = opts.provider.trim();\n if (!isKnownProvider(providerName)) {\n process.stderr.write(\n `error: --provider must be one of: docker, daytona, hetzner\\n`,\n );\n process.exit(1);\n }\n\n intro(`preparing ${providerName} base image`);\n if (providerName === 'daytona' && !opts.yes && process.stdin.isTTY) {\n process.stdout.write(\n 'This will trigger a Daytona image build (~7 min cold, ~seconds with cache) and ' +\n 'register a named snapshot in your org.\\n' +\n 'Re-run with --yes to skip this notice.\\n',\n );\n }\n\n const provider = await getProvider(providerName);\n if (typeof provider.prepare !== 'function') {\n log.error(`provider '${providerName}' does not implement prepare`);\n process.exit(1);\n }\n\n const sp = spinner();\n sp.start(`preparing ${providerName}…`);\n try {\n const result = await provider.prepare({\n name: opts.name,\n hostWorkspace: process.cwd(),\n force: opts.force,\n onLog: (line) => sp.message(line.slice(0, 80)),\n });\n if (result.snapshotName !== undefined) {\n sp.stop(`prepared ${providerName}: snapshot '${result.snapshotName}'`);\n try {\n const written = await setConfigValue(\n 'project',\n 'box.image',\n result.snapshotName,\n process.cwd(),\n );\n log.success(`box.image = ${result.snapshotName} (written to ${written.path})`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n log.warn(\n `prepared snapshot '${result.snapshotName}', but failed to pin it into the project config: ${msg}\\n` +\n `Run \\`agentbox config set --project box.image ${result.snapshotName}\\` manually.`,\n );\n }\n } else {\n sp.stop(`prepared ${providerName}`);\n }\n\n // Show the relevant status section after a successful prepare.\n process.stdout.write('\\n');\n await showStatus({ onlyProvider: providerName });\n log.info(\n 'tip: install the agentbox host skill so Claude Code on this machine can drive AgentBox for you:\\n' +\n ' npx skills add https://github.com/madarco/agentbox --skill agentbox',\n );\n } catch (err) {\n sp.stop(`prepare failed: ${describeError(err)}`);\n process.exit(1);\n }\n });\n\n/**\n * Unwrap the cause chain on Error objects so opaque wrappers like Node's\n * `TypeError: fetch failed` (whose `.message` carries zero context but\n * whose `.cause` is e.g. `{ code: 'ECONNREFUSED', address, port }`)\n * surface the real reason in the CLI's one-line failure message.\n */\nfunction describeError(err: unknown): string {\n if (!(err instanceof Error)) return String(err);\n const parts: string[] = [err.message];\n let cause: unknown = (err as Error & { cause?: unknown }).cause;\n // Bound the walk so a cyclic / pathological cause chain can't OOM.\n for (let i = 0; i < 5 && cause; i++) {\n if (cause instanceof Error) {\n parts.push(`caused by: ${cause.message}`);\n const code = (cause as Error & { code?: unknown }).code;\n if (typeof code === 'string') parts.push(`(${code})`);\n cause = (cause as Error & { cause?: unknown }).cause;\n } else if (typeof cause === 'object') {\n parts.push(`caused by: ${JSON.stringify(cause)}`);\n break;\n } else {\n parts.push(`caused by: ${String(cause)}`);\n break;\n }\n }\n return parts.join(' — ');\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { pruneOrphanProjectConfigs } from '@agentbox/config';\nimport type { CloudSandboxSummary } from '@agentbox/core';\nimport { readState } from '@agentbox/sandbox-core';\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 provider?: string;\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 .option(\n '--provider <name>',\n 'restrict prune to a specific provider (docker | daytona). For daytona, lists cloud sandboxes that are not in this CLI\\'s state.json and offers to delete them.',\n )\n .action(async (opts: PruneOptions) => {\n try {\n if (opts.provider === 'daytona') {\n await pruneDaytona(opts);\n return;\n }\n if (opts.provider !== undefined && opts.provider !== 'docker') {\n log.error(`unknown provider '${opts.provider}'; expected docker or daytona`);\n process.exit(2);\n }\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\n/**\n * Daytona orphan-sandbox prune. Lists every sandbox the configured\n * credentials can see, cross-references against this CLI's local\n * `state.json`, and offers to delete the ones the user no longer tracks\n * (typically: a harness timeout killed the create before `recordBox`\n * ran, leaving a half-provisioned billable sandbox lingering).\n *\n * Read-only without `--yes`: prints the orphan list and confirms before\n * deleting. With `--dry-run`, only prints.\n */\nasync function pruneDaytona(opts: PruneOptions): Promise<void> {\n const dryRun = opts.dryRun ?? false;\n const { daytonaBackend } = await import('@agentbox/sandbox-daytona');\n if (!daytonaBackend.list) {\n log.error(\"daytona backend doesn't expose `list()`; cannot enumerate sandboxes for prune\");\n process.exit(2);\n }\n const [remote, state] = await Promise.all([daytonaBackend.list(), readState()]);\n const knownIds = new Set<string>();\n for (const b of state.boxes) {\n if ((b.provider ?? 'docker') === 'daytona' && b.cloud?.sandboxId) {\n knownIds.add(b.cloud.sandboxId);\n }\n }\n // Anything we created (labelled by us via `labels: { 'agentbox.name': ... }`)\n // but isn't in state is an orphan we should offer to clean up. Sandboxes\n // the user provisioned through other tooling shouldn't be touched —\n // identify ours by the `agentbox.name` label OR by an `agentbox-cloud-`\n // legacy name prefix.\n const orphans: CloudSandboxSummary[] = remote.filter((sb) => {\n if (knownIds.has(sb.sandboxId)) return false;\n const friendly = sb.name ?? '';\n // The provision call sets `labels: { 'agentbox.name': req.name }` —\n // `summary.name` mirrors that label when present.\n return friendly.length > 0;\n });\n if (orphans.length === 0) {\n process.stdout.write('no daytona orphans found\\n');\n return;\n }\n log.info(`found ${String(orphans.length)} daytona sandbox(es) not in this CLI's state:`);\n for (const sb of orphans) {\n const parts = [sb.sandboxId];\n if (sb.name) parts.push(sb.name);\n if (sb.state) parts.push(sb.state);\n if (sb.createdAt) parts.push(sb.createdAt);\n process.stdout.write(` ${parts.join(' ')}\\n`);\n }\n if (dryRun) return;\n if (!opts.yes) {\n const ok = await confirm({\n message: `Delete ${String(orphans.length)} orphan sandbox(es)?`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n let deleted = 0;\n let failed = 0;\n for (const sb of orphans) {\n try {\n await daytonaBackend.destroy({ sandboxId: sb.sandboxId });\n deleted++;\n } catch (err) {\n failed++;\n log.warn(\n `delete ${sb.sandboxId} failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n process.stdout.write(\n `daytona prune: deleted ${String(deleted)}, failed ${String(failed)}\\n`,\n );\n}\n","import { readFile, stat } from 'node:fs/promises';\nimport { intro, log, outro } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { readState } from '@agentbox/sandbox-core';\nimport {\n deleteJob,\n loadQueue,\n loadQueueConfig,\n readJob,\n writeJob,\n type QueueJob,\n type QueueJobStatus,\n} from '@agentbox/relay';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\n\ninterface QueueListOpts {\n all?: boolean;\n}\n\nconst TERMINAL_STATUSES: ReadonlySet<QueueJobStatus> = new Set(['done', 'failed', 'cancelled']);\n\nexport const queueCommand = new Command('queue')\n .description('Inspect and manage background `agentbox claude|codex|opencode -i` jobs');\n\nconst queueListCommand = new Command('list')\n .description('List queued, running, and (with --all) terminal background jobs')\n .option('--all', 'include done/failed/cancelled jobs (default: hide terminal)')\n .action(async (opts: QueueListOpts) => {\n const jobs = await loadQueue();\n const cfg = await loadQueueConfig();\n const visible = opts.all === true ? jobs : jobs.filter((j) => !TERMINAL_STATUSES.has(j.status));\n if (visible.length === 0) {\n log.info(opts.all ? 'no queued jobs.' : 'no active queued jobs (--all to see terminal).');\n log.info(`queue.maxConcurrent = ${String(cfg.maxConcurrent)} (queue.enabled=${String(cfg.enabled)})`);\n return;\n }\n // Build a compact ASCII table; one row per job. Keep columns predictable so\n // it greps cleanly (id is the unique handle for cancel/show).\n const rows = visible.map((j) => ({\n id: j.id,\n status: j.status,\n agent: j.agent,\n box: j.boxName || '(auto)',\n provider: j.providerName,\n max: String(j.maxConcurrent),\n age: formatAge(j.createdAt),\n prompt: truncate(j.prompt, 48),\n }));\n const headers = ['id', 'status', 'agent', 'box', 'provider', 'max', 'age', 'prompt'] as const;\n const widths = headers.map((h) =>\n Math.max(h.length, ...rows.map((r) => String(r[h as keyof typeof r]).length)),\n );\n const pad = (s: string, w: number): string => s + ' '.repeat(Math.max(0, w - s.length));\n process.stdout.write(headers.map((h, i) => pad(h, widths[i]!)).join(' ') + '\\n');\n process.stdout.write(widths.map((w) => '-'.repeat(w)).join(' ') + '\\n');\n for (const r of rows) {\n process.stdout.write(\n headers.map((h, i) => pad(String(r[h as keyof typeof r]), widths[i]!)).join(' ') + '\\n',\n );\n }\n log.info(`queue.maxConcurrent = ${String(cfg.maxConcurrent)} (queue.enabled=${String(cfg.enabled)})`);\n });\n\nconst queueShowCommand = new Command('show')\n .description('Dump a job manifest and tail its log')\n .argument('<id>', 'queue job id (from `agentbox queue list`)')\n .option('--tail <n>', 'lines of log to print (default: 50)', '50')\n .action(async (id: string, opts: { tail: string }) => {\n const job = await readJob(id);\n if (!job) {\n log.error(`no job with id ${id}`);\n process.exit(1);\n }\n process.stdout.write(JSON.stringify(job, null, 2) + '\\n');\n const tailN = Number.parseInt(opts.tail, 10) || 50;\n try {\n await stat(job.logPath);\n const text = await readFile(job.logPath, 'utf8');\n const lines = text.split(/\\r?\\n/);\n const slice = lines.slice(Math.max(0, lines.length - tailN - 1));\n process.stdout.write(`\\n--- last ${String(tailN)} lines of ${job.logPath} ---\\n`);\n process.stdout.write(slice.join('\\n'));\n if (!slice.join('\\n').endsWith('\\n')) process.stdout.write('\\n');\n } catch {\n log.info(`(no log at ${job.logPath} yet)`);\n }\n });\n\nconst queueCancelCommand = new Command('cancel')\n .description('Cancel a queued job; running jobs are NOT killed — use `agentbox destroy` instead')\n .argument('<id>', 'queue job id (from `agentbox queue list`)')\n .action(async (id: string) => {\n intro(`Cancelling queue job ${id}...`);\n const job = await readJob(id);\n if (!job) {\n log.error(`no job with id ${id}`);\n process.exit(1);\n }\n if (job.status !== 'queued') {\n log.error(\n `job ${id} is ${job.status}; cancel only flips 'queued' → 'cancelled'.` +\n (job.status === 'running' ? ` Use 'agentbox destroy ${job.boxName || id}' to stop the box.` : ''),\n );\n process.exit(1);\n }\n const cancelled: QueueJob = {\n ...job,\n status: 'cancelled',\n finishedAt: new Date().toISOString(),\n reason: 'cancelled by user',\n };\n await writeJob(cancelled);\n outro(`job ${id} cancelled`);\n });\n\nconst queueClearCommand = new Command('clear')\n .description('Sweep terminal-state manifests from ~/.agentbox/queue/')\n .option('--done', 'remove done jobs')\n .option('--failed', 'remove failed jobs')\n .option('--cancelled', 'remove cancelled jobs')\n .option('--all', 'remove every terminal-state job (done + failed + cancelled)')\n .action(async (opts: { done?: boolean; failed?: boolean; cancelled?: boolean; all?: boolean }) => {\n const targets = new Set<QueueJobStatus>();\n if (opts.all === true || opts.done === true) targets.add('done');\n if (opts.all === true || opts.failed === true) targets.add('failed');\n if (opts.all === true || opts.cancelled === true) targets.add('cancelled');\n if (targets.size === 0) {\n log.error('pick at least one of: --done, --failed, --cancelled, --all');\n process.exit(2);\n }\n const jobs = await loadQueue();\n let removed = 0;\n for (const j of jobs) {\n if (!targets.has(j.status)) continue;\n await deleteJob(j.id);\n removed += 1;\n }\n log.success(`removed ${String(removed)} manifest${removed === 1 ? '' : 's'}`);\n });\n\nconst QUEUE_WAIT_EVENTS = [\n 'new-box',\n 'empty-queue',\n 'box-paused',\n 'box-running',\n 'box-stopped',\n 'job-done',\n] as const;\ntype QueueWaitEvent = (typeof QUEUE_WAIT_EVENTS)[number];\n\nconst ACTIVE_JOB_STATUSES: ReadonlySet<QueueJobStatus> = new Set(['queued', 'running']);\nconst DEFAULT_QUEUE_WAIT_TIMEOUT_MS = 10 * 60 * 1000;\nconst QUEUE_POLL_INTERVAL_MS = 500;\n\ninterface QueueWaitOpts {\n box?: string;\n job?: string;\n timeout?: string;\n json?: boolean;\n}\n\nconst queueWaitForCommand = new Command('wait-for')\n .description(\n `Block until a queue / box event fires. <event> one of: ${QUEUE_WAIT_EVENTS.join(' | ')}.`,\n )\n .argument('<event>', `target event: ${QUEUE_WAIT_EVENTS.join(' | ')}`)\n .option('--box <ref>', 'box ref (required for box-paused / box-running / box-stopped)')\n .option('--job <id>', 'queue job id (required for job-done)')\n .option('--timeout <ms>', `wall-clock cap (default: ${String(DEFAULT_QUEUE_WAIT_TIMEOUT_MS)})`)\n .option('--json', 'emit a JSON envelope { matched, elapsedMs, ... }')\n .action(async (eventRaw: string, opts: QueueWaitOpts) => {\n if (!QUEUE_WAIT_EVENTS.includes(eventRaw as QueueWaitEvent)) {\n log.error(`unknown event '${eventRaw}' (one of: ${QUEUE_WAIT_EVENTS.join(', ')})`);\n process.exit(2);\n }\n const event = eventRaw as QueueWaitEvent;\n const timeoutMs =\n opts.timeout !== undefined\n ? parsePositiveInt(opts.timeout, '--timeout')\n : DEFAULT_QUEUE_WAIT_TIMEOUT_MS;\n const start = Date.now();\n const deadline = start + timeoutMs;\n\n try {\n const match = await waitForQueueEvent(event, opts, deadline);\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(JSON.stringify({ matched: true, event, elapsedMs, ...match }) + '\\n');\n }\n return;\n } catch (err) {\n if (err instanceof QueueWaitTimeout) {\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(JSON.stringify({ matched: false, event, elapsedMs }) + '\\n');\n } else {\n log.error(`'${event}' did not occur within ${String(timeoutMs)}ms`);\n }\n process.exit(1);\n }\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nclass QueueWaitTimeout extends Error {\n constructor() {\n super('queue wait-for timeout');\n this.name = 'QueueWaitTimeout';\n }\n}\n\nasync function waitForQueueEvent(\n event: QueueWaitEvent,\n opts: QueueWaitOpts,\n deadline: number,\n): Promise<Record<string, unknown>> {\n if (event === 'empty-queue') {\n return pollUntil(deadline, async () => {\n const jobs = await loadQueue();\n const active = jobs.filter((j) => ACTIVE_JOB_STATUSES.has(j.status));\n return active.length === 0 ? { activeCount: 0 } : undefined;\n });\n }\n\n if (event === 'new-box') {\n const initial = new Set((await readState()).boxes.map((b) => b.id));\n return pollUntil(deadline, async () => {\n const current = await readState();\n const fresh = current.boxes.find((b) => !initial.has(b.id));\n return fresh ? { boxId: fresh.id, boxName: fresh.name } : undefined;\n });\n }\n\n if (event === 'job-done') {\n if (!opts.job) {\n throw new Error('queue wait-for job-done requires --job <id>');\n }\n const jobId = opts.job;\n return pollUntil(deadline, async () => {\n const job = await readJob(jobId);\n if (!job) throw new Error(`no job with id ${jobId}`);\n const terminal: ReadonlySet<QueueJobStatus> = new Set(['done', 'failed', 'cancelled']);\n return terminal.has(job.status)\n ? { jobId: job.id, status: job.status, exitCode: job.exitCode ?? null }\n : undefined;\n });\n }\n\n // box-paused | box-running | box-stopped\n if (!opts.box) {\n throw new Error(`queue wait-for ${event} requires --box <ref>`);\n }\n const box = await resolveBoxOrExit(opts.box);\n const provider = await providerForBox(box);\n const targetMap: Record<'box-paused' | 'box-running' | 'box-stopped', readonly string[]> = {\n 'box-paused': ['paused'],\n 'box-running': ['running'],\n 'box-stopped': ['stopped', 'missing'],\n };\n const targets = new Set(targetMap[event]);\n return pollUntil(deadline, async () => {\n const state = await provider.probeState(box);\n return targets.has(state) ? { boxId: box.id, state } : undefined;\n });\n}\n\nasync function pollUntil<T>(\n deadline: number,\n probe: () => Promise<T | undefined>,\n): Promise<T> {\n while (Date.now() < deadline) {\n const result = await probe();\n if (result !== undefined) return result;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(QUEUE_POLL_INTERVAL_MS, remaining));\n }\n throw new QueueWaitTimeout();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction parsePositiveInt(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || String(n) !== raw.trim()) {\n throw new Error(`${label} must be a positive integer (got: ${raw})`);\n }\n return n;\n}\n\nqueueCommand.addCommand(queueListCommand);\nqueueCommand.addCommand(queueShowCommand);\nqueueCommand.addCommand(queueCancelCommand);\nqueueCommand.addCommand(queueClearCommand);\nqueueCommand.addCommand(queueWaitForCommand);\n\nfunction formatAge(iso: string): string {\n const ms = Date.now() - Date.parse(iso);\n if (!Number.isFinite(ms) || ms < 0) return '?';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${String(s)}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${String(m)}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${String(h)}h`;\n const d = Math.floor(h / 24);\n return `${String(d)}d`;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n}\n","import { log, spinner } from '@clack/prompts';\nimport {\n ensureRelay,\n getRelayStatus,\n rehydrateRelayRegistry,\n stopRelay,\n type RelayStatus,\n} from '@agentbox/sandbox-docker';\nimport { readState } from '@agentbox/sandbox-core';\nimport { Command } from 'commander';\nimport { handleLifecycleError } from './_errors.js';\n\n/**\n * After a fresh relay process starts (cold start or restart), it has no\n * in-memory box registry — and for cloud boxes that means no `CloudBoxPoller`\n * is running. Re-push every persisted (id, token, kind, preview…) so the\n * relay regains the same registry it had before the restart. Lifts the\n * cloud poller back up so status push + git push resume seamlessly.\n */\nasync function rehydrateFromState(): Promise<void> {\n const state = await readState();\n await rehydrateRelayRegistry(\n state.boxes.map((b) => ({\n id: b.id,\n name: b.name,\n provider: b.provider,\n container: b.container,\n createdAt: b.createdAt,\n relayToken: b.relayToken,\n projectIndex: b.projectIndex,\n gitWorktrees: b.gitWorktrees,\n cloudBackend: b.cloud?.backend,\n relayPreviewUrl: b.cloud?.relayPreviewUrl,\n relayPreviewToken: b.cloud?.relayPreviewToken,\n bridgeToken: b.cloud?.bridgeToken,\n })),\n );\n}\n\ninterface StatusOpts {\n json?: boolean;\n}\n\nfunction renderStatus(s: RelayStatus): string {\n if (s.running && s.health) {\n return [\n 'relay: running',\n ` pid: ${s.pid === null ? '?' : String(s.pid)}`,\n ` port: ${String(s.port)}`,\n ` url: ${s.endpoint.hostUrl}`,\n ` boxes: ${String(s.health.boxes)}`,\n ` events: ${String(s.health.events)}`,\n ` log: ${s.logFile}`,\n ].join('\\n');\n }\n if (s.pidAlive) {\n return [\n `relay: not responding (pid ${String(s.pid)} alive but /healthz silent)`,\n ` log: ${s.logFile}`,\n ].join('\\n');\n }\n return ['relay: not running', ` log: ${s.logFile}`].join('\\n');\n}\n\nconst statusSub = new Command('status')\n .description('Show whether the host relay is running, with pid / port / box count')\n .option('--json', 'emit RelayStatus as JSON')\n .action(async (opts: StatusOpts) => {\n try {\n const s = await getRelayStatus();\n if (opts.json) {\n process.stdout.write(JSON.stringify(s, null, 2) + '\\n');\n return;\n }\n process.stdout.write(renderStatus(s) + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst stopSub = new Command('stop')\n .description('Stop the host relay process (idempotent)')\n .action(async () => {\n try {\n const s = spinner();\n s.start('stopping relay');\n const result = await stopRelay();\n s.stop(\n result.stopped\n ? `stopped relay (pid ${String(result.pid)})`\n : 'relay was not running',\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst startSub = new Command('start')\n .description('Start the host relay if not already running (idempotent)')\n .action(async () => {\n try {\n const s = spinner();\n s.start('starting relay');\n const ep = await ensureRelay();\n await rehydrateFromState();\n s.stop(`relay running on ${ep.hostUrl}`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst restartSub = new Command('restart')\n .description('Stop then start the host relay')\n .action(async () => {\n try {\n const s = spinner();\n s.start('stopping relay');\n const stopped = await stopRelay();\n s.stop(\n stopped.stopped\n ? `stopped relay (pid ${String(stopped.pid)})`\n : 'relay was not running',\n );\n const s2 = spinner();\n s2.start('starting relay');\n try {\n const ep = await ensureRelay();\n await rehydrateFromState();\n s2.stop(`relay running on ${ep.hostUrl}`);\n } catch (err) {\n s2.stop('relay start failed');\n log.warn(err instanceof Error ? err.message : String(err));\n throw err;\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nexport const relayCommand = new Command('relay')\n .description('Manage the host relay process (status / stop / start / restart)')\n .addCommand(statusSub, { isDefault: true })\n .addCommand(stopSub)\n .addCommand(startSub)\n .addCommand(restartSub);\n","/**\n * Internal worker the relay's queue loop spawns as a detached child to run a\n * queued `-i` job. Hidden from `--help`. Reads a queue manifest by id, runs\n * the same `createBox` + `startXxxSession` codepath the foreground claude /\n * codex / opencode commands run in non-`-i` mode, then exits when tmux is up.\n * **Never** attaches — the in-box session keeps running for the user to\n * re-attach later.\n */\n\nimport { Command } from 'commander';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n createBox,\n rebuildPluginNativeDeps,\n SHARED_CLAUDE_VOLUME,\n startClaudeSession,\n startCodexSession,\n startOpencodeSession,\n ensureCodexInstalled,\n ensureOpencodeInstalled,\n} from '@agentbox/sandbox-docker';\nimport { readJob, writeJob, type QueueAgentKind, type QueueJob } from '@agentbox/relay';\nimport { resolveClaudeAuth } from '../auth.js';\nimport { resolveLimits } from '../limits.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { buildPromptArgs } from '../lib/queue/build-prompt-args.js';\n\nexport const runQueuedJobCommand = new Command('_run-queued-job')\n .description('internal: run a queued background agent job (do not invoke directly)')\n .argument('<id>', 'queue job id (from ~/.agentbox/queue/<id>.json)')\n .action(async (id: string) => {\n const log = openCommandLog(`queue-${id}`);\n log.write(`worker pid=${String(process.pid)} starting for job ${id}`);\n let job: QueueJob | null = null;\n try {\n job = await readJob(id);\n if (!job) {\n log.write(`FATAL: no manifest at id=${id}`);\n log.close();\n process.exit(64);\n }\n // The relay loop already flipped status to `running` and stamped its\n // pid; we don't double-stamp. If a future caller invokes this command\n // manually we still run, but the relay's accounting will be off — that\n // is the user's problem (and exactly why this command is hidden).\n\n // Run the create + session path. Cloud paths are intentionally NOT\n // supported here (the cloud agent attach starts the tmux session lazily\n // on first attach; with no attach there's nowhere to seed the prompt).\n // The submit-side already rejected cloud in that case.\n await runDockerJob(job, log);\n\n const done: QueueJob = {\n ...job,\n status: 'done',\n finishedAt: new Date().toISOString(),\n exitCode: 0,\n };\n await writeJob(done);\n log.write(`done`);\n log.close();\n process.exit(0);\n } catch (err) {\n const msg = err instanceof Error ? (err.stack ?? err.message) : String(err);\n log.write(`FAIL: ${msg}`);\n if (job) {\n try {\n const failed: QueueJob = {\n ...job,\n status: 'failed',\n finishedAt: new Date().toISOString(),\n reason: err instanceof Error ? err.message : String(err),\n exitCode: 1,\n };\n await writeJob(failed);\n } catch {\n /* best-effort */\n }\n }\n log.close();\n process.exit(1);\n }\n });\n\nasync function runDockerJob(job: QueueJob, log: ReturnType<typeof openCommandLog>): Promise<void> {\n const opts = job.createOpts;\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildOverridesFromJob(job),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const providerName = job.providerName || cfg.effective.box.provider || 'docker';\n if (providerName !== 'docker') {\n throw new Error(`worker only supports docker provider (got \"${providerName}\")`);\n }\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n\n // Auth resolution mirrors the foreground claude path; codex/opencode don't\n // need a host-env probe (they ride the in-box volume that login seeded).\n const resolved =\n job.agent === 'claude-code' ? await resolveClaudeAuth(process.env) : null;\n\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n\n log.write(`creating box for agent=${job.agent}`);\n const result = await createBox({\n workspacePath: opts.workspace,\n name: opts.name && opts.name.length > 0 ? opts.name : undefined,\n useSnapshot,\n checkpointRef,\n image: cfg.effective.box.image,\n claudeConfig:\n job.agent === 'claude-code'\n ? { isolate: cfg.effective.box.isolateClaudeConfig }\n : undefined,\n codexConfig:\n job.agent === 'codex'\n ? { isolate: cfg.effective.box.isolateCodexConfig }\n : undefined,\n opencodeConfig:\n job.agent === 'opencode'\n ? { isolate: cfg.effective.box.isolateOpencodeConfig }\n : undefined,\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 // Background jobs do not negotiate Portless interactively. If the user\n // explicitly set --portless / --no-portless we honor it, else leave\n // undefined so the create path skips the live prompt.\n portless: opts.portless,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => log.write(line),\n });\n log.write(`box created: ${result.record.container}`);\n\n const promptedArgs = buildPromptArgs(job.agent, job.prompt, job.agentArgs);\n\n if (job.agent === 'claude-code') {\n log.write(`checking plugin native deps`);\n await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => log.write(line),\n });\n log.write(`starting claude session`);\n await startClaudeSession({\n container: result.record.container,\n claudeArgs: promptedArgs,\n sessionName: cfg.effective.claude.sessionName,\n boxName: result.record.name,\n });\n } else if (job.agent === 'codex') {\n log.write(`checking codex`);\n await ensureCodexInstalled(result.record.container, {\n onProgress: (line) => log.write(line),\n });\n log.write(`starting codex session`);\n await startCodexSession({\n container: result.record.container,\n codexArgs: promptedArgs,\n sessionName: cfg.effective.codex.sessionName,\n });\n } else if (job.agent === 'opencode') {\n log.write(`checking opencode`);\n await ensureOpencodeInstalled(result.record.container, {\n onProgress: (line) => log.write(line),\n });\n log.write(`starting opencode session`);\n await startOpencodeSession({\n container: result.record.container,\n opencodeArgs: promptedArgs,\n sessionName: cfg.effective.opencode.sessionName,\n });\n } else {\n throw new Error(`unknown agent kind: ${String(job.agent satisfies QueueAgentKind)}`);\n }\n}\n\nfunction buildOverridesFromJob(job: QueueJob): Partial<UserConfig> {\n const opts = job.createOpts;\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 const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n if (opts.sessionName !== undefined) {\n if (job.agent === 'claude-code') out.claude = { sessionName: opts.sessionName };\n else if (job.agent === 'codex') out.codex = { sessionName: opts.sessionName };\n else if (job.agent === 'opencode') out.opencode = { sessionName: opts.sessionName };\n }\n return out;\n}\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n buildVncUrls,\n detectEngine,\n ensureBoxBrowser,\n inspectBox,\n readBoxStatus,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface ScreenOptions {\n print?: boolean;\n loopback?: boolean;\n ttl?: string;\n}\n\n/** Daytona's signed-URL ceiling is 24h; mirror `agentbox url`'s clamp. */\nconst SIGNED_URL_TTL_MIN = 1;\nconst SIGNED_URL_TTL_MAX = 86400;\n\nfunction parseTtlOrExit(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < SIGNED_URL_TTL_MIN || n > SIGNED_URL_TTL_MAX) {\n throw new Error(\n `--ttl must be an integer between ${String(SIGNED_URL_TTL_MIN)} and ${String(SIGNED_URL_TTL_MAX)} seconds`,\n );\n }\n return n;\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', 'docker only: use the 127.0.0.1 URL instead of the OrbStack .orb.local URL')\n .option(\n '--ttl <seconds>',\n 'cloud only: signed-URL expiry in seconds (default 3600, max 86400)',\n )\n .action(async (idOrName: string | undefined, opts: ScreenOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const provider = box.provider ?? 'docker';\n\n if (!box.vncEnabled) {\n throw new Error(`VNC is disabled for box ${box.name} — recreate without \\`--no-vnc\\``);\n }\n\n let url: string;\n if (provider === 'docker') {\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');\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 // Point the in-box browser at the box's web service so the app is shown\n // *inside* the VNC desktop (the host browser only gets the noVNC viewer).\n // Prefer the Portless URL — `ensureBoxBrowser` routes it back out to the\n // host proxy, so the app loads on the exact URL the host browser uses\n // (one origin both sides). Fall back to the in-box `127.0.0.1:<port>` when\n // there's no Portless route; a neutral page when no web service at all.\n const persisted = await readBoxStatus(box);\n const exposePort = persisted?.services.find((s) => s.expose)?.expose?.port;\n const inBoxUrl =\n exposePort !== undefined\n ? (box.portlessUrl ?? `http://localhost:${String(exposePort)}`)\n : 'about:blank';\n\n const br = await ensureBoxBrowser(box.container, undefined, inBoxUrl);\n if (br.up && !br.alreadyRunning) {\n log.info(\n exposePort !== undefined\n ? `opened ${inBoxUrl} in the in-box browser (visible in the VNC view)`\n : 'started in-box browser',\n );\n } else if (br.alreadyRunning) {\n log.info('in-box browser already running; left it untouched');\n } else {\n log.warn(`could not start in-box browser: ${br.reason ?? 'unknown'}`);\n }\n\n const engine = await detectEngine();\n const urls = buildVncUrls(box, engine);\n // Preference when --loopback is off: portless > orb.local > loopback.\n // Portless gives a stable name across box restarts (loopback port\n // rerolls every `docker run`); orb.local is OrbStack-only; loopback is\n // the always-available fallback. `--loopback` forces the raw port.\n const resolved = opts.loopback\n ? urls.loopbackUrl\n : (urls.portlessUrl ?? urls.orbUrl ?? urls.loopbackUrl);\n if (!resolved) {\n throw new Error(\n `VNC URL unavailable (daemon may not be up); try \\`agentbox inspect ${box.name}\\``,\n );\n }\n url = resolved;\n } else {\n // Cloud provider: lifecycle handled by the provider; URL is a signed\n // preview URL for the in-box noVNC port (6080) — the host browser\n // can open it directly without a custom header.\n if (!box.vncPassword) {\n throw new Error(\n `cloud box ${box.name} has no VNC password recorded — recreate it to enable \\`agentbox screen\\``,\n );\n }\n const ttl = parseTtlOrExit(opts.ttl);\n const p = await providerForBox(box);\n const state = await p.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await p.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await p.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n const base = await p.resolveUrl(box, { kind: 'vnc', ttl });\n // Append noVNC's auto-connect query so the browser jumps straight to\n // the desktop without prompting for a password — same shape Docker's\n // `buildVncUrls` produces. Strip any trailing slash from the signed\n // host so the path concatenation stays canonical.\n url = `${base.replace(/\\/$/, '')}/vnc.html?autoconnect=1&password=${encodeURIComponent(box.vncPassword)}`;\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 { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { loadEffectiveConfig, type UserConfig } from '@agentbox/config';\nimport {\n allocateShellSessionName,\n buildShellSessionAttachArgv,\n DEFAULT_RELAY_PORT,\n DEFAULT_SHELL_SESSION,\n formatDetachNotice,\n inspectBox,\n killShellSession,\n listShellSessions,\n parseShellSessionList,\n shellLabel,\n shellSessionInfo,\n shellSessionName,\n startBox,\n startShellSession,\n unpauseBox,\n type BoxRecord,\n type ShellSessionSummary,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { handleLifecycleError } from './_errors.js';\nimport { requireDockerProvider } from './_provider-guard.js';\n\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/** Wrap a string in single quotes for safe embedding in a shell command. */\nfunction shellSingle(s: string): string {\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\ninterface ShellOptions {\n user?: string;\n login?: boolean;\n tmux?: boolean; // commander: --no-tmux => false; default true\n /** -n/--name: the shell label (default shell when unset). */\n name?: string;\n /** --new: open a fresh auto-numbered shell instead of the default. */\n new?: 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 if (opts.tmux === false) shell.tmux = false;\n return Object.keys(shell).length > 0 ? { shell } : {};\n}\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\n/** ` -n <label>` suffix for the reattach hint — empty for the default shell. */\nfunction detachSuffix(sessionName: string): string {\n const label = shellLabel(sessionName);\n return label === DEFAULT_SHELL_SESSION ? '' : ` -n ${label}`;\n}\n\n/** Compact relative time, e.g. `3m ago`; `-` when unknown. */\nfunction fmtAgo(iso: string | null): string {\n if (!iso) return '-';\n const ms = Date.now() - new Date(iso).getTime();\n if (!Number.isFinite(ms) || ms < 0) return '-';\n const s = Math.round(ms / 1000);\n if (s < 60) return `${String(s)}s ago`;\n const m = Math.round(s / 60);\n if (m < 60) return `${String(m)}m ago`;\n const h = Math.round(m / 60);\n if (h < 24) return `${String(h)}h ago`;\n return `${String(Math.round(h / 24))}d ago`;\n}\n\n/** Auto-unpause/start the box so it's running. Mirrors `agentbox code` /\n * `agentbox claude start`. `startBox` relaunches ctl/vnc/dockerd. */\nasync function ensureBoxRunning(box: BoxRecord): Promise<void> {\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');\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\n/**\n * Resolve which tmux session `agentbox shell` should target: an explicit\n * `-n <label>` wins; `--new` allocates the lowest-free `shell-N`; otherwise\n * the box's default `shell`.\n */\nasync function resolveTargetSession(\n box: BoxRecord,\n user: string,\n opts: ShellOptions,\n): Promise<string> {\n if (opts.name !== undefined && opts.name.trim() !== '') {\n return shellSessionName(opts.name);\n }\n if (opts.new) {\n const existing = await listShellSessions(box.container, user);\n return allocateShellSessionName(existing.map((s) => s.sessionName));\n }\n return DEFAULT_SHELL_SESSION;\n}\n\n/**\n * Cloud equivalent of {@link resolveTargetSession}. Lists tmux sessions\n * over `provider.exec` (`tmux list-sessions -F …` over SSH) and reuses\n * the pure-string `allocateShellSessionName` helper. Empty list / tmux\n * server not running / exec failure all degrade to \"default `shell`\".\n */\nasync function resolveCloudShellSessionName(\n box: BoxRecord,\n provider: { exec: (b: BoxRecord, argv: string[], opts?: { user?: string }) => Promise<{ exitCode: number; stdout: string }> },\n user: string,\n opts: ShellOptions,\n): Promise<string> {\n if (opts.name !== undefined && opts.name.trim() !== '') {\n return shellSessionName(opts.name);\n }\n if (!opts.new) return DEFAULT_SHELL_SESSION;\n const r = await provider\n .exec(\n box,\n [\n 'tmux',\n 'list-sessions',\n '-F',\n '#{session_name}\\t#{session_created}\\t#{session_attached}',\n ],\n { user },\n )\n .catch(() => ({ exitCode: 1, stdout: '' }));\n // tmux server-not-running prints \"no server running\" on stderr and exits 1.\n // Empty session list → use the default name.\n if (r.exitCode !== 0) return DEFAULT_SHELL_SESSION;\n const existing = parseShellSessionList(r.stdout).map((s) => s.sessionName);\n return allocateShellSessionName(existing);\n}\n\ninterface ShellSessionCfg {\n user: string;\n login: boolean;\n sessionName: string;\n}\n\n/**\n * Start-or-attach a box's shell tmux session, then hand the docker\n * tmux-attach argv to the node-pty wrapper (footer + `Ctrl+a d` detach).\n * Process-exits with the inner pty's code. The box must already be running.\n */\nasync function startOrAttachShell(box: BoxRecord, cfg: ShellSessionCfg): Promise<never> {\n const label = shellLabel(cfg.sessionName);\n const info = await shellSessionInfo(box.container, cfg.sessionName, cfg.user);\n if (info.running) {\n log.info(`reattaching to shell \"${label}\" — Control+a d to detach`);\n } else {\n await startShellSession({\n container: box.container,\n sessionName: cfg.sessionName,\n user: cfg.user,\n login: cfg.login,\n });\n log.info(`shell \"${label}\" — Control+a d to detach, leaves it running`);\n }\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildShellSessionAttachArgv(box.container, cfg.sessionName, cfg.user),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'shell',\n detachable: true,\n detachNotice: formatDetachNotice(reattachRef(box), 'shell', detachSuffix(cfg.sessionName)),\n });\n process.exit(code);\n}\n\nexport const shellCommand = new Command('shell')\n .description(\n 'Open an interactive shell in a box, in a detachable tmux session (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 .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 .option('--no-tmux', 'run a plain docker exec shell instead of a detachable tmux session')\n .option('-n, --name <label>', 'open/attach a named shell session (a box can hold several)')\n .option('--new', 'open a fresh, auto-numbered shell session (shell-2, shell-3, ...)')\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 const tmux = cfg.effective.shell.tmux;\n\n // Cloud boxes: attach via SSH (provider.buildAttach), not docker exec.\n // The flow keeps the same options (tmux session, one-shot cmd, etc.)\n // but goes over the SSH token Daytona mints per attach.\n if ((box.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(box);\n if (!provider.buildAttach) {\n throw new Error(`provider '${provider.name}' does not support interactive attach`);\n }\n const innerCmd =\n effectiveCmd.length > 0\n ? (login ? `bash -l -c ${shellSingle(effectiveCmd.join(' '))}` : `bash -c ${shellSingle(effectiveCmd.join(' '))}`)\n : (login ? 'bash -l' : 'bash');\n const oneShot = effectiveCmd.length > 0;\n // Resolve `--name` / `--new` like the docker branch: list existing\n // tmux shell sessions over SSH (`tmux list-sessions -F ...`) and\n // pick the next free `shell-N`. The session naming helpers in\n // sandbox-docker are pure string ops — safe to reuse here.\n const sessionName = await resolveCloudShellSessionName(box, provider, user, opts);\n const spec = await provider.buildAttach(box, 'shell', {\n sessionName,\n user,\n command: innerCmd,\n // One-shot exec or `--no-tmux` skips the tmux wrap.\n noTmux: oneShot || !tmux,\n });\n try {\n const code = await runWrappedAttach({\n container: box.name,\n command: spec.argv[0],\n dockerArgv: spec.argv.slice(1),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'shell',\n detachable: !oneShot && tmux,\n });\n process.exit(code);\n } finally {\n if (spec.cleanup) await spec.cleanup();\n }\n }\n\n await ensureBoxRunning(box);\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\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 isInteractive = process.stdout.isTTY && process.stdin.isTTY;\n\n // Plain `docker exec` argv — used for one-shot `-- cmd`, non-interactive\n // runs, and the interactive `--no-tmux` shell. One-shot/piped use is\n // never tmux-wrapped: machine-readable stdout and heredocs must stay\n // clean.\n const bashArgs: string[] = [];\n if (login) bashArgs.push('-l');\n if (effectiveCmd.length > 0) bashArgs.push('-c', effectiveCmd.join(' '));\n const ttyFlag = isInteractive ? '-it' : '-i';\n const plainArgv = [\n 'exec',\n ttyFlag,\n '-e',\n `TERM=${term}`,\n '--user',\n user,\n box.container,\n 'bash',\n ...bashArgs,\n ];\n\n // One-shot exec (`agentbox shell box -- cmd…`) and any piped use both\n // need machine-readable stdout — the wrapped pty would corrupt it with\n // a footer, and a tmux session makes no sense. Stay on the plain\n // spawnSync path in those cases (`-n` / `--new` don't apply).\n if (!isInteractive || effectiveCmd.length > 0) {\n const child = spawnSync('docker', plainArgv, { stdio: 'inherit' });\n process.exit(child.status ?? 0);\n }\n\n // Interactive shell. Default: run inside a detachable tmux session so\n // `Ctrl+a d` leaves it running (reattach with `agentbox shell attach`).\n // `--no-tmux` keeps the plain wrapped `docker exec` shell — closing the\n // terminal kills it.\n if (tmux) {\n const sessionName = await resolveTargetSession(box, user, opts);\n await startOrAttachShell(box, { user, login, sessionName });\n }\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: plainArgv,\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'shell',\n });\n process.exit(code);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst shellAttachCommand = new Command('attach')\n .description(\n 'Attach to a shell 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('--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 .option('-n, --name <label>', 'shell label to attach (default: the box default shell)')\n .action(async function (this: Command, idOrName: string | undefined) {\n try {\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n throw new Error('`agentbox shell attach` needs an interactive terminal.');\n }\n // optsWithGlobals merges parent + own options — the parent `shell`\n // command also defines `-n/--name`, so it parses the flag and this\n // subcommand reads it back through the merge.\n const opts = this.optsWithGlobals() as ShellOptions;\n const box = await resolveBoxOrExit(idOrName);\n requireDockerProvider(box, 'shell');\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: buildShellCliOverrides(opts),\n });\n await ensureBoxRunning(box);\n await startOrAttachShell(box, {\n user: cfg.effective.shell.user,\n login: cfg.effective.shell.login,\n sessionName: shellSessionName(opts.name),\n });\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nfunction renderShellTable(sessions: ShellSessionSummary[]): void {\n const header = ['SHELL', 'ATTACHED', 'CREATED'];\n const rows = sessions.map((s) => [s.label, s.attached ? 'attached' : '-', fmtAgo(s.createdAt)]);\n const widths = header.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => r[i]?.length ?? 0)),\n );\n const fmt = (cells: string[]): string =>\n cells.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' ').trimEnd();\n process.stdout.write(`${fmt(header)}\\n`);\n for (const r of rows) process.stdout.write(`${fmt(r)}\\n`);\n}\n\nconst shellLsCommand = new Command('ls')\n .description('List the shell tmux sessions running in a box')\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 requireDockerProvider(box, 'shell');\n const insp = await inspectBox(box.id);\n if (insp.state !== 'running') {\n log.info(`box ${box.name} is ${insp.state} — no live shell sessions`);\n return;\n }\n if (insp.shellSessions.length === 0) {\n log.info(\n `no shell sessions in ${box.name} — start one with: agentbox shell ${reattachRef(box)}`,\n );\n return;\n }\n renderShellTable(insp.shellSessions);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ninterface ShellKillOptions {\n name?: string;\n all?: boolean;\n}\n\nconst shellKillCommand = new Command('kill')\n .description('Kill a shell tmux session in a box (the shell and anything running in it)')\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('-n, --name <label>', 'shell label to kill (default: the box default shell)')\n .option('--all', 'kill every shell session in the box')\n .action(async function (this: Command, idOrName: string | undefined) {\n try {\n // optsWithGlobals: the parent `shell` command also defines `-n/--name`\n // (it parses the flag); `--all` is this subcommand's own.\n const opts = this.optsWithGlobals() as ShellKillOptions;\n const box = await resolveBoxOrExit(idOrName);\n requireDockerProvider(box, 'shell');\n const insp = await inspectBox(box.id);\n if (insp.state !== 'running') {\n log.info(`box ${box.name} is ${insp.state} — no shell sessions to kill`);\n return;\n }\n if (opts.all) {\n if (insp.shellSessions.length === 0) {\n log.info(`no shell sessions in ${box.name}`);\n return;\n }\n let killed = 0;\n for (const s of insp.shellSessions) {\n if (await killShellSession(box.container, s.sessionName)) killed++;\n }\n log.success(`killed ${String(killed)} shell session${killed === 1 ? '' : 's'} in ${box.name}`);\n return;\n }\n const target = shellSessionName(opts.name);\n const ok = await killShellSession(box.container, target);\n if (ok) log.success(`killed shell \"${shellLabel(target)}\" in ${box.name}`);\n else log.warn(`no shell \"${shellLabel(target)}\" in ${box.name} (already gone?)`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nshellCommand.addCommand(shellAttachCommand);\nshellCommand.addCommand(shellLsCommand);\nshellCommand.addCommand(shellKillCommand);\n","import { log } from '@clack/prompts';\nimport type { BoxRecord } from '@agentbox/core';\n\n/**\n * Bail out with a clear, actionable error when a Docker-specific command is\n * invoked against a non-Docker box. Use this in commands whose internals\n * (`docker exec`, named volumes, in-box tmux session probing, etc.) haven't\n * been re-implemented for the provider abstraction yet — better to fail fast\n * with a hint than to surface a confusing docker-not-found stack.\n *\n * Returns when the box is Docker-backed; calls `process.exit(2)` otherwise.\n */\nexport function requireDockerProvider(box: BoxRecord, commandName: string): void {\n const provider = box.provider ?? 'docker';\n if (provider === 'docker') return;\n log.error(\n `\\`agentbox ${commandName}\\` doesn't yet support cloud boxes (this box's provider is '${provider}').`,\n );\n log.info(\n \"Cloud-provider routing for this command is on the Phase 3 backlog. For now: use `agentbox url` for web access, `agentbox-ctl git push` from inside the sandbox via SSH/web terminal, or fall back to the cloud provider's own console.\",\n );\n process.exit(2);\n}\n","import { startBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const startCommand = new Command('start')\n .description(\n 'Start a stopped box. Docker: docker start + relaunch ctl/dockerd/vnc daemons. Cloud: backend.start, then re-resolve preview URLs/tokens, re-launch in-sandbox ctl/dockerd daemons, and re-register with the host relay (so the CloudBoxPoller resumes).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const { record } = await startBox(box.id);\n process.stdout.write(`started ${record.container}\\n`);\n } else {\n await (await providerForBox(box)).start(box);\n process.stdout.write(`started ${box.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 // Cloud boxes don't have a host Docker container to `docker exec` into for\n // a live status pull, and `inspectBox` is Docker-only. The persisted\n // box-status (mirrored by the host poller into ~/.agentbox/boxes/<id>/\n // status.json) carries the same service / task / ports info. Delegate to\n // the inspect renderer's cloud branch — it surfaces all of it.\n if ((box.provider ?? 'docker') !== 'docker') {\n await runInspect(box, { json: opts.json, watch: opts.watch, interval: opts.interval });\n return;\n }\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 out.push('', 'SHELLS', renderShells(inspected));\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 renderShells(i: InspectedBox): string {\n if (i.state !== 'running') return ' (box not running)';\n if (i.shellSessions.length === 0) {\n return ' (none — start one with `agentbox shell`)';\n }\n return i.shellSessions\n .map((s) => ` ${s.label} ${s.attached ? 'attached' : 'detached'}`)\n .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","import { log } from '@clack/prompts';\nimport {\n inspectBox,\n projectCheckpointImageBytes,\n readBoxStatus,\n type BoxRecord,\n type InspectedBox,\n} from '@agentbox/sandbox-docker';\nimport { renderEndpointLines } from '../endpoints-render.js';\nimport { fmtBytes } from '../fmt.js';\nimport { providerForBox } from '../provider/registry.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 // checkpoint image size only when this box was started from one; otherwise\n // skip the row (no image -> no number to show, and projectCheckpointImageBytes\n // needs an explicit checkpoint name to resolve).\n const ckptName = i.record.checkpointSource?.ref;\n const projectRoot = i.record.projectRoot ?? i.record.workspacePath;\n const ckptBytes = ckptName ? await projectCheckpointImageBytes(projectRoot, ckptName) : null;\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 `workspace ${i.record.workspacePath} (container fs at /workspace)`,\n `project ${i.record.projectRoot ?? '(unset — pre-feature box)'}`,\n `n ${typeof i.record.projectIndex === 'number' ? String(i.record.projectIndex) : '(none)'}`,\n `claude config ${i.record.claudeConfigVolume ?? '(none)'}`,\n `claude session ${renderClaudeSession(i)}`,\n `claude activity ${renderClaudeActivity(i)}`,\n `codex config ${i.record.codexConfigVolume ?? '(none)'}`,\n `codex session ${renderCodexSession(i)}`,\n `codex activity ${renderCodexActivity(i)}`,\n `opencode cfg ${i.record.opencodeConfigVolume ?? '(none)'}`,\n `opencode sess ${renderOpencodeSession(i)}`,\n `shells ${renderShells(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)'}`,\n `snapshot size ${fmtBytes(i.snapshotSizeBytes)}`,\n `checkpoint ${renderCheckpoint(i, ckptBytes)}`,\n `host export ${i.hostPaths.mergedExport} (run \\`agentbox open\\` to refresh)`,\n `created ${i.record.createdAt}`,\n ];\n return lines.join('\\n');\n}\n\nfunction renderCheckpoint(i: InspectedBox, sizeBytes: number | null): string {\n const src = i.record.checkpointSource;\n if (!src || !i.record.checkpointImage) return '(none)';\n const sizePart = sizeBytes !== null ? ` ${fmtBytes(sizeBytes)}` : '';\n return `${src.ref} (${src.type}, chain ${src.chain.length}) → ${i.record.checkpointImage}${sizePart}`;\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 renderCodexSession(i: InspectedBox): string {\n if (i.codexSession === null) return '(n/a — box not running)';\n if (!i.codexSession.running) return `not running (\"${i.codexSession.sessionName}\")`;\n const since = i.codexSession.startedAt ? ` since ${i.codexSession.startedAt}` : '';\n const title = i.persistedStatus?.codex?.sessionTitle;\n return `running (\"${i.codexSession.sessionName}\")${since}${title ? ` — ${title}` : ''}`;\n}\n\nfunction renderCodexActivity(i: InspectedBox): string {\n const c = i.persistedStatus?.codex;\n if (!c) return '(none)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\n}\n\nfunction renderOpencodeSession(i: InspectedBox): string {\n if (i.opencodeSession === null) return '(n/a — box not running)';\n if (!i.opencodeSession.running) return `not running (\"${i.opencodeSession.sessionName}\")`;\n const since = i.opencodeSession.startedAt ? ` since ${i.opencodeSession.startedAt}` : '';\n const title = i.persistedStatus?.opencode?.sessionTitle;\n return `running (\"${i.opencodeSession.sessionName}\")${since}${title ? ` — ${title}` : ''}`;\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 renderShells(i: InspectedBox): string {\n if (i.state !== 'running') return '(n/a — box not running)';\n const s = i.shellSessions;\n if (s.length === 0) return 'none';\n return `${String(s.length)} (${s.map((x) => x.label).join(', ')})`;\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/**\n * `agentbox inspect` for cloud boxes: skips the Docker-specific probes\n * (`docker exec`, `docker inspect`, tmux session info) and renders what the\n * cloud provider can cheaply give us — state via probeState, endpoints from\n * preview URLs, persisted box-status snapshot mirrored from the in-sandbox\n * relay.\n */\nasync function renderCloudText(box: BoxRecord): Promise<string> {\n const provider = await providerForBox(box);\n const state = await provider.probeState(box);\n const persisted = await readBoxStatus(box);\n const lim = box.resourceLimits;\n const lines: string[] = [\n `id ${box.id}`,\n `name ${box.name}`,\n `provider ${box.provider ?? 'docker'}`,\n `sandboxId ${box.cloud?.sandboxId ?? '(none)'}`,\n `image ${box.image}`,\n `state ${state}`,\n `workspace ${box.workspacePath} (sandbox fs at /workspace)`,\n `project ${box.projectRoot ?? '(unset)'}`,\n `n ${typeof box.projectIndex === 'number' ? String(box.projectIndex) : '(none)'}`,\n `claude activity ${renderClaudeActivityCloud(persisted)}`,\n `codex activity ${renderCodexActivityCloud(persisted)}`,\n `web port ${box.cloud?.webPort ?? '(none)'}`,\n `web preview ${webPreviewLine(box)}`,\n `relay preview ${box.cloud?.relayPreviewUrl ?? '(unresolved)'}`,\n `bridge token ${box.cloud?.bridgeToken ? '(set)' : '(unset)'}`,\n `playwright ${box.withPlaywright ? 'yes' : 'no'}`,\n `env files ${box.withEnv ? 'yes' : 'no'}`,\n `mem limit ${lim?.memoryBytes ? fmtBytes(lim.memoryBytes) : 'unlimited'}`,\n `cpu limit ${fmtLimit(lim?.cpus, '')}`,\n `pids limit ${fmtLimit(lim?.pidsLimit, '')}`,\n `persisted ${persisted ? `${persisted.timestamp} (${String(persisted.services.length)} svc, ${String(persisted.tasks.length)} tasks, ${String(persisted.ports.length)} ports)` : '(none)'}`,\n `created ${box.createdAt}`,\n ];\n return lines.join('\\n');\n}\n\nfunction webPreviewLine(box: BoxRecord): string {\n const port = box.cloud?.webPort;\n if (port === undefined) return '(none)';\n const url = box.cloud?.previewUrls?.[port];\n return url ?? '(unresolved — re-run `agentbox url` to refresh)';\n}\n\nfunction renderClaudeActivityCloud(persisted: Awaited<ReturnType<typeof readBoxStatus>>): string {\n const c = persisted?.claude;\n if (!c) return '(none — host poller hasn\\'t mirrored status yet)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\n}\n\nfunction renderCodexActivityCloud(persisted: Awaited<ReturnType<typeof readBoxStatus>>): string {\n const c = persisted?.codex;\n if (!c) return '(none)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\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 const isCloud = (box.provider ?? 'docker') !== 'docker';\n if (opts.watch) {\n await watchRender(\n async () =>\n isCloud ? await renderCloudText(box) : await renderText(await inspectBox(box.id)),\n opts.interval,\n );\n return;\n }\n if (isCloud) {\n // Provider-level inspect gives us state + endpoints; for JSON we surface\n // the box record + a probeState (cheap), avoiding heavy SDK round-trips.\n if (opts.json) {\n const provider = await providerForBox(box);\n const state = await provider.probeState(box);\n const persisted = await readBoxStatus(box);\n process.stdout.write(\n JSON.stringify({ record: box, state, persistedStatus: persisted }, null, 2) + '\\n',\n );\n } else {\n process.stdout.write((await renderCloudText(box)) + '\\n');\n }\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const stopCommand = new Command('stop')\n .description(\n 'Stop a box (Docker: docker stop; preserves upper + node_modules volumes. Cloud: backend.stop — sandbox stays in your account, disk preserved).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const record = await stopBox(box.id);\n process.stdout.write(\n `stopped ${record.container}\\nrestart with: agentbox start ${record.name}\\n`,\n );\n } else {\n await (await providerForBox(box)).stop(box);\n process.stdout.write(\n `stopped ${box.name}\\nrestart with: agentbox start ${box.name}\\n`,\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { Command } from 'commander';\nimport { findProjectRoot } from '@agentbox/config';\nimport {\n agentboxHomeBytes,\n allCheckpointImagesBytes,\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 // Empty result isn't 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 // Cloud boxes are listed read-only (state from listBoxes, all metrics —)\n // because Daytona's SDK doesn't expose CPU/mem live stats. The\n // requireDockerProvider guard would refuse the cloud ref — relax it here\n // and just resolve.\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(\n boxes.map((b) => {\n // Skip the docker-only `boxResourceStats` for cloud boxes — it would\n // try to `docker inspect` the synthetic `agentbox-cloud-*` container\n // name. Hand back an empty placeholder stats record so the row still\n // renders (with — for every metric); state comes from listBoxes.\n if ((b.provider ?? 'docker') !== 'docker') return emptyStats(b.provider ?? 'cloud');\n return boxResourceStats(b);\n }),\n );\n return { boxes, stats };\n}\n\nfunction emptyStats(source: string): BoxResourceStats {\n return {\n source,\n live: false,\n cpuPercent: null,\n memUsedBytes: null,\n memLimitBytes: null,\n memPercent: null,\n pids: null,\n diskUsedBytes: null,\n snapshotDiskBytes: null,\n checkpointVolumeBytes: null,\n netRxBytes: null,\n netTxBytes: null,\n blockReadBytes: null,\n blockWriteBytes: null,\n limits: { memoryBytes: null, cpus: null, pidsLimit: null, disk: null },\n warnings: ['cloud box: live metrics not yet exposed by the backend SDK'],\n };\n}\n\nasync function renderProjectFooters(): Promise<string> {\n // Two independent disk numbers, no overlap: checkpoint *images* live in\n // Docker's image store (not under ~/.agentbox); everything else agentbox\n // keeps on the host — box run dirs, exports, host clones — is under\n // ~/.agentbox and summed there.\n const parts: string[] = [];\n const [ckpt, home] = await Promise.all([\n allCheckpointImagesBytes(),\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const unpauseCommand = new Command('unpause')\n .description(\n 'Resume a paused box. Docker: `docker unpause` (sub-second). Cloud: backend.resume (re-hydrates from archive — slower first time).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const record = await unpauseBox(box.id);\n process.stdout.write(`unpaused ${record.container}\\n`);\n } else {\n await (await providerForBox(box)).resume(box);\n process.stdout.write(`unpaused ${box.name}\\n`);\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 { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n detectEngine,\n getBoxHostPaths,\n inspectBox,\n portlessGetUrl,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface UrlOptions {\n print?: boolean;\n loopback?: boolean;\n ttl?: string;\n}\n\n/** Daytona's signed-URL ceiling is 24h; clamp the CLI flag to the same. */\nconst SIGNED_URL_TTL_MIN = 1;\nconst SIGNED_URL_TTL_MAX = 86400;\n\nfunction parseTtlOrExit(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < SIGNED_URL_TTL_MIN || n > SIGNED_URL_TTL_MAX) {\n throw new Error(\n `--ttl must be an integer between ${String(SIGNED_URL_TTL_MIN)} and ${String(SIGNED_URL_TTL_MAX)} seconds`,\n );\n }\n return n;\n}\n\nexport const urlCommand = new Command('url')\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(\n '--loopback',\n 'use the 127.0.0.1 URL instead of the OrbStack .orb.local / Portless .localhost URL',\n )\n .option(\n '--ttl <seconds>',\n 'cloud only: signed-URL expiry in seconds (default 3600, max 86400)',\n )\n .action(async (idOrName: string | undefined, opts: UrlOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const provider = box.provider ?? 'docker';\n\n let url: string;\n if (provider === 'docker') {\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');\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 url\\``,\n );\n }\n\n const engine = await detectEngine();\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 if (record.portlessAlias && !opts.loopback) {\n // A Portless route was registered — use the URL resolved at\n // create/start; fall back to a live `portless get` for older records.\n url = record.portlessUrl ?? (await portlessGetUrl(record.portlessAlias));\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 } else {\n // Cloud provider: probeState + lifecycle handled by the provider;\n // URL is a signed preview URL (token embedded in the URL itself) so\n // the host browser can open it without a custom header.\n const ttl = parseTtlOrExit(opts.ttl);\n const p = await providerForBox(box);\n const state = await p.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await p.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await p.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n url = await p.resolveUrl(box, { kind: 'web', ttl });\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 { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport type { WaitReadyReply } from '@agentbox/ctl';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.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 const provider = await providerForBox(box);\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 provider.exec(box, 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","/**\n * Provider-prefix argv sugar:\n *\n * agentbox <provider> <subcmd> [...rest]\n * where provider ∈ {docker, daytona, hetzner}\n * and subcmd ∈ SUGARED_COMMANDS\n *\n * ↓ rewritten before commander parses\n *\n * agentbox <subcmd> --provider <provider> [...rest]\n *\n * Anything that doesn't match (e.g. `agentbox daytona login`, `agentbox hetzner\n * firewall sync foo`, `agentbox create`) is returned unchanged.\n *\n * The `--provider <provider>` is prepended *before* the rest of the args, so\n * an explicit `--provider <flag>` later in the original argv keeps the\n * commander last-one-wins behavior: `agentbox daytona create --provider\n * hetzner` resolves to hetzner.\n */\nimport { isKnownProvider } from './registry.js';\n\nexport const SUGARED_COMMANDS = ['create', 'claude', 'codex', 'opencode'] as const;\nexport type SugaredCommand = (typeof SUGARED_COMMANDS)[number];\n\nfunction isSugared(name: string): name is SugaredCommand {\n return (SUGARED_COMMANDS as readonly string[]).includes(name);\n}\n\nexport function rewriteProviderPrefix(argv: readonly string[]): string[] {\n // argv layout from process.argv: [node, scriptPath, ...userArgs].\n if (argv.length < 4) return [...argv];\n const provider = argv[2];\n const subcmd = argv[3];\n if (typeof provider !== 'string' || typeof subcmd !== 'string') return [...argv];\n if (!isKnownProvider(provider) || !isSugared(subcmd)) return [...argv];\n\n const head = argv.slice(0, 2);\n const rest = argv.slice(4);\n return [...head, subcmd, '--provider', provider, ...rest];\n}\n"],"mappings":"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","names":["Command","program","pad","log","log","log","log","confirm","isCancel","log","outro","spinner","Command","join","join","log","log","join","log","log","stat","homedir","join","readdir","log","join","readFile","stat","homedir","join","homedir","join","stat","readFile","mkdtemp","readdir","readFile","stat","writeFile","existsSync","homedir","tmpdir","join","homedir","join","existsSync","mkdtemp","tmpdir","stat","readdir","readFile","writeFile","log","existsSync","homedir","join","mkdirSync","writeFileSync","homedir","join","isCancel","log","spinner","s","spinner","log","isCancel","confirm","isCancel","log","proj","log","isCancel","confirm","log","spinner","confirm","isCancel","Command","outro","confirm","isCancel","log","Command","Command","log","r","confirm","isCancel","log","Command","homedir","join","Command","log","resolve","confirm","intro","isCancel","log","outro","spinner","Command","reattachRef","parseMaxRunningOption","RELAY_HOST_URL","confirm","isCancel","log","spinner","Command","intro","outro","confirm","intro","isCancel","log","outro","spinner","Command","reattachRef","parseMaxRunningOption","RELAY_HOST_URL","confirm","isCancel","log","spinner","Command","intro","outro","Command","InvalidArgumentError","log","Command","Command","log","intro","log","outro","Command","spawnSync","RELAY_HOST_URL","spawnSync","Command","intro","log","outro","cloudAgentAttach","spawn","log","Command","spawn","cursorTo","resolve","ev","Command","log","spawn","log","spinner","Command","log","spinner","Command","log","Command","reportError","log","loginSub","printStatus","secretsPath","maskKey","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","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","result","log","Command","POLL_INTERVAL_MS","Command","parsePositiveInt","sleep","elapsedMs","log","log","Command","existsSync","homedir","join","join","homedir","existsSync","Command","log","intro","log","outro","Command","existsSync","mkdirSync","writeFileSync","homedir","join","resolve","Command","Command","log","Command","ESC","sleep","term","row","scoped","listCommand","Command","log","log","Command","spawn","Command","log","child","spawn","term","log","execa","existsSync","mkdirSync","homedir","join","Command","Command","join","homedir","existsSync","mkdirSync","log","execa","Command","Command","intro","log","spinner","Command","pad","Command","intro","log","spinner","confirm","isCancel","log","Command","Command","log","confirm","isCancel","daytonaBackend","readFile","stat","intro","log","outro","Command","Command","log","pad","stat","readFile","intro","outro","parsePositiveInt","sleep","log","spinner","Command","Command","spinner","log","Command","Command","log","spawnSync","log","Command","Command","log","spawnSync","spawnSync","log","Command","log","RELAY_HOST_URL","reattachRef","fmtAgo","log","Command","code","term","spawnSync","Command","Command","log","Command","log","log","statusCommand","Command","log","renderShells","renderPersisted","Command","Command","Command","renderTable","Command","Command","Command","spawn","confirm","intro","isCancel","log","outro","spinner","Command","spawn","Command","intro","log","outro","confirm","isCancel","spinner","spawnSync","log","Command","SIGNED_URL_TTL_MIN","SIGNED_URL_TTL_MAX","parseTtlOrExit","Command","log","spawnSync","log","Command","Command","log","Command","listCommand","statusCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/index.ts","../src/engine-override.ts","../src/help.ts","../src/commands/agent.ts","../src/box-ref.ts","../src/lib/wait/agent-state.ts","../src/lib/wait/events.ts","../src/commands/_errors.ts","../src/commands/claude.ts","../src/auth.ts","../src/lib/queue/assert-creds.ts","../src/lib/queue/build-prompt-args.ts","../src/lib/queue/parse-max-option.ts","../src/lib/queue/submit.ts","../src/commands/_attach-in.ts","../src/commands/_cloud-agent-create.ts","../src/lib/progress.ts","../src/spinner-line.ts","../src/lib/carry-gate.ts","../src/carry-prompt.ts","../src/fmt.ts","../src/lib/carry-resolve.ts","../src/lib/from-branch.ts","../src/session-teleport/claude.ts","../src/session-teleport/cwd-encoding.ts","../src/session-teleport/types.ts","../src/session-teleport/codex.ts","../src/session-teleport/opencode.ts","../src/session-teleport/index.ts","../src/lib/install-hint.ts","../src/lib/log-file.ts","../src/limits.ts","../src/portless-prompt.ts","../src/wizard.ts","../src/checkpoint-lookup.ts","../src/commands/checkpoint.ts","../src/commands/code.ts","../src/ssh-config.ts","../src/commands/codex.ts","../src/commands/opencode.ts","../src/commands/config.ts","../src/commands/cp.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/compositor.ts","../../../packages/sandbox-daytona/src/cli.ts","../src/commands/docker.ts","../../../packages/sandbox-hetzner/src/cli.ts","../../../packages/sandbox-vercel/src/cli.ts","../src/commands/destroy.ts","../src/commands/download.ts","../src/commands/download-claude.ts","../src/commands/download-codex.ts","../src/commands/download-opencode.ts","../src/commands/download-config.ts","../src/commands/download-env.ts","../src/commands/drive.ts","../src/lib/drive/keys.ts","../src/lib/drive/tmux.ts","../src/lib/drive/session.ts","../src/commands/fork.ts","../src/commands/install.ts","../src/commands/git.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/prepare.ts","../src/commands/prune.ts","../src/commands/queue.ts","../src/commands/relay.ts","../src/commands/_run-queued-job.ts","../src/commands/screen.ts","../src/commands/shell.ts","../src/commands/_provider-guard.ts","../src/commands/start.ts","../src/commands/status.ts","../src/endpoints-render.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/url.ts","../src/commands/wait.ts","../src/provider/argv-prefix.ts"],"sourcesContent":["/**\n * Build-time injected CLI version constants. tsup's `define` (apps/cli/tsup.config.ts)\n * replaces these identifiers at bundle time:\n *\n * __AGENTBOX_VERSION__ ← apps/cli/package.json `version`\n * __AGENTBOX_COMMIT__ ← `git rev-parse --short HEAD` at build time\n *\n * The `declare` lines below are for the typecheck of the unbundled source —\n * tsup substitutes the literals before esbuild ever sees this file. The\n * `?? '...'` fallbacks cover the unbundled dev case (running `tsx src/index.ts`\n * before `pnpm build` populates the defines).\n */\n\ndeclare const __AGENTBOX_VERSION__: string | undefined;\ndeclare const __AGENTBOX_COMMIT__: string | undefined;\n\nexport const AGENTBOX_VERSION: string =\n typeof __AGENTBOX_VERSION__ === 'string' ? __AGENTBOX_VERSION__ : '0.0.0-dev';\n\nexport const AGENTBOX_COMMIT: string =\n typeof __AGENTBOX_COMMIT__ === 'string' ? __AGENTBOX_COMMIT__ : 'dev';\n","// Suppress Docker CLI hints (the \"What's next?\" / promotional lines that\n// appear after some docker subcommands). Affects every `docker …` we spawn\n// because the var inherits via process.env. We use `??=` so a user who\n// explicitly set DOCKER_CLI_HINTS in their shell still wins.\nprocess.env.DOCKER_CLI_HINTS ??= 'false';\n\n// Build-time CLI version stamps. The provider packages (sandbox-docker,\n// sandbox-hetzner, sandbox-daytona) read these lazily — at prepare/create/\n// checkpoint time, never at import — so the ESM-hoists-imports-first order\n// is fine. Set via env so the provider packages don't need a compile-time\n// dep on apps/cli's bundled-only version module.\nimport { AGENTBOX_COMMIT, AGENTBOX_VERSION } from './version.js';\nprocess.env.AGENTBOX_CLI_VERSION = AGENTBOX_VERSION;\nprocess.env.AGENTBOX_CLI_COMMIT = AGENTBOX_COMMIT;\n\nimport { Command } from 'commander';\nimport { applyEngineOverrideAtStartup } from './engine-override.js';\nimport { buildGroupedHelp } from './help.js';\nimport { agentCommand } from './commands/agent.js';\nimport { claudeCommand } from './commands/claude.js';\nimport { checkpointCommand } from './commands/checkpoint.js';\nimport { codeCommand } from './commands/code.js';\nimport { codexCommand } from './commands/codex.js';\nimport { opencodeCommand } from './commands/opencode.js';\nimport { configCommand } from './commands/config.js';\nimport { cpCommand } from './commands/cp.js';\nimport { createCommand } from './commands/create.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { daytonaCommand } from '@agentbox/sandbox-daytona/cli';\nimport { dockerCommand } from './commands/docker.js';\nimport { hetznerCommand } from '@agentbox/sandbox-hetzner/cli';\nimport { vercelCommand } from '@agentbox/sandbox-vercel/cli';\nimport { destroyCommand } from './commands/destroy.js';\nimport { downloadCommand } from './commands/download.js';\nimport { driveCommand } from './commands/drive.js';\nimport { forkCommand } from './commands/fork.js';\nimport { installCommand } from './commands/install.js';\nimport { gitCommand } from './commands/git.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 { prepareCommand } from './commands/prepare.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { queueCommand } from './commands/queue.js';\nimport { relayCommand } from './commands/relay.js';\nimport { runQueuedJobCommand } from './commands/_run-queued-job.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 { urlCommand } from './commands/url.js';\nimport { waitCommand } from './commands/wait.js';\nimport { rewriteProviderPrefix } from './provider/argv-prefix.js';\n\nconst program = new Command();\n\nprogram\n .name('agentbox')\n .description('Launch coding agents in isolated sandboxes')\n .version(AGENTBOX_VERSION);\n\n// Required so `agentbox download env --dry-run` binds --dry-run to the `env`\n// subcommand rather than the parent `download` (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(forkCommand);\nprogram.addCommand(codexCommand);\nprogram.addCommand(gitCommand);\nprogram.addCommand(opencodeCommand);\nprogram.addCommand(codeCommand);\nprogram.addCommand(shellCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(openCommand);\nprogram.addCommand(urlCommand);\nprogram.addCommand(screenCommand);\nprogram.addCommand(downloadCommand);\nprogram.addCommand(cpCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(topCommand);\nprogram.addCommand(dashboardCommand);\nprogram.addCommand(driveCommand);\nprogram.addCommand(agentCommand);\nprogram.addCommand(waitCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(pauseCommand);\nprogram.addCommand(unpauseCommand);\nprogram.addCommand(stopCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(destroyCommand);\nprogram.addCommand(prepareCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(checkpointCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(queueCommand);\nprogram.addCommand(relayCommand);\n// Internal worker spawned by the relay's queue scheduler. Hidden from\n// `--help` (it shows nothing user-facing — see _run-queued-job.ts).\nprogram.addCommand(runQueuedJobCommand, { hidden: true });\nprogram.addCommand(daytonaCommand);\nprogram.addCommand(hetznerCommand);\nprogram.addCommand(vercelCommand);\nprogram.addCommand(dockerCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(installCommand);\n\nprogram.configureHelp({ visibleCommands: () => [] });\nprogram.addHelpText('after', () => '\\n' + buildGroupedHelp(program));\n\nawait applyEngineOverrideAtStartup();\n\nprogram.parseAsync(rewriteProviderPrefix(process.argv)).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\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', 'fork', 'codex', 'opencode'] },\n {\n title: 'Access',\n commands: ['dashboard', 'url', 'screen', 'code', 'shell', 'open', 'logs', 'drive'],\n },\n { title: 'Inspect', commands: ['list', 'status', 'top', 'agent'] },\n { title: 'Lifecycle', commands: ['start', 'stop', 'destroy', 'pause', 'unpause'] },\n { title: 'Sync & state', commands: ['download', 'cp', 'checkpoint', 'queue'] },\n {\n title: 'Advanced',\n commands: [\n 'prepare',\n 'wait',\n 'prune',\n 'self-update',\n 'install',\n 'config',\n 'relay',\n 'docker',\n 'daytona',\n 'hetzner',\n ],\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/**\n * True when a command was registered with `program.addCommand(cmd, { hidden: true })`.\n * commander v12 stores this on the private `_hidden` property; the cast keeps\n * the lint clean without exposing commander internals across the codebase.\n */\nfunction isHiddenCommand(cmd: Command): boolean {\n return (cmd as unknown as { _hidden?: boolean })._hidden === true;\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// Hidden commands (`addCommand(cmd, { hidden: true })`) are excluded — that's\n// how internal-only commands like `_run-queued-job` stay out of help. Any\n// registered visible 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 visible = program.commands.filter((c) => !isHiddenCommand(c));\n const byName = new Map(visible.map((c) => [c.name(), c] as const));\n const grouped = new Set(HELP_GROUPS.flatMap((g) => g.commands));\n const orphans = visible.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 { log } from '@clack/prompts';\nimport {\n BOX_STATUS_EVENT,\n type BoxStatus,\n type BoxStatusClaude,\n} from '@agentbox/ctl';\nimport { readBoxStatus } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport {\n AGENT_WAIT_STATES,\n derivedAgentState,\n isAgentWaitState,\n matchesAgentWaitState,\n type AgentWaitState,\n} from '../lib/wait/agent-state.js';\nimport { waitForEvent, WaitTimeoutError } from '../lib/wait/events.js';\nimport { handleLifecycleError } from './_errors.js';\n\nconst DEFAULT_WAIT_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport const agentCommand = new Command('agent').description(\n 'Query and wait on the in-box coding agent\\'s state (Claude Code plan-mode end, AskUserQuestion, idle/prompt-ready).',\n);\n\ninterface BoxRefOpts {\n json?: boolean;\n}\n\nconst agentStateCommand = new Command('state')\n .description('Print the current claude activity state for a box (or full status with --json).')\n .argument('[box]', 'box ref (default: only box in this project)')\n .option('--json', 'emit the full BoxStatusClaude payload as JSON')\n .action(async (boxRef: string | undefined, opts: BoxRefOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const status = await readBoxStatus(box);\n const claude = status?.claude;\n if (opts.json === true) {\n process.stdout.write(JSON.stringify(claude ?? null) + '\\n');\n return;\n }\n if (!claude) {\n log.info('no status snapshot yet for this box (hooks may not have fired)');\n return;\n }\n process.stdout.write(statusDisplay(claude) + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ninterface WaitForOpts {\n timeout?: string;\n json?: boolean;\n}\n\nconst agentWaitForCommand = new Command('wait-for')\n .description(`Block until the agent reaches a state. One of: ${AGENT_WAIT_STATES.join(' | ')}.`)\n .argument('<state>', `target state: ${AGENT_WAIT_STATES.join(' | ')}`)\n .argument('[box]', 'box ref (default: only box in this project)')\n .option('--timeout <ms>', `wall-clock cap (default: ${String(DEFAULT_WAIT_TIMEOUT_MS)})`)\n .option('--json', 'emit the matched claude payload as JSON')\n .action(async (state: string, boxRef: string | undefined, opts: WaitForOpts) => {\n try {\n if (!isAgentWaitState(state)) {\n log.error(`unknown state '${state}' (one of: ${AGENT_WAIT_STATES.join(', ')})`);\n process.exit(2);\n }\n const target: AgentWaitState = state;\n const box = await resolveBoxOrExit(boxRef);\n const timeoutMs =\n opts.timeout !== undefined ? parsePositiveInt(opts.timeout, '--timeout') : DEFAULT_WAIT_TIMEOUT_MS;\n\n // Fast path: maybe the box is already in the target state.\n const current = await readBoxStatus(box);\n if (current?.claude && matchesAgentWaitState(current.claude, target)) {\n emitMatch(current.claude, opts.json === true);\n return;\n }\n\n // Subscribe to relay events. Filter to box-status events for this box,\n // re-check on each push.\n try {\n const claude = await waitForEvent<BoxStatusClaude>(\n (ev) => {\n if (ev.boxId !== box.id) return undefined;\n if (ev.type !== BOX_STATUS_EVENT) return undefined;\n const payload = ev.payload as BoxStatus | undefined;\n if (!payload?.claude) return undefined;\n return matchesAgentWaitState(payload.claude, target) ? payload.claude : undefined;\n },\n { boxId: box.id, timeoutMs },\n );\n emitMatch(claude, opts.json === true);\n } catch (err) {\n if (err instanceof WaitTimeoutError) {\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ matched: false, elapsedMs: err.elapsedMs }) + '\\n',\n );\n } else {\n log.error(`agent did not reach '${target}' within ${String(timeoutMs)}ms`);\n }\n process.exit(1);\n }\n throw err;\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst agentGetPlanQuestionCommand = new Command('get-plan-question')\n .description(\"Print the active ExitPlanMode plan body or AskUserQuestion content (whichever is current).\")\n .argument('[box]', 'box ref (default: only box in this project)')\n .option('--json', 'emit the structured payload as JSON instead of a human render')\n .action(async (boxRef: string | undefined, opts: BoxRefOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const status = await readBoxStatus(box);\n const claude = status?.claude;\n if (opts.json === true) {\n const out = claude?.plan ?? claude?.question ?? null;\n process.stdout.write(JSON.stringify(out) + '\\n');\n return;\n }\n if (claude?.plan) {\n process.stdout.write(claude.plan.plan + '\\n');\n return;\n }\n if (claude?.question) {\n for (const q of claude.question.questions) {\n process.stdout.write(`${q.question}\\n`);\n for (const o of q.options) {\n process.stdout.write(` - ${o.label}${o.description ? ` — ${o.description}` : ''}\\n`);\n }\n }\n return;\n }\n log.info('no pending plan or question for this box');\n process.exit(1);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nagentCommand.addCommand(agentStateCommand);\nagentCommand.addCommand(agentWaitForCommand);\nagentCommand.addCommand(agentGetPlanQuestionCommand);\n\nfunction emitMatch(claude: BoxStatusClaude, asJson: boolean): void {\n if (asJson) {\n process.stdout.write(JSON.stringify(claude) + '\\n');\n } else {\n process.stdout.write(derivedAgentState(claude) + '\\n');\n }\n}\n\nfunction statusDisplay(claude: BoxStatusClaude): string {\n return derivedAgentState(claude);\n}\n\nfunction parsePositiveInt(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || String(n) !== raw.trim()) {\n throw new Error(`${label} must be a positive integer (got: ${raw})`);\n }\n return n;\n}\n","import { findProjectRoot } from '@agentbox/config';\nimport {\n AmbiguousBoxError,\n BoxNotFoundError,\n type BoxRecord,\n type FindBoxResult,\n} from '@agentbox/core';\nimport { readState, resolveBoxRef } from '@agentbox/sandbox-core';\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","// Pure state-matching helpers for `agentbox agent`. Extracted so they have a\n// unit-testable surface — see test/agent-state.test.ts.\n\nimport type { BoxStatusClaude, ClaudeActivityState } from '@agentbox/ctl';\n\nexport const AGENT_WAIT_STATES = [\n 'working',\n 'idle',\n 'waiting',\n 'end-plan',\n 'question',\n 'prompt',\n 'compacting',\n 'error',\n] as const;\nexport type AgentWaitState = (typeof AGENT_WAIT_STATES)[number];\n\nexport function isAgentWaitState(s: string): s is AgentWaitState {\n return (AGENT_WAIT_STATES as readonly string[]).includes(s);\n}\n\n/**\n * `prompt` means \"ready for a new user message\": Claude is idle, the tmux\n * session is up, and there's no pending plan or question payload. Used both\n * by `agent wait-for prompt` and as the human-readable label in `agent state`\n * when those conditions hold.\n */\nexport function isPromptReady(claude: BoxStatusClaude): boolean {\n return (\n claude.state === 'idle' &&\n claude.sessionRunning &&\n claude.plan === undefined &&\n claude.question === undefined\n );\n}\n\nexport function matchesAgentWaitState(claude: BoxStatusClaude, target: AgentWaitState): boolean {\n if (target === 'prompt') return isPromptReady(claude);\n if (target === 'end-plan') {\n // ExitPlanMode triggers Notification:permission_prompt → state=waiting\n // almost immediately. The plan payload is what tells us the user is\n // parked at \"approve the plan\", so accept either signal.\n return claude.plan !== undefined || claude.state === 'end-plan';\n }\n if (target === 'question') {\n return claude.question !== undefined || claude.state === 'question';\n }\n return claude.state === (target as ClaudeActivityState);\n}\n\n/**\n * Display string used when no `--json` is requested. Prefers the semantic\n * label (`prompt` / `end-plan` / `question`) over the raw `waiting` flicker.\n */\nexport function derivedAgentState(claude: BoxStatusClaude): string {\n if (isPromptReady(claude)) return 'prompt';\n if (claude.plan !== undefined) return 'end-plan';\n if (claude.question !== undefined) return 'question';\n return claude.state;\n}\n","// Long-poll subscription to the host relay's `/admin/events` ring buffer.\n// Used by `agentbox agent wait-for` and `agentbox queue wait-for` to block on\n// state transitions without inventing a new endpoint. Polling is fine here:\n// the relay buffers 1000 events in memory, and the cursor-based query is\n// dependency-free (plain GET).\n\nimport { ensureRelay } from '@agentbox/sandbox-docker';\n\nconst POLL_INTERVAL_MS = 500;\n\nexport interface RelayEvent {\n id: number;\n boxId: string;\n type: string;\n receivedAt: string;\n ts?: string;\n payload?: unknown;\n}\n\nexport interface SubscribeOptions {\n /** Filter to a single box id (else all). */\n boxId?: string;\n /** Wall-clock cap. Throws AbortError when reached. */\n timeoutMs?: number;\n /** Optional starting cursor; defaults to \"current head\" (skip historical events). */\n sinceId?: number;\n}\n\nexport class WaitTimeoutError extends Error {\n constructor(public readonly elapsedMs: number) {\n super(`wait-for timed out after ${String(elapsedMs)}ms`);\n this.name = 'WaitTimeoutError';\n }\n}\n\n/**\n * Block until `predicate` returns truthy for one of the events streaming out\n * of `/admin/events`. The predicate's return value is what `waitForEvent`\n * resolves to — handy for \"match + decode\" in one step.\n *\n * Race-handling note: when the caller doesn't pass `sinceId`, the first fetch\n * is `since=0` — which returns the whole buffer. We evaluate the predicate\n * against the LATEST event in that batch (not the rest, to avoid replaying\n * stale historical transitions) so a state change that was broadcast to the\n * ring buffer but whose `status.json` atomic write was still in flight when\n * the caller's fast-path read happened is still caught here. Subsequent\n * fetches then long-poll from the head cursor as usual.\n */\nexport async function waitForEvent<T>(\n predicate: (ev: RelayEvent) => T | undefined,\n opts: SubscribeOptions = {},\n): Promise<T> {\n const relayUrl = await getRelayUrl();\n const start = Date.now();\n let cursor = opts.sinceId ?? 0;\n let bootstrapped = opts.sinceId !== undefined;\n while (true) {\n const remaining = opts.timeoutMs !== undefined ? opts.timeoutMs - (Date.now() - start) : Infinity;\n if (remaining <= 0) throw new WaitTimeoutError(Date.now() - start);\n\n const events = await fetchEvents(relayUrl, cursor, opts.boxId);\n\n if (!bootstrapped) {\n // First sweep with no caller-supplied cursor: only the most recent\n // event represents \"current state\" — older buffered events are stale\n // transitions. Match against the head, advance cursor past it, and\n // proceed to long-poll for future transitions.\n const last = events[events.length - 1];\n if (last) {\n const matched = predicate(last);\n if (matched !== undefined) return matched;\n cursor = last.id;\n }\n bootstrapped = true;\n } else {\n for (const ev of events) {\n const matched = predicate(ev);\n if (matched !== undefined) return matched;\n cursor = Math.max(cursor, ev.id);\n }\n }\n // No match in this batch — sleep and re-poll (or wake early on timeout).\n const sleepMs = Math.min(POLL_INTERVAL_MS, remaining);\n if (sleepMs > 0) await sleep(sleepMs);\n }\n}\n\nasync function fetchEvents(\n relayUrl: string,\n since: number,\n boxId: string | undefined,\n): Promise<RelayEvent[]> {\n const url = new URL('/admin/events', relayUrl);\n url.searchParams.set('since', String(since));\n if (boxId) url.searchParams.set('box', boxId);\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`relay /admin/events: HTTP ${String(res.status)}`);\n }\n const body = (await res.json()) as { events?: RelayEvent[] };\n return body.events ?? [];\n}\n\nasync function getRelayUrl(): Promise<string> {\n // ensureRelay is idempotent: it spawns the host relay process if it's not\n // already running. `hostUrl` is the loopback view from this side; `url` is\n // the host.docker.internal view used inside boxes.\n const ep = await ensureRelay();\n return ep.hostUrl;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\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, spinner } from '@clack/prompts';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type AttachOpenIn,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n buildClaudeAttachArgv,\n buildClaudeLoginRunArgv,\n ClaudeSessionError,\n claudeSessionInfo,\n createBox,\n DEFAULT_RELAY_PORT,\n detectEngine,\n ensureClaudeVolume,\n ensureImage,\n formatDetachNotice,\n hostBackupHasCredentials,\n inspectBox,\n rebuildPluginNativeDeps,\n runInteractiveClaudeLogin,\n seedSetupSkillIntoVolume,\n SHARED_CLAUDE_VOLUME,\n startBox,\n startClaudeSession,\n syncClaudeCredentials,\n unpauseBox,\n warmUpClaudeCredentials,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveClaudeAuth, type ResolvedClaudeAuth } from '../auth.js';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport {\n assertAgentCredsAvailable,\n MissingAgentCredsError,\n} from '../lib/queue/assert-creds.js';\nimport { buildPromptArgs } from '../lib/queue/build-prompt-args.js';\nimport { parseMaxOption } from '../lib/queue/parse-max-option.js';\nimport { submitQueueJob } from '../lib/queue/submit.js';\nimport {\n ATTACH_IN_HELP,\n INLINE_HELP,\n NO_ATTACH_HELP,\n resolveAttachInOption,\n} from './_attach-in.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\nimport { cloudAgentCreate } from './_cloud-agent-create.js';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, UseBranchError, resolveBranchSelection } from '../lib/from-branch.js';\nimport { providerForBox, providerForCreate } from '../provider/registry.js';\nimport {\n prepareTeleport,\n TeleportError,\n uploadTeleport,\n type ResolvedTeleport,\n type ResumeMode,\n} from '../session-teleport/index.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { maybeShowInstallHint } from '../lib/install-hint.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybePromptPortless } from '../portless-prompt.js';\nimport { maybeRunSetupWizard } from '../wizard.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { pasteHostClipboardImage } from '../lib/paste-image.js';\nimport { clipboardCaptureAvailable } from '../lib/host-clipboard.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\n/** Project an agent-create options struct down to what the queue worker needs. */\nfunction pickCreateOpts(opts: ClaudeCreateOptions): import('@agentbox/relay').QueueJobCreateOpts {\n return {\n workspace: opts.workspace,\n name: opts.name,\n hostSnapshot: opts.hostSnapshot,\n snapshot: opts.snapshot,\n image: opts.image,\n withPlaywright: opts.withPlaywright,\n withEnv: opts.withEnv,\n vnc: opts.vnc,\n sharedDockerCache: opts.sharedDockerCache,\n portless: opts.portless,\n sessionName: opts.sessionName,\n memory: opts.memory,\n cpus: opts.cpus,\n pidsLimit: opts.pidsLimit,\n disk: opts.disk,\n };\n}\n\n/** Log how much the plugin-cache prune reclaimed, when it reclaimed anything. */\nfunction logPrune(rebuild: { pruned: string[]; prunedBytes: number }): void {\n if (rebuild.prunedBytes <= 0) return;\n const mb = Math.round(rebuild.prunedBytes / 1024 / 1024);\n const n = rebuild.pruned.length;\n log.info(`pruned ${String(n)} stale plugin cache${n === 1 ? '' : 's'} (${String(mb)} MB freed)`);\n}\n\n/** Host-side URL for the relay (always loopback for the wrapper's SSE subscription). */\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/**\n * Replacement for the old `attachClaudeSession`: builds the docker tmux-\n * attach argv, hands it to the node-pty wrapper for the footer + prompt\n * channel, then exits with the inner pty's exit code. Falls back\n * transparently to plain spawnSync inside `runWrappedAttach` when stdio\n * isn't a TTY or node-pty isn't installed.\n */\nasync function attachClaudeWrapped(\n box: BoxRecord,\n sessionName: string | undefined,\n reattach: string,\n onError?: (msg: string) => void,\n openIn?: AttachOpenIn,\n): Promise<never> {\n const provider = await providerForBox(box);\n // Only wire Ctrl+V paste when this host can actually capture a clipboard image\n // (macOS, or a Linux desktop with xclip/wl-paste). Elsewhere Ctrl+V forwards\n // verbatim instead of being intercepted for a guaranteed-empty paste.\n const canPaste = await clipboardCaptureAvailable();\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildClaudeAttachArgv(box.container, sessionName),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'claude',\n detachNotice: formatDetachNotice(reattach),\n onError,\n openIn,\n onPasteImage: canPaste\n ? () => pasteHostClipboardImage(provider, box)\n : undefined,\n });\n process.exit(code);\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 /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** Sandbox backend: `docker` (default) or `daytona`. */\n provider?: string;\n /** --from-branch <ref>: base the box's per-box branch on this ref instead of HEAD. */\n fromBranch?: string;\n /** -b / --use-branch <name>: reuse an existing branch directly instead of forking agentbox/<name>. */\n useBranch?: string;\n /** -v / --verbose: bypass the spinner and stream raw provider output. */\n verbose?: boolean;\n /** Raw `--attach-in <mode>` value; validated by `parseAttachInOption`. */\n attachIn?: string;\n /** --inline: shortcut for `--attach-in same` (long-form only — `-i` is `--initial-prompt`). */\n inline?: boolean;\n /** Commander parses `-d, --no-attach` as `attach: false` (defaults true). */\n attach?: boolean;\n /**\n * `-i, --initial-prompt <text>`: seed the claude TUI with this user turn\n * and run in background mode (no attach). Jobs go through the host-wide\n * queue; `--max-running` overrides `queue.maxConcurrent` for this job.\n */\n initialPrompt?: string;\n /** Per-invocation override of `queue.maxConcurrent` (number string from commander). */\n maxRunning?: string;\n /** Per-invocation override of `queue.maxWorking` (number string from commander). */\n maxWorking?: string;\n /** `-c, --continue`: teleport and resume the most recent host claude session for this cwd. */\n continue?: boolean;\n /** `--resume <id>`: teleport and resume the specified host claude session by id. */\n resume?: 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 if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n const attachIn = resolveAttachInOption(opts);\n if (attachIn !== undefined) out.attach = { openIn: attachIn };\n return out;\n}\n\n/**\n * Run `claude auth login` in a throwaway container against the shared\n * claude-config volume, then extract the result to the host backup so every\n * future box (shared or isolate) is seeded from it. Returns the login\n * command's exit code.\n */\nasync function runClaudeLoginContainer(image: string, extraArgs: string[]): Promise<number> {\n const { exitCode } = runInteractiveClaudeLogin(\n buildClaudeLoginRunArgv({ volume: SHARED_CLAUDE_VOLUME, image, extraArgs }),\n );\n if (exitCode === 0) {\n // Absorb the fresh-token first-request 400 in a throwaway container before\n // any box uses these credentials (see warmUpClaudeCredentials). Runs before\n // syncClaudeCredentials so the host backup captures any token the warm-up\n // refreshes.\n const s = spinner();\n s.start('checking credentials');\n const warm = await warmUpClaudeCredentials(SHARED_CLAUDE_VOLUME, image, {\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n s.stop(warm.warmed ? 'credentials ready' : 'credentials check incomplete — continuing');\n await syncClaudeCredentials({ volume: SHARED_CLAUDE_VOLUME }, { image, isolate: false });\n }\n return exitCode;\n}\n\n/**\n * First-run sign-in offer, shown before box creation / the setup wizard. When\n * no credentials are available yet, prompts the user and (on confirm) runs\n * `claude auth login` in a throwaway container — the result seeds every future\n * box via the host backup. Silent no-op when credentials already exist, in\n * non-interactive runs, or when the user provided auth via host env.\n */\nasync function maybeRunClaudeLogin(args: {\n image: string;\n authSource: ResolvedClaudeAuth['source'];\n yes: boolean;\n /** Host workspace path — seeds the project-scoped `/workspace` alias into\n * the volume's `_claude.json` before the login container runs. */\n hostWorkspace: string;\n}): Promise<void> {\n // Skip when: non-interactive / --yes; the user explicitly provided auth via\n // host env (respect an intentional ANTHROPIC_API_KEY); or the host backup\n // already holds real credentials (every box gets seeded from it). A legacy\n // auth.json setup-token (`auth-file`) still gets the offer — that is the\n // \"Claude API\" -> subscription upgrade.\n if (!process.stdin.isTTY || args.yes) return;\n if (args.authSource === 'host-env') return;\n if (await hostBackupHasCredentials()) return;\n\n const message =\n args.authSource === 'auth-file'\n ? \"You're on a legacy API token (shows as 'Claude API'). Sign in with your Claude subscription instead?\"\n : 'Sign in with your Claude subscription? (saved and reused by every box)';\n const answer = await confirm({ message, initialValue: true });\n if (isCancel(answer) || !answer) {\n log.info('Skipped sign-in — claude will prompt you to /login inside the box.');\n return;\n }\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(args.image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Seed the shared claude-config volume from the host's ~/.claude *before*\n // the login container runs, so `claude auth login` writes its oauthAccount\n // on top of the host config (trust, installMethod, project alias) rather\n // than into an empty volume. ensureClaudeVolume is write-once for\n // _claude.json, so the later createBox sync can't clobber the login's work.\n s.message('preparing claude config');\n await ensureClaudeVolume(\n { volume: SHARED_CLAUDE_VOLUME },\n { syncFromHost: true, image: args.image, hostWorkspace: args.hostWorkspace },\n );\n s.stop('image ready');\n\n const exitCode = await runClaudeLoginContainer(args.image, ['--claudeai']);\n if (exitCode !== 0) {\n log.warn('Claude login did not complete; continuing — run `agentbox claude login` to retry.');\n return;\n }\n log.success('Signed in with your Claude subscription — saved for future boxes.');\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', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\n .option('--no-host-snapshot', 'tar-pipe directly from the live host workspace at create time')\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')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\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 .option(\n '--provider <name>',\n \"sandbox backend: 'docker' (default) or 'daytona' for a cloud box\",\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-b, --use-branch <name>',\n \"reuse an existing branch directly instead of forking agentbox/<box-name>. Commits/pushes flow straight to it. Docker fails if the host already has it checked out. Mutually exclusive with --from-branch.\",\n )\n .option(\n '-v, --verbose',\n 'bypass the spinner and stream raw provider output (docker build / Daytona snapshot create) to stderr. The same content always lands in ~/.agentbox/logs/claude.log.',\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('--inline', INLINE_HELP)\n .option('-d, --no-attach', NO_ATTACH_HELP)\n .option(\n '-i, --initial-prompt <text>',\n 'seed the claude session with this initial user turn and run in background (no attach). Jobs go through the host-wide queue (queue.maxConcurrent). NOTE: this is NOT claude\\'s own `-p` headless print mode — for that, pass `-- -p ...`.',\n )\n .option(\n '--max-running <n>',\n 'per-invocation override of queue.maxConcurrent; only honored when `-i` is set',\n )\n .option(\n '--max-working <n>',\n 'per-invocation override of queue.maxWorking; only honored when `-i` is set',\n )\n .option(\n '-c, --continue',\n 'teleport the most recent host Claude Code session for this cwd into the box and resume from it',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Claude Code session id into the box and resume from it',\n )\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 const cmdLog = openCommandLog('claude');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Starting Claude in a box...');\n\n // -c / --continue / --resume <id>: handled by agentbox (the teleport runs\n // after box creation, below) and forwarded to the in-box claude as the\n // canonical `--resume <id>` tuple. The in-box claude never sees `-c`.\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n cmdLog.close();\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n if (resumeMode && opts.initialPrompt && opts.initialPrompt.length > 0) {\n log.error('-i / --initial-prompt cannot be combined with -c / --resume (seeding a new turn into a resumed session is not supported).');\n cmdLog.close();\n process.exit(2);\n }\n // Pre-flight: resolve the host session BEFORE any box work so a missing\n // session id fails fast (the user doesn't pay for a doomed box).\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'claude',\n hostCwd: opts.workspace,\n mode: resumeMode,\n log: (line) => cmdLog.write(line),\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildClaudeCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n // Resolve provider once. The --provider flag wins, then box.provider config,\n // then default 'docker'. The Docker-only fast path below skips entirely on\n // cloud — we delegate to the cloud-agent-create helper after running the\n // (provider-agnostic) setup wizard.\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const isCloud = providerName !== 'docker';\n\n // -i / --initial-prompt: background mode. Write a queue manifest and exit;\n // the relay's queue loop spawns the worker as a slot frees. Docker-only\n // for v1 — the cloud `cloudAgentCreate` path starts the tmux session\n // lazily on first attach, so a \"create but don't attach\" cloud run has no\n // chance to seed the prompt.\n if (opts.initialPrompt && opts.initialPrompt.length > 0) {\n if (isCloud) {\n log.error('-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).');\n cmdLog.close();\n process.exit(2);\n }\n try {\n await assertAgentCredsAvailable({\n agent: 'claude-code',\n image: cfg.effective.box.image,\n });\n } catch (err) {\n if (err instanceof MissingAgentCredsError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const maxRunningOverride = parseMaxOption('--max-running', opts.maxRunning);\n const maxWorkingOverride = parseMaxOption('--max-working', opts.maxWorking);\n const result = await submitQueueJob({\n agent: 'claude-code',\n boxName: opts.name ?? '',\n providerName,\n prompt: opts.initialPrompt,\n agentArgs: claudeArgs,\n createOpts: pickCreateOpts(opts),\n maxRunningOverride,\n maxWorkingOverride,\n });\n outro(\n `job ${result.job.id} queued (${String(result.runningCount)}/${String(result.maxConcurrent)} running); log: ${result.job.logPath}`,\n );\n cmdLog.close();\n return;\n }\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n // Resolve auth from host env or the legacy ~/.agentbox/auth.json\n // setup-token (the dormant CI fallback).\n const resolved = await resolveClaudeAuth(process.env);\n\n // First-run sign-in offer is Docker-only — the cloud path seeds creds via\n // the per-agent Daytona volume (see ensureAgentVolumesForCloud).\n if (!isCloud) {\n await maybeRunClaudeLogin({\n image: cfg.effective.box.image,\n authSource: resolved.source,\n yes: !!opts.yes,\n hostWorkspace: opts.workspace,\n });\n }\n\n // Portless is Docker Desktop-only — skip on cloud.\n const portlessEnabled = isCloud\n ? undefined\n : await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask BEFORE the\n // wizard so the user sees the host-secrets prompt while still in the\n // pre-create phase. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\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 provider: providerName,\n withEnv: cfg.effective.box.withEnv,\n });\n let effectiveClaudeArgs = claudeArgs;\n if (wiz.action === 'launch-with-prompt' && wiz.initialPrompt) {\n effectiveClaudeArgs = buildPromptArgs('claude-code', wiz.initialPrompt, claudeArgs);\n }\n\n // Validate branch selection before any provider work so a typo doesn't\n // leave a half-created box.\n let fromBranch: string | undefined;\n let useBranch: string | undefined;\n try {\n ({ fromBranch, useBranch } = await resolveBranchSelection({\n useBranch: opts.useBranch,\n fromBranch: opts.fromBranch,\n repo: opts.workspace,\n providerName,\n cloudUseCurrentBranch: cfg.effective.cloud.useCurrentBranch,\n log: (m) => cmdLog.write(m),\n }));\n } catch (err) {\n if (err instanceof FromBranchError || err instanceof UseBranchError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n\n if (isCloud) {\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n await cloudAgentCreate({\n provider,\n request: {\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n envFilesToImport: wiz.envFilesToImport,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n fromBranch,\n useBranch,\n projectRoot,\n },\n binary: 'claude',\n sessionName: cfg.effective.claude.sessionName,\n mode: 'claude',\n extraArgs: effectiveClaudeArgs,\n verbose: opts.verbose === true,\n openIn: cfg.effective.attach.openIn,\n attach: opts.attach !== false,\n beforeStart: resumePrepared\n ? async (box) => {\n try {\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared!,\n log: (line) => cmdLog.write(line),\n });\n return { agentArgsPrefix: resumePrepared!.forwardArgs };\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n : undefined,\n });\n return;\n }\n\n // host-snapshot default off: with the overlay retired, the snapshot is\n // only the tar-pipe source for the no-git case, and skipped entirely for\n // git-detected workspaces. Explicit flag/config still wins.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n const sessionName = cfg.effective.claude.sessionName;\n\n const s = makeProgressReporter(opts.verbose === true);\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 fromBranch,\n useBranch,\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 envFilesToImport: wiz.envFilesToImport,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\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 cmdLog.write('checking plugin native deps');\n const rebuild = await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n\n if (resumePrepared) {\n s.message('uploading claude session into box');\n cmdLog.write('uploading claude session into box');\n try {\n const provider = await providerForBox(result.record);\n await uploadTeleport({\n box: result.record,\n provider,\n resolved: resumePrepared,\n log: (line) => {\n s.message(clampSpinnerLine(line));\n cmdLog.write(line);\n },\n });\n effectiveClaudeArgs = [...resumePrepared.forwardArgs, ...effectiveClaudeArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n log.info(\n `The box ${result.record.container} is up but unused. Destroy it with: agentbox destroy ${result.record.container} -y`,\n );\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\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 logPrune(rebuild);\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 maybeShowInstallHint();\n\n if (opts.attach === false) {\n outro(\n `session started — attach with: agentbox claude attach ${reattachRef(result.record)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves claude running');\n await attachClaudeWrapped(\n result.record,\n sessionName,\n reattachRef(result.record),\n (m) => cmdLog.write(m),\n cfg.effective.attach.openIn,\n );\n } catch (err) {\n s.stop('failed');\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);\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 cmdLog.close();\n process.exit(1);\n }\n handleLifecycleError(err);\n } finally {\n cmdLog.close();\n }\n });\n\ninterface ClaudeStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n attachIn?: string; // raw `--attach-in <mode>` value, validated below.\n inline?: boolean; // -i / --inline: shortcut for --attach-in same.\n attach?: boolean; // commander: --no-attach => false; default true.\n continue?: boolean; // -c / --continue: teleport newest session for cwd.\n resume?: string; // --resume <id>: teleport specific session.\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 resumePrepared?: ResolvedTeleport | null,\n): Promise<void> {\n const attachIn = resolveAttachInOption(opts);\n const cliOverrides: Partial<UserConfig> = {};\n if (opts.sessionName) cliOverrides.claude = { sessionName: opts.sessionName };\n if (attachIn !== undefined) cliOverrides.attach = { openIn: attachIn };\n const cfg = await loadEffectiveConfig(box.workspacePath, { cliOverrides });\n const sessionName = cfg.effective.claude.sessionName;\n const openIn = cfg.effective.attach.openIn;\n const wantAttach = opts.attach !== false;\n // Read-only — used to gate the first-run login offer (respect an intentional\n // host ANTHROPIC_API_KEY). The box already exists, so `resolved.env` is not\n // forwarded here.\n const resolved = await resolveClaudeAuth(process.env);\n\n // Auto-unpause/start. Mirrors `agentbox shell` / `agentbox code`.\n // `startBox` 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 // A login can't be inserted into a live session; an unauthenticated one\n // shows claude's own in-TUI `/login` on attach.\n const existing = await claudeSessionInfo(box.container, sessionName);\n if (existing.running) {\n if (resumePrepared) {\n throw new Error(\n `cannot resume into ${box.name}: a Claude session is already running. Detach and kill the session first (Control+a then :kill-session), or use \\`agentbox claude attach\\` to reattach to the live one.`,\n );\n }\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" already running — attach with: agentbox claude attach ${reattachRef(box)}`,\n );\n return;\n }\n outro(`session \"${sessionName}\" already running — attaching (Control+a d to detach)`);\n await attachClaudeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n return;\n }\n\n // First-run sign-in offer — before any box prep, so the user signs in up\n // front. No-op when credentials already exist or this isn't interactive.\n await maybeRunClaudeLogin({\n image: box.image,\n authSource: resolved.source,\n yes: false,\n hostWorkspace: box.workspacePath,\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` 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');\n await startBox(box.id);\n }\n\n // Re-sync the host's ~/.claude into the box volume so any updates the user\n // made on the host (new MCP servers, refreshed OAuth state in _claude.json,\n // …) reach the in-box claude. This runs for `claude start` (default; opt out\n // with --no-sync-config) — NOT for `claude attach`, which always passes\n // syncConfig: false: a plain reattach must never clobber the in-box claude's\n // accumulated _claude.json (prompt history) with the host copy.\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 // Box-only: ensure /agentbox-setup is in the volume (image-seeded, never\n // on the host). Re-copied every run so an image upgrade propagates.\n const claudeVolume = box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME;\n await seedSetupSkillIntoVolume(claudeVolume, box.image);\n\n // Mirror the in-box OAuth credentials with the host backup. Runs regardless\n // of --no-sync-config (this is not the host ~/.claude rsync) — it keeps the\n // backup fresh as the in-box claude rotates its token, and seeds an isolate\n // box's volume from an up-front `maybeRunClaudeLogin`.\n await syncClaudeCredentials(\n { volume: claudeVolume },\n { image: box.image, isolate: claudeVolume !== SHARED_CLAUDE_VOLUME },\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 let effectiveArgs = claudeArgs;\n if (resumePrepared) {\n s.message('uploading claude session into box');\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared,\n log: (line) => s.message(clampSpinnerLine(line)),\n });\n effectiveArgs = [...resumePrepared.forwardArgs, ...effectiveArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n\n s.message('starting claude session');\n await startClaudeSession({\n container: box.container,\n claudeArgs: effectiveArgs,\n sessionName,\n boxName: box.name,\n });\n\n s.stop(`box ${box.container} ready`);\n logPrune(rebuild);\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 if (!wantAttach) {\n outro(\n `session \"${sessionName}\" started — attach with: agentbox claude attach ${reattachRef(box)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves claude running');\n await attachClaudeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\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; never re-syncs ~/.claude — use `claude start` for that)',\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('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\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('Attaching to Claude session...');\n try {\n const attachIn = resolveAttachInOption(opts);\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') !== 'docker') {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'claude',\n sessionName: opts.sessionName ?? 'claude',\n mode: 'claude',\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n // A plain reattach must never touch host config. Force syncConfig off so\n // the no-session path starts a fresh session without the host->volume\n // rsync (which would overwrite the in-box _claude.json / prompt history).\n await startOrAttachClaude(box, [], { ...opts, syncConfig: false });\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 .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .option('-d, --no-attach', NO_ATTACH_HELP)\n .option(\n '-c, --continue',\n 'teleport the most recent host Claude Code session for this cwd into the box and resume',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Claude Code session id into the box and resume',\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('Starting Claude in a box...');\n try {\n const attachIn = resolveAttachInOption(opts);\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 let effectiveClaudeArgs = shifted && idOrName ? [idOrName, ...claudeArgs] : claudeArgs;\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'claude',\n hostCwd: box.workspacePath,\n mode: resumeMode,\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n if ((box.provider ?? 'docker') !== 'docker') {\n if (opts.attach === false) {\n outro(\n `--no-attach: cloud agent sessions are started lazily on attach. Run: agentbox claude attach ${reattachRef(box)}`,\n );\n return;\n }\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n if (resumePrepared) {\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({ box, provider, resolved: resumePrepared });\n effectiveClaudeArgs = [...resumePrepared.forwardArgs, ...effectiveClaudeArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n await cloudAgentAttach({\n box,\n binary: 'claude',\n sessionName: opts.sessionName ?? 'claude',\n mode: 'claude',\n extraArgs: effectiveClaudeArgs,\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachClaude(box, effectiveClaudeArgs, opts, resumePrepared);\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 claudeLoginCommand = new Command('login')\n .description(\n 'Sign in to Claude for use in sandboxes (forwards args to `claude auth login`, e.g. --sso, --console). Runs in a throwaway container against the shared claude-config volume — usable before the first `agentbox claude`.',\n )\n .argument(\n '[args...]',\n 'extra args forwarded to `claude auth login`; place after `--`, e.g. `agentbox claude login -- --sso`',\n )\n .action(async (args: string[]) => {\n intro('Signing in to Claude...');\n if (!process.stdin.isTTY) {\n log.error('`agentbox claude login` needs an interactive terminal.');\n process.exit(1);\n }\n try {\n const cfg = await loadEffectiveConfig(process.cwd());\n const image = cfg.effective.box.image;\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n s.stop('image ready');\n\n // Throwaway `docker run` against the shared volume — the written\n // credentials persist there and `syncClaudeCredentials` mirrors them to\n // the host backup, so every later box (shared or isolate) is seeded.\n const exitCode = await runClaudeLoginContainer(image, args);\n if (exitCode !== 0) {\n log.warn(`\\`claude auth login\\` exited with code ${String(exitCode)}`);\n process.exit(exitCode);\n }\n outro('signed in — credentials saved for future boxes');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nclaudeCommand.addCommand(claudeAttachCommand);\nclaudeCommand.addCommand(claudeStartCommand);\nclaudeCommand.addCommand(claudeLoginCommand);\n","import { readFile } from 'node:fs/promises';\nimport { 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. */\n source: 'host-env' | 'auth-file' | 'none';\n}\n\n/**\n * Merge host env + the legacy `~/.agentbox/auth.json` setup-token into the\n * effective env that the `claude` command forwards to the box. Env wins over\n * the file; either of the two known keys (API key or OAuth token) counts as\n * having auth.\n *\n * This is the **dormant fallback** path. The primary auth flow is the in-box\n * interactive OAuth login, persisted by `syncClaudeCredentials` — a box that\n * has real credentials in its claude-config volume ignores any forwarded\n * `CLAUDE_CODE_OAUTH_TOKEN` anyway. `auth.json` is only ever read here, never\n * written, kept so existing users and CI keep working.\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","import { stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n hostBackupHasCredentials,\n OPENCODE_FORWARDED_ENV_KEYS,\n SHARED_CODEX_VOLUME,\n SHARED_OPENCODE_VOLUME,\n volumeHasCodexAuth,\n volumeHasOpencodeAuth,\n} from '@agentbox/sandbox-docker';\nimport type { QueueAgentKind } from '@agentbox/relay';\nimport { resolveClaudeAuth } from '../../auth.js';\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * True when Claude is already authenticated on the host: a forwarded env var\n * (`ANTHROPIC_API_KEY` / `CLAUDE_CODE_OAUTH_TOKEN`), the legacy\n * `~/.agentbox/auth.json` setup-token, or a real OAuth refresh token in the\n * host backup (`~/.agentbox/claude-credentials.json`). The backup is what the\n * foreground sync writes whenever a box's claude logs in, so its presence is\n * the load-bearing signal that the shared volume has been seeded.\n */\nexport async function claudeAuthAvailable(env: NodeJS.ProcessEnv): Promise<boolean> {\n const resolved = await resolveClaudeAuth(env);\n if (resolved.source !== 'none') return true;\n return hostBackupHasCredentials();\n}\n\n/**\n * True when Codex is already authenticated: `OPENAI_API_KEY` in env, a host\n * `~/.codex/auth.json`, or an `auth.json` already in the shared codex-config\n * volume. Mirrors the foreground command's local helper so the `-i`\n * pre-flight and the interactive login offer agree on what counts as\n * \"seeded\".\n */\nexport async function codexAuthAvailable(\n image: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<boolean> {\n if ((env['OPENAI_API_KEY'] ?? '').length > 0) return true;\n if (await fileExists(join(homedir(), '.codex', 'auth.json'))) return true;\n return volumeHasCodexAuth(SHARED_CODEX_VOLUME, image);\n}\n\n/**\n * True when OpenCode is already authenticated: any of its forwarded provider\n * env keys, a host `~/.local/share/opencode/auth.json`, or an `auth.json`\n * already in the shared opencode volume.\n */\nexport async function opencodeAuthAvailable(\n image: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<boolean> {\n for (const k of OPENCODE_FORWARDED_ENV_KEYS) {\n if ((env[k] ?? '').length > 0) return true;\n }\n if (await fileExists(join(homedir(), '.local', 'share', 'opencode', 'auth.json'))) return true;\n return volumeHasOpencodeAuth(SHARED_OPENCODE_VOLUME, image);\n}\n\nconst MESSAGES: Record<QueueAgentKind, string> = {\n 'claude-code':\n '-i / --initial-prompt: no Claude credentials on host. Run `agentbox claude login` first (or `agentbox claude` interactively) to seed them, then retry.',\n codex:\n '-i / --initial-prompt: no Codex credentials on host. Run `agentbox codex login` first (or set OPENAI_API_KEY) to seed them, then retry.',\n opencode:\n '-i / --initial-prompt: no OpenCode credentials on host. Run `agentbox opencode login` first to seed them, then retry.',\n};\n\nexport class MissingAgentCredsError extends Error {\n readonly agent: QueueAgentKind;\n constructor(agent: QueueAgentKind, message: string) {\n super(message);\n this.name = 'MissingAgentCredsError';\n this.agent = agent;\n }\n}\n\nexport interface AssertAgentCredsInput {\n agent: QueueAgentKind;\n image: string;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Pre-flight for the background `-i` path: throw `MissingAgentCredsError`\n * when the chosen agent has no host-side credentials to seed into the box.\n * The worker (`_run-queued-job.ts`) runs in detached mode with no attach, so\n * an unauthenticated in-box agent would silently sit on its `/login` UI with\n * the user's prompt unprocessed until the user re-attaches — that is the UX\n * this guard prevents.\n */\nexport async function assertAgentCredsAvailable(input: AssertAgentCredsInput): Promise<void> {\n const env = input.env ?? process.env;\n let ok = false;\n if (input.agent === 'claude-code') {\n ok = await claudeAuthAvailable(env);\n } else if (input.agent === 'codex') {\n ok = await codexAuthAvailable(input.image, env);\n } else {\n ok = await opencodeAuthAvailable(input.image, env);\n }\n if (!ok) throw new MissingAgentCredsError(input.agent, MESSAGES[input.agent]);\n}\n","import { resolveAgentLauncher, type AgentKind } from '@agentbox/core';\n\n/**\n * Build the argv the in-box agent CLI is launched with, slotting `prompt` as\n * the first positional so claude/codex/opencode all pick it up as the seed\n * user turn. Mirrors what the setup-wizard path already does in claude.ts;\n * lifted here so the three commands and the queued worker all agree on the\n * shape. Empty prompt is a no-op — userArgs are returned as-is.\n */\nexport function buildPromptArgs(\n agentKind: AgentKind,\n prompt: string,\n userArgs: string[],\n): string[] {\n return resolveAgentLauncher(agentKind).buildArgs(prompt, userArgs);\n}\n","/**\n * Validate a `--max-*` count flag from commander into a positive integer;\n * throws on garbage. Shared by the `--max-running` / `--max-working` queue\n * gates on the claude / codex / opencode commands.\n */\nexport function parseMaxOption(flag: string, raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`${flag}: expected a positive integer, got \"${raw}\"`);\n }\n return n;\n}\n","import { randomBytes } from 'node:crypto';\nimport { request as httpRequest } from 'node:http';\nimport {\n defaultCountRunningBoxes,\n loadQueueConfig,\n queueLogPath,\n writeJob,\n type QueueAgentKind,\n type QueueJob,\n type QueueJobCreateOpts,\n} from '@agentbox/relay';\nimport { DEFAULT_RELAY_PORT, ensureRelay } from '@agentbox/sandbox-docker';\n\nexport interface SubmitQueueJobInput {\n agent: QueueAgentKind;\n boxName: string;\n providerName: string;\n prompt: string;\n agentArgs: string[];\n createOpts: QueueJobCreateOpts;\n /** Per-invocation override of queue.maxConcurrent. */\n maxRunningOverride?: number;\n /** Per-invocation override of queue.maxWorking. */\n maxWorkingOverride?: number;\n}\n\nexport interface SubmitQueueJobResult {\n job: QueueJob;\n /** Cross-provider running count at the time of submit (informational only). */\n runningCount: number;\n /** Effective ceiling used for the job (override or global). */\n maxConcurrent: number;\n /** Whether the manifest was visible to the relay's scheduler immediately. */\n pokedRelay: boolean;\n}\n\n/**\n * Write a queued job manifest, ensure the host relay is running, and notify\n * it via `POST /admin/queue/enqueue` so the scheduler picks up the new entry\n * without waiting for the next periodic tick. Best-effort on the HTTP call:\n * if the relay is unreachable the manifest still lives on disk and the next\n * tick (after the relay starts) will see it.\n */\nexport async function submitQueueJob(\n input: SubmitQueueJobInput,\n): Promise<SubmitQueueJobResult> {\n const cfg = await loadQueueConfig();\n const ceiling =\n typeof input.maxRunningOverride === 'number' && input.maxRunningOverride > 0\n ? input.maxRunningOverride\n : cfg.maxConcurrent;\n\n const maxWorking =\n typeof input.maxWorkingOverride === 'number' && input.maxWorkingOverride > 0\n ? input.maxWorkingOverride\n : undefined;\n\n const id = newJobId();\n const job: QueueJob = {\n id,\n agent: input.agent,\n status: 'queued',\n boxName: input.boxName,\n providerName: input.providerName,\n prompt: input.prompt,\n agentArgs: input.agentArgs,\n createOpts: input.createOpts,\n maxConcurrent: ceiling,\n ...(maxWorking !== undefined ? { maxWorking } : {}),\n createdAt: new Date().toISOString(),\n logPath: queueLogPath(id),\n };\n await writeJob(job);\n\n let runningCount = 0;\n try {\n runningCount = await defaultCountRunningBoxes();\n } catch {\n runningCount = 0;\n }\n\n let pokedRelay = false;\n try {\n await ensureRelay();\n await postEnqueue(id);\n pokedRelay = true;\n } catch {\n // Manifest is on disk; next relay tick (after a future `ensureRelay`)\n // picks it up. Suppress the noise on a relay-down case — the CLI's\n // outer command already prints a `log: <path>` for the per-job log.\n }\n\n return { job, runningCount, maxConcurrent: ceiling, pokedRelay };\n}\n\nfunction newJobId(): string {\n // 9-byte URL-safe id (18 hex). Short enough to type, wide enough to never\n // collide in practice. Mirrors the existing per-box mnemonic id length.\n return randomBytes(9).toString('hex');\n}\n\nfunction postEnqueue(id: string): Promise<void> {\n const json = JSON.stringify({ id });\n return new Promise<void>((resolveP, rejectP) => {\n const req = httpRequest(\n {\n host: '127.0.0.1',\n port: DEFAULT_RELAY_PORT,\n method: 'POST',\n path: '/admin/queue/enqueue',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(json).toString(),\n },\n timeout: 2_000,\n },\n (res) => {\n res.resume();\n const status = res.statusCode ?? 0;\n if (status >= 200 && status < 300) resolveP();\n else rejectP(new Error(`enqueue → ${String(status)}`));\n },\n );\n req.on('error', rejectP);\n req.on('timeout', () => {\n req.destroy();\n rejectP(new Error('enqueue timeout'));\n });\n req.write(json);\n req.end();\n });\n}\n","import type { AttachOpenIn } from '@agentbox/config';\n\nconst VALUES: readonly AttachOpenIn[] = ['split', 'window', 'tab', 'same'] as const;\n\nexport const ATTACH_IN_HELP =\n 'where to open the attached session: split | window | tab | same (default from attach.openIn, built-in: split). Only effective when running inside tmux or iTerm2; falls back to inline attach otherwise.';\n\nexport const INLINE_HELP =\n 'attach inline in the current terminal (shortcut for --attach-in same; useful when attach.openIn defaults to split/window/tab). The short `-i` form was reassigned to `--initial-prompt` on the create-style commands (claude/codex/opencode).';\n\nexport const NO_ATTACH_HELP =\n 'create the box and start the agent session, but do not attach (background mode); prints the box ref and exits 0. Re-attach later with `agentbox <agent> attach <box>`.';\n\n/**\n * Validate a `--attach-in` value as it comes off commander. Returns\n * `undefined` when the flag was absent (so it doesn't clobber the config-layer\n * value); throws a clear error on a typo.\n */\nexport function parseAttachInOption(raw: string | undefined): AttachOpenIn | undefined {\n if (raw === undefined) return undefined;\n if (!(VALUES as readonly string[]).includes(raw)) {\n throw new Error(\n `--attach-in: expected one of ${VALUES.join(', ')}, got \"${raw}\"`,\n );\n }\n return raw as AttachOpenIn;\n}\n\n/**\n * Resolve `--attach-in <mode>` + `--inline`/`-i` into a single `AttachOpenIn`.\n * `--attach-in` wins when both are given (more specific overrides the\n * shortcut); `--inline` alone maps to `'same'`; absent flags resolve to\n * `undefined` so the config-layer value still applies.\n */\nexport function resolveAttachInOption(opts: {\n attachIn?: string;\n inline?: boolean;\n}): AttachOpenIn | undefined {\n if (opts.attachIn !== undefined) return parseAttachInOption(opts.attachIn);\n if (opts.inline === true) return 'same';\n return undefined;\n}\n","/**\n * Shared \"cloud create + agent attach\" path for `agentbox claude`,\n * `agentbox codex`, `agentbox opencode` when `--provider` resolves to a\n * non-docker backend (today only `daytona`). Without it those default actions\n * silently fall through to docker — `agentbox claude --provider daytona` would\n * make a docker box, ignoring the flag.\n *\n * What this does:\n * 1. Calls `provider.create(req)` (provider-neutral — credential volumes,\n * env-files, workspace seed, ctl daemon all happen inside).\n * 2. Hands the resulting `BoxRecord` to `cloudAgentAttach` which SSH+tmux-\n * attaches the agent CLI. Extra `<agent>-args` are threaded through via\n * the base64-encoded launcher (see `buildCloudAttachInnerCommand`).\n *\n * The Docker fast path in each agent command stays untouched: this helper\n * only runs when the caller pre-resolved a non-docker provider.\n */\n\nimport { log, outro } from '@clack/prompts';\nimport type { BoxRecord, CreateBoxRequest, Provider } from '@agentbox/core';\nimport type { AttachOpenIn } from '@agentbox/config';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\n\nexport interface CloudAgentCreateArgs {\n /** Pre-resolved provider (from `providerForCreate`). */\n provider: Provider;\n /** Box create request; `onLog` is overwritten by this helper. */\n request: Omit<CreateBoxRequest, 'onLog'>;\n /** Agent binary inside the sandbox (`claude`, `codex`, `opencode`). */\n binary: string;\n /** Tmux session name (e.g. `claude`). */\n sessionName: string;\n /** Mode label for the wrapper's footer. */\n mode: 'claude' | 'codex' | 'opencode';\n /** Args passed to the agent after `--`. Threaded through to the attached CLI. */\n extraArgs?: string[];\n /** Bypass the spinner and stream raw provider output to stderr. */\n verbose?: boolean;\n /** Where to open the attached session; forwarded to `cloudAgentAttach`. */\n openIn?: AttachOpenIn;\n /** When `false`, create the cloud box and skip the agent attach (background\n * mode). Defaults to `true`. On cloud providers the agent's tmux session is\n * created lazily by `cloudAgentAttach`; with `attach: false` the session\n * isn't started yet — a later `agentbox <agent> attach <box>` starts it on\n * first attach. */\n attach?: boolean;\n /**\n * Hook fired AFTER the box is provisioned and BEFORE the agent attach starts\n * the in-box tmux session. Used by the session-teleport path to upload a\n * host session file into the new sandbox before the agent CLI launches. May\n * mutate `extraArgs` indirectly via the returned `agentArgsPrefix`.\n */\n beforeStart?: (box: BoxRecord) => Promise<{ agentArgsPrefix?: string[] } | void>;\n}\n\n/**\n * Provision a cloud box and attach the requested agent. Calls process.exit\n * via `cloudAgentAttach` → `runWrappedAttach`; this function does not return\n * on the happy path.\n */\nexport async function cloudAgentCreate(args: CloudAgentCreateArgs): Promise<void> {\n const s = makeProgressReporter(args.verbose === true);\n s.start('creating cloud box');\n try {\n const result = await args.provider.create({\n ...args.request,\n onLog: (line) => s.message(line),\n });\n const nSuffix =\n typeof result.record.projectIndex === 'number'\n ? ` · n ${String(result.record.projectIndex)}`\n : '';\n s.stop(`box ${result.record.name} ready${nSuffix}`);\n log.info(`id: ${result.record.id}`);\n log.info(`provider: ${result.record.provider}`);\n if (result.record.cloud?.sandboxId) {\n log.info(`sandboxId: ${result.record.cloud.sandboxId}`);\n }\n let extraArgs = args.extraArgs;\n if (args.beforeStart) {\n const hook = await args.beforeStart(result.record);\n if (hook && hook.agentArgsPrefix && hook.agentArgsPrefix.length > 0) {\n extraArgs = [...hook.agentArgsPrefix, ...(extraArgs ?? [])];\n }\n }\n if (args.attach === false) {\n outro(\n `session not started — attach with: agentbox ${args.mode} attach ${result.record.name}`,\n );\n return;\n }\n outro(`attaching ${args.mode} — Control+a d to detach, leaves the agent running`);\n await cloudAgentAttach({\n box: result.record,\n binary: args.binary,\n sessionName: args.sessionName,\n mode: args.mode,\n extraArgs,\n openIn: args.openIn,\n });\n } catch (err) {\n s.stop('cloud box create failed');\n throw err;\n }\n}\n","/**\n * `makeProgressReporter(verbose)` — small adapter around the clack spinner\n * that lets long-running commands (`create`, `claude`, `codex`,\n * `opencode`) opt into a `-v / --verbose` mode that bypasses the spinner\n * entirely and streams raw output to stderr.\n *\n * Without `--verbose` the returned object proxies a clack `spinner()`:\n * - `start(label)` → `s.start(label)`\n * - `message(line)` → `s.message(clampSpinnerLine(line))`\n * - `stop(label)` → `s.stop(label)`\n *\n * With `--verbose` the spinner is never created. `start` / `stop` write a\n * single status line to stderr; `message` writes the raw, unclamped line\n * (preserving any newlines from the provider). This is the right mode\n * for the ~7-min cold cloud create where users want to see real progress.\n *\n * Either way, callers should still write every line to `cmdLog` so the\n * full transcript lands in `~/.agentbox/logs/<command>.log`. This helper\n * only handles the user-visible surface.\n */\nimport { spinner } from '@clack/prompts';\nimport { clampSpinnerLine } from '../spinner-line.js';\n\nexport interface ProgressReporter {\n start(label: string): void;\n message(line: string): void;\n stop(label: string): void;\n}\n\nexport function makeProgressReporter(verbose: boolean): ProgressReporter {\n if (!verbose) {\n const s = spinner();\n return {\n start: (label) => s.start(label),\n message: (line) => s.message(clampSpinnerLine(line)),\n stop: (label) => s.stop(label),\n };\n }\n return {\n start: (label) => process.stderr.write(`${label} (verbose)\\n`),\n message: (line) => process.stderr.write(line.endsWith('\\n') ? line : line + '\\n'),\n stop: (label) => process.stderr.write(`${label}\\n`),\n };\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. Two ways the redraw gets out of\n * sync with the actual rendered output:\n *\n * 1. When a single-line message is longer than the terminal is wide, the\n * terminal wraps it onto extra visual rows the spinner doesn't know\n * about — the next frame's clear hits only the last visual row and the\n * 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\n * past 100 columns.\n *\n * 2. When the message itself contains embedded newlines (multi-line),\n * clack only redraws the *first* line; subsequent lines from the\n * previous frame stay on the terminal, producing the \"stair-stepped\"\n * pile-up seen during `agentbox create --provider daytona` where\n * Daytona's `Image.fromDockerfile` callback hands us whole multi-line\n * chunks.\n *\n * The fix is to collapse multi-line input to its last non-empty line (the\n * most recent progress signal) and then clamp width.\n *\n * Falls back to the raw single-line input on non-TTY stdout (no spinner is\n * drawn, so wrapping is harmless).\n */\nconst SPINNER_CHROME = 6;\n\nexport function clampSpinnerLine(line: string): string {\n // Collapse to a single line first — the last non-empty line is almost\n // always the freshest progress signal (e.g. \"Get:21 http://... [49 kB]\").\n const collapsed = collapseToLastLine(line);\n const cols = process.stdout.columns;\n if (!process.stdout.isTTY || !cols) return collapsed;\n const trimmed = collapsed.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\nfunction collapseToLastLine(s: string): string {\n // Strip CR (so CRLF and bare \\r progress bars both fold) and split on \\n.\n const lines = s.replace(/\\r/g, '\\n').split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line && line.trim().length > 0) return line;\n }\n return '';\n}\n","import { join } from 'node:path';\nimport { loadCarrySection } from '@agentbox/ctl';\nimport type { ResolvedCarryEntry } from '@agentbox/core';\nimport { promptForCarry } from '../carry-prompt.js';\nimport { resolveCarry } from './carry-resolve.js';\n\nexport interface CarryGateArgs {\n /** Absolute project root (dir holding agentbox.yaml). */\n projectRoot: string;\n /** `-y` / `--yes` — does NOT auto-approve carry. */\n yes: boolean;\n /** `--carry-yes` or AGENTBOX_CARRY_YES=1 — auto-approves. */\n carryYesFlag?: boolean;\n /** `--carry skip` or AGENTBOX_CARRY=skip — skip carry for this run. */\n carrySkipFlag?: boolean;\n onLog?: (line: string) => void;\n}\n\nexport type CarryGateResult =\n | { decision: 'approve'; entries: ResolvedCarryEntry[] }\n | { decision: 'skip'; entries: [] }\n | { decision: 'cancel' };\n\n/**\n * Run the host-side carry gate once for a `create`-style command:\n * 1. read `<projectRoot>/agentbox.yaml`'s `carry:` block (empty when missing),\n * 2. resolve + safety-check each entry,\n * 3. prompt the user (or honor --carry-yes / --carry=skip / env vars),\n * 4. return the approved entries (or signal cancel).\n *\n * Throws on hard resolver errors (non-optional missing src, denylist hit, size\n * cap, etc.) so the caller can abort *before* the box is created.\n */\nexport async function runCarryGate(args: CarryGateArgs): Promise<CarryGateResult> {\n const log = args.onLog ?? (() => {});\n const yamlPath = join(args.projectRoot, 'agentbox.yaml');\n\n const items = await loadCarrySection(yamlPath);\n if (items.length === 0) return { decision: 'approve', entries: [] };\n\n const resolved = await resolveCarry(items, { projectRoot: args.projectRoot });\n if (resolved.errors.length > 0) {\n const msg = ['carry: refused to proceed:', ...resolved.errors.map((e) => ` - ${e}`)].join('\\n');\n throw new Error(msg);\n }\n\n const carryYesEnv = process.env.AGENTBOX_CARRY_YES === '1';\n const carrySkipEnv = process.env.AGENTBOX_CARRY === 'skip';\n const carryYes = args.carryYesFlag ?? carryYesEnv;\n const carrySkip = args.carrySkipFlag ?? carrySkipEnv;\n\n const decision = await promptForCarry({\n resolved: resolved.entries,\n yes: args.yes,\n carryYes,\n carrySkip,\n });\n\n if (decision === 'cancel') return { decision: 'cancel' };\n if (decision === 'skip-this-run') {\n log(`carry: skipped for this box (${String(resolved.entries.length)} entry/entries not copied)`);\n return { decision: 'skip', entries: [] };\n }\n return { decision: 'approve', entries: resolved.entries };\n}\n","import { isCancel, log, select } from '@clack/prompts';\nimport { fmtBytes } from './fmt.js';\nimport type { ResolvedCarryEntry } from './lib/carry-resolve.js';\n\nexport type CarryDecision = 'approve' | 'cancel' | 'skip-this-run';\n\nexport interface CarryPromptArgs {\n resolved: ResolvedCarryEntry[];\n /** --carry-yes flag (or AGENTBOX_CARRY_YES=1) — auto-approves the carry. */\n carryYes?: boolean;\n /** --carry=skip flag (or AGENTBOX_CARRY=skip) — proceed with carry disabled. */\n carrySkip?: boolean;\n /** The generic --yes / -y flag (does NOT auto-approve carry). */\n yes?: boolean;\n /** Caller-controlled TTY check; default: process.stdin.isTTY. */\n isTTY?: boolean;\n}\n\n/**\n * Decide whether to carry the resolved entries. Caller invokes this once per\n * `create`-style command. The returned decision tells the caller to proceed\n * with the entries, skip them, or abort the whole create.\n *\n * Throws when `--yes` is passed on a non-TTY with non-empty carry entries —\n * `-y` MUST NOT silently exfiltrate host secrets. The error message tells the\n * user the explicit env var to set.\n */\nexport async function promptForCarry(args: CarryPromptArgs): Promise<CarryDecision> {\n // Empty carry: nothing to ask. Always approve so the caller's branch is\n // uniform (\"if decision === 'approve' && entries.length\") regardless of\n // whether the user has a carry: block at all.\n if (args.resolved.length === 0) return 'approve';\n\n if (args.carrySkip) return 'skip-this-run';\n if (args.carryYes) return 'approve';\n\n const tty = args.isTTY ?? process.stdin.isTTY;\n\n if (args.yes) {\n if (!tty) {\n throw new Error(\n 'carry: requires approval but stdin is not a TTY and --carry-yes was not set. ' +\n 'In CI, set AGENTBOX_CARRY_YES=1 to opt in to copying host secrets/files into this box, ' +\n 'or AGENTBOX_CARRY=skip to skip the carry block.',\n );\n }\n // -y on a TTY still falls through to the prompt — the prompt is the\n // user's explicit gate, not a \"wizard default\".\n }\n\n if (!tty) {\n throw new Error(\n 'carry: requires approval but stdin is not a TTY. ' +\n 'Set AGENTBOX_CARRY_YES=1 to opt in, or AGENTBOX_CARRY=skip to skip.',\n );\n }\n\n printSummary(args.resolved);\n\n const choice = await select<CarryDecision>({\n message: 'Copy these files inside the box?',\n options: [\n { value: 'approve', label: 'yes' },\n { value: 'skip-this-run', label: 'skip' },\n { value: 'cancel', label: 'cancel' },\n ],\n initialValue: 'approve',\n });\n\n if (isCancel(choice)) return 'cancel';\n return choice;\n}\n\nfunction printSummary(entries: ResolvedCarryEntry[]): void {\n const rows: string[] = [];\n const srcW = Math.max(3, ...entries.map((e) => e.rawSrc.length));\n const destW = Math.max(4, ...entries.map((e) => e.rawDest.length));\n rows.push(` ${pad('src', srcW)} → ${pad('dest', destW)} size flags`);\n for (const e of entries) {\n const flags: string[] = [];\n if (e.kind === 'missing') flags.push('optional');\n else if (e.optional) flags.push('optional');\n if (e.kind === 'dir') flags.push('dir');\n if (e.mode !== undefined) flags.push(`mode ${e.mode.toString(8).padStart(4, '0')}`);\n // Default user is 1000 (vscode); only show in flags when explicitly set\n // to something else, to keep the table calm in the common case.\n if (e.user !== undefined && e.user !== 1000) flags.push(`user ${String(e.user)}`);\n if (e.symlinkInfo === 'outside-home') flags.push('symlink → outside $HOME!');\n const size = e.kind === 'missing' ? '—' : fmtBytes(e.bytes ?? 0);\n rows.push(\n ` ${pad(e.rawSrc, srcW)} → ${pad(e.rawDest, destW)} ${pad(size, 9)} ${flags.join(', ')}`,\n );\n }\n log.message(rows.join('\\n'));\n}\n\nfunction pad(s: string, w: number): string {\n if (s.length >= w) return s;\n return s + ' '.repeat(w - s.length);\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 { realpath, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, join, normalize, resolve } from 'node:path';\nimport type { CarryItem } from '@agentbox/ctl';\n\n/**\n * One fully resolved carry entry, ready for the prompt and the per-provider\n * copy step. `rawSrc` / `rawDest` preserve what the user typed (for the prompt\n * to display); `absSrc` is the host-resolved path, `absDest` is the box-side\n * path with `~/` left intact (expanded inside the container at execute time\n * against the in-box `$HOME`).\n */\nexport interface ResolvedCarryEntry {\n rawSrc: string;\n rawDest: string;\n absSrc: string;\n absDest: string;\n kind: 'file' | 'dir' | 'missing';\n bytes?: number;\n mode?: number;\n /**\n * Numeric uid that should own the carried file inside the box. Mirrors\n * the field on `@agentbox/core`'s `ResolvedCarryEntry`. `resolveOne()`\n * below already forwards `item.user` into the result; this field made\n * the contract explicit so `carry-prompt.ts` can render the flag.\n */\n user?: number;\n optional: boolean;\n symlinkInfo?: 'safe' | 'outside-home';\n}\n\nexport interface ResolveOptions {\n /** Absolute path to the dir holding `agentbox.yaml`. `./` srcs anchor here. */\n projectRoot: string;\n /** Resolved $HOME for the user. Injected so tests can stub it. */\n homeDir?: string;\n /** Per-entry size cap in bytes; env override AGENTBOX_CARRY_MAX_BYTES. Default 50 MiB. */\n maxBytes?: number;\n}\n\nexport interface ResolveResult {\n entries: ResolvedCarryEntry[];\n errors: string[];\n}\n\nconst DEFAULT_MAX_BYTES = 50 * 1024 * 1024;\n\nconst DENYLIST_DEST_PREFIXES = ['/proc', '/sys', '/dev'];\nconst DENYLIST_DEST_EXACT = new Set(['/etc/passwd', '/etc/shadow']);\n\nexport async function resolveCarry(\n items: CarryItem[],\n opts: ResolveOptions,\n): Promise<ResolveResult> {\n const home = opts.homeDir ?? homedir();\n const cap = opts.maxBytes ?? readMaxBytesFromEnv() ?? DEFAULT_MAX_BYTES;\n const projectRoot = opts.projectRoot;\n\n const entries: ResolvedCarryEntry[] = [];\n const errors: string[] = [];\n\n for (const [i, item] of items.entries()) {\n const where = `carry[${String(i)}]`;\n try {\n const entry = await resolveOne(item, { projectRoot, home, cap, where });\n entries.push(entry);\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n }\n\n return { entries, errors };\n}\n\nfunction readMaxBytesFromEnv(): number | undefined {\n const raw = process.env.AGENTBOX_CARRY_MAX_BYTES;\n if (!raw) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return undefined;\n return Math.floor(n);\n}\n\ninterface OneCtx {\n projectRoot: string;\n home: string;\n cap: number;\n where: string;\n}\n\nasync function resolveOne(item: CarryItem, ctx: OneCtx): Promise<ResolvedCarryEntry> {\n const absSrc = expandHostPath(item.src, ctx);\n if (containsDotDot(absSrc)) {\n throw new Error(`${ctx.where}: resolved src \"${absSrc}\" contains .. — refused`);\n }\n\n validateBoxDest(item.dest, ctx);\n\n const optional = item.optional;\n const rawSrc = item.src;\n const rawDest = item.dest;\n const absDest = item.dest;\n\n let st: Awaited<ReturnType<typeof stat>>;\n try {\n st = await stat(absSrc);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n if (optional) {\n return {\n rawSrc,\n rawDest,\n absSrc,\n absDest,\n kind: 'missing',\n ...(item.mode !== undefined ? { mode: item.mode } : {}),\n ...(item.user !== undefined ? { user: item.user } : {}),\n optional: true,\n };\n }\n throw new Error(`${ctx.where}: host src \"${absSrc}\" does not exist (use optional: true to skip)`);\n }\n throw err;\n }\n\n // Symlink containment: a symlink whose target leaves both $HOME and\n // projectRoot is suspicious. Mark, don't reject — the prompt makes it loud.\n // Containment is computed in canonicalized space because macOS's /var\n // symlink to /private/var would otherwise make every tmpdir-rooted symlink\n // look \"outside\" its own project root.\n let symlinkInfo: 'safe' | 'outside-home' | undefined;\n try {\n const real = await realpath(absSrc);\n if (real !== absSrc) {\n const homeReal = await realpathSafe(ctx.home);\n const rootReal = await realpathSafe(ctx.projectRoot);\n if (!isInside(real, homeReal) && !isInside(real, rootReal)) {\n symlinkInfo = 'outside-home';\n } else {\n symlinkInfo = 'safe';\n }\n }\n } catch {\n /* best-effort; missing realpath shouldn't block carry */\n }\n\n if (st.isDirectory()) {\n const bytes = await dirSizeCapped(absSrc, ctx.cap);\n if (bytes > ctx.cap) {\n throw new Error(\n `${ctx.where}: dir \"${absSrc}\" exceeds ${String(ctx.cap)} bytes (set AGENTBOX_CARRY_MAX_BYTES to raise the cap or narrow the path)`,\n );\n }\n return {\n rawSrc,\n rawDest,\n absSrc,\n absDest,\n kind: 'dir',\n bytes,\n ...(item.mode !== undefined ? { mode: item.mode } : {}),\n ...(item.user !== undefined ? { user: item.user } : {}),\n optional,\n ...(symlinkInfo ? { symlinkInfo } : {}),\n };\n }\n\n if (st.isFile()) {\n if (st.size > ctx.cap) {\n throw new Error(\n `${ctx.where}: file \"${absSrc}\" is ${String(st.size)} bytes, exceeds cap ${String(ctx.cap)} (set AGENTBOX_CARRY_MAX_BYTES to raise)`,\n );\n }\n return {\n rawSrc,\n rawDest,\n absSrc,\n absDest,\n kind: 'file',\n bytes: st.size,\n ...(item.mode !== undefined ? { mode: item.mode } : {}),\n ...(item.user !== undefined ? { user: item.user } : {}),\n optional,\n ...(symlinkInfo ? { symlinkInfo } : {}),\n };\n }\n\n throw new Error(`${ctx.where}: src \"${absSrc}\" is neither a regular file nor a directory`);\n}\n\nfunction expandHostPath(src: string, ctx: OneCtx): string {\n if (src.startsWith('~/')) {\n return resolve(ctx.home, src.slice(2));\n }\n if (src.startsWith('./')) {\n return resolve(ctx.projectRoot, src.slice(2));\n }\n if (isAbsolute(src)) return resolve(src);\n // Schema rejects this shape, but defensive anyway.\n throw new Error(`${ctx.where}: src \"${src}\" must start with /, ~/, or ./`);\n}\n\nfunction containsDotDot(p: string): boolean {\n // After normalize, any `..` segment that survived is suspicious.\n const segs = normalize(p).split('/');\n return segs.some((s) => s === '..');\n}\n\nfunction validateBoxDest(dest: string, ctx: OneCtx): void {\n if (dest.length === 0) {\n throw new Error(`${ctx.where}.dest must not be empty`);\n }\n if (!dest.startsWith('/') && !dest.startsWith('~/')) {\n throw new Error(`${ctx.where}.dest \"${dest}\" must start with / or ~/`);\n }\n // Check the RAW path for `..` segments — must not normalize first because\n // normalize() collapses `a/../b` to `b`, hiding the traversal attempt.\n const rawTail = dest.startsWith('~/') ? dest.slice(2) : dest.slice(1);\n if (rawTail.split('/').some((s) => s === '..')) {\n throw new Error(`${ctx.where}.dest \"${dest}\" contains .. — refused`);\n }\n if (DENYLIST_DEST_EXACT.has(dest)) {\n throw new Error(`${ctx.where}.dest \"${dest}\" is on the denylist`);\n }\n for (const p of DENYLIST_DEST_PREFIXES) {\n if (dest === p || dest.startsWith(`${p}/`)) {\n throw new Error(`${ctx.where}.dest \"${dest}\" is on the denylist (prefix ${p})`);\n }\n }\n}\n\nfunction isInside(child: string, parent: string): boolean {\n const c = resolve(child);\n const p = resolve(parent);\n if (c === p) return true;\n return c.startsWith(p + '/');\n}\n\nasync function realpathSafe(p: string): Promise<string> {\n try {\n return await realpath(p);\n } catch {\n return resolve(p);\n }\n}\n\nasync function dirSizeCapped(dir: string, cap: number): Promise<number> {\n let total = 0;\n const seen = new Set<string>();\n async function walk(d: string): Promise<void> {\n if (total > cap) return;\n const { readdir } = await import('node:fs/promises');\n let names: string[];\n try {\n names = await readdir(d);\n } catch {\n return;\n }\n for (const name of names) {\n if (total > cap) return;\n const full = join(d, name);\n let st: Awaited<ReturnType<typeof stat>>;\n try {\n st = await stat(full);\n } catch {\n continue;\n }\n // Loop guard for symlink cycles via the symlink-resolved inode pair.\n const key = `${String(st.dev)}:${String(st.ino)}`;\n if (seen.has(key)) continue;\n seen.add(key);\n if (st.isDirectory()) {\n await walk(full);\n } else if (st.isFile()) {\n total += st.size;\n if (total > cap) return;\n }\n }\n }\n await walk(dir);\n return total;\n}\n","/**\n * Host-side validation for `--from-branch <ref>` and `--use-branch <name>`\n * on `create` / `claude` / `codex` / `opencode` / `code`.\n *\n * The flag tells the provider what base ref to fork the box's per-box branch\n * from instead of the host's current `HEAD`. We validate the ref *here*,\n * before any provider work, so a typo doesn't leave a half-created box.\n *\n * Behavior:\n * - undefined / empty → no-op, returns undefined.\n * - SHA-shaped (40-hex prefix, ≥7 chars): skip the fetch (a SHA either\n * resolves locally or never will; fetching `<remote> <SHA>` isn't a\n * standard refspec). Validate with `git rev-parse --verify <ref>^{commit}`.\n * - Otherwise (branch / tag name): run `git fetch <remote> <ref>` best-\n * effort so a stale clone of `origin/main` still picks up new commits.\n * Then validate.\n *\n * Returns the ref verbatim on success (the provider passes it to `git\n * worktree add` / `git clone --branch`). Throws with a friendly message on\n * any failure — the caller surfaces it via the usual error path.\n */\n\nimport { execa } from 'execa';\n\nconst SHA_RE = /^[0-9a-f]{7,40}$/i;\n\nexport class FromBranchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FromBranchError';\n }\n}\n\nexport interface ResolveFromBranchOpts {\n /** Host repo path; usually the workspace root. Used as `git -C <repo>`. */\n repo: string;\n /** Remote to fetch from for non-SHA refs. Defaults to 'origin'. */\n remote?: string;\n}\n\n/**\n * Validate / fetch the requested base ref. Returns the (verbatim) ref so the\n * caller can thread it into `req.fromBranch`. `undefined` input → returns\n * `undefined` without touching git.\n */\nexport async function resolveFromBranch(\n ref: string | undefined,\n opts: ResolveFromBranchOpts,\n): Promise<string | undefined> {\n if (!ref || ref.length === 0) return undefined;\n const remote = opts.remote ?? 'origin';\n const isSha = SHA_RE.test(ref);\n\n // For branch/tag refs, fetch first so `origin/main` (etc.) reflect the\n // remote's actual tip — boxes started from `--from-branch main` should\n // pick up new commits the user hasn't pulled locally yet.\n if (!isSha) {\n const fetched = await execa(\n 'git',\n ['-C', opts.repo, 'fetch', '--quiet', remote, ref],\n { reject: false },\n );\n if (fetched.exitCode !== 0) {\n // Soft-fail: the ref might be local-only (e.g. a private branch) — fall\n // through to the rev-parse check below so we still error clearly when\n // the ref is fully unknown.\n }\n }\n\n const verify = await execa(\n 'git',\n ['-C', opts.repo, 'rev-parse', '--verify', `${ref}^{commit}`],\n { reject: false },\n );\n if (verify.exitCode !== 0) {\n throw new FromBranchError(\n `--from-branch: unknown ref \"${ref}\" (not found in ${opts.repo} after fetch). ` +\n `Provide a branch, tag, or SHA reachable from the host repo.`,\n );\n }\n return ref;\n}\n\nexport class UseBranchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UseBranchError';\n }\n}\n\n/**\n * Host-side validation for `--use-branch <name>`. Unlike `--from-branch`\n * (which only picks a *base ref* to fork a fresh `agentbox/<box>` branch\n * from), `--use-branch` checks out the existing branch directly — so we\n * require a real local **branch** ref, not a tag or detached SHA. A box that\n * checks out a detached ref has nowhere to `git push`, so those are rejected.\n *\n * Best-effort `git fetch <remote> <name>` first so the branch tracks the\n * remote tip (the cloud bundle is built from the host's local ref state).\n * Returns the name verbatim on success; throws `UseBranchError` otherwise.\n * `undefined` / empty input → returns `undefined` without touching git.\n */\nexport async function resolveUseBranch(\n name: string | undefined,\n opts: ResolveFromBranchOpts,\n): Promise<string | undefined> {\n if (!name || name.length === 0) return undefined;\n const remote = opts.remote ?? 'origin';\n\n // Update the local branch to the remote tip when possible. Soft-fail: the\n // branch may be local-only, in which case the show-ref check below still\n // passes against the existing local ref.\n await execa('git', ['-C', opts.repo, 'fetch', '--quiet', remote, name], {\n reject: false,\n });\n\n const exists = await execa(\n 'git',\n ['-C', opts.repo, 'show-ref', '--verify', '--quiet', `refs/heads/${name}`],\n { reject: false },\n );\n if (exists.exitCode !== 0) {\n throw new UseBranchError(\n `--use-branch: no local branch \"${name}\" in ${opts.repo}. ` +\n `Create or check it out on the host first (--use-branch reuses an ` +\n `existing branch; use --from-branch to fork a new box branch from a ref).`,\n );\n }\n return name;\n}\n\n/**\n * The host workspace's current branch name (`git rev-parse --abbrev-ref\n * HEAD`). Returns `undefined` when HEAD is detached (git prints the literal\n * `HEAD`) or when the command fails. Used by the `cloud.useCurrentBranch`\n * config path to default cloud boxes onto the host's current branch.\n */\nexport async function currentHostBranch(repo: string): Promise<string | undefined> {\n const r = await execa('git', ['-C', repo, 'rev-parse', '--abbrev-ref', 'HEAD'], {\n reject: false,\n });\n if (r.exitCode !== 0) return undefined;\n const branch = r.stdout.trim();\n if (!branch || branch === 'HEAD') return undefined;\n return branch;\n}\n\nexport interface BranchSelectionOpts {\n /** Raw `--use-branch <name>` value (undefined when not passed). */\n useBranch?: string;\n /** Raw `--from-branch <ref>` value (undefined when not passed). */\n fromBranch?: string;\n /** Host repo path (the workspace root). */\n repo: string;\n /** Provider the box will be created on; gates the cloud.useCurrentBranch default. */\n providerName: string;\n /** `cfg.effective.cloud.useCurrentBranch`. */\n cloudUseCurrentBranch: boolean;\n /** Optional logger for informational notes (e.g. detached-HEAD fallback). */\n log?: (msg: string) => void;\n}\n\n/**\n * Resolve the box's branch strategy from the two flags plus the\n * `cloud.useCurrentBranch` config. Single source of truth shared by\n * `create` / `claude` / `codex` / `opencode` so the mutex + precedence stay\n * identical across commands.\n *\n * Precedence: `--use-branch` > `--from-branch` > (cloud only)\n * `cloud.useCurrentBranch` > default fork. Throws `UseBranchError` on the\n * mutex conflict or an invalid `--use-branch`, `FromBranchError` on an\n * invalid `--from-branch`; callers catch both and exit before provider work.\n */\nexport async function resolveBranchSelection(\n opts: BranchSelectionOpts,\n): Promise<{ useBranch?: string; fromBranch?: string }> {\n if (opts.useBranch && opts.fromBranch) {\n throw new UseBranchError(\n '--use-branch and --from-branch are mutually exclusive: --use-branch reuses an ' +\n 'existing branch, --from-branch forks a new box branch from a base ref. Pass only one.',\n );\n }\n if (opts.useBranch) {\n return { useBranch: await resolveUseBranch(opts.useBranch, { repo: opts.repo }) };\n }\n if (opts.fromBranch) {\n return { fromBranch: await resolveFromBranch(opts.fromBranch, { repo: opts.repo }) };\n }\n // cloud.useCurrentBranch defaults cloud boxes onto the host's current\n // branch. Docker can't reuse it (the host already has it checked out → a\n // worktree-registry collision), so this only fires for cloud providers.\n if (opts.providerName !== 'docker' && opts.cloudUseCurrentBranch) {\n const current = await currentHostBranch(opts.repo);\n if (current) {\n opts.log?.(`cloud.useCurrentBranch: starting box on host branch \"${current}\"`);\n return { useBranch: current };\n }\n opts.log?.(\n 'cloud.useCurrentBranch is set but host HEAD is detached; forking a fresh branch instead',\n );\n }\n return {};\n}\n","/**\n * Claude Code session teleport. Finds a host session JSONL under\n * `~/.claude/projects/<encoded host cwd>/<id>.jsonl`, rewrites each line's\n * top-level `cwd` field to `/workspace`, and writes the result to a host tmp\n * file ready for upload into the box's `/home/vscode/.claude/projects/-workspace/`.\n *\n * Claude session files are line-delimited JSON. We parse each line, swap\n * `cwd` if present, and re-serialize. Lines that don't parse cleanly are\n * forwarded verbatim — the file may contain forward-compatible variants we\n * don't recognize and shouldn't drop.\n */\n\nimport { mkdir, mkdtemp, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { BOX_WORKSPACE, BOX_WORKSPACE_ENCODED, encodeClaudeProjectsDir } from './cwd-encoding.js';\nimport { TeleportError, type ResolvedTeleport, type ResumeMode, type TeleportLogger } from './types.js';\n\n/** In-box `~/.claude/projects/-workspace/` directory. */\nexport const BOX_CLAUDE_PROJECTS_DIR = `/home/vscode/.claude/projects/${BOX_WORKSPACE_ENCODED}`;\n\ninterface ClaudeResolveOptions {\n hostCwd: string;\n mode: ResumeMode;\n /** Override for tests. */\n hostHome?: string;\n log?: TeleportLogger;\n}\n\nexport async function resolveClaudeTeleport(\n opts: ClaudeResolveOptions,\n): Promise<ResolvedTeleport> {\n const hostHome = opts.hostHome ?? homedir();\n const projectDir = join(\n hostHome,\n '.claude',\n 'projects',\n encodeClaudeProjectsDir(opts.hostCwd),\n );\n\n if (!existsSync(projectDir)) {\n throw new TeleportError(\n `no Claude session history found on the host for ${opts.hostCwd} (expected at ${projectDir}). Run \\`claude\\` here at least once before using -c / --resume.`,\n );\n }\n\n const sessionPath = await pickSessionFile(projectDir, opts.mode);\n const sessionId = sessionPath.replace(/\\.jsonl$/u, '').split('/').pop() ?? '';\n\n // Stage the rewritten copy in a host tmp dir. The caller will upload from\n // here via `provider.uploadPath`.\n const stage = await mkdtemp(join(tmpdir(), 'agentbox-teleport-claude-'));\n const stagedFile = join(stage, `${sessionId}.jsonl`);\n await rewriteSessionFile(sessionPath, stagedFile, opts.hostCwd);\n opts.log?.(`teleport: claude session ${sessionId} staged for upload`);\n\n return {\n agent: 'claude',\n sessionId,\n hostFile: stagedFile,\n boxPath: `${BOX_CLAUDE_PROJECTS_DIR}/${sessionId}.jsonl`,\n boxParentDir: BOX_CLAUDE_PROJECTS_DIR,\n forwardArgs: ['--resume', sessionId],\n };\n}\n\nasync function pickSessionFile(projectDir: string, mode: ResumeMode): Promise<string> {\n if (mode.kind === 'resume') {\n const target = join(projectDir, `${mode.id}.jsonl`);\n if (!existsSync(target)) {\n throw new TeleportError(\n `Claude session \"${mode.id}\" not found in ${projectDir}. List available sessions with: ls \"${projectDir}\"`,\n );\n }\n return target;\n }\n const entries = await readdir(projectDir);\n const jsonl = entries.filter((e) => e.endsWith('.jsonl'));\n if (jsonl.length === 0) {\n throw new TeleportError(\n `no Claude sessions found in ${projectDir} — nothing to continue. Run \\`claude\\` here once first.`,\n );\n }\n const stats = await Promise.all(\n jsonl.map(async (name) => {\n const full = join(projectDir, name);\n const s = await stat(full);\n return { full, mtimeMs: s.mtimeMs };\n }),\n );\n stats.sort((a, b) => b.mtimeMs - a.mtimeMs);\n return stats[0]!.full;\n}\n\nasync function rewriteSessionFile(\n src: string,\n dst: string,\n hostCwd: string,\n): Promise<void> {\n const raw = await readFile(src, 'utf8');\n // Preserve original line endings — split on \\n keeps a trailing empty entry\n // when the file ends with \\n; we restore that on join.\n const lines = raw.split('\\n');\n const out: string[] = [];\n for (const line of lines) {\n if (line.length === 0) {\n out.push(line);\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n out.push(line);\n continue;\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as Record<string, unknown>;\n if (obj.cwd === hostCwd) {\n obj.cwd = BOX_WORKSPACE;\n out.push(JSON.stringify(obj));\n continue;\n }\n }\n out.push(line);\n }\n await mkdir(join(dst, '..'), { recursive: true });\n await writeFile(dst, out.join('\\n'), 'utf8');\n}\n","/**\n * Claude Code encodes the working-directory absolute path into the\n * `~/.claude/projects/<encoded>/` directory name by replacing every\n * non-alphanumeric character with `-`. E.g. `/Users/marco/Projects/foo` →\n * `-Users-marco-Projects-foo`; `/Users/marco/.agents/skills` →\n * `-Users-marco--agents-skills` (the dot AND the slash both become `-`).\n */\nexport function encodeClaudeProjectsDir(absPath: string): string {\n return absPath.replace(/[^a-zA-Z0-9]/g, '-');\n}\n\n/** Encoded form of `/workspace` — the in-box project key for any AgentBox sandbox. */\nexport const BOX_WORKSPACE_ENCODED = encodeClaudeProjectsDir('/workspace');\n\n/** In-box absolute workspace path (matches the bind-mount in every provider). */\nexport const BOX_WORKSPACE = '/workspace';\n","/**\n * Shared types/errors for the session-teleport module. Kept separate so the\n * per-agent files (`claude.ts` / `codex.ts` / `opencode.ts`) don't form an\n * import cycle through `index.ts`.\n */\n\nexport type TeleportAgent = 'claude' | 'codex' | 'opencode';\n\nexport type TeleportLogger = (line: string) => void;\n\n/**\n * Caller-supplied \"what resume mode is this\" struct. Mirrors the user-facing\n * flag set:\n * - `{ kind: 'continue' }` for `-c` / `--continue` (newest session for cwd)\n * - `{ kind: 'resume', id }` for `--resume <id>` (specific session)\n */\nexport type ResumeMode =\n | { kind: 'continue' }\n | { kind: 'resume'; id: string };\n\nexport interface ResolvedTeleport {\n agent: TeleportAgent;\n /** The session id we resolved (uuid). */\n sessionId: string;\n /**\n * Host-side path to the rewritten session file ready for upload. Lives in a\n * tmp dir under `os.tmpdir()` — the caller does not need to clean it up;\n * normal tmp cleanup applies.\n */\n hostFile: string;\n /** Absolute in-box destination path including filename. */\n boxPath: string;\n /** Absolute in-box destination directory — useful for `mkdir -p` before upload. */\n boxParentDir: string;\n /**\n * Canonical argv tokens to prepend to the agent's argv inside the box, e.g.\n * `['--resume', '<uuid>']` for claude or `['resume', '<uuid>']` for codex.\n */\n forwardArgs: string[];\n}\n\nexport class TeleportError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TeleportError';\n }\n}\n","/**\n * Codex CLI session teleport. Codex stores sessions at\n * `~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl`, flat across\n * all projects. The cwd lives inside the first line's `session_meta.payload.cwd`\n * field, so:\n * - `-c` filters by `payload.cwd === hostCwd`, sorts by mtime, picks newest.\n * - `--resume <uuid>` globs for `*<uuid>.jsonl` and warns if cwd mismatches.\n *\n * Resume tokens forward to `codex resume <id>` (the subcommand form Codex\n * actually uses — not `--resume <id>`).\n */\n\nimport { mkdtemp, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { BOX_WORKSPACE } from './cwd-encoding.js';\nimport { TeleportError, type ResolvedTeleport, type ResumeMode, type TeleportLogger } from './types.js';\n\ninterface CodexResolveOptions {\n hostCwd: string;\n mode: ResumeMode;\n hostHome?: string;\n log?: TeleportLogger;\n}\n\ninterface CodexSessionFile {\n hostPath: string;\n /** Relative to `~/.codex/sessions/` — preserved when uploading into the box. */\n relPath: string;\n uuid: string;\n cwd: string | null;\n mtimeMs: number;\n}\n\nexport async function resolveCodexTeleport(\n opts: CodexResolveOptions,\n): Promise<ResolvedTeleport> {\n const hostHome = opts.hostHome ?? homedir();\n const sessionsRoot = join(hostHome, '.codex', 'sessions');\n\n if (!existsSync(sessionsRoot)) {\n throw new TeleportError(\n `no Codex session history found on the host (expected at ${sessionsRoot}). Run \\`codex\\` at least once before using -c / --resume.`,\n );\n }\n\n const all = await listCodexSessions(sessionsRoot);\n if (all.length === 0) {\n throw new TeleportError(\n `no Codex sessions found in ${sessionsRoot}. Run \\`codex\\` here at least once first.`,\n );\n }\n\n let picked: CodexSessionFile;\n if (opts.mode.kind === 'resume') {\n // Alias to a local const so the narrowed type survives into the\n // `.filter` callback. TS can't keep narrowing on a property access\n // (`opts.mode`) across closures because the property could in principle\n // be mutated between the check and each callback invocation.\n const mode = opts.mode;\n const matches = all.filter((s) => s.uuid === mode.id || s.uuid.startsWith(mode.id));\n if (matches.length === 0) {\n throw new TeleportError(\n `Codex session \"${mode.id}\" not found under ${sessionsRoot}.`,\n );\n }\n if (matches.length > 1) {\n throw new TeleportError(\n `Codex session id \"${mode.id}\" matched multiple files; pass the full uuid.`,\n );\n }\n picked = matches[0]!;\n if (picked.cwd !== null && picked.cwd !== opts.hostCwd) {\n opts.log?.(\n `teleport: WARN codex session ${picked.uuid} was recorded at ${picked.cwd}, not ${opts.hostCwd}; rewriting cwd anyway`,\n );\n }\n } else {\n const matching = all.filter((s) => s.cwd === opts.hostCwd);\n if (matching.length === 0) {\n throw new TeleportError(\n `no Codex session found whose cwd matches ${opts.hostCwd}. Run \\`codex\\` here first, or pass --resume <id> explicitly.`,\n );\n }\n matching.sort((a, b) => b.mtimeMs - a.mtimeMs);\n picked = matching[0]!;\n }\n\n const stage = await mkdtemp(join(tmpdir(), 'agentbox-teleport-codex-'));\n const stagedFile = join(stage, posixBasename(picked.relPath));\n await rewriteCodexSession(picked.hostPath, stagedFile, opts.hostCwd);\n opts.log?.(`teleport: codex session ${picked.uuid} staged for upload`);\n\n const boxParentDir = `/home/vscode/.codex/sessions/${posixDirname(picked.relPath)}`;\n\n return {\n agent: 'codex',\n sessionId: picked.uuid,\n hostFile: stagedFile,\n boxPath: `${boxParentDir}/${posixBasename(picked.relPath)}`,\n boxParentDir,\n forwardArgs: ['resume', picked.uuid],\n };\n}\n\nfunction posixBasename(p: string): string {\n const i = p.lastIndexOf('/');\n return i === -1 ? p : p.slice(i + 1);\n}\n\nfunction posixDirname(p: string): string {\n const i = p.lastIndexOf('/');\n return i === -1 ? '.' : p.slice(0, i);\n}\n\nasync function listCodexSessions(sessionsRoot: string): Promise<CodexSessionFile[]> {\n const out: CodexSessionFile[] = [];\n // Sessions live three levels deep: YYYY/MM/DD/rollout-*.jsonl. Walk that\n // depth explicitly — no recursive scan, no globbing dependency.\n const years = await safeReaddir(sessionsRoot);\n for (const y of years) {\n if (!/^\\d{4}$/u.test(y)) continue;\n const yDir = join(sessionsRoot, y);\n const months = await safeReaddir(yDir);\n for (const m of months) {\n if (!/^\\d{2}$/u.test(m)) continue;\n const mDir = join(yDir, m);\n const days = await safeReaddir(mDir);\n for (const d of days) {\n if (!/^\\d{2}$/u.test(d)) continue;\n const dDir = join(mDir, d);\n const files = await safeReaddir(dDir);\n for (const name of files) {\n if (!name.startsWith('rollout-') || !name.endsWith('.jsonl')) continue;\n const uuid = extractCodexUuid(name);\n if (uuid === null) continue;\n const hostPath = join(dDir, name);\n let mtimeMs = 0;\n try {\n mtimeMs = (await stat(hostPath)).mtimeMs;\n } catch {\n continue;\n }\n const cwd = await peekCodexCwd(hostPath);\n out.push({\n hostPath,\n relPath: `${y}/${m}/${d}/${name}`,\n uuid,\n cwd,\n mtimeMs,\n });\n }\n }\n }\n }\n return out;\n}\n\nasync function safeReaddir(dir: string): Promise<string[]> {\n try {\n return await readdir(dir);\n } catch {\n return [];\n }\n}\n\nfunction extractCodexUuid(filename: string): string | null {\n // `rollout-YYYY-MM-DDTHH-MM-SS-<uuid>.jsonl` — the uuid is the trailing\n // 36-char dashed hex segment. Match it explicitly so we don't pick up the\n // date-time prefix.\n const m = filename.match(\n /-([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\\.jsonl$/u,\n );\n return m ? m[1]! : null;\n}\n\nasync function peekCodexCwd(file: string): Promise<string | null> {\n // First line is the session_meta record with payload.cwd. Read just enough\n // bytes to capture it — the rest of the file is potentially huge.\n let firstLine: string;\n try {\n const buf = await readFile(file, 'utf8');\n const nl = buf.indexOf('\\n');\n firstLine = nl === -1 ? buf : buf.slice(0, nl);\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(firstLine) as {\n type?: string;\n payload?: { cwd?: string };\n };\n if (parsed.type === 'session_meta' && typeof parsed.payload?.cwd === 'string') {\n return parsed.payload.cwd;\n }\n } catch {\n /* fall through */\n }\n return null;\n}\n\nasync function rewriteCodexSession(\n src: string,\n dst: string,\n hostCwd: string,\n): Promise<void> {\n const raw = await readFile(src, 'utf8');\n const lines = raw.split('\\n');\n const out: string[] = [];\n for (const line of lines) {\n if (line.length === 0) {\n out.push(line);\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n out.push(line);\n continue;\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as { type?: unknown; payload?: unknown };\n if (\n obj.type === 'session_meta' &&\n obj.payload &&\n typeof obj.payload === 'object' &&\n !Array.isArray(obj.payload)\n ) {\n const payload = obj.payload as Record<string, unknown>;\n if (payload.cwd === hostCwd) {\n payload.cwd = BOX_WORKSPACE;\n out.push(JSON.stringify(obj));\n continue;\n }\n }\n }\n out.push(line);\n }\n await writeFile(dst, out.join('\\n'), 'utf8');\n}\n","/**\n * OpenCode session teleport — v1 stub. OpenCode stores sessions in a\n * multi-tenant SQLite DB at `~/.local/share/opencode/opencode.db` with sibling\n * `storage/`, `snapshot/`, `repos/` directories. A naive teleport would copy\n * the entire DB (leaking every other project's sessions into the sandbox), and\n * row-level extraction is real work (foreign keys, FTS indices, snapshot\n * artifacts on disk that live outside the DB).\n *\n * Tracked for v2; for v1 we fail fast with a clear message.\n */\n\nimport { TeleportError } from './types.js';\n\nexport function resolveOpencodeTeleport(): never {\n throw new TeleportError(\n 'OpenCode session teleport is not yet supported in agentbox (sessions live in a multi-tenant SQLite DB at ~/.local/share/opencode/opencode.db; per-project extraction is tracked for a follow-up). Run `agentbox opencode` without -c / --resume to start a fresh session, or open an issue if you need this feature.',\n );\n}\n","/**\n * Session-teleport entry point. The agent commands call this AFTER the box is\n * provisioned (so `provider.uploadPath` has a target) and BEFORE the in-box\n * agent CLI launches. It:\n * 1. Resolves the matching host session file (claude/codex/opencode-specific).\n * 2. Stages a rewritten copy on the host (cwd → /workspace).\n * 3. Uploads it into the box at the agent-CLI-expected location via\n * `provider.uploadPath`.\n * 4. Returns the canonical argv tokens the agent command should prepend to\n * the in-box invocation.\n *\n * v1 supports `-c` and `--resume <id>` for claude + codex. opencode throws a\n * \"not yet supported\" `TeleportError`.\n */\n\nimport type { BoxRecord, Provider } from '@agentbox/core';\nimport { resolveClaudeTeleport } from './claude.js';\nimport { resolveCodexTeleport } from './codex.js';\nimport { resolveOpencodeTeleport } from './opencode.js';\nimport {\n TeleportError,\n type ResolvedTeleport,\n type ResumeMode,\n type TeleportAgent,\n type TeleportLogger,\n} from './types.js';\n\nexport {\n TeleportError,\n type ResolvedTeleport,\n type ResumeMode,\n type TeleportAgent,\n type TeleportLogger,\n} from './types.js';\n\nexport interface PrepareTeleportInput {\n agent: TeleportAgent;\n hostCwd: string;\n mode: ResumeMode;\n log?: TeleportLogger;\n}\n\nexport interface UploadTeleportInput {\n box: BoxRecord;\n provider: Provider;\n resolved: ResolvedTeleport;\n log?: TeleportLogger;\n}\n\n/**\n * Host-side resolve: finds the matching host session, rewrites cwd to\n * `/workspace`, stages a tmp copy ready for upload. No box / provider needed\n * — call this BEFORE box creation as a pre-flight so users don't pay for a\n * doomed box. Throws `TeleportError` on missing/unmatchable sessions.\n */\nexport async function prepareTeleport(\n input: PrepareTeleportInput,\n): Promise<ResolvedTeleport> {\n switch (input.agent) {\n case 'claude':\n return resolveClaudeTeleport({\n hostCwd: input.hostCwd,\n mode: input.mode,\n log: input.log,\n });\n case 'codex':\n return resolveCodexTeleport({\n hostCwd: input.hostCwd,\n mode: input.mode,\n log: input.log,\n });\n case 'opencode':\n // Throws TeleportError immediately — v1 stub.\n resolveOpencodeTeleport();\n }\n}\n\n/**\n * Provider-side upload: pushes the prepared session file into the live box.\n * Call AFTER box creation, before the in-box agent CLI launches.\n */\nexport async function uploadTeleport(input: UploadTeleportInput): Promise<void> {\n if (!input.provider.uploadPath) {\n throw new TeleportError(\n `provider '${input.provider.name}' does not support file upload; session teleport is unavailable on this backend.`,\n );\n }\n // Trailing slash → uploadPath treats dst as a directory and lands the file\n // under its existing basename, which already matches the in-box filename.\n await input.provider.uploadPath(input.box, input.resolved.hostFile, `${input.resolved.boxParentDir}/`);\n input.log?.(\n `teleport: uploaded ${input.resolved.sessionId} into ${input.resolved.boxParentDir}/`,\n );\n}\n","import { log } from '@clack/prompts';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/**\n * Print a one-time tip pointing at `agentbox install` when the host `/agentbox`\n * fork skill isn't installed yet. Gated by a marker file so it shows at most\n * once per host. Best-effort — never throws into the caller's happy path.\n */\nexport function maybeShowInstallHint(): void {\n try {\n const skill = join(homedir(), '.claude', 'skills', 'agentbox', 'SKILL.md');\n if (existsSync(skill)) return;\n const marker = join(homedir(), '.agentbox', 'install-hint-shown');\n if (existsSync(marker)) return;\n mkdirSync(join(homedir(), '.agentbox'), { recursive: true });\n writeFileSync(marker, '');\n log.info(\"tip: run 'agentbox install' to enable the /agentbox fork command in host Claude\");\n } catch {\n // Non-fatal: a missing HOME or unwritable dir must not break create.\n }\n}\n","import { closeSync, mkdirSync, openSync, renameSync, symlinkSync, unlinkSync, writeFileSync, writeSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface CommandLog {\n /** Absolute path agents can tail. */\n path: string;\n /** Append a line with an ISO timestamp prefix; a trailing newline is added if missing. */\n write(line: string): void;\n /** Append raw bytes verbatim — for subprocess streams that already carry their own newlines. */\n raw(chunk: string): void;\n /** Time a step; emits BEGIN/END markers and elapsed ms. On throw, emits FAIL and rethrows. */\n step<T>(name: string, fn: () => Promise<T>): Promise<T>;\n /** Idempotent. */\n close(): void;\n}\n\nfunction stateDir(): string {\n return process.env.AGENTBOX_HOME ?? join(homedir(), '.agentbox');\n}\n\nfunction logsDir(): string {\n return join(stateDir(), 'logs');\n}\n\n/**\n * Open a fresh, tee'd log file for a CLI command. Rotates one generation:\n * any prior `<command>.log` becomes `<command>.log.prev`, replacing an\n * older prev. Also updates `<logsDir>/latest.log` to point at the active\n * file so an agent can tail one stable path without knowing the command.\n *\n * Writes are synchronous; callers can fire-and-forget from spinner\n * callbacks. The fd is closed on `close()` and on `process.exit` so a\n * crash still flushes everything that was written.\n */\nexport function openCommandLog(command: string): CommandLog {\n const dir = logsDir();\n mkdirSync(dir, { recursive: true });\n\n const path = join(dir, `${command}.log`);\n const prev = join(dir, `${command}.log.prev`);\n try {\n // Move the previous run aside. EEXIST on rename is the typical case\n // (a `.prev` from the run before that) — overwrite it.\n renameSync(path, prev);\n } catch {\n /* nothing to rotate */\n }\n\n const fd = openSync(path, 'a');\n const startedAt = new Date().toISOString();\n writeSync(fd, `${startedAt} --- BEGIN ${command} (pid ${String(process.pid)}) ---\\n`);\n\n updateLatestSymlink(dir, path);\n\n let closed = false;\n const closeOnce = (): void => {\n if (closed) return;\n closed = true;\n try {\n writeSync(fd, `${new Date().toISOString()} --- END ${command} ---\\n`);\n } catch {\n /* fd already gone */\n }\n try {\n closeSync(fd);\n } catch {\n /* already closed */\n }\n };\n // Last-resort flush. Don't unhook anything else; this is purely additive.\n process.on('exit', closeOnce);\n\n return {\n path,\n write(line: string): void {\n if (closed) return;\n const ts = new Date().toISOString();\n const body = line.endsWith('\\n') ? line : line + '\\n';\n try {\n writeSync(fd, `${ts} ${body}`);\n } catch {\n /* swallow — never break the command on log write failure */\n }\n },\n raw(chunk: string): void {\n if (closed) return;\n try {\n writeSync(fd, chunk);\n } catch {\n /* swallow */\n }\n },\n async step<T>(name: string, fn: () => Promise<T>): Promise<T> {\n const t0 = Date.now();\n this.write(`--- BEGIN ${name} ---`);\n try {\n const out = await fn();\n this.write(`--- END ${name} (${String(Date.now() - t0)}ms) ---`);\n return out;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.write(`--- FAIL ${name} (${String(Date.now() - t0)}ms): ${msg} ---`);\n throw err;\n }\n },\n close: closeOnce,\n };\n}\n\nfunction updateLatestSymlink(dir: string, target: string): void {\n const link = join(dir, 'latest.log');\n try {\n unlinkSync(link);\n } catch {\n /* not present */\n }\n try {\n symlinkSync(target, link);\n } catch {\n // Windows or restricted FS: leave a text pointer instead. Best-effort.\n try {\n writeFileSync(link, target + '\\n');\n } catch {\n /* give up — symlink is a convenience, not a contract */\n }\n }\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, spinner } from '@clack/prompts';\nimport { setConfigValue } from '@agentbox/config';\nimport {\n detectPortless,\n type DockerEngine,\n installPortless,\n portlessInstallHint,\n portlessStartHint,\n resetPortlessCache,\n startPortlessProxy,\n} from '@agentbox/sandbox-docker';\n\nexport interface PortlessPromptArgs {\n engine: DockerEngine;\n /** Effective `portless.enabled` — `undefined` means \"never prompted\". */\n enabled: boolean | undefined;\n yes: boolean;\n /** cwd for the config write (global scope resolves a fixed path regardless). */\n cwd: string;\n}\n\n/**\n * Bring the host Portless into a usable state after the user opts in: install\n * the CLI if missing, then start a proxy if none is running. The proxy is\n * started with `--no-tls` on a high port so it never needs root or a CA-trust\n * prompt (box web apps are then served at `http://<box>.localhost:1355`).\n * Best-effort — any failure degrades to a printed hint, never throws.\n */\nexport async function setupPortlessHost(): Promise<void> {\n let state = await detectPortless();\n\n if (!state.installed) {\n const s = spinner();\n s.start('installing portless (npm install -g portless)');\n const ok = await installPortless();\n resetPortlessCache();\n s.stop(ok ? 'portless installed' : 'portless install failed');\n if (!ok) {\n log.warn(`Could not install Portless — run \\`${portlessInstallHint()}\\` yourself.`);\n return;\n }\n state = await detectPortless();\n }\n\n if (state.proxyRunning) {\n log.info('Portless proxy already running — boxes will use it.');\n return;\n }\n\n const s = spinner();\n s.start('starting portless proxy (no TLS, port 1355 — no root needed)');\n await startPortlessProxy();\n resetPortlessCache();\n state = await detectPortless();\n if (state.proxyRunning) {\n s.stop('portless proxy started');\n } else {\n s.stop('portless proxy did not start');\n log.warn(`Could not start the Portless proxy — run \\`${portlessStartHint()}\\` yourself.`);\n }\n}\n\n/**\n * First-run opt-in for Portless. On Docker Desktop there is no per-container\n * DNS, so we offer to give box web apps a friendly `<box>.localhost` URL. The\n * answer — yes or no — is persisted to the *global* config so the prompt fires\n * exactly once per machine; a \"yes\" also installs the CLI and starts the proxy\n * (see `setupPortlessHost`). Returns the resolved enabled flag.\n *\n * Silent no-op (returns the effective value) when: already decided in any\n * config layer or via --portless/--no-portless; non-interactive or --yes; or\n * the engine is OrbStack (which already has .orb.local).\n */\nexport async function maybePromptPortless(args: PortlessPromptArgs): Promise<boolean> {\n if (args.enabled !== undefined) return args.enabled;\n if (args.engine === 'orbstack') return false;\n if (!process.stdin.isTTY || args.yes) return false;\n\n const answer = await confirm({\n message:\n 'Use Portless to give box web apps a friendly local URL? ' +\n '(installs the portless CLI and starts a local proxy if needed)',\n initialValue: true,\n });\n // Cancel (Ctrl-C) leaves the key unset so the prompt reappears next time.\n if (isCancel(answer)) return false;\n\n try {\n await setConfigValue('global', 'portless.enabled', answer, args.cwd, { raw: false });\n } catch (err) {\n log.warn(\n `Could not save the Portless preference: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (answer) await setupPortlessHost();\n return answer;\n}\n","import { confirm, isCancel, log, multiselect } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport type { ProviderName } from '@agentbox/core';\nimport { DEFAULT_ENV_PATTERNS, scanHostEnvFiles } from '@agentbox/sandbox-docker';\nimport { basename } from 'node:path';\nimport { checkpointExistsForProvider } from './checkpoint-lookup.js';\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 *\n * The `/agentbox-setup` skill is installed **box-only**: at create /\n * `claude start` time `seedSetupSkillIntoVolume()`\n * (packages/sandbox-docker/src/claude.ts) copies this same file into the\n * claude-config volume's `skills/agentbox-setup/SKILL.md`. We deliberately\n * never write it to the host's ~/.claude so `agentbox` doesn't pollute the\n * user's machine.\n */\nexport const IN_BOX_SETUP_GUIDE_PATH = '/usr/local/share/agentbox/setup-guide.md';\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 download 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 * Files the user picked in the env-import multiselect (relative to the\n * workspace, NUL-safe). Empty/undefined = no copy. Threaded into\n * `createBox(opts.envFilesToImport)` so the box is seeded with just the\n * selection. Independent of `withEnv` / the wizard's yes/no answer.\n */\n envFilesToImport?: 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 AND the\n * checkpoint exists for the active provider, the project is already\n * configured: the checkpoint carries the warm state *and* the agentbox.yaml\n * that was present when it was captured, so we skip the \"generate one?\"\n * prompt entirely. When the checkpoint doesn't exist for the active\n * provider (e.g. a Docker `setup` checkpoint and the user is creating a\n * cloud box), the wizard falls through silently to normal setup.\n */\n checkpointRef?: string;\n /**\n * The provider this box will be created on. Used to scope the\n * `checkpointRef` lookup so the wizard only announces \"starting from\n * checkpoint …\" when the artifact actually exists for the target.\n */\n provider?: ProviderName;\n /**\n * True when the caller already opted in to importing the full\n * DEFAULT_ENV_PATTERNS set (`--with-env` / `box.withEnv: true`). The\n * env-file multiselect is suppressed in that case — the user pre-decided.\n */\n withEnv?: boolean;\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\n/**\n * Sibling sentinel to `WIZARD_AUTOLAUNCH_ENV`: when `agentbox create`\n * re-dispatches to `agentbox claude`, the user's env-file multiselect picks\n * ride across the boundary in this env var, NUL-delimited (filenames can\n * contain newlines but never NUL). The inner wizard parses + acts on it,\n * then the caller is expected to delete it (mirrors the autolaunch sentinel).\n */\nexport const WIZARD_ENV_FILES_ENV = 'AGENTBOX_WIZARD_ENV_FILES';\n\n/**\n * Patterns scanned for the wizard's env-file multiselect. Same set as\n * `--with-env` minus `agentbox.yaml`: the wizard fires precisely *because*\n * there's no agentbox.yaml on the host, so it can never be a match.\n */\nconst WIZARD_ENV_SCAN_PATTERNS = DEFAULT_ENV_PATTERNS.filter((p) => p !== 'agentbox.yaml');\n\nexport async function maybeRunSetupWizard(args: WizardArgs): Promise<WizardOutcome> {\n // Re-entry from agentbox create → claude: outer pass already prompted;\n // just inject the initial prompt for claude. Env-file picks were stashed by\n // the outer pass in WIZARD_ENV_FILES_ENV and need to flow through this\n // outcome so claude's action handler can pass them to createBox.\n if (process.env[WIZARD_AUTOLAUNCH_ENV] === '1') {\n if (args.command !== 'claude') return { action: 'proceed' };\n const envFiles = parseEnvFilesFromEnv(process.env[WIZARD_ENV_FILES_ENV]);\n if (args.checkpointRef && (await checkpointAppliesHere(args))) {\n return { action: 'proceed', envFilesToImport: envFiles };\n }\n const proj = await findProjectRoot(args.workspace);\n if (proj.hasAgentboxYaml) return { action: 'proceed', envFilesToImport: envFiles };\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n envFilesToImport: envFiles,\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. Skip env-file picker too: the\n // checkpoint already has whatever was on disk when it was captured.\n //\n // …but only if the checkpoint exists for the ACTIVE provider. A\n // `box.defaultCheckpoint` resolved against the wrong provider's store would\n // mislead the user — wizard announces the skip, then the cloud-provider\n // create silently drops the ref because the snapshot doesn't exist for\n // daytona. Silently fall through to normal setup instead.\n if (args.checkpointRef && (await checkpointAppliesHere(args))) {\n log.info(`starting from checkpoint \"${args.checkpointRef}\"; skipping agentbox.yaml setup`);\n return { action: 'proceed' };\n }\n\n // Env-file multiselect — runs *before* the \"run setup wizard?\" confirm so\n // it's independent of that answer. Suppressed when --with-env is on\n // (the user already opted in to importing the full DEFAULT_ENV_PATTERNS\n // set). Skipped silently when nothing matched.\n let envFilesToImport: string[] | undefined;\n if (!args.withEnv) {\n const found = await scanHostEnvFiles(proj.root, WIZARD_ENV_SCAN_PATTERNS);\n if (found.length > 0) {\n const picked = await multiselect<string>({\n message: 'Import host env/secret files into the box? (space to toggle, enter to confirm)',\n options: found.map((p) => ({ value: p, label: p })),\n initialValues: found,\n required: false,\n });\n if (!isCancel(picked) && Array.isArray(picked) && picked.length > 0) {\n envFilesToImport = picked;\n }\n }\n }\n\n const go = await confirm({\n message: 'New project: run setup wizard? Will install dependencies and setup agentbox.yaml',\n initialValue: true,\n });\n if (isCancel(go) || !go) return { action: 'proceed', envFilesToImport };\n\n // The /agentbox-setup skill is seeded into the box's claude-config volume\n // by seedSetupSkillIntoVolume() (sandbox-docker) — box-only, never written\n // to the host's ~/.claude.\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', envFilesToImport };\n\n return {\n action: 'launch-with-prompt',\n initialPrompt: buildSetupInitialPrompt(proj.root),\n envFilesToImport,\n };\n}\n\n/**\n * True when `args.checkpointRef` resolves to an artifact in the active\n * provider's checkpoint store. Falls back to `true` only when no `checkpointRef`\n * is set (caller checked already). Resolves the project root from the workspace\n * so the lookup uses the same hash the `agentbox checkpoint create` flow\n * persists under.\n */\nasync function checkpointAppliesHere(args: WizardArgs): Promise<boolean> {\n if (!args.checkpointRef) return false;\n const proj = await findProjectRoot(args.workspace);\n const provider = args.provider ?? 'docker';\n return checkpointExistsForProvider(provider, proj.root, args.checkpointRef);\n}\n\n/** Serialize the multiselect picks for the create→claude re-dispatch. */\nexport function serializeEnvFilesForEnv(files: string[] | undefined): string | undefined {\n if (!files || files.length === 0) return undefined;\n // NUL is illegal in POSIX filenames so it's a safe delimiter even though\n // env-var values can contain newlines (which legal filenames also can).\n return files.join('\\0');\n}\n\n/** Inverse of `serializeEnvFilesForEnv`. Empty/undefined input → undefined. */\nexport function parseEnvFilesFromEnv(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined;\n const out = raw.split('\\0').filter((p) => p.length > 0);\n return out.length > 0 ? out : undefined;\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 the first-run auth guidance\n * that the user typically wants.\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 portless?: 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 if (opts.portless === true) out.push('--portless');\n if (opts.portless === false) out.push('--no-portless');\n return out;\n}\n","/**\n * Provider-aware checkpoint existence check used by the wizard. The default\n * checkpoint name lives in a single config field (`box.defaultCheckpoint`),\n * but the actual artifact may exist for Docker, for Daytona, both, or\n * neither. The wizard consults this helper before announcing \"starting from\n * checkpoint …\" — if the named checkpoint doesn't exist for the active\n * provider, the wizard falls through to the normal setup flow instead of\n * misleadingly skipping it.\n */\n\nimport type { ProviderName } from '@agentbox/core';\nimport { resolveCheckpoint } from '@agentbox/sandbox-docker';\nimport { resolveCloudCheckpoint } from '@agentbox/sandbox-cloud';\n\nexport async function checkpointExistsForProvider(\n provider: ProviderName,\n projectRoot: string,\n ref: string,\n): Promise<boolean> {\n if (provider === 'docker') {\n return (await resolveCheckpoint(projectRoot, ref)) !== null;\n }\n // v1: every cloud backend ships its checkpoints under the\n // `~/.agentbox/cloud-checkpoints/<backend>/…` tree. The provider name is\n // also the backend name so the lookup is a 1:1 mapping.\n return (await resolveCloudCheckpoint(projectRoot, provider, ref)) !== null;\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n defaultCheckpointConfigKey,\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n setConfigValue,\n unsetConfigValue,\n} from '@agentbox/config';\nimport type { ProviderKind } from '@agentbox/config';\nimport type { BoxRecord } from '@agentbox/core';\nimport {\n clearRelayNotice,\n createCheckpoint,\n inspectBox,\n listCheckpoints,\n removeCheckpoint,\n setRelayNotice,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { listCloudCheckpoints, resolveCloudCheckpoint } from '@agentbox/sandbox-cloud';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Cloud backends that store snapshots under ~/.agentbox/cloud-checkpoints/<backend>/. */\nconst CLOUD_BACKENDS = ['daytona', 'hetzner', 'vercel'] as const;\ntype CloudBackend = (typeof CLOUD_BACKENDS)[number];\n\n/** Lazily resolve a cloud provider's checkpoint capability (dynamic import keeps SDKs out of the hot path). */\nasync function cloudProviderFor(backend: CloudBackend): Promise<import('@agentbox/core').Provider> {\n switch (backend) {\n case 'daytona':\n return (await import('@agentbox/sandbox-daytona')).daytonaProvider;\n case 'hetzner':\n return (await import('@agentbox/sandbox-hetzner')).hetznerProvider;\n case 'vercel':\n return (await import('@agentbox/sandbox-vercel')).vercelProvider;\n }\n}\n\n/** Footer warning shown in attached sessions while a checkpoint runs. */\nconst CHECKPOINT_NOTICE = 'Checkpoint in progress — the box will be unresponsive for a moment';\n/**\n * Notice TTL backstop: longer than the relay's checkpoint RPC timeout\n * (600s) so a stale notice self-clears even if this CLI is SIGKILLed\n * before its `finally` runs.\n */\nconst CHECKPOINT_NOTICE_TTL_MS = 660_000;\n\ninterface CreateOpts {\n name?: string;\n merged?: boolean;\n setDefault?: boolean;\n replace?: 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 .option(\n '--replace',\n \"if a checkpoint with the same name exists, rm it first (idempotent recapture; safe to retry when the previous run's stdout was lost)\",\n )\n .action(async (idOrName: string | undefined, opts: CreateOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const providerName = box.provider ?? 'docker';\n\n if (providerName !== 'docker') {\n await runCloudCheckpointCreate(box, opts);\n return;\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');\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 // Warn attached sessions (agentbox claude footer / dashboard) that the\n // box is about to freeze — `docker commit` pauses the container. Best-\n // effort: a null id means the relay is down and there's nothing to clear.\n const noticeId = await setRelayNotice(\n box.id,\n 'checkpoint',\n CHECKPOINT_NOTICE,\n CHECKPOINT_NOTICE_TTL_MS,\n );\n let signalled = false;\n const onSignal = (): void => {\n if (signalled) return;\n signalled = true;\n void (async () => {\n if (noticeId) await clearRelayNotice(box.id, noticeId);\n process.exit(130);\n })();\n };\n if (noticeId) {\n process.once('SIGINT', onSignal);\n process.once('SIGTERM', onSignal);\n }\n\n try {\n const info = await createCheckpoint({\n box,\n projectRoot,\n name: opts.name,\n merged: opts.merged === true,\n setDefault: opts.setDefault === true,\n replace: opts.replace === 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(\n `make it the default for new boxes: agentbox checkpoint set-default ${info.name}`,\n );\n }\n } finally {\n if (noticeId) {\n await clearRelayNotice(box.id, noticeId);\n process.removeListener('SIGINT', onSignal);\n process.removeListener('SIGTERM', onSignal);\n }\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst lsSub = new Command('ls')\n .description(\"List this project's checkpoints (both docker and cloud)\")\n .action(async () => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n const cfg = await loadEffectiveConfig(projectRoot);\n // Resolve per-provider so the `*default` marker tracks which one the\n // wizard would actually pick for that provider's row.\n const defDocker = resolveDefaultCheckpoint(cfg.effective, 'docker');\n const dockerList = await listCheckpoints(projectRoot);\n // Merge in cloud-backend checkpoints. Each cloud provider stores its\n // snapshots under ~/.agentbox/cloud-checkpoints/<backend>/.\n const cloudLists = await Promise.all(\n CLOUD_BACKENDS.map(async (backend) => ({\n backend,\n def: resolveDefaultCheckpoint(cfg.effective, backend),\n items: await listCloudCheckpoints(projectRoot, backend),\n })),\n );\n\n const totalCloud = cloudLists.reduce((n, c) => n + c.items.length, 0);\n if (dockerList.length === 0 && totalCloud === 0) {\n process.stdout.write(`no checkpoints for ${projectRoot}\\n`);\n return;\n }\n for (const c of dockerList) {\n const flag = c.name === defDocker ? ' *default' : '';\n process.stdout.write(\n `${c.name} docker (${c.manifest.type}) from ${c.manifest.sourceBoxName} ${c.manifest.createdAt}${flag}\\n`,\n );\n }\n for (const { backend, def, items } of cloudLists) {\n for (const c of items) {\n const flag = c.name === def ? ' *default' : '';\n process.stdout.write(\n `${c.name} ${backend} (snapshot) from ${c.manifest.sourceBoxName} ${c.manifest.createdAt}${flag}\\n`,\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 .option(\n '--provider <name>',\n 'set the default for only this provider (docker|daytona|hetzner|vercel); without it, sets the cross-provider fallback',\n )\n .action(async (ref: string | undefined, opts: { clear?: boolean; provider?: string }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n const providerArg = opts.provider as ProviderKind | undefined;\n const knownProviders: ProviderKind[] = ['docker', ...CLOUD_BACKENDS];\n if (providerArg !== undefined && !knownProviders.includes(providerArg)) {\n throw new Error(\n `unknown provider '${opts.provider ?? ''}' (known: ${knownProviders.join(', ')})`,\n );\n }\n const configKey = defaultCheckpointConfigKey(providerArg);\n const label = providerArg ? `${providerArg} default checkpoint` : 'project default checkpoint';\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', configKey, projectRoot);\n process.stdout.write(\n r.existed\n ? `cleared ${label} (wrote ${r.path})\\n`\n : `no ${label} 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 // Accept the name if it exists in the store(s) we'd resolve against.\n // For --provider, restrict to that provider's store; without --provider,\n // accept if ANY store has it (matches existing back-compat behavior).\n const dockerHit =\n (providerArg === undefined || providerArg === 'docker') &&\n (await listCheckpoints(projectRoot)).some((c) => c.name === ref);\n let cloudHit = false;\n for (const backend of CLOUD_BACKENDS) {\n if (providerArg !== undefined && providerArg !== backend) continue;\n if (await resolveCloudCheckpoint(projectRoot, backend, ref)) {\n cloudHit = true;\n break;\n }\n }\n if (!dockerHit && !cloudHit) {\n throw new Error(`checkpoint not found: ${ref} (see \\`agentbox checkpoint ls\\`)`);\n }\n const r = await setConfigValue('project', configKey, ref, projectRoot);\n process.stdout.write(`${label} = ${ref} (wrote ${r.path})\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst rmSub = new Command('rm')\n .description('Delete a checkpoint (any provider that has it)')\n .argument('<ref>', 'checkpoint name')\n .option('-y, --yes', 'skip the confirmation prompt')\n .option('--provider <name>', \"delete only from this provider's store (default: all)\")\n .action(async (ref: string, opts: { yes?: boolean; provider?: string }) => {\n try {\n const projectRoot = (await findProjectRoot(process.cwd())).root;\n // Look up every store so the confirm + removal can act on whichever has\n // it. Docker is always a candidate (removeCheckpoint no-ops if absent);\n // cloud stores are pre-resolved so we only act on backends that have it.\n const wantDocker = !opts.provider || opts.provider === 'docker';\n const cloudHits: CloudBackend[] = [];\n for (const backend of CLOUD_BACKENDS) {\n if (opts.provider && opts.provider !== backend) continue;\n if (await resolveCloudCheckpoint(projectRoot, backend, ref)) cloudHits.push(backend);\n }\n\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 let any = false;\n if (wantDocker) {\n const removed = await removeCheckpoint(projectRoot, ref);\n if (removed) {\n any = true;\n process.stdout.write(`removed docker checkpoint ${ref}\\n`);\n }\n }\n for (const backend of cloudHits) {\n try {\n const provider = await cloudProviderFor(backend);\n await provider.checkpoint?.remove(projectRoot, ref);\n any = true;\n process.stdout.write(`removed ${backend} checkpoint ${ref}\\n`);\n } catch (err) {\n log.warn(\n `${backend} checkpoint remove failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n if (!any) throw new Error(`checkpoint not found: ${ref}`);\n\n // Don't leave any default-checkpoint pointer dangling at a now-deleted\n // ref — future `agentbox create` would fail to resolve it. Sweep the\n // global + per-provider keys, clear whichever the project layer set\n // to this ref, warn if the dangling pointer lives in a layer we can't\n // auto-edit (global or agentbox.yaml defaults).\n const cfg = await loadEffectiveConfig(projectRoot);\n const projectBox = cfg.layers.project.values.box;\n const defKeys = [\n ['box.defaultCheckpoint', projectBox?.defaultCheckpoint, cfg.effective.box.defaultCheckpoint],\n ['box.defaultCheckpointDocker', projectBox?.defaultCheckpointDocker, cfg.effective.box.defaultCheckpointDocker],\n ['box.defaultCheckpointDaytona', projectBox?.defaultCheckpointDaytona, cfg.effective.box.defaultCheckpointDaytona],\n ['box.defaultCheckpointHetzner', projectBox?.defaultCheckpointHetzner, cfg.effective.box.defaultCheckpointHetzner],\n ['box.defaultCheckpointVercel', projectBox?.defaultCheckpointVercel, cfg.effective.box.defaultCheckpointVercel],\n ] as const;\n for (const [key, projectValue, effectiveValue] of defKeys) {\n if (projectValue === ref) {\n await unsetConfigValue('project', key, projectRoot);\n log.info(`cleared project ${key} (was ${ref})`);\n } else if (effectiveValue === ref) {\n log.warn(\n `${key} = ${ref} is set outside the per-project config (global or agentbox.yaml defaults) — clear it manually`,\n );\n }\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n/**\n * Cloud checkpoint create: delegate to `provider.checkpoint.create`. The cloud\n * provider's implementation captures via the backend's `createSnapshot` and\n * writes the manifest under `~/.agentbox/cloud-checkpoints/<backend>/…`.\n * Unlike Docker, there's no `--merged` (Daytona snapshots are flattened by\n * construction) and no `--replace` rerun yet (the underlying snapshot delete\n * is async on Daytona's side — keep it explicit: `agentbox checkpoint rm <name>`\n * then re-create).\n */\nasync function runCloudCheckpointCreate(box: BoxRecord, opts: CreateOpts): Promise<void> {\n if (opts.merged) {\n log.warn('--merged is Docker-only (cloud snapshots are always flattened); ignoring');\n }\n const projectRoot = await projectRootFor(box.workspacePath, box.projectRoot);\n const name = opts.name ?? `${box.name}-${String(Date.now()).slice(-6)}`;\n\n // Make sure the sandbox is running — `_experimental_createSnapshot` requires\n // a started sandbox. The provider's `probeState` + `start` handles the\n // pause/stop/missing branches with the same shape `agentbox url` / `screen`\n // use today.\n const provider = await providerForBox(box);\n const state = await provider.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await provider.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await provider.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n\n if (!provider.checkpoint) {\n throw new Error(`provider '${box.provider ?? 'docker'}' doesn't support checkpoints`);\n }\n\n // Daytona's snapshot capture pauses the sandbox while writing the image.\n // Warn attached sessions the same way the docker path does.\n const noticeId = await setRelayNotice(\n box.id,\n 'checkpoint',\n CHECKPOINT_NOTICE,\n CHECKPOINT_NOTICE_TTL_MS,\n );\n try {\n // When this checkpoint becomes the project default, capture the box's\n // agent login(s) back to the host (~/.agentbox) BEFORE the snapshot — the\n // box is guaranteed running here; the snapshot may pause it. Cloud has no\n // shared volume, so a login made inside the box would otherwise be lost on\n // destroy; mirroring it lets the next box (seeded by the cloud push)\n // inherit it. Best-effort — never blocks the checkpoint.\n if (opts.setDefault && provider.extractAgentCredentials) {\n try {\n const saved = await provider.extractAgentCredentials(box);\n if (saved.length > 0) {\n log.info(`saved ${saved.join(', ')} login to ~/.agentbox for future boxes`);\n }\n } catch (err) {\n log.warn(`agent credential extract skipped: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n log.info(`capturing cloud snapshot '${name}' (this may take a few minutes)`);\n const result = await provider.checkpoint.create(box, name);\n log.success(`checkpoint ${result.ref} (daytona snapshot) captured`);\n if (opts.setDefault) {\n // Cloud snapshots aren't usable by docker boxes — pin the daytona-\n // specific default so `agentbox create --provider docker` in the same\n // project doesn't trip over a snapshot it can't resolve.\n const key = defaultCheckpointConfigKey(box.provider ?? 'daytona');\n await setConfigValue('project', key, result.ref, projectRoot);\n log.info(`set project default checkpoint (${key}) -> ${result.ref}`);\n } else {\n log.info(\n `make it the default for new boxes: agentbox checkpoint set-default --provider ${box.provider ?? 'daytona'} ${result.ref}`,\n );\n }\n } finally {\n if (noticeId) await clearRelayNotice(box.id, noticeId);\n }\n}\n\nexport const checkpointCommand = new Command('checkpoint')\n .alias('checkpoints')\n .description('List and manage project checkpoints (warm box state new boxes can start from)')\n .addCommand(createSub)\n .addCommand(lsSub, { isDefault: true })\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 { BoxRecord } from '@agentbox/core';\nimport type { StatusReply, WaitReadyReply } from '@agentbox/ctl';\nimport { loadEffectiveConfig, type IdeFlavor as ConfigIdeFlavor, type UserConfig } from '@agentbox/config';\nimport {\n attachedContainerUri,\n ensureAgentboxTasksFile,\n execInBox,\n getDockerContext,\n ideProfile,\n inspectBox,\n startBox,\n unpauseBox,\n type IdeFlavor,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { agentboxAliasFor, parseSshTarget, writeAgentboxSshAlias } from '../ssh-config.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface CodeOptions {\n // commander stores `--no-wait` / `--no-auto-terminals` under the positive\n // key (`wait` / `autoTerminals`), defaulting to true and flipping to false.\n wait?: boolean;\n timeout?: string;\n autoTerminals?: 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.wait === false) code.wait = false;\n if (opts.autoTerminals === false) 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 const provider = box.provider ?? 'docker';\n const folderUri =\n provider === 'docker'\n ? await prepareDockerAttach(box, { wait, autoTerminals, timeoutMs, regenTasks: opts.regenTasks })\n : await prepareCloudAttach(box, { wait, timeoutMs });\n\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.name} in ${ideProfile(exit.flavor).displayName} (${exit.via})`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ninterface PrepareDockerOptions {\n wait: boolean;\n autoTerminals: boolean;\n timeoutMs: string;\n regenTasks?: boolean;\n}\n\nasync function prepareDockerAttach(box: BoxRecord, opts: PrepareDockerOptions): Promise<string> {\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`);\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 (opts.wait) {\n const reply = await runWaitReadyDocker(box.container, opts.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 (opts.autoTerminals) {\n try {\n const services = await fetchServiceNamesDocker(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 // Embed the active Docker context so the Dev Containers extension\n // attaches via the same daemon agentbox used — without it, switching\n // engines (OrbStack ⇄ Docker Desktop) makes it probe the wrong daemon\n // and report the container as non-existent.\n const dockerContext = await getDockerContext();\n return attachedContainerUri(box.container, { dockerContext });\n}\n\ninterface PrepareCloudOptions {\n wait: boolean;\n timeoutMs: string;\n}\n\nasync function prepareCloudAttach(box: BoxRecord, opts: PrepareCloudOptions): Promise<string> {\n const p = await providerForBox(box);\n const state = await p.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await p.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await p.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n\n if (opts.wait) {\n try {\n const r = await p.exec(box, ['agentbox-ctl', 'wait-ready', '--json', '--timeout', opts.timeoutMs]);\n const reply = JSON.parse(r.stdout) as WaitReadyReply;\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 } catch (err) {\n log.warn(`wait-ready failed (continuing): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Auto-terminals is docker-only for v1 — writing tasks.json requires a\n // `writeFileInBox` over `backend.exec`. Not load-bearing for the editor\n // attach itself; user can author `.vscode/tasks.json` manually.\n\n if (!p.buildAttach) {\n throw new Error(\n `cloud provider '${p.name}' does not support SSH attach — \\`agentbox code\\` requires it`,\n );\n }\n // buildAttach mints a fresh 60-min SSH token via the backend's `attachArgv`.\n // We only want the connect argv here; the inner tmux command is irrelevant\n // (Remote-SSH starts its own session). `noTmux` skips the tmux wrap so\n // argv is the plain `ssh ... <user>@<host>` form.\n const spec = await p.buildAttach(box, 'shell', { noTmux: true });\n const target = parseSshTarget(spec.argv);\n if (!target) {\n throw new Error(\n `could not parse <user>@<host> from cloud SSH argv: ${spec.argv.join(' ')}`,\n );\n }\n\n const alias = agentboxAliasFor(box.name);\n await writeAgentboxSshAlias({\n alias,\n hostname: target.host,\n user: target.user,\n identityFile: target.identityFile,\n });\n log.info(`updated ~/.ssh/config alias ${alias}`);\n\n return `vscode-remote://ssh-remote+${alias}/workspace`;\n}\n\nasync function runWaitReadyDocker(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 fetchServiceNamesDocker(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 { promises as fs } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/**\n * Host-side helper for maintaining one `Host <alias>` block per cloud box in\n * `~/.ssh/config`. Daytona's SSH gateway authenticates per-token (the User\n * field carries an ephemeral 60-min token from `sb.createSshAccess(60)`), so\n * we rewrite the block every `agentbox code` invocation to keep the alias\n * mapped to a live token. BEGIN/END markers around each managed block let us\n * coexist with user-authored entries.\n */\n\nexport interface SshAliasOptions {\n /** Host alias the user (and VS Code Remote-SSH) refers to, e.g. `agentbox-cloud-myname`. */\n alias: string;\n /** Daytona SSH gateway, typically `ssh.app.daytona.io`. */\n hostname: string;\n /** Ephemeral Daytona token (used as the SSH User). Rotates every call. */\n user: string;\n /**\n * Per-box private key path for providers that authenticate by identity\n * file (Hetzner). Omit for token-in-User auth (Daytona) — without this\n * field VSCode's Remote-SSH would try ~/.ssh/id_* defaults and fail with\n * \"permission denied\" against a Hetzner VPS that only trusts the per-box\n * key under `~/.agentbox/boxes/<id>/ssh/id_ed25519`.\n */\n identityFile?: string;\n}\n\nfunction sshConfigPath(): string {\n return join(homedir(), '.ssh', 'config');\n}\n\nfunction beginMarker(alias: string): string {\n return `# BEGIN agentbox cloud box ${alias}`;\n}\n\nfunction endMarker(alias: string): string {\n return `# END agentbox cloud box ${alias}`;\n}\n\n/** Stable alias derived from a box name. Box names are already kebab-safe. */\nexport function agentboxAliasFor(boxName: string): string {\n return `agentbox-cloud-${boxName}`;\n}\n\nasync function readConfig(): Promise<string> {\n try {\n return await fs.readFile(sshConfigPath(), 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return '';\n throw err;\n }\n}\n\n/**\n * Strip an existing managed block for `alias`. Returns the file contents with\n * any block bracketed by our BEGIN/END markers for this alias removed.\n *\n * Anchored at the start of a line (`m` flag) so the preceding newline stays\n * attached to whatever came before — removing a block between two pieces of\n * content must not collapse the separating newline.\n */\nfunction stripBlock(contents: string, alias: string): string {\n const begin = beginMarker(alias);\n const end = endMarker(alias);\n const escape = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(\n `^${escape(begin)}\\\\n[\\\\s\\\\S]*?${escape(end)}\\\\n?`,\n 'gm',\n );\n return contents.replace(pattern, '');\n}\n\nfunction buildBlock(opts: SshAliasOptions): string {\n // `UserKnownHostsFile /dev/null` + `LogLevel ERROR` is the Vagrant / dev-tool\n // convention: many sandboxes sit behind one DNS name, so pinning a host key\n // locally generates noise + false-positive HostKeyVerificationFailed errors.\n const lines: string[] = [\n beginMarker(opts.alias),\n `Host ${opts.alias}`,\n ` HostName ${opts.hostname}`,\n ` User ${opts.user}`,\n ];\n if (opts.identityFile) {\n // `IdentitiesOnly yes` stops ssh-agent from offering unrelated keys\n // first — some sshd configs cap auth attempts and would lock us out\n // before the right key is tried.\n lines.push(` IdentityFile ${opts.identityFile}`);\n lines.push(` IdentitiesOnly yes`);\n }\n lines.push(\n ` StrictHostKeyChecking accept-new`,\n ` UserKnownHostsFile /dev/null`,\n ` LogLevel ERROR`,\n endMarker(opts.alias),\n '',\n );\n return lines.join('\\n');\n}\n\nexport async function writeAgentboxSshAlias(opts: SshAliasOptions): Promise<void> {\n const path = sshConfigPath();\n await fs.mkdir(join(homedir(), '.ssh'), { recursive: true, mode: 0o700 });\n const existing = await readConfig();\n const stripped = stripBlock(existing, opts.alias);\n const separator = stripped.length === 0 || stripped.endsWith('\\n') ? '' : '\\n';\n const next = `${stripped}${separator}${buildBlock(opts)}`;\n await fs.writeFile(path, next, { mode: 0o600 });\n // Re-assert mode in case the file existed with broader perms.\n await fs.chmod(path, 0o600);\n}\n\nexport interface SshTarget {\n user: string;\n host: string;\n /** Path from `-i <path>` if the argv carries one (Hetzner). Undefined for\n * Daytona where auth is via token-in-User. */\n identityFile?: string;\n}\n\n/**\n * Pluck the SSH connect target (and identity file, if any) out of an argv\n * returned by a provider's `attachArgv` / `buildAttach`. The argv shape is\n * `ssh [-i <path>] [-o ...] <user>@<host> [command...]` — we walk from the\n * end to find the user@host token and scan forward for `-i`.\n */\nexport function parseSshTarget(argv: readonly string[]): SshTarget | undefined {\n let target: { user: string; host: string } | undefined;\n for (let i = argv.length - 1; i >= 0; i--) {\n const v = argv[i];\n if (!v || v.startsWith('-')) continue;\n const at = v.indexOf('@');\n if (at <= 0) continue;\n target = { user: v.slice(0, at), host: v.slice(at + 1) };\n break;\n }\n if (!target) return undefined;\n let identityFile: string | undefined;\n for (let i = 0; i < argv.length - 1; i++) {\n if (argv[i] === '-i') {\n identityFile = argv[i + 1];\n break;\n }\n }\n return { ...target, identityFile };\n}\n\nexport async function removeAgentboxSshAlias(alias: string): Promise<void> {\n const path = sshConfigPath();\n const existing = await readConfig();\n if (existing === '') return;\n const next = stripBlock(existing, alias);\n if (next === existing) return; // no managed block matched\n await fs.writeFile(path, next, { mode: 0o600 });\n}\n","import { confirm, intro, isCancel, log, outro, spinner } from '@clack/prompts';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type AttachOpenIn,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n buildCodexAttachArgv,\n buildCodexLoginRunArgv,\n CodexSessionError,\n codexSessionInfo,\n createBox,\n DEFAULT_RELAY_PORT,\n detectEngine,\n ensureCodexInstalled,\n ensureCodexVolume,\n ensureImage,\n formatDetachNotice,\n inspectBox,\n runInteractiveCodexLogin,\n seedCodexHooks,\n SHARED_CODEX_VOLUME,\n startBox,\n startCodexSession,\n unpauseBox,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport {\n assertAgentCredsAvailable,\n codexAuthAvailable,\n MissingAgentCredsError,\n} from '../lib/queue/assert-creds.js';\nimport { parseMaxOption } from '../lib/queue/parse-max-option.js';\nimport { submitQueueJob } from '../lib/queue/submit.js';\nimport {\n ATTACH_IN_HELP,\n INLINE_HELP,\n NO_ATTACH_HELP,\n resolveAttachInOption,\n} from './_attach-in.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\nimport { cloudAgentCreate } from './_cloud-agent-create.js';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, UseBranchError, resolveBranchSelection } from '../lib/from-branch.js';\nimport { providerForBox, providerForCreate } from '../provider/registry.js';\nimport {\n prepareTeleport,\n TeleportError,\n uploadTeleport,\n type ResolvedTeleport,\n type ResumeMode,\n} from '../session-teleport/index.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybePromptPortless } from '../portless-prompt.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Ref shown in the detach notice: the per-project index `n` when set, else the name. */\nfunction reattachRef(r: { projectIndex?: number; name: string }): string {\n return typeof r.projectIndex === 'number' ? String(r.projectIndex) : r.name;\n}\n\nfunction pickCodexCreateOpts(opts: CodexCreateOptions): import('@agentbox/relay').QueueJobCreateOpts {\n return {\n workspace: opts.workspace,\n name: opts.name,\n hostSnapshot: opts.hostSnapshot,\n snapshot: opts.snapshot,\n image: opts.image,\n withPlaywright: opts.withPlaywright,\n withEnv: opts.withEnv,\n vnc: opts.vnc,\n sharedDockerCache: opts.sharedDockerCache,\n portless: opts.portless,\n sessionName: opts.sessionName,\n memory: opts.memory,\n cpus: opts.cpus,\n pidsLimit: opts.pidsLimit,\n disk: opts.disk,\n };\n}\n\n/** Host-side URL for the relay (loopback for the wrapper's SSE subscription). */\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/**\n * Attach to a box's Codex tmux session through the wrapped-pty footer (same\n * channel `agentbox claude` uses for the host-action prompts), then exit with\n * the inner pty's code. The footer + relay prompt channel are box-level, not\n * claude-specific, so codex reuses them with `mode: 'codex'`.\n */\nasync function attachCodexWrapped(\n box: { id: string; name: string; container: string; projectIndex?: number },\n sessionName: string | undefined,\n reattach: string,\n onError?: (msg: string) => void,\n openIn?: AttachOpenIn,\n): Promise<never> {\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildCodexAttachArgv(box.container, sessionName),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'codex',\n detachable: true,\n detachNotice: formatDetachNotice(reattach, 'codex'),\n onError,\n openIn,\n });\n process.exit(code);\n}\n\ninterface CodexCreateOptions {\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 isolateCodexConfig?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** Sandbox backend: `docker` (default) or `daytona`. */\n provider?: string;\n /** --from-branch <ref>: base the box's per-box branch on this ref instead of HEAD. */\n fromBranch?: string;\n /** -b / --use-branch <name>: reuse an existing branch directly instead of forking agentbox/<name>. */\n useBranch?: string;\n /** -v / --verbose: bypass the spinner and stream raw provider output. */\n verbose?: boolean;\n /** Raw `--attach-in <mode>` value; validated by `parseAttachInOption`. */\n attachIn?: string;\n /** --inline: shortcut for `--attach-in same` (long-form only — `-i` is `--initial-prompt`). */\n inline?: boolean;\n /** Commander parses `-d, --no-attach` as `attach: false` (defaults true). */\n attach?: boolean;\n /** `-i, --initial-prompt <text>`: seed codex with this user turn; runs in background. */\n initialPrompt?: string;\n /** Per-invocation override of `queue.maxConcurrent`. */\n maxRunning?: string;\n /** Per-invocation override of `queue.maxWorking`. */\n maxWorking?: string;\n /** `-c, --continue`: teleport and resume the most recent host codex session for this cwd. */\n continue?: boolean;\n /** `--resume <id>`: teleport and resume the specified host codex session uuid. */\n resume?: string;\n}\n\nfunction buildCodexCliOverrides(opts: CodexCreateOptions): 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.isolateCodexConfig === true) box.isolateCodexConfig = true;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n const codex: NonNullable<UserConfig['codex']> = {};\n if (opts.sessionName !== undefined) codex.sessionName = opts.sessionName;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (Object.keys(codex).length > 0) out.codex = codex;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n const attachIn = resolveAttachInOption(opts);\n if (attachIn !== undefined) out.attach = { openIn: attachIn };\n return out;\n}\n\n/**\n * Run `codex login` in a throwaway container against the shared codex-config\n * volume — credentials persist there and seed every later box. Defaults to the\n * `--device-auth` device-code flow (see {@link buildCodexLoginRunArgv}).\n */\nasync function runCodexLoginContainer(image: string, extraArgs: string[]): Promise<number> {\n const { exitCode } = runInteractiveCodexLogin(\n buildCodexLoginRunArgv({ volume: SHARED_CODEX_VOLUME, image, extraArgs }),\n );\n return exitCode;\n}\n\n/**\n * First-run sign-in offer, shown before box creation. When no Codex\n * credentials are available, prompts the user and (on confirm) runs\n * `codex login` in a throwaway container — the result seeds every future box\n * via the shared volume. Silent no-op when already authenticated, in\n * non-interactive runs, or with `--yes`.\n */\nasync function maybeRunCodexLogin(args: { image: string; yes: boolean }): Promise<void> {\n if (!process.stdin.isTTY || args.yes) return;\n if (await codexAuthAvailable(args.image)) return;\n\n const answer = await confirm({\n message: 'Sign in to Codex? (saved and reused by every box)',\n initialValue: true,\n });\n if (isCancel(answer) || !answer) {\n log.info('Skipped sign-in — codex will prompt you to sign in inside the box.');\n return;\n }\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(args.image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists (and is vscode-writable) before the login\n // container writes auth.json into it.\n s.message('preparing codex config');\n await ensureCodexVolume({ volume: SHARED_CODEX_VOLUME }, { syncFromHost: true, image: args.image });\n s.stop('image ready');\n\n const exitCode = await runCodexLoginContainer(args.image, []);\n if (exitCode !== 0) {\n log.warn('Codex login did not complete; continuing — run `agentbox codex login` to retry.');\n return;\n }\n log.success('Signed in to Codex — saved for future boxes.');\n}\n\nexport const codexCommand = new Command('codex')\n .description('Create a sandboxed box and launch OpenAI Codex 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', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\n .option('--no-host-snapshot', 'tar-pipe directly from the live host workspace at create time')\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')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\n .option(\n '--isolate-codex-config',\n 'use a per-box ~/.codex volume instead of the shared agentbox-codex-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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\n .option('--session-name <name>', 'tmux session name (default from config; built-in: codex)')\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(\n '--provider <name>',\n \"sandbox backend: 'docker' (default) or 'daytona' for a cloud box\",\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-b, --use-branch <name>',\n \"reuse an existing branch directly instead of forking agentbox/<box-name>. Commits/pushes flow straight to it. Docker fails if the host already has it checked out. Mutually exclusive with --from-branch.\",\n )\n .option(\n '-v, --verbose',\n 'bypass the spinner and stream raw provider output to stderr. The same content always lands in ~/.agentbox/logs/codex.log.',\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('--inline', INLINE_HELP)\n .option('-d, --no-attach', NO_ATTACH_HELP)\n .option(\n '-i, --initial-prompt <text>',\n 'seed the codex session with this initial user turn and run in background (no attach). Jobs go through the host-wide queue (queue.maxConcurrent).',\n )\n .option(\n '--max-running <n>',\n 'per-invocation override of queue.maxConcurrent; only honored when `-i` is set',\n )\n .option(\n '--max-working <n>',\n 'per-invocation override of queue.maxWorking; only honored when `-i` is set',\n )\n .option(\n '-c, --continue',\n 'teleport the most recent host Codex session for this cwd into the box and resume from it',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Codex session uuid into the box and resume from it',\n )\n .argument(\n '[codex-args...]',\n \"extra args passed to codex inside the box; place after `--`, e.g. `agentbox codex -- -m gpt-5.4`\",\n )\n .action(async (codexArgs: string[], opts: CodexCreateOptions) => {\n const cmdLog = openCommandLog('codex');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Starting Codex in a box...');\n\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n cmdLog.close();\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n if (resumeMode && opts.initialPrompt && opts.initialPrompt.length > 0) {\n log.error('-i / --initial-prompt cannot be combined with -c / --resume.');\n cmdLog.close();\n process.exit(2);\n }\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'codex',\n hostCwd: opts.workspace,\n mode: resumeMode,\n log: (line) => cmdLog.write(line),\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildCodexCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n // Resolve provider. Cloud path skips docker-only steps (login offer,\n // Portless, createBox) and delegates to cloudAgentCreate.\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const isCloud = providerName !== 'docker';\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n if (opts.initialPrompt && opts.initialPrompt.length > 0) {\n if (isCloud) {\n log.error('-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).');\n cmdLog.close();\n process.exit(2);\n }\n try {\n await assertAgentCredsAvailable({\n agent: 'codex',\n image: cfg.effective.box.image,\n });\n } catch (err) {\n if (err instanceof MissingAgentCredsError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const maxRunningOverride = parseMaxOption('--max-running', opts.maxRunning);\n const maxWorkingOverride = parseMaxOption('--max-working', opts.maxWorking);\n const result = await submitQueueJob({\n agent: 'codex',\n boxName: opts.name ?? '',\n providerName,\n prompt: opts.initialPrompt,\n agentArgs: codexArgs,\n createOpts: pickCodexCreateOpts(opts),\n maxRunningOverride,\n maxWorkingOverride,\n });\n outro(\n `job ${result.job.id} queued (${String(result.runningCount)}/${String(result.maxConcurrent)} running); log: ${result.job.logPath}`,\n );\n cmdLog.close();\n return;\n }\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask before any\n // box work. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\n\n let fromBranch: string | undefined;\n let useBranch: string | undefined;\n try {\n ({ fromBranch, useBranch } = await resolveBranchSelection({\n useBranch: opts.useBranch,\n fromBranch: opts.fromBranch,\n repo: opts.workspace,\n providerName,\n cloudUseCurrentBranch: cfg.effective.cloud.useCurrentBranch,\n log: (m) => cmdLog.write(m),\n }));\n } catch (err) {\n if (err instanceof FromBranchError || err instanceof UseBranchError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n\n if (isCloud) {\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n await cloudAgentCreate({\n provider,\n request: {\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n fromBranch,\n useBranch,\n projectRoot,\n },\n binary: 'codex',\n sessionName: cfg.effective.codex.sessionName,\n mode: 'codex',\n extraArgs: codexArgs,\n verbose: opts.verbose === true,\n openIn: cfg.effective.attach.openIn,\n attach: opts.attach !== false,\n beforeStart: resumePrepared\n ? async (box) => {\n try {\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared!,\n log: (line) => cmdLog.write(line),\n });\n return { agentArgsPrefix: resumePrepared!.forwardArgs };\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n : undefined,\n });\n return;\n }\n\n // First-run sign-in offer — before any box work, so the user signs in up\n // front. Uses a throwaway container; the result seeds every future box.\n await maybeRunCodexLogin({ image: cfg.effective.box.image, yes: !!opts.yes });\n\n // First-run Portless opt-in (Docker Desktop only).\n const portlessEnabled = await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n\n // host-snapshot default off: explicit flag/config wins.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n const sessionName = cfg.effective.codex.sessionName;\n\n const s = makeProgressReporter(opts.verbose === true);\n s.start('creating box');\n let containerName = '';\n try {\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 fromBranch,\n useBranch,\n image: cfg.effective.box.image,\n codexConfig: { isolate: cfg.effective.box.isolateCodexConfig },\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n containerName = result.record.container;\n\n // Codex is baked into the current base image, but a box built from a\n // checkpoint captured before Codex support won't have it — install it\n // into the box's writable layer in that case (fast no-op otherwise).\n s.message('checking codex');\n cmdLog.write('checking codex');\n await ensureCodexInstalled(result.record.container, {\n onProgress: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n\n let effectiveCodexArgs = codexArgs;\n if (resumePrepared) {\n s.message('uploading codex session into box');\n cmdLog.write('uploading codex session into box');\n try {\n const provider = await providerForBox(result.record);\n await uploadTeleport({\n box: result.record,\n provider,\n resolved: resumePrepared,\n log: (line) => {\n s.message(clampSpinnerLine(line));\n cmdLog.write(line);\n },\n });\n effectiveCodexArgs = [...resumePrepared.forwardArgs, ...effectiveCodexArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n log.info(\n `The box ${result.record.container} is up but unused. Destroy it with: agentbox destroy ${result.record.container} -y`,\n );\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n s.message('starting codex session');\n await startCodexSession({\n container: result.record.container,\n codexArgs: effectiveCodexArgs,\n sessionName,\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\n if (opts.attach === false) {\n outro(\n `session started — attach with: agentbox codex attach ${reattachRef(result.record)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves codex running');\n await attachCodexWrapped(\n result.record,\n sessionName,\n reattachRef(result.record),\n (m) => cmdLog.write(m),\n cfg.effective.attach.openIn,\n );\n } catch (err) {\n s.stop('failed');\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);\n if (err instanceof CodexSessionError) {\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 cmdLog.close();\n process.exit(1);\n }\n handleLifecycleError(err);\n } finally {\n cmdLog.close();\n }\n });\n\ninterface CodexStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n attachIn?: string; // raw `--attach-in <mode>` value, validated below.\n inline?: boolean; // -i / --inline: shortcut for --attach-in same.\n attach?: boolean; // commander: --no-attach => false; default true.\n continue?: boolean;\n resume?: string;\n}\n\n// Shared by `codex start` and `codex attach`: if a session is already running,\n// just attach; otherwise auto-unpause/start the box, (optionally) resync\n// ~/.codex, launch codex, then attach.\nasync function startOrAttachCodex(\n box: BoxRecord,\n codexArgs: string[],\n opts: CodexStartOptions,\n resumePrepared?: ResolvedTeleport | null,\n): Promise<void> {\n const attachIn = resolveAttachInOption(opts);\n const cliOverrides: Partial<UserConfig> = {};\n if (opts.sessionName) cliOverrides.codex = { sessionName: opts.sessionName };\n if (attachIn !== undefined) cliOverrides.attach = { openIn: attachIn };\n const cfg = await loadEffectiveConfig(box.workspacePath, { cliOverrides });\n const sessionName = cfg.effective.codex.sessionName;\n const openIn = cfg.effective.attach.openIn;\n const wantAttach = opts.attach !== false;\n\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, ignore any\n // post-`--` args (they only apply to a fresh codex).\n const existing = await codexSessionInfo(box.container, sessionName);\n if (existing.running) {\n if (resumePrepared) {\n throw new Error(\n `cannot resume into ${box.name}: a Codex session is already running. Kill it first or use \\`agentbox codex attach\\`.`,\n );\n }\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" already running — attach with: agentbox codex attach ${reattachRef(box)}`,\n );\n return;\n }\n outro(`session \"${sessionName}\" already running — attaching (Control+a d to detach)`);\n await attachCodexWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n return;\n }\n\n // First-run sign-in offer — before any box prep.\n await maybeRunCodexLogin({ image: box.image, yes: false });\n\n const s = spinner();\n s.start('preparing box');\n\n // Auto-unpause/start. `startBox` relaunches ctl/vnc/dockerd.\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');\n await startBox(box.id);\n }\n\n // Re-sync host ~/.codex into the box volume (default; opt out with\n // --no-sync-config). Skipped for `codex attach`, and for boxes that have no\n // codex volume mounted (created via a plain `agentbox create` on a host\n // without ~/.codex) — codex still runs against the container-local ~/.codex.\n const syncConfig = opts.syncConfig !== false;\n if (syncConfig && box.codexConfigVolume) {\n s.message('syncing ~/.codex into box volume');\n await ensureCodexVolume(\n { volume: box.codexConfigVolume },\n { syncFromHost: true, image: box.image },\n );\n }\n // Re-seed the Codex activity hooks (box-only, image-versioned — runs even\n // with --no-sync-config so an image upgrade still propagates).\n if (box.codexConfigVolume) {\n await seedCodexHooks(box.codexConfigVolume, box.image);\n }\n\n // Install codex if the box image lacks it (checkpoint predating Codex).\n s.message('checking codex');\n await ensureCodexInstalled(box.container, {\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n let effectiveArgs = codexArgs;\n if (resumePrepared) {\n s.message('uploading codex session into box');\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({\n box,\n provider,\n resolved: resumePrepared,\n log: (line) => s.message(clampSpinnerLine(line)),\n });\n effectiveArgs = [...resumePrepared.forwardArgs, ...effectiveArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n s.stop('teleport failed');\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n\n s.message('starting codex session');\n await startCodexSession({ container: box.container, codexArgs: effectiveArgs, sessionName });\n\n s.stop(`box ${box.container} ready`);\n\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" started — attach with: agentbox codex attach ${reattachRef(box)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves codex running');\n await attachCodexWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n}\n\nconst codexAttachCommand = new Command('attach')\n .description(\n 'Attach to a Codex tmux session in a box, starting one if none is running (auto-unpause/start; never re-syncs ~/.codex — use `codex start` for that)',\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: codex)')\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .action(async function (this: Command, idOrName: string | undefined) {\n const opts = this.optsWithGlobals() as CodexStartOptions;\n intro('Attaching to Codex session...');\n try {\n const attachIn = resolveAttachInOption(opts);\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') !== 'docker') {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'codex',\n sessionName: opts.sessionName ?? 'codex',\n mode: 'codex',\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachCodex(box, [], { ...opts, syncConfig: false });\n } catch (err) {\n if (err instanceof CodexSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst codexStartCommand = new Command('start')\n .description(\n 'Start a Codex 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: codex)')\n .option(\n '--no-sync-config',\n \"skip rsyncing the host's ~/.codex into the box's volume before starting (faster; use existing in-box state)\",\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .option('-d, --no-attach', NO_ATTACH_HELP)\n .option(\n '-c, --continue',\n 'teleport the most recent host Codex session for this cwd into the box and resume',\n )\n .option(\n '--resume <id>',\n 'teleport the specified host Codex session uuid into the box and resume',\n )\n .argument(\n '[codex-args...]',\n \"extra args passed to codex when starting a new session; ignored if a session is already running. Place after `--`, e.g. `agentbox codex start 1 -- -m gpt-5.4`\",\n )\n .action(async function (this: Command, idOrName: string | undefined, codexArgs: string[]) {\n const opts = this.optsWithGlobals() as CodexStartOptions;\n intro('Starting Codex in a box...');\n try {\n const attachIn = resolveAttachInOption(opts);\n // Two positionals make commander bind the first post-`--` token to\n // `[box]`; resolveBoxOrShift detects that and auto-picks the box.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n let effectiveCodexArgs = shifted && idOrName ? [idOrName, ...codexArgs] : codexArgs;\n let resumeMode: ResumeMode | null = null;\n if (opts.continue === true && opts.resume) {\n log.error('only one of -c / --continue / --resume can be passed');\n process.exit(2);\n }\n if (opts.continue === true) resumeMode = { kind: 'continue' };\n else if (opts.resume) resumeMode = { kind: 'resume', id: opts.resume };\n let resumePrepared: ResolvedTeleport | null = null;\n if (resumeMode) {\n try {\n resumePrepared = await prepareTeleport({\n agent: 'codex',\n hostCwd: box.workspacePath,\n mode: resumeMode,\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n if ((box.provider ?? 'docker') !== 'docker') {\n if (opts.attach === false) {\n outro(\n `--no-attach: cloud agent sessions are started lazily on attach. Run: agentbox codex attach ${reattachRef(box)}`,\n );\n return;\n }\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n if (resumePrepared) {\n try {\n const provider = await providerForBox(box);\n await uploadTeleport({ box, provider, resolved: resumePrepared });\n effectiveCodexArgs = [...resumePrepared.forwardArgs, ...effectiveCodexArgs];\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n await cloudAgentAttach({\n box,\n binary: 'codex',\n sessionName: opts.sessionName ?? 'codex',\n mode: 'codex',\n extraArgs: effectiveCodexArgs,\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachCodex(box, effectiveCodexArgs, opts, resumePrepared);\n } catch (err) {\n if (err instanceof CodexSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst codexLoginCommand = new Command('login')\n .description(\n 'Sign in to Codex for use in sandboxes. Runs `codex login` in a throwaway container against the shared codex-config volume (default: --device-auth; pass e.g. `-- --api-key`). Usable before the first `agentbox codex`.',\n )\n .argument(\n '[args...]',\n 'extra args forwarded to `codex login` (default: --device-auth); place after `--`, e.g. `agentbox codex login -- --api-key`',\n )\n .action(async (args: string[]) => {\n intro('Signing in to Codex...');\n if (!process.stdin.isTTY) {\n log.error('`agentbox codex login` needs an interactive terminal.');\n process.exit(1);\n }\n try {\n const cfg = await loadEffectiveConfig(process.cwd());\n const image = cfg.effective.box.image;\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists + is vscode-writable before the login\n // container writes auth.json into it.\n s.message('preparing codex config');\n await ensureCodexVolume({ volume: SHARED_CODEX_VOLUME }, { syncFromHost: true, image });\n s.stop('image ready');\n\n const exitCode = await runCodexLoginContainer(image, args);\n if (exitCode !== 0) {\n log.warn(`\\`codex login\\` exited with code ${String(exitCode)}`);\n process.exit(exitCode);\n }\n outro('signed in — credentials saved for future boxes');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ncodexCommand.addCommand(codexAttachCommand);\ncodexCommand.addCommand(codexStartCommand);\ncodexCommand.addCommand(codexLoginCommand);\n","import { confirm, intro, isCancel, log, outro, spinner } from '@clack/prompts';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type AttachOpenIn,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n buildOpencodeAttachArgv,\n buildOpencodeLoginRunArgv,\n createBox,\n DEFAULT_RELAY_PORT,\n detectEngine,\n ensureImage,\n ensureOpencodeInstalled,\n ensureOpencodeVolume,\n formatDetachNotice,\n inspectBox,\n OpencodeSessionError,\n opencodeSessionInfo,\n runInteractiveOpencodeLogin,\n SHARED_OPENCODE_VOLUME,\n startBox,\n startOpencodeSession,\n unpauseBox,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport {\n assertAgentCredsAvailable,\n MissingAgentCredsError,\n opencodeAuthAvailable,\n} from '../lib/queue/assert-creds.js';\nimport { parseMaxOption } from '../lib/queue/parse-max-option.js';\nimport { submitQueueJob } from '../lib/queue/submit.js';\nimport {\n ATTACH_IN_HELP,\n INLINE_HELP,\n NO_ATTACH_HELP,\n resolveAttachInOption,\n} from './_attach-in.js';\nimport { cloudAgentAttach } from './_cloud-attach.js';\nimport { cloudAgentCreate } from './_cloud-agent-create.js';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, UseBranchError, resolveBranchSelection } from '../lib/from-branch.js';\nimport { providerForCreate } from '../provider/registry.js';\nimport { prepareTeleport, TeleportError } from '../session-teleport/index.js';\nimport { clampSpinnerLine } from '../spinner-line.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { resolveLimits } from '../limits.js';\nimport { maybePromptPortless } from '../portless-prompt.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/** Ref shown in the detach notice: the per-project index `n` when set, else the name. */\nfunction reattachRef(r: { projectIndex?: number; name: string }): string {\n return typeof r.projectIndex === 'number' ? String(r.projectIndex) : r.name;\n}\n\nfunction pickOpencodeCreateOpts(opts: OpencodeCreateOptions): import('@agentbox/relay').QueueJobCreateOpts {\n return {\n workspace: opts.workspace,\n name: opts.name,\n hostSnapshot: opts.hostSnapshot,\n snapshot: opts.snapshot,\n image: opts.image,\n withPlaywright: opts.withPlaywright,\n withEnv: opts.withEnv,\n vnc: opts.vnc,\n sharedDockerCache: opts.sharedDockerCache,\n portless: opts.portless,\n sessionName: opts.sessionName,\n memory: opts.memory,\n cpus: opts.cpus,\n pidsLimit: opts.pidsLimit,\n disk: opts.disk,\n };\n}\n\n/** Host-side URL for the relay (loopback for the wrapper's SSE subscription). */\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/**\n * Attach to a box's OpenCode tmux session through the wrapped-pty footer (same\n * channel `agentbox claude`/`codex` use for host-action prompts), then exit\n * with the inner pty's code.\n */\nasync function attachOpencodeWrapped(\n box: { id: string; name: string; container: string; projectIndex?: number },\n sessionName: string | undefined,\n reattach: string,\n onError?: (msg: string) => void,\n openIn?: AttachOpenIn,\n): Promise<never> {\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildOpencodeAttachArgv(box.container, sessionName),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'opencode',\n detachable: true,\n detachNotice: formatDetachNotice(reattach, 'opencode'),\n onError,\n openIn,\n });\n process.exit(code);\n}\n\ninterface OpencodeCreateOptions {\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 isolateOpencodeConfig?: boolean;\n withPlaywright?: boolean;\n withEnv?: boolean;\n /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n sessionName?: string;\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** Sandbox backend: `docker` (default) or `daytona`. */\n provider?: string;\n /** --from-branch <ref>: base the box's per-box branch on this ref instead of HEAD. */\n fromBranch?: string;\n /** -b / --use-branch <name>: reuse an existing branch directly instead of forking agentbox/<name>. */\n useBranch?: string;\n /** -v / --verbose: bypass the spinner and stream raw provider output. */\n verbose?: boolean;\n /** Raw `--attach-in <mode>` value; validated by `parseAttachInOption`. */\n attachIn?: string;\n /** --inline: shortcut for `--attach-in same` (long-form only — `-i` is `--initial-prompt`). */\n inline?: boolean;\n /** Commander parses `-d, --no-attach` as `attach: false` (defaults true). */\n attach?: boolean;\n /** `-i, --initial-prompt <text>`: seed opencode with this user turn; runs in background. */\n initialPrompt?: string;\n /** Per-invocation override of `queue.maxConcurrent`. */\n maxRunning?: string;\n /** Per-invocation override of `queue.maxWorking`. */\n maxWorking?: string;\n /** `-c, --continue`: detected then refused (v1 stub). */\n continue?: boolean;\n /** `--resume <id>`: detected then refused (v1 stub). */\n resume?: string;\n}\n\nfunction buildOpencodeCliOverrides(opts: OpencodeCreateOptions): 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.isolateOpencodeConfig === true) box.isolateOpencodeConfig = true;\n if (opts.sharedDockerCache === true) box.dockerCacheShared = true;\n const opencode: NonNullable<UserConfig['opencode']> = {};\n if (opts.sessionName !== undefined) opencode.sessionName = opts.sessionName;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (Object.keys(opencode).length > 0) out.opencode = opencode;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n const attachIn = resolveAttachInOption(opts);\n if (attachIn !== undefined) out.attach = { openIn: attachIn };\n return out;\n}\n\n/**\n * Run `opencode auth login` in a throwaway container against the shared\n * opencode-config volume — credentials persist there and seed every later box.\n * Interactive provider picker; `extraArgs` (e.g. `--provider anthropic`) are\n * forwarded verbatim.\n */\nasync function runOpencodeLoginContainer(image: string, extraArgs: string[]): Promise<number> {\n const { exitCode } = runInteractiveOpencodeLogin(\n buildOpencodeLoginRunArgv({ volume: SHARED_OPENCODE_VOLUME, image, extraArgs }),\n );\n return exitCode;\n}\n\n/**\n * First-run sign-in offer, shown before box creation. When no OpenCode\n * credentials are available, prompts the user and (on confirm) runs\n * `opencode auth login` in a throwaway container — the result seeds every\n * future box via the shared volume. Silent no-op when already authenticated,\n * in non-interactive runs, or with `--yes`.\n */\nasync function maybeRunOpencodeLogin(args: { image: string; yes: boolean }): Promise<void> {\n if (!process.stdin.isTTY || args.yes) return;\n if (await opencodeAuthAvailable(args.image)) return;\n\n const answer = await confirm({\n message: 'Sign in to OpenCode? (pick a provider; saved and reused by every box)',\n initialValue: true,\n });\n if (isCancel(answer) || !answer) {\n log.info('Skipped sign-in — opencode will prompt you to sign in inside the box.');\n return;\n }\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(args.image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists (and is vscode-writable) before the login\n // container writes auth.json into it.\n s.message('preparing opencode config');\n await ensureOpencodeVolume(\n { volume: SHARED_OPENCODE_VOLUME },\n { syncFromHost: true, image: args.image },\n );\n s.stop('image ready');\n\n const exitCode = await runOpencodeLoginContainer(args.image, []);\n if (exitCode !== 0) {\n log.warn('OpenCode login did not complete; continuing — run `agentbox opencode login` to retry.');\n return;\n }\n log.success('Signed in to OpenCode — saved for future boxes.');\n}\n\nexport const opencodeCommand = new Command('opencode')\n .description('Create a sandboxed box and launch OpenCode 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', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\n .option('--no-host-snapshot', 'tar-pipe directly from the live host workspace at create time')\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')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\n .option(\n '--isolate-opencode-config',\n 'use a per-box OpenCode volume instead of the shared agentbox-opencode-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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\n .option('--session-name <name>', 'tmux session name (default from config; built-in: opencode)')\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(\n '--provider <name>',\n \"sandbox backend: 'docker' (default) or 'daytona' for a cloud box\",\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-b, --use-branch <name>',\n \"reuse an existing branch directly instead of forking agentbox/<box-name>. Commits/pushes flow straight to it. Docker fails if the host already has it checked out. Mutually exclusive with --from-branch.\",\n )\n .option(\n '-v, --verbose',\n 'bypass the spinner and stream raw provider output to stderr. The same content always lands in ~/.agentbox/logs/opencode.log.',\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('--inline', INLINE_HELP)\n .option('-d, --no-attach', NO_ATTACH_HELP)\n .option(\n '-i, --initial-prompt <text>',\n 'seed the opencode session with this initial user turn and run in background (no attach). Jobs go through the host-wide queue (queue.maxConcurrent).',\n )\n .option(\n '--max-running <n>',\n 'per-invocation override of queue.maxConcurrent; only honored when `-i` is set',\n )\n .option(\n '--max-working <n>',\n 'per-invocation override of queue.maxWorking; only honored when `-i` is set',\n )\n .option(\n '-c, --continue',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .option(\n '--resume <id>',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .argument(\n '[opencode-args...]',\n \"extra args passed to opencode inside the box; place after `--`, e.g. `agentbox opencode -- -m anthropic/claude-sonnet-4-5`\",\n )\n .action(async (opencodeArgs: string[], opts: OpencodeCreateOptions) => {\n const cmdLog = openCommandLog('opencode');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Starting OpenCode in a box...');\n\n // OpenCode session teleport is not yet supported (v1 stub). Detect resume\n // flags early and bail with a clear message before any box work happens.\n if (opts.continue === true || opts.resume) {\n try {\n await prepareTeleport({\n agent: 'opencode',\n hostCwd: opts.workspace,\n mode:\n opts.continue === true\n ? { kind: 'continue' }\n : { kind: 'resume', id: opts.resume! },\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n }\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildOpencodeCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n // Resolve provider. Cloud path skips docker-only steps (login offer,\n // Portless, createBox) and delegates to cloudAgentCreate.\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const isCloud = providerName !== 'docker';\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n if (opts.initialPrompt && opts.initialPrompt.length > 0) {\n if (isCloud) {\n log.error('-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).');\n cmdLog.close();\n process.exit(2);\n }\n try {\n await assertAgentCredsAvailable({\n agent: 'opencode',\n image: cfg.effective.box.image,\n });\n } catch (err) {\n if (err instanceof MissingAgentCredsError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const maxRunningOverride = parseMaxOption('--max-running', opts.maxRunning);\n const maxWorkingOverride = parseMaxOption('--max-working', opts.maxWorking);\n const result = await submitQueueJob({\n agent: 'opencode',\n boxName: opts.name ?? '',\n providerName,\n prompt: opts.initialPrompt,\n agentArgs: opencodeArgs,\n createOpts: pickOpencodeCreateOpts(opts),\n maxRunningOverride,\n maxWorkingOverride,\n });\n outro(\n `job ${result.job.id} queued (${String(result.runningCount)}/${String(result.maxConcurrent)} running); log: ${result.job.logPath}`,\n );\n cmdLog.close();\n return;\n }\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask before any\n // box work. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\n\n let fromBranch: string | undefined;\n let useBranch: string | undefined;\n try {\n ({ fromBranch, useBranch } = await resolveBranchSelection({\n useBranch: opts.useBranch,\n fromBranch: opts.fromBranch,\n repo: opts.workspace,\n providerName,\n cloudUseCurrentBranch: cfg.effective.cloud.useCurrentBranch,\n log: (m) => cmdLog.write(m),\n }));\n } catch (err) {\n if (err instanceof FromBranchError || err instanceof UseBranchError) {\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n\n if (isCloud) {\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n await cloudAgentCreate({\n provider,\n request: {\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n fromBranch,\n useBranch,\n projectRoot,\n },\n binary: 'opencode',\n sessionName: cfg.effective.opencode.sessionName,\n mode: 'opencode',\n extraArgs: opencodeArgs,\n verbose: opts.verbose === true,\n openIn: cfg.effective.attach.openIn,\n attach: opts.attach !== false,\n });\n return;\n }\n\n // First-run sign-in offer — before any box work, so the user signs in up\n // front. Uses a throwaway container; the result seeds every future box.\n await maybeRunOpencodeLogin({ image: cfg.effective.box.image, yes: !!opts.yes });\n\n // First-run Portless opt-in (Docker Desktop only).\n const portlessEnabled = await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n\n // host-snapshot default off: explicit flag/config wins.\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n const sessionName = cfg.effective.opencode.sessionName;\n\n const s = makeProgressReporter(opts.verbose === true);\n s.start('creating box');\n let containerName = '';\n try {\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 fromBranch,\n useBranch,\n image: cfg.effective.box.image,\n opencodeConfig: { isolate: cfg.effective.box.isolateOpencodeConfig },\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n docker: { sharedCache: cfg.effective.box.dockerCacheShared },\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n containerName = result.record.container;\n\n // OpenCode is baked into the current base image, but a box built from a\n // checkpoint captured before OpenCode support won't have it — install it\n // into the box's writable layer in that case (fast no-op otherwise).\n s.message('checking opencode');\n cmdLog.write('checking opencode');\n await ensureOpencodeInstalled(result.record.container, {\n onProgress: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n });\n\n s.message('starting opencode session');\n await startOpencodeSession({\n container: result.record.container,\n opencodeArgs,\n sessionName,\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\n if (opts.attach === false) {\n outro(\n `session started — attach with: agentbox opencode attach ${reattachRef(result.record)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves opencode running');\n await attachOpencodeWrapped(\n result.record,\n sessionName,\n reattachRef(result.record),\n (m) => cmdLog.write(m),\n cfg.effective.attach.openIn,\n );\n } catch (err) {\n s.stop('failed');\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);\n if (err instanceof OpencodeSessionError) {\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 cmdLog.close();\n process.exit(1);\n }\n handleLifecycleError(err);\n } finally {\n cmdLog.close();\n }\n });\n\ninterface OpencodeStartOptions {\n sessionName?: string;\n syncConfig?: boolean; // commander: --no-sync-config => false; default true\n attachIn?: string; // raw `--attach-in <mode>` value, validated below.\n inline?: boolean; // -i / --inline: shortcut for --attach-in same.\n attach?: boolean; // commander: --no-attach => false; default true.\n continue?: boolean;\n resume?: string;\n}\n\n// Shared by `opencode start` and `opencode attach`: if a session is already\n// running, just attach; otherwise auto-unpause/start the box, (optionally)\n// resync the OpenCode config, launch opencode, then attach.\nasync function startOrAttachOpencode(\n box: BoxRecord,\n opencodeArgs: string[],\n opts: OpencodeStartOptions,\n): Promise<void> {\n const attachIn = resolveAttachInOption(opts);\n const cliOverrides: Partial<UserConfig> = {};\n if (opts.sessionName) cliOverrides.opencode = { sessionName: opts.sessionName };\n if (attachIn !== undefined) cliOverrides.attach = { openIn: attachIn };\n const cfg = await loadEffectiveConfig(box.workspacePath, { cliOverrides });\n const sessionName = cfg.effective.opencode.sessionName;\n const openIn = cfg.effective.attach.openIn;\n const wantAttach = opts.attach !== false;\n\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, ignore any\n // post-`--` args (they only apply to a fresh opencode).\n const existing = await opencodeSessionInfo(box.container, sessionName);\n if (existing.running) {\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" already running — attach with: agentbox opencode attach ${reattachRef(box)}`,\n );\n return;\n }\n outro(`session \"${sessionName}\" already running — attaching (Control+a d to detach)`);\n await attachOpencodeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n return;\n }\n\n // First-run sign-in offer — before any box prep.\n await maybeRunOpencodeLogin({ image: box.image, yes: false });\n\n const s = spinner();\n s.start('preparing box');\n\n // Auto-unpause/start. `startBox` relaunches ctl/vnc/dockerd.\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');\n await startBox(box.id);\n }\n\n // Re-sync the host's OpenCode config/auth into the box volume (default; opt\n // out with --no-sync-config). Skipped for `opencode attach`, and for boxes\n // with no OpenCode volume mounted — opencode still runs against container-\n // local config in that case.\n const syncConfig = opts.syncConfig !== false;\n if (syncConfig && box.opencodeConfigVolume) {\n s.message('syncing OpenCode config into box volume');\n await ensureOpencodeVolume(\n { volume: box.opencodeConfigVolume },\n { syncFromHost: true, image: box.image },\n );\n }\n\n // Install opencode if the box image lacks it (checkpoint predating OpenCode).\n s.message('checking opencode');\n await ensureOpencodeInstalled(box.container, {\n onProgress: (line) => s.message(clampSpinnerLine(line)),\n });\n\n s.message('starting opencode session');\n await startOpencodeSession({ container: box.container, opencodeArgs, sessionName });\n\n s.stop(`box ${box.container} ready`);\n\n if (!wantAttach) {\n outro(\n `session \"${sessionName}\" started — attach with: agentbox opencode attach ${reattachRef(box)}`,\n );\n return;\n }\n outro('attaching — Control+a d to detach, leaves opencode running');\n await attachOpencodeWrapped(box, sessionName, reattachRef(box), undefined, openIn);\n}\n\nconst opencodeAttachCommand = new Command('attach')\n .description(\n 'Attach to an OpenCode tmux session in a box, starting one if none is running (auto-unpause/start; never re-syncs config — use `opencode start` for that)',\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: opencode)')\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .action(async function (this: Command, idOrName: string | undefined) {\n const opts = this.optsWithGlobals() as OpencodeStartOptions;\n intro('Attaching to OpenCode session...');\n try {\n const attachIn = resolveAttachInOption(opts);\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') !== 'docker') {\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'opencode',\n sessionName: opts.sessionName ?? 'opencode',\n mode: 'opencode',\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachOpencode(box, [], { ...opts, syncConfig: false });\n } catch (err) {\n if (err instanceof OpencodeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst opencodeStartCommand = new Command('start')\n .description(\n 'Start an OpenCode 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: opencode)')\n .option(\n '--no-sync-config',\n \"skip rsyncing the host's OpenCode config into the box's volume before starting (faster; use existing in-box state)\",\n )\n .option('--attach-in <mode>', ATTACH_IN_HELP)\n .option('-i, --inline', INLINE_HELP)\n .option('-d, --no-attach', NO_ATTACH_HELP)\n .option(\n '-c, --continue',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .option(\n '--resume <id>',\n 'session teleport (not yet supported for opencode in v1; emits a friendly error)',\n )\n .argument(\n '[opencode-args...]',\n \"extra args passed to opencode when starting a new session; ignored if a session is already running. Place after `--`, e.g. `agentbox opencode start 1 -- -m anthropic/claude-sonnet-4-5`\",\n )\n .action(async function (this: Command, idOrName: string | undefined, opencodeArgs: string[]) {\n const opts = this.optsWithGlobals() as OpencodeStartOptions;\n intro('Starting OpenCode in a box...');\n try {\n const attachIn = resolveAttachInOption(opts);\n // Two positionals make commander bind the first post-`--` token to\n // `[box]`; resolveBoxOrShift detects that and auto-picks the box.\n const { box, shifted } = await resolveBoxOrShift(idOrName);\n const effectiveOpencodeArgs = shifted && idOrName ? [idOrName, ...opencodeArgs] : opencodeArgs;\n if (opts.continue === true || opts.resume) {\n try {\n await prepareTeleport({\n agent: 'opencode',\n hostCwd: box.workspacePath,\n mode:\n opts.continue === true\n ? { kind: 'continue' }\n : { kind: 'resume', id: opts.resume! },\n });\n } catch (err) {\n if (err instanceof TeleportError) {\n log.error(err.message);\n process.exit(2);\n }\n throw err;\n }\n }\n if ((box.provider ?? 'docker') !== 'docker') {\n if (opts.attach === false) {\n outro(\n `--no-attach: cloud agent sessions are started lazily on attach. Run: agentbox opencode attach ${reattachRef(box)}`,\n );\n return;\n }\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: attachIn ? { attach: { openIn: attachIn } } : {},\n });\n await cloudAgentAttach({\n box,\n binary: 'opencode',\n sessionName: opts.sessionName ?? 'opencode',\n mode: 'opencode',\n extraArgs: effectiveOpencodeArgs,\n openIn: cfg.effective.attach.openIn,\n });\n return;\n }\n await startOrAttachOpencode(box, effectiveOpencodeArgs, opts);\n } catch (err) {\n if (err instanceof OpencodeSessionError) {\n log.error(err.message);\n process.exit(1);\n }\n handleLifecycleError(err);\n }\n });\n\nconst opencodeLoginCommand = new Command('login')\n .description(\n 'Sign in to OpenCode for use in sandboxes. Runs `opencode auth login` in a throwaway container against the shared opencode-config volume (interactive provider picker; pass e.g. `-- --provider anthropic`). Usable before the first `agentbox opencode`.',\n )\n .argument(\n '[args...]',\n 'extra args forwarded to `opencode auth login`; place after `--`, e.g. `agentbox opencode login -- --provider anthropic`',\n )\n .action(async (args: string[]) => {\n intro('Signing in to OpenCode...');\n if (!process.stdin.isTTY) {\n log.error('`agentbox opencode login` needs an interactive terminal.');\n process.exit(1);\n }\n try {\n const cfg = await loadEffectiveConfig(process.cwd());\n const image = cfg.effective.box.image;\n\n const s = spinner();\n s.start('preparing sandbox image');\n await ensureImage(image, { onProgress: (line) => s.message(clampSpinnerLine(line)) });\n // Ensure the shared volume exists + is vscode-writable before the login\n // container writes auth.json into it.\n s.message('preparing opencode config');\n await ensureOpencodeVolume({ volume: SHARED_OPENCODE_VOLUME }, { syncFromHost: true, image });\n s.stop('image ready');\n\n const exitCode = await runOpencodeLoginContainer(image, args);\n if (exitCode !== 0) {\n log.warn(`\\`opencode auth login\\` exited with code ${String(exitCode)}`);\n process.exit(exitCode);\n }\n outro('signed in — credentials saved for future boxes');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nopencodeCommand.addCommand(opencodeAttachCommand);\nopencodeCommand.addCommand(opencodeStartCommand);\nopencodeCommand.addCommand(opencodeLoginCommand);\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 { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n downloadFromBox,\n inspectBox,\n startBox,\n unpauseBox,\n uploadToBox,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/**\n * A `<box>:<path>` arg has a `:` in it AND no `/` before that colon. Anything\n * starting with `./`, `/`, or `../` is unambiguously a host path. Box names\n * are kebab-case identifiers (validated at create), so they can't contain\n * `/`. Empty box ref or missing path → returns null and the caller errors out.\n */\nfunction parseBoxArg(arg: string): { boxRef: string; path: string } | null {\n const idx = arg.indexOf(':');\n if (idx === -1) return null;\n const prefix = arg.slice(0, idx);\n if (prefix.includes('/')) return null;\n if (prefix.length === 0) return null;\n const p = arg.slice(idx + 1);\n if (p.length === 0) return null;\n return { boxRef: prefix, path: p };\n}\n\ninterface Parsed {\n direction: 'download' | 'upload';\n boxRef: string;\n boxPath: string;\n hostPath: string | undefined; // undefined only on download with no dst (= cwd)\n}\n\nfunction parseArgs(src: string, dst: string | undefined): Parsed {\n const srcBox = parseBoxArg(src);\n const dstBox = dst === undefined ? null : parseBoxArg(dst);\n\n if (srcBox && dstBox) {\n throw new Error(\n 'box-to-box copy is not supported; both arguments look like box paths (`name:/path`).',\n );\n }\n if (!srcBox && !dstBox) {\n throw new Error(\n 'one argument must be a box path of the form `<box>:/path` (e.g. `mybox:/workspace/foo`).',\n );\n }\n if (srcBox) {\n return {\n direction: 'download',\n boxRef: srcBox.boxRef,\n boxPath: srcBox.path,\n hostPath: dst,\n };\n }\n if (dst === undefined) {\n throw new Error('host -> box copy requires a destination, e.g. `agentbox cp ./foo box:/dst`.');\n }\n return {\n direction: 'upload',\n boxRef: dstBox!.boxRef,\n boxPath: dstBox!.path,\n hostPath: src,\n };\n}\n\nexport const cpCommand = new Command('cp')\n .description('Copy files between host and box (like `docker cp`; direction picked by `name:` prefix)')\n .argument('<src>', '`box:/path` (download) or host path (upload)')\n .argument(\n '[dst]',\n '`box:/path` (upload) or host path (download); defaults to cwd when downloading',\n )\n .addHelpText(\n 'after',\n [\n '',\n 'Examples:',\n ' agentbox cp mybox:/etc/foo ./foo # download (host path optional)',\n ' agentbox cp mybox:/workspace/.env # download into cwd',\n ' agentbox cp ./local.txt mybox:/workspace/ # upload (host path required)',\n ' agentbox cp ./dir mybox:/workspace/ # upload directory (recursive)',\n ].join('\\n'),\n )\n .action(async (src: string, dst: string | undefined) => {\n try {\n const parsed = parseArgs(src, dst);\n const box = await resolveBoxOrExit(parsed.boxRef);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n if (isCloud) {\n // Cloud cp: provider.uploadPath / downloadPath handle the tar +\n // backend.uploadFile/downloadFile dance. No docker exec, no pause-\n // probe — Daytona sandboxes don't have a Docker container state to\n // probe and the SDK handles the running/archived states itself.\n const provider = await providerForBox(box);\n if (!provider.uploadPath || !provider.downloadPath) {\n throw new Error(`provider '${provider.name}' does not support cp`);\n }\n if (parsed.direction === 'upload') {\n const result = await provider.uploadPath(box, parsed.hostPath!, parsed.boxPath);\n process.stdout.write(`copied to ${box.name}:${result.finalPath}\\n`);\n } else {\n const result = await provider.downloadPath(\n box,\n parsed.boxPath,\n parsed.hostPath ?? process.cwd(),\n );\n process.stdout.write(`copied to ${result.finalPath}\\n`);\n }\n return;\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');\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 if (parsed.direction === 'upload') {\n const result = await uploadToBox(box, parsed.hostPath!, parsed.boxPath);\n if (result.warn) {\n log.warn(`copied to ${box.name}:${result.finalPath}, but ${result.warn}`);\n } else {\n process.stdout.write(`copied to ${box.name}:${result.finalPath}\\n`);\n }\n } else {\n // Download: default dst to cwd (POSIX `cp` convention).\n const result = await downloadFromBox(box, parsed.boxPath, parsed.hostPath ?? process.cwd());\n process.stdout.write(`copied to ${result.finalPath}\\n`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { intro, log, outro } from '@clack/prompts';\nimport {\n bumpProjectGcCounter,\n findProjectRoot,\n loadEffectiveConfig,\n pruneOrphanProjectConfigs,\n resolveDefaultCheckpoint,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n DEFAULT_RELAY_PORT,\n detectEngine,\n listBoxes,\n type BoxRecord,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { execSync, spawnSync } from 'node:child_process';\nimport { runCarryGate } from '../lib/carry-gate.js';\nimport { FromBranchError, UseBranchError, resolveBranchSelection } from '../lib/from-branch.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { makeProgressReporter } from '../lib/progress.js';\nimport { maybePromptPortless, setupPortlessHost } from '../portless-prompt.js';\nimport { providerForCreate } from '../provider/registry.js';\nimport { resolveLimits } from '../limits.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport {\n maybeRunSetupWizard,\n passthroughFlags,\n serializeEnvFilesForEnv,\n WIZARD_AUTOLAUNCH_ENV,\n WIZARD_ENV_FILES_ENV,\n} from '../wizard.js';\nimport { claudeCommand } from './claude.js';\n\ninterface CreateOptions {\n workspace: string;\n name?: string;\n /** Override the sandbox backend. Resolved via the provider registry. */\n provider?: 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 /** --carry-yes (or AGENTBOX_CARRY_YES=1): auto-approve the carry: block prompt. */\n carryYes?: boolean;\n /** --carry <mode>: 'skip' disables carry for this run (also AGENTBOX_CARRY=skip). */\n carry?: 'skip' | 'ask';\n vnc?: boolean; // commander: --no-vnc => false; default true (undefined treated as true)\n sharedDockerCache?: boolean;\n portless?: boolean; // commander: --portless / --no-portless => true / false / undefined\n memory?: string;\n cpus?: string;\n pidsLimit?: string;\n disk?: string;\n /** --bundle-depth <n>: cap commits in the cloud-seed git bundle. 0 = full history. */\n bundleDepth?: number;\n /** --from-branch <ref>: base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. */\n fromBranch?: string;\n /** -b / --use-branch <name>: reuse an existing branch directly instead of forking agentbox/<name>. */\n useBranch?: string;\n /** -v / --verbose: also stream raw build / provision output to stderr. */\n verbose?: boolean;\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 if (opts.bundleDepth !== undefined) box.bundleDepth = opts.bundleDepth;\n const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n return out;\n}\n\nfunction resolveUseSnapshot(\n opts: CreateOptions,\n configDefault: boolean | undefined,\n): boolean {\n // host-snapshot used to be on by default because the snapshot was the\n // overlay lower (the box read directly from it). With the new model the\n // snapshot is only the tar-pipe source for the no-git case, so default off:\n // the live host workspace is a fine source for a 1-2s tar pipe. Users who\n // want the clone-then-tar dance still get it via `--host-snapshot` or\n // `box.hostSnapshot: true`.\n if (opts.hostSnapshot === false) return false;\n if (opts.hostSnapshot === true) return true;\n return configDefault ?? false;\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\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\nasync function attachShell(record: BoxRecord): Promise<never> {\n const dockerArgv = ['exec', '-it', record.container, 'bash'];\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n // Non-TTY (scripted create --attach piping somewhere): preserve\n // bit-for-bit current behavior — the wrapper's own fallback would do\n // the same, but bypassing avoids the node-pty optional-dep load.\n const child = spawnSync('docker', dockerArgv, { stdio: 'inherit' });\n process.exit(child.status ?? 0);\n }\n const code = await runWrappedAttach({\n container: record.container,\n dockerArgv,\n relayBaseUrl: RELAY_HOST_URL,\n boxId: record.id,\n boxName: record.name,\n projectIndex: record.projectIndex,\n mode: 'shell',\n });\n process.exit(code);\n}\n\nexport const createCommand = new Command('create')\n .description('Create and start a new agent box (Docker container with /workspace seeded via in-container git worktree)')\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('--provider <name>', \"sandbox backend: 'docker' (default) or 'daytona' (cloud)\")\n .option('--host-snapshot', 'APFS-clone the host workspace into a per-box scratch dir before seeding /workspace (stabilizes the tar-pipe source)')\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(\n '--portless',\n 'map the box web app to https://<name>.localhost via the Portless proxy (Docker Desktop)',\n )\n .option('--no-portless', 'do not register a Portless alias for this box')\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 container writable-layer size (e.g. 10g); no-op on overlay2/macOS')\n .option(\n '--bundle-depth <n>',\n 'cap commits shipped in the cloud-seed git bundle (daytona, hetzner). 0 = full history. Unset = adaptive (200 commits, re-bundle at 100 if >20 MB). Ignored for docker.',\n (v) => {\n const n = Number.parseInt(v, 10);\n if (!Number.isInteger(n) || n < 0) throw new Error(`--bundle-depth: expected a non-negative integer, got \"${v}\"`);\n return n;\n },\n )\n .option(\n '--from-branch <ref>',\n \"base the box's per-box branch on this ref (branch / tag / SHA) instead of HEAD. Branch/tag names are fetched from origin first.\",\n )\n .option(\n '-b, --use-branch <name>',\n \"reuse an existing branch directly instead of forking agentbox/<box-name>. Commits/pushes flow straight to it. Docker fails if the host already has it checked out. Mutually exclusive with --from-branch.\",\n )\n .option('-y, --yes', 'skip prompts, accept defaults')\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's `carry:` block (also AGENTBOX_CARRY_YES=1). Required for non-TTY use of `-y` when carry: is non-empty.\",\n )\n .option(\n '--carry <mode>',\n \"control the carry: block; 'skip' disables it for this box (also AGENTBOX_CARRY=skip). Default: 'ask' (prompt).\",\n 'ask',\n )\n .option(\n '-v, --verbose',\n 'also stream the raw provider output (docker build / Daytona snapshot create) to stderr. The same content always lands in ~/.agentbox/logs/create.log — pass -v when you want to watch it live without tailing the log.',\n )\n .action(async (opts: CreateOptions) => {\n const cmdLog = openCommandLog('create');\n process.stderr.write(`log: ${cmdLog.path}\\n`);\n intro('Setting up a new box...');\n\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildCliOverrides(opts),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const providerName = opts.provider ?? cfg.effective.box.provider ?? 'docker';\n const checkpointRef = resolveCheckpointRef(\n opts,\n resolveDefaultCheckpoint(cfg.effective, providerName as 'docker' | 'daytona' | 'hetzner' | 'vercel'),\n );\n\n // Cloud providers that use the Daytona public-URL path don't need\n // Portless; the URL is already reachable from anywhere. The wizard's\n // first-run `agentbox claude` hand-off is also Docker-only.\n const isDocker = providerName === 'docker';\n const isHetzner = providerName === 'hetzner';\n\n // Resolve Portless. Docker: classic prompt-once-then-persist flow.\n // Hetzner: default-on (per the \"safe defaults for cloud providers\"\n // policy) — silently set up the host proxy when undefined; respect\n // explicit --no-portless / config `portless.enabled: false`.\n let portlessEnabled: boolean | undefined;\n if (isDocker) {\n portlessEnabled = await maybePromptPortless({\n engine: await detectEngine(),\n enabled: cfg.effective.portless.enabled,\n yes: !!opts.yes,\n cwd: opts.workspace,\n });\n } else if (isHetzner) {\n portlessEnabled = cfg.effective.portless.enabled ?? true;\n if (portlessEnabled) await setupPortlessHost();\n }\n\n // Carry gate (agentbox.yaml's `carry:` block): resolve + ask BEFORE the\n // wizard so the user sees the host-secrets prompt while still in the\n // pre-create phase. Cancel aborts; skip proceeds with no carry payload.\n let carryEntries: import('@agentbox/core').ResolvedCarryEntry[] = [];\n try {\n const gate = await runCarryGate({\n projectRoot,\n yes: !!opts.yes,\n // Pass undefined when the flag wasn't set so the env-var fallback in\n // runCarryGate (?? carryYesEnv / ?? carrySkipEnv) actually fires.\n carryYesFlag: opts.carryYes ? true : undefined,\n carrySkipFlag: opts.carry === 'skip' ? true : undefined,\n onLog: (line) => cmdLog.write(line),\n });\n if (gate.decision === 'cancel') {\n log.warn('carry: cancelled — not creating the box');\n cmdLog.close();\n process.exit(0);\n }\n if (gate.decision === 'approve') carryEntries = gate.entries;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n cmdLog.close();\n process.exit(1);\n }\n\n // First-run wizard: when no agentbox.yaml exists, optionally hand off to\n // `agentbox claude` so the agent can interactively generate one. The\n // wizard runs for every provider — it's the env-file picker + first-run\n // claude offer, both of which are useful for cloud boxes too.\n const wiz = await maybeRunSetupWizard({\n workspace: opts.workspace,\n yes: !!opts.yes,\n command: 'create',\n checkpointRef,\n provider: providerName,\n withEnv: cfg.effective.box.withEnv,\n });\n if (wiz.action === 'switch-to-claude' && isDocker) {\n // Docker: hand off to `agentbox claude` whose default action creates +\n // attaches in one go. For non-docker providers we fall through to the\n // normal create flow below and attach claude post-create, because\n // `agentbox claude`'s default action ignores --provider.\n process.env[WIZARD_AUTOLAUNCH_ENV] = '1';\n const serialized = serializeEnvFilesForEnv(wiz.envFilesToImport);\n if (serialized !== undefined) process.env[WIZARD_ENV_FILES_ENV] = serialized;\n try {\n await claudeCommand.parseAsync(passthroughFlags(opts), { from: 'user' });\n } finally {\n delete process.env[WIZARD_AUTOLAUNCH_ENV];\n delete process.env[WIZARD_ENV_FILES_ENV];\n }\n return;\n }\n // Cloud + switch-to-claude: provision the cloud box now, then attach\n // claude via the cloud SSH path once the box is ready.\n const attachClaudeAfter = wiz.action === 'switch-to-claude' && !isDocker;\n\n const useSnapshot = resolveUseSnapshot(opts, cfg.effective.box.hostSnapshot);\n\n // Verbose mode bypasses the spinner entirely: a cold cloud create\n // streams ~7 minutes of Dockerfile build output that's interesting to\n // watch and reassures the user that progress is happening. Without\n // --verbose, the spinner shows only the latest collapsed status line\n // (full output still lands in cmdLog) — calmer default.\n const s = makeProgressReporter(opts.verbose === true);\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 // --provider flag wins over box.provider config. The registry hands back\n // a DockerProvider for 'docker' and (once Phase 5 wires it) a cloud\n // provider for 'daytona'; everything below is provider-neutral.\n const provider = await providerForCreate({ flag: opts.provider, config: cfg.effective });\n let fromBranch: string | undefined;\n let useBranch: string | undefined;\n try {\n ({ fromBranch, useBranch } = await resolveBranchSelection({\n useBranch: opts.useBranch,\n fromBranch: opts.fromBranch,\n repo: opts.workspace,\n providerName: provider.name,\n cloudUseCurrentBranch: cfg.effective.cloud.useCurrentBranch,\n log: (m) => {\n s.message(m);\n cmdLog.write(m);\n },\n }));\n } catch (err) {\n if (err instanceof FromBranchError || err instanceof UseBranchError) {\n s.stop('aborting: invalid branch selection');\n log.error(err.message);\n cmdLog.close();\n process.exit(2);\n }\n throw err;\n }\n const result = await provider.create({\n workspacePath: opts.workspace,\n name: opts.name,\n checkpointRef,\n image: cfg.effective.box.image,\n withPlaywright,\n withEnv: cfg.effective.box.withEnv,\n envFilesToImport: wiz.envFilesToImport,\n carry: carryEntries,\n vnc: { enabled: cfg.effective.box.vnc },\n limits: resolveLimits(cfg.effective.box, opts),\n bundleDepth: cfg.effective.box.bundleDepth,\n fromBranch,\n useBranch,\n projectRoot,\n onLog: (line) => {\n s.message(line);\n cmdLog.write(line);\n },\n providerOptions: {\n useSnapshot,\n sharedCache: cfg.effective.box.dockerCacheShared,\n portless: portlessEnabled,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n // Vercel-only sizing (box.vercelVcpus / vercelTimeoutMs). The cloud\n // scaffold reads these as overrides; other providers ignore them.\n ...(provider.name === 'vercel'\n ? {\n vcpus: cfg.effective.box.vercelVcpus,\n timeoutMs: cfg.effective.box.vercelTimeoutMs,\n networkPolicy: cfg.effective.box.vercelNetworkPolicy,\n }\n : {}),\n },\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 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}) → ${result.record.checkpointImage ?? '(missing)'}`,\n );\n }\n\n const tryLines = isDocker\n ? [\n ` docker exec -it ${result.record.container} bash`,\n ` docker exec ${result.record.container} ls /workspace`,\n ]\n : [\n ` agentbox shell ${result.record.name}`,\n ` agentbox claude attach ${result.record.name}`,\n ` agentbox url ${result.record.name}`,\n ];\n log.message(\n [\n '',\n 'Try it:',\n ...tryLines,\n '',\n 'Destroy:',\n ` agentbox destroy ${result.record.name}`,\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 // Cloud: when the wizard offered \"switch to claude\" and we accepted,\n // attach claude over SSH now that the box is provisioned. Docker takes\n // the redispatch-to-`agentbox claude` path above (which already\n // attaches), so this branch only fires for cloud providers.\n if (attachClaudeAfter) {\n const { cloudAgentAttach } = await import('./_cloud-attach.js');\n await cloudAgentAttach({\n box: result.record,\n binary: 'claude',\n sessionName: 'claude',\n mode: 'claude',\n });\n return;\n }\n\n if (opts.attach) {\n await attachShell(result.record);\n }\n } catch (err) {\n s.stop('failed');\n const msg = err instanceof Error ? err.message : String(err);\n cmdLog.write(`FAIL: ${err instanceof Error ? (err.stack ?? 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 cmdLog.close();\n process.exit(1);\n } finally {\n cmdLog.close();\n }\n });\n","import { spawn } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { findProjectRoot, loadEffectiveConfig, resolveDefaultCheckpoint } from '@agentbox/config';\nimport {\n buildDashboardAttachArgv,\n buildShellSessionAttachArgv,\n claudeSessionInfo,\n createBox,\n DEFAULT_CODEX_SESSION,\n DEFAULT_OPENCODE_SESSION,\n DEFAULT_RELAY_PORT,\n destroyBox,\n ensureBoxBrowser,\n ensureCodexInstalled,\n ensureOpencodeInstalled,\n listBoxes,\n pauseBox,\n rebuildPluginNativeDeps,\n seedCodexHooks,\n SHARED_CLAUDE_VOLUME,\n shellSessionInfo,\n startBox,\n startClaudeSession,\n startCodexSession,\n startOpencodeSession,\n startShellSession,\n stopBox,\n syncClaudeCredentials,\n unpauseBox,\n waitForTmuxPaneContent,\n type ListedBox,\n} from '@agentbox/sandbox-docker';\nimport { readState } from '@agentbox/sandbox-core';\nimport type { BoxRecord } from '@agentbox/core';\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 { loadPtyBackend, type PtySpawn, type TerminalCtor } from '../pty/pty-backend.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { NEW_BOX_ID, NEW_BOX_LABEL, type SidebarBox } from '../dashboard/sidebar.js';\nimport { buildCloudAttachInnerCommand } from './_cloud-attach.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\n/**\n * Pick the box's primary agent and return its activity + session title for the\n * sidebar. A box runs one agent in practice; priority is claude > codex >\n * opencode. `unknown` activity is not positive evidence (the supervisor seeds\n * it for every box), so it never pins claude over a running codex/opencode.\n */\nfunction resolveAgent(b: ListedBox): { activity?: string; sessionTitle?: string } {\n const real = (s?: string): boolean => !!s && s !== 'unknown';\n if (real(b.claudeActivity) || b.claudeSessionTitle) {\n return { activity: b.claudeActivity, sessionTitle: b.claudeSessionTitle };\n }\n if (b.codexSession?.running || real(b.codexActivity)) {\n return { activity: b.codexActivity, sessionTitle: b.codexSessionTitle };\n }\n if (b.opencodeSession?.running) {\n // OpenCode reports no activity (no plugin) — title only.\n return { sessionTitle: b.opencodeSessionTitle };\n }\n // No positive evidence — fall back to claude's fields, matching today's\n // behavior for a plain box (`? unknown`, name shown).\n return { activity: b.claudeActivity, sessionTitle: b.claudeSessionTitle };\n}\n\nfunction toSidebar(b: ListedBox): SidebarBox {\n const agent = resolveAgent(b);\n return {\n id: b.id,\n name: b.name,\n state: b.state,\n activity: agent.activity,\n sessionTitle: agent.sessionTitle,\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 via the shared backend loader so a missing native\n // prebuild (or the CJS named export issue) degrades only the dashboard,\n // never the rest of the CLI. Same loader is used by wrapped-pty.\n const backend = await loadPtyBackend();\n let ptySpawn: PtySpawn;\n let termCtor: TerminalCtor;\n if (backend) {\n ptySpawn = backend.ptySpawn;\n termCtor = backend.termCtor;\n } else {\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 // Cloud boxes are surfaced read-only in the sidebar — selecting one\n // shows a \"live panels are docker-only\" placeholder via\n // resolveTarget. Don't refuse the ref here.\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 // Cloud boxes: probe the box's live tmux sessions over SSH and pick\n // the highest-priority agent (claude > codex > opencode) — mirrors\n // the docker branch below. One round-trip per selection; cheap with\n // the hetzner ControlMaster warm. Falls back to the menu if no\n // session is up (or the probe failed).\n if ((box.provider ?? 'docker') !== 'docker') {\n const record = await loadBoxRecord(box.id);\n const sessions = await probeCloudSessions(record);\n for (const which of ['claude', 'codex', 'opencode'] as const) {\n if (sessions.has(which)) {\n return buildCloudAttachTarget(record, which);\n }\n }\n return { kind: 'menu' };\n }\n // Docker: probe whichever agent session is live — priority\n // claude > codex > opencode. claude needs a fresh probe (not in\n // listBoxes()); codex / opencode were already live-probed by listBoxes().\n const claude = await claudeSessionInfo(box.container);\n if (claude.running) {\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, claude.sessionName),\n mode: 'claude',\n };\n }\n if (box.codexSession?.running) {\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, box.codexSession.sessionName),\n mode: 'codex',\n };\n }\n if (box.opencodeSession?.running) {\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, box.opencodeSession.sessionName),\n mode: 'opencode',\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 // The cloud attach path needs the full BoxRecord (sandboxId, ssh control\n // socket path, etc.) — ListedBox is the enriched view used for the\n // sidebar and lifecycle ops only.\n const loadBoxRecord = async (boxId: string): Promise<BoxRecord> => {\n const rec = (await readState()).boxes.find((b) => b.id === boxId);\n if (!rec) throw new Error('box not found');\n return rec;\n };\n\n // Cloud equivalent of buildDashboardAttachArgv. Reuses the same\n // base64+mapfile inner-command pattern as `agentbox claude/codex/\n // opencode` so positional args (wizard prompts) survive every quoting\n // layer. For `shell`, attach to/create the box's tracked `shell` tmux\n // session so the dashboard's shell pane is the same detachable session\n // `agentbox shell` sees from the CLI — matching the docker UX.\n const buildCloudAttachTarget = async (\n record: BoxRecord,\n which: 'claude' | 'codex' | 'opencode' | 'shell',\n ): Promise<RightTarget> => {\n const provider = await providerForBox(record);\n if (!provider.buildAttach) {\n throw new Error(`provider '${provider.name}' does not support interactive attach`);\n }\n const sessionName = which;\n const kind = which === 'shell' ? 'shell' : 'agent';\n // `bash -l` for shell — login shell so /etc/profile.d/agentbox.sh\n // exports AGENTBOX_BOX_* env. For agents, the base64+mapfile launcher\n // (extraArgs is always [] from the dashboard — no `--` passthrough).\n const innerCommand =\n which === 'shell' ? 'bash -l' : buildCloudAttachInnerCommand(which);\n const spec = await provider.buildAttach(record, kind, {\n sessionName,\n command: innerCommand,\n });\n return {\n kind: 'attach',\n command: spec.argv[0]!,\n args: spec.argv.slice(1),\n ...(spec.cleanup ? { cleanup: spec.cleanup } : {}),\n mode: which,\n };\n };\n\n const isCloudBox = (box: ListedBox): boolean =>\n (box.provider ?? 'docker') !== 'docker';\n\n // Cloud equivalent of claudeSessionInfo / box.codexSession.running for\n // the docker path: probe the box over SSH for live tmux sessions, so\n // resolveTarget can land directly on the running agent's pane instead\n // of the menu. One round-trip per box selection; cheap once the\n // hetzner ControlMaster is warm.\n const probeCloudSessions = async (record: BoxRecord): Promise<Set<string>> => {\n try {\n const provider = await providerForBox(record);\n const r = await provider.exec(record, [\n 'tmux',\n 'list-sessions',\n '-F',\n '#{session_name}',\n ]);\n if (r.exitCode !== 0) return new Set();\n return new Set(\n r.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n );\n } catch {\n return new Set();\n }\n };\n\n const startClaude = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'claude');\n }\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 // Mirror the in-box OAuth credentials with the host backup.\n const claudeVolume = box.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME;\n await syncClaudeCredentials(\n { volume: claudeVolume },\n { image: box.image, isolate: claudeVolume !== SHARED_CLAUDE_VOLUME },\n );\n await startClaudeSession({ container: box.container, claudeArgs: [], boxName: box.name });\n const info = await claudeSessionInfo(box.container);\n // Attach only once the agent TUI has drawn — see waitForTmuxPaneContent.\n await waitForTmuxPaneContent(box.container, info.sessionName);\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, info.sessionName),\n mode: 'claude',\n };\n };\n\n const startCodex = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'codex');\n }\n // Install codex if the box image lacks it (checkpoint predating Codex).\n await ensureCodexInstalled(box.container);\n if (box.codexConfigVolume) await seedCodexHooks(box.codexConfigVolume, box.image);\n await startCodexSession({ container: box.container, codexArgs: [] });\n await waitForTmuxPaneContent(box.container, DEFAULT_CODEX_SESSION);\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, DEFAULT_CODEX_SESSION),\n mode: 'codex',\n };\n };\n\n const startOpencode = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'opencode');\n }\n await ensureOpencodeInstalled(box.container);\n await startOpencodeSession({ container: box.container, opencodeArgs: [] });\n await waitForTmuxPaneContent(box.container, DEFAULT_OPENCODE_SESSION);\n return {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(box.container, DEFAULT_OPENCODE_SESSION),\n mode: 'opencode',\n };\n };\n\n const openShell = async (boxId: string): Promise<RightTarget> => {\n const box = await findBox(boxId);\n if (isCloudBox(box)) {\n return buildCloudAttachTarget(await loadBoxRecord(boxId), 'shell');\n }\n // Start-or-attach the box's tracked tmux `shell` session, so a shell\n // opened from the dashboard is the same detachable session the CLI\n // sees (`agentbox shell` / `agentbox shell ls`), not a throwaway exec.\n const info = await shellSessionInfo(box.container);\n if (!info.running) {\n await startShellSession({ container: box.container });\n }\n return {\n kind: 'attach',\n command: 'docker',\n args: buildShellSessionAttachArgv(box.container),\n mode: 'shell',\n };\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 <agent>` create block.\n const createNewBox = async (\n agent: 'claude' | 'codex' | 'opencode' | undefined,\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 // Dashboard create flow is docker-only — use the docker per-provider\n // default with the global fallback.\n const dockerDefault = resolveDefaultCheckpoint(cfg.effective, 'docker');\n const checkpointRef = dockerDefault.length > 0 ? dockerDefault : 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 // Pass the agent's config so createBox mounts + syncs its volume\n // (codex/opencode mount on detection too, but this makes it explicit\n // and applies the `--isolate-*-config` preference).\n ...(agent === 'codex'\n ? { codexConfig: { isolate: cfg.effective.box.isolateCodexConfig } }\n : {}),\n ...(agent === 'opencode'\n ? { opencodeConfig: { isolate: cfg.effective.box.isolateOpencodeConfig } }\n : {}),\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 const ctr = result.record.container;\n if (!agent) return { boxId: result.record.id };\n if (agent === 'codex') {\n await ensureCodexInstalled(ctr, { onProgress });\n await startCodexSession({ container: ctr, codexArgs: [] });\n // Attach only once the agent TUI has drawn — see waitForTmuxPaneContent.\n await waitForTmuxPaneContent(ctr, DEFAULT_CODEX_SESSION);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(ctr, DEFAULT_CODEX_SESSION),\n mode: 'codex',\n },\n };\n }\n if (agent === 'opencode') {\n await ensureOpencodeInstalled(ctr, { onProgress });\n await startOpencodeSession({ container: ctr, opencodeArgs: [] });\n await waitForTmuxPaneContent(ctr, DEFAULT_OPENCODE_SESSION);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(ctr, DEFAULT_OPENCODE_SESSION),\n mode: 'opencode',\n },\n };\n }\n await rebuildPluginNativeDeps(ctr, { volume: result.record.claudeConfigVolume });\n await startClaudeSession({ container: ctr, claudeArgs: [], boxName: result.record.name });\n const info = await claudeSessionInfo(ctr);\n await waitForTmuxPaneContent(ctr, info.sessionName);\n return {\n boxId: result.record.id,\n attach: {\n kind: 'attach',\n command: 'docker',\n args: buildDashboardAttachArgv(ctr, 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 url.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 url`. 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 openScreen = 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 // Show the app inside the VNC desktop on the same URL the host uses;\n // ensureBoxBrowser routes a Portless `.localhost` URL via the host proxy.\n const br = await ensureBoxBrowser(\n box.container,\n undefined,\n web.exposed ? web.url : 'about:blank',\n );\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 openUrl = 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 // Lifecycle actions dispatch on provider: docker boxes go through the\n // sandbox-docker helpers (rich container/volume teardown for destroy,\n // etc.); cloud boxes go through `Provider.{pause,stop,start,resume,\n // destroy}(record)`. Mirrors the docker-vs-cloud split in `commands/\n // destroy.ts:46-75`.\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 (isCloudBox(box)) {\n const record = await loadBoxRecord(boxId);\n const provider = await providerForBox(record);\n if (box.state === 'paused') await provider.resume(record);\n else await provider.start(record);\n return;\n }\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 const record = await loadBoxRecord(boxId);\n if ((record.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(record);\n await provider.pause(record);\n return;\n }\n await pauseBox(boxId);\n };\n\n const stopBoxAction = async (boxId: string): Promise<void> => {\n const record = await loadBoxRecord(boxId);\n if ((record.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(record);\n await provider.stop(record);\n return;\n }\n await stopBox(boxId);\n };\n\n const destroyBoxAction = async (boxId: string): Promise<void> => {\n const record = await loadBoxRecord(boxId);\n if ((record.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(record);\n await provider.destroy(record);\n return;\n }\n await destroyBox(boxId);\n };\n\n const compositor = new Compositor(\n {\n ptySpawn,\n termCtor,\n // Host-side loopback URL the per-box SSE subscriptions connect to.\n // The relay binds 0.0.0.0; loopback is the admin/* path's required\n // source. Same constant the wrapped-pty wrappers use.\n relayBaseUrl: `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`,\n listCandidates,\n resolveTarget,\n startClaude,\n startCodex,\n startOpencode,\n openShell,\n createNewBox,\n resumeBox,\n pauseBox: pauseBoxAction,\n stopBox: stopBoxAction,\n destroyBox: destroyBoxAction,\n openScreen,\n openCode,\n openUrl,\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 = 33;\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: 'screen' | 'code' | 'url' | '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 (screen/code/url/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 === 's') this.onEvent({ type: 'action', name: 'screen' });\n else if (c === 'u') this.onEvent({ type: 'action', name: 'url' });\n else if (c === 'c') this.onEvent({ type: 'action', name: 'code' });\n else if (c === 't') 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';\nimport type { IPtyLike, PtySpawn, TerminalCtor } from '../pty/pty-backend.js';\n\n// Re-export types so dashboard-internal imports don't have to know about the\n// shared module split. New code should import directly from ../pty/pty-backend.\nexport type { IPtyLike, PtySpawn, TerminalCtor };\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\n// modifyOtherKeys=1 — ask the outer terminal to disambiguate modifier+key combos\n// that have no legacy encoding (notably Shift+Enter / Ctrl+Enter, which would\n// otherwise collapse to plain `\\r`). Mode 1 (not 2) is deliberate: mode 2 also\n// rewrites Ctrl+letter as CSI sequences, which would break the dashboard's\n// `Ctrl-a` leader chord (see LEADER = 0x01 in input.ts). Mode 1 preserves the\n// legacy Ctrl+letter bytes and only escapes keys that would otherwise be\n// ambiguous, so Shift+Enter arrives as `\\x1b[27;2;13~` (or `\\x1b[13;2u`\n// depending on the terminal) and Ctrl+a still arrives as `\\x01`.\n//\n// Why the dashboard has to emit this at all: the in-box tmux already runs with\n// `extended-keys on` (see buildTmuxSessionArgs in\n// packages/sandbox-docker/src/claude.ts), which decodes either CSI form when\n// tmux receives it. In the wrapped-pty attach path tmux's own output reaches\n// the host terminal, which is enough to coax most terminals into emitting the\n// extended encodings. In the dashboard the inner PTY's output flows only into\n// @xterm/headless (this file, constructor below) and the compositor renders a\n// cell grid from the parsed state — so any mode-set request from tmux is\n// consumed by the headless parser and never reaches the user's real terminal.\n// The compositor emits it itself on start (and the reset on teardown).\nexport const EXT_KEYS_ENABLE_SEQ = '\\x1b[>4;1m';\nexport const EXT_KEYS_DISABLE_SEQ = '\\x1b[>4m';\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 either `docker exec … tmux\n * attach` (docker provider) or `ssh … tmux …` (cloud providers via\n * `Provider.buildAttach`) and feeding an @xterm/headless emulator we read\n * back as a screen grid. The optional `cleanup` callback fires from\n * `dispose()` — daytona's `buildAttach` returns a `revokeAttachToken`\n * cleanup so its 60-min ephemeral SSH token doesn't outlive the attach.\n */\nexport class PtySession {\n private readonly term: XtermTerminal;\n private readonly pty: IPtyLike;\n private readonly cleanup?: () => Promise<void>;\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 command: string,\n args: string[],\n cols: number,\n rows: number,\n onRenderable: () => void,\n onExit: () => void,\n cleanup?: () => Promise<void>,\n ) {\n this.term = new TerminalClass({\n cols,\n rows,\n allowProposedApi: true,\n scrollback: 0,\n convertEol: false,\n });\n this.cleanup = cleanup;\n this.pty = spawn(command, args, {\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 if (this.cleanup) void this.cleanup().catch(() => {});\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 EXT_KEYS_ENABLE_SEQ,\n EXT_KEYS_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 stripTitleGlyph,\n NEW_BOX_ID,\n ADVANCED_HINT_GROUPS,\n type SidebarBox,\n} from './sidebar.js';\nimport { renderFooter } from '../wrapped-pty/footer.js';\nimport { popTerminalTitle, pushTerminalTitle, setTerminalTitle } from '../terminal/title.js';\nimport { postAnswer, subscribePrompts, type PromptStream } from '../wrapped-pty/prompt-client.js';\nimport type { BoxNoticeEvent, PromptAskEvent } from '@agentbox/relay';\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 pure black (truecolor, so terminals can't shade it per\n// context); the selected row reads via bold bright-white text + the `▸` marker.\nconst SB_BG = '\\x1b[48;2;0;0;0m';\nconst SB_BODY = SB_BG + '\\x1b[38;5;250m';\nconst SB_HEADER = SB_BG + '\\x1b[38;5;39m\\x1b[1m';\nconst SB_SELECTED = SB_BG + '\\x1b[38;5;255m\\x1b[1m';\n// Bright yellow + bold for non-selected rows that have a pending relay\n// prompt — same palette index as the [!] tag in the wrapped-pty footer\n// (renderFooter URGENT). Reads as \"this box needs your attention\".\nconst SB_PROMPT = SB_BG + '\\x1b[38;5;220m\\x1b[1m';\n// Bright cyan + bold for the agent's own \"awaiting input\" state\n// (activity === 'waiting'). Distinct hue from yellow so the user can\n// triage at a glance: yellow ▲ = relay needs a decision NOW; cyan ◐ =\n// the agent is idle waiting for the user's direction (less urgent).\nconst SB_AWAITING = SB_BG + '\\x1b[38;5;51m\\x1b[1m';\nconst SGR_RESET = '\\x1b[0m';\n\nexport type RightTarget =\n | {\n kind: 'attach';\n /** Program to spawn — `'docker'` for docker boxes, `'ssh'` for cloud. */\n command: string;\n /** Args passed to `command` (everything after `argv[0]`). */\n args: string[];\n /** Fires when the PtySession is disposed. Used by daytona to revoke the\n * ephemeral SSH token its `buildAttach` mints. */\n cleanup?: () => Promise<void>;\n mode?: 'claude' | 'shell' | 'codex' | 'opencode';\n }\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 /** Relay base URL the per-box SSE subscriptions hit. Typically\n * `http://127.0.0.1:8787` (built from DEFAULT_RELAY_PORT). When absent\n * (legacy callers) the compositor skips prompt subscriptions entirely\n * — the dashboard still works, just without relay-prompt overlay. */\n relayBaseUrl?: string;\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 Claude / Codex / OpenCode tmux session in the box, resolve to attach. */\n startClaude: (boxId: string) => Promise<RightTarget>;\n startCodex: (boxId: string) => Promise<RightTarget>;\n startOpencode: (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). When `agent` is set, also start that\n * agent's session + return an attach target; `undefined` = create only.\n * `onProgress` streams createBox log lines. */\n createNewBox: (\n agent: 'claude' | 'codex' | 'opencode' | undefined,\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 openScreen: (boxId: string) => Promise<string>;\n openCode: (boxId: string) => Promise<string>;\n openUrl: (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/** Spinner advance cadence while a box has an active relay notice. */\nconst NOTICE_SPINNER_MS = 120;\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 /**\n * Per-box relay-prompt state. Populated by SSE `prompt-ask` events,\n * cleared by `prompt-resolved` events or by the local user answering.\n * The sidebar reads it to mark rows; drawChrome's status-line picker\n * reads it to swap to [!] mode when the SELECTED box is in this map.\n * Subscriptions are tracked separately in {@link promptStreams} so\n * we can dispose them when boxes disappear from the list.\n */\n private readonly activePrompts = new Map<string, PromptAskEvent>();\n /**\n * Per-box active relay notice (currently: a checkpoint freezing the box).\n * Drives the `◆ checkpoint` sidebar cell and the animated status-bar\n * warning. Shares the SSE subscriptions in {@link promptStreams}.\n */\n private readonly activeNotices = new Map<string, BoxNoticeEvent>();\n /** Monotonic spinner counter for the notice status bar. */\n private noticeFrame = 0;\n /** Drives the spinner animation while {@link activeNotices} is non-empty. */\n private noticeTimer: ReturnType<typeof setInterval> | null = null;\n private readonly promptStreams = new Map<string, PromptStream>();\n private activeMode: 'claude' | 'shell' | 'codex' | 'opencode' = '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 /** Last host terminal/tab title we emitted, to dedupe OSC writes across the\n * frequent (spinner-driven) drawChrome calls. */\n private lastTitle: string | null = null;\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 // Relay prompt for the selected box: intercept y/N/Esc/Ctrl-c\n // single-byte keystrokes. Multi-byte chunks starting with ESC\n // (CSI: mouse, arrows, Ctrl+Option+↑↓, focus events) fall through\n // — they're not user \"answer\" intent. Same byte-classification as\n // the wrapped-pty input-router so behavior matches.\n if (e.type === 'forward' && this.activePrompts.has(this.selectedId)) {\n if (this.handlePromptKey(e.bytes)) return;\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 + EXT_KEYS_ENABLE_SEQ);\n // Save the user's tab title so teardown can restore it; updateTitle() (via\n // drawChrome) then drives it to `AgentBox: <selected box>`.\n pushTerminalTitle(this.out);\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 this.syncPromptSubscriptions();\n }\n\n /**\n * Diff the current box list against {@link promptStreams}: subscribe to\n * any newcomer (skipping the synthetic + New box entry and pre-relay\n * boxes), dispose any departed subscription. Idempotent — safe to call\n * after every poll. Disposed boxes also clear their {@link activePrompts}\n * entry so the sidebar marker doesn't linger.\n */\n private syncPromptSubscriptions(): void {\n if (this.tornDown) return;\n const url = this.deps.relayBaseUrl;\n if (!url) return; // legacy callers: skip the feature entirely.\n const wanted = new Set<string>();\n for (const b of this.boxes) {\n if (b.id === NEW_BOX_ID) continue;\n wanted.add(b.id);\n }\n // Drop subscriptions for boxes no longer in the list.\n for (const [boxId, stream] of this.promptStreams) {\n if (!wanted.has(boxId)) {\n stream.close();\n this.promptStreams.delete(boxId);\n let changed = this.activePrompts.delete(boxId);\n if (this.activeNotices.delete(boxId)) changed = true;\n if (this.activeNotices.size === 0) this.stopNoticeSpinner();\n if (changed) this.drawChrome();\n }\n }\n // Open subscriptions for boxes we don't already track.\n for (const boxId of wanted) {\n if (this.promptStreams.has(boxId)) continue;\n const stream = subscribePrompts({\n relayBaseUrl: url,\n boxId,\n onPrompt: (ev) => {\n if (this.tornDown) return;\n this.activePrompts.set(boxId, ev);\n this.drawChrome();\n },\n onResolved: (id) => {\n if (this.tornDown) return;\n const current = this.activePrompts.get(boxId);\n if (current && current.id === id) {\n this.activePrompts.delete(boxId);\n this.drawChrome();\n }\n },\n onNotice: (ev) => {\n if (this.tornDown) return;\n this.activeNotices.set(boxId, ev);\n this.startNoticeSpinner();\n this.drawChrome();\n },\n onNoticeCleared: (id) => {\n if (this.tornDown) return;\n const current = this.activeNotices.get(boxId);\n if (current && current.id === id) {\n this.activeNotices.delete(boxId);\n if (this.activeNotices.size === 0) this.stopNoticeSpinner();\n this.drawChrome();\n }\n },\n onError: () => {\n /* subscribePrompts already reconnects with backoff; nothing to do */\n },\n });\n this.promptStreams.set(boxId, stream);\n }\n }\n\n private startNoticeSpinner(): void {\n if (this.noticeTimer) return;\n this.noticeTimer = setInterval(() => {\n this.noticeFrame++;\n this.drawChrome();\n }, NOTICE_SPINNER_MS);\n if (typeof this.noticeTimer.unref === 'function') this.noticeTimer.unref();\n }\n\n private stopNoticeSpinner(): void {\n if (this.noticeTimer) {\n clearInterval(this.noticeTimer);\n this.noticeTimer = null;\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.activity, 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.activity, 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.command,\n target.args,\n Math.max(1, this.layout.right.w),\n Math.max(1, this.layout.right.h),\n () => this.scheduleRender(),\n () => this.onSessionExit(),\n target.cleanup,\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 === 0x78) {\n void this.chooseAction('codex');\n return;\n }\n if (b === 0x6f) {\n void this.chooseAction('opencode');\n return;\n }\n if (b === 0x73) {\n void this.chooseAction('shell');\n return;\n }\n }\n }\n\n private async chooseAction(which: 'claude' | 'codex' | 'opencode' | '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 const label =\n which === 'shell'\n ? 'shell'\n : which === 'opencode'\n ? 'OpenCode'\n : which === 'codex'\n ? 'Codex'\n : 'Claude';\n this.placeholder = ['', which === 'shell' ? ' Opening shell…' : ` Starting ${label}…`];\n this.prevRows = null;\n this.drawChrome();\n this.scheduleRender();\n try {\n const target =\n which === 'shell'\n ? await this.deps.openShell(id)\n : which === 'codex'\n ? await this.deps.startCodex(id)\n : which === 'opencode'\n ? await this.deps.startOpencode(id)\n : await this.deps.startClaude(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 === 'shell' ? 'open a shell' : `start ${label}`} in ${name}:`,\n ` ${msg}`,\n '',\n which === 'shell'\n ? ` Try from a shell: agentbox shell ${name}`\n : ` Try from a shell: agentbox ${which} start ${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 /**\n * Try to consume `bytes` as an answer to the selected box's active relay\n * prompt. Returns true when the bytes were a recognized answer key (the\n * caller stops further dispatch); false when the bytes should flow on to\n * the pty / other handlers.\n *\n * Single-byte chunks only: y/Y/Enter accept, n/N deny, Esc/Ctrl-c deny\n * with `cancelled: true`. Multi-byte chunks starting with ESC (mouse,\n * arrows, focus events, etc.) are passed through — exact same rule the\n * wrapped-pty input-router uses.\n */\n private handlePromptKey(bytes: Buffer): boolean {\n if (bytes.length > 1 && bytes[0] === 0x1b) return false;\n if (bytes.length === 0) return false;\n const b = bytes[0];\n let answer: 'y' | 'n' | null = null;\n let cancelled = false;\n if (b === 0x79 || b === 0x59) answer = 'y'; // 'y'/'Y'\n else if (b === 0x6e || b === 0x4e) answer = 'n'; // 'n'/'N'\n else if (b === 0x1b || b === 0x03) {\n answer = 'n';\n cancelled = true;\n } else if (b === 0x0d || b === 0x0a) {\n // Enter accepts the default; defaultAnswer falls back to 'n' so this\n // matches the [y/N] hint.\n const ev = this.activePrompts.get(this.selectedId);\n answer = ev?.defaultAnswer ?? 'n';\n }\n if (answer === null) return false;\n const ev = this.activePrompts.get(this.selectedId);\n if (!ev) return false;\n // Optimistic local clear so the footer/sidebar update immediately;\n // the relay's prompt-resolved SSE event will arrive afterwards and\n // hit a no-op (already cleared).\n this.activePrompts.delete(this.selectedId);\n this.drawChrome();\n const url = this.deps.relayBaseUrl;\n if (url) {\n void postAnswer({\n relayBaseUrl: url,\n body: { id: ev.id, answer, ...(cancelled ? { cancelled: true } : {}) },\n });\n }\n return true;\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('claude');\n return;\n }\n if (b === 0x78) {\n void this.chooseCreate('codex');\n return;\n }\n if (b === 0x6f) {\n void this.chooseCreate('opencode');\n return;\n }\n if (b === 0x6e) {\n void this.chooseCreate(undefined);\n return;\n }\n }\n }\n\n private async chooseCreate(agent: 'claude' | 'codex' | 'opencode' | undefined): 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(agent, (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: 'screen' | 'code' | 'url'): 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 === 'screen'\n ? await this.deps.openScreen(id)\n : name === 'code'\n ? await this.deps.openCode(id)\n : await this.deps.openUrl(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 /** Drive the host terminal/tab title from the selected box:\n * `AgentBox: <session title | box name>`, or just `AgentBox` for the\n * synthetic \"+ New box\" entry / no selection. Deduped via {@link lastTitle}. */\n private updateTitle(): void {\n if (this.tornDown) return;\n const box = this.selectedBox();\n const inner =\n box && box.id !== NEW_BOX_ID\n ? box.state === 'running' && box.sessionTitle\n ? stripTitleGlyph(box.sessionTitle)\n : box.name\n : undefined;\n const title = inner ? `AgentBox: ${inner}` : 'AgentBox';\n if (title === this.lastTitle) return;\n this.lastTitle = title;\n setTerminalTitle(title, this.out);\n }\n\n private drawChrome(): void {\n this.updateTitle();\n if (this.tornDown || this.layout.tooSmall) return;\n const { sidebar, sepX, statusY } = this.layout;\n // Inject the per-box pendingPrompt / checkpointing flags at render time\n // so sidebarLines' activityCell shows `▲ prompt` / `◆ checkpoint`. We\n // don't mutate this.boxes directly — keeps the polling diff in poll()\n // simple (it compares state/activity/sessionTitle only).\n const decorate = this.activePrompts.size > 0 || this.activeNotices.size > 0;\n const boxesWithPrompt: SidebarBox[] = decorate\n ? this.boxes.map((b) => {\n const pendingPrompt = this.activePrompts.has(b.id);\n const checkpointing = this.activeNotices.has(b.id);\n return pendingPrompt || checkpointing\n ? { ...b, pendingPrompt, checkpointing }\n : b;\n })\n : this.boxes;\n const { lines, rowOwner, headerRows } = sidebarLines(\n boxesWithPrompt,\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 owner = rowOwner[i] ?? null;\n const isSelected = owner === this.selectedId;\n const hasPrompt = owner !== null && this.activePrompts.has(owner);\n // Lookup the box's activity for `awaiting` styling. We already have\n // `boxesWithPrompt` from the inject pass above (same list passed to\n // sidebarLines), so just match on owner.\n const ownerBox = owner !== null ? boxesWithPrompt.find((b) => b.id === owner) : undefined;\n const isAwaiting = ownerBox?.activity === 'waiting';\n // Priority: header > selected > pending prompt > awaiting input > body.\n // Selected wins over both attention states because the status-line\n // already shows what the selected box needs; double-yelling would\n // just clutter. Pending prompt outranks awaiting because it's a\n // hard block (the agent's RPC is paused) vs. a soft \"I'm idle\".\n const style = headerRows[i]\n ? SB_HEADER\n : isSelected\n ? SB_SELECTED\n : hasPrompt\n ? SB_PROMPT\n : isAwaiting\n ? SB_AWAITING\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 const activePromptForSelected = this.activePrompts.get(this.selectedId);\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 if (activePromptForSelected) {\n // Selected box has a pending relay prompt — reuse the wrapped-pty's\n // `[!] <message> <detail> [y/N]` renderer so the two surfaces look\n // identical. y/Y/Enter/n/N/Esc/Ctrl-c are intercepted in onEvent's\n // forward branch above.\n status = renderFooter(\n { kind: 'prompt', prompt: activePromptForSelected },\n this.layout.cols,\n );\n } else if (this.activeNotices.has(this.selectedId)) {\n // Selected box is busy with a relay notice (e.g. checkpoint) — reuse\n // the wrapped-pty's animated notice renderer. Informational, so it\n // sits below a pending prompt in the priority chain.\n const notice = this.activeNotices.get(this.selectedId)!;\n status = renderFooter(\n { kind: 'notice', message: notice.message, frame: this.noticeFrame },\n this.layout.cols,\n );\n } else {\n const stateLabel =\n this.selectedId === NEW_BOX_ID\n ? 'create'\n : this.menu\n ? 'menu'\n : // Attached to a non-claude session → label it (shell/codex/\n // opencode); claude → undefined so claude activity shows.\n this.session && this.activeMode !== 'claude'\n ? this.activeMode\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 if (this.noticeTimer) clearInterval(this.noticeTimer);\n for (const stream of this.promptStreams.values()) stream.close();\n this.promptStreams.clear();\n this.activePrompts.clear();\n this.activeNotices.clear();\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(EXT_KEYS_DISABLE_SEQ + MOUSE_DISABLE_SEQ + '\\x1b[?25h\\x1b[0m\\x1b[?1049l');\n // Restore the host terminal/tab title saved in run().\n popTerminalTitle(this.out);\n this.resolveDone?.();\n }\n}\n","import { log, spinner } from '@clack/prompts';\nimport {\n agentSpecsForCloud,\n ensureAgentVolumesForCloud,\n seedAgentVolumesIfFresh,\n type CloudAgentKind,\n} from '@agentbox/sandbox-cloud';\nimport { Command } from 'commander';\nimport { daytonaBackend } from './backend.js';\nimport {\n ensureDaytonaCredentials,\n maskKey,\n readDaytonaCredStatus,\n secretsPath,\n} from './credentials.js';\n\ninterface LoginOpts {\n status?: boolean;\n}\n\nfunction reportError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n log.error(message);\n process.exitCode = 1;\n}\n\nconst loginSub = new Command('login')\n .description('Set up (or rotate) Daytona credentials for cloud boxes')\n .option('--status', 'show what is currently configured (masked) and exit')\n .action(async (opts: LoginOpts) => {\n try {\n if (opts.status) {\n printStatus();\n return;\n }\n if (!process.stdin.isTTY) {\n process.stderr.write(\n 'daytona login needs an interactive terminal — set DAYTONA_API_KEY in the environment for non-interactive use.\\n',\n );\n process.exitCode = 1;\n return;\n }\n await ensureDaytonaCredentials({ force: true });\n } catch (err) {\n reportError(err);\n }\n });\n\nfunction printStatus(): void {\n const s = readDaytonaCredStatus();\n if (s.source === 'none') {\n process.stdout.write(\n 'daytona: not configured\\n' +\n ' run `agentbox daytona login` to set up credentials\\n',\n );\n return;\n }\n const lines = ['daytona: configured', ` source: ${s.source}`];\n if (s.source === 'secrets.env') lines.push(` file: ${secretsPath()}`);\n if (s.apiKey) lines.push(` apiKey: ${maskKey(s.apiKey)}`);\n if (s.jwtToken) lines.push(` jwt: ${maskKey(s.jwtToken)}`);\n if (s.organizationId) lines.push(` orgId: ${s.organizationId}`);\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\ninterface ResyncOpts {\n agent?: string;\n}\n\nconst KNOWN_AGENTS: readonly CloudAgentKind[] = ['claude', 'codex', 'opencode'];\n\n/**\n * Parse `--agent` into the list of agents to refresh. Defaults to all three;\n * accepts a single name or 'all'. Throws on unknown agent name so a typo\n * surfaces immediately instead of silently resyncing nothing.\n */\nfunction resolveAgentSelection(raw: string | undefined): CloudAgentKind[] {\n if (!raw || raw === 'all') return [...KNOWN_AGENTS];\n if (!(KNOWN_AGENTS as readonly string[]).includes(raw)) {\n throw new Error(\n `unknown agent '${raw}'. Expected one of: ${KNOWN_AGENTS.join(', ')}, all.`,\n );\n }\n return [raw as CloudAgentKind];\n}\n\nconst resyncSub = new Command('resync')\n .description(\n 'Re-upload host agent credentials (~/.claude, ~/.codex, opencode) into the shared Daytona volumes.',\n )\n .option(\n '-a, --agent <name>',\n 'which agent to refresh: claude | codex | opencode | all',\n 'all',\n )\n .action(async (opts: ResyncOpts) => {\n try {\n const agents = resolveAgentSelection(opts.agent);\n const specs = agentSpecsForCloud().filter((s) => agents.includes(s.kind));\n\n // Spin up a single throwaway sandbox with all selected volumes mounted.\n // One sandbox amortizes the snapshot/start cost across multiple agents;\n // seedAgentVolumesIfFresh with force:true overwrites each one in turn.\n // Image: the same default `agentbox/box:dev` used for normal cloud\n // boxes. Daytona's snapshot cache should hit if the user has provisioned\n // a real box recently. Resources are minimal — we only need tar + chown.\n const sb = spinner();\n sb.start(`provisioning throwaway sandbox to refresh: ${agents.join(', ')}`);\n\n const ensured = await ensureAgentVolumesForCloud(daytonaBackend, {\n onLog: (line) => log.info(line),\n });\n if (ensured.agents.length === 0) {\n sb.stop('no agent volumes available — the daytona backend has no volume primitive');\n return;\n }\n // Restrict to only what the user asked for.\n const mounts = ensured.mounts.filter((m) =>\n specs.some((s) => s.credentialsMountPath === m.mountPath),\n );\n\n const handle = await daytonaBackend.provision({\n name: `agentbox-resync-${Date.now().toString(36)}`,\n image: 'agentbox/box:dev',\n resources: { cpu: 1, memory: 1, disk: 4 },\n env: {},\n volumes: mounts,\n onLog: (line) => sb.message(line.slice(0, 80)),\n });\n sb.stop(`throwaway sandbox ${handle.sandboxId} provisioned`);\n\n try {\n const sb2 = spinner();\n sb2.start('re-seeding host credentials into volumes (force)');\n await seedAgentVolumesIfFresh(daytonaBackend, handle, {\n agents,\n force: true,\n onLog: (line) => sb2.message(line.slice(0, 80)),\n });\n sb2.stop('credentials refreshed');\n } finally {\n const sb3 = spinner();\n sb3.start('destroying throwaway sandbox');\n try {\n await daytonaBackend.destroy(handle);\n } catch (err) {\n sb3.stop(\n `destroy failed (sandbox may linger): ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n sb3.stop('throwaway sandbox destroyed');\n }\n\n log.success(\n `Daytona agent volumes refreshed: ${agents.join(', ')}. ` +\n `Next \\`agentbox create --provider daytona\\` will use the updated credentials.`,\n );\n } catch (err) {\n reportError(err);\n }\n });\n\n// NB: the old `agentbox daytona publish-snapshot` subcommand has been removed.\n// Daytona deprecated the `_experimental_createSnapshot` API it relied on\n// (`POST /api/sandbox/<id>/snapshot` now 404s). The replacement is\n// `agentbox prepare --provider daytona`, which uses the documented\n// `daytona.snapshot.create({ name, image })` API with a layered `Image`\n// (Dockerfile.box + addLocalFile + runCommands) — no sandbox involved.\n\nexport const daytonaCommand = new Command('daytona')\n .description(\n 'Daytona cloud provider — credentials, plus sugar for `--provider daytona` (e.g. `agentbox daytona create|claude|codex|opencode`)',\n )\n .addCommand(loginSub, { isDefault: true })\n .addCommand(resyncSub);\n","import { Command } from 'commander';\n\n// Help-discoverable entry point for the `agentbox docker <subcmd>` sugar.\n// The actual rewrite happens before commander parses (see\n// provider/argv-prefix.ts), so this command has no action handler — it only\n// shows up when the user types `agentbox docker` (or `agentbox docker --help`)\n// without one of the sugared subcommands.\nexport const dockerCommand = new Command('docker')\n .description(\n 'Local Docker provider — sugar for `--provider docker` (e.g. `agentbox docker create|claude|codex|opencode`)',\n )\n .action(() => {\n dockerCommand.help();\n });\n","/**\n * `agentbox hetzner` CLI surface — registered as a top-level subcommand by\n * `apps/cli/src/index.ts` (same pattern as `daytonaCommand`).\n *\n * Subcommands:\n * - `login` — interactive `HCLOUD_TOKEN` setup + persist.\n * - `login --status` — show the currently-configured token (masked).\n * - `firewall sync <box>` — re-detect egress IP, update the box's\n * firewall rules (no VPS restart).\n * - `firewall show <box>` — diagnostic: print the box's firewall.\n *\n * The firewall subcommands rely on `BoxRecord.cloud.hetzner.firewallId` /\n * `BoxRecord.cloud.hetzner.firewallSource` being populated by the create\n * flow — that wiring lands in Phase 4. Until then these subcommands throw\n * a clear error pointing at the backlog. The `login` subcommand is fully\n * functional now.\n */\n\nimport { log } from '@clack/prompts';\nimport { findProjectRoot } from '@agentbox/config';\nimport { readState, resolveBoxRef } from '@agentbox/sandbox-core';\nimport { Command } from 'commander';\nimport { makeHetznerClient } from './client.js';\nimport {\n ensureHetznerCredentials,\n maskKey,\n readHetznerCredStatus,\n secretsPath,\n} from './credentials.js';\nimport { detectEgressIp } from './egress-ip.js';\nimport { normalizeSourceCidr, syncFirewallSource } from './firewall.js';\n\ninterface LoginOpts {\n status?: boolean;\n}\n\nfunction reportError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n log.error(message);\n process.exitCode = 1;\n}\n\nconst loginSub = new Command('login')\n .description('Set up (or rotate) Hetzner Cloud credentials for VPS boxes')\n .option('--status', 'show what is currently configured (masked) and exit')\n .action(async (opts: LoginOpts) => {\n try {\n if (opts.status) {\n printStatus();\n return;\n }\n if (!process.stdin.isTTY) {\n process.stderr.write(\n 'hetzner login needs an interactive terminal — set HCLOUD_TOKEN in the environment for non-interactive use.\\n',\n );\n process.exitCode = 1;\n return;\n }\n await ensureHetznerCredentials({ force: true });\n } catch (err) {\n reportError(err);\n }\n });\n\nfunction printStatus(): void {\n const s = readHetznerCredStatus();\n if (s.source === 'none') {\n process.stdout.write(\n 'hetzner: not configured\\n' +\n ' run `agentbox hetzner login` to set up credentials\\n',\n );\n return;\n }\n const lines = ['hetzner: configured', ` source: ${s.source}`];\n if (s.source === 'secrets.env') lines.push(` file: ${secretsPath()}`);\n if (s.token) lines.push(` token: ${maskKey(s.token)}`);\n if (s.endpoint) lines.push(` api: ${s.endpoint}`);\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\ninterface FirewallSyncOpts {\n source?: string;\n}\n\nconst firewallSyncSub = new Command('sync')\n .description('Re-detect the host egress IP and update the box firewall (no reboot)')\n .argument('<box>', 'box name or id')\n .option(\n '--source <cidr>',\n 'override the auto-detected egress IP (e.g. 1.2.3.4/32, or 0.0.0.0/0 for open opt-in)',\n )\n .action(async (boxRef: string, opts: FirewallSyncOpts) => {\n try {\n const { box, server } = await resolveHetznerBox(boxRef);\n const firewallId = parseFirewallIdFromServer(server.labels);\n if (firewallId === undefined) {\n throw new Error(\n `box '${boxRef}' has no recorded firewall id (label agentbox.firewall is missing on the Hetzner server). ` +\n `This is unusual — the box may have been provisioned outside agentbox.`,\n );\n }\n const source = opts.source\n ? normalizeSourceCidr(opts.source)\n : `${await detectEgressIp({ onLog: (l) => process.stdout.write(`hetzner: ${l}\\n`) })}/32`;\n const client = makeHetznerClient();\n process.stdout.write(`hetzner: updating firewall ${String(firewallId)} for box '${box.name}' → source ${source}\\n`);\n await syncFirewallSource(client, firewallId, source);\n process.stdout.write(`hetzner: firewall ${String(firewallId)} now allows SSH from ${source} only\\n`);\n } catch (err) {\n reportError(err);\n }\n });\n\nconst firewallShowSub = new Command('show')\n .description('Print the Hetzner firewall rules currently attached to a box')\n .argument('<box>', 'box name or id')\n .action(async (boxRef: string) => {\n try {\n const { box, server } = await resolveHetznerBox(boxRef);\n const firewallId = parseFirewallIdFromServer(server.labels);\n if (firewallId === undefined) {\n throw new Error(`box '${boxRef}' has no recorded firewall id (label agentbox.firewall missing)`);\n }\n const client = makeHetznerClient();\n const firewall = await client.getFirewall(firewallId);\n if (!firewall) {\n process.stdout.write(`hetzner: firewall ${String(firewallId)} for box '${box.name}' is gone on Hetzner\\n`);\n return;\n }\n const lines: string[] = [\n `box: ${box.name} (sandbox ${box.cloud?.sandboxId ?? '—'})`,\n `vpsIp: ${server.public_net.ipv4?.ip ?? '—'}`,\n `firewall: ${firewall.name} (id ${String(firewall.id)})`,\n 'rules:',\n ];\n for (const rule of firewall.rules) {\n const sources = rule.source_ips?.join(', ') ?? '—';\n const dests = rule.destination_ips?.join(', ') ?? '';\n lines.push(\n ` ${rule.direction} ${rule.protocol}${rule.port ? `:${rule.port}` : ''} from=${sources}${dests ? ` to=${dests}` : ''}`,\n );\n }\n // Show the host's current egress IP for comparison — common diagnostic\n // when the user's laptop moved networks and ssh started timing out.\n try {\n const currentEgress = await detectEgressIp({});\n lines.push(`host egress IP (now): ${currentEgress}/32`);\n const wantCidr = `${currentEgress}/32`;\n const allowed = firewall.rules.find(\n (r) => r.direction === 'in' && r.port === '22' && r.source_ips?.includes(wantCidr),\n );\n if (!allowed) {\n lines.push(\n ` WARN: current egress IP does not match the firewall — run \\`agentbox hetzner firewall sync ${box.name}\\` to update`,\n );\n }\n } catch (egressErr) {\n lines.push(`host egress IP: <detection failed: ${egressErr instanceof Error ? egressErr.message : String(egressErr)}>`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n } catch (err) {\n reportError(err);\n }\n });\n\n/**\n * Resolve a CLI box ref into the BoxRecord + the live Hetzner server.\n * Errors out cleanly if the box isn't a hetzner box or if it's already\n * destroyed on the Hetzner side.\n */\nasync function resolveHetznerBox(boxRef: string): Promise<{\n box: import('@agentbox/core').BoxRecord;\n server: import('./client.js').HetznerServer;\n}> {\n const cwd = process.cwd();\n const project = await findProjectRoot(cwd);\n const state = await readState();\n const res = resolveBoxRef(boxRef, state, project.root);\n if (res.kind !== 'ok') {\n throw new Error(`no box matched '${boxRef}'`);\n }\n const box = res.box;\n if (box.provider !== 'hetzner') {\n throw new Error(`box '${box.name}' has provider '${box.provider ?? 'docker'}', not 'hetzner'`);\n }\n const sandboxId = box.cloud?.sandboxId;\n if (!sandboxId) {\n throw new Error(`box '${box.name}' has no recorded sandboxId`);\n }\n const id = Number.parseInt(sandboxId, 10);\n if (!Number.isFinite(id)) {\n throw new Error(`box '${box.name}' has non-numeric hetzner sandboxId '${sandboxId}'`);\n }\n const server = await makeHetznerClient().getServer(id);\n if (!server) {\n throw new Error(`hetzner server ${String(id)} for box '${box.name}' is gone (already destroyed?)`);\n }\n return { box, server };\n}\n\nfunction parseFirewallIdFromServer(labels: Record<string, string>): number | undefined {\n const raw = labels['agentbox.firewall'];\n if (!raw) return undefined;\n const id = Number.parseInt(raw, 10);\n return Number.isFinite(id) ? id : undefined;\n}\n\nconst firewallSub = new Command('firewall')\n .description('Manage the Hetzner Cloud Firewall attached to each box')\n .addCommand(firewallSyncSub)\n .addCommand(firewallShowSub);\n\nexport const hetznerCommand = new Command('hetzner')\n .description(\n 'Hetzner Cloud VPS provider — credentials, firewall, plus sugar for `--provider hetzner` (e.g. `agentbox hetzner create|claude|codex|opencode`)',\n )\n .addCommand(loginSub, { isDefault: true })\n .addCommand(firewallSub);\n","/**\n * `agentbox vercel` CLI surface — registered as a top-level subcommand by\n * `apps/cli/src/index.ts` (same pattern as `daytonaCommand` / `hetznerCommand`).\n *\n * Subcommands:\n * - `login` — interactive credential setup (OIDC or token trio).\n * - `login --status` — show what is currently configured (masked).\n *\n * Also provides the `agentbox vercel create|claude|codex|opencode` sugar via\n * the argv-prefix rewriter in apps/cli.\n */\n\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n ensureVercelCredentials,\n maskKey,\n readVercelCredStatus,\n secretsPath,\n} from './credentials.js';\nimport { detectSbx, installSbxHint } from './sbx-cli.js';\n\ninterface LoginOpts {\n status?: boolean;\n}\n\nfunction reportError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n log.error(message);\n process.exitCode = 1;\n}\n\nfunction relativeExpiry(expiresAt: number): string {\n const deltaMs = expiresAt * 1000 - Date.now();\n if (deltaMs <= 0) return 'expired';\n const mins = Math.round(deltaMs / 60_000);\n if (mins < 60) return `expires in ${mins}m`;\n return `expires in ${Math.round(mins / 60)}h`;\n}\n\nasync function printStatus(): Promise<void> {\n const s = readVercelCredStatus();\n if (s.auth === 'none') {\n process.stdout.write(\n 'vercel: not configured\\n' + ' run `agentbox vercel login` to set up credentials\\n',\n );\n return;\n }\n\n const lines = ['vercel: configured'];\n\n if (s.auth === 'cli') {\n const det = await detectSbx();\n lines.push(' auth: Vercel CLI (sandbox) login');\n lines.push(` cli: ${det.installed ? `installed${det.version ? ` ${det.version}` : ''}` : `not installed — run \\`${installSbxHint()}\\``}`);\n if (s.cli) {\n if (!s.cli.loggedIn) {\n lines.push(' session: logged out — run `agentbox vercel login`');\n } else {\n let tokenLine = ` token: ${s.token ? maskKey(s.token) : '(live, from CLI store)'}`;\n if (s.cli.expiresAt) tokenLine += ` (${relativeExpiry(s.cli.expiresAt)})`;\n else tokenLine += ' (no expiry recorded — will refresh on use)';\n lines.push(tokenLine);\n }\n lines.push(` store: ${s.cli.authPath}`);\n }\n } else if (s.auth === 'oidc') {\n lines.push(' auth: OIDC token (VERCEL_OIDC_TOKEN)');\n } else {\n lines.push(' auth: access token');\n if (s.token) lines.push(` token: ${maskKey(s.token)}`);\n }\n\n lines.push(` source: ${s.source}`);\n if (s.teamId) lines.push(` team: ${s.teamId}`);\n if (s.projectId) lines.push(` project: ${s.projectId}`);\n if (s.source === 'secrets.env' || s.source === 'cli-store') {\n lines.push(` file: ${secretsPath()}`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nconst loginSub = new Command('login')\n .description('Set up (or rotate) Vercel credentials for sandbox boxes')\n .option('--status', 'show what is currently configured (masked) and exit')\n .action(async (opts: LoginOpts) => {\n try {\n if (opts.status) {\n await printStatus();\n return;\n }\n if (!process.stdin.isTTY) {\n process.stderr.write(\n 'vercel login needs an interactive terminal — set the VERCEL_TOKEN trio ' +\n '(or VERCEL_OIDC_TOKEN) in the environment or in ~/.agentbox/secrets.env for non-interactive use.\\n',\n );\n process.exitCode = 1;\n return;\n }\n await ensureVercelCredentials({ force: true });\n } catch (err) {\n reportError(err);\n }\n });\n\nexport const vercelCommand = new Command('vercel')\n .description(\n 'Vercel Sandbox provider — credentials, plus sugar for `--provider vercel` ' +\n '(e.g. `agentbox vercel create|claude|codex|opencode`)',\n )\n .addCommand(loginSub, { isDefault: true });\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 { providerForBox } from '../provider/registry.js';\nimport { agentboxAliasFor, removeAgentboxSshAlias } from '../ssh-config.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 container writable layer (where /workspace lived)')\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('Will also wipe the box volume and agent work-in-progress');\n const rootBranch = box.gitWorktrees?.find((w) => w.kind === 'root')?.branch;\n const lines = [box.name];\n if (rootBranch) lines.push(`branch: ${rootBranch}`);\n lines.push(`project: ${box.workspacePath}`);\n if (box.snapshotDir) {\n lines.push(`snapshot: ${box.snapshotDir}${opts.keepSnapshot ? ' (will be kept)' : ''}`);\n }\n log.info(lines.join('\\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 // Docker boxes still use the rich `destroyBox` path so the user sees\n // container/volume/snapshot accounting. Cloud boxes go through the\n // provider's `destroy`, which deletes the remote sandbox and removes\n // the local record but has no Docker-shaped output to enumerate.\n const providerName = box.provider ?? 'docker';\n if (providerName === 'docker') {\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 } else {\n const provider = await providerForBox(box);\n await provider.destroy(box);\n // Best-effort: remove the `~/.ssh/config` block `agentbox code` may\n // have written for this cloud box. A missing block isn't an error\n // and a file failure shouldn't block destroy.\n try {\n await removeAgentboxSshAlias(agentboxAliasFor(box.name));\n } catch {\n /* best-effort */\n }\n process.stdout.write(\n `destroyed ${box.name} (${providerName} sandbox ${box.cloud?.sandboxId ?? '<unknown>'})\\n`,\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\nimport { downloadClaudeCommand } from './download-claude.js';\nimport { downloadCodexCommand } from './download-codex.js';\nimport { downloadOpencodeCommand } from './download-opencode.js';\nimport { downloadConfigCommand } from './download-config.js';\nimport { downloadEnvCommand } from './download-env.js';\n\ninterface DownloadOpts {\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 downloadCommand = new Command('download')\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(\"Download 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 download 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: DownloadOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n if (isCloud) {\n // Cloud download (workspace): we don't have rsync over docker exec, so\n // gitignore-aware change-detection isn't wired. Fall back to a bulk\n // tar of `/workspace` via provider.downloadPath — overwrites the host\n // workspace dir. The user already gets git-aware sync-back via\n // `agentbox-ctl git push` inside the box for tracked files; this is\n // for grabbing untracked or env artifacts.\n if (opts.dryRun) {\n throw new Error('cloud download does not yet support --dry-run; omit to bulk-pull /workspace.');\n }\n if (!opts.respectGitignore || opts.includeNodeModules || opts.withEnv || opts.pattern.length > 0) {\n log.warn(\n 'cloud download ignores gitignore/--with-env/--pattern filters in v1 — pulling the whole /workspace tree (Phase 6 polish).',\n );\n }\n if (!opts.yes) {\n const ok = await confirm({\n message: `Overwrite ${box.workspacePath} with the cloud box's /workspace contents?`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n const provider = await providerForBox(box);\n if (!provider.downloadDirContents) {\n throw new Error(`provider '${provider.name}' does not support bulk workspace download`);\n }\n // Pull the *contents* of /workspace into box.workspacePath — files\n // land directly, not under a `workspace/` subdir.\n const result = await provider.downloadDirContents(\n box,\n '/workspace',\n box.workspacePath,\n );\n process.stdout.write(`downloaded /workspace contents to ${result.finalPath}\\n`);\n return;\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');\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 download 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: `Download ${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 download env [box]` — commander dispatches the `env` subcommand;\n// `agentbox download [box]` / `agentbox download` still hit the default action above.\ndownloadCommand.addCommand(downloadEnvCommand);\n\n// `agentbox download 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).\ndownloadCommand.addCommand(downloadClaudeCommand);\n\n// `agentbox download codex [box]` — box -> host pull of Codex config/auth\n// (additive; reads the codex-config volume so the box need not be running).\ndownloadCommand.addCommand(downloadCodexCommand);\n\n// `agentbox download opencode [box]` — box -> host pull of OpenCode config/auth\n// (additive; reads the opencode-config volume so the box need not be running).\ndownloadCommand.addCommand(downloadOpencodeCommand);\n\n// `agentbox download config [box]` — box -> host pull of just agentbox.yaml\n// (gitignore-bypassing; for syncing back an in-box-edited/regenerated config).\ndownloadCommand.addCommand(downloadConfigCommand);\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 DownloadClaudeOpts {\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 downloadClaudeCommand = new Command('claude')\n .description(\n 'Download 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: DownloadClaudeOpts) => {\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 `download` / `download 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 download 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 downloaded into ~/.claude\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Download ${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 `downloaded ${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 {\n DEFAULT_BOX_IMAGE,\n pullCodexConfig,\n resolveCodexVolume,\n SHARED_CODEX_VOLUME,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DownloadCodexOpts {\n yes?: boolean;\n dryRun?: boolean;\n}\n\nexport const downloadCodexCommand = new Command('codex')\n .description(\n 'Download box-side Codex config/auth (config.toml, auth.json, prompts) back to host ~/.codex (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: DownloadCodexOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // We read the codex-config *volume*, not the container, so the box can\n // be stopped — no unpause/start dance.\n const volume =\n box.codexConfigVolume ?? resolveCodexVolume({ isolate: false, boxId: box.id }).volume;\n if (volume === SHARED_CODEX_VOLUME) {\n log.warn(\n `Reading the shared ${SHARED_CODEX_VOLUME} volume — it aggregates Codex config from ANY box, not just ${box.name}.`,\n );\n }\n const image = box.image || DEFAULT_BOX_IMAGE;\n\n const preview = await pullCodexConfig({ volume }, { image, dryRun: true });\n\n if (preview.newItems.length === 0) {\n process.stdout.write('no new Codex config to download into ~/.codex\\n');\n return;\n }\n\n for (const item of preview.newItems) process.stdout.write(` ${item} (new)\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.newItems.length} item(s) would be downloaded into ~/.codex\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Download ${preview.newItems.length} Codex item(s) into ~/.codex? (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 pullCodexConfig({ volume }, { image, dryRun: false });\n process.stdout.write(`downloaded ${result.newItems.length} item(s) into ~/.codex\\n`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport {\n DEFAULT_BOX_IMAGE,\n pullOpencodeConfig,\n resolveOpencodeVolume,\n SHARED_OPENCODE_VOLUME,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface DownloadOpencodeOpts {\n yes?: boolean;\n dryRun?: boolean;\n}\n\nexport const downloadOpencodeCommand = new Command('opencode')\n .description(\n 'Download box-side OpenCode config/auth (auth.json, opencode.json, agents, commands, themes) back to host ~/.config + ~/.local/share opencode (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: DownloadOpencodeOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n\n // We read the opencode-config *volume*, not the container, so the box can\n // be stopped — no unpause/start dance.\n const volume =\n box.opencodeConfigVolume ?? resolveOpencodeVolume({ isolate: false, boxId: box.id }).volume;\n if (volume === SHARED_OPENCODE_VOLUME) {\n log.warn(\n `Reading the shared ${SHARED_OPENCODE_VOLUME} volume — it aggregates OpenCode config from ANY box, not just ${box.name}.`,\n );\n }\n const image = box.image || DEFAULT_BOX_IMAGE;\n\n const preview = await pullOpencodeConfig({ volume }, { image, dryRun: true });\n\n if (preview.newItems.length === 0) {\n process.stdout.write('no new OpenCode config to download\\n');\n return;\n }\n\n for (const item of preview.newItems) process.stdout.write(` ${item} (new)\\n`);\n\n if (opts.dryRun) {\n process.stdout.write(\n `\\n[dry-run] ${preview.newItems.length} item(s) would be downloaded\\n`,\n );\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: `Download ${preview.newItems.length} OpenCode item(s) into ~/.config + ~/.local/share opencode? (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 pullOpencodeConfig({ volume }, { image, dryRun: false });\n process.stdout.write(`downloaded ${result.newItems.length} item(s)\\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 DownloadConfigOpts {\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 download 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 downloadConfigCommand = new Command('config')\n .description('Download 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: DownloadConfigOpts) => {\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');\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 download 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: `Download ${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 `downloaded ${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 DownloadEnvOpts {\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 downloadEnvCommand = new Command('env')\n .description(\n 'Download 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: DownloadEnvOpts) => {\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');\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 download 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: `Download ${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 `downloaded ${result.changes.length} env/config file(s) into ${result.hostPath}\\n`,\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { parseKeysList } from '../lib/drive/keys.js';\nimport { resolveDriveSession, SessionNotFoundError } from '../lib/drive/session.js';\nimport {\n captureSession,\n paneInfo,\n resizeWindow,\n sendKey,\n sendLiteral,\n type CaptureOptions,\n} from '../lib/drive/tmux.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n// Default settle delay before `drive prompt` sends its trailing Enter. Some\n// agent TUIs debounce stdin for a few frames after first input lands; without\n// the gap the Enter fires before the text is composed and gets swallowed.\nconst PROMPT_ENTER_DELAY_MS = 200;\n\nconst POLL_INTERVAL_MS = 250;\n\nexport const driveCommand = new Command('drive')\n .description(\n 'Drive a running tmux session inside a box: snapshot the screen, send keystrokes, type text, or wait for output. Targets the agent session by default (claude → codex → opencode).',\n );\n\nconst sessionOption = ['--session <name>', 'tmux session to target (default: first running agent session)'] as const;\n\ninterface SnapshotOpts {\n session?: string;\n ansi?: boolean;\n withCursor?: boolean;\n rows?: string;\n json?: boolean;\n}\n\nconst driveSnapshotCommand = new Command('snapshot')\n .description('Print the rendered terminal contents of the box\\'s active tmux session.')\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(sessionOption[0], sessionOption[1])\n .option('--ansi', 'preserve ANSI color/style escape sequences (default: plain text)')\n .option('--with-cursor', 'include cursor coordinates and pane size (implies --json)')\n .option('--rows <range>', 'inclusive row range \"FROM:TO\" (negative numbers walk into scrollback)')\n .option('--json', 'emit a JSON envelope { session, cols, rows, cursor?, screen }')\n .action(async (boxRef: string | undefined, opts: SnapshotOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n\n const captureOpts: CaptureOptions = {};\n if (opts.ansi) captureOpts.ansi = true;\n if (opts.rows !== undefined) captureOpts.rows = parseRowRange(opts.rows);\n\n const screen = await captureSession(provider, box, session.name, captureOpts);\n\n const wantJson = opts.json === true || opts.withCursor === true;\n if (!wantJson) {\n process.stdout.write(screen + '\\n');\n return;\n }\n const envelope: {\n session: string;\n screen: string;\n cols?: number;\n rows?: number;\n cursor?: { x: number; y: number };\n } = { session: session.name, screen };\n if (opts.withCursor) {\n const info = await paneInfo(provider, box, session.name);\n envelope.cols = info.cols;\n envelope.rows = info.rows;\n envelope.cursor = info.cursor;\n }\n process.stdout.write(JSON.stringify(envelope) + '\\n');\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ninterface SessionOpts {\n session?: string;\n}\n\nconst driveKeypressCommand = new Command('keypress')\n .description('Send keystrokes parsed via the DSL (e.g. \"<C-a>q\", \"ls<Enter>\"). Each arg is concatenated with no spaces.')\n .argument(\n '<box>',\n 'box ref: project index, id, id prefix, name, or container',\n )\n .argument('<keys...>', 'one or more DSL tokens / literal text; `<<` escapes a literal `<`')\n .option(sessionOption[0], sessionOption[1])\n .action(async (boxRef: string, keys: string[], opts: SessionOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const literal = parseKeysList(keys);\n await sendLiteral(provider, box, session.name, literal);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\nconst driveSendTextCommand = new Command('send-text')\n .description('Type literal text into the session (no DSL parsing, no trailing Enter).')\n .argument('<box>', 'box ref')\n .argument('<text>', 'literal text to type')\n .option(sessionOption[0], sessionOption[1])\n .action(async (boxRef: string, text: string, opts: SessionOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n await sendLiteral(provider, box, session.name, text);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ninterface PromptOpts extends SessionOpts {\n delay?: string;\n}\n\nconst drivePromptCommand = new Command('prompt')\n .description('Type text into the agent session and press Enter — convenience for \"send a message to the running agent\".')\n .argument('<box>', 'box ref')\n .argument('<text>', 'prompt text to send (literal; no DSL parsing)')\n .option(sessionOption[0], sessionOption[1])\n .option('--delay <ms>', `milliseconds to wait between text and Enter (default: ${String(PROMPT_ENTER_DELAY_MS)})`)\n .action(async (boxRef: string, text: string, opts: PromptOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const delay = opts.delay !== undefined ? parsePositiveInt(opts.delay, '--delay') : PROMPT_ENTER_DELAY_MS;\n await sendLiteral(provider, box, session.name, text);\n if (delay > 0) await sleep(delay);\n await sendKey(provider, box, session.name, 'Enter');\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ninterface WaitOpts extends SessionOpts {\n text: string;\n timeout?: string;\n json?: boolean;\n}\n\nconst driveWaitCommand = new Command('wait')\n .description('Block until --text appears in the session\\'s rendered screen, or exit non-zero on timeout.')\n .argument('<box>', 'box ref')\n .requiredOption('--text <str>', 'substring to wait for')\n .option('--timeout <ms>', 'wall-clock cap in milliseconds (default: 5000)')\n .option(sessionOption[0], sessionOption[1])\n .option('--json', 'emit a JSON envelope { matched, elapsedMs, session, screen? }')\n .action(async (boxRef: string, opts: WaitOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const timeoutMs = opts.timeout !== undefined ? parsePositiveInt(opts.timeout, '--timeout') : 5000;\n const start = Date.now();\n const deadline = start + timeoutMs;\n let lastScreen = '';\n while (Date.now() < deadline) {\n lastScreen = await captureSession(provider, box, session.name);\n if (lastScreen.includes(opts.text)) {\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({ matched: true, elapsedMs, session: session.name }) + '\\n',\n );\n }\n return;\n }\n await sleep(POLL_INTERVAL_MS);\n }\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(\n JSON.stringify({\n matched: false,\n elapsedMs,\n session: session.name,\n screen: lastScreen,\n }) + '\\n',\n );\n } else {\n log.error(`text not found within ${String(timeoutMs)}ms: ${opts.text}`);\n }\n process.exit(1);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\nconst driveResizeCommand = new Command('resize')\n .description('Resize the tmux window to <cols> x <rows>.')\n .argument('<box>', 'box ref')\n .argument('<cols>', 'columns (positive int)')\n .argument('<rows>', 'rows (positive int)')\n .option(sessionOption[0], sessionOption[1])\n .action(async (boxRef: string, colsStr: string, rowsStr: string, opts: SessionOpts) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const provider = await providerForBox(box);\n const session = await resolveDriveSession(provider, box, opts.session);\n const cols = parsePositiveInt(colsStr, '<cols>');\n const rows = parsePositiveInt(rowsStr, '<rows>');\n await resizeWindow(provider, box, session.name, cols, rows);\n } catch (err) {\n handleDriveError(err);\n }\n });\n\ndriveCommand.addCommand(driveSnapshotCommand);\ndriveCommand.addCommand(driveKeypressCommand);\ndriveCommand.addCommand(driveSendTextCommand);\ndriveCommand.addCommand(drivePromptCommand);\ndriveCommand.addCommand(driveWaitCommand);\ndriveCommand.addCommand(driveResizeCommand);\n\nfunction handleDriveError(err: unknown): never {\n if (err instanceof SessionNotFoundError) {\n log.error(err.message);\n log.info(\"start an agent first (e.g. `agentbox claude <box>`) or pass --session.\");\n process.exit(2);\n }\n handleLifecycleError(err);\n}\n\nfunction parseRowRange(raw: string): { from: number; to: number } {\n const m = /^(-?\\d+):(-?\\d+)$/.exec(raw);\n if (!m || !m[1] || !m[2]) {\n throw new Error(`--rows expects FROM:TO (got: ${raw})`);\n }\n return { from: Number(m[1]), to: Number(m[2]) };\n}\n\nfunction parsePositiveInt(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || String(n) !== raw.trim()) {\n throw new Error(`${label} must be a positive integer (got: ${raw})`);\n }\n return n;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","// Translate a small keystroke DSL into the bytes a terminal expects.\n// Literal text passes through as-is; `<...>` tokens map to control bytes\n// or xterm escape sequences. Tokens are case-insensitive.\n//\n// <Enter> <Tab> <Esc> <Space> <BS> <Del>\n// <C-x> Ctrl+x for any letter a-z (0x01..0x1a)\n// <Up|Down|Left|Right>\n// <Home|End|PageUp|PageDown>\n// <F1>..<F12>\n//\n// Use `<` literally by escaping as `<<`.\n\nconst NAMED: Record<string, string> = {\n enter: '\\r',\n return: '\\r',\n tab: '\\t',\n esc: '\\x1b',\n escape: '\\x1b',\n space: ' ',\n bs: '\\x7f',\n backspace: '\\x7f',\n del: '\\x1b[3~',\n delete: '\\x1b[3~',\n up: '\\x1b[A',\n down: '\\x1b[B',\n right: '\\x1b[C',\n left: '\\x1b[D',\n home: '\\x1b[H',\n end: '\\x1b[F',\n pageup: '\\x1b[5~',\n pagedown: '\\x1b[6~',\n f1: '\\x1bOP',\n f2: '\\x1bOQ',\n f3: '\\x1bOR',\n f4: '\\x1bOS',\n f5: '\\x1b[15~',\n f6: '\\x1b[17~',\n f7: '\\x1b[18~',\n f8: '\\x1b[19~',\n f9: '\\x1b[20~',\n f10: '\\x1b[21~',\n f11: '\\x1b[23~',\n f12: '\\x1b[24~',\n};\n\nexport function parseKeys(input: string): string {\n let out = '';\n let i = 0;\n while (i < input.length) {\n const ch = input[i];\n if (ch === '<') {\n if (input[i + 1] === '<') {\n out += '<';\n i += 2;\n continue;\n }\n const close = input.indexOf('>', i + 1);\n if (close === -1) {\n out += ch;\n i += 1;\n continue;\n }\n const tok = input.slice(i + 1, close);\n out += resolveToken(tok);\n i = close + 1;\n continue;\n }\n out += ch;\n i += 1;\n }\n return out;\n}\n\n// Concatenate-and-parse: lets callers pass multiple shell args without\n// the shell sneaking in spaces between them. `[\"ls\", \"<Enter>\"] -> \"ls\\r\"`.\nexport function parseKeysList(input: string[]): string {\n return parseKeys(input.join(''));\n}\n\nfunction resolveToken(raw: string): string {\n const tok = raw.trim().toLowerCase();\n if (NAMED[tok] !== undefined) return NAMED[tok];\n const ctl = /^c-([a-z])$/.exec(tok);\n if (ctl && ctl[1]) {\n const code = ctl[1].charCodeAt(0) - 'a'.charCodeAt(0) + 1;\n return String.fromCharCode(code);\n }\n return `<${raw}>`;\n}\n","// Thin wrappers around `Provider.exec` that build the in-box tmux argv for the\n// `agentbox drive` commands. One place to maintain the tmux invocations so the\n// subcommands stay declarative. Everything runs as the `vscode` user inside the\n// box — that's the user that owns the tmux server socket under /tmp/tmux-1000/.\n\nimport type { BoxRecord, Provider } from '@agentbox/core';\n\nconst TMUX_USER = 'vscode';\n\nexport interface CaptureOptions {\n /** Re-encode escape sequences in the output (`-e`). */\n ansi?: boolean;\n /** Inclusive line range; passed to tmux as `-S <from> -E <to>` (rows count from 0 at the top of the visible pane; negative numbers walk into the scrollback). */\n rows?: { from: number; to: number };\n}\n\nexport interface CursorInfo {\n x: number;\n y: number;\n}\n\nexport interface PaneInfo {\n cols: number;\n rows: number;\n cursor: CursorInfo;\n}\n\n/**\n * `tmux capture-pane -p` on the named session/window. Plain by default; with\n * `--ansi` (`-pe`) tmux re-encodes color/style escape sequences so a caller\n * can pipe back through a renderer if needed.\n */\nexport async function captureSession(\n provider: Provider,\n box: BoxRecord,\n session: string,\n opts: CaptureOptions = {},\n): Promise<string> {\n const argv = ['tmux', 'capture-pane', opts.ansi ? '-pe' : '-p', '-t', session];\n if (opts.rows) {\n argv.push('-S', String(opts.rows.from), '-E', String(opts.rows.to));\n }\n const res = await provider.exec(box, argv, { user: TMUX_USER });\n if (res.exitCode !== 0) {\n throw new Error(failure('capture-pane', session, res.stderr || res.stdout));\n }\n // tmux always appends a trailing newline — strip it so callers can `String.includes`\n // without snagging on a phantom empty last line.\n return res.stdout.replace(/\\n$/, '');\n}\n\n/**\n * Read cols, rows, and cursor position from `tmux display-message -p`. Used by\n * `drive snapshot --with-cursor` to emit a structured JSON envelope.\n */\nexport async function paneInfo(\n provider: Provider,\n box: BoxRecord,\n session: string,\n): Promise<PaneInfo> {\n const fmt = '#{pane_width},#{pane_height},#{cursor_x},#{cursor_y}';\n const res = await provider.exec(box, ['tmux', 'display-message', '-p', '-t', session, fmt], {\n user: TMUX_USER,\n });\n if (res.exitCode !== 0) {\n throw new Error(failure('display-message', session, res.stderr || res.stdout));\n }\n const m = /^(\\d+),(\\d+),(\\d+),(\\d+)/.exec(res.stdout.trim());\n if (!m) throw new Error(`tmux display-message returned unexpected output: ${res.stdout}`);\n return {\n cols: Number(m[1]),\n rows: Number(m[2]),\n cursor: { x: Number(m[3]), y: Number(m[4]) },\n };\n}\n\n/**\n * `tmux send-keys -l` writes the bytes verbatim — no key-table translation —\n * so control bytes already encoded in the DSL (e.g. 0x01 for Ctrl-a) reach the\n * inner program intact. Pass the resolved DSL string here, not a raw user\n * argv.\n */\nexport async function sendLiteral(\n provider: Provider,\n box: BoxRecord,\n session: string,\n literal: string,\n): Promise<void> {\n if (literal.length === 0) return;\n const res = await provider.exec(box, ['tmux', 'send-keys', '-t', session, '-l', '--', literal], {\n user: TMUX_USER,\n });\n if (res.exitCode !== 0) {\n throw new Error(failure('send-keys -l', session, res.stderr || res.stdout));\n }\n}\n\n/**\n * `tmux send-keys` with key-table translation enabled. Use for symbolic keys\n * like `Enter` / `BSpace`; the DSL parser produces literal bytes that go\n * through `sendLiteral`, so this is mostly used by the `prompt` subcommand to\n * append a trailing Enter.\n */\nexport async function sendKey(\n provider: Provider,\n box: BoxRecord,\n session: string,\n key: string,\n): Promise<void> {\n const res = await provider.exec(box, ['tmux', 'send-keys', '-t', session, key], {\n user: TMUX_USER,\n });\n if (res.exitCode !== 0) {\n throw new Error(failure('send-keys', session, res.stderr || res.stdout));\n }\n}\n\n/**\n * `tmux resize-window -t <session>:0 -x <cols> -y <rows>`. tmux 3.0+ ships\n * `resize-window`; the box image is already on 3.2.\n */\nexport async function resizeWindow(\n provider: Provider,\n box: BoxRecord,\n session: string,\n cols: number,\n rows: number,\n): Promise<void> {\n const res = await provider.exec(\n box,\n ['tmux', 'resize-window', '-t', session, '-x', String(cols), '-y', String(rows)],\n { user: TMUX_USER },\n );\n if (res.exitCode !== 0) {\n throw new Error(failure('resize-window', session, res.stderr || res.stdout));\n }\n}\n\n/**\n * `tmux list-sessions -F \"#{session_name}\"` — one session name per line.\n * Empty list when no tmux server is running (exit 1 on the box; we swallow it).\n */\nexport async function listSessions(provider: Provider, box: BoxRecord): Promise<string[]> {\n const res = await provider.exec(\n box,\n ['tmux', 'list-sessions', '-F', '#{session_name}'],\n { user: TMUX_USER },\n );\n if (res.exitCode !== 0) return [];\n return res.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nfunction failure(op: string, session: string, detail: string): string {\n const tail = detail.trim();\n return `tmux ${op} failed for session '${session}'${tail ? `: ${tail}` : ''}`;\n}\n","// Resolve which tmux session inside a box the `drive` subcommands should\n// target. The explicit `--session` flag always wins; otherwise we pick the\n// first running well-known agent session (claude → codex → opencode) and fall\n// back to whatever single session exists if none of those names match.\n\nimport type { BoxRecord, Provider } from '@agentbox/core';\nimport { listSessions } from './tmux.js';\n\n// Mirrors the DEFAULT_*_SESSION constants in `@agentbox/sandbox-docker`. Kept\n// inline so this module has no dep on the docker package (it runs against\n// any provider).\nconst AGENT_SESSION_PRIORITY = ['claude', 'codex', 'opencode'] as const;\n\nexport interface ResolvedSession {\n name: string;\n /** All sessions tmux reported, in tmux's order. */\n available: string[];\n}\n\nexport async function resolveDriveSession(\n provider: Provider,\n box: BoxRecord,\n explicit: string | undefined,\n): Promise<ResolvedSession> {\n const sessions = await listSessions(provider, box);\n\n if (explicit !== undefined && explicit !== '') {\n if (!sessions.includes(explicit)) {\n throw new SessionNotFoundError(explicit, sessions);\n }\n return { name: explicit, available: sessions };\n }\n\n for (const candidate of AGENT_SESSION_PRIORITY) {\n if (sessions.includes(candidate)) {\n return { name: candidate, available: sessions };\n }\n }\n // No agent session, but maybe a custom one started by the user. Auto-pick\n // when there's exactly one to choose from; otherwise fail loud with the list.\n if (sessions.length === 1 && sessions[0]) {\n return { name: sessions[0], available: sessions };\n }\n throw new SessionNotFoundError(undefined, sessions);\n}\n\nexport class SessionNotFoundError extends Error {\n readonly wanted: string | undefined;\n readonly available: string[];\n\n constructor(wanted: string | undefined, available: string[]) {\n const head = wanted\n ? `no tmux session '${wanted}' in this box`\n : 'no agent tmux session running in this box';\n const tail = available.length\n ? ` (running: ${available.join(', ')})`\n : ' (tmux server not running or no sessions)';\n super(head + tail);\n this.name = 'SessionNotFoundError';\n this.wanted = wanted;\n this.available = available;\n }\n}\n","import { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { detectHostTerminal } from '../terminal/host.js';\nimport { encodeClaudeProjectsDir } from '../session-teleport/cwd-encoding.js';\nimport { claudeCommand } from './claude.js';\nimport { codexCommand } from './codex.js';\nimport { opencodeCommand } from './opencode.js';\n\ntype ForkAgent = 'claude' | 'codex' | 'opencode';\nconst FORK_AGENTS = ['claude', 'codex', 'opencode'] as const;\n\n/** The create-style command each agent forks through. fork forwards a curated\n * argv and lets the delegate run its own create+teleport+attach pipeline\n * (incl. the new-tab spawn, tagged with that agent's attach mode). */\nconst AGENT_COMMAND: Record<ForkAgent, Command> = {\n claude: claudeCommand,\n codex: codexCommand,\n opencode: opencodeCommand,\n};\n\ninterface ForkOptions {\n workspace: string;\n session?: string;\n provider?: string;\n name?: string;\n attachIn?: string;\n carryYes?: boolean;\n agent?: string;\n}\n\n/** fork's attach modes: claude's split|window|tab|same plus `background`\n * (never attach — always leave Claude running in the box). */\nconst FORK_ATTACH_VALUES = ['window', 'tab', 'split', 'background', 'same'] as const;\n\n/** Two host JSONLs both touched inside this window means we can't safely guess\n * which Claude window the user meant — they must pass --session. */\nconst RECENT_SESSION_MS = 5 * 60 * 1000;\n\n/** Session args fork forwards to the delegate command, per agent:\n * - claude: `--resume <id>` when given; else `--continue`, but refuse first if\n * several sessions in this cwd were written to recently (the newest-by-mtime\n * heuristic claude's `--continue` uses would be a guess). The Codex/OpenCode\n * paths can't read the cwd's session list the same way, so they're simpler.\n * - codex: `--resume <uuid>` when given; else `--continue` (codex teleport is\n * already cwd-scoped). The Codex `/agentbox` prompt resolves the live uuid\n * and passes it, since Codex exposes no session-id variable.\n * - opencode: no resume — teleport is a stub, so fork starts a fresh box.\n * `--session` is rejected (resume isn't possible yet). */\nfunction resolveSessionArgs(agent: ForkAgent, opts: ForkOptions): string[] {\n if (agent === 'opencode') {\n if (opts.session) {\n throw new Error(\n 'OpenCode session resume is not supported yet; `agentbox fork --agent opencode` starts a fresh box. Drop --session.',\n );\n }\n return [];\n }\n if (opts.session) return ['--resume', opts.session];\n if (agent === 'codex') return ['--continue'];\n // claude: guard against an ambiguous newest-by-mtime pick.\n const dir = join(homedir(), '.claude', 'projects', encodeClaudeProjectsDir(opts.workspace));\n if (!existsSync(dir)) return ['--continue']; // claude emits the clear \"run claude here first\" error\n const now = Date.now();\n const recent = readdirSync(dir)\n .filter((f) => f.endsWith('.jsonl'))\n .map((f) => {\n try {\n return statSync(join(dir, f)).mtimeMs;\n } catch {\n return 0;\n }\n })\n .filter((m) => now - m < RECENT_SESSION_MS);\n if (recent.length > 1) {\n throw new Error(\n `multiple recent Claude sessions for this cwd — pass --session <id> to choose. List them with: ls \"${dir}\"`,\n );\n }\n return ['--continue'];\n}\n\n/** Default box name when -n is omitted: tags forks distinctly in `agentbox list`. */\nfunction defaultForkName(): string {\n const now = new Date();\n const hh = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n return `fork-${hh}${mm}${ss}`;\n}\n\n/**\n * Translate fork's `--attach-in` + the detected host terminal into the claude\n * flag that produces the right behavior. The key difference from a bare\n * `agentbox claude --attach-in window` is the fallback: when no tmux/iTerm is\n * present, fork goes to **background** (`--no-attach`) rather than inline\n * attach — fork is typically driven from another Claude (the `/agentbox`\n * slash command's subagent), whose terminal must not be taken over.\n */\nfunction resolveAttachArgs(attachIn: string): string[] {\n if (attachIn === 'background') return ['--no-attach'];\n if (attachIn === 'same') return ['--attach-in', 'same'];\n // window | tab | split: spawn a new pane only if we can; else background.\n return detectHostTerminal() === 'unknown' ? ['--no-attach'] : ['--attach-in', attachIn];\n}\n\nexport const forkCommand = new Command('fork')\n .description(\n 'Fork the current host agent session into a new box and resume it there. Opens the box in a new terminal tab under iTerm/tmux; otherwise starts it in the background.',\n )\n .option('-w, --workspace <path>', 'host workspace to mount', process.cwd())\n .option(\n '--agent <name>',\n 'which agent to fork: claude (default), codex, or opencode. OpenCode starts a fresh box (session resume not supported yet).',\n )\n .option(\n '--session <id>',\n 'host agent session id to resume (default: the newest session for this cwd; claude refuses if several were used recently). Ignored for --agent opencode.',\n )\n .option('--provider <name>', \"sandbox backend: 'docker' (default), 'daytona', or 'hetzner'\")\n .option('-n, --name <name>', 'box name (default: fork-<HHMMSS>)')\n .option(\n '--attach-in <mode>',\n 'where to open the forked session: window | tab | split | background | same (default: tab). Falls back to background outside tmux/iTerm.',\n )\n .option(\n '--carry-yes',\n \"auto-approve agentbox.yaml's carry: block (fork skips carry by default — it does not silently re-copy host files into the new box)\",\n )\n .action(async (opts: ForkOptions) => {\n // Box→box guard: AGENTBOX_RELAY_URL is only set inside a box. Fork teleports\n // a *host* agent session into a new box; it can't run from inside one yet.\n // Checked here (not just in the /agentbox skill) so an LLM that calls the\n // CLI directly still gets a clear refusal instead of a confusing failure.\n if ((process.env.AGENTBOX_RELAY_URL ?? '').trim().length > 0) {\n log.error(\n 'agentbox fork runs on the host only: it teleports a host agent session into a new box. You appear to be inside a box (AGENTBOX_RELAY_URL is set) — box→box fork is not supported yet.',\n );\n process.exit(2);\n }\n\n const agent = (opts.agent?.trim() || 'claude') as ForkAgent;\n if (!(FORK_AGENTS as readonly string[]).includes(agent)) {\n log.error(`--agent: expected one of ${FORK_AGENTS.join(', ')}, got \"${opts.agent ?? ''}\"`);\n process.exit(2);\n }\n\n const attachIn = opts.attachIn ?? 'tab';\n if (!(FORK_ATTACH_VALUES as readonly string[]).includes(attachIn)) {\n log.error(`--attach-in: expected one of ${FORK_ATTACH_VALUES.join(', ')}, got \"${attachIn}\"`);\n process.exit(2);\n }\n\n // Tolerate an LLM passing `--provider \"\"` (or whitespace): treat a blank\n // value as \"not passed\" so it falls through to the default docker provider.\n const provider = opts.provider?.trim();\n\n let sessionArgs: string[];\n try {\n sessionArgs = resolveSessionArgs(agent, opts);\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(2);\n }\n\n const subArgv = [\n '-y',\n ...(opts.carryYes ? ['--carry-yes'] : ['--carry', 'skip']),\n '-w',\n opts.workspace,\n '-n',\n opts.name ?? defaultForkName(),\n ...(provider ? ['--provider', provider] : []),\n ...sessionArgs,\n ...resolveAttachArgs(attachIn),\n ];\n\n // Delegate to the chosen agent's existing create+teleport+attach pipeline.\n // It runs prepareTeleport (pre-flight) -> createBox -> uploadTeleport ->\n // startSession, and (for --attach-in tab/window) spawnInNewTerminal tagged\n // with that agent's attach mode. The action terminates the process itself\n // (process.exit) on every path.\n await AGENT_COMMAND[agent].parseAsync(subArgv, { from: 'user' });\n });\n","import { intro, log, outro } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** Marker on the line after the frontmatter of every skill we ship. Its\n * presence in an existing target means we wrote it and may overwrite freely. */\nconst MANAGED_SENTINEL = '<!-- agentbox-managed:v1 -->';\n\n/** Substring unique to the pre-rename `agentbox` host skill. Lets `install`\n * replace it in place during the agentbox → agentbox-info rename even though\n * that old file predates the sentinel. */\nconst LEGACY_INFO_MARKER = 'Drive AgentBox from the host:';\n\ninterface InstallTarget {\n /** Path relative to the bundled `share/host-skills/` dir. */\n src: string;\n /** Absolute destination on the host. */\n dest: string;\n /** When set, install only if this directory exists — i.e. the tool is set up\n * on this host. Absent dir = silently skip (don't write configs for a tool\n * the user doesn't use). */\n gateDir?: string;\n}\n\n/** The files `agentbox install` writes. Claude skills always install; the Codex\n * prompt and OpenCode command install only when that tool's config dir exists.\n * All three surface the same `/agentbox` fork command in their respective\n * agent UIs (Codex shows it under `/prompts:`). */\nfunction installTargets(): InstallTarget[] {\n const home = homedir();\n const claudeSkills = join(home, '.claude', 'skills');\n return [\n { src: join('agentbox', 'SKILL.md'), dest: join(claudeSkills, 'agentbox', 'SKILL.md') },\n { src: join('agentbox-info', 'SKILL.md'), dest: join(claudeSkills, 'agentbox-info', 'SKILL.md') },\n {\n src: join('codex', 'agentbox.md'),\n dest: join(home, '.codex', 'prompts', 'agentbox.md'),\n gateDir: join(home, '.codex'),\n },\n {\n src: join('opencode', 'agentbox.md'),\n dest: join(home, '.config', 'opencode', 'commands', 'agentbox.md'),\n gateDir: join(home, '.config', 'opencode'),\n },\n ];\n}\n\n/**\n * Locate the bundled `share/host-skills/` directory. This module is bundled\n * into the CLI at `<root>/dist/index.js`; `share/` ships as a sibling of\n * `dist/` in both the dev tree and the published package. The src-tree\n * candidate covers running unbundled (e.g. tsx).\n */\nfunction resolveHostSkillsDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(here, '..', 'share', 'host-skills'), // bundled: dist/ -> ../share\n resolve(here, '..', '..', 'share', 'host-skills'), // src: src/commands/ -> ../../share\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n throw new Error(\n `could not locate bundled host skills; tried:\\n ${candidates.join('\\n ')}`,\n );\n}\n\ninterface InstallOptions {\n force?: boolean;\n dryRun?: boolean;\n}\n\n/** Decide whether we may write `target`. Missing or AgentBox-managed/legacy\n * files are writable; a user-authored file is left alone unless --force. */\nfunction writableReason(target: string, force: boolean): 'new' | 'managed' | 'forced' | 'skip' {\n if (!existsSync(target)) return 'new';\n const existing = readFileSync(target, 'utf8');\n if (existing.includes(MANAGED_SENTINEL) || existing.includes(LEGACY_INFO_MARKER)) {\n return 'managed';\n }\n return force ? 'forced' : 'skip';\n}\n\nexport const installCommand = new Command('install')\n .description(\n \"Install AgentBox's host-side /agentbox fork command into Claude (~/.claude/skills), and — when detected — into Codex (~/.codex/prompts) and OpenCode (~/.config/opencode/commands). Idempotent.\",\n )\n .option('--force', 'overwrite existing files even if not AgentBox-managed')\n .option('--dry-run', 'print what would be written without changing anything')\n .action((opts: InstallOptions) => {\n intro('Installing AgentBox host commands...');\n const force = opts.force === true;\n const dryRun = opts.dryRun === true;\n\n let srcDir: string;\n try {\n srcDir = resolveHostSkillsDir();\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n const written: string[] = [];\n let skipped = 0;\n\n for (const t of installTargets()) {\n const src = join(srcDir, t.src);\n if (!existsSync(src)) {\n log.warn(`bundled file missing (skipped): ${src}`);\n skipped++;\n continue;\n }\n // Tool not set up on this host — skip silently (don't seed configs for a\n // tool the user doesn't use).\n if (t.gateDir && !existsSync(t.gateDir)) continue;\n const reason = writableReason(t.dest, force);\n if (reason === 'skip') {\n log.warn(`user-modified file at ${t.dest}, skipping; pass --force to overwrite`);\n skipped++;\n continue;\n }\n if (dryRun) {\n log.info(`would write ${t.dest} (${reason})`);\n written.push(t.dest);\n continue;\n }\n mkdirSync(dirname(t.dest), { recursive: true });\n writeFileSync(t.dest, readFileSync(src, 'utf8'));\n written.push(t.dest);\n }\n\n if (dryRun) {\n outro(`dry-run: ${String(written.length)} file(s) would be written, ${String(skipped)} skipped`);\n return;\n }\n if (written.length === 0) {\n outro(`nothing installed (${String(skipped)} skipped)`);\n return;\n }\n outro(`installed: ${written.join(', ')}`);\n });\n","import type { BoxRecord, ExecResult } from '@agentbox/core';\nimport { GH_PR_OPS, hashRpcParams, injectPrCreateHead as injectHead, type GhPrOp } from '@agentbox/relay';\nimport { mintHostInitiatedToken } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\n/**\n * `agentbox git <subcommand> <box>` — host-side proxy for git/PR operations\n * against a specific box. Every subcommand resolves the box, attaches the\n * provider, and runs the matching `agentbox-ctl git` / `agentbox-ctl gh pr`\n * (or raw `git`) inside the box's /workspace.\n *\n * Credentialed RPCs (push, fetch, pull-fetch, gh pr) carry a one-time scoped\n * token minted by the host via `mintHostInitiatedToken`; the relay validates\n * the token and skips its confirm prompt on match. A simple \"host-initiated\"\n * boolean would be forgeable by the box agent (the agent sees the argv); the\n * one-time token isn't (the mint endpoint is loopback-only). If the relay\n * can't mint (older relay / not running), the call still proceeds — it just\n * goes through the normal prompt path on the wrapper side.\n */\n\nconst WORKSPACE = '/workspace';\n/** Generous TTL: a slow push over a flaky uplink can easily take 60s. */\nconst TOKEN_TTL_MS = 120_000;\n\nasync function runInBox(box: BoxRecord, argv: string[]): Promise<ExecResult> {\n const provider = await providerForBox(box);\n return provider.exec(box, argv, { cwd: WORKSPACE });\n}\n\nasync function runAndStream(box: BoxRecord, argv: string[]): Promise<number> {\n const r = await runInBox(box, argv);\n if (r.stdout) process.stdout.write(r.stdout);\n if (r.stderr) process.stderr.write(r.stderr);\n return r.exitCode;\n}\n\n/**\n * Shape of the RPC params `agentbox-ctl` will send to the relay. The host\n * CLI must compute this *exactly* so the hash binding round-trips. Kept in\n * lockstep with `buildParams` in `packages/ctl/src/commands/git.ts` and the\n * action body in `packages/ctl/src/commands/pr-subcommands.ts`. The `cwd` is\n * always `/workspace` because our `provider.exec` call below sets it\n * explicitly; ctl mirrors `process.cwd()` into `params.path`.\n */\ninterface PredictedGitParams {\n path: string;\n remote?: string;\n args?: string[];\n}\ninterface PredictedGhPrParams {\n path: string;\n args?: string[];\n}\n\n/**\n * Mint a host-initiated token bound to the exact params hash + return the\n * `--host-initiated-token <tok>` argv fragment to splice into an\n * `agentbox-ctl` invocation. Empty fragment on mint failure — the call\n * still works, the relay just prompts instead of auto-approving.\n *\n * Why CLI arg (not env): envs propagate to children, so a `git push`\n * pre-push hook would inherit the token. Why bound to paramsHash: /proc/<pid>\n * /cmdline is world-readable, so a malicious in-box process could harvest\n * the token mid-flight and replay with mutated args (e.g. `--force`). The\n * paramsHash binding means a harvested token is only usable for the exact\n * params the host CLI committed to.\n */\nasync function hostInitiatedArgs(\n boxId: string,\n method: string,\n predictedParams: PredictedGitParams | PredictedGhPrParams,\n): Promise<string[]> {\n const paramsHash = hashRpcParams(predictedParams);\n const token = await mintHostInitiatedToken(boxId, method, paramsHash, TOKEN_TTL_MS);\n return token ? ['--host-initiated-token', token] : [];\n}\n\n/** Build the `{ path, remote?, args? }` ctl will send for git RPCs. */\nfunction buildPredictedGitParams(remote: string | undefined, extraArgs: string[]): PredictedGitParams {\n const out: PredictedGitParams = { path: WORKSPACE };\n if (remote) out.remote = remote;\n if (extraArgs.length > 0) out.args = extraArgs;\n return out;\n}\n\n/** Build the `{ path, args? }` ctl will send for gh.pr.<op> RPCs. */\nfunction buildPredictedGhPrParams(ghArgs: string[]): PredictedGhPrParams {\n const out: PredictedGhPrParams = { path: WORKSPACE };\n if (ghArgs.length > 0) out.args = ghArgs;\n return out;\n}\n\nasync function exitWith(code: number): Promise<never> {\n process.exit(code);\n}\n\n// ---- subcommands -----------------------------------------------------------\n\nconst pushCommand = new Command('push')\n .description(\"Push the box's branch via the host relay (host creds, no prompt)\")\n .argument('<box>', 'box ref: project index, id, id prefix, name, or container')\n .argument('[args...]', 'extra flags forwarded to `agentbox-ctl git push` (e.g. --force-with-lease, --tags)')\n .option('--remote <name>', 'remote name (default: origin)')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[], opts: { remote?: string }) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const predicted = buildPredictedGitParams(opts.remote, args);\n const tokenArgs = await hostInitiatedArgs(box.id, 'git.push', predicted);\n const argv = ['agentbox-ctl', 'git', 'push', ...tokenArgs];\n if (opts.remote) argv.push('--remote', opts.remote);\n argv.push(...args);\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst fetchCommand = new Command('fetch')\n .description('Fetch via the host relay (refs land in the shared .git)')\n .argument('<box>', 'box ref')\n .argument('[args...]', 'extra flags forwarded to `agentbox-ctl git fetch` (e.g. --prune)')\n .option('--remote <name>', 'remote name (default: origin)')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[], opts: { remote?: string }) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n // Fetch is read-only host-side and the relay doesn't prompt for it; we\n // still mint a token so future relay hardening that adds a prompt\n // doesn't break this command silently.\n const predicted = buildPredictedGitParams(opts.remote, args);\n const tokenArgs = await hostInitiatedArgs(box.id, 'git.fetch', predicted);\n const argv = ['agentbox-ctl', 'git', 'fetch', ...tokenArgs];\n if (opts.remote) argv.push('--remote', opts.remote);\n argv.push(...args);\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst pullCommand = new Command('pull')\n .description(\n \"Fetch via the relay then merge in /workspace. With <branch>: first `git checkout <branch>` so the box switches base branch and pulls latest — useful for reusing a box on a new task.\",\n )\n .argument('<box>', 'box ref')\n .argument('[branch]', 'optional branch to switch to before pulling (e.g. main)')\n .argument('[args...]', 'extra flags forwarded to `agentbox-ctl git pull`')\n .option('--remote <name>', 'remote name (default: origin)')\n .option('--ff-only', 'pass --ff-only to the in-box merge')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(\n async (\n boxRef: string,\n branch: string | undefined,\n args: string[],\n opts: { remote?: string; ffOnly?: boolean },\n ) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n if (branch) {\n const switchCode = await runAndStream(box, ['git', 'checkout', branch]);\n if (switchCode !== 0) await exitWith(switchCode);\n }\n // ctl's `git pull` runs `git.fetch` internally then a local merge —\n // the relay only sees `git.fetch`. Match the scope to that. Note\n // `--ff-only` is consumed by ctl (not forwarded to the relay), so\n // it's excluded from the predicted params hash.\n const predicted = buildPredictedGitParams(opts.remote, args);\n const tokenArgs = await hostInitiatedArgs(box.id, 'git.fetch', predicted);\n const argv = ['agentbox-ctl', 'git', 'pull', ...tokenArgs];\n if (opts.remote) argv.push('--remote', opts.remote);\n if (opts.ffOnly) argv.push('--ff-only');\n argv.push(...args);\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n },\n );\n\nconst checkoutCommand = new Command('checkout')\n .description('Change the box\\'s working branch (runs `git checkout <branch>` in /workspace)')\n .argument('<box>', 'box ref')\n .argument('<branch>', 'branch to check out inside the box')\n .argument('[args...]', 'extra flags forwarded to `git checkout`')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, branch: string, args: string[]) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n // No relay involvement: branch switching is local to the worktree.\n await exitWith(await runAndStream(box, ['git', 'checkout', branch, ...args]));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst statusCommand = new Command('status')\n .description('Run `git status` in the box\\'s /workspace (read-only, no relay)')\n .argument('<box>', 'box ref')\n .argument('[args...]', 'extra flags forwarded to `git status`')\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[]) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n await exitWith(await runAndStream(box, ['git', 'status', ...args]));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n// ---- pr group --------------------------------------------------------------\n//\n// Mirrors the in-box `agentbox-ctl gh pr <op>` surface 1:1. `create` is the\n// default subcommand so `agentbox git pr <box>` is sugar for\n// `agentbox git pr create <box>` — matches how users naturally describe it.\n\nconst PR_OP_DESCRIPTIONS: Record<GhPrOp, string> = {\n create: \"Open a PR for the box's branch (host `gh pr create`, no prompt).\",\n view: 'Show a PR (read-only).',\n list: 'List PRs (read-only).',\n comment: 'Comment on a PR.',\n review: 'Review a PR.',\n merge:\n 'Merge a PR (host `gh pr merge`). AGENTBOX_PROMPT=off bypass still requires AGENTBOX_GH_FORCE=1.',\n checkout:\n \"Check out a PR's branch on the host main repo (opt-in via AGENTBOX_GH_PR_CHECKOUT=allow; switches the host repo branch).\",\n close: 'Close a PR.',\n reopen: 'Reopen a PR.',\n};\n\n/**\n * Default to the box's root branch as `--head` on `gh pr create` so the PR\n * is for the box's branch, not whatever the host happens to have checked\n * out (gh's default infers head from the cwd's HEAD, which is `feat/test`\n * or similar when the user is mid-task). Only injected when the user hasn't\n * already passed `--head`, and only for `create`. The relay's\n * `worktree.hostMainRepo` is the cwd `gh` runs in, so passing `--head` is\n * sufficient — base stays whatever the user picked / repo default.\n */\nfunction injectPrCreateHead(op: GhPrOp, box: { gitWorktrees?: { kind: string; branch: string }[] }, args: string[]): string[] {\n const rootWt = (box.gitWorktrees ?? []).find((w) => w.kind === 'root');\n return injectHead(op, rootWt?.branch, args);\n}\n\nfunction buildPrSubcommand(op: GhPrOp): Command {\n return new Command(op)\n .description(PR_OP_DESCRIPTIONS[op])\n .argument('<box>', 'box ref')\n .argument(\n '[args...]',\n 'extra flags forwarded to `gh pr <op>` (e.g. --title, --body, --label, --draft, --json)',\n )\n .allowExcessArguments(true)\n .allowUnknownOption(true)\n .action(async (boxRef: string, args: string[]) => {\n try {\n const box = await resolveBoxOrExit(boxRef);\n const ghArgs = injectPrCreateHead(op, box, args);\n // Hash the args *after* injection so the bound paramsHash matches\n // what ctl will end up sending.\n const predicted = buildPredictedGhPrParams(ghArgs);\n const tokenArgs = await hostInitiatedArgs(box.id, `gh.pr.${op}`, predicted);\n const argv = ['agentbox-ctl', 'gh', 'pr', op, ...tokenArgs, ...ghArgs];\n await exitWith(await runAndStream(box, argv));\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n}\n\nconst prCommand = new Command('pr').description(\n \"PR operations against a box's branch via the host `gh` CLI\",\n);\nfor (const op of GH_PR_OPS) {\n const sub = buildPrSubcommand(op);\n prCommand.addCommand(sub, op === 'create' ? { isDefault: true } : undefined);\n}\n\n// ---- root ------------------------------------------------------------------\n\nexport const gitCommand = new Command('git')\n .description('Run git / gh pr operations against a box from the host')\n .addCommand(pushCommand)\n .addCommand(fetchCommand)\n .addCommand(pullCommand)\n .addCommand(checkoutCommand)\n .addCommand(statusCommand)\n .addCommand(prCommand);\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 global?: 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\n/**\n * The merged AGENT column: every active agent session, claude annotated with\n * its activity state (working/idle/…), codex/opencode with just their name\n * (running/not is all they expose). Comma-joined when more than one is up;\n * `-` when none.\n *\n * `claudeActivity === 'unknown'` is treated as \"no claude\" — the supervisor\n * seeds that default for *every* box (even codex/opencode boxes), so showing\n * it would put a spurious `claude:unknown` on nearly every row.\n */\nfunction agentSummary(b: ListedBox): string {\n const agents: string[] = [];\n if (b.claudeActivity && b.claudeActivity !== 'unknown') {\n agents.push(`claude:${b.claudeActivity}`);\n }\n // Codex: show its activity when a hook has reported one; otherwise fall back\n // to a plain `codex` so a running codex box stays visible before the first\n // hook fires (or on boxes whose image predates the codex hooks).\n if (b.codexActivity && b.codexActivity !== 'unknown') {\n agents.push(`codex:${b.codexActivity}`);\n } else if (b.codexSession?.running) {\n agents.push('codex');\n }\n if (b.opencodeSession?.running) agents.push('opencode');\n return agents.length > 0 ? agents.join(', ') : '-';\n}\n\nfunction renderTable(boxes: ListedBox[], stream: NodeJS.WriteStream): string {\n const header = ['N', 'NAME', 'STATE', 'AGENT', 'SHELLS', 'PROVIDER', 'URL', 'WORKSPACE'];\n const wsCol = header.length - 1;\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 // One column for every agent (claude / codex / opencode) — see agentSummary.\n plain(agentSummary(b)),\n // Live shell-session count; `-` for none (or a non-running box). Detail\n // lives in `agentbox shell ls <box>`.\n plain(b.shellSessions.length > 0 ? String(b.shellSessions.length) : '-'),\n plain(b.provider ?? 'docker'),\n urlCell(b, stream),\n ]);\n const leadHeader = header.slice(0, wsCol).map(plain);\n\n // Widths for the fixed columns (everything but WORKSPACE).\n const fixedCols = leadHeader.map((_, i) => i);\n const fixedWidths = fixedCols.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[wsCol]?.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[wsCol] 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 * `--global`. Pre-feature boxes have no `projectRoot`, so they surface only\n * under `--global` — 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 --global\\` to see all`;\n }\n return 'no boxes — run `agentbox create` to make one';\n }\n const table = renderTable(boxes, process.stdout);\n if (!scoped) return table;\n // basename of projectRoot — matches dashboard sidebar's projectLabel().\n const name = projectRoot.split('/').filter(Boolean).pop() ?? projectRoot;\n return `Project: ${name}\\n${table}`;\n}\n\nexport const listCommand = withWatchOptions(\n new Command('list')\n .alias('ls')\n .description('List agent boxes in the current project (-g for all)')\n .option('-j, --json', 'machine-readable JSON output')\n .option('-g, --global', '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.global ?? 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 { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface LogsOptions {\n tail: string;\n follow?: boolean;\n daemon?: boolean;\n}\n\nconst DAEMON_LOG_PATH = '/var/log/agentbox/ctl-daemon.log';\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 .option(\n '--daemon',\n \"tail the in-box agentbox-ctl daemon log instead of a service log (the supervisor's own stdout/stderr)\",\n )\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 // `--daemon` reads the supervisor's own log file, not a service from\n // agentbox.yaml — accept no service arg in that case.\n if (!service && !opts.daemon) {\n log.error('missing <service> argument');\n log.info('usage: agentbox logs [box] <service> [-n N] [-f]');\n log.info(' agentbox logs [box] --daemon [-n N] [-f]');\n process.exit(2);\n }\n\n const box = await resolveBoxOrExit(idOrName);\n const provider = await providerForBox(box);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n const tail = String(Number.parseInt(opts.tail, 10) || 200);\n // For --daemon: tail the raw file (the daemon log isn't managed by\n // the in-box ctl's structured logs pipeline — it's stdout/stderr).\n const args = opts.daemon\n ? opts.follow\n ? ['tail', '-n', tail, '-F', DAEMON_LOG_PATH]\n : ['tail', '-n', tail, DAEMON_LOG_PATH]\n : opts.follow\n ? ['agentbox-ctl', 'logs', service!, '--tail', tail, '--follow']\n : ['agentbox-ctl', 'logs', service!, '--tail', tail];\n\n if (!opts.follow) {\n // Non-follow returns once the snapshot dump is done — safe to round-trip\n // through provider.exec on both docker and cloud.\n const proc = await provider.exec(box, args, { user: 'vscode' });\n if (proc.exitCode !== 0) {\n log.error(\n `${opts.daemon ? 'daemon log' : 'agentbox-ctl logs'} failed: ${proc.stderr || proc.stdout}`,\n );\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. Docker keeps the spawn-docker-exec fast path so Ctrl-C\n // tears both ends down cleanly. Cloud goes through `provider.buildAttach`\n // which mints a fresh SSH token and runs `agentbox-ctl logs --follow`\n // directly (no tmux wrap — `kind: 'logs'` skips the tmux render).\n if (!isCloud) {\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 return;\n }\n\n if (!provider.buildAttach) {\n throw new Error(\n `provider '${provider.name}' does not support follow-mode log streaming`,\n );\n }\n // For --daemon over cloud we don't have a `logs` kind that maps to\n // tail-file. Use the `shell` kind in non-tmux mode and run the tail\n // argv directly via SSH.\n const spec = opts.daemon\n ? await provider.buildAttach(box, 'shell', {\n sessionName: 'daemon-logs',\n user: 'vscode',\n command: `tail -n ${tail} -F ${DAEMON_LOG_PATH}`,\n noTmux: true,\n })\n : await provider.buildAttach(box, 'logs', {\n service: service!,\n tail: Number.parseInt(tail, 10),\n follow: true,\n user: 'vscode',\n });\n const [argv0, ...rest] = spec.argv;\n if (!argv0) throw new Error('provider.buildAttach returned an empty argv');\n const child = spawn(argv0, rest, {\n stdio: ['ignore', 'inherit', 'inherit'],\n env: spec.env ? { ...process.env, ...spec.env } : process.env,\n });\n const cleanup = async (): Promise<void> => {\n if (spec.cleanup) await spec.cleanup();\n };\n child.on('exit', async (code) => {\n await cleanup();\n process.exit(code ?? 0);\n });\n const term = (): void => {\n child.kill('SIGTERM');\n };\n process.on('SIGINT', term);\n process.on('SIGTERM', term);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { log } from '@clack/prompts';\nimport { execa } from 'execa';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { BoxRecord } from '@agentbox/core';\nimport { openBoxInFinder } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { agentboxAliasFor, parseSshTarget, writeAgentboxSshAlias } from '../ssh-config.js';\nimport { runPath } from './path.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface OpenOpts {\n refresh: boolean; // commander gives `--no-refresh` => refresh=false\n includeNodeModules?: boolean;\n print?: boolean;\n path?: boolean;\n unmount?: boolean;\n}\n\nexport const openCommand = new Command('open')\n .description(\"Open a box's /workspace in Finder (docker: rsync'd snapshot; cloud: sshfs mount)\")\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-refresh', \"skip the rsync; open whatever's already on disk (docker only)\")\n .option(\n '--include-node-modules',\n 'include /workspace/node_modules in the merged export (docker only; off by default)',\n )\n .option('--path', 'print the host workspace / mount path instead of launching Finder')\n .option('--print', 'alias of --path')\n .option(\n '--unmount',\n 'cloud only: unmount any existing sshfs mount for the box and exit',\n )\n .action(async (idOrName: string | undefined, opts: OpenOpts) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const provider = await providerForBox(box);\n const isCloud = (box.provider ?? 'docker') !== 'docker';\n\n if (isCloud) {\n await runCloudOpen(box, provider, opts);\n return;\n }\n\n if (opts.path || opts.print) {\n await runPath(box, {\n refresh: opts.refresh, // print refreshes by default; --no-refresh skips\n includeNodeModules: opts.includeNodeModules,\n });\n return;\n }\n\n const result = await openBoxInFinder(box.id, {\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 } catch (err) {\n handleLifecycleError(err);\n }\n });\n\n/**\n * Cloud `open`: mount the sandbox's `/workspace` via sshfs at a per-box host\n * path (`~/.agentbox/mounts/<box-name>/`) and reveal in Finder. Reuses the\n * SSH alias `agentbox code` already manages — the alias maps to a fresh\n * 60-min Daytona SSH token, written into `~/.ssh/config` per call so sshfs\n * has a live target without baking the token into the mount itself.\n */\nasync function runCloudOpen(\n box: BoxRecord,\n provider: { name: string; buildAttach?: NonNullable<Awaited<ReturnType<typeof providerForBox>>['buildAttach']> },\n opts: OpenOpts,\n): Promise<void> {\n const mountRoot = join(homedir(), '.agentbox', 'mounts', box.name);\n\n if (opts.unmount) {\n const ok = await tryUnmount(mountRoot);\n if (ok) process.stdout.write(`unmounted ${mountRoot}\\n`);\n else process.stdout.write(`nothing mounted at ${mountRoot}\\n`);\n return;\n }\n\n if (opts.path || opts.print) {\n // Don't mount when we only print — print is meant to be lightweight.\n process.stdout.write(`${mountRoot}\\n`);\n return;\n }\n\n // sshfs is the load-bearing dep; macFUSE + sshfs are typically installed\n // via `brew install macfuse sshfs`. Fail with a clear hint instead of\n // a cryptic ENOENT.\n const sshfsBin = await locateBinary('sshfs');\n if (!sshfsBin) {\n throw new Error(\n 'sshfs not found on PATH. Install with `brew install macfuse sshfs` (macOS) or your distro\\'s package manager, then retry. Cloud `agentbox open` mounts the sandbox /workspace via sshfs.',\n );\n }\n\n if (!provider.buildAttach) {\n throw new Error(\n `cloud provider '${provider.name}' does not support SSH attach — \\`agentbox open\\` requires it for cloud boxes`,\n );\n }\n // Same SSH alias machinery `agentbox code` uses — mint a fresh 60-min token\n // and rewrite the alias every call so the user gets a live mount target.\n const spec = await provider.buildAttach(box, 'shell', { noTmux: true });\n const target = parseSshTarget(spec.argv);\n if (!target) {\n throw new Error(`could not parse <user>@<host> from cloud SSH argv: ${spec.argv.join(' ')}`);\n }\n const alias = agentboxAliasFor(box.name);\n await writeAgentboxSshAlias({\n alias,\n hostname: target.host,\n user: target.user,\n identityFile: target.identityFile,\n });\n\n // Ensure the mount dir exists. If something's already mounted there (a\n // stale mount from a previous run) we tear it down before re-mounting —\n // sshfs would otherwise error with \"mountpoint is not empty\".\n if (!existsSync(mountRoot)) {\n mkdirSync(mountRoot, { recursive: true, mode: 0o755 });\n } else if (await isMounted(mountRoot)) {\n log.info(`re-mounting (stale mount detected at ${mountRoot})`);\n await tryUnmount(mountRoot);\n }\n\n log.info(`mounting ${alias}:/workspace at ${mountRoot}`);\n const mount = await execa(\n sshfsBin,\n [\n `${alias}:/workspace`,\n mountRoot,\n // Foreground would block the CLI; default backgrounds the helper.\n '-o',\n 'reconnect',\n '-o',\n // `volname` makes Finder show a friendly label instead of `osxfuseN`.\n `volname=agentbox-${box.name}`,\n '-o',\n 'noappledouble',\n ],\n { reject: false },\n );\n if (mount.exitCode !== 0) {\n throw new Error(`sshfs mount failed (exit ${String(mount.exitCode)}): ${mount.stderr || mount.stdout}`);\n }\n // `open` on macOS reveals the dir in Finder. On non-macOS this is a no-op\n // / error — degrade silently because the mount path is already printed.\n await execa('open', [mountRoot], { reject: false });\n process.stdout.write(`opened ${mountRoot}\\n`);\n process.stdout.write(`unmount later with: agentbox open ${box.name} --unmount\\n`);\n}\n\nasync function locateBinary(name: string): Promise<string | null> {\n const r = await execa('which', [name], { reject: false });\n if (r.exitCode !== 0) return null;\n const path = (r.stdout ?? '').trim();\n return path.length > 0 ? path : null;\n}\n\nasync function isMounted(path: string): Promise<boolean> {\n // `mount` prints \"on <path>\" entries; grep for the mountpoint. macOS and\n // Linux both report it. Fallback to \"false\" on any exec error so we don't\n // wedge on a missing util.\n const r = await execa('sh', ['-c', `mount | grep -F \" on ${path} \"`], { reject: false });\n return r.exitCode === 0;\n}\n\nasync function tryUnmount(path: string): Promise<boolean> {\n // macOS prefers `umount`; some setups need `diskutil unmount`. Try both.\n if (await isMounted(path)) {\n const u = await execa('umount', [path], { reject: false });\n if (u.exitCode === 0) return true;\n const d = await execa('diskutil', ['unmount', path], { reject: false });\n return d.exitCode === 0;\n }\n return false;\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 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 { record, paths } = await getBoxHostPaths(box.id);\n\n if (opts.refresh) {\n const refreshed = await refreshExport(record, {\n includeNodeModules: opts.includeNodeModules,\n });\n process.stdout.write(`${refreshed.hostPath}\\n`);\n return;\n }\n\n process.stdout.write(`${paths.mergedExport}\\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const pauseCommand = new Command('pause')\n .description(\n 'Pause a box. Docker: `docker pause` (cgroup freeze — sub-second resume). Cloud: backend.pause (Daytona archive — cold storage; resume is slower but uses no quota while archived).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const record = await pauseBox(box.id);\n process.stdout.write(`paused ${record.container}\\n`);\n } else {\n await (await providerForBox(box)).pause(box);\n process.stdout.write(`paused ${box.name} (${box.provider} sandbox archived)\\n`);\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","/**\n * `agentbox prepare` — provider-neutral \"build the base image\" command.\n *\n * Three modes:\n *\n * - `agentbox prepare` → status only: show the inventory of\n * prepared base images / shared\n * volumes across all providers, plus\n * the project's pinned `box.image`.\n * - `agentbox prepare --provider X` → run prepare for X, then re-print\n * the relevant status section.\n * - `agentbox prepare --status` → status only (explicit; same as\n * no-args, but useful when scripted).\n *\n * Docker `prepare` builds `agentbox/box:dev` locally. Daytona `prepare`\n * builds a layered `Image` (Dockerfile.box + the three agent static tarballs)\n * and registers it via `daytona.snapshot.create({ name, image })`, then pins\n * `box.image: <name>` into the project config.\n *\n * Replaces the old `agentbox daytona publish-snapshot` (which used the\n * broken `_experimental_createSnapshot` API).\n */\n\nimport { intro, log, spinner } from '@clack/prompts';\nimport { loadEffectiveConfig, setConfigValue } from '@agentbox/config';\nimport {\n DEFAULT_BOX_IMAGE,\n SHARED_CLAUDE_VOLUME,\n SHARED_CODEX_VOLUME,\n SHARED_OPENCODE_VOLUME,\n imageInfo,\n volumeExists,\n type ImageInfo,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { getProvider, isKnownProvider } from '../provider/registry.js';\n\ninterface PrepareOptions {\n provider?: string;\n name?: string;\n force?: boolean;\n yes?: boolean;\n status?: boolean;\n}\n\ninterface DockerStatus {\n daemon: 'reachable' | 'unreachable';\n image?: ImageInfo;\n volumes: Array<{ name: string; exists: boolean }>;\n}\n\nasync function dockerStatus(): Promise<DockerStatus> {\n let img: ImageInfo;\n try {\n img = await imageInfo(DEFAULT_BOX_IMAGE);\n } catch {\n return { daemon: 'unreachable', volumes: [] };\n }\n const names = [SHARED_CLAUDE_VOLUME, SHARED_CODEX_VOLUME, SHARED_OPENCODE_VOLUME];\n const volumes = await Promise.all(\n names.map(async (name) => ({ name, exists: await volumeExists(name).catch(() => false) })),\n );\n return { daemon: 'reachable', image: img, volumes };\n}\n\nfunction humanBytes(n?: number): string {\n if (n === undefined || !Number.isFinite(n)) return '—';\n if (n >= 1024 ** 3) return `${(n / 1024 ** 3).toFixed(2)} GB`;\n if (n >= 1024 ** 2) return `${(n / 1024 ** 2).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${String(n)} B`;\n}\n\nfunction humanAge(iso?: string): string {\n if (!iso) return '—';\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return iso;\n const ageSec = Math.max(0, (Date.now() - t) / 1000);\n if (ageSec < 60) return `${ageSec.toFixed(0)}s ago`;\n if (ageSec < 3600) return `${(ageSec / 60).toFixed(0)}m ago`;\n if (ageSec < 86400) return `${(ageSec / 3600).toFixed(1)}h ago`;\n return `${(ageSec / 86400).toFixed(1)}d ago`;\n}\n\nfunction pad(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\nasync function renderDocker(status: DockerStatus): Promise<string[]> {\n const out: string[] = ['docker:'];\n if (status.daemon === 'unreachable') {\n out.push(' docker daemon unreachable (is Docker running?)');\n return out;\n }\n if (!status.image?.exists) {\n out.push(` image ${DEFAULT_BOX_IMAGE} (not built — run \\`agentbox prepare --provider docker\\`)`);\n } else {\n out.push(\n ` image ${pad(DEFAULT_BOX_IMAGE, 30)} ${pad(humanBytes(status.image.sizeBytes), 10)} built ${humanAge(status.image.createdAt)}`,\n );\n }\n for (const v of status.volumes) {\n if (v.exists) {\n out.push(` vol ${pad(v.name, 30)} present`);\n } else {\n out.push(` vol ${pad(v.name, 30)} (none — seeded lazily on first \\`agentbox claude/codex/opencode\\`)`);\n }\n }\n return out;\n}\n\ninterface DaytonaStatusUnknown {\n configured: false;\n reason?: string;\n}\ninterface DaytonaStatusOk {\n configured: true;\n snapshots: Array<{ name: string; state?: string; sizeGb?: number; createdAt?: string; errorReason?: string }>;\n volumes: Array<{ name: string; state?: string; lastUsedAt?: string }>;\n reason?: string;\n}\ntype DaytonaStatusResult = DaytonaStatusUnknown | DaytonaStatusOk;\n\nasync function daytonaStatus(): Promise<DaytonaStatusResult> {\n try {\n const mod = await import('@agentbox/sandbox-daytona');\n return (await mod.getDaytonaStatus()) as DaytonaStatusResult;\n } catch (err) {\n return { configured: false, reason: err instanceof Error ? err.message.split('\\n')[0] : String(err) };\n }\n}\n\nfunction renderDaytona(status: DaytonaStatusResult, pinnedImage?: string): string[] {\n const out: string[] = ['daytona:'];\n if (!status.configured) {\n out.push(\n ` (not configured — \\`agentbox daytona login\\` to set up${status.reason ? `; ${status.reason}` : ''})`,\n );\n return out;\n }\n if (status.reason) out.push(` warn: ${status.reason}`);\n if (status.snapshots.length === 0) {\n out.push(' no agentbox snapshots — run `agentbox prepare --provider daytona`');\n } else {\n for (const s of status.snapshots) {\n const sizeStr = s.sizeGb !== undefined ? `${s.sizeGb.toFixed(2)} GB` : '—';\n const pinned = pinnedImage && pinnedImage === s.name ? ' (pinned in project)' : '';\n const tail =\n s.state === 'error' && s.errorReason\n ? ` error: ${s.errorReason.slice(0, 80)}`\n : ` ${humanAge(s.createdAt)}`;\n out.push(\n ` snap ${pad(s.name, 40)} ${pad(s.state ?? '—', 10)} ${pad(sizeStr, 10)}${tail}${pinned}`,\n );\n }\n }\n if (status.volumes.length === 0) {\n out.push(' no agentbox volumes — created lazily on first cloud `agentbox create`');\n } else {\n for (const v of status.volumes) {\n const last = v.lastUsedAt ? ` last used ${humanAge(v.lastUsedAt)}` : '';\n out.push(` vol ${pad(v.name, 40)} ${pad(v.state ?? '—', 10)}${last}`);\n }\n }\n return out;\n}\n\nasync function showStatus(opts: { onlyProvider?: string }): Promise<void> {\n const cfg = await loadEffectiveConfig(process.cwd()).catch(() => null);\n const pinnedRaw = cfg?.effective.box.image;\n // Only treat as \"user-pinned\" if it differs from the docker default tag\n // — that one is just the fallback ref the docker provider builds locally.\n const pinned =\n typeof pinnedRaw === 'string' && pinnedRaw.length > 0 && pinnedRaw !== DEFAULT_BOX_IMAGE\n ? pinnedRaw\n : undefined;\n const lines: string[] = [];\n\n const wantDocker = !opts.onlyProvider || opts.onlyProvider === 'docker';\n const wantDaytona = !opts.onlyProvider || opts.onlyProvider === 'daytona';\n\n if (wantDocker) {\n const status = await dockerStatus();\n lines.push(...(await renderDocker(status)));\n }\n if (wantDaytona) {\n if (lines.length > 0) lines.push('');\n const status = await daytonaStatus();\n lines.push(...renderDaytona(status, pinned));\n }\n if (pinned) {\n lines.push('');\n lines.push(`project pin: box.image = ${pinned}`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nexport const prepareCommand = new Command('prepare')\n .description(\n 'Build base sandbox images / snapshots, or show what is already prepared across providers.',\n )\n .option(\n '-p, --provider <name>',\n 'provider to prepare (docker | daytona | hetzner | vercel). Omit for status-only.',\n )\n .option(\n '-n, --name <name>',\n 'snapshot name (Daytona only; default: agentbox-base-<timestamp>)',\n )\n .option('-f, --force', 'rebuild even if the image / snapshot already exists')\n .option('-y, --yes', 'skip confirmation prompts (cost / time warnings)')\n .option('--status', 'show status without preparing anything')\n .action(async (opts: PrepareOptions) => {\n // Status-only path: no provider, or explicit --status.\n if (!opts.provider || opts.status) {\n await showStatus({});\n return;\n }\n\n const providerName = opts.provider.trim();\n if (!isKnownProvider(providerName)) {\n process.stderr.write(\n `error: --provider must be one of: docker, daytona, hetzner\\n`,\n );\n process.exit(1);\n }\n\n intro(`preparing ${providerName} base image`);\n if (providerName === 'daytona' && !opts.yes && process.stdin.isTTY) {\n process.stdout.write(\n 'This will trigger a Daytona image build (~7 min cold, ~seconds with cache) and ' +\n 'register a named snapshot in your org.\\n' +\n 'Re-run with --yes to skip this notice.\\n',\n );\n }\n\n const provider = await getProvider(providerName);\n if (typeof provider.prepare !== 'function') {\n log.error(`provider '${providerName}' does not implement prepare`);\n process.exit(1);\n }\n\n const sp = spinner();\n sp.start(`preparing ${providerName}…`);\n try {\n const result = await provider.prepare({\n name: opts.name,\n hostWorkspace: process.cwd(),\n force: opts.force,\n onLog: (line) => sp.message(line.slice(0, 80)),\n });\n if (result.snapshotName !== undefined) {\n sp.stop(`prepared ${providerName}: snapshot '${result.snapshotName}'`);\n try {\n const written = await setConfigValue(\n 'project',\n 'box.image',\n result.snapshotName,\n process.cwd(),\n );\n log.success(`box.image = ${result.snapshotName} (written to ${written.path})`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n log.warn(\n `prepared snapshot '${result.snapshotName}', but failed to pin it into the project config: ${msg}\\n` +\n `Run \\`agentbox config set --project box.image ${result.snapshotName}\\` manually.`,\n );\n }\n } else {\n sp.stop(`prepared ${providerName}`);\n }\n\n // Show the relevant status section after a successful prepare.\n process.stdout.write('\\n');\n await showStatus({ onlyProvider: providerName });\n log.info(\n 'tip: install the agentbox host skill so Claude Code on this machine can drive AgentBox for you:\\n' +\n ' npx skills add https://github.com/madarco/agentbox --skill agentbox',\n );\n } catch (err) {\n sp.stop(`prepare failed: ${describeError(err)}`);\n process.exit(1);\n }\n });\n\n/**\n * Unwrap the cause chain on Error objects so opaque wrappers like Node's\n * `TypeError: fetch failed` (whose `.message` carries zero context but\n * whose `.cause` is e.g. `{ code: 'ECONNREFUSED', address, port }`)\n * surface the real reason in the CLI's one-line failure message.\n */\nfunction describeError(err: unknown): string {\n if (!(err instanceof Error)) return String(err);\n const parts: string[] = [err.message];\n let cause: unknown = (err as Error & { cause?: unknown }).cause;\n // Bound the walk so a cyclic / pathological cause chain can't OOM.\n for (let i = 0; i < 5 && cause; i++) {\n if (cause instanceof Error) {\n parts.push(`caused by: ${cause.message}`);\n const code = (cause as Error & { code?: unknown }).code;\n if (typeof code === 'string') parts.push(`(${code})`);\n cause = (cause as Error & { cause?: unknown }).cause;\n } else if (typeof cause === 'object') {\n parts.push(`caused by: ${JSON.stringify(cause)}`);\n break;\n } else {\n parts.push(`caused by: ${String(cause)}`);\n break;\n }\n }\n return parts.join(' — ');\n}\n","import { confirm, isCancel, log } from '@clack/prompts';\nimport { pruneOrphanProjectConfigs } from '@agentbox/config';\nimport type { CloudBackend, CloudSandboxSummary } from '@agentbox/core';\nimport { readState } from '@agentbox/sandbox-core';\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 provider?: string;\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 .option(\n '--provider <name>',\n 'restrict prune to a specific provider (docker | daytona | hetzner | vercel). For cloud providers, lists sandboxes that are not in this CLI\\'s state.json and offers to delete them.',\n )\n .action(async (opts: PruneOptions) => {\n try {\n if (opts.provider !== undefined && isCloudPruneProvider(opts.provider)) {\n await pruneCloud(opts.provider, opts);\n return;\n }\n if (opts.provider !== undefined && opts.provider !== 'docker') {\n log.error(`unknown provider '${opts.provider}'; expected docker, daytona, hetzner, or vercel`);\n process.exit(2);\n }\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\n/** Cloud providers whose orphan sandboxes `prune --provider <p>` can enumerate + delete. */\nconst CLOUD_PRUNE_PROVIDERS = ['daytona', 'hetzner', 'vercel'] as const;\ntype CloudPruneProvider = (typeof CLOUD_PRUNE_PROVIDERS)[number];\n\nfunction isCloudPruneProvider(name: string): name is CloudPruneProvider {\n return (CLOUD_PRUNE_PROVIDERS as readonly string[]).includes(name);\n}\n\n/** Lazily resolve a cloud backend (dynamic import keeps provider SDKs out of the hot path). */\nasync function cloudBackendFor(provider: CloudPruneProvider): Promise<CloudBackend> {\n switch (provider) {\n case 'daytona':\n return (await import('@agentbox/sandbox-daytona')).daytonaBackend;\n case 'hetzner':\n return (await import('@agentbox/sandbox-hetzner')).hetznerBackend;\n case 'vercel':\n return (await import('@agentbox/sandbox-vercel')).vercelBackend;\n }\n}\n\n/**\n * Cloud orphan-sandbox prune. Lists every sandbox the configured credentials\n * can see, cross-references against this CLI's local `state.json`, and offers\n * to delete the ones the user no longer tracks (typically: a harness timeout\n * killed the create before `recordBox` ran, leaving a half-provisioned\n * billable sandbox lingering).\n *\n * Read-only without `--yes`: prints the orphan list and confirms before\n * deleting. With `--dry-run`, only prints.\n */\nasync function pruneCloud(provider: CloudPruneProvider, opts: PruneOptions): Promise<void> {\n const dryRun = opts.dryRun ?? false;\n const backend = await cloudBackendFor(provider);\n if (!backend.list) {\n log.error(`${provider} backend doesn't expose \\`list()\\`; cannot enumerate sandboxes for prune`);\n process.exit(2);\n }\n const [remote, state] = await Promise.all([backend.list(), readState()]);\n const knownIds = new Set<string>();\n for (const b of state.boxes) {\n if ((b.provider ?? 'docker') === provider && b.cloud?.sandboxId) {\n knownIds.add(b.cloud.sandboxId);\n }\n }\n // Anything we created (labelled by us via `tags: { 'agentbox.name': ... }`)\n // but isn't in state is an orphan we should offer to clean up. Sandboxes\n // the user provisioned through other tooling shouldn't be touched — identify\n // ours by the presence of a friendly name (`summary.name` mirrors that tag).\n const orphans: CloudSandboxSummary[] = remote.filter((sb) => {\n if (knownIds.has(sb.sandboxId)) return false;\n const friendly = sb.name ?? '';\n return friendly.length > 0;\n });\n if (orphans.length === 0) {\n process.stdout.write(`no ${provider} orphans found\\n`);\n return;\n }\n log.info(`found ${String(orphans.length)} ${provider} sandbox(es) not in this CLI's state:`);\n for (const sb of orphans) {\n const parts = [sb.sandboxId];\n if (sb.name) parts.push(sb.name);\n if (sb.state) parts.push(sb.state);\n if (sb.createdAt) parts.push(sb.createdAt);\n process.stdout.write(` ${parts.join(' ')}\\n`);\n }\n if (dryRun) return;\n if (!opts.yes) {\n const ok = await confirm({\n message: `Delete ${String(orphans.length)} orphan sandbox(es)?`,\n initialValue: false,\n });\n if (isCancel(ok) || !ok) {\n log.info('cancelled');\n return;\n }\n }\n let deleted = 0;\n let failed = 0;\n for (const sb of orphans) {\n try {\n await backend.destroy({ sandboxId: sb.sandboxId });\n deleted++;\n } catch (err) {\n failed++;\n log.warn(\n `delete ${sb.sandboxId} failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n process.stdout.write(\n `${provider} prune: deleted ${String(deleted)}, failed ${String(failed)}\\n`,\n );\n}\n","import { readFile, stat } from 'node:fs/promises';\nimport { intro, log, outro } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { readState } from '@agentbox/sandbox-core';\nimport {\n deleteJob,\n loadQueue,\n loadQueueConfig,\n readJob,\n writeJob,\n type QueueJob,\n type QueueJobStatus,\n} from '@agentbox/relay';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\n\ninterface QueueListOpts {\n all?: boolean;\n}\n\nconst TERMINAL_STATUSES: ReadonlySet<QueueJobStatus> = new Set(['done', 'failed', 'cancelled']);\n\nexport const queueCommand = new Command('queue')\n .description('Inspect and manage background `agentbox claude|codex|opencode -i` jobs');\n\nconst queueListCommand = new Command('list')\n .description('List queued, running, and (with --all) terminal background jobs')\n .option('--all', 'include done/failed/cancelled jobs (default: hide terminal)')\n .action(async (opts: QueueListOpts) => {\n const jobs = await loadQueue();\n const cfg = await loadQueueConfig();\n const visible = opts.all === true ? jobs : jobs.filter((j) => !TERMINAL_STATUSES.has(j.status));\n if (visible.length === 0) {\n log.info(opts.all ? 'no queued jobs.' : 'no active queued jobs (--all to see terminal).');\n log.info(`queue.maxConcurrent = ${String(cfg.maxConcurrent)} (queue.enabled=${String(cfg.enabled)})`);\n return;\n }\n // Build a compact ASCII table; one row per job. Keep columns predictable so\n // it greps cleanly (id is the unique handle for cancel/show).\n const rows = visible.map((j) => ({\n id: j.id,\n status: j.status,\n agent: j.agent,\n box: j.boxName || '(auto)',\n provider: j.providerName,\n max: String(j.maxConcurrent),\n age: formatAge(j.createdAt),\n prompt: truncate(j.prompt, 48),\n }));\n const headers = ['id', 'status', 'agent', 'box', 'provider', 'max', 'age', 'prompt'] as const;\n const widths = headers.map((h) =>\n Math.max(h.length, ...rows.map((r) => String(r[h as keyof typeof r]).length)),\n );\n const pad = (s: string, w: number): string => s + ' '.repeat(Math.max(0, w - s.length));\n process.stdout.write(headers.map((h, i) => pad(h, widths[i]!)).join(' ') + '\\n');\n process.stdout.write(widths.map((w) => '-'.repeat(w)).join(' ') + '\\n');\n for (const r of rows) {\n process.stdout.write(\n headers.map((h, i) => pad(String(r[h as keyof typeof r]), widths[i]!)).join(' ') + '\\n',\n );\n }\n log.info(`queue.maxConcurrent = ${String(cfg.maxConcurrent)} (queue.enabled=${String(cfg.enabled)})`);\n });\n\nconst queueShowCommand = new Command('show')\n .description('Dump a job manifest and tail its log')\n .argument('<id>', 'queue job id (from `agentbox queue list`)')\n .option('--tail <n>', 'lines of log to print (default: 50)', '50')\n .action(async (id: string, opts: { tail: string }) => {\n const job = await readJob(id);\n if (!job) {\n log.error(`no job with id ${id}`);\n process.exit(1);\n }\n process.stdout.write(JSON.stringify(job, null, 2) + '\\n');\n const tailN = Number.parseInt(opts.tail, 10) || 50;\n try {\n await stat(job.logPath);\n const text = await readFile(job.logPath, 'utf8');\n const lines = text.split(/\\r?\\n/);\n const slice = lines.slice(Math.max(0, lines.length - tailN - 1));\n process.stdout.write(`\\n--- last ${String(tailN)} lines of ${job.logPath} ---\\n`);\n process.stdout.write(slice.join('\\n'));\n if (!slice.join('\\n').endsWith('\\n')) process.stdout.write('\\n');\n } catch {\n log.info(`(no log at ${job.logPath} yet)`);\n }\n });\n\nconst queueCancelCommand = new Command('cancel')\n .description('Cancel a queued job; running jobs are NOT killed — use `agentbox destroy` instead')\n .argument('<id>', 'queue job id (from `agentbox queue list`)')\n .action(async (id: string) => {\n intro(`Cancelling queue job ${id}...`);\n const job = await readJob(id);\n if (!job) {\n log.error(`no job with id ${id}`);\n process.exit(1);\n }\n if (job.status !== 'queued') {\n log.error(\n `job ${id} is ${job.status}; cancel only flips 'queued' → 'cancelled'.` +\n (job.status === 'running' ? ` Use 'agentbox destroy ${job.boxName || id}' to stop the box.` : ''),\n );\n process.exit(1);\n }\n const cancelled: QueueJob = {\n ...job,\n status: 'cancelled',\n finishedAt: new Date().toISOString(),\n reason: 'cancelled by user',\n };\n await writeJob(cancelled);\n outro(`job ${id} cancelled`);\n });\n\nconst queueClearCommand = new Command('clear')\n .description('Sweep terminal-state manifests from ~/.agentbox/queue/')\n .option('--done', 'remove done jobs')\n .option('--failed', 'remove failed jobs')\n .option('--cancelled', 'remove cancelled jobs')\n .option('--all', 'remove every terminal-state job (done + failed + cancelled)')\n .action(async (opts: { done?: boolean; failed?: boolean; cancelled?: boolean; all?: boolean }) => {\n const targets = new Set<QueueJobStatus>();\n if (opts.all === true || opts.done === true) targets.add('done');\n if (opts.all === true || opts.failed === true) targets.add('failed');\n if (opts.all === true || opts.cancelled === true) targets.add('cancelled');\n if (targets.size === 0) {\n log.error('pick at least one of: --done, --failed, --cancelled, --all');\n process.exit(2);\n }\n const jobs = await loadQueue();\n let removed = 0;\n for (const j of jobs) {\n if (!targets.has(j.status)) continue;\n await deleteJob(j.id);\n removed += 1;\n }\n log.success(`removed ${String(removed)} manifest${removed === 1 ? '' : 's'}`);\n });\n\nconst QUEUE_WAIT_EVENTS = [\n 'new-box',\n 'empty-queue',\n 'box-paused',\n 'box-running',\n 'box-stopped',\n 'job-done',\n] as const;\ntype QueueWaitEvent = (typeof QUEUE_WAIT_EVENTS)[number];\n\nconst ACTIVE_JOB_STATUSES: ReadonlySet<QueueJobStatus> = new Set(['queued', 'running']);\nconst DEFAULT_QUEUE_WAIT_TIMEOUT_MS = 10 * 60 * 1000;\nconst QUEUE_POLL_INTERVAL_MS = 500;\n\ninterface QueueWaitOpts {\n box?: string;\n job?: string;\n timeout?: string;\n json?: boolean;\n}\n\nconst queueWaitForCommand = new Command('wait-for')\n .description(\n `Block until a queue / box event fires. <event> one of: ${QUEUE_WAIT_EVENTS.join(' | ')}.`,\n )\n .argument('<event>', `target event: ${QUEUE_WAIT_EVENTS.join(' | ')}`)\n .option('--box <ref>', 'box ref (required for box-paused / box-running / box-stopped)')\n .option('--job <id>', 'queue job id (required for job-done)')\n .option('--timeout <ms>', `wall-clock cap (default: ${String(DEFAULT_QUEUE_WAIT_TIMEOUT_MS)})`)\n .option('--json', 'emit a JSON envelope { matched, elapsedMs, ... }')\n .action(async (eventRaw: string, opts: QueueWaitOpts) => {\n if (!QUEUE_WAIT_EVENTS.includes(eventRaw as QueueWaitEvent)) {\n log.error(`unknown event '${eventRaw}' (one of: ${QUEUE_WAIT_EVENTS.join(', ')})`);\n process.exit(2);\n }\n const event = eventRaw as QueueWaitEvent;\n const timeoutMs =\n opts.timeout !== undefined\n ? parsePositiveInt(opts.timeout, '--timeout')\n : DEFAULT_QUEUE_WAIT_TIMEOUT_MS;\n const start = Date.now();\n const deadline = start + timeoutMs;\n\n try {\n const match = await waitForQueueEvent(event, opts, deadline);\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(JSON.stringify({ matched: true, event, elapsedMs, ...match }) + '\\n');\n }\n return;\n } catch (err) {\n if (err instanceof QueueWaitTimeout) {\n const elapsedMs = Date.now() - start;\n if (opts.json === true) {\n process.stdout.write(JSON.stringify({ matched: false, event, elapsedMs }) + '\\n');\n } else {\n log.error(`'${event}' did not occur within ${String(timeoutMs)}ms`);\n }\n process.exit(1);\n }\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nclass QueueWaitTimeout extends Error {\n constructor() {\n super('queue wait-for timeout');\n this.name = 'QueueWaitTimeout';\n }\n}\n\nasync function waitForQueueEvent(\n event: QueueWaitEvent,\n opts: QueueWaitOpts,\n deadline: number,\n): Promise<Record<string, unknown>> {\n if (event === 'empty-queue') {\n return pollUntil(deadline, async () => {\n const jobs = await loadQueue();\n const active = jobs.filter((j) => ACTIVE_JOB_STATUSES.has(j.status));\n return active.length === 0 ? { activeCount: 0 } : undefined;\n });\n }\n\n if (event === 'new-box') {\n const initial = new Set((await readState()).boxes.map((b) => b.id));\n return pollUntil(deadline, async () => {\n const current = await readState();\n const fresh = current.boxes.find((b) => !initial.has(b.id));\n return fresh ? { boxId: fresh.id, boxName: fresh.name } : undefined;\n });\n }\n\n if (event === 'job-done') {\n if (!opts.job) {\n throw new Error('queue wait-for job-done requires --job <id>');\n }\n const jobId = opts.job;\n return pollUntil(deadline, async () => {\n const job = await readJob(jobId);\n if (!job) throw new Error(`no job with id ${jobId}`);\n const terminal: ReadonlySet<QueueJobStatus> = new Set(['done', 'failed', 'cancelled']);\n return terminal.has(job.status)\n ? { jobId: job.id, status: job.status, exitCode: job.exitCode ?? null }\n : undefined;\n });\n }\n\n // box-paused | box-running | box-stopped\n if (!opts.box) {\n throw new Error(`queue wait-for ${event} requires --box <ref>`);\n }\n const box = await resolveBoxOrExit(opts.box);\n const provider = await providerForBox(box);\n const targetMap: Record<'box-paused' | 'box-running' | 'box-stopped', readonly string[]> = {\n 'box-paused': ['paused'],\n 'box-running': ['running'],\n 'box-stopped': ['stopped', 'missing'],\n };\n const targets = new Set(targetMap[event]);\n return pollUntil(deadline, async () => {\n const state = await provider.probeState(box);\n return targets.has(state) ? { boxId: box.id, state } : undefined;\n });\n}\n\nasync function pollUntil<T>(\n deadline: number,\n probe: () => Promise<T | undefined>,\n): Promise<T> {\n while (Date.now() < deadline) {\n const result = await probe();\n if (result !== undefined) return result;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(QUEUE_POLL_INTERVAL_MS, remaining));\n }\n throw new QueueWaitTimeout();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction parsePositiveInt(raw: string, label: string): number {\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0 || String(n) !== raw.trim()) {\n throw new Error(`${label} must be a positive integer (got: ${raw})`);\n }\n return n;\n}\n\nqueueCommand.addCommand(queueListCommand);\nqueueCommand.addCommand(queueShowCommand);\nqueueCommand.addCommand(queueCancelCommand);\nqueueCommand.addCommand(queueClearCommand);\nqueueCommand.addCommand(queueWaitForCommand);\n\nfunction formatAge(iso: string): string {\n const ms = Date.now() - Date.parse(iso);\n if (!Number.isFinite(ms) || ms < 0) return '?';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${String(s)}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${String(m)}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${String(h)}h`;\n const d = Math.floor(h / 24);\n return `${String(d)}d`;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n}\n","import { log, spinner } from '@clack/prompts';\nimport {\n ensureRelay,\n getRelayStatus,\n rehydrateRelayRegistry,\n stopRelay,\n type RelayStatus,\n} from '@agentbox/sandbox-docker';\nimport { readState } from '@agentbox/sandbox-core';\nimport { Command } from 'commander';\nimport { handleLifecycleError } from './_errors.js';\n\n/**\n * After a fresh relay process starts (cold start or restart), it has no\n * in-memory box registry — and for cloud boxes that means no `CloudBoxPoller`\n * is running. Re-push every persisted (id, token, kind, preview…) so the\n * relay regains the same registry it had before the restart. Lifts the\n * cloud poller back up so status push + git push resume seamlessly.\n */\nasync function rehydrateFromState(): Promise<void> {\n const state = await readState();\n await rehydrateRelayRegistry(\n state.boxes.map((b) => ({\n id: b.id,\n name: b.name,\n provider: b.provider,\n container: b.container,\n createdAt: b.createdAt,\n relayToken: b.relayToken,\n projectIndex: b.projectIndex,\n gitWorktrees: b.gitWorktrees,\n cloudBackend: b.cloud?.backend,\n relayPreviewUrl: b.cloud?.relayPreviewUrl,\n relayPreviewToken: b.cloud?.relayPreviewToken,\n bridgeToken: b.cloud?.bridgeToken,\n })),\n );\n}\n\ninterface StatusOpts {\n json?: boolean;\n}\n\nfunction renderStatus(s: RelayStatus): string {\n if (s.running && s.health) {\n return [\n 'relay: running',\n ` pid: ${s.pid === null ? '?' : String(s.pid)}`,\n ` port: ${String(s.port)}`,\n ` url: ${s.endpoint.hostUrl}`,\n ` boxes: ${String(s.health.boxes)}`,\n ` events: ${String(s.health.events)}`,\n ` log: ${s.logFile}`,\n ].join('\\n');\n }\n if (s.pidAlive) {\n return [\n `relay: not responding (pid ${String(s.pid)} alive but /healthz silent)`,\n ` log: ${s.logFile}`,\n ].join('\\n');\n }\n return ['relay: not running', ` log: ${s.logFile}`].join('\\n');\n}\n\nconst statusSub = new Command('status')\n .description('Show whether the host relay is running, with pid / port / box count')\n .option('--json', 'emit RelayStatus as JSON')\n .action(async (opts: StatusOpts) => {\n try {\n const s = await getRelayStatus();\n if (opts.json) {\n process.stdout.write(JSON.stringify(s, null, 2) + '\\n');\n return;\n }\n process.stdout.write(renderStatus(s) + '\\n');\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst stopSub = new Command('stop')\n .description('Stop the host relay process (idempotent)')\n .action(async () => {\n try {\n const s = spinner();\n s.start('stopping relay');\n const result = await stopRelay();\n s.stop(\n result.stopped\n ? `stopped relay (pid ${String(result.pid)})`\n : 'relay was not running',\n );\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst startSub = new Command('start')\n .description('Start the host relay if not already running (idempotent)')\n .action(async () => {\n try {\n const s = spinner();\n s.start('starting relay');\n const ep = await ensureRelay();\n await rehydrateFromState();\n s.stop(`relay running on ${ep.hostUrl}`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst restartSub = new Command('restart')\n .description('Stop then start the host relay')\n .action(async () => {\n try {\n const s = spinner();\n s.start('stopping relay');\n const stopped = await stopRelay();\n s.stop(\n stopped.stopped\n ? `stopped relay (pid ${String(stopped.pid)})`\n : 'relay was not running',\n );\n const s2 = spinner();\n s2.start('starting relay');\n try {\n const ep = await ensureRelay();\n await rehydrateFromState();\n s2.stop(`relay running on ${ep.hostUrl}`);\n } catch (err) {\n s2.stop('relay start failed');\n log.warn(err instanceof Error ? err.message : String(err));\n throw err;\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nexport const relayCommand = new Command('relay')\n .description('Manage the host relay process (status / stop / start / restart)')\n .addCommand(statusSub, { isDefault: true })\n .addCommand(stopSub)\n .addCommand(startSub)\n .addCommand(restartSub);\n","/**\n * Internal worker the relay's queue loop spawns as a detached child to run a\n * queued `-i` job. Hidden from `--help`. Reads a queue manifest by id, runs\n * the same `createBox` + `startXxxSession` codepath the foreground claude /\n * codex / opencode commands run in non-`-i` mode, then exits when tmux is up.\n * **Never** attaches — the in-box session keeps running for the user to\n * re-attach later.\n */\n\nimport { Command } from 'commander';\nimport {\n findProjectRoot,\n loadEffectiveConfig,\n resolveDefaultCheckpoint,\n type UserConfig,\n} from '@agentbox/config';\nimport {\n createBox,\n rebuildPluginNativeDeps,\n SHARED_CLAUDE_VOLUME,\n startClaudeSession,\n startCodexSession,\n startOpencodeSession,\n ensureCodexInstalled,\n ensureOpencodeInstalled,\n} from '@agentbox/sandbox-docker';\nimport { readJob, writeJob, type QueueAgentKind, type QueueJob } from '@agentbox/relay';\nimport { resolveClaudeAuth } from '../auth.js';\nimport { resolveLimits } from '../limits.js';\nimport { openCommandLog } from '../lib/log-file.js';\nimport { buildPromptArgs } from '../lib/queue/build-prompt-args.js';\n\nexport const runQueuedJobCommand = new Command('_run-queued-job')\n .description('internal: run a queued background agent job (do not invoke directly)')\n .argument('<id>', 'queue job id (from ~/.agentbox/queue/<id>.json)')\n .action(async (id: string) => {\n const log = openCommandLog(`queue-${id}`);\n log.write(`worker pid=${String(process.pid)} starting for job ${id}`);\n let job: QueueJob | null = null;\n try {\n job = await readJob(id);\n if (!job) {\n log.write(`FATAL: no manifest at id=${id}`);\n log.close();\n process.exit(64);\n }\n // The relay loop already flipped status to `running` and stamped its\n // pid; we don't double-stamp. If a future caller invokes this command\n // manually we still run, but the relay's accounting will be off — that\n // is the user's problem (and exactly why this command is hidden).\n\n // Run the create + session path. Cloud paths are intentionally NOT\n // supported here (the cloud agent attach starts the tmux session lazily\n // on first attach; with no attach there's nowhere to seed the prompt).\n // The submit-side already rejected cloud in that case.\n // The worker records boxId on the outer `job` the instant the box is\n // created (via onBoxCreated), so the catch block below preserves the\n // box attribution even if the session start throws afterwards.\n await runDockerJob(job, log, (boxId) => {\n if (job) job = { ...job, boxId };\n });\n\n const done: QueueJob = {\n ...job,\n status: 'done',\n finishedAt: new Date().toISOString(),\n exitCode: 0,\n };\n await writeJob(done);\n log.write(`done`);\n log.close();\n process.exit(0);\n } catch (err) {\n const msg = err instanceof Error ? (err.stack ?? err.message) : String(err);\n log.write(`FAIL: ${msg}`);\n if (job) {\n try {\n const failed: QueueJob = {\n ...job,\n status: 'failed',\n finishedAt: new Date().toISOString(),\n reason: err instanceof Error ? err.message : String(err),\n exitCode: 1,\n };\n await writeJob(failed);\n } catch {\n /* best-effort */\n }\n }\n log.close();\n process.exit(1);\n }\n });\n\nasync function runDockerJob(\n job: QueueJob,\n log: ReturnType<typeof openCommandLog>,\n onBoxCreated: (boxId: string) => void,\n): Promise<void> {\n const opts = job.createOpts;\n const cfg = await loadEffectiveConfig(opts.workspace, {\n cliOverrides: buildOverridesFromJob(job),\n });\n const projectRoot = (await findProjectRoot(opts.workspace)).root;\n const providerName = job.providerName || cfg.effective.box.provider || 'docker';\n if (providerName !== 'docker') {\n throw new Error(`worker only supports docker provider (got \"${providerName}\")`);\n }\n const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);\n const checkpointRef =\n opts.snapshot && opts.snapshot.length > 0\n ? opts.snapshot\n : providerDefault.length > 0\n ? providerDefault\n : undefined;\n\n const useSnapshot =\n opts.hostSnapshot === false\n ? false\n : opts.hostSnapshot === true\n ? true\n : (cfg.effective.box.hostSnapshot ?? false);\n\n // Auth resolution mirrors the foreground claude path; codex/opencode don't\n // need a host-env probe (they ride the in-box volume that login seeded).\n const resolved =\n job.agent === 'claude-code' ? await resolveClaudeAuth(process.env) : null;\n\n // browser.default = 'playwright' | 'both' implies installing playwright\n // even if box.withPlaywright wasn't explicitly set.\n const withPlaywright =\n cfg.effective.box.withPlaywright || cfg.effective.browser.default !== 'agent-browser';\n\n log.write(`creating box for agent=${job.agent}`);\n const result = await createBox({\n workspacePath: opts.workspace,\n name: opts.name && opts.name.length > 0 ? opts.name : undefined,\n useSnapshot,\n checkpointRef,\n image: cfg.effective.box.image,\n claudeConfig:\n job.agent === 'claude-code'\n ? { isolate: cfg.effective.box.isolateClaudeConfig }\n : undefined,\n codexConfig:\n job.agent === 'codex'\n ? { isolate: cfg.effective.box.isolateCodexConfig }\n : undefined,\n opencodeConfig:\n job.agent === 'opencode'\n ? { isolate: cfg.effective.box.isolateOpencodeConfig }\n : undefined,\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 // Background jobs do not negotiate Portless interactively. If the user\n // explicitly set --portless / --no-portless we honor it, else leave\n // undefined so the create path skips the live prompt.\n portless: opts.portless,\n portlessStateDir: cfg.effective.portless.stateDir || undefined,\n limits: resolveLimits(cfg.effective.box, opts),\n projectRoot,\n onLog: (line) => log.write(line),\n });\n log.write(`box created: ${result.record.container}`);\n\n // Record the box id on the manifest (and propagate it to the caller) so the\n // relay's working-agent counter can join this running job to its live box\n // status, and stop counting the in-flight startup slot once the box has\n // registered. Written before the session starts so a crash mid-launch is\n // still attributable to a box.\n onBoxCreated(result.record.id);\n await writeJob({ ...job, boxId: result.record.id });\n\n const promptedArgs = buildPromptArgs(job.agent, job.prompt, job.agentArgs);\n\n if (job.agent === 'claude-code') {\n log.write(`checking plugin native deps`);\n await rebuildPluginNativeDeps(result.record.container, {\n volume: result.record.claudeConfigVolume ?? SHARED_CLAUDE_VOLUME,\n onProgress: (line) => log.write(line),\n });\n log.write(`starting claude session`);\n await startClaudeSession({\n container: result.record.container,\n claudeArgs: promptedArgs,\n sessionName: cfg.effective.claude.sessionName,\n boxName: result.record.name,\n });\n } else if (job.agent === 'codex') {\n log.write(`checking codex`);\n await ensureCodexInstalled(result.record.container, {\n onProgress: (line) => log.write(line),\n });\n log.write(`starting codex session`);\n await startCodexSession({\n container: result.record.container,\n codexArgs: promptedArgs,\n sessionName: cfg.effective.codex.sessionName,\n });\n } else if (job.agent === 'opencode') {\n log.write(`checking opencode`);\n await ensureOpencodeInstalled(result.record.container, {\n onProgress: (line) => log.write(line),\n });\n log.write(`starting opencode session`);\n await startOpencodeSession({\n container: result.record.container,\n opencodeArgs: promptedArgs,\n sessionName: cfg.effective.opencode.sessionName,\n });\n } else {\n throw new Error(`unknown agent kind: ${String(job.agent satisfies QueueAgentKind)}`);\n }\n}\n\nfunction buildOverridesFromJob(job: QueueJob): Partial<UserConfig> {\n const opts = job.createOpts;\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 const out: Partial<UserConfig> = {};\n if (Object.keys(box).length > 0) out.box = box;\n if (opts.portless !== undefined) out.portless = { enabled: opts.portless };\n if (opts.sessionName !== undefined) {\n if (job.agent === 'claude-code') out.claude = { sessionName: opts.sessionName };\n else if (job.agent === 'codex') out.codex = { sessionName: opts.sessionName };\n else if (job.agent === 'opencode') out.opencode = { sessionName: opts.sessionName };\n }\n return out;\n}\n","import { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n buildVncUrls,\n detectEngine,\n ensureBoxBrowser,\n inspectBox,\n readBoxStatus,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface ScreenOptions {\n print?: boolean;\n loopback?: boolean;\n ttl?: string;\n}\n\n/** Daytona's signed-URL ceiling is 24h; mirror `agentbox url`'s clamp. */\nconst SIGNED_URL_TTL_MIN = 1;\nconst SIGNED_URL_TTL_MAX = 86400;\n\nfunction parseTtlOrExit(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < SIGNED_URL_TTL_MIN || n > SIGNED_URL_TTL_MAX) {\n throw new Error(\n `--ttl must be an integer between ${String(SIGNED_URL_TTL_MIN)} and ${String(SIGNED_URL_TTL_MAX)} seconds`,\n );\n }\n return n;\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', 'docker only: use the 127.0.0.1 URL instead of the OrbStack .orb.local URL')\n .option(\n '--ttl <seconds>',\n 'cloud only: signed-URL expiry in seconds (default 3600, max 86400)',\n )\n .action(async (idOrName: string | undefined, opts: ScreenOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const provider = box.provider ?? 'docker';\n\n if (!box.vncEnabled) {\n throw new Error(`VNC is disabled for box ${box.name} — recreate without \\`--no-vnc\\``);\n }\n\n let url: string;\n if (provider === 'docker') {\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');\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 // Point the in-box browser at the box's web service so the app is shown\n // *inside* the VNC desktop (the host browser only gets the noVNC viewer).\n // Prefer the Portless URL — `ensureBoxBrowser` routes it back out to the\n // host proxy, so the app loads on the exact URL the host browser uses\n // (one origin both sides). Fall back to the in-box `127.0.0.1:<port>` when\n // there's no Portless route; a neutral page when no web service at all.\n const persisted = await readBoxStatus(box);\n const exposePort = persisted?.services.find((s) => s.expose)?.expose?.port;\n const inBoxUrl =\n exposePort !== undefined\n ? (box.portlessUrl ?? `http://localhost:${String(exposePort)}`)\n : 'about:blank';\n\n const br = await ensureBoxBrowser(box.container, undefined, inBoxUrl);\n if (br.up && !br.alreadyRunning) {\n log.info(\n exposePort !== undefined\n ? `opened ${inBoxUrl} in the in-box browser (visible in the VNC view)`\n : 'started in-box browser',\n );\n } else if (br.alreadyRunning) {\n log.info('in-box browser already running; left it untouched');\n } else {\n log.warn(`could not start in-box browser: ${br.reason ?? 'unknown'}`);\n }\n\n const engine = await detectEngine();\n const urls = buildVncUrls(box, engine);\n // Preference when --loopback is off: portless > orb.local > loopback.\n // Portless gives a stable name across box restarts (loopback port\n // rerolls every `docker run`); orb.local is OrbStack-only; loopback is\n // the always-available fallback. `--loopback` forces the raw port.\n const resolved = opts.loopback\n ? urls.loopbackUrl\n : (urls.portlessUrl ?? urls.orbUrl ?? urls.loopbackUrl);\n if (!resolved) {\n throw new Error(\n `VNC URL unavailable (daemon may not be up); try \\`agentbox inspect ${box.name}\\``,\n );\n }\n url = resolved;\n } else {\n // Cloud provider: lifecycle handled by the provider; URL is a signed\n // preview URL for the in-box noVNC port (6080) — the host browser\n // can open it directly without a custom header.\n if (!box.vncPassword) {\n throw new Error(\n `cloud box ${box.name} has no VNC password recorded — recreate it to enable \\`agentbox screen\\``,\n );\n }\n const ttl = parseTtlOrExit(opts.ttl);\n const p = await providerForBox(box);\n const state = await p.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await p.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await p.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n const base = await p.resolveUrl(box, { kind: 'vnc', ttl });\n // Append noVNC's auto-connect query so the browser jumps straight to\n // the desktop without prompting for a password — same shape Docker's\n // `buildVncUrls` produces. Strip any trailing slash from the signed\n // host so the path concatenation stays canonical.\n url = `${base.replace(/\\/$/, '')}/vnc.html?autoconnect=1&password=${encodeURIComponent(box.vncPassword)}`;\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 { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport { loadEffectiveConfig, type UserConfig } from '@agentbox/config';\nimport {\n allocateShellSessionName,\n buildShellSessionAttachArgv,\n DEFAULT_RELAY_PORT,\n DEFAULT_SHELL_SESSION,\n formatDetachNotice,\n inspectBox,\n killShellSession,\n listShellSessions,\n parseShellSessionList,\n shellLabel,\n shellSessionInfo,\n shellSessionName,\n startBox,\n startShellSession,\n unpauseBox,\n type BoxRecord,\n type ShellSessionSummary,\n} from '@agentbox/sandbox-docker';\nimport { resolveBoxOrExit, resolveBoxOrShift } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { runWrappedAttach } from '../wrapped-pty/index.js';\nimport { handleLifecycleError } from './_errors.js';\nimport { requireDockerProvider } from './_provider-guard.js';\n\nconst RELAY_HOST_URL = `http://127.0.0.1:${String(DEFAULT_RELAY_PORT)}`;\n\n/** Wrap a string in single quotes for safe embedding in a shell command. */\nfunction shellSingle(s: string): string {\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\ninterface ShellOptions {\n user?: string;\n login?: boolean;\n tmux?: boolean; // commander: --no-tmux => false; default true\n /** -n/--name: the shell label (default shell when unset). */\n name?: string;\n /** --new: open a fresh auto-numbered shell instead of the default. */\n new?: 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 if (opts.tmux === false) shell.tmux = false;\n return Object.keys(shell).length > 0 ? { shell } : {};\n}\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\n/** ` -n <label>` suffix for the reattach hint — empty for the default shell. */\nfunction detachSuffix(sessionName: string): string {\n const label = shellLabel(sessionName);\n return label === DEFAULT_SHELL_SESSION ? '' : ` -n ${label}`;\n}\n\n/** Compact relative time, e.g. `3m ago`; `-` when unknown. */\nfunction fmtAgo(iso: string | null): string {\n if (!iso) return '-';\n const ms = Date.now() - new Date(iso).getTime();\n if (!Number.isFinite(ms) || ms < 0) return '-';\n const s = Math.round(ms / 1000);\n if (s < 60) return `${String(s)}s ago`;\n const m = Math.round(s / 60);\n if (m < 60) return `${String(m)}m ago`;\n const h = Math.round(m / 60);\n if (h < 24) return `${String(h)}h ago`;\n return `${String(Math.round(h / 24))}d ago`;\n}\n\n/** Auto-unpause/start the box so it's running. Mirrors `agentbox code` /\n * `agentbox claude start`. `startBox` relaunches ctl/vnc/dockerd. */\nasync function ensureBoxRunning(box: BoxRecord): Promise<void> {\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');\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\n/**\n * Resolve which tmux session `agentbox shell` should target: an explicit\n * `-n <label>` wins; `--new` allocates the lowest-free `shell-N`; otherwise\n * the box's default `shell`.\n */\nasync function resolveTargetSession(\n box: BoxRecord,\n user: string,\n opts: ShellOptions,\n): Promise<string> {\n if (opts.name !== undefined && opts.name.trim() !== '') {\n return shellSessionName(opts.name);\n }\n if (opts.new) {\n const existing = await listShellSessions(box.container, user);\n return allocateShellSessionName(existing.map((s) => s.sessionName));\n }\n return DEFAULT_SHELL_SESSION;\n}\n\n/**\n * Cloud equivalent of {@link resolveTargetSession}. Lists tmux sessions\n * over `provider.exec` (`tmux list-sessions -F …` over SSH) and reuses\n * the pure-string `allocateShellSessionName` helper. Empty list / tmux\n * server not running / exec failure all degrade to \"default `shell`\".\n */\nasync function resolveCloudShellSessionName(\n box: BoxRecord,\n provider: { exec: (b: BoxRecord, argv: string[], opts?: { user?: string }) => Promise<{ exitCode: number; stdout: string }> },\n user: string,\n opts: ShellOptions,\n): Promise<string> {\n if (opts.name !== undefined && opts.name.trim() !== '') {\n return shellSessionName(opts.name);\n }\n if (!opts.new) return DEFAULT_SHELL_SESSION;\n const r = await provider\n .exec(\n box,\n [\n 'tmux',\n 'list-sessions',\n '-F',\n '#{session_name}\\t#{session_created}\\t#{session_attached}',\n ],\n { user },\n )\n .catch(() => ({ exitCode: 1, stdout: '' }));\n // tmux server-not-running prints \"no server running\" on stderr and exits 1.\n // Empty session list → use the default name.\n if (r.exitCode !== 0) return DEFAULT_SHELL_SESSION;\n const existing = parseShellSessionList(r.stdout).map((s) => s.sessionName);\n return allocateShellSessionName(existing);\n}\n\ninterface ShellSessionCfg {\n user: string;\n login: boolean;\n sessionName: string;\n}\n\n/**\n * Start-or-attach a box's shell tmux session, then hand the docker\n * tmux-attach argv to the node-pty wrapper (footer + `Ctrl+a d` detach).\n * Process-exits with the inner pty's code. The box must already be running.\n */\nasync function startOrAttachShell(box: BoxRecord, cfg: ShellSessionCfg): Promise<never> {\n const label = shellLabel(cfg.sessionName);\n const info = await shellSessionInfo(box.container, cfg.sessionName, cfg.user);\n if (info.running) {\n log.info(`reattaching to shell \"${label}\" — Control+a d to detach`);\n } else {\n await startShellSession({\n container: box.container,\n sessionName: cfg.sessionName,\n user: cfg.user,\n login: cfg.login,\n });\n log.info(`shell \"${label}\" — Control+a d to detach, leaves it running`);\n }\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: buildShellSessionAttachArgv(box.container, cfg.sessionName, cfg.user),\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'shell',\n detachable: true,\n detachNotice: formatDetachNotice(reattachRef(box), 'shell', detachSuffix(cfg.sessionName)),\n });\n process.exit(code);\n}\n\nexport const shellCommand = new Command('shell')\n .description(\n 'Open an interactive shell in a box, in a detachable tmux session (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 .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 .option('--no-tmux', 'run a plain docker exec shell instead of a detachable tmux session')\n .option('-n, --name <label>', 'open/attach a named shell session (a box can hold several)')\n .option('--new', 'open a fresh, auto-numbered shell session (shell-2, shell-3, ...)')\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 const tmux = cfg.effective.shell.tmux;\n\n // Cloud boxes: attach via SSH (provider.buildAttach), not docker exec.\n // The flow keeps the same options (tmux session, one-shot cmd, etc.)\n // but goes over the SSH token Daytona mints per attach.\n if ((box.provider ?? 'docker') !== 'docker') {\n const provider = await providerForBox(box);\n if (!provider.buildAttach) {\n throw new Error(`provider '${provider.name}' does not support interactive attach`);\n }\n const innerCmd =\n effectiveCmd.length > 0\n ? (login ? `bash -l -c ${shellSingle(effectiveCmd.join(' '))}` : `bash -c ${shellSingle(effectiveCmd.join(' '))}`)\n : (login ? 'bash -l' : 'bash');\n const oneShot = effectiveCmd.length > 0;\n // Resolve `--name` / `--new` like the docker branch: list existing\n // tmux shell sessions over SSH (`tmux list-sessions -F ...`) and\n // pick the next free `shell-N`. The session naming helpers in\n // sandbox-docker are pure string ops — safe to reuse here.\n const sessionName = await resolveCloudShellSessionName(box, provider, user, opts);\n const spec = await provider.buildAttach(box, 'shell', {\n sessionName,\n user,\n command: innerCmd,\n // One-shot exec or `--no-tmux` skips the tmux wrap.\n noTmux: oneShot || !tmux,\n });\n try {\n const code = await runWrappedAttach({\n container: box.name,\n command: spec.argv[0],\n dockerArgv: spec.argv.slice(1),\n env: spec.env,\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'shell',\n detachable: !oneShot && tmux,\n });\n process.exit(code);\n } finally {\n if (spec.cleanup) await spec.cleanup();\n }\n }\n\n await ensureBoxRunning(box);\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\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 isInteractive = process.stdout.isTTY && process.stdin.isTTY;\n\n // Plain `docker exec` argv — used for one-shot `-- cmd`, non-interactive\n // runs, and the interactive `--no-tmux` shell. One-shot/piped use is\n // never tmux-wrapped: machine-readable stdout and heredocs must stay\n // clean.\n const bashArgs: string[] = [];\n if (login) bashArgs.push('-l');\n if (effectiveCmd.length > 0) bashArgs.push('-c', effectiveCmd.join(' '));\n const ttyFlag = isInteractive ? '-it' : '-i';\n const plainArgv = [\n 'exec',\n ttyFlag,\n '-e',\n `TERM=${term}`,\n '--user',\n user,\n box.container,\n 'bash',\n ...bashArgs,\n ];\n\n // One-shot exec (`agentbox shell box -- cmd…`) and any piped use both\n // need machine-readable stdout — the wrapped pty would corrupt it with\n // a footer, and a tmux session makes no sense. Stay on the plain\n // spawnSync path in those cases (`-n` / `--new` don't apply).\n if (!isInteractive || effectiveCmd.length > 0) {\n const child = spawnSync('docker', plainArgv, { stdio: 'inherit' });\n process.exit(child.status ?? 0);\n }\n\n // Interactive shell. Default: run inside a detachable tmux session so\n // `Ctrl+a d` leaves it running (reattach with `agentbox shell attach`).\n // `--no-tmux` keeps the plain wrapped `docker exec` shell — closing the\n // terminal kills it.\n if (tmux) {\n const sessionName = await resolveTargetSession(box, user, opts);\n await startOrAttachShell(box, { user, login, sessionName });\n }\n const code = await runWrappedAttach({\n container: box.container,\n dockerArgv: plainArgv,\n relayBaseUrl: RELAY_HOST_URL,\n boxId: box.id,\n boxName: box.name,\n projectIndex: box.projectIndex,\n mode: 'shell',\n });\n process.exit(code);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nconst shellAttachCommand = new Command('attach')\n .description(\n 'Attach to a shell 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('--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 .option('-n, --name <label>', 'shell label to attach (default: the box default shell)')\n .action(async function (this: Command, idOrName: string | undefined) {\n try {\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n throw new Error('`agentbox shell attach` needs an interactive terminal.');\n }\n // optsWithGlobals merges parent + own options — the parent `shell`\n // command also defines `-n/--name`, so it parses the flag and this\n // subcommand reads it back through the merge.\n const opts = this.optsWithGlobals() as ShellOptions;\n const box = await resolveBoxOrExit(idOrName);\n requireDockerProvider(box, 'shell');\n const cfg = await loadEffectiveConfig(box.workspacePath, {\n cliOverrides: buildShellCliOverrides(opts),\n });\n await ensureBoxRunning(box);\n await startOrAttachShell(box, {\n user: cfg.effective.shell.user,\n login: cfg.effective.shell.login,\n sessionName: shellSessionName(opts.name),\n });\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nfunction renderShellTable(sessions: ShellSessionSummary[]): void {\n const header = ['SHELL', 'ATTACHED', 'CREATED'];\n const rows = sessions.map((s) => [s.label, s.attached ? 'attached' : '-', fmtAgo(s.createdAt)]);\n const widths = header.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => r[i]?.length ?? 0)),\n );\n const fmt = (cells: string[]): string =>\n cells.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' ').trimEnd();\n process.stdout.write(`${fmt(header)}\\n`);\n for (const r of rows) process.stdout.write(`${fmt(r)}\\n`);\n}\n\nconst shellLsCommand = new Command('ls')\n .description('List the shell tmux sessions running in a box')\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 requireDockerProvider(box, 'shell');\n const insp = await inspectBox(box.id);\n if (insp.state !== 'running') {\n log.info(`box ${box.name} is ${insp.state} — no live shell sessions`);\n return;\n }\n if (insp.shellSessions.length === 0) {\n log.info(\n `no shell sessions in ${box.name} — start one with: agentbox shell ${reattachRef(box)}`,\n );\n return;\n }\n renderShellTable(insp.shellSessions);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\ninterface ShellKillOptions {\n name?: string;\n all?: boolean;\n}\n\nconst shellKillCommand = new Command('kill')\n .description('Kill a shell tmux session in a box (the shell and anything running in it)')\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('-n, --name <label>', 'shell label to kill (default: the box default shell)')\n .option('--all', 'kill every shell session in the box')\n .action(async function (this: Command, idOrName: string | undefined) {\n try {\n // optsWithGlobals: the parent `shell` command also defines `-n/--name`\n // (it parses the flag); `--all` is this subcommand's own.\n const opts = this.optsWithGlobals() as ShellKillOptions;\n const box = await resolveBoxOrExit(idOrName);\n requireDockerProvider(box, 'shell');\n const insp = await inspectBox(box.id);\n if (insp.state !== 'running') {\n log.info(`box ${box.name} is ${insp.state} — no shell sessions to kill`);\n return;\n }\n if (opts.all) {\n if (insp.shellSessions.length === 0) {\n log.info(`no shell sessions in ${box.name}`);\n return;\n }\n let killed = 0;\n for (const s of insp.shellSessions) {\n if (await killShellSession(box.container, s.sessionName)) killed++;\n }\n log.success(`killed ${String(killed)} shell session${killed === 1 ? '' : 's'} in ${box.name}`);\n return;\n }\n const target = shellSessionName(opts.name);\n const ok = await killShellSession(box.container, target);\n if (ok) log.success(`killed shell \"${shellLabel(target)}\" in ${box.name}`);\n else log.warn(`no shell \"${shellLabel(target)}\" in ${box.name} (already gone?)`);\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n\nshellCommand.addCommand(shellAttachCommand);\nshellCommand.addCommand(shellLsCommand);\nshellCommand.addCommand(shellKillCommand);\n","import { log } from '@clack/prompts';\nimport type { BoxRecord } from '@agentbox/core';\n\n/**\n * Bail out with a clear, actionable error when a Docker-specific command is\n * invoked against a non-Docker box. Use this in commands whose internals\n * (`docker exec`, named volumes, in-box tmux session probing, etc.) haven't\n * been re-implemented for the provider abstraction yet — better to fail fast\n * with a hint than to surface a confusing docker-not-found stack.\n *\n * Returns when the box is Docker-backed; calls `process.exit(2)` otherwise.\n */\nexport function requireDockerProvider(box: BoxRecord, commandName: string): void {\n const provider = box.provider ?? 'docker';\n if (provider === 'docker') return;\n log.error(\n `\\`agentbox ${commandName}\\` doesn't yet support cloud boxes (this box's provider is '${provider}').`,\n );\n log.info(\n \"Cloud-provider routing for this command is on the Phase 3 backlog. For now: use `agentbox url` for web access, `agentbox-ctl git push` from inside the sandbox via SSH/web terminal, or fall back to the cloud provider's own console.\",\n );\n process.exit(2);\n}\n","import { startBox } from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const startCommand = new Command('start')\n .description(\n 'Start a stopped box. Docker: docker start + relaunch ctl/dockerd/vnc daemons. Cloud: backend.start, then re-resolve preview URLs/tokens, re-launch in-sandbox ctl/dockerd daemons, and re-register with the host relay (so the CloudBoxPoller resumes).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const { record } = await startBox(box.id);\n process.stdout.write(`started ${record.container}\\n`);\n } else {\n await (await providerForBox(box)).start(box);\n process.stdout.write(`started ${box.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 // Cloud boxes don't have a host Docker container to `docker exec` into for\n // a live status pull, and `inspectBox` is Docker-only. The persisted\n // box-status (mirrored by the host poller into ~/.agentbox/boxes/<id>/\n // status.json) carries the same service / task / ports info. Delegate to\n // the inspect renderer's cloud branch — it surfaces all of it.\n if ((box.provider ?? 'docker') !== 'docker') {\n await runInspect(box, { json: opts.json, watch: opts.watch, interval: opts.interval });\n return;\n }\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 out.push('', 'SHELLS', renderShells(inspected));\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 renderShells(i: InspectedBox): string {\n if (i.state !== 'running') return ' (box not running)';\n if (i.shellSessions.length === 0) {\n return ' (none — start one with `agentbox shell`)';\n }\n return i.shellSessions\n .map((s) => ` ${s.label} ${s.attached ? 'attached' : 'detached'}`)\n .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","import { log } from '@clack/prompts';\nimport {\n inspectBox,\n projectCheckpointImageBytes,\n readBoxStatus,\n type BoxRecord,\n type InspectedBox,\n} from '@agentbox/sandbox-docker';\nimport { renderEndpointLines } from '../endpoints-render.js';\nimport { fmtBytes } from '../fmt.js';\nimport { providerForBox } from '../provider/registry.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 // checkpoint image size only when this box was started from one; otherwise\n // skip the row (no image -> no number to show, and projectCheckpointImageBytes\n // needs an explicit checkpoint name to resolve).\n const ckptName = i.record.checkpointSource?.ref;\n const projectRoot = i.record.projectRoot ?? i.record.workspacePath;\n const ckptBytes = ckptName ? await projectCheckpointImageBytes(projectRoot, ckptName) : null;\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 `workspace ${i.record.workspacePath} (container fs at /workspace)`,\n `project ${i.record.projectRoot ?? '(unset — pre-feature box)'}`,\n `n ${typeof i.record.projectIndex === 'number' ? String(i.record.projectIndex) : '(none)'}`,\n `claude config ${i.record.claudeConfigVolume ?? '(none)'}`,\n `claude session ${renderClaudeSession(i)}`,\n `claude activity ${renderClaudeActivity(i)}`,\n `codex config ${i.record.codexConfigVolume ?? '(none)'}`,\n `codex session ${renderCodexSession(i)}`,\n `codex activity ${renderCodexActivity(i)}`,\n `opencode cfg ${i.record.opencodeConfigVolume ?? '(none)'}`,\n `opencode sess ${renderOpencodeSession(i)}`,\n `shells ${renderShells(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)'}`,\n `snapshot size ${fmtBytes(i.snapshotSizeBytes)}`,\n `checkpoint ${renderCheckpoint(i, ckptBytes)}`,\n `host export ${i.hostPaths.mergedExport} (run \\`agentbox open\\` to refresh)`,\n `created ${i.record.createdAt}`,\n ];\n return lines.join('\\n');\n}\n\nfunction renderCheckpoint(i: InspectedBox, sizeBytes: number | null): string {\n const src = i.record.checkpointSource;\n if (!src || !i.record.checkpointImage) return '(none)';\n const sizePart = sizeBytes !== null ? ` ${fmtBytes(sizeBytes)}` : '';\n return `${src.ref} (${src.type}, chain ${src.chain.length}) → ${i.record.checkpointImage}${sizePart}`;\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 renderCodexSession(i: InspectedBox): string {\n if (i.codexSession === null) return '(n/a — box not running)';\n if (!i.codexSession.running) return `not running (\"${i.codexSession.sessionName}\")`;\n const since = i.codexSession.startedAt ? ` since ${i.codexSession.startedAt}` : '';\n const title = i.persistedStatus?.codex?.sessionTitle;\n return `running (\"${i.codexSession.sessionName}\")${since}${title ? ` — ${title}` : ''}`;\n}\n\nfunction renderCodexActivity(i: InspectedBox): string {\n const c = i.persistedStatus?.codex;\n if (!c) return '(none)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\n}\n\nfunction renderOpencodeSession(i: InspectedBox): string {\n if (i.opencodeSession === null) return '(n/a — box not running)';\n if (!i.opencodeSession.running) return `not running (\"${i.opencodeSession.sessionName}\")`;\n const since = i.opencodeSession.startedAt ? ` since ${i.opencodeSession.startedAt}` : '';\n const title = i.persistedStatus?.opencode?.sessionTitle;\n return `running (\"${i.opencodeSession.sessionName}\")${since}${title ? ` — ${title}` : ''}`;\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 renderShells(i: InspectedBox): string {\n if (i.state !== 'running') return '(n/a — box not running)';\n const s = i.shellSessions;\n if (s.length === 0) return 'none';\n return `${String(s.length)} (${s.map((x) => x.label).join(', ')})`;\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/**\n * `agentbox inspect` for cloud boxes: skips the Docker-specific probes\n * (`docker exec`, `docker inspect`, tmux session info) and renders what the\n * cloud provider can cheaply give us — state via probeState, endpoints from\n * preview URLs, persisted box-status snapshot mirrored from the in-sandbox\n * relay.\n */\nasync function renderCloudText(box: BoxRecord): Promise<string> {\n const provider = await providerForBox(box);\n const state = await provider.probeState(box);\n const persisted = await readBoxStatus(box);\n const lim = box.resourceLimits;\n const lines: string[] = [\n `id ${box.id}`,\n `name ${box.name}`,\n `provider ${box.provider ?? 'docker'}`,\n `sandboxId ${box.cloud?.sandboxId ?? '(none)'}`,\n `image ${box.image}`,\n `state ${state}`,\n `workspace ${box.workspacePath} (sandbox fs at /workspace)`,\n `project ${box.projectRoot ?? '(unset)'}`,\n `n ${typeof box.projectIndex === 'number' ? String(box.projectIndex) : '(none)'}`,\n `claude activity ${renderClaudeActivityCloud(persisted)}`,\n `codex activity ${renderCodexActivityCloud(persisted)}`,\n `web port ${box.cloud?.webPort ?? '(none)'}`,\n `web preview ${webPreviewLine(box)}`,\n `relay preview ${box.cloud?.relayPreviewUrl ?? '(unresolved)'}`,\n `bridge token ${box.cloud?.bridgeToken ? '(set)' : '(unset)'}`,\n `playwright ${box.withPlaywright ? 'yes' : 'no'}`,\n `env files ${box.withEnv ? 'yes' : 'no'}`,\n `mem limit ${lim?.memoryBytes ? fmtBytes(lim.memoryBytes) : 'unlimited'}`,\n `cpu limit ${fmtLimit(lim?.cpus, '')}`,\n `pids limit ${fmtLimit(lim?.pidsLimit, '')}`,\n `persisted ${persisted ? `${persisted.timestamp} (${String(persisted.services.length)} svc, ${String(persisted.tasks.length)} tasks, ${String(persisted.ports.length)} ports)` : '(none)'}`,\n `created ${box.createdAt}`,\n ];\n return lines.join('\\n');\n}\n\nfunction webPreviewLine(box: BoxRecord): string {\n const port = box.cloud?.webPort;\n if (port === undefined) return '(none)';\n const url = box.cloud?.previewUrls?.[port];\n return url ?? '(unresolved — re-run `agentbox url` to refresh)';\n}\n\nfunction renderClaudeActivityCloud(persisted: Awaited<ReturnType<typeof readBoxStatus>>): string {\n const c = persisted?.claude;\n if (!c) return '(none — host poller hasn\\'t mirrored status yet)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\n}\n\nfunction renderCodexActivityCloud(persisted: Awaited<ReturnType<typeof readBoxStatus>>): string {\n const c = persisted?.codex;\n if (!c) return '(none)';\n return `${c.state}${c.updatedAt ? ` (updated ${c.updatedAt})` : ''}`;\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 const isCloud = (box.provider ?? 'docker') !== 'docker';\n if (opts.watch) {\n await watchRender(\n async () =>\n isCloud ? await renderCloudText(box) : await renderText(await inspectBox(box.id)),\n opts.interval,\n );\n return;\n }\n if (isCloud) {\n // Provider-level inspect gives us state + endpoints; for JSON we surface\n // the box record + a probeState (cheap), avoiding heavy SDK round-trips.\n if (opts.json) {\n const provider = await providerForBox(box);\n const state = await provider.probeState(box);\n const persisted = await readBoxStatus(box);\n process.stdout.write(\n JSON.stringify({ record: box, state, persistedStatus: persisted }, null, 2) + '\\n',\n );\n } else {\n process.stdout.write((await renderCloudText(box)) + '\\n');\n }\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const stopCommand = new Command('stop')\n .description(\n 'Stop a box (Docker: docker stop; preserves upper + node_modules volumes. Cloud: backend.stop — sandbox stays in your account, disk preserved).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const record = await stopBox(box.id);\n process.stdout.write(\n `stopped ${record.container}\\nrestart with: agentbox start ${record.name}\\n`,\n );\n } else {\n await (await providerForBox(box)).stop(box);\n process.stdout.write(\n `stopped ${box.name}\\nrestart with: agentbox start ${box.name}\\n`,\n );\n }\n } catch (err) {\n handleLifecycleError(err);\n }\n });\n","import { Command } from 'commander';\nimport { findProjectRoot } from '@agentbox/config';\nimport {\n agentboxHomeBytes,\n allCheckpointImagesBytes,\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 // Empty result isn't 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 // Cloud boxes are listed read-only (state from listBoxes, all metrics —)\n // because Daytona's SDK doesn't expose CPU/mem live stats. The\n // requireDockerProvider guard would refuse the cloud ref — relax it here\n // and just resolve.\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(\n boxes.map((b) => {\n // Skip the docker-only `boxResourceStats` for cloud boxes — it would\n // try to `docker inspect` the synthetic `agentbox-cloud-*` container\n // name. Hand back an empty placeholder stats record so the row still\n // renders (with — for every metric); state comes from listBoxes.\n if ((b.provider ?? 'docker') !== 'docker') return emptyStats(b.provider ?? 'cloud');\n return boxResourceStats(b);\n }),\n );\n return { boxes, stats };\n}\n\nfunction emptyStats(source: string): BoxResourceStats {\n return {\n source,\n live: false,\n cpuPercent: null,\n memUsedBytes: null,\n memLimitBytes: null,\n memPercent: null,\n pids: null,\n diskUsedBytes: null,\n snapshotDiskBytes: null,\n checkpointVolumeBytes: null,\n netRxBytes: null,\n netTxBytes: null,\n blockReadBytes: null,\n blockWriteBytes: null,\n limits: { memoryBytes: null, cpus: null, pidsLimit: null, disk: null },\n warnings: ['cloud box: live metrics not yet exposed by the backend SDK'],\n };\n}\n\nasync function renderProjectFooters(): Promise<string> {\n // Two independent disk numbers, no overlap: checkpoint *images* live in\n // Docker's image store (not under ~/.agentbox); everything else agentbox\n // keeps on the host — box run dirs, exports, host clones — is under\n // ~/.agentbox and summed there.\n const parts: string[] = [];\n const [ckpt, home] = await Promise.all([\n allCheckpointImagesBytes(),\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 { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\nexport const unpauseCommand = new Command('unpause')\n .description(\n 'Resume a paused box. Docker: `docker unpause` (sub-second). Cloud: backend.resume (re-hydrates from archive — slower first time).',\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 .action(async (idOrName: string | undefined) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n if ((box.provider ?? 'docker') === 'docker') {\n const record = await unpauseBox(box.id);\n process.stdout.write(`unpaused ${record.container}\\n`);\n } else {\n await (await providerForBox(box)).resume(box);\n process.stdout.write(`unpaused ${box.name}\\n`);\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 { spawnSync } from 'node:child_process';\nimport { log } from '@clack/prompts';\nimport {\n detectEngine,\n getBoxHostPaths,\n inspectBox,\n portlessGetUrl,\n startBox,\n unpauseBox,\n} from '@agentbox/sandbox-docker';\nimport { Command } from 'commander';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.js';\nimport { handleLifecycleError } from './_errors.js';\n\ninterface UrlOptions {\n print?: boolean;\n loopback?: boolean;\n ttl?: string;\n}\n\n/** Daytona's signed-URL ceiling is 24h; clamp the CLI flag to the same. */\nconst SIGNED_URL_TTL_MIN = 1;\nconst SIGNED_URL_TTL_MAX = 86400;\n\nfunction parseTtlOrExit(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < SIGNED_URL_TTL_MIN || n > SIGNED_URL_TTL_MAX) {\n throw new Error(\n `--ttl must be an integer between ${String(SIGNED_URL_TTL_MIN)} and ${String(SIGNED_URL_TTL_MAX)} seconds`,\n );\n }\n return n;\n}\n\nexport const urlCommand = new Command('url')\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(\n '--loopback',\n 'use the 127.0.0.1 URL instead of the OrbStack .orb.local / Portless .localhost URL',\n )\n .option(\n '--ttl <seconds>',\n 'cloud only: signed-URL expiry in seconds (default 3600, max 86400)',\n )\n .action(async (idOrName: string | undefined, opts: UrlOptions) => {\n try {\n const box = await resolveBoxOrExit(idOrName);\n const provider = box.provider ?? 'docker';\n\n let url: string;\n if (provider === 'docker') {\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');\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 url\\``,\n );\n }\n\n const engine = await detectEngine();\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 if (record.portlessAlias && !opts.loopback) {\n // A Portless route was registered — use the URL resolved at\n // create/start; fall back to a live `portless get` for older records.\n url = record.portlessUrl ?? (await portlessGetUrl(record.portlessAlias));\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 } else {\n // Cloud provider: probeState + lifecycle handled by the provider;\n // URL is a signed preview URL (token embedded in the URL itself) so\n // the host browser can open it without a custom header.\n const ttl = parseTtlOrExit(opts.ttl);\n const p = await providerForBox(box);\n const state = await p.probeState(box);\n if (state === 'paused') {\n log.info('box is paused; resuming');\n await p.resume(box);\n } else if (state === 'stopped') {\n log.info('box is stopped; starting');\n await p.start(box);\n } else if (state === 'missing') {\n throw new Error(`cloud sandbox for ${box.name} is missing; was it deleted?`);\n }\n url = await p.resolveUrl(box, { kind: 'web', ttl });\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 { log } from '@clack/prompts';\nimport { Command } from 'commander';\nimport type { WaitReadyReply } from '@agentbox/ctl';\nimport { resolveBoxOrExit } from '../box-ref.js';\nimport { providerForBox } from '../provider/registry.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 const provider = await providerForBox(box);\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 provider.exec(box, 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","/**\n * Provider-prefix argv sugar:\n *\n * agentbox <provider> <subcmd> [...rest]\n * where provider ∈ {docker, daytona, hetzner, vercel}\n * and subcmd ∈ SUGARED_COMMANDS\n *\n * ↓ rewritten before commander parses\n *\n * agentbox <subcmd> --provider <provider> [...rest]\n *\n * Anything that doesn't match (e.g. `agentbox daytona login`, `agentbox hetzner\n * firewall sync foo`, `agentbox create`) is returned unchanged.\n *\n * The `--provider <provider>` is prepended *before* the rest of the args, so\n * an explicit `--provider <flag>` later in the original argv keeps the\n * commander last-one-wins behavior: `agentbox daytona create --provider\n * hetzner` resolves to hetzner.\n */\nimport { isKnownProvider } from './registry.js';\n\nexport const SUGARED_COMMANDS = ['create', 'claude', 'codex', 'opencode'] as const;\nexport type SugaredCommand = (typeof SUGARED_COMMANDS)[number];\n\nfunction isSugared(name: string): name is SugaredCommand {\n return (SUGARED_COMMANDS as readonly string[]).includes(name);\n}\n\nexport function rewriteProviderPrefix(argv: readonly string[]): string[] {\n // argv layout from process.argv: [node, scriptPath, ...userArgs].\n if (argv.length < 4) return [...argv];\n const provider = argv[2];\n const subcmd = argv[3];\n if (typeof provider !== 'string' || typeof subcmd !== 'string') return [...argv];\n if (!isKnownProvider(provider) || !isSugared(subcmd)) return [...argv];\n\n const head = argv.slice(0, 2);\n const rest = argv.slice(4);\n return [...head, subcmd, '--provider', provider, ...rest];\n}\n"],"mappings":"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","names":["Command","program","pad","log","log","log","log","confirm","isCancel","log","outro","spinner","Command","join","join","log","log","join","log","log","stat","homedir","join","readdir","log","join","readFile","stat","homedir","join","homedir","join","stat","readFile","mkdtemp","readdir","readFile","stat","writeFile","existsSync","homedir","tmpdir","join","homedir","join","existsSync","mkdtemp","tmpdir","stat","readdir","readFile","writeFile","log","existsSync","homedir","join","mkdirSync","writeFileSync","homedir","join","isCancel","log","spinner","s","spinner","log","isCancel","confirm","isCancel","log","proj","log","isCancel","confirm","log","spinner","confirm","isCancel","Command","outro","confirm","isCancel","log","Command","Command","log","r","confirm","isCancel","log","Command","homedir","join","Command","log","resolve","confirm","intro","isCancel","log","outro","spinner","Command","reattachRef","RELAY_HOST_URL","confirm","isCancel","log","spinner","Command","intro","outro","confirm","intro","isCancel","log","outro","spinner","Command","reattachRef","RELAY_HOST_URL","confirm","isCancel","log","spinner","Command","intro","outro","Command","InvalidArgumentError","log","Command","Command","log","intro","log","outro","Command","spawnSync","RELAY_HOST_URL","spawnSync","Command","intro","log","m","outro","cloudAgentAttach","spawn","log","Command","spawn","cursorTo","resolve","ev","Command","log","spawn","log","spinner","Command","log","spinner","Command","log","Command","reportError","log","loginSub","printStatus","secretsPath","maskKey","log","Command","reportError","printStatus","maskKey","secretsPath","loginSub","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","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","result","log","Command","POLL_INTERVAL_MS","Command","parsePositiveInt","sleep","elapsedMs","log","log","Command","existsSync","homedir","join","join","homedir","existsSync","Command","log","intro","log","outro","Command","existsSync","mkdirSync","writeFileSync","homedir","join","resolve","Command","Command","injectPrCreateHead","log","Command","ESC","sleep","term","row","scoped","listCommand","Command","log","log","Command","spawn","Command","log","child","spawn","term","log","execa","existsSync","mkdirSync","homedir","join","Command","Command","join","homedir","existsSync","mkdirSync","log","execa","Command","Command","intro","log","spinner","Command","pad","Command","intro","log","spinner","confirm","isCancel","log","Command","Command","log","confirm","isCancel","readFile","stat","intro","log","outro","Command","Command","log","pad","stat","readFile","intro","outro","parsePositiveInt","sleep","log","spinner","Command","Command","spinner","log","Command","Command","log","spawnSync","log","Command","Command","log","spawnSync","spawnSync","log","Command","log","RELAY_HOST_URL","reattachRef","fmtAgo","log","Command","code","term","spawnSync","Command","Command","log","Command","log","log","statusCommand","Command","log","renderShells","renderPersisted","Command","Command","Command","renderTable","Command","Command","Command","spawn","confirm","intro","isCancel","log","outro","spinner","Command","spawn","Command","intro","log","outro","confirm","isCancel","spinner","spawnSync","log","Command","SIGNED_URL_TTL_MIN","SIGNED_URL_TTL_MAX","parseTtlOrExit","Command","log","spawnSync","log","Command","Command","log","Command","listCommand","statusCommand"]}
|