Skip to content

Start typing to search the documentation.

boxd

Last updated View as Markdown

The boxd adapter adapts an already-initialized boxd Box from @boxd-sh/sdk into Flue’s sandbox interface. Use it when an agent needs a provider-backed Linux virtual machine with filesystem and shell behavior rather than the lightweight default workspace.

Quickstart

Add provider-backed Linux VM sandbox capability to an existing Flue project with the boxd blueprint. Run the following command in your terminal or coding agent of choice:

flue add sandbox boxd

Overview

The boxd blueprint installs @boxd-sh/sdk when needed and creates sandboxes/boxd.ts in your source-root. The generated adapter accepts an application-created boxd Box; it does not create, retain, or delete the VM.

// flue-blueprint: sandbox/boxd@1
import { createSandboxSessionEnv } from '@flue/runtime';
import type { SandboxApi, SandboxFactory, SessionEnv, FileStat } from '@flue/runtime';
import type { Box as BoxdBox } from '@boxd-sh/sdk';

export interface BoxdAdapterOptions {
  cwd?: string;
  readyTimeoutMs?: number;
}

async function waitForReady(box: BoxdBox, timeoutMs: number): Promise<void> {
  /* Polls box.exec(['true']) until the VM is ready or the deadline passes. */
}

function shellQuote(value: string): string {
  return `'${value.replace(/'/g, `'\\''`)}'`;
}

class BoxdSandboxApi implements SandboxApi {
  constructor(private box: BoxdBox) {}

  /* Adapts direct boxd file reads and writes. */

  /* Implements stat, readdir, exists, mkdir, and rm with quoted shell utilities. */

  /* Runs commands through bash -lc and forwards env and timeoutMs unchanged. */
}

export function boxd(box: BoxdBox, options?: BoxdAdapterOptions): SandboxFactory {
  let readyPromise: Promise<void> | undefined;
  return {
    async createSessionEnv(): Promise<SessionEnv> {
      const sandboxCwd = options?.cwd ?? '/home/boxd';
      readyPromise ??= waitForReady(box, options?.readyTimeoutMs ?? 30_000);
      await readyPromise;
      const api = new BoxdSandboxApi(box);
      return createSandboxSessionEnv(api, sandboxCwd);
    },
  };
}

Passing boxd(box) as an agent’s sandbox waits for that VM’s exec endpoint once, then exposes its files and Linux shell through Flue. Relative paths resolve from /home/boxd unless you set cwd; command timeouts remain in milliseconds, stat validates GNU metadata output, and rm receives the requested recursive and force flags, while VM identity, credentials, networking, persistence, and cleanup remain application-owned.

Configure

VariablePurpose
BOXD_API_KEYAlternative authentication — Authenticates with boxd when a short-lived token is not used.
BOXD_TOKENAlternative authentication — Provides provider-supported short-lived authentication instead of BOXD_API_KEY.
RequirementPurpose
One boxd credentialRequired — Uses either BOXD_API_KEY or BOXD_TOKEN.
@boxd-sh/sdk packageRequired — Creates the Linux VM adapted to SandboxFactory.
Application-owned lifecycleRequired — Creates, reuses, and deletes the VM.

The generated adapter expects your application to create and own the boxd VM. It does not decide VM identity, retention, or cleanup for you.

Use it when

Choose boxd when a task requires real Linux command behavior in an isolated provider VM, particularly where a separate VM per workspace or agent instance is part of your application design.

Before reusing a VM across sessions or tenants, define identity, authorization, egress, secrets, and cleanup policies. Conversation persistence remains controlled separately by Flue session storage.

See Sandboxes for execution-boundary design and Sandbox Adapter API for the adapter contract.