fix(sandbox): include containerWorkdir in sandboxInfo for rw access (#4171)

This commit is contained in:
Ozgur Polat 2026-01-29 22:35:09 +01:00
parent 8e792928bf
commit ff92e5650a
3 changed files with 81 additions and 1 deletions

View File

@ -73,6 +73,7 @@ Status: beta.
### Fixes
- Discord: restore username directory lookup in target resolution. (#3131) Thanks @bonald.
- Sandbox: include containerWorkdir in sandboxInfo for rw access so agents see correct Docker mount paths. Fixes #4171.
- Agents: align MiniMax base URL test expectation with default provider config. (#3131) Thanks @bonald.
- Agents: prevent retries on oversized image errors and surface size limits. (#2871) Thanks @Suksham-sharma.
- Agents: inherit provider baseUrl/api for inline models. (#2740) Thanks @lploc94.

View File

@ -143,6 +143,76 @@ describe("buildEmbeddedSandboxInfo", () => {
hostBrowserAllowed: true,
});
});
it("includes containerWorkdir as agentWorkspaceMount for rw access", () => {
const sandbox = {
enabled: true,
sessionKey: "session:test",
workspaceDir: "/tmp/moltbot-sandbox",
agentWorkspaceDir: "/tmp/moltbot-workspace",
workspaceAccess: "rw",
containerName: "moltbot-sbx-test",
containerWorkdir: "/workspace",
docker: {
image: "moltbot-sandbox:bookworm-slim",
containerPrefix: "moltbot-sbx-",
workdir: "/workspace",
readOnlyRoot: true,
tmpfs: ["/tmp"],
network: "none",
user: "1000:1000",
capDrop: ["ALL"],
env: { LANG: "C.UTF-8" },
},
tools: {
allow: ["exec"],
deny: ["browser"],
},
browserAllowHostControl: false,
} satisfies SandboxContext;
expect(buildEmbeddedSandboxInfo(sandbox)).toEqual({
enabled: true,
workspaceDir: "/tmp/moltbot-sandbox",
workspaceAccess: "rw",
agentWorkspaceMount: "/workspace",
hostBrowserAllowed: false,
});
});
it("includes /agent as agentWorkspaceMount for ro access", () => {
const sandbox = {
enabled: true,
sessionKey: "session:test",
workspaceDir: "/tmp/moltbot-sandbox",
agentWorkspaceDir: "/tmp/moltbot-workspace",
workspaceAccess: "ro",
containerName: "moltbot-sbx-test",
containerWorkdir: "/workspace",
docker: {
image: "moltbot-sandbox:bookworm-slim",
containerPrefix: "moltbot-sbx-",
workdir: "/workspace",
readOnlyRoot: true,
tmpfs: ["/tmp"],
network: "none",
user: "1000:1000",
capDrop: ["ALL"],
env: { LANG: "C.UTF-8" },
},
tools: {
allow: ["exec"],
deny: ["browser"],
},
browserAllowHostControl: false,
} satisfies SandboxContext;
expect(buildEmbeddedSandboxInfo(sandbox)).toEqual({
enabled: true,
workspaceDir: "/tmp/moltbot-sandbox",
workspaceAccess: "ro",
agentWorkspaceMount: "/agent",
hostBrowserAllowed: false,
});
});
it("includes elevated info when allowed", () => {
const sandbox = {
enabled: true,

View File

@ -8,11 +8,20 @@ export function buildEmbeddedSandboxInfo(
): EmbeddedSandboxInfo | undefined {
if (!sandbox?.enabled) return undefined;
const elevatedAllowed = Boolean(execElevated?.enabled && execElevated.allowed);
// For rw access, the agent workspace is mounted at containerWorkdir (typically /workspace).
// For ro access, the agent workspace is mounted read-only at /agent.
// For none access, there is no agent workspace mount.
const agentWorkspaceMount =
sandbox.workspaceAccess === "rw"
? sandbox.containerWorkdir
: sandbox.workspaceAccess === "ro"
? "/agent"
: undefined;
return {
enabled: true,
workspaceDir: sandbox.workspaceDir,
workspaceAccess: sandbox.workspaceAccess,
agentWorkspaceMount: sandbox.workspaceAccess === "ro" ? "/agent" : undefined,
agentWorkspaceMount,
browserBridgeUrl: sandbox.browser?.bridgeUrl,
browserNoVncUrl: sandbox.browser?.noVncUrl,
hostBrowserAllowed: sandbox.browserAllowHostControl,