import { SpritesClient } from "@fly/sprites";
import { Mesa } from "@mesadev/sdk";
const mesa = new Mesa({ apiKey: process.env.MESA_API_KEY });
const client = new SpritesClient(process.env.SPRITES_TOKEN);
// --- Outside the sandbox: set up Mesa resources ---
// Create a repo (or use an existing one)
const repo = await mesa.repos.create({ name: "agent-workspace" });
// Create a scoped, short-lived API key for the sandbox
const ephemeralKey = await mesa.apiKeys.create({
name: "sandbox-session",
scopes: ["read", "write"],
expires_in_seconds: 3600, // 1 hour
// Optional: scope the key to a specific repo for better security
// repo_ids: [repoId1, repoId2, ...],
});
// --- Inside the sandbox: install and mount Mesa ---
const sprite = await client.createSprite("mesa-sandbox");
// Install the Mesa CLI.
// Sprites exposes /dev/fuse as root-only by default, so we also fix permissions.
await sprite.execFile("sh", [
"-c",
[
"curl -fsSL https://mesa.dev/install.sh | sh",
"sed -i 's/^#user_allow_other/user_allow_other/' /etc/fuse.conf",
"chmod 666 /dev/fuse",
].join(" && "),
]);
// Start Mesa as a background daemon.
// MESA_ORGS configures the org and API key in one step.
await sprite.execFile("sh", [
"-c",
`MESA_ORGS=my-org:${ephemeralKey.key} mesa mount -d -y`,
]);
// --- Run your agent ---
await sprite.execFile("sh", [
"-c",
'cd ~/.local/share/mesa/mnt/my-org/agent-workspace \
&& claude "Implement the feature described in TODO.md"',
]);
// Clean up when done
await sprite.destroy();