Feat/linux host support#33
Conversation
Make `agentbox doctor` Linux-accurate and add tooling to test the CLI on a real Ubuntu host. doctor (apps/cli/src/lib/doctor-checks.ts): - checkPlatform() warns on unsupported OS (darwin/linux -> ok, else warn) - docker-cli not-found hint is platform-specific (Linux docs link) - docker daemon check distinguishes 'permission denied' (user not in the docker group) from a stopped daemon, with the matching fix as a hint tooling: - scripts/linux-dev-vm.sh: manage a persistent Hetzner Ubuntu VM (up/deploy/ssh/doctor/info/down) to test agentbox on Linux - docs/linux-host-backlog.md: status + how-to + remaining macOS-only host assumptions (browser open->xdg-open, iTerm2/AppleScript, OrbStack paths) Verified live on a clean Ubuntu 24.04 Hetzner VM: both the permission-denied and healthy docker-daemon branches render correctly; no macOS regression.
Add hostOpenCommand() to @agentbox/sandbox-core (darwin -> open, linux -> xdg-open) so opening a URL/path works on a Linux host, with a unit test. Use it in the daytona/vercel/hetzner login dashboard openers, which were hardcoded to the macOS `open` command (a no-op/error on Linux). First step of the docs/linux-host-backlog.md 'browser open' item.
Swap the remaining hardcoded macOS `open` launchers to hostOpenCommand() (open on macOS, xdg-open on Linux) so they work on a Linux host: - apps/cli: url, screen, code (CLI-missing fallback), open (sshfs reveal), dashboard (VNC/web/code openers) - relay: box-initiated 'open link on host' (host-actions.ts, server.ts) - sandbox-docker: checkpoint/export reveal (host-export.ts) Completes the docs/linux-host-backlog.md 'browser open' item (moved to Done).
Box ids were randomBytes(4).toString('hex') (8 hex chars), so ~2.3% came
out all decimal digits (e.g. 26524695). resolveBoxRef treats a bare
positive integer as a per-project index only and never falls through to
id match, so an all-digit id was unresolvable — breaking any id-targeting
command (surfaced via the relay's `checkpoint create <boxId>` in the
hetzner setup wizard).
Fix at the source: tag ids with a leading non-digit. New shared
@agentbox/core generateBoxId() returns `b`+8hex, used by both id mints
(docker create + cloud-provider, covering daytona/hetzner/vercel). Keeps
the clean "numeric ref = index" invariant and sets up a typed-id
namespace (b=box, room for c=checkpoint).
tmux is detected via $TMUX on every host, so attach-in-new-window works on Linux inside tmux; iTerm2/AppleScript stays macOS-only and native Linux emulators are out of scope for now (falls back to same-terminal attach). Correct the now-stale 'CLI is macOS-only' comment in terminal/host.ts and move the terminal item from open-blockers to a documented decision.
…tach hint) Replaces the scattered id/provider/sandboxId rows and split detach hints with one bordered clack note showing box name (+source checkpoint), project folder (the agentbox.yaml dir, home-shortened), the from->to branch mapping, and the detach/reattach instruction. Shared by claude/codex/opencode across docker and cloud via printLaunchRecap.
clack's note() dims every body line; prefix each with reset + bright-white (honoring NO_COLOR) so the recap reads in plain white. strip-ansi padding is unaffected, so box alignment stays correct.
Two independent breaks in the host->box image-paste chain on the vercel provider, both fixed: 1. Box side: the AL2023 bake never installed xclip/autocutsel (not in the AL2023 repos, unlike the Debian/Ubuntu apt path on docker/hetzner), so the in-box loadClipboardScript's xclip call failed silently. provision.sh now builds both from source (all build deps are in the AL2023 default repos), fail-loud. Requires a re-`prepare --provider vercel`. 2. Host side: the wrapped-PTY input router intercepted Ctrl+V only as the raw 0x16 byte, while the Ctrl+a leader already handled the enhanced-keyboard (kitty / modifyOtherKeys) CSI-u encoding. When the inner app negotiates that protocol, the terminal sends Ctrl+V as ESC[118;5u, which slipped past the paste check -> forwarded verbatim, Claude read its own empty clipboard. Mirror the leader handling: intercept the CSI-u form too and re-emit the original sequence after the image loads. Provider-agnostic (hardens docker/daytona/hetzner against the same latent gap). Verified: input-router unit tests cover both encodings; live vercel attach pastes [Image #1] for both raw 0x16 and ESC[118;5u.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 3ca0b19. Configure here.
| @@ -0,0 +1 @@ | |||
| {"sessionId":"c356b96e-e5f8-4246-91cd-ca98dc6e88c3","pid":2752,"procStart":"Sat May 30 08:34:50 2026","acquiredAt":1780214836229} No newline at end of file | |||
There was a problem hiding this comment.
Accidentally committed session-specific lock file
Low Severity
The .claude/scheduled_tasks.lock file contains a session-specific sessionId, pid, procStart timestamp, and acquiredAt value from a specific development session (May 30, 2026). This is a runtime lock file that doesn't belong in version control — it will conflict across contributors and carries no useful repository state. It's also not covered by .gitignore.
Reviewed by Cursor Bugbot for commit 3ca0b19. Configure here.


Note
Medium Risk
Prefixed box ids change the shape of new records (existing boxes unchanged); Linux
xdg-openand Vercel provision builds are broad but mostly additive; the release-notes publish path is irreversible if misused.Overview
This PR extends running the CLI on Linux hosts and polishes launch UX across docker and cloud.
Linux host: New
hostOpenCommand()(xdg-openon Linux,openelsewhere) replaces hardcodedopenacross CLI commands, relay browser mirroring, credential dashboards, and docker export reveal.agentbox doctornow treats Linux as supported, with docker install/daemon hints tuned for permission-denied vs daemon-down. Docs andscripts/linux-dev-vm.shdocument testing on a persistent Ubuntu VM.After box create:
printLaunchRecapshows one bordered card (box, project path, branch mapping, attach/detach hint) for claude/codex/opencode and cloud create, instead of scattered log lines and separateoutromessages.IDs: New boxes get ids via shared
generateBoxId()with abprefix so all-hex ids cannot collide with numeric project-index refs (agentbox open 4).Attach UX: Wrapped-PTY input router re-emits the exact Ctrl+V bytes (including kitty/modifyOtherKeys sequences) after host→box image paste. Terminal spawn notes no longer repeat detach help (recap carries it).
Vercel / AL2023:
provision.shbuilds xclip and autocutsel from source for clipboard paste and VNC sync.Other:
/release-notescan optionally bump, commit, tag, push, andnpm publishwhen given patch/minor/major. Marketing site adds favicons/manifest;apps/web/CLAUDE.mddocuments the static site layout.Reviewed by Cursor Bugbot for commit 3ca0b19. Configure here.