24 lines
1.3 KiB
JavaScript
24 lines
1.3 KiB
JavaScript
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { readFileSync } from "node:fs";
|
|
import { createRequire } from "node:module";
|
|
const require = createRequire(new URL("../packages/harness/package.json", import.meta.url));
|
|
const { parse } = require("yaml");
|
|
const c = parse(readFileSync(new URL("../compose.sandbox.yaml", import.meta.url), "utf8"));
|
|
test("agent sandbox is non-root, read-only, limited and internal-network-only", () => {
|
|
const a = c.services.agent;
|
|
assert.equal(a.user,"1000:1000"); assert.equal(a.read_only,true);
|
|
assert.deepEqual(a.cap_drop,["ALL"]); assert.ok(a.security_opt.includes("no-new-privileges:true"));
|
|
assert.equal(a.pids_limit,128); assert.ok(a.cpus>0); assert.ok(a.mem_limit);
|
|
assert.deepEqual(a.networks,["isolated"]); assert.equal(c.networks.isolated.internal,true);
|
|
assert.ok(a.ports.every(p=>p.startsWith("127.0.0.1:")));
|
|
assert.deepEqual(a.volumes,["sandbox-data:/app/workspace"]);
|
|
assert.equal(a.privileged,undefined);
|
|
});
|
|
test("credentials are not copied or loaded wholesale into the image", () => {
|
|
const dockerfile = readFileSync(new URL("../Dockerfile",import.meta.url),"utf8");
|
|
assert.ok(!/COPY\s+\.\s|COPY.*\.env|docker.sock/.test(dockerfile));
|
|
assert.equal(c.services.agent.env_file,undefined);
|
|
assert.equal(c.services.egress.environment.ANTHROPIC_API_KEY,undefined);
|
|
});
|