Files
openclaw/extensions/mxc/test/sandbox-baseline.test.ts
Paul Campbell 008f04a656 feat(mxc): add Windows MXC sandbox backend (#97086)
* feat(mxc): add Windows MXC sandbox backend

Add the official MXC sandbox plugin package with Windows ProcessContainer execution, plugin-owned MXC SDK dependency packaging, host-backed filesystem bridge support, and configured MXC policy file loading via mxcPolicyPaths.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(mxc): preserve Windows binary override paths

* fix: remove stray sandbox barrel export

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 9ea19539-b8ca-44fb-93bd-b8496e3deb2c

* fix(mxc): address sandbox review feedback

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix(mxc): satisfy test type checks

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix(mxc): clarify protected skill enforcement

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* test(mxc): align fail-closed expectations

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix(mxc): satisfy extension lint

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix(plugin-sdk): narrow fs-safe remove surface

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* fix(mxc): repair rebased CI failures

* fix(scripts): declare shrinkwrap override normalizer

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Gio Della-Libera <235387111+giodl73-repo@users.noreply.github.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-07-12 23:07:25 -07:00

79 lines
2.6 KiB
TypeScript

import { describe, expect, test } from "vitest";
import {
DEFAULT_SANDBOX_BASELINE,
resolveBaselineReadonlyPaths,
resolveSandboxBaseline,
resolveSandboxTempDir,
} from "../src/sandbox-baseline.js";
describe("resolveSandboxBaseline", () => {
test("returns enforceable defaults", () => {
expect(resolveSandboxBaseline()).toEqual(DEFAULT_SANDBOX_BASELINE);
expect(resolveSandboxBaseline().filesystem.restrictToProjectDir).toBe(true);
expect(resolveSandboxBaseline().process.timeoutSeconds).toBe(300);
expect(resolveSandboxBaseline().process.timeoutSecondsConfigured).toBe(false);
});
test("merges partial input with defaults", () => {
const baseline = resolveSandboxBaseline({
filesystem: {
restrictToProjectDir: false,
additionalReadonlyPaths: ["C:\\tools\\readonly"],
additionalReadwritePaths: ["C:\\work\\scratch"],
},
process: {
timeoutSeconds: 45,
},
});
expect(baseline.filesystem.restrictToProjectDir).toBe(false);
expect(baseline.filesystem.additionalReadonlyPaths).toEqual(["C:\\tools\\readonly"]);
expect(baseline.filesystem.additionalReadwritePaths).toEqual(["C:\\work\\scratch"]);
expect(baseline.process.timeoutSeconds).toBe(45);
expect(baseline.process.timeoutSecondsConfigured).toBe(true);
});
test("rejects invalid timeout values", () => {
expect(() => resolveSandboxBaseline({ process: { timeoutSeconds: 0 } })).toThrow(
/timeoutSeconds/u,
);
expect(() => resolveSandboxBaseline({ process: { timeoutSeconds: Number.NaN } })).toThrow(
/timeoutSeconds/u,
);
});
});
describe("effective filesystem policy", () => {
test("derives baseline readonly directories from the host Windows env", () => {
const paths = resolveBaselineReadonlyPaths({
SystemRoot: "D:\\Windows",
ProgramFiles: "D:\\Program Files",
"ProgramFiles(x86)": "D:\\Program Files (x86)",
});
expect(paths).toEqual([
"D:\\Program Files",
"D:\\Program Files (x86)",
"D:\\Windows\\System32",
"D:\\Windows\\SysWOW64",
]);
});
test("uses deterministic fallback readonly directories when env values are absent", () => {
expect(resolveBaselineReadonlyPaths({})).toEqual([
"C:\\Program Files",
"C:\\Program Files (x86)",
"C:\\Windows\\System32",
"C:\\Windows\\SysWOW64",
]);
});
test("prefers the configured Windows temp directory", () => {
expect(resolveSandboxTempDir({ TEMP: "C:\\Temp" })).toBe("C:\\Temp");
});
test("uses Windows temp when TEMP and TMP are absent", () => {
expect(resolveSandboxTempDir({})).toBe("C:\\Windows\\Temp");
});
});