mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-19 02:11:35 +00:00
* 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>
79 lines
2.6 KiB
TypeScript
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");
|
|
});
|
|
});
|