Skip to content

v1.4.3 — CubeSandbox KVM microVM isolation + persistent sessions

Latest

Choose a tag to compare

@AvengerMoJo AvengerMoJo released this 22 Jun 03:16
· 71 commits to main since this release

What's new in v1.4.3

Coding tasks now run inside hardware-isolated KVM/RustVMM microVMs
instead of shared host processes. Sessions persist across handler
restarts so you can re-attach from the dashboard to inspect what the
agent did, debug, or continue the conversation.

Highlights

  • CubeSandbox microVM backend. Sandbox.create() boots a real KVM
    microVM from tpl-674134307cfa458a986b05ab (OpenCode 1.17.9 on Ubuntu
    22.04) through the cloudflared tunnel. End-to-end verified: a coding
    task wrote a real Python project + tests, ran pytest, reported
    1 passed in 0.00s, all from inside the microVM.

  • Pluggable SandboxBackend registry. Handler now picks the backend
    via task.config["sandbox_backend"]host (default), cube
    (KVM microVM), or anything you register with @register_backend(...).

  • Persistent paused sessions. When a coding task ends, the VM is
    paused (not killed). The session store at
    ~/.memory/sandbox_sessions.json maps task_id -> SandboxHandle
    so you can re-attach from the dashboard. Set
    sandbox_teardown = "kill" for hard-kill behavior.

  • New MCP tools for inspecting sessions:

    • sandbox_list_sessions(backend?, state?) — list live/paused sessions
    • sandbox_attach_session(task_id, log_tail_lines?) — resume + return
      URL + log tail (lets you see exactly what the agent did)
    • sandbox_kill_session(task_id) — tear down
  • Cloudflared tunnel integration. Three new ingress entries managed
    via the agent-owned overlay at
    docs/infra/cloudflared-cubesandbox.yml:

    • sandbox-api.eclipsogate.org → cube-api (POST /sandboxes)
    • dashboard.eclipsogate.org → cube-webui
    • *.eclipsogate.org wildcard → cube-proxy (per-sandbox routing)
  • 120XX port scheme. All CubeSandbox services live in one memorable
    block: cube-webui:12088, cube-proxy HTTP:12080, cube-proxy HTTPS:12443,
    cube-api:12300, network-agent:12091. Docker/Redis/cubemaster/cubelet
    kept on their existing ports (3306/16379/8089/9999).

Breaking changes

None. Legacy task.config["use_sandbox"] still works. Default teardown
is now PAUSE (was KILL); set sandbox_teardown = "kill" for old behavior.

Setup

# Install one-click CubeSandbox stack (root required)
sudo bash /usr/local/services/cubetoolbox/scripts/one-click/online-install.sh \
  --url=https://github.com/tencentcloud/CubeSandbox/releases/download/v0.4.0/cube-sandbox-one-click-v0.4.0.tar.gz

# Start cube-proxy + cube-api with the 120XX port scheme
sudo bash /usr/local/services/cubetoolbox/scripts/one-click/up-cube-proxy.sh
sudo CUBE_API_BIND=0.0.0.0:12300 CUBE_API_SANDBOX_DOMAIN=eclipsogate.org \
  bash /usr/local/services/cubetoolbox/scripts/systemd/cube-api-start.sh

# Apply agent-managed cloudflared overlay
python3 scripts/merge_cloudflared_config.py
cloudflared tunnel run c7a1ca2b-c1ea-407d-8078-bdb65412f693

# In .env
E2B_API_URL=https://sandbox-api.eclipsogate.org
E2B_API_KEY=local-dev-key
CUBE_TEMPLATE_ID=tpl-674134307cfa458a986b05ab

Test results

574 passed, 9 failed, 2 subtests passed
9 pre-existing failures in test_v1_2_2_smoke.py (unrelated)
44 new tests across test_sandbox_registry.py + test_cloudflared_merge.py

Commits (squashed from PR #8)

This release is a single squash commit on main. The full branch
history with 26 commits is preserved as wip_cubesandbox_coding_agent
in the PR reflog if needed.