Skip to content

fix(sandbox): opencode/mtr/traex/coco 沙盒下保留整个状态目录为真实路径#362

Merged
deepcoldy merged 2 commits into
masterfrom
fix/sandbox-sqlite-authpaths-family
Jul 4, 2026
Merged

fix(sandbox): opencode/mtr/traex/coco 沙盒下保留整个状态目录为真实路径#362
deepcoldy merged 2 commits into
masterfrom
fix/sandbox-sqlite-authpaths-family

Conversation

@deepcoldy

Copy link
Copy Markdown
Owner

背景 / 动机

#356 修复 codex 沙盒 SQLite 锁崩溃后的同型排查(申晗指定扩容 opencode/mtr,并点名 traex 等 codex 系)。这四个 CLI 都在 $HOME 下保留 SQLite/会话状态,但 authPaths 只 carve-out 单个 auth.json:

  • opencode / mtr:共享 ~/.local/share/opencode(opencode.db / mtr.db,均 WAL 模式)
  • traex / coco:共享 ~/.trae/cli(codex 式 state_.sqlite / logs_.sqlite + sessions rollout + history.jsonl;实测 coco 也写 state_5.sqlite)

实测发现(prepareSandbox 真实 bwrap 参数 + node-pty 驱动真 CLI,含交互提交消息)

与 codex「boot 即崩」不同,四个 CLI 当前版本在沙盒里 boot 和对话都健康(模型正常回复)——但存在三个现行缺陷:

  1. transcript bridge 断链:daemon 的 codex-bridge 系(cocoEventsPathForSession / findTraexRolloutBySessionId / findMtrSessionById)都按真实路径读会话文件,而窄 carve-out 下 CLI 写进 overlay upper → daemon 读不到(claude 系有 homeUpper 重定向,这些 CLI 没有)。实测:master 下沙盒内对话在真实目录零痕迹
  2. 首次登录丢失:authPaths 按「存在才 bind」处理,本机 ~/.local/share/opencode/auth.json 不存在 → 完全没 bind → 沙盒内 /connect 登录写进 upper,随沙盒销毁丢失
  3. SQLite 锁隐患:overlayfs 不支持 SQLite 要的 fcntl 锁已被 codex 证明致命(fix(sandbox): codex 沙盒下保留整个 ~/.codex 为真实路径,修复 SQLite 锁超时起不来 #356);这四个 CLI 当前版本对锁失败容忍,是版本运气——codex 也是加了 sqlite state runtime 后才开始崩的

改动

四个适配器 authPaths 从单文件扩到整个状态目录(与 codex #356 同款语义)+ 对应单测断言。

验证

三轮对照(每 CLI 观察 120–150s):

  • master 基线 + 交互:四个全健康但会话只落 overlay upper(真实目录 grep 零命中)
  • 修复 build + 交互:四个全健康,bwrap 含目录级 --bind;真实目录写入验证——traex 消息原文命中 history.jsonl + rollout jsonl;opencode.db / mtr.db / coco 的 state_5.sqlite-wal mtime 均落在各自测试窗口内(沙盒内 WAL 写锁正常工作)
  • pnpm vitest run test/cli-adapters.test.ts test/sandbox.test.ts test/relay-adapter.test.ts 308 通过;pnpm build 绿

代价 / 影响范围

这些 CLI 自身的会话/状态持久化到真实目录、不随沙盒隔离(与 auth 及 codex #356 相同);项目代码写入隔离(/land 审阅)不受影响。未开沙盒的 bot 无变化。当前线上无 sandbox+这四种 CLI 的 bot,属前置修复。

@deepcoldy deepcoldy merged commit 878c784 into master Jul 4, 2026
1 check passed
@deepcoldy deepcoldy deleted the fix/sandbox-sqlite-authpaths-family branch July 4, 2026 05:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant