Skip to content

[Bug] 0.22.1 ACP agent migration is not atomic: partial npm install never self-heals, empty opencode version dir treated as installed, effort=max pushed to agents that reject it #396

Description

@noxenys

[Bug] 0.22.1 升级后多个 ACP agent 损坏:partial install 不自愈 / opencode 空版本目录被当已装 / effort=max 推给不支持的 agent

环境 / Environment

  • codeg: 0.22.1
  • OS: Windows 11 Pro (win32-x64)
  • node: v24.11.1, npm: 11.6.2

概述 / Summary

升级到 0.22.1 后,多个 agent 无法使用:ClaudeCode 每次连接即报错断开、OpenCode 二进制丢失。排查后是 agent 注册表/二进制迁移中途失败且没有自愈/回滚机制,不是单一 agent 的问题。下面按三个独立缺陷分述,均有日志与磁盘证据。


Bug A — ClaudeCode ACP 安装残缺,坏状态持续两周不自愈(最严重)

现象

每次拉起 ClaudeCode 都是 Connected → Error → Disconnected,内部错误:

[ACP] session/resume failed (Internal error: {
  "details": "Claude native binary not found for win32-x64. Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, or set CLAUDE_CODE_EXECUTABLE."
})

根因

~/.codeg/npm-global/node_modules/@agentclientprotocol/ 下只剩一个 npm 半成品暂存目录:

@agentclientprotocol/
└── .claude-agent-acp-NvMnBeDA/      # npm 安装中断留下的 .<pkg>-<hash> 暂存目录
    └── node_modules/                # 依赖装了
    # 根目录连 package.json 都没有,正式 claude-agent-acp 包从未生成

npm 安装被打断:依赖解压进了暂存目录的 node_modules,但包本体文件没写、暂存目录也没 rename 成正式目录。

该目录自 2026-07-16 起持续两周未被修复(目录 mtime 为证),期间 codeg 每次启动都按坏状态拉起 ClaudeCode、每次报同样的 native binary 错误,既不重装也不给可操作提示 —— 用户侧只看到"这个 agent 一直报错"。

补充观察:在 2026-07-30 手动干预并重启 codeg 后,该残缺暂存目录已被清理。说明清理逻辑存在,但触发时机太晚/条件太窄,坏状态能横跨两周和多次启动而不被处理。

期望

  • 启动/连接前校验 ACP 包完整性(正式目录 + package.json + native binary 可解析),不完整就自动重装或明确提示"安装损坏,点此重装",而不是反复用坏状态连接。
  • 安装原子化:装完再 rename/切换,失败即清理暂存目录,不留半成品。
  • native binary 缺失时给出可点击的自助入口(错误里已有 CLAUDE_CODE_EXECUTABLE 提示,但普通用户无从下手)。

Bug B — OpenCode 空版本目录被当作"已安装",二进制替换非原子

现象

OpenCode 二进制彻底丢失:旧版本 1.18.5 被删除(连 .trash 都没有),新版本目录 acp-binaries/opencode/1.18.8/空壳(无 windows-x86_64/opencode.exe)。

升级前日志还能看到版本漂移警告:

[ACP][OpenCode] Using cached binary 1.18.5 (registry recommends 1.18.8)

随后 1.18.5 被清、1.18.8 没下完,opencode 无任何可用二进制。

根因

删旧版 → 建新版目录 → 下载新版,这一串不是原子操作;中途失败后留下一个空的版本目录。codeg 见到 1.18.8/ 目录存在就当"已安装"跳过下载,于是永久无二进制。

复现 / 验证

手动 rm -rf acp-binaries/opencode/1.18.8(清掉空壳)后重启 codeg,codeg 立刻正常重下完整二进制并连上:

[ACP][OpenCode] Using cached binary 1.18.8
[ACP][OpenCode] binary_path=...\opencode\1.18.8\windows-x86_64\opencode.exe size=174403464
[ACP] status_changed session=None Connecting -> Connected

即:空壳版本目录就是卡点,删掉即恢复。

期望

  • 判断"已安装"要校验目录内实际存在可执行文件,而非目录存在即可。
  • 二进制升级原子化:下到临时目录校验完成后再切换,失败不动旧版本。

Bug C — effort=max 被推给不支持该档位的 agent(opencode)

现象

每次连接 OpenCode 都刷 ERROR(不影响运行,但污染日志):

[ACP] failed to apply preferred config 'effort'='max' on connect:
  Invalid params: effort not found: max: { "effort": "max" }

根因

OpenCode 的 effort 枚举只有 low/medium/high,不含 max。codeg 把全局/当前选中的 effort=max 无差别下推给 opencode,未按 agent 能力做校验/clamp。

期望

下推 preferred config 前按目标 agent 声明的 capability 过滤或 clamp(如 max→high),不支持的键静默跳过或降级,不刷 ERROR。


次要 / Secondary

升级后老会话无法 resume:Codex no rollout found for thread id ...、Claude/opencode session/resumeloadnew 回退。会话数据本身还在(conversation 表 469 条),但旧 rollout 与新 agent 版本不兼容。建议迁移时做 rollout 兼容或至少提示用户。


临时 workaround(给遇到同问题的人)

  • ClaudeCode:把暂存目录里可用的 claude.exe 拷到稳定路径(如 ~/.codeg/bin/claude.exe),在该 agent 的环境变量里设 CLAUDE_CODE_EXECUTABLE 指过去。
  • OpenCode:删掉 acp-binaries/opencode/<空版本目录>,重启让 codeg 干净重下。
  • effort 噪声:暂无干净绕过(改 delegation.agent_defaults 无效,该值非此来源),只能在 UI 给该会话选非 max 档。

均已在本机验证:重启后 ClaudeCode / OpenCode / Codex 三者都能 Connecting → Connected

根因一句话

agent 的 npm 包 / 二进制安装与替换不是原子操作,失败后既不回滚也不及时自愈,加上下推 preferred config 不按 agent 能力适配,三者在 0.22.1 一起暴露。

备注

我只从本机日志、磁盘状态和 SQLite 配置反推根因,没有读过源码,所以上面"期望"部分是行为层建议,具体该在哪层修由你们判断。如果需要更多日志(完整 codeg.2026-07-30.log 等)或愿意的话我可以试着提 PR,请告知希望改动的模块。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions