feat(pi-bridge): worker 按档位套沙箱 —— plan/workspace 进 Landlock 边界,full 档不进
上一步(1f48c5c)做出并验了边界工具;这一步把它接到 worker 的启动路径上, 于是「工作区档 = 本目录内可动」第一次由**内核**保证。 ## 规矩 - `plan` / `workspace` 档 → `am-sandbox --rw <会话工作区> … -- node worker.mjs` - `full` 档 → **不套**(发件人已声明全权,与档位表一致) - 拿不到会话工作区 → **不套**,并把理由打进日志(猜一个 `--rw` 会让"界内也写不了") - 启动方式从 `fork` 换成 `spawn`(fork 只会 exec node,套不进中间那层), `stdio` 里带 `'ipc'` 时 node 同样设 `NODE_CHANNEL_FD`,而沙箱是 exec 透传 ⇒ worker 的 `process.send` 照常可用 ## rw 清单是**实测得出**的,不是想当然 `lib/sandbox.js` 里那几条(会话工作区 / `os.tmpdir()` / `<agentDir>/sessions` / `AGENTMAIL_CONFIG_DIR` / `--rw-file /dev/null`)每条都对应一个真实的失败模式: 少了 `/dev/null`,`cmd 2>/dev/null` 一律 Permission denied(实测撞到);少了 `<agentDir>/sessions`,回合结束保存会话就失败。真机验证:一个**真实的 pi agent** 跑在边界里,界内写成功、`/opt` 被拒(Permission denied),并如实汇报两者。 ## 两处必须收成一处的东西 - 会话工作区由**父进程**用与 worker 同一个函数解析(`resolveWorkspaceCwd`)—— 父进程猜一个目录当 rw、worker 落在另一个,症状是最难查的那一类 - `piMailFallback` 从 worker 挪进 `lib/workspace.js`:父进程要用同一个兜底值 ## 判据与踩到的坑 - `sandbox-launch.test.mjs` 6 条行为断言(套/不套、rw 里有 cwd 与 /dev/null、 `--` 之后是 node+worker、拿不到 cwd 时的理由、env 开关三态、rw 去重与只收存在的路径)。 变异"永不套沙箱" ⇒ 恰好那几条红。 - ★ 池测试原先会**随这台机器装没装 am-sandbox 而变** —— 那正是假绿的来源。 给 `createWorkerPool` 加了 `env` 注入点,测试显式 `AGENTMAIL_PI_SANDBOX=off`。 - ★ 给 import 起名 `spawn` 撞上本文件已有的 `function spawn(job)` ⇒ 自己调自己 (`RangeError: Maximum call stack size exceeded`,池测试当场红)。改名 `spawnProcess`。 - pi 桥全套 485 项通过。
This commit is contained in:
@ -96,6 +96,9 @@ function makePool(opts = {}) {
|
||||
workerMaxMs: opts.workerMaxMs ?? 5000,
|
||||
maxAttempts: opts.maxAttempts,
|
||||
workerPath: opts.workerPath || STUB,
|
||||
// 桩 worker 验的是调度不变量;沙箱开关属于另一条判据(sandbox-launch.test.mjs)。
|
||||
// 不显式关掉的话,判据会随"这台机器装没装 am-sandbox"而变 —— 那正是假绿的来源。
|
||||
env: { AGENTMAIL_PI_SANDBOX: 'off' },
|
||||
});
|
||||
return { pool, lines };
|
||||
}
|
||||
@ -221,6 +224,7 @@ test('config() 每次派活时重取:allowedModels 随心跳变,不能用快
|
||||
onReconfigure: () => {},
|
||||
maxWorkers: 1,
|
||||
workerMaxMs: 5000,
|
||||
env: { AGENTMAIL_PI_SANDBOX: 'off' },
|
||||
workerPath: STUB,
|
||||
});
|
||||
p2.submit('mail', { mail_id: 'c1', session_id: 'C1', __hold: 20 });
|
||||
|
||||
Reference in New Issue
Block a user