crates/desktop-core: shared Rust types + schema exportcrates/linux-backend: Linux desktop operations backed by available system tools (Xvfb,xdotool,xprop,import, Firefox)crates/guest-runtime: Rust HTTP runtime that owns sandbox session lifecycle and Linux desktop accessapps/control-plane: TypeScript server for task lifecycle, browser specialization, action history, and API/UI servingapps/web-ui: oversight UI served by the control planeapps/sandbox-runner: local wrapper that starts the runtime stackpackages/ts-sdkandpython/sdk: client SDKsscripts/qemu_guest_assets.py: QEMU guest asset/bootstrap helper
- Production target: QEMU/KVM Linux VM with an in-guest runtime bridge.
- Verified regression baseline: Xvfb-backed session provider.
- Current supported product guest: Ubuntu 24.04 + GNOME.
- Current internal regression fixture: lighter QEMU image using the same guest-runtime protocol.
- Operator/debug path: expose a canonical
live_desktop_viewroute for product oversight, while retaining rawviewer_urlfor debugging. - Storage is tiered:
runtime/= session-owned and ephemeralcache/= reusable qemu image assetsexports/= explicit retained artifacts/evidence
- Each session gets its own runtime artifact directory under the ephemeral tier.
- QEMU
productsessions can emit a storage-efficientreview_recordingsummary and sparse review bundle for later human review. - V1 deliberately does not default to continuous video capture; it keeps a sparse bundle (
review.json,timeline.jsonl, deduplicated screenshots) because the goal is later review with the best byte-to-evidence ratio. - Runtime review artifacts live under the session-owned ephemeral tier until an explicit
POST /api/sessions/:id/review/exportpromotes them intoexports/. - The live operator surface stays
live_desktop_view; review recording is a separate artifact for later inspection, not a replacement stream.
- Screenshot-first.
- Optional X11 metadata (active window and cursor position) when tools are available.
- Clear split between
rawmachine observations andsummaryfields intended for models/operators. - QEMU sessions stay honest: pre-ready sessions return structured bridge-unavailable errors instead of synthetic screenshots.
- The oversight UI renders from
live_desktop_viewmetadata so it can distinguish real live desktop, screenshot fallback, and unavailable states without guessing fromviewer_url.
- Rust guest-runtime handles desktop input, shell/filesystem, app launch, and screenshot capture.
- TypeScript control plane layers on task tracking and browser specialization.
- Every action returns a structured receipt or structured error envelope.
- For QEMU, shell/filesystem/desktop actions go through the guest runtime as the single primary plane.
bridge_statusremains the coarse bridge lifecycle.readiness_stateadds the stricter ladder:bootingdesktop_readybridge_listeningbridge_attachedruntime_readyfailed
- Guest bootstrap must be deterministic enough to promote sessions to
runtime_readyautomatically. - QEMU bootstrap/health failures must emit actionable artifacts/logs.
- Startup cleanup should only reap inspectors-owned runtime state after liveness checks; reusable cache and explicit exports are excluded.
- Future work can replace the transport with vsock/VM-native plumbing without changing the external contract.