@tencent-ai/codebuddy-code 2.96.0 → 2.97.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +141 -0
- package/dist/codebuddy-headless.js +46 -118
- package/dist/codebuddy.js +62 -134
- package/dist/web-ui/assets/{index-Dk5Zj7Qd.js → index-bVNRRvKC.js} +126 -126
- package/dist/web-ui/index.html +1 -1
- package/dist/web-ui/sw.js +1 -1
- package/package.json +1 -1
- package/product.cloudhosted.json +5 -2
- package/product.internal.json +5 -2
- package/product.ioa.json +5 -2
- package/product.json +10 -2
- package/product.selfhosted.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,147 @@ CodeBuddy Code 的所有重要更新都会记录在这里。
|
|
|
7
7
|
|
|
8
8
|
## [未发布]
|
|
9
9
|
|
|
10
|
+
## [2.97.0] - 2026-05-13
|
|
11
|
+
|
|
12
|
+
### 🎉 新功能
|
|
13
|
+
|
|
14
|
+
- **快捷键系统**:参考 Claude Code 架构实现完整的快捷键系统,支持上下文条件、弦序列(如 Ctrl+X Ctrl+K)、用户自定义覆盖。配置文件存储在 `~/.codebuddy/keybindings.json`,支持 16 个上下文与 60+ 动作。新增 `/keybindings` 命令、REST API(`/api/v1/keybindings`)以及 Web UI 可视化配置(按上下文分组、搜索、录制、冲突检测、中英文国际化)。
|
|
15
|
+
- **Skill / Subagent Frontmatter Hooks**:对齐 Claude Code 行为,支持在 `.codebuddy/agents/*.md` 与 `.codebuddy/skills/*/SKILL.md` 的 YAML frontmatter 中配置 `hooks:` 字段,在子代理 / fork skill 生命周期内自动注册和清理。支持 `command` / `prompt` / `agent` / `http` 四种 hook 类型、`once: true` 自动移除、event matcher 语义。**默认安全闸门**:非 product 内置来源的 frontmatter hooks 默认禁用(含本地与插件市场),需在 `settings.json` 中开启 `allowUntrustedFrontmatterHooks: true` 才生效。
|
|
16
|
+
- **Hook 事件与参数对齐 Claude Code(A/B 批次)**:新增 6 个 hook 事件(PostToolUseFailure、SubagentStart、StopFailure、PostCompact、ConfigChange、InstructionsLoaded),工具事件 payload 增加 `tool_use_id` / `permission_mode` 等字段,Stop / SubagentStop 事件新增 `last_assistant_message`,SubagentStop 增加 `agent_id` / `agent_type` / `agent_transcript_path`,Notification 增加 `title`,SessionEnd 原因扩充。新增 hook 异步协议(`{"async": true, "asyncTimeout": N}` 立即放行);PostToolUse 支持 MCP 工具的 `updatedMCPToolOutput` 覆盖;SessionStart 支持 `initialUserMessage` 注入首轮上下文。
|
|
17
|
+
- **Hook 事件扩展(C1 批次)**:新增 8 个 hook 事件 — PermissionRequest / PermissionDenied(权限审批前后可拦截)、TaskCreated / TaskCompleted(携带 task_id / teammate_name 等)、TeammateIdle(团队成员从忙碌转为空闲触发)、Setup(进程启动 / 维护阶段触发,stdout 可注入首轮上下文)、Elicitation / ElicitationResult(MCP elicitation 前后预留)。
|
|
18
|
+
- **Hook 配置扩展(C2 批次)**:新增 `http` / `agent` 两种 hook type;新增 `if` permission rule 语法(如 `Bash(git *)` / `Write(*.ts)`)按工具名和参数匹配;新增 `shell` / `once` / `asyncRewake` / `allowedEnvVars` / `statusMessage` 字段;插件 hook 注入新环境变量 `CLAUDE_PLUGIN_DATA` / `CODEBUDDY_PLUGIN_DATA` 与展开的 `*_PLUGIN_OPTION_*`。
|
|
19
|
+
- **Hook 文件监视(C3 批次)**:新增 `FileChanged`(SessionStart / Setup hook 通过 `hookSpecificOutput.watchPaths` 声明监视路径),`CwdChanged`(Bash / PowerShell 工具执行后若 cwd 变化自动触发)。Windows Git Bash 下 hook 子进程自动把 `CLAUDE_PROJECT_DIR` 等路径环境变量从 `C:\Users\foo` 规范化为 `/c/Users/foo`。
|
|
20
|
+
- **Skills / 斜杠命令 / Subagent 变量占位符**:在 `.md` 文件中支持变量占位符替换,与 Claude Code 兼容。支持 `${CODEBUDDY_PLUGIN_ROOT}` / `${CODEBUDDY_SKILL_DIR}` / `${CODEBUDDY_SESSION_ID}` 以及任意大写环境变量(含 `${MY_ENV_VAR:-默认值}` 默认值语法),未设置的占位符原样保留。
|
|
21
|
+
- **第三方插件市场自动更新**:新增 `autoUpdateThirdPartyMarketplaces` 产品配置和 `CODEBUDDY_AUTO_UPDATE_THIRD_PARTY_MARKETPLACES` 环境变量,支持全局启用第三方插件市场自动更新(优先级:settings env > process.env > 产品配置 > 默认关闭)。市场配置项新增 `autoUpdate` 可选字段。
|
|
22
|
+
- **Remote Gateway `/api/v1/runs` 任务执行超时可配置**:默认超时从 10 分钟提升到 30 分钟;新增 `gateway.runTimeoutMs` settings 配置;新增 HTTP header `X-Codebuddy-Run-Timeout` 单次覆盖;设为 0 或负数关闭超时保护(覆盖优先级:header > settings > 默认)。
|
|
23
|
+
- **Web UI PWA 自动更新**:前端每 15 分钟自动询问后端是否有新 Service Worker 版本,对话空闲时自动 reload,进行中弹 toast 保留"立即刷新"按钮,订阅运行状态在 Agent 空闲后自动刷新,确保不打扰正在进行的对话。
|
|
24
|
+
- **UE 项目自动排除大仓噪声目录**:在 cwd 检测到 `*.uproject` 时自动在 Grep / Glob ripgrep 调用里叠加 `!Intermediate/` `!DerivedDataCache/` `!Saved/` `!Binaries/` `!Build/` `!.vs/` 排除,避免 Unreal Engine 项目编译产物污染搜索结果;可通过 `settings.disableUEAutoExclude: true` 关闭。Grep content 搜索默认增加 `--max-columns 500` 避免单行 MB 级内容打爆 stdout。
|
|
25
|
+
- **ACP 文件系统方法**:在 ACP StreamManager 中实现 `fs/*` 系列方法(list / read / write / exists / makeDir / remove / rename / getInfo / watchDir / unwatch),支持 Desktop 通过 ACP JSON-RPC 协议访问工作目录文件系统,使"全部文件"标签页在 Desktop 中正常工作。
|
|
26
|
+
- **Subagent frontmatter `skills:` 预加载**:对齐 Claude Code,子代理启动时把 frontmatter `skills:` 中列出的 skill 完整内容作为 `isMeta:true` user message 预注入子代理 history,支持 3 档 skill 名称 fallback。
|
|
27
|
+
|
|
28
|
+
### 🔧 功能改进
|
|
29
|
+
|
|
30
|
+
- **PowerShell 安全多层防御**:CLM 类型白名单(~90 类型对齐 Claude Code)、Git 安全防护(裸仓库攻击 / NTFS 8.3 短名 / archive 提取器检测)、危险 Cmdlet 分类(7 集合 + 120+ 别名)、破坏性命令 UI 警告(16 种模式)、Unicode 破折号支持(en/em/horizontal-bar)。
|
|
31
|
+
- **ACP 连接稳定性**:GET SSE 连接增加 30 秒心跳防止反向代理(cloudflared / nginx)回收;连接关闭时等待未完成的历史写入完成防止 JSONL 日志被截断。`idle_timeout` 场景增强诊断日志,便于会话长时间无更新时定位卡点。
|
|
32
|
+
- **Bash 工具 timeout 提示动态化**:工具描述中"最大 timeout"数值原先写死 600000ms,即便用户调大 `BASH_MAX_TIMEOUT_MS` 模型看到的仍是旧值。现在描述动态注入 `bashMaxTimeoutMs` / `bashDefaultTimeoutMs`,与运行时实际 clamp 值保持一致;并引导模型长任务优先省略 `timeout` 参数。
|
|
33
|
+
- **TUI 输入框 Ctrl+F / Ctrl+B 光标导航**:之前 Ctrl+F 被当普通字符插入、Ctrl+B 被静默吞掉,现支持 bash readline 风格的左右移动一字符,与已有 Ctrl+A / Ctrl+E / Ctrl+K / Ctrl+U 一致。多字节字符和 emoji 移动正确。
|
|
34
|
+
- **Web UI 画布内嵌终端文字选择**:画布视图打开终端 tile 时,原本交互遮罩会把 `pointerdown` 交给画布做拖动平移,导致无法选中文字。现改为 tile 聚焦后遮罩透传给 xterm,支持选中复制;中键 / 右键 / Space + 左键仍走画布平移。
|
|
35
|
+
- **Channel 权限 `deny_and_exit_plan`**:微信 / 企微用户可通过回复 `q` 退出计划模式;ExitPlanMode 工具新增专用提示 `(y=执行 | n=继续规划 | q=退出计划模式)`;InterruptionService 处理 `deny_and_exit_plan` 时正确恢复 permissionMode。
|
|
36
|
+
- **Request Purpose 标记**:新增 `X-Agent-Purpose` HTTP header,为不同类型 LLM 请求打分类标签(conversation / summary / webfetch / subagent:explore),供下游 Langfuse 进行 trace 标记和分析。
|
|
37
|
+
- **Worktree 目录切换**:创建或复用 worktree 后尽量保持进入与当前目录对应的相对子目录,不存在时回退到 worktree 根目录。
|
|
38
|
+
- **图片压缩拦截器**:新增图片压缩拦截器,对用户发送的 base64 图片统一进行长边 2000px 压缩,确保 ACP / TUI / plugin-chat 各来源图片都经过尺寸优化。
|
|
39
|
+
- **Session API 统一**:合并 `listWorkspaces` 和 `listAcrossProjects` 为统一的 `GET /api/v1/sessions` 端点,支持 `cwd` 查询参数(不传 = 当前空间,`*` = 所有空间,`/path` = 指定目录);保留旧端点向下兼容。
|
|
40
|
+
- **模型权限错误自动恢复**:当后端返回"模型不可用"时自动刷新产品配置并向用户展示最新可用模型列表,引导切换。
|
|
41
|
+
- **下架历史模型并刷新积分系数**:下掉 HY 2.0 系列(共 3 个)和 GPT-5.2/5.1 共 4 个旧模型;按最新官方定价表刷新模型积分(iOA 企业版补齐 DeepSeek / MiniMax / Kimi / GLM / Hunyuan-Image-V3 真实系数;国内版与云托管版同步刷新)。
|
|
42
|
+
- **插件加载并发与缓存**:为市场插件列表 / 元数据 / 组件加载引入可配置并发上限避免启动抖动;新增市场插件列表缓存与加载去重;`getInstalledPlugins` 共享 Promise;`getPlugin` 优先复用已安装缓存。
|
|
43
|
+
- **HTTP 插件市场元数据回退**:HTTP 插件市场下载清单时支持多种元数据目录并自动回退,同时清理陈旧残留文件。
|
|
44
|
+
- **ACP 用户消息回显简化**:统一使用纯文本渲染,历史回放与实时流保持一致展示效果。
|
|
45
|
+
- **移除产物提取代码**:从 CLI 层移除所有 artifact 提取相关方法和 session replay 中的产物广播逻辑(产物概念归属业务层)。
|
|
46
|
+
- **自动化任务 Langfuse 标签**:定时任务触发的请求自动携带 `automation` 标签,便于在 Langfuse 看板中筛选和分析自动化任务的执行数据。
|
|
47
|
+
|
|
48
|
+
### 🐛 修复
|
|
49
|
+
|
|
50
|
+
- **`/clear` 会话分割线真正切断历史**:再次发 prompt 时,分割线之前的消息不会再发给模型(对齐老版本 SmartBoundaryHistoryLoadingStrategy 行为),兼容老版本写入的 separator 数据。
|
|
51
|
+
- **ACP `/clear` 分隔符在重启后丢失**:修复 CBC / WorkBuddy Desktop Claw 会话里插入的 `/clear` 分隔符在重启或 loadSession 回放后消失的问题,同时修复随之出现的 `unsupported content type at index 0: input_text` 400 错误。新增 `handleClearSession`:分隔符以 `role:'system'` + `providerData.isSessionSeparator:true` 写入 jsonl 持久化,重放时还原为 `session_info_update`。
|
|
52
|
+
- **ACP `/compact` 在 IM 场景下生效**:WorkBuddy Desktop Claw IM 的 `/compact`/`/总结`原先无效(裸文本不会被识别为命令),现在通过 `_meta['codebuddy.ai'].isCompactSession === true` 短路调用 `ContextCompactSummarizer.compactAndSummarize(force=true, skipContinue=true)`。
|
|
53
|
+
- **ACP Cancel Barrier**:修复会话在 cancel 完成瞬间若有新 `session/prompt` 到达会被当作新对话启动的问题。新增 500ms cancel barrier,窗口内到达的 prompt 直接以 `stopReason: cancelled` 响应。
|
|
54
|
+
- **ACP 取消标记泄漏**:修复 prompt 终态与 `session/cancel` 同时发生时 pending cancellation 标记未被消费,导致后续轮次 `AskUserQuestion` 被误判为取消的问题。
|
|
55
|
+
- **ACP 流式回复重复输出思考内容**:修复 WorkBuddy 对话流式回复可能重复输出思考内容的问题。
|
|
56
|
+
- **AskUserQuestion 显示"未回答"**:修复 ACP 模式下用户回答 AskUserQuestion 后 UI 显示"未回答"的问题,提前初始化 AskService 的 deferred。
|
|
57
|
+
- **AskUserQuestion 误判为"拒绝回答"**:修复审批信号抢在工具执行路径建立等待者前到达导致答案被丢弃的问题,以工具调用 ID 为键保持答案与等待方正确配对。
|
|
58
|
+
- **ACP 会话查找竞态**:`session/prompt` 和 `session/set_config_option` 改用 `getRuntimeSession` 优先查询内存中活跃会话,避免 `loadSession` 后会话尚未落盘时出现 "Session not found"。
|
|
59
|
+
- **ACP 会话继承 CLI 启动参数**:修复 `--serve` 模式下 ACP 创建的会话未继承 `--permission-mode` / `--model` 等参数。
|
|
60
|
+
- **ACP `session/load` 超时**:修复部分 Windows 环境下出现 `ACP request timeout: session/load` 的问题,在协议入口层增加 25s 兜底,确保始终能在 Desktop 空闲超时内返回响应。
|
|
61
|
+
- **ACP 模型切换不生效**:`unstable_setSessionModel` 与 `setSessionConfigOption(model)` 现立即把新模型写入 runtime session(`requestOptions.model` / `session.options.model` / `SessionManager.overrideModel` / CLI 设置),不再只依赖订阅副作用。
|
|
62
|
+
- **ACP 模式不再把内置命令当 skill 暴露给模型**:`/clear`、`/help`、`/model`、`/theme`、`/status`、`/resume`、`/rename` 等内置 UI 指令不再混入 `Skill` 工具的 `<available_skills>` 列表(CLI 独立运行模式下行为不变)。
|
|
63
|
+
- **上下文压缩自动取消循环**:修复压缩在某些场景出现"自动取消"假象、随后立刻又被重复触发的循环。压缩成功与否严格以本次调用自身的最终输出为准;压缩调用等待上限从 60 秒放宽到 20 分钟。
|
|
64
|
+
- **Compact 残留 `</conversation_history_summary>` 标签**:修复任务异常结束时残留压缩 XML 标签的问题,统一 compact 触发路径。
|
|
65
|
+
- **Compact 摘要与用户消息错位**:修复请求级自动预压缩场景下压缩摘要与用户原始消息在历史中错位,导致下一轮请求同时携带摘要与压缩前完整历史的问题。
|
|
66
|
+
- **Compact 退化摘要**:修复长会话在自动压缩后缺少有效新增内容时仍可能再次压缩、生成无效摘要的问题;压缩过滤时保留用户真实请求文本(含 `@file` 原始提问)。
|
|
67
|
+
- **Compact 失败卡住历史视图**:失败/取消后再次触发压缩仍被卡住,改由读取层统一按"提不到 `<summary>` 即视作失败"忽略失败/取消的压缩段。
|
|
68
|
+
- **Compact 超时死锁与取消**:修复子 Agent compact 超时后状态机卡死(补发 `agent_end` 事件);修复用户主动取消时 `isCompressing=true` 导致取消信号被 `pollCompression` 吞掉。
|
|
69
|
+
- **自定义模型自动压缩窗口**:自定义 OpenAI 兼容模型未配 `maxInputTokens` 时退回到 `CODEBUDDY_AUTO_COMPACT_WINDOW` 兜底窗口(默认 100k,clamp 到 [100k, 1M])。
|
|
70
|
+
- **SDK 模式自动压缩断联**:修复 SDK / headless 模式下 `checkAutoCompact` 触发压缩后 compact + continue 输出泄露到 stdout 导致 SDK 断联,session-manager interceptorGate 增加 `isCompressing` 检查。
|
|
71
|
+
- **Compact 自动渲染 XML 标签**:修复自动压缩触发时摘要在聊天界面被渲染为裸 `<conversation_history_summary>` / `<summary>` 标签的问题,与用户主动 `/compact` 走同一套 `compact_group` 渲染。聊天界面统一显示 `/compact`,内部命令 `/_compact` 在用户消息气泡中归一化;隐藏 `/_` 前缀的内部命令。
|
|
72
|
+
- **Compact 失败保留用户消息**:长会话发送前自动压缩失败后会保存用户消息、结束本次请求并展示明确失败提示,避免静默卡住。
|
|
73
|
+
- **Compact 历史 `Unknown content` 错误**:修复从历史会话继续对话时可能报 `Unknown content` 导致中断的问题。
|
|
74
|
+
- **PTL 上下文超长恢复**:新增按 API 轮次精确截断历史的兜底机制,覆盖 Anthropic / Vertex / OpenAI / Gemini / 内部网关等主流模型错误文案。组合命令安全检查(`&&` / `;` / `|`)改为子命令独立评估并取最高等级。
|
|
75
|
+
- **空流自动重试**:识别上游 OpenAI 兼容网关只发占位 / 心跳帧后断开的"空流"场景,复用流超时重试管道(max=1)自动恢复;重试额度按 turn 重置。
|
|
76
|
+
- **请求体超限恢复**:优化大上下文 / 大图片导致请求体超限时的自动恢复能力;`ModelProvider` axios 显式设 `maxBodyLength: Infinity, maxContentLength: Infinity`,避免打包内 `follow-redirects` 默认 10MB 上限本地拦截。
|
|
77
|
+
- **模型错误兜底状态码**:`ModelErrorAnalyzer.analyze` 与 `ModelProvider` 外层 catch 未识别归因时兜底响应码由 `500 Internal Client Error` 调整为 `400 Client Error`。
|
|
78
|
+
- **`Tool X not found` 错误脱敏**:SDK 抛出的工具未找到错误不再带产品实现细节的 agent 名(如 "cli");正则兼容工具名含空格场景;`ModelBehaviorError` 不再弹客户端错误框,走 `end_turn` 结束本轮;ACP 层统一补发 `tool_call_update{status:'failed'}` 让 placeholder 退出 pending。
|
|
79
|
+
- **历史会话首条用户消息丢失**:含隐藏上下文的用户首条消息在 UI 中消失,旧过滤规则仅看开头丢弃整块导致提问被一并过滤;现在合并块中的用户提问会被保留。
|
|
80
|
+
- **历史回放 model error 渲染为助手回复**:修复因模型报错(6004/429 等)中断的轮次在历史回放时被当普通回答渲染在聊天气泡中,保持用户消息无回答的视觉状态。
|
|
81
|
+
- **历史回放 orphaned tool_call**:对中断的工具调用(无结果的 function_call)跳过回放并注入系统通知,避免显示无法交互的 pending 状态;同一轮多个中断的工具调用只显示一条通知。
|
|
82
|
+
- **老会话任务列表展示**:修复从旧版本迁移的会话恢复后任务列表渲染为空框,对旧数据中以字符串形式序列化的任务数组增加兼容解析。
|
|
83
|
+
- **Plan 模式权限恢复**:修复从 Desktop 端启动 plan 模式时 `prePlanPermissionMode` 未正确传递,确保退出 plan 模式后能恢复到正确权限。
|
|
84
|
+
- **Glob/Grep 空结果提示**:返回有意义的文本提示("No files found" / "No matches found")替代空数组;ListToolCall 组件兼容 string 类型 content。
|
|
85
|
+
- **恢复 Grep/Glob 工具注册**:之前 PR #34323 误将 Grep/Glob 从 5 份 `product.*.json` 中删除(CC 只在 ant-native 内部 build 下架,对外发布版仍保留)。本次恢复 5 份 product 的 4 个 agent(cli / general-purpose / Explore / Plan)的 Grep/Glob 引用(共 20 处)以及主 product.json 顶层 tools[]。
|
|
86
|
+
- **`--disallowedTools` 子命令规则**:传入带子命令的规则(如 `Bash(pkill:*)`)时整个工具被从模型可用工具列表移除的问题,现仅当规则是工具名本身时才整体禁用,带子命令范围交由执行时权限检查精确拦截。
|
|
87
|
+
- **工具过滤绕过漏洞**:修复 ToolSearch 的 lookup 模式和 DeferExecuteTool 不检查工具可用性的问题,将 `getAllowedToolsForAgent` 提取为公共方法统一过滤。
|
|
88
|
+
- **rm 批量删除风险等级**:将 rm 批量删除(通配符或多文件)的风险等级从 MEDIUM 提升至 HIGH,确保 IM 侧批量删除命令正确触发用户确认。
|
|
89
|
+
- **沙箱 strip_write 假成功**:TSBX `strip_write` 策略静默丢弃写入 / 删除时让进程以 `exitCode=0` 退出,原本不触发提权 UI;现在只要有未过滤的文件拦截记录就标记 sandbox 拒绝。
|
|
90
|
+
- **Bash Sandbox 配置目录路径**:修复 `CODEBUDDY_CONFIG_DIR` 自定义配置目录下 Bash 沙箱白名单失效,`expandPath()` 现在让 `~/.codebuddy` 前缀路由到 `PathUtils.getHomeDir()` 返回的真实目录。
|
|
91
|
+
- **Prompt 模板 `~/.codebuddy/...` 占位符**:TeamCreate / TeamDelete / statusline-setup 工具描述模板通过 `{{codebuddyHome}}` 渲染实际 CodeBuddy home 目录,正确跟随 `CODEBUDDY_CONFIG_DIR`。
|
|
92
|
+
- **TeamDelete / WeCom Bot 文案路径**:工具/客户端返回给模型和用户的文案中硬编码 `~/.codebuddy/...` 路径,TeamDelete 现告知模型真实被删除目录;WeCom Bot 配置指引显示真实 credentials 文件路径。
|
|
93
|
+
- **UI 面板 `~/.codebuddy/...` 路径**:Permissions / Agents / Skills / Memory 面板、内置 Tips、Web UI 登录提示中硬编码路径在设置 `CODEBUDDY_CONFIG_DIR` 后显示真实路径。
|
|
94
|
+
- **沙盒开关存储层级**:Desktop 端沙盒开关从持久化写入 `settings.local.json` 改为存储在 CLI 内存层(session 级别),避免污染用户工作区目录。
|
|
95
|
+
- **Daemon 端口竞态**:旧进程现在会先关闭 HTTP 监听和长连接再 fork 新进程,避免重启时 `EADDRINUSE` 启动失败或长连接阻塞。
|
|
96
|
+
- **MCP 静态 Authorization 被 OAuth 覆盖**:修复在 `mcp.json > headers.Authorization` 显式配置 `Basic` / `Bearer` 时仍被 OAuth 流程覆盖的问题;MCP SDK 升级至 1.24.3 支持协议版本 `2025-11-25`。
|
|
97
|
+
- **MessageQueueDeferredDispatch(Mode B)**:修复 Agent 队列消息无法成功发送的问题,新增 `RichMessageQueueManager`、禁用 7 条 CLI 内部排空路径防止与 UI 驱动消费冲突;任务队列"立刻发送"消息丢失修复;队列自动派发消息标记来源跳过忙碌检查。
|
|
98
|
+
- **Team 消息实时投递**:Mode B 下队长忙碌期间队员 `SendMessage` 与 4s Framework Auto-Notification 卡在消息队列不被消费的问题;新增 `TeamInboxDispatchService` 在队长 `agent_end` 后自动 `activate` + run;feature flag `CBC_TEAM_IMMEDIATE_DISPATCH=0` 可降级。
|
|
99
|
+
- **Playbook Team Spinner**:修复 playbook 任务完成后左侧 agent 持续转圈问题,前端 `'completed'` 加入状态覆盖排除列表;后端 `AcpTeamBridge.stop()` 检测 team 已被删除但事件未发送时补发 `team_deleted` 事件兜底。
|
|
100
|
+
- **专家内置 Skill 不可见**:`rebuildAgents` 完成后若 agents/skills/commands 等非模型配置变化,主动失效 Skill / SlashCommand / ToolSearch 工具描述缓存。
|
|
101
|
+
- **会话标题与摘要触发**:修复触发机制异常,确保标题更新、内容摘要、压缩前刷新按预期生效。
|
|
102
|
+
- **图片消息标题污染**:修复图片消息在历史回放和会话标题生成场景中泄漏本地图片路径;图文消息优先使用用户可见文案生成标题,纯图片消息使用本地化默认标题。WorkBuddy 接收 backend 标题更新时忽略 `(No content)` / `/compact` 和内部图片路径标签。
|
|
103
|
+
- **Session replay `image_local_path` 标题污染**:修复 session replay 时 `image_local_path` 文本块被合并到用户文本中导致标题和摘要异常。
|
|
104
|
+
- **ImageGen / ImageEdit 取消支持**:将会话 abort signal 传递到所有 HTTP 请求,避免取消后图片生成请求仍继续执行。
|
|
105
|
+
- **自定义模型加载 400 错误**:支持顶级数组和对象包裹两种 models.json 格式,优化缓存策略确保自定义模型正确叠加到平台配置之上。
|
|
106
|
+
- **自定义模型 Gzip 检测**:原逻辑请求 body 中 `custom-local:` 前缀已被剥离导致无法匹配 product.models 配置;现通过 axiosConfig 携带原始 model id 修复。
|
|
107
|
+
- **私有化部署检测**:移除通过企业端点配置推断 Self-Hosted 部署类型的逻辑,避免配置企业端点但实际为云托管时错误标记。
|
|
108
|
+
- **Marketplace 同名重复**:用户添加自定义 marketplace 时若 name 与已安装 marketplace(含内置)撞名会出现两条同名套件且无法删除,现在按 source / manifest.name 多重查重,启动时优先保留 builtin 并清理污染记录。
|
|
109
|
+
- **Marketplace 重复添加报错**:改为自动触发更新流程。
|
|
110
|
+
- **Marketplace 更新缓存未刷新**:`updateMarketplace` 后 UI 显示的 `lastUpdated` 时间不更新,原因是 `clearAllCaches()` 遗漏清理 `marketplaceCache`。
|
|
111
|
+
- **GithubMarketplace 目录名对齐**:非标准仓库 URL 在 `GithubMarketplace.install()` 里目录名编码后与 `marketplace.json` 的 `name` 不一致,现 clone 完成后读取 manifest.name 按需 rename。
|
|
112
|
+
- **Git 不可用 ZIP 回退**:未安装 Git 的 Windows 环境下添加 GitHub / GitLab / cnb 等插件市场失败,现自动降级为 ZIP 压缩包下载。
|
|
113
|
+
- **内置套件市场 ZIP 分发**:默认套件市场无内容、添加市场失败问题,内置市场改为 ZIP 归档分发并支持版本号短路检查。
|
|
114
|
+
- **插件子代理描述刷新**:修复加载或切换插件子代理后,Agent 工具中的可用子代理列表与描述未及时刷新。
|
|
115
|
+
- **Skill 扫描悬空符号链接**:`~/.codebuddy/skills/` 中悬空 symlink 之前会让 `statSync` 抛 ENOENT 中断整个目录扫描,现改为 per-entry try/catch 只跳过坏链接。
|
|
116
|
+
- **PowerShell Office Automation**:修复 Windows 下通过 PowerShell 创建 / 打开 Excel / Word / PowerPoint / Outlook 时被安全策略误拦截,Office Automation COM 对象不再直接拦截,下沉到方法调用层面按需确认。
|
|
117
|
+
- **PowerShell 命令行包装**:`LocalShellService` 现正确遵循 `ShellExecuteParams.rawCommand` 契约,`rawCommand=true` 时直接 `spawn(exe, args)` 跳过 bash `-c` / `eval` / `shopt` 包装,避免 Windows 路径反斜杠被吞或反引号被误解。
|
|
118
|
+
- **Windows 黑窗弹出**:修复 `--bg` 后台会话以及 daemon 启动期间会弹出可见 conhost / Git Bash 黑窗,确保所有内部子进程都以隐藏窗口方式启动。
|
|
119
|
+
- **Windows 插件 commands 不显示**:`CODEBUDDY_PLUGIN_DIRS` 环境变量从 POSIX 的 `:` 改为 `path.delimiter`(POSIX=`:`,Windows=`;`),避免 Windows 上 `C:\...` 盘符被当成分隔符。
|
|
120
|
+
- **Windows Bash 工具中文乱码**:跨 chunk 拼回未完成的 UTF-8 多字节序列;解码先严格 UTF-8 校验再回退 jschardet/cp936;Windows 注入 `PYTHONUTF8=1`(CPython PEP 540 UTF-8 Mode)。
|
|
121
|
+
- **Worktree 相对 cwd**:修复 worktree 复用时未正确进入相对目录的问题。
|
|
122
|
+
- **Web UI 编辑器保存清空文件**:`writeFile` 前端未显式设 Content-Type 被 body-parser.text() 中间件消费导致后端读到空 Buffer 写入磁盘;现前端显式设 `application/octet-stream`,后端对"空请求体 + 已存在非空文件 + 无 `allowEmpty=1`"返回 409 兜底,CodeEditor 改用 `defaultValue` + useEffect 守卫。
|
|
123
|
+
- **Gateway CORS 静态资源**:开启 CORS 白名单时同源 IP 访问静态资源(首页 / `/assets/*` / Service Worker)被误拦的问题,浏览器 module script / modulepreload 静态资源不再参与 API CORS 白名单检查。
|
|
124
|
+
- **anydev 远程 IDE `/ide` 命令**:新增 `CODEBUDDY_IDE_PORT` / `CODEBUDDY_IDE_HOST` / `CODEBUDDY_IDE_SKIP_VALID_CHECK` 环境变量(与 Claude Code `CLAUDE_CODE_*` 兼容),适配容器内无法访问宿主侧锁文件、IDE 在远程主机、容器内外路径不一致等场景。
|
|
125
|
+
- **Read 工具图片返回格式**:修复 Read 工具读取图片时返回数据结构不正确,现正确返回 image content block 格式。
|
|
126
|
+
- **`@openai/agents-openai` patch**:修复 assistant 消息中 tool_calls 合并问题。
|
|
127
|
+
- **历史登出闪烁**:账号退出时清除缓存消息,防止重新登录后短暂显示旧的 pending question。
|
|
128
|
+
|
|
129
|
+
### 📝 文档
|
|
130
|
+
|
|
131
|
+
- **下线 sandboxing.md 文档**:移除 sandboxing.md 文档及所有引用,相关链接指向 bash-sandboxing.md。
|
|
132
|
+
|
|
133
|
+
## [2.96.1] - 2026-05-12
|
|
134
|
+
|
|
135
|
+
### 🎉 新功能
|
|
136
|
+
|
|
137
|
+
- **自动化任务 Langfuse 标签**:定时任务触发的请求自动携带 `automation` 标签,便于在 Langfuse 看板中筛选和分析自动化任务的执行数据。
|
|
138
|
+
|
|
139
|
+
### 🔧 功能改进
|
|
140
|
+
|
|
141
|
+
- **宿主可关闭嵌入式 CLI 历史清理**:允许宿主应用(如 WorkBuddy Desktop)通过配置关闭嵌入式 CLI 的历史会话自动清理行为。
|
|
142
|
+
- **统一 compact 触发路径**:合并多处上下文压缩触发逻辑为统一入口,提升压缩流程的可靠性和一致性。
|
|
143
|
+
|
|
144
|
+
### 🐛 修复
|
|
145
|
+
|
|
146
|
+
- **SDK 模式自动压缩断联**:修复 SDK 模式下触发自动上下文压缩时导致连接中断的问题。
|
|
147
|
+
- **上下文压缩失败卡住**:修复上下文压缩失败后会话卡住无法继续的问题。
|
|
148
|
+
- **插件市场 UI 缓存未刷新**:修复插件市场更新后 Web UI 缓存未及时刷新的问题。
|
|
149
|
+
- **插件子代理描述刷新**:修复插件子代理描述信息未正确刷新的问题。
|
|
150
|
+
|
|
10
151
|
## [2.96.0] - 2026-05-11
|
|
11
152
|
|
|
12
153
|
### 🎉 新功能
|