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 fromtpl-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
viatask.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.jsonmapstask_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 sessionssandbox_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.orgwildcard → 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-674134307cfa458a986b05abTest 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.