
























@@ -1,3 +1,5 @@
1+// Docker sandbox recreation tests cover config-hash labels, bind ordering, and
2+// mount labels used to decide when shared containers must be rebuilt.
13import { EventEmitter } from "node:events";
24import fs from "node:fs";
35import os from "node:os";
@@ -58,6 +60,8 @@ function createMockDockerChild(): MockDockerChild {
5860}
59616062function spawnDockerProcess(command: string, args: string[]) {
63+// The tests assert docker CLI arguments without requiring Docker; this mock
64+// implements only the inspect/create/start/rm calls used by ensureSandboxContainer.
6165spawnState.calls.push({ command, args });
6266const child = createMockDockerChild();
6367@@ -212,13 +216,11 @@ describe("ensureSandboxContainer config-hash recreation", () => {
212216});
213217214218it("recreates shared container when array-order change alters hash", async () => {
219+// Docker flag order is part of the runtime contract, so order-sensitive
220+// config changes must invalidate a shared container.
215221const workspaceDir = makeTempDir();
216-const oldCfg = createSandboxConfig(["1.1.1.1", "8.8.8.8"], [
217-`${workspaceDir}:/workspace:rw`,
218-]);
219-const newCfg = createSandboxConfig(["8.8.8.8", "1.1.1.1"], [
220-`${workspaceDir}:/workspace:rw`,
221-]);
222+const oldCfg = createSandboxConfig(["1.1.1.1", "8.8.8.8"], [`${workspaceDir}:/workspace:rw`]);
223+const newCfg = createSandboxConfig(["8.8.8.8", "1.1.1.1"], [`${workspaceDir}:/workspace:rw`]);
222224223225const oldHash = computeSandboxConfigHash({
224226docker: oldCfg.docker,
@@ -324,10 +326,7 @@ describe("ensureSandboxContainer config-hash recreation", () => {
324326const workspaceDir = makeTempDir();
325327const customRoot = makeTempDir();
326328const customUserFile = path.join(customRoot, "USER.md");
327-const cfg = createSandboxConfig(
328-["1.1.1.1"],
329-[`${customUserFile}:/workspace/USER.md:ro`],
330-);
329+const cfg = createSandboxConfig(["1.1.1.1"], [`${customUserFile}:/workspace/USER.md:ro`]);
331330cfg.docker.dangerouslyAllowExternalBindSources = true;
332331const expectedHash = computeSandboxConfigHash({
333332docker: cfg.docker,
@@ -360,6 +359,8 @@ describe("ensureSandboxContainer config-hash recreation", () => {
360359});
361360362361it("applies read-only skill overlays after custom binds", async () => {
362+// Protected skill overlays must be appended last so even an overlapping
363+// custom bind cannot make checked-in skills writable.
363364const workspaceDir = makeTempDir();
364365const customRoot = makeTempDir();
365366fs.mkdirSync(path.join(workspaceDir, "skills", "demo"), { recursive: true });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。