diff --git a/vendor/agents/docs/content/docs/index.mdx b/vendor/agents/docs/content/docs/index.mdx
index ce484398..9e40bd51 100644
--- a/vendor/agents/docs/content/docs/index.mdx
+++ b/vendor/agents/docs/content/docs/index.mdx
@@ -89,7 +89,7 @@ Each agent on Rivet is one [Rivet Actor](/actors/docs). You define the agent onc
Give agents model access with your own provider keys.
- Run an agent's file and shell tools in E2B, Daytona, or your own provider.
+ Run an agent's file and shell tools in E2B, Daytona, Freestyle, or your own provider.
Give an agent tools that run in your backend, with your APIs and secrets.
diff --git a/vendor/agents/docs/content/docs/quickstart.mdx b/vendor/agents/docs/content/docs/quickstart.mdx
index 300eadd7..e429c688 100644
--- a/vendor/agents/docs/content/docs/quickstart.mdx
+++ b/vendor/agents/docs/content/docs/quickstart.mdx
@@ -94,9 +94,10 @@ npm add @rivet-dev/sandbox-adapter
+
-[agentOS](/agentos/docs) needs no provider account. For E2B, install `e2b` and set `E2B_API_KEY`. For Daytona, install `@daytonaio/sdk` and set `DAYTONA_API_KEY`. See [Sandboxes](/agents/docs/sandboxes).
+[agentOS](/agentos/docs) needs no provider account. For E2B, install `e2b` and set `E2B_API_KEY`. For Daytona, install `@daytonaio/sdk` and set `DAYTONA_API_KEY`. For Freestyle, install `freestyle` and set `FREESTYLE_API_KEY`. See [Sandboxes](/agents/docs/sandboxes).
diff --git a/vendor/agents/docs/content/docs/sandboxes.mdx b/vendor/agents/docs/content/docs/sandboxes.mdx
index 4528d3b8..590d8d80 100644
--- a/vendor/agents/docs/content/docs/sandboxes.mdx
+++ b/vendor/agents/docs/content/docs/sandboxes.mdx
@@ -1,6 +1,6 @@
---
title: "Sandboxes"
-description: "Run an agent without a sandbox, or give it a shell in agentOS, E2B, Daytona, or a sandbox provider you write."
+description: "Run an agent without a sandbox, or give it a shell in agentOS, E2B, Daytona, Freestyle, or a sandbox provider you write."
---
An agent doesn't need a sandbox. Without one, its file tools work on files in the Actor's own database. Add a sandbox only when the agent needs a shell.
@@ -27,28 +27,30 @@ See [Built-in Tools](/agents/docs/built-in-tools) for what each tool does.
When the agent needs to run commands, such as tests or a build, pass a sandbox provider. `@rivet-dev/sandbox-adapter` gives each Actor its own sandbox, and `CodingTools` run there.
-
@@ -80,6 +82,7 @@ agentOS needs no provider account. To use E2B or Daytona instead, see
| [agentOS](/agentos/docs) | None | Sleeps when idle, and keeps its files | Left in place |
| E2B | `e2b` | Paused | Deleted |
| Daytona | `@daytonaio/sdk` | Stopped | Deleted |
+| Freestyle | `freestyle` | Paused | Deleted |
Provider credentials stay on your worker and never enter the sandbox.
@@ -129,6 +132,22 @@ npm add @rivet-dev/sandbox-adapter @daytonaio/sdk
The working directory is the sandbox's own working directory. A stopped sandbox is started again the next time the Actor uses it.
+### Freestyle
+
+```sh
+npm add @rivet-dev/sandbox-adapter freestyle
+```
+
+
+
+| Option | Description |
+| --- | --- |
+| `create` | Options for Freestyle's `vms.create`, or a function that receives the Actor context and returns them. Required, because `firewall` is required. |
+| `client` | A Freestyle client. Defaults to `new Freestyle()`, which reads `FREESTYLE_API_KEY`. |
+| `cwd` | Working directory inside the VM. Created when the Actor connects. Defaults to `/workspace`. |
+
+A Freestyle VM has no network access until a `firewall` rule allows it. Commands run as `root` through Python 3, so the image must include it. Every `freestyle/ubuntu*` snapshot does.
+
## How the sandbox is managed
- The sandbox is created the first time the agent needs it.
diff --git a/vendor/agents/examples/docs/package.json b/vendor/agents/examples/docs/package.json
index a7a477b9..644f0c84 100644
--- a/vendor/agents/examples/docs/package.json
+++ b/vendor/agents/examples/docs/package.json
@@ -17,13 +17,14 @@
"@rivet-dev/pi": "workspace:*",
"@rivet-dev/sandbox-adapter": "workspace:*",
"@rivet-dev/workflows": "1.0.0",
- "@rivetkit/react": "2.3.23",
+ "@rivetkit/react": "2.3.26",
"@slack/web-api": "^8.2.0",
"discord-interactions": "^4.4.0",
"e2b": "^2.51.0",
+ "freestyle": "^0.2.16",
"hono": "^4.13.12",
"react": "^19.3.0",
- "rivetkit": "2.3.23"
+ "rivetkit": "2.3.26"
},
"devDependencies": {
"@types/node": "^24.0.0",
diff --git a/vendor/agents/examples/docs/sandboxes/freestyle.ts b/vendor/agents/examples/docs/sandboxes/freestyle.ts
new file mode 100644
index 00000000..d0dab1c9
--- /dev/null
+++ b/vendor/agents/examples/docs/sandboxes/freestyle.ts
@@ -0,0 +1,30 @@
+import { createRegistry } from "@earendil-works/pi-durable";
+import { CodingTools } from "@earendil-works/pi-durable/tools";
+import { pi } from "@rivet-dev/pi";
+import { freestyleProvider } from "@rivet-dev/sandbox-adapter/freestyle";
+import { setup } from "rivetkit";
+
+// read, write, edit, and bash, running in the sandbox
+const extensions = createRegistry();
+extensions.install(CodingTools);
+
+const agent = pi({
+ model: "anthropic/claude-opus-5-5",
+ registry: extensions,
+ sandbox: freestyleProvider({
+ create: {
+ snapshotId: "freestyle/ubuntu-sm",
+ // A VM has no network access until a rule allows it. This allows DNS and HTTPS out.
+ firewall: {
+ rules: [
+ { action: "allow", source: {}, destination: { public: true, port: 53, protocol: "udp" } },
+ { action: "allow", source: {}, destination: { public: true, port: 443, protocol: "tcp" } },
+ ],
+ },
+ },
+ }),
+});
+
+export const registry = setup({ use: { agent } });
+
+registry.start();