CodePilot v0.51.1
修复长会话在上下文压缩之后 Claude Code 引擎下的严重行为异常:工具调用被模型以纯文本形式写入聊天、反复触发自动压缩、压缩状态不更新等问题。强烈建议所有使用 Claude Code 引擎且会话偏长的用户升级。
修复问题
- 压缩后模型不再调用工具,而是把工具调用写成文本 — 这是最严重的一个问题。到会话中段(通常是第一次自动压缩或手动
/compact之后),模型会开始输出类似(used Read: {"file_path":"..."})这样的纯文本,工具实际上没有执行,聊天气泡里只是在"叙述"它本该做的事情。本版从压缩时的历史重写机制入手彻底修复 - 手动
/compact之后反复被自动压缩 — 之前压缩只是把摘要写入数据库,但 Claude Code SDK 会继续用它自己的完整历史做 resume,摘要实际上没有被模型看到,下一轮又会命中上下文上限再次触发压缩。现在压缩成功后会强制切换到"摘要 + 最近消息 + 当前提问"的新会话,SDK 会从干净的状态继续 /compact的"上下文已压缩..."系统提示被错误写入对话历史 — 这条本意是给用户看的消息被保存成了 assistant 消息,之后模型每轮都会看到它,多次压缩后甚至会被下一次压缩连同正文一起总结进新摘要。现在这条提示只在当轮通过 SSE 推给前端,不再进数据库- 对话很短时使用
/compact的"新消息不多"提示同样被错误持久化 — 同上处理,只推前端不入库 - 压缩成功后前端"已压缩"指示器偶尔不翻转 — 之前反应式压缩(上下文超长时后台自动触发的压缩重试)走的状态事件格式与前端期待的不一致,导致
hasSummary不更新。三条压缩路径的事件格式现在收敛到同一个 helper,前端一致识别 - 反应式压缩成功后新 SDK 会话未持久化 — 超长上下文触发的自动压缩重试如果成功,下一轮应该走新的 SDK 会话继续;之前没有把新 session id 写回数据库,下一轮又会走 fallback 全量历史,等于压缩白做。现在反应式压缩也会持久化新 session id
- 二次手动
/compact重复总结已压缩内容 — 第二次/compact之前会把已经被上次压缩覆盖过的全部历史再喂给摘要器一次,不仅浪费 token,还可能让新摘要里重复或偏移原内容。现在只会压缩"上次 boundary 之后的新消息"
优化改进
- 压缩覆盖边界改用 SQLite rowid,不再用秒级时间戳。之前在消息写入速度足够快时(比如自动压缩和当前用户消息同秒落库),基于时间戳的边界判断可能把一条未被摘要的用户消息当成"已覆盖"误丢;rowid 是单调递增的,彻底消除了这类歧义
- 长会话再次压缩时覆盖边界只会前进、不会回退。任何"降级路径"(比如拿不到消息元数据时)都会保留原有边界而非重置为 0,避免之前刚建立的边界被意外清除
- 新增技术交接文档
docs/handover/compact-coverage-boundary.md,记录压缩覆盖边界的所有不变量、数据库 schema、三条压缩路径的写法,供后续维护
下载地址
macOS
Windows
安装说明
macOS: 下载 DMG → 拖入 Applications → 首次启动如遇安全提示,在系统设置 > 隐私与安全中点击"仍要打开"
Windows: 下载 exe 安装包 → 双击安装
系统要求
- macOS 12.0+ / Windows 10+ / Linux (glibc 2.31+)
- 需要配置 API 服务商(Anthropic / OpenRouter 等)
- 推荐安装 Claude Code CLI 以获得完整功能