[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/resume→load→new 回退。会话数据本身还在(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,请告知希望改动的模块。
[Bug] 0.22.1 升级后多个 ACP agent 损坏:partial install 不自愈 / opencode 空版本目录被当已装 / effort=max 推给不支持的 agent
环境 / Environment
概述 / Summary
升级到 0.22.1 后,多个 agent 无法使用:ClaudeCode 每次连接即报错断开、OpenCode 二进制丢失。排查后是 agent 注册表/二进制迁移中途失败且没有自愈/回滚机制,不是单一 agent 的问题。下面按三个独立缺陷分述,均有日志与磁盘证据。
Bug A — ClaudeCode ACP 安装残缺,坏状态持续两周不自愈(最严重)
现象
每次拉起 ClaudeCode 都是
Connected → Error → Disconnected,内部错误:根因
~/.codeg/npm-global/node_modules/@agentclientprotocol/下只剩一个 npm 半成品暂存目录:npm 安装被打断:依赖解压进了暂存目录的 node_modules,但包本体文件没写、暂存目录也没 rename 成正式目录。
该目录自 2026-07-16 起持续两周未被修复(目录 mtime 为证),期间 codeg 每次启动都按坏状态拉起 ClaudeCode、每次报同样的 native binary 错误,既不重装也不给可操作提示 —— 用户侧只看到"这个 agent 一直报错"。
补充观察:在 2026-07-30 手动干预并重启 codeg 后,该残缺暂存目录已被清理。说明清理逻辑存在,但触发时机太晚/条件太窄,坏状态能横跨两周和多次启动而不被处理。
期望
CLAUDE_CODE_EXECUTABLE提示,但普通用户无从下手)。Bug B — OpenCode 空版本目录被当作"已安装",二进制替换非原子
现象
OpenCode 二进制彻底丢失:旧版本
1.18.5被删除(连.trash都没有),新版本目录acp-binaries/opencode/1.18.8/是空壳(无windows-x86_64/opencode.exe)。升级前日志还能看到版本漂移警告:
随后 1.18.5 被清、1.18.8 没下完,opencode 无任何可用二进制。
根因
删旧版 → 建新版目录 → 下载新版,这一串不是原子操作;中途失败后留下一个空的版本目录。codeg 见到
1.18.8/目录存在就当"已安装"跳过下载,于是永久无二进制。复现 / 验证
手动
rm -rf acp-binaries/opencode/1.18.8(清掉空壳)后重启 codeg,codeg 立刻正常重下完整二进制并连上:即:空壳版本目录就是卡点,删掉即恢复。
期望
Bug C — effort=max 被推给不支持该档位的 agent(opencode)
现象
每次连接 OpenCode 都刷 ERROR(不影响运行,但污染日志):
根因
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/opencodesession/resume→load→new回退。会话数据本身还在(conversation 表 469 条),但旧 rollout 与新 agent 版本不兼容。建议迁移时做 rollout 兼容或至少提示用户。临时 workaround(给遇到同问题的人)
claude.exe拷到稳定路径(如~/.codeg/bin/claude.exe),在该 agent 的环境变量里设CLAUDE_CODE_EXECUTABLE指过去。acp-binaries/opencode/<空版本目录>,重启让 codeg 干净重下。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,请告知希望改动的模块。