docs: clarify sandbox non-main behavior
This commit is contained in:
@@ -16,6 +16,8 @@ sessions.
|
|||||||
resolve relative paths against the workspace, but absolute paths can still reach
|
resolve relative paths against the workspace, but absolute paths can still reach
|
||||||
elsewhere on the host unless sandboxing is enabled. If you need isolation, use
|
elsewhere on the host unless sandboxing is enabled. If you need isolation, use
|
||||||
[`agent.sandbox`](/gateway/sandboxing) (and/or per‑agent sandbox config).
|
[`agent.sandbox`](/gateway/sandboxing) (and/or per‑agent sandbox config).
|
||||||
|
When sandboxing is enabled and `workspaceAccess` is not `"rw"`, tools operate
|
||||||
|
inside a sandbox workspace under `~/.clawdbot/sandboxes`, not your host workspace.
|
||||||
|
|
||||||
## Default location
|
## Default location
|
||||||
|
|
||||||
|
|||||||
@@ -1473,6 +1473,7 @@ Controls session scoping, idle expiry, reset triggers, and where the session sto
|
|||||||
|
|
||||||
Fields:
|
Fields:
|
||||||
- `mainKey`: direct-chat bucket key (default: `"main"`). Useful when you want to “rename” the primary DM thread without changing `agentId`.
|
- `mainKey`: direct-chat bucket key (default: `"main"`). Useful when you want to “rename” the primary DM thread without changing `agentId`.
|
||||||
|
- Sandbox note: `agent.sandbox.mode: "non-main"` uses this key to detect the main session. Any session key that does not match `mainKey` (groups/channels) is sandboxed.
|
||||||
- `agentToAgent.maxPingPongTurns`: max reply-back turns between requester/target (0–5, default 5).
|
- `agentToAgent.maxPingPongTurns`: max reply-back turns between requester/target (0–5, default 5).
|
||||||
- `sendPolicy.default`: `allow` or `deny` fallback when no rule matches.
|
- `sendPolicy.default`: `allow` or `deny` fallback when no rule matches.
|
||||||
- `sendPolicy.rules[]`: match by `provider`, `chatType` (`direct|group|room`), or `keyPrefix` (e.g. `cron:`). First deny wins; otherwise allow.
|
- `sendPolicy.rules[]`: match by `provider`, `chatType` (`direct|group|room`), or `keyPrefix` (e.g. `cron:`). First deny wins; otherwise allow.
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ Not sandboxed:
|
|||||||
- `"off"`: no sandboxing.
|
- `"off"`: no sandboxing.
|
||||||
- `"non-main"`: sandbox only **non-main** sessions (default if you want normal chats on host).
|
- `"non-main"`: sandbox only **non-main** sessions (default if you want normal chats on host).
|
||||||
- `"all"`: every session runs in a sandbox.
|
- `"all"`: every session runs in a sandbox.
|
||||||
|
Note: `"non-main"` is based on `session.mainKey` (default `"main"`), not agent id.
|
||||||
|
Group/channel sessions use their own keys, so they count as non-main and will be sandboxed.
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
`agent.sandbox.scope` controls **how many containers** are created:
|
`agent.sandbox.scope` controls **how many containers** are created:
|
||||||
|
|||||||
@@ -122,6 +122,19 @@ or state drift because only one workspace is active.
|
|||||||
**Fix:** keep a single active workspace and archive/remove the rest. See
|
**Fix:** keep a single active workspace and archive/remove the rest. See
|
||||||
[Agent workspace](/concepts/agent-workspace#legacy-workspace-folders).
|
[Agent workspace](/concepts/agent-workspace#legacy-workspace-folders).
|
||||||
|
|
||||||
|
### Main chat running in a sandbox workspace
|
||||||
|
|
||||||
|
Symptoms: `pwd` or file tools show `~/.clawdbot/sandboxes/...` even though you
|
||||||
|
expected the host workspace.
|
||||||
|
|
||||||
|
**Why:** `agent.sandbox.mode: "non-main"` keys off `session.mainKey` (default `"main"`).
|
||||||
|
Group/channel sessions use their own keys, so they are treated as non-main and
|
||||||
|
get sandbox workspaces.
|
||||||
|
|
||||||
|
**Fix options:**
|
||||||
|
- If you want host workspaces for an agent: set `routing.agents.<id>.sandbox.mode: "off"`.
|
||||||
|
- If you want host workspace access inside sandbox: set `workspaceAccess: "rw"` for that agent.
|
||||||
|
|
||||||
### "Agent was aborted"
|
### "Agent was aborted"
|
||||||
|
|
||||||
The agent was interrupted mid-response.
|
The agent was interrupted mid-response.
|
||||||
|
|||||||
@@ -252,6 +252,15 @@ The global `agent.workspace` and `agent.sandbox` are still supported for backwar
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Common Pitfall: "non-main"
|
||||||
|
|
||||||
|
`sandbox.mode: "non-main"` is based on `session.mainKey` (default `"main"`),
|
||||||
|
not the agent id. Group/channel sessions always get their own keys, so they
|
||||||
|
are treated as non-main and will be sandboxed. If you want an agent to never
|
||||||
|
sandbox, set `routing.agents.<id>.sandbox.mode: "off"`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
After configuring multi-agent sandbox and tools:
|
After configuring multi-agent sandbox and tools:
|
||||||
|
|||||||
@@ -19,6 +19,23 @@ Recommended path: use the **CLI onboarding wizard** (`clawdbot onboard`). It set
|
|||||||
|
|
||||||
If you want the deeper reference pages, jump to: [Wizard](/start/wizard), [Setup](/start/setup), [Pairing](/start/pairing), [Security](/gateway/security).
|
If you want the deeper reference pages, jump to: [Wizard](/start/wizard), [Setup](/start/setup), [Pairing](/start/pairing), [Security](/gateway/security).
|
||||||
|
|
||||||
|
Sandboxing note: `agent.sandbox.mode: "non-main"` uses `session.mainKey` (default `"main"`),
|
||||||
|
so group/channel sessions are sandboxed. If you want the main agent to always
|
||||||
|
run on host, set an explicit per-agent override:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"routing": {
|
||||||
|
"agents": {
|
||||||
|
"main": {
|
||||||
|
"workspace": "~/clawd",
|
||||||
|
"sandbox": { "mode": "off" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 0) Prereqs
|
## 0) Prereqs
|
||||||
|
|
||||||
- Node `>=22`
|
- Node `>=22`
|
||||||
|
|||||||
Reference in New Issue
Block a user