import { describe, expect, it, vi } from
"vitest" ;
import { sandboxExplainCommand } from
"./sandbox-explain.js" ;
const SANDBOX_EXPLAIN_TEST_TIMEOUT_MS = process.platform ===
"win32" ?
45 _
000 :
30 _
000 ;
let mockCfg: unknown = {};
vi.mock(
"../config/config.js" , async () => {
const actual = await vi.importActual<
typeof import (
"../config/config.js" )>(
"../config/config.js" );
return {
...actual,
loadConfig: vi.fn().mockImplementation(() => mockCfg),
};
});
describe(
"sandbox explain command" , () => {
it(
"prints JSON shape + fix-it keys" , { timeout: SANDBOX_EXPLAIN_TEST_TIMEOUT_MS }, async (
) => {
mockCfg = {
agents: {
defaults: {
sandbox: { mode: "all" , scope: "agent" , workspaceAccess: "none" },
},
},
tools: {
sandbox: { tools: { deny: ["browser" ] } },
elevated: { enabled: true , allowFrom: { quietchat: ["*" ] } },
},
session: { store: "/tmp/openclaw-test-sessions-{agentId}.json" },
};
const logs: string[] = [];
await sandboxExplainCommand({ json: true , session: "agent:main:main" }, {
log: (msg: string) => logs.push(msg),
error: (msg: string) => logs.push(msg),
exit: (_code: number) => {},
} as unknown as Parameters<typeof sandboxExplainCommand>[1 ]);
const out = logs.join("" );
const parsed = JSON.parse(out);
expect(parsed).toHaveProperty("docsUrl" , "https://docs.openclaw.ai/sandbox ");
expect(parsed).toHaveProperty("sandbox.mode" , "all" );
expect(parsed).toHaveProperty("sandbox.tools.sources.allow.source" );
expect(Array.isArray(parsed.fixIt)).toBe(true );
expect(parsed.fixIt).toContain("agents.defaults.sandbox.mode=off" );
expect(parsed.fixIt).toContain("tools.sandbox.tools.alsoAllow" );
expect(parsed.fixIt).toContain("tools.sandbox.tools.deny" );
});
it("shows effective sandbox alsoAllow grants and default-deny removals" , async () => {
mockCfg = {
agents: {
defaults: {
sandbox: { mode: "all" , scope: "agent" , workspaceAccess: "none" },
},
list: [
{
id: "tavern" ,
tools: {
sandbox: {
tools: {
alsoAllow: ["message" , "tts" ],
},
},
},
},
],
},
tools: {
sandbox: {
tools: {
allow: ["browser" ],
},
},
},
session: { store: "/tmp/openclaw-test-sessions-{agentId}.json" },
};
const logs: string[] = [];
await sandboxExplainCommand({ json: true , agent: "tavern" }, {
log: (msg: string) => logs.push(msg),
error: (msg: string) => logs.push(msg),
exit: (_code: number) => {},
} as unknown as Parameters<typeof sandboxExplainCommand>[1 ]);
const parsed = JSON.parse(logs.join("" ));
expect(parsed.sandbox.tools.allow).toEqual(
expect.arrayContaining(["browser" , "message" , "tts" ]),
);
expect(parsed.sandbox.tools.deny).not.toContain("browser" );
expect(parsed.sandbox.tools.sources.allow).toEqual({
source: "agent" ,
key: "agents.list[].tools.sandbox.tools.alsoAllow" ,
});
});
});
Messung V0.5 in Prozent C=99 H=100 G=99
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-04)
¤
*© Formatika GbR, Deutschland