3.6 KiB
Canvas Agent native runtime
Agent/Auto Agent (including presets and both canvas types) invokes the unmodified
Apache-2.0 ZCode CLI. Its own model loop, scheduler, context management, sessions,
MCP, skills, memory and subagent tools execute in the task sandbox. Claw retains
its existing route. lib/ai/canvas-agent-runtime/loop.ts is a legacy regression
fixture and is not the Agent production execution owner.
Build and provision
Build the official zai-org/ZCode repository at commit
0a1fc56d279fd1001f78387bd81aec1c26767411 with Node 24 and its frozen lockfile:
pnpm install --frozen-lockfile --ignore-scripts --filter '@zcode/cli...', then
pnpm --filter '@zcode/cli...' build. From this project run
node scripts/zcode-agent/stage-runtime.mjs UPSTREAM_PATH RUNTIME_PATH.
The stage checks the source commit and unmodified source, includes upstream
license/notices and pins the CLI bundle checksum in manifest.json.
Production needs Linux, systemd cgroups, bubblewrap, setpriv and a verified
Linux Node 24 binary in RUNTIME_PATH/bin/node. Keep the immutable runtime owned
by root and outside task directories. No Docker image or global Node upgrade is
required. Configure the project service:
CANVAS_ZCODE_RUNTIME_DIR=/opt/yedir-canvas-zcode/currentCANVAS_ZCODE_STATE_DIR=/var/lib/yedir-canvas-agentCANVAS_ZCODE_NODE_PATH=/opt/yedir-canvas-zcode/current/bin/node
Apply the additive 0104_add_canvas_agent_runs.sql migration before the new
route is used. The host service launches a scope, drops to a unique numeric task
UID and starts unshared mount/user/PID/network/IPC namespaces. Each task mounts
only its workspace/home, read-only runtime/system binaries and its exact broker
socket. Provider/database/storage secrets remain in the authenticated host
adapter. Cgroups impose 1 GiB memory, 128 tasks and two CPU cores; the runner also
enforces wall time, output and workspace budgets. Missing sandbox components
fail closed. macOS development uses Seatbelt with the same private file scopes
and only the exact task broker TCP port; it does not provide Linux cgroup quotas.
All registered canvas business capabilities are exposed through task-scoped MCP. Ownership, enabled backend services, quotas and explicit destructive intent are still checked by the host. Local file selection and UI-only panels need the user browser; unimplemented backend functions report their limitation rather than claiming completion. Tools cannot request an arbitrary host command or model URL.
Recovery and verification
CanvasAgentRun stores ownership, leases, tool call identifiers and outputs,
cancellation/supplements, verification, native session ID and runtime provenance.
The CLI's private session files allow explicit resume. A tool is checkpointed
before execution; an unknown paid outcome prevents automatic resubmission.
Client disconnection does not abort accepted business work. Keep task directories
for resumable runs; monitor their disk usage and remove only stopped, expired
runs after their recovery window. Preserve active and immediately previous runtime
releases while rolling out or rolling back.
With ZCODE_FIXTURE_RUNTIME pointing to the built runtime, run
pnpm test:zcode-agent and pnpm test:canvas-agent. Native tests exercise the
actual CLI with a deterministic model, actual MCP, resume and OS isolation;
the adapter fixture checks idempotency, schema validation, repair scope and
uncertain results. These fixtures do not prove a configured real provider is
healthy. A release also needs a real-provider test on a private image and video
canvas, authentication/ownership probes and static-resource checks before
switching the active Next build.