@tencent-ai/codebuddy-code 2.125.4-next.41bad82.202607231203 → 2.126.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.
Files changed (80) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/codebuddy-headless.js +11 -11
  3. package/dist/codebuddy.js +13 -13
  4. package/dist/web-ui/docs/cn/cli/agent-teams.md +6 -0
  5. package/dist/web-ui/docs/cn/cli/cli-reference.md +3 -2
  6. package/dist/web-ui/docs/cn/cli/costs.md +7 -7
  7. package/dist/web-ui/docs/cn/cli/daemon.md +8 -2
  8. package/dist/web-ui/docs/cn/cli/env-vars.md +16 -6
  9. package/dist/web-ui/docs/cn/cli/hooks.md +26 -4
  10. package/dist/web-ui/docs/cn/cli/http-api.md +98 -5
  11. package/dist/web-ui/docs/cn/cli/iam.md +1 -1
  12. package/dist/web-ui/docs/cn/cli/models.md +43 -13
  13. package/dist/web-ui/docs/cn/cli/permissions.md +2 -1
  14. package/dist/web-ui/docs/cn/cli/plugins-reference.md +2 -0
  15. package/dist/web-ui/docs/cn/cli/release-notes/README.md +15 -0
  16. package/dist/web-ui/docs/cn/cli/release-notes/v2.120.0.md +31 -0
  17. package/dist/web-ui/docs/cn/cli/release-notes/v2.121.0.md +42 -0
  18. package/dist/web-ui/docs/cn/cli/release-notes/v2.121.1.md +20 -0
  19. package/dist/web-ui/docs/cn/cli/release-notes/v2.121.2.md +23 -0
  20. package/dist/web-ui/docs/cn/cli/release-notes/v2.121.3.md +21 -0
  21. package/dist/web-ui/docs/cn/cli/release-notes/v2.122.0.md +52 -0
  22. package/dist/web-ui/docs/cn/cli/release-notes/v2.123.0.md +28 -0
  23. package/dist/web-ui/docs/cn/cli/release-notes/v2.123.1.md +13 -0
  24. package/dist/web-ui/docs/cn/cli/release-notes/v2.124.0.md +30 -0
  25. package/dist/web-ui/docs/cn/cli/release-notes/v2.124.1.md +22 -0
  26. package/dist/web-ui/docs/cn/cli/release-notes/v2.125.0.md +44 -0
  27. package/dist/web-ui/docs/cn/cli/release-notes/v2.125.1.md +22 -0
  28. package/dist/web-ui/docs/cn/cli/release-notes/v2.125.2.md +13 -0
  29. package/dist/web-ui/docs/cn/cli/release-notes/v2.125.3.md +30 -0
  30. package/dist/web-ui/docs/cn/cli/release-notes/v2.125.4.md +33 -0
  31. package/dist/web-ui/docs/cn/cli/sdk-hooks.md +30 -0
  32. package/dist/web-ui/docs/cn/cli/settings.md +38 -4
  33. package/dist/web-ui/docs/cn/cli/slash-commands.md +2 -2
  34. package/dist/web-ui/docs/cn/cli/sub-agents.md +116 -11
  35. package/dist/web-ui/docs/cn/cli/troubleshooting.md +55 -0
  36. package/dist/web-ui/docs/cn/cli/web-ui.md +1 -0
  37. package/dist/web-ui/docs/en/cli/agent-teams.md +6 -0
  38. package/dist/web-ui/docs/en/cli/cli-reference.md +3 -2
  39. package/dist/web-ui/docs/en/cli/costs.md +4 -4
  40. package/dist/web-ui/docs/en/cli/daemon.md +8 -2
  41. package/dist/web-ui/docs/en/cli/env-vars.md +16 -6
  42. package/dist/web-ui/docs/en/cli/hooks.md +26 -4
  43. package/dist/web-ui/docs/en/cli/http-api.md +98 -5
  44. package/dist/web-ui/docs/en/cli/models.md +43 -13
  45. package/dist/web-ui/docs/en/cli/permissions.md +2 -1
  46. package/dist/web-ui/docs/en/cli/plugins-reference.md +10 -0
  47. package/dist/web-ui/docs/en/cli/release-notes/README.md +15 -0
  48. package/dist/web-ui/docs/en/cli/release-notes/v2.120.0.md +31 -0
  49. package/dist/web-ui/docs/en/cli/release-notes/v2.121.0.md +42 -0
  50. package/dist/web-ui/docs/en/cli/release-notes/v2.121.1.md +20 -0
  51. package/dist/web-ui/docs/en/cli/release-notes/v2.121.2.md +23 -0
  52. package/dist/web-ui/docs/en/cli/release-notes/v2.121.3.md +21 -0
  53. package/dist/web-ui/docs/en/cli/release-notes/v2.122.0.md +52 -0
  54. package/dist/web-ui/docs/en/cli/release-notes/v2.123.0.md +28 -0
  55. package/dist/web-ui/docs/en/cli/release-notes/v2.123.1.md +13 -0
  56. package/dist/web-ui/docs/en/cli/release-notes/v2.124.0.md +30 -0
  57. package/dist/web-ui/docs/en/cli/release-notes/v2.124.1.md +22 -0
  58. package/dist/web-ui/docs/en/cli/release-notes/v2.125.0.md +44 -0
  59. package/dist/web-ui/docs/en/cli/release-notes/v2.125.1.md +22 -0
  60. package/dist/web-ui/docs/en/cli/release-notes/v2.125.2.md +13 -0
  61. package/dist/web-ui/docs/en/cli/release-notes/v2.125.3.md +30 -0
  62. package/dist/web-ui/docs/en/cli/release-notes/v2.125.4.md +33 -0
  63. package/dist/web-ui/docs/en/cli/sdk-hooks.md +30 -0
  64. package/dist/web-ui/docs/en/cli/settings.md +37 -3
  65. package/dist/web-ui/docs/en/cli/slash-commands.md +2 -2
  66. package/dist/web-ui/docs/en/cli/sub-agents.md +114 -9
  67. package/dist/web-ui/docs/en/cli/troubleshooting.md +55 -0
  68. package/dist/web-ui/docs/en/cli/web-ui.md +3 -0
  69. package/dist/web-ui/docs/search-index-en.json +1 -1
  70. package/dist/web-ui/docs/search-index-zh.json +1 -1
  71. package/dist/web-ui/docs/sidebar-en.json +1 -1
  72. package/dist/web-ui/docs/sidebar-zh.json +1 -1
  73. package/package.json +2 -3
  74. package/product.cloudhosted.json +2 -2
  75. package/product.internal.json +2 -2
  76. package/product.ioa.json +2 -2
  77. package/product.json +2 -2
  78. package/product.selfhosted.json +2 -2
  79. package/dist/web-ui/docs/cn/cli/brokered-shell-macos.md +0 -778
  80. package/dist/web-ui/docs/en/cli/brokered-shell-macos.md +0 -778
@@ -116,6 +116,12 @@ CodeBuddy 会根据任务自动决定生成多少成员,也可以明确指定
116
116
  创建一个 4 人团队并行重构这些模块,每个成员使用 lite 模型。
117
117
  ```
118
118
 
119
+ 团队成员与普通子代理使用相同的模型解析规则,并按 `subagent_type` 匹配持久化配置:
120
+
121
+ - 提示词中明确指定的模型属于本次调用设置,仍可被 `CODEBUDDY_CODE_SUBAGENT_MODEL` 统一覆盖。
122
+ - 未明确指定模型时,系统依次考虑项目级和用户全局的按子代理设置、内置声明,最后继承团队领导的主模型。
123
+ - 使用 `/agents` 管理按子代理设置,使用 `/model` 管理 `lite` / `reasoning` 对应的具体模型。
124
+
119
125
  ### 要求成员在实施前提交计划
120
126
 
121
127
  对于复杂或高风险的任务,可以要求成员在实施前先提交计划:
@@ -43,6 +43,7 @@
43
43
  | `--tools` | 限制可用的内置工具集(白名单)。空字符串 `""` 禁用所有内置工具,`"default"` 使用全部工具,或指定逗号分隔的工具名。支持 `Defer(X)` / `NoDefer(X)` 修饰符按需调整工具的延迟加载状态,详见 [工具延迟加载覆盖](tool-defer-overlay.md) | `codebuddy --tools "Bash,Read,Defer(Glob)"` |
44
44
  | `--mcp-config <fileOrString>` | 从 JSON 文件或 JSON 字符串加载 MCP 服务器配置 | `codebuddy --mcp-config ./mcp.json` |
45
45
  | `--strict-mcp-config` | 仅使用 `--mcp-config` 或 SDK `mcpServers` 提供的 MCP 服务器,忽略用户、项目和本地 `.mcp.json` 等文件型配置;未显式传入时,交互模式、`--serve` 和 ACP 会继续加载这些文件型配置 | `codebuddy --serve --strict-mcp-config` |
46
+ | `--no-session-persistence` | 仅在内存中保留会话上下文,不创建或更新本地 transcript;仍可以只读加载已有会话 | `codebuddy --serve --no-session-persistence` |
46
47
  | `--print`, `-p` | 打印响应后退出,不进入交互模式 | `codebuddy -p "查询"` |
47
48
  | `--settings` | 从 JSON 文件或 JSON 字符串加载额外的设置配置 | `codebuddy --settings '{"model":"gpt-5"}' "查询"` |
48
49
  | `--setting-sources` | 指定要加载的设置源,逗号分隔(可选值: `user`, `project`, `local`)。默认: `user,project,local` | `codebuddy --setting-sources project,local "查询"` |
@@ -92,7 +93,7 @@
92
93
  | `prompt` | 是 | 指导子代理行为的系统提示词 |
93
94
  | `tools` | 否 | 子代理可以使用的特定工具数组(如 `["Read", "Edit", "Bash"]`)。省略则继承所有工具 |
94
95
  | `disallowedTools` | 否 | 子代理禁止使用的工具数组(黑名单),与 session 级 `--disallowedTools` 取并集生效 |
95
- | `model` | 否 | 要使用的模型别名: `sonnet`、`opus` `haiku`。省略则使用默认子代理模型 |
96
+ | `model` | 否 | 模型 ID、名称或别名、场景变体 `lite` / `reasoning`,或 `inherit` / `default`。省略或设为 `inherit` / `default` 时,继续通过正常的子代理解析链选择模型 |
96
97
 
97
98
  示例:
98
99
 
@@ -102,7 +103,7 @@ codebuddy --agents '{
102
103
  "description": "专业代码审查员。代码更改后主动使用。",
103
104
  "prompt": "你是高级代码审查员。专注于代码质量、安全性和最佳实践。",
104
105
  "tools": ["Read", "Grep", "Glob", "Bash"],
105
- "model": "sonnet"
106
+ "model": "lite"
106
107
  },
107
108
  "debugger": {
108
109
  "description": "错误和测试失败的调试专家。",
@@ -80,13 +80,13 @@ CodeBuddy Code 每次交互都会消耗 Token。成本因代码库大小、查
80
80
 
81
81
  ### 自动模型选择
82
82
 
83
- CodeBuddy Code 会根据任务类型自动选择合适的场景模型。当子代理执行时,系统会根据用户当前选择的主模型,自动解析出对应的场景模型。
83
+ CodeBuddy Code 会根据任务类型解析合适的场景模型。例如,`Explore` 的内置声明是 `lite`,可以把代码搜索交给更快、更经济的模型;规划类任务则可使用 `reasoning`。
84
84
 
85
- 例如,`contentAnalyzer` 等轻量级子代理会自动使用 `lite` 模型,在保证功能的同时降低成本、提升速度。
85
+ 在 `/model` **Scenario Models** 区域将 `lite` 和 `reasoning` 映射到具体模型;如需单独配置某个内置子代理,可通过 `/agents` 选择具体模型或场景变体。项目设置只覆盖同名子代理或场景键,不会删除其他全局映射。
86
86
 
87
87
  Agent 工具支持通过 `model` 参数指定场景类型:
88
88
 
89
- * `default`:继承父模型,适用于一般任务
89
+ * `default`:继续使用由按子代理设置、内置声明和主模型组成的默认编排
90
90
  * `lite`:快速且低成本,适用于简单搜索、快速文件操作
91
91
  * `reasoning`:增强推理能力,适用于复杂分析、架构决策
92
92
 
@@ -124,11 +124,11 @@ When you are using compact, please focus on test output and code changes.
124
124
 
125
125
  ### 选择合适的模型
126
126
 
127
- 根据任务复杂度选择模型。使用 `/model` 在会话中切换模型,或在 `/config` 中设置默认值。
127
+ 根据任务复杂度选择模型。使用 `/model` 切换主模型,或在 **Scenario Models** 区域配置 `lite` / `reasoning`;使用 `/agents` 为特定内置子代理选择场景变体或具体模型。
128
128
 
129
- * **简单任务使用 lite**:文件搜索、快速查询、代码格式化
130
- * **复杂任务使用 reasoning**:架构设计、性能优化、复杂调试
131
- * **一般任务使用 default**:日常编码、功能实现
129
+ * **简单任务使用 `lite`**:文件搜索、快速查询、代码格式化
130
+ * **复杂任务使用 `reasoning`**:架构设计、性能优化、复杂调试
131
+ * **一般任务使用 `default`**:日常编码、功能实现
132
132
 
133
133
  ### 减少 MCP 服务器开销
134
134
 
@@ -259,12 +259,18 @@ codebuddy daemon start --port 8080
259
259
  # CI 启动
260
260
  codebuddy daemon start --port 9090
261
261
 
262
- # 其他 CI 步骤调用
262
+ # 其他 CI 步骤调用(body 为 Gateway Protocol 格式,须含 id/type)
263
263
  curl -X POST http://127.0.0.1:9090/api/v1/runs \
264
264
  -H "Content-Type: application/json" \
265
- -d '{"prompt": "审查这个 PR 的代码变更"}'
265
+ -H "X-CodeBuddy-Request: 1" \
266
+ -d '{"id": "run-1", "type": "message", "payload": {"text": "审查这个 PR 的代码变更"}}'
267
+ # 响应: {"data": {"runId": "uuid-xxx", "status": "accepted"}}
266
268
  ```
267
269
 
270
+ > 说明:`/api/v1/runs` 请求必须携带 `X-CodeBuddy-Request` 头,body 使用
271
+ > [Gateway Protocol](./http-api.md) 格式(`id`、`type` 为必填,prompt 文本放
272
+ > 在 `payload.text`)。字段详情见 [HTTP API 文档](./http-api.md)。
273
+
268
274
  ### 多人共享 Agent
269
275
 
270
276
  一台开发机上启动 daemon 绑定局域网地址,团队成员通过 Web UI 共同使用同一个 Agent 环境。
@@ -32,10 +32,15 @@ CodeBuddy Code 支持通过环境变量来控制其行为。这些变量可以
32
32
  | `CODEBUDDY_CODE_SUBAGENT_MODEL` | **一刀切**覆盖所有内置子代理的模型(优先级最高,压过 `subagents` 设置项)。仅需按子代理独立配置时,改用 `/agents` 面板或 `settings.json` 的 `subagents.agents.<子代理名>.model` |
33
33
  | `MAX_THINKING_TOKENS` | 启用扩展思考并设置思考过程的 token 预算。默认禁用 |
34
34
 
35
- > **env 与 settings 的关系**:模型相关环境变量是**运维/CI 级的最高优先级覆盖**。
36
- > - `CODEBUDDY_CODE_SUBAGENT_MODEL` 对**所有**子代理一刀切;若要**按子代理**分别指定,用 `settings.json` 的 `subagents.agents.<子代理名>.model`(支持全局 + 项目双 scope,可在 `/agents` 面板编辑),详见 [子代理文档](sub-agents.md)。
37
- > - `CODEBUDDY_SMALL_FAST_MODEL` / `CODEBUDDY_BIG_SLOW_MODEL` 是**按变体**独立设置的(前者只影响 `lite`、后者只影响 `reasoning`);对应的可持久化设置项是 `variantModels`(可在 `/model` 面板的「场景变体区」编辑),详见 [设置文档](settings.md)。
38
- > - 优先级:env(最高)> `settings`(项目 > 全局)> 内置默认。取消 env settings 恢复生效。
35
+ > **env 与 settings 的关系**:模型相关环境变量用于运维或 CI 级覆盖。
36
+ >
37
+ > - 内置子代理:`CODEBUDDY_CODE_SUBAGENT_MODEL` > 本次 Agent 工具调用的 `model` 入参 > 项目级 `subagents` > 用户全局 `subagents` > 产品内置声明 > 主模型。
38
+ > - 场景变体:对应的变体环境变量 > 项目级 `variantModels` > 用户全局 `variantModels` > 主模型的 `relatedModels` > 适用的产品内置默认 > 主模型。
39
+ >
40
+ > - `CODEBUDDY_CODE_SUBAGENT_MODEL` 统一覆盖所有子代理。若要分别指定,使用 `/agents` 或 `subagents.agents.<子代理名>.model`,详见 [子代理文档](sub-agents.md)。
41
+ > - `CODEBUDDY_SMALL_FAST_MODEL` 只影响 `lite`,`CODEBUDDY_BIG_SLOW_MODEL` 只影响 `reasoning`。对应的持久化设置可通过 `/model` 或 `variantModels` 管理,详见 [设置文档](settings.md)。
42
+ >
43
+ > 取消环境变量后会恢复低优先级配置,不一定直接回退到主模型。
39
44
 
40
45
  ## Bash 工具配置
41
46
 
@@ -67,6 +72,7 @@ CodeBuddy Code 支持通过环境变量来控制其行为。这些变量可以
67
72
  | `CODEBUDDY_PLUGIN_DIRS` | 冒号分隔的本地插件目录路径列表(等同于 `--plugin-dir`),插件的 `bin/` 目录会自动注入到 `PATH` |
68
73
  | `CODEBUDDY_IMAGE_GEN_ENABLED` | 设置为 `false` 或 `0` 禁用图片生成功能 |
69
74
  | `CODEBUDDY_IMAGE_EDIT_ENABLED` | 设置为 `false` 或 `0` 禁用图片编辑功能 |
75
+ | `CODEBUDDY_SHARE_LINK_ENABLED` | 设置为 `false` 或 `0` 禁用 ShareLink 工具(将本地单个 HTML 文件上传并返回可分享的公网链接)。默认开启。该环境变量优先级最高,未设置时回落到云端 `productFeatures.ShareLink` 开关(缺省 `true`) |
70
76
  | `CODEBUDDY_COMPUTER_USE_ENABLED` | **实验功能**:设置为 `true` 或 `1` 启用 macOS 桌面控制工具(截图、鼠标、键盘)。仅 macOS 可用,默认关闭。首次调用键盘/鼠标动作需在系统设置 → 隐私与安全 → 辅助功能、屏幕录制中为终端授权 |
71
77
  | `CODEBUDDY_WAIT_FOR_MCP_SERVERS_ENABLED` | 设置为 `0` 或 `false` 禁用 WaitForMcpServers 工具。默认开启。交互模式下不阻塞等待 MCP 连接,当 LLM 需要尚未就绪的 MCP 工具时可主动调用此工具按需等待。WorkBuddy 场景设置为 `0` 禁用 |
72
78
  | `CODEBUDDY_DEFERRED_TOOLS_MCP_READY_WAIT_MS` | 渲染延迟工具描述前等待 MCP 服务器就绪的最长毫秒数,默认 `2500`。设为 `0` 完全跳过等待,连接较慢则会立即把"仍在连接"提示烘焙进描述;调大可让远端 MCP 服务器有更多时间在首次提示前完成握手。一旦服务器就绪即立即继续,超时仅作为上限 |
@@ -74,6 +80,7 @@ CodeBuddy Code 支持通过环境变量来控制其行为。这些变量可以
74
80
  | `CODEBUDDY_SHOW_ALL_DEFERRED_TOOLS` | 设置为 `true` 或 `1` 显示所有延迟工具的完整描述 |
75
81
  | `CODEBUDDY_DISABLE_CRON` | 设置为 `1` 禁用计划任务 |
76
82
  | `CODEBUDDY_DISABLE_FORK_SUBAGENT` | 设置为 `1` 禁用 Agent 工具的 Fork 子代理模式(`subagent_type="fork"`)。启用后 Agent 工具描述会自动隐藏 fork-mode 段落,模型不会看到该功能;若模型仍然传 `subagent_type="fork"`,运行时会回落到名为 `fork` 的自定义代理(如用户在 `.codebuddy/agents/fork.md` 定义),否则改写为 `general-purpose` 普通子代理。适用于需要避免 fork 递归派生导致请求量放大的宿主场景 |
83
+ | `CODEBUDDY_CODE_DISABLE_BACKGROUND_TASKS` | 设置为 `1` / `true` 禁用 Agent、Bash、PowerShell 工具的后台任务(`run_in_background=true`)。启用后这些工具 schema 中的 `run_in_background` 参数会被隐藏,模型不会看到该字段;即使历史/缓存 tool call 或直接调用方传入该参数,运行时也会兜底回退到同步(Agent)/前台(Bash、PowerShell)执行路径。适用于请求-响应式 SDK / 一次性任务场景——这类场景主进程在主 turn 结束后立即退出,任何后台代理/后台命令的结果都无法回流到最终答复中。对齐 Claude Code 的 `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS`(同样统管 Agent + Bash + PowerShell)。默认未设置(后台任务保持可用)。与 print-mode 守卫(`-p` 下始终阻断后台执行)相互独立 |
77
84
  | `CODEBUDDY_REHYDRATE_IMAGE_BLOB_REFS` | 设置为 `true` 在 `-p` 模式流式输出中将图片 blob 引用还原为完整 base64 数据。适用于需要直接获取图片数据的下游集成场景 |
78
85
 
79
86
  ## 上下文和内存
@@ -207,7 +214,7 @@ CodeBuddy Code 支持把内部 traces 通过 OTLP 协议上报到用户自有的
207
214
  | `CODEBUDDY_GATEWAY_PASSWORD` | Gateway 访问密码 |
208
215
  | `CODEBUDDY_GATEWAY_FORCE_TUNNEL` | 设置为 `1` 强制使用 tunnel 模式 |
209
216
  | `CODEBUDDY_DISABLE_REQUEST_VALIDATION` | 设置为 `1` 关闭 Gateway 自定义请求头校验(`X-CodeBuddy-Request`)。详见 [HTTP API 安全](./http-api.md#安全) |
210
- | `CODEBUDDY_CODE_CORS_ORIGINS` | 额外的 CORS 允许来源(逗号分隔)。支持精确 origin、`*.domain` 子域通配和 `*` 全开。如 `https://*.example.com,https://specific.com` |
217
+ | `CODEBUDDY_CODE_CORS_ORIGINS` | 额外的 CORS 允许来源(逗号分隔)。支持精确 origin、`*.domain` 子域通配和 `*` 全开。如 `https://*.example.com,https://specific.com`。未设置时,若服务绑定 `0.0.0.0`(`--host 0.0.0.0`)则自动允许所有来源 |
211
218
  | `SERVER__HOST` | `--serve` 模式监听地址(默认:`127.0.0.1`) |
212
219
  | `SERVER__PORT` | `--serve` 模式监听端口 |
213
220
 
@@ -246,6 +253,8 @@ CodeBuddy Code 支持把内部 traces 通过 OTLP 协议上报到用户自有的
246
253
  | `CODEBUDDY_DEBUG_SDK` | 设置为 `1`/`true`/`yes`/`on` 启用 SDK 调试 |
247
254
  | `CODEBUDDY_DEBUG_REQUEST` | 设置为 `1` 启用请求调试 |
248
255
  | `CODEBUDDY_STARTUP_PROFILE` | 设置为 `1` 启用启动性能分析 |
256
+ | `CODEBUDDY_CODE_HEAP_SNAPSHOT_NEAR_LIMIT_PCT` | **OOM 取证**(默认关闭)。开启后当进程堆越过 V8 堆上限高水位时,自动写一份 heap snapshot 到 `~/.codebuddy/diagnostics/<date>/oom-nearlimit-<pid>-<ts>.heapsnapshot`(进程内只写一次)。取值:`on`/`true`/`1` 按默认 85% 水位;`0.9` 或 `90` 自定义水位;未设 / `0` / `off` / `false` 关闭。⚠️ 快照文件≈当时 heapUsed 的 1.5 倍(GB 级堆会写出数 GB 文件),仅排查 OOM 时开启。详见[故障排查 · OOM](troubleshooting.md#内存溢出-oom-排查) |
257
+ | `CBC_HEAP_SNAPSHOT_ON_WORKFLOW_END` | 设置为 `1` 时,每个 workflow(`ultracode` 等)跑完后写一份 heap snapshot 到 `~/.codebuddy/diagnostics/<date>/`。默认关闭(会占磁盘),仅排查 workflow 残留内存时开启 |
249
258
 
250
259
  ## E2E 测试 (Record/Replay)
251
260
 
@@ -316,7 +325,8 @@ export CODEBUDDY_BIG_SLOW_MODEL="deepseek-v4-pro"
316
325
  # 后台/轻量任务使用的小模型
317
326
  export CODEBUDDY_SMALL_FAST_MODEL="deepseek-v4-flash"
318
327
 
319
- # 子代理使用的模型(不设置则继承主 Agent)
328
+ # 运维级统一覆盖所有子代理。
329
+ # 不设置时会继续使用单次调用、按子代理设置和产品内置编排。
320
330
  export CODEBUDDY_CODE_SUBAGENT_MODEL="deepseek-v4-flash"
321
331
 
322
332
  # 启动时可通过 --model 显式指定主模型
@@ -324,7 +324,7 @@ LLM 必须使用包含以下内容的 JSON 响应:
324
324
  | 事件 | 触发时机 | matcher 字段 | 典型场景 |
325
325
  | --- | --- | --- | --- |
326
326
  | `PreToolUse` | 工具执行前 | 支持(工具名) | 校验命令、二次审批、日志记录 |
327
- | `PostToolUse` | 工具成功执行后 | 支持 | 自动格式化、补充上下文 |
327
+ | `PostToolUse` | 工具成功执行后 | 支持 | 自动格式化、补充上下文、压缩/替换工具结果 |
328
328
  | `Notification` | 权限请求或 60 秒无输入提醒 | 部分支持 | 桌面提示、IM 通知 |
329
329
  | `UserPromptSubmit` | 用户提交消息时<br/>**注:不包括内部命令** | 不支持 | 内容审查、上下文注入 |
330
330
  | `Stop` | 主代理响应结束时 | 不支持 | 要求继续执行、追加提醒 |
@@ -593,7 +593,7 @@ Hooks 通过退出代码、stdout 和 stderr 传达状态:
593
593
  | Hook 事件 | 行为 |
594
594
  |------------|----------|
595
595
  | PreToolUse | 阻止工具调用,向 CodeBuddy 显示消息 |
596
- | PostToolUse | 向 CodeBuddy 显示消息(工具已运行,用于补充上下文) |
596
+ | PostToolUse | 向 CodeBuddy 显示消息(工具已运行,用于补充上下文);可用 `updatedToolOutput` 替换工具结果 |
597
597
  | Notification | N/A,仅向用户显示消息 |
598
598
  | UserPromptSubmit | 阻止提示词处理,清除提示词,仅向用户显示消息 |
599
599
  | Stop | 阻止停止,向 CodeBuddy 显示消息并继续对话 |
@@ -647,9 +647,14 @@ PreToolUse hooks 可以控制工具调用是否继续。
647
647
  - `"ask"` 要求用户在 UI 中确认工具调用,`permissionDecisionReason` 会显示在确认对话框中
648
648
  - `modifiedInput` 允许你在执行前修改工具的输入参数(部分字段覆盖)
649
649
 
650
- #### PostToolUse 上下文注入
650
+ #### PostToolUse 上下文注入与结果替换
651
651
 
652
- PostToolUse 在工具执行**完成后**触发,无法阻止已执行的操作,但可以向 Agent 注入额外上下文信息。
652
+ PostToolUse 在工具执行**完成后**触发,无法阻止已执行的操作,但可以:
653
+
654
+ 1. 向 Agent **追加**额外上下文(`additionalContext`);
655
+ 2. **替换**将要发送给 Agent 的工具结果(`updatedToolOutput`)。
656
+
657
+ **追加上下文**(原始工具结果保留,在其后追加一段提示):
653
658
 
654
659
  ```jsonc
655
660
  {
@@ -660,6 +665,23 @@ PostToolUse 在工具执行**完成后**触发,无法阻止已执行的操作
660
665
  }
661
666
  ```
662
667
 
668
+ **替换工具结果**(用返回值整个替换原始工具输出后再发给 Agent):
669
+
670
+ ```jsonc
671
+ {
672
+ "hookSpecificOutput": {
673
+ "hookEventName": "PostToolUse",
674
+ "updatedToolOutput": "精简后的工具输出"
675
+ }
676
+ }
677
+ ```
678
+
679
+ - `updatedToolOutput` 对**所有工具**生效(内置工具与 MCP 工具均可)。
680
+ - 典型用途:压缩冗长的工具输出(如超大命令日志、超长文件内容)以节省上下文 token —— 这类"压缩型" hook 依赖的正是替换能力。
681
+ - 与 `additionalContext` 的区别:`additionalContext` 是**追加**(结果只会变长),`updatedToolOutput` 是**替换**(结果可以变短)。
682
+ - 两者可同时返回:先用 `updatedToolOutput` 替换,再把 `additionalContext` 追加到替换后的内容上。
683
+ - 对 MCP 工具,返回的 `updatedToolOutput` 若为数组则原样作为 MCP content 数组,否则包装为单个文本块。
684
+
663
685
  > **注意**:`decision: "block"` 字段已废弃。由于工具已执行完成,此时无法真正"阻止"操作。
664
686
 
665
687
  #### UserPromptSubmit 决策控制
@@ -69,6 +69,17 @@ X-CodeBuddy-Request: 1
69
69
 
70
70
  可通过环境变量 `CODEBUDDY_DISABLE_REQUEST_VALIDATION=1` 关闭此校验。
71
71
 
72
+ ### CORS 白名单
73
+
74
+ 跨域请求的 `Origin` 会与服务端 CORS 白名单匹配,不在白名单中的来源会被拒绝(预检返回无 CORS 头的 204,实际请求返回 403 `Origin not allowed`)。白名单来源:
75
+
76
+ - 本地端点及其回环变体(`localhost` / `127.0.0.1` / `[::1]`)
77
+ - Tunnel URL(如启用)
78
+ - 配置项 `gateway.corsOrigins`
79
+ - 环境变量 `CODEBUDDY_CODE_CORS_ORIGINS`(逗号分隔,支持精确 origin、`*.domain` 子域通配和 `*` 全开)
80
+
81
+ 绑定 `0.0.0.0` 时(如 `--host 0.0.0.0`,常见于云虚拟机 / 局域网暴露场景),若未显式设置 `CODEBUDDY_CODE_CORS_ORIGINS`,服务端会**自动允许所有来源**(等价于配置 `*`),无需额外配置即可通过任意 IP 或域名访问 Web UI;显式设置该环境变量时以用户配置为准。
82
+
72
83
  ### 认证
73
84
 
74
85
  支持两种模式(环境变量 `CODEBUDDY_GATEWAY_AUTH` 控制):
@@ -286,10 +297,12 @@ CBC 增强:
286
297
  | POST | `/api/v1/plugins/enable` | 启用插件 |
287
298
  | POST | `/api/v1/plugins/disable` | 禁用插件 |
288
299
  | POST | `/api/v1/plugins/uninstall` | 卸载插件 |
300
+ | POST | `/api/v1/plugins/update` | 更新插件到最新版本 |
289
301
  | GET | `/api/v1/plugins/marketplaces` | 列出已配置的插件市场 |
290
- | POST | `/api/v1/plugins/marketplaces` | 添加插件市场 |
302
+ | POST | `/api/v1/plugins/marketplaces` | 添加插件市场(可选 `autoUpdate` 添加时即开启自动更新) |
291
303
  | POST | `/api/v1/plugins/marketplaces/browse` | 浏览市场中的可用插件 |
292
304
  | POST | `/api/v1/plugins/marketplaces/update` | 更新市场(同步远端仓库内容) |
305
+ | POST | `/api/v1/plugins/marketplaces/auto-update` | 开启/关闭市场自动更新 |
293
306
  | DELETE | `/api/v1/plugins/marketplaces/:name` | 删除插件市场 |
294
307
 
295
308
  ### 配置管理
@@ -302,6 +315,15 @@ CBC 增强:
302
315
  | POST | `/api/v1/settings/:key/items` | 向数组类配置追加值 |
303
316
  | POST | `/api/v1/settings/:key/remove` | 从数组类配置移除值 |
304
317
 
318
+ ### 工作目录
319
+
320
+ | 方法 | 端点 | 说明 |
321
+ |------|------|------|
322
+ | GET | `/api/v1/workspace-dirs` | 列出当前附加工作目录 |
323
+ | POST | `/api/v1/workspace-dirs` | 添加单个工作目录 |
324
+ | DELETE | `/api/v1/workspace-dirs?path=` | 移除单个工作目录 |
325
+ | PUT | `/api/v1/workspace-dirs/sync` | 全量同步工作目录列表 |
326
+
305
327
  ### 任务模板
306
328
 
307
329
  | 方法 | 端点 | 说明 |
@@ -352,17 +374,46 @@ curl http://127.0.0.1:8080/api/v1/health
352
374
  ### 发起 Agent 执行
353
375
 
354
376
  ```bash
355
- # 发送消息
377
+ # 发送消息(body 为 Gateway Protocol 格式,id/type 必填)
356
378
  curl -X POST http://127.0.0.1:8080/api/v1/runs \
357
379
  -H "Content-Type: application/json" \
358
- -d '{"text": "帮我分析代码性能", "sender": {"id": "dev", "name": "Developer"}}'
380
+ -H "X-CodeBuddy-Request: 1" \
381
+ -d '{
382
+ "id": "run-1",
383
+ "type": "message",
384
+ "source": {"platform": "generic", "sender": {"id": "dev", "name": "Developer"}, "conversation": {"id": "run-1", "type": "direct"}},
385
+ "payload": {"text": "帮我分析代码性能"}
386
+ }'
359
387
 
360
388
  # 响应: {"data": {"runId": "uuid-xxx", "status": "accepted"}}
361
389
 
362
- # 通过 SSE 流获取结果
363
- curl http://127.0.0.1:8080/api/v1/runs/uuid-xxx/stream
390
+ # 通过 SSE 流获取结果(同样需携带 X-CodeBuddy-Request 头)
391
+ curl -H "X-CodeBuddy-Request: 1" http://127.0.0.1:8080/api/v1/runs/uuid-xxx/stream
364
392
  ```
365
393
 
394
+ #### 请求体字段(Gateway Protocol)
395
+
396
+ `POST /api/v1/runs` 的请求体为 Gateway Protocol 入站消息格式:
397
+
398
+ | 字段 | 必填 | 类型 | 说明 |
399
+ |------|------|------|------|
400
+ | `id` | ✅ | string | 消息唯一 ID,由调用方生成,用于去重与追踪 |
401
+ | `type` | ✅ | `"message"` \| `"action"` | 消息类型。`message` 发起对话,`action` 发送控制指令 |
402
+ | `payload.text` | — | string | prompt 文本(也兼容顶层 `text` / `prompt`) |
403
+ | `payload.attachments` | — | array | 附件列表,元素含 `type`(`image`/`voice`/`video`/`file`)、`url`、`urlType`(`local-path`/`url`)等 |
404
+ | `version` | — | string | 协议版本,默认 `"1.0"` |
405
+ | `source.platform` | — | string | 来源平台,默认 `"generic"` |
406
+ | `source.sender.id` | — | string | 发送者 ID,用于限流;缺省为 `"unknown"` |
407
+ | `source.sender.name` | — | string | 发送者名称 |
408
+ | `source.conversation.id` | — | string | 会话 ID,缺省取 `id` |
409
+ | `source.conversation.type` | — | `"direct"` \| `"group"` | 会话类型,默认 `"direct"` |
410
+ | `action` | — | `"cancel"` \| `"status"` | 仅 `type="action"` 时使用的控制动作 |
411
+ | `callback.url` | — | string | 异步回传结果的回调地址(模式 B) |
412
+ | `callback.headers` | — | object | 回调请求附加的自定义头 |
413
+ | `timeoutMs` | — | number | 单次执行超时(毫秒),优先级高于 `settings.gateway.runTimeoutMs`;也可用请求头 `X-Codebuddy-Run-Timeout`。设为 0 或负数关闭超时保护 |
414
+
415
+ > 权威定义见源码 `src/node/remote-gateway/gateway-protocol.ts` 的 `GatewayInboundMessage`。
416
+
366
417
  ### PTY 终端管理
367
418
 
368
419
  ```bash
@@ -541,6 +592,11 @@ curl -X POST http://127.0.0.1:8080/api/v1/plugins/uninstall \
541
592
  -H "Content-Type: application/json" \
542
593
  -d '{"plugin": "my-plugin@my-marketplace"}'
543
594
 
595
+ # 更新插件到最新版本(传 waitForApply=true 可等待重建生效后再返回)
596
+ curl -X POST http://127.0.0.1:8080/api/v1/plugins/update \
597
+ -H "Content-Type: application/json" \
598
+ -d '{"plugin": "my-plugin@my-marketplace"}'
599
+
544
600
  # 列出插件市场
545
601
  curl http://127.0.0.1:8080/api/v1/plugins/marketplaces
546
602
 
@@ -549,6 +605,11 @@ curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces \
549
605
  -H "Content-Type: application/json" \
550
606
  -d '{"source": "https://example.com/marketplace", "name": "my-marketplace"}'
551
607
 
608
+ # 添加插件市场并默认开启自动更新(等价于添加后再调一次 marketplaces/auto-update)
609
+ curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces \
610
+ -H "Content-Type: application/json" \
611
+ -d '{"source": "https://example.com/marketplace", "name": "my-marketplace", "autoUpdate": true}'
612
+
552
613
  # 浏览市场中的插件
553
614
  curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces/browse \
554
615
  -H "Content-Type: application/json" \
@@ -559,6 +620,11 @@ curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces/update \
559
620
  -H "Content-Type: application/json" \
560
621
  -d '{"marketplace": "my-marketplace"}'
561
622
 
623
+ # 开启/关闭市场自动更新(开启后后台周期性同步并升级已安装插件)
624
+ curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces/auto-update \
625
+ -H "Content-Type: application/json" \
626
+ -d '{"marketplace": "my-marketplace", "autoUpdate": true}'
627
+
562
628
  # 删除插件市场
563
629
  curl -X DELETE http://127.0.0.1:8080/api/v1/plugins/marketplaces/my-marketplace
564
630
  ```
@@ -591,6 +657,33 @@ curl -X POST http://127.0.0.1:8080/api/v1/settings/permissions/remove \
591
657
  -d '{"values": ["Allow: Read(**)"]}'
592
658
  ```
593
659
 
660
+ ### 工作目录
661
+
662
+ 管理附加工作目录,使权限系统放行这些目录下的文件操作(与 `/add-dir` 命令效果一致)。
663
+
664
+ ```bash
665
+ # 列出当前附加工作目录
666
+ curl http://127.0.0.1:8080/api/v1/workspace-dirs
667
+
668
+ # 添加工作目录
669
+ curl -X POST http://127.0.0.1:8080/api/v1/workspace-dirs \
670
+ -H "Content-Type: application/json" \
671
+ -d '{"path": "/Users/me/other-project"}'
672
+
673
+ # 移除工作目录
674
+ curl -X DELETE "http://127.0.0.1:8080/api/v1/workspace-dirs?path=/Users/me/other-project"
675
+
676
+ # 全量同步(页面刷新恢复后调用)
677
+ curl -X PUT http://127.0.0.1:8080/api/v1/workspace-dirs/sync \
678
+ -H "Content-Type: application/json" \
679
+ -d '{"dirs": ["/Users/me/project-a", "/Users/me/project-b"]}'
680
+ ```
681
+
682
+ **说明**:
683
+ - 添加的目录存储在 CLI scope(进程内存),实例关闭后失效
684
+ - 前端通过 Web UI 的 workspace storage 持久化,页面刷新后自动同步到后端
685
+ - 添加后,Agent 工具(Read/Write/Glob/Grep/Bash)可免询问访问这些目录
686
+
594
687
  ### 使用统计
595
688
 
596
689
  ```bash
@@ -494,7 +494,7 @@ echo $CODEBUDDY_INTERNET_ENVIRONMENT
494
494
 
495
495
  | 版本 | `CODEBUDDY_INTERNET_ENVIRONMENT` |
496
496
  |:----|:--------------------------------|
497
- | 海外版 | 不设置或 `public` |
497
+ | 海外版 | 不设置 |
498
498
  | 中国版 | `internal` |
499
499
  | iOA 版 | `ioa` |
500
500
 
@@ -338,7 +338,7 @@ CodeBuddy Code 在一次会话中会根据场景切换模型,避免用大模
338
338
  |------|------|---------|
339
339
  | `lite` | 轻量快速模型,用于后台提取、摘要等低价值请求;也是 Agent 工具 `model: "lite"` 参数对应的模型 | **已生效** |
340
340
  | `reasoning` | 推理增强模型,用于需要深度思考的复杂推理;Agent 工具 `model: "reasoning"` 参数对应的模型 | **已生效** |
341
- | `subagent` | Agent / 团队成员默认使用的模型 | **预留未启用**——当前子代理模型通过 `CODEBUDDY_CODE_SUBAGENT_MODEL` 环境变量或 agent 配置的 `models[0]` 决定,不读取本字段 |
341
+ | `subagent` | 子代理和团队成员默认使用的模型 | **预留未启用**——子代理使用独立的 `subagents` 解析链,不读取本字段 |
342
342
  | `vision` | 视觉理解模型,用于需要处理图片的请求 | **预留未启用**——类型已定义,尚无调用点消费此 variant |
343
343
  | `longContext` | 长上下文模型,用于上下文超长的请求 | **预留未启用**——类型已定义,尚无调用点消费此 variant |
344
344
 
@@ -347,7 +347,7 @@ CodeBuddy Code 在一次会话中会根据场景切换模型,避免用大模
347
347
  **关键规则(自定义模型必读):**
348
348
 
349
349
  > 通过 `models.json` 添加的自定义模型**不会继承**产品内置的 `defaultRelatedModels`。
350
- > 如果没有在自身条目里显式声明 `relatedModels`,所有场景都会回退到主模型自己——也就是说子代理、litereasoning 全部用同一个大模型跑,成本和速度都不划算。
350
+ > 如果自定义主模型没有声明 `relatedModels`,且没有环境变量或 `variantModels` 覆盖,`lite` 和 `reasoning` 会回退到主模型。子代理不读取 `relatedModels.subagent`,但配置为 `lite` 或 `reasoning` 的子代理仍会走这条场景变体解析链。
351
351
 
352
352
  **配置示例(DeepSeek 主模型 + flash 作为 lite / reasoning):**
353
353
 
@@ -386,21 +386,51 @@ CodeBuddy Code 在一次会话中会根据场景切换模型,避免用大模
386
386
  }
387
387
  ```
388
388
 
389
- **解析优先级(从高到低,当前仅 `lite` / `reasoning` 会走到这个解析链):**
389
+ **场景变体解析优先级(从高到低,当前仅 `lite` / `reasoning` 会走这个解析链):**
390
390
 
391
- 1. 环境变量显式指定(`CODEBUDDY_SMALL_FAST_MODEL` 对应 `lite`、`CODEBUDDY_BIG_SLOW_MODEL` 对应 `reasoning`)
392
- 2. 当前主模型条目里的 `relatedModels[variant]`
393
- 3. 产品内置的 `defaultRelatedModels[variant]`(**仅对内置模型生效,自定义模型跳过这步**)
394
- 4. 回落到主模型自身
391
+ 1. 对应的环境变量(`CODEBUDDY_SMALL_FAST_MODEL` 对应 `lite`、`CODEBUDDY_BIG_SLOW_MODEL` 对应 `reasoning`)
392
+ 2. 项目级 `variantModels[variant]`
393
+ 3. 用户全局 `variantModels[variant]`
394
+ 4. 当前主模型条目里的 `relatedModels[variant]`
395
+ 5. 产品内置的 `defaultRelatedModels[variant]`(仅对内置模型生效,自定义模型跳过这步)
396
+ 6. 回落到主模型自身
395
397
 
396
- > **子代理模型的取值规则不走 `relatedModels.subagent`**,而是独立的链路:Agent 工具 `model` 参数 > `CODEBUDDY_CODE_SUBAGENT_MODEL` 环境变量 > agent 配置的 `models[0]` > 主模型。
398
+ `variantModels` 保存在 `settings.json` 中,也可通过 `/model` 面板的 **Scenario Models** 区域编辑。它适合在用户或项目范围内将 `lite` / `reasoning` 固定映射到具体模型;`relatedModels` 则适合让映射跟随当前主模型。
397
399
 
398
- **与环境变量方式的取舍:**
400
+ **内置子代理解析优先级(从高到低):**
399
401
 
400
- - 想让某主模型在 `lite` / `reasoning` 场景自动切到另一个同厂小模型:在主模型条目里声明 `relatedModels` 最直观,绑定关系跟着模型走。
401
- - 想让子代理用小模型:目前必须走环境变量 `CODEBUDDY_CODE_SUBAGENT_MODEL`,或在 agent 配置里把小模型写到 `models[0]`——**不是** `relatedModels.subagent`。
402
- - 想在不同项目里用不同的大小模型组合:用环境变量(`CODEBUDDY_MODEL` / `CODEBUDDY_BIG_SLOW_MODEL` / `CODEBUDDY_SMALL_FAST_MODEL` / `CODEBUDDY_CODE_SUBAGENT_MODEL`),配合项目级 `.env` 切换。
403
- - 两种方式同时生效时,环境变量优先。
402
+ 1. `CODEBUDDY_CODE_SUBAGENT_MODEL`,统一覆盖所有子代理
403
+ 2. 本次 Agent 工具调用的 `model` 入参
404
+ 3. 项目级 `subagents.agents.<子代理名>.model`
405
+ 4. 用户全局 `subagents.agents.<子代理名>.model`
406
+ 5. 产品内置声明,如 `Explore` 使用 `lite`
407
+ 6. 继承主对话模型
408
+
409
+ 子代理模型不读取 `relatedModels.subagent`。当子代理配置为 `lite` 或 `reasoning` 时,会继续通过上面的场景变体解析链得到具体模型。
410
+
411
+ 以下配置应写入用户级或项目级 `settings.json`:
412
+
413
+ ```json
414
+ {
415
+ "subagents": {
416
+ "agents": {
417
+ "Explore": { "model": "lite" },
418
+ "Plan": { "model": "reasoning" }
419
+ }
420
+ },
421
+ "variantModels": {
422
+ "lite": "<fast-model-id>",
423
+ "reasoning": "<reasoning-model-id>"
424
+ }
425
+ }
426
+ ```
427
+
428
+ **不同配置方式的适用场景:**
429
+
430
+ - 使用 `relatedModels`,让场景映射跟随主模型。
431
+ - 使用 `variantModels` 或 `/model`,在用户或项目范围内固定 `lite` / `reasoning` 的具体模型。
432
+ - 使用 `subagents.agents.<子代理名>.model` 或 `/agents`,为内置子代理分别选择模型或场景变体。
433
+ - 使用模型环境变量进行运维或 CI 级覆盖。环境变量优先于持久化设置;取消后,低优先级设置会恢复生效。
404
434
 
405
435
  ### 完整示例
406
436
 
@@ -235,10 +235,11 @@ CodeBuddy 默认认为只有**当前工作目录**是受信任的。Read 工具
235
235
  | :--- | :--- |
236
236
  | `--add-dir <path>` 启动参数 | 进程级 |
237
237
  | 会话内 `/add-dir` 命令 | 会话级 |
238
+ | Web UI 添加目录(`/api/v1/workspace-dirs`) | 进程级(前端持久化) |
238
239
  | `permissions.additionalDirectories` 配置项 | 持久化 |
239
240
  | `permissions.trustedDirectories` 配置项 | 持久化 |
240
241
 
241
- 最终生效的信任目录 = 工作区根 + `settings.trustedDirectories` + 启动时 `--add-dir` / 会话内 `/add-dir` 添加的目录。
242
+ 最终生效的信任目录 = 工作区根 + `settings.trustedDirectories` + 启动时 `--add-dir` / 会话内 `/add-dir` / Web UI 添加的目录。
242
243
 
243
244
  > `--add-dir` 和 `permissions.additionalDirectories` 都只授予**文件访问权**,**不会**让 CodeBuddy 加载这些目录里的 `.codebuddy/` 配置(agents / hooks / settings 等都仍以启动目录的为准)。
244
245
 
@@ -913,6 +913,8 @@ CodeBuddy 按以下优先级计算缓存键:
913
913
 
914
914
  没有显式版本的 Git 插件以 12 位 commit SHA 为缓存目录名。通过版本约束解析 tag 时,缓存目录额外包含 12 位 commit SHA 后缀;约束校验使用单独记录的 `resolvedVersion`,不依赖可能过期的 manifest 版本。
915
915
 
916
+ 旧版本已经记录为 `unknown` 的 Git marketplace 插件会在启动时自动迁移:CodeBuddy 从当前 marketplace checkout 解析 commit SHA,将源码物化到对应的 SHA 缓存目录,再原子更新 `installed_plugins.json`。旧的 `unknown` 目录只会被标记为 orphan;至少保留 14 天,并且仍有活动会话的 `.in_use` 标记时不会删除。非 Git 来源且没有显式版本的插件继续使用 `unknown`。
917
+
916
918
  ---
917
919
 
918
920
  ## 九、与 Claude Code 的兼容性
@@ -17,6 +17,21 @@ Release Notes 记录了每个版本的用户可见变更,包括:
17
17
 
18
18
  <!-- 新版本自动添加到此处 -->
19
19
 
20
+ - [v2.125.4](./v2.125.4.md) - 2026-07-23
21
+ - [v2.125.3](./v2.125.3.md) - 2026-07-23
22
+ - [v2.125.2](./v2.125.2.md) - 2026-07-22
23
+ - [v2.125.1](./v2.125.1.md) - 2026-07-22
24
+ - [v2.125.0](./v2.125.0.md) - 2026-07-21
25
+ - [v2.124.1](./v2.124.1.md) - 2026-07-19
26
+ - [v2.124.0](./v2.124.0.md) - 2026-07-17
27
+ - [v2.123.1](./v2.123.1.md) - 2026-07-16
28
+ - [v2.123.0](./v2.123.0.md) - 2026-07-16
29
+ - [v2.122.0](./v2.122.0.md) - 2026-07-15
30
+ - [v2.121.3](./v2.121.3.md) - 2026-07-15
31
+ - [v2.121.2](./v2.121.2.md) - 2026-07-14
32
+ - [v2.121.1](./v2.121.1.md) - 2026-07-14
33
+ - [v2.121.0](./v2.121.0.md) - 2026-07-14
34
+ - [v2.120.0](./v2.120.0.md) - 2026-07-13
20
35
  - [v2.119.4](./v2.119.4.md) - 2026-07-12
21
36
  - [v2.119.3](./v2.119.3.md) - 2026-07-12
22
37
  - [v2.119.2](./v2.119.2.md) - 2026-07-12
@@ -0,0 +1,31 @@
1
+ # 🚀 CodeBuddy Code v2.120.0 发布
2
+
3
+ ## 📦 版本信息
4
+
5
+ | 组件 | 版本 |
6
+ |------|------|
7
+ | CodeBuddy Code CLI | v2.120.0 |
8
+ | Agent SDK JS | v0.3.212 |
9
+ | Agent SDK Python | v0.3.211 |
10
+
11
+ ## ✨ 新功能
12
+
13
+ ### 子 Agent 模型灵活配置
14
+
15
+ 现在可以按内置子 Agent(Explore / general-purpose / Plan 等)的粒度**独立指定模型**,各子 Agent 互不影响、可自由组合,不再只能通过环境变量一刀切。
16
+
17
+ - 新增 `subagents` 配置项(`subagents.agents.<子Agent名>.model`),支持全局与项目两个 scope;
18
+ - 在 `/agents` 面板可直接查看每个子 Agent 的「实际生效模型 + 来源」并可视化编辑;
19
+ - 环境变量 `CODEBUDDY_CODE_SUBAGENT_MODEL` 仍为最高优先级、对所有子 Agent 统一生效。
20
+
21
+ ### 场景变体模型配置
22
+
23
+ 新增 `variantModels` 配置项,可在 `/model` 面板查看并修改 `lite`(轻量快速)与 `reasoning`(推理增强)两个通用场景槽位当前映射的模型,支持全局与项目两个 scope;对应环境变量 `CODEBUDDY_SMALL_FAST_MODEL` / `CODEBUDDY_BIG_SLOW_MODEL` 仍按变体独立、最高优先级生效。
24
+
25
+ > 向后兼容:未做任何配置时,行为与升级前完全一致。
26
+
27
+ ## 🐛 问题修复
28
+
29
+ - **沙箱 Bash 环境变量**:修复 Bash 沙箱执行时腾讯文档等 MCP 配置无法透传,导致相关工具不可用的问题。
30
+ - **沙箱降级更稳健**:修复沙箱启动失败并降级到本地执行时,出现多余的 `unhandledRejection` 诊断告警的问题。
31
+ - **Skill 加载优先级**:修复项目内 Skill 与全局 Skill 同名时,项目 Skill 未按就近优先级生效的问题。
@@ -0,0 +1,42 @@
1
+ # 🚀 CodeBuddy Code v2.121.0 发布
2
+
3
+ ## 📦 版本信息
4
+
5
+ | 组件 | 版本 |
6
+ |------|------|
7
+ | CodeBuddy Code CLI | v2.121.0 |
8
+ | Agent SDK JS | v0.3.213 |
9
+ | Agent SDK Python | v0.3.212 |
10
+
11
+ ## ✨ 新功能
12
+
13
+ ### 工作目录管理
14
+
15
+ 新增 `/api/v1/workspace-dirs` REST API,支持列出、添加、移除和全量同步附加工作目录。Web UI 输入框工具栏新增工作目录堆叠图标,可视化添加/移除附加工作目录;附加工作目录信息会自动注入到 Agent 系统提示词中,让模型感知完整的工作范围。
16
+
17
+ ### 插件更新与市场自动更新
18
+
19
+ - **插件更新公开接口**:新增 `POST /api/v1/plugins/update`,在公开 HTTP API 上提供「将已安装插件更新到最新版本」能力,支持指定插件、作用域与是否等待生效,为客户端「套件自动更新」提供前置能力。
20
+ - **市场自动更新开关**:新增 `POST /api/v1/plugins/marketplaces/auto-update`,可开启/关闭市场自动更新;开启后由后台周期性同步市场并把已安装插件升级到最新。
21
+
22
+ ### 权限模式扩展
23
+
24
+ ACP 新增 Full Access 和 Delegate 权限模式,提供更灵活的权限控制选项。
25
+
26
+ ## 🔧 改进优化
27
+
28
+ - **Hooks 输出替换**:PostToolUse 支持通过 `updatedToolOutput` 替换所有工具的输出,便于压缩冗长结果并降低上下文占用。
29
+ - **后台任务开关**:新增环境变量 `CODEBUDDY_CODE_DISABLE_BACKGROUND_TASKS`,宿主开启后隐藏 Agent、Bash、PowerShell 的后台执行参数,并兜底回退到同步/前台执行,保证结果一定回流到主答复,避免请求-响应式 SDK 场景下结果丢失。
30
+ - **PTY 稳定性**:升级 PTY 底层依赖,纳入 macOS PTY 退出后的文件描述符回收修复,提升终端稳定性。
31
+ - **输入框工具栏**:Mode/Model 选择器尺寸优化,更紧凑。
32
+ - **文件树加载体验**:目录展开增加延迟显示 loading,避免快速加载时的闪烁。
33
+
34
+ ## 🐛 问题修复
35
+
36
+ - **空模型响应处理**:修复模型正常结束但未返回有效内容时对话被静默取消、界面只显示占位符的问题;现在会作为可重试错误处理,仍为空时明确提示,避免会话被钉死无法继续。
37
+ - **--print stream-json 结果误报**:修复该模式下工具未找到错误被自动恢复后,最终 result 仍误报 `is_error=true` 的问题,行为与交互式会话保持一致。
38
+ - **延迟加载工具参数稳定性**:在重试轮补充目标工具的参数结构提示,降低数组等复杂字段被误生成的概率。
39
+ - **AskUserQuestion 参数校验**:参数不合规时不再静默返回空结果,新增前置校验返回可读报错,并为问题卡片加渲染兜底。
40
+ - **ACP 消息时间语义**:恢复每条消息独立记录时间戳的语义,避免完成耗时被首个流式分片时间截断。
41
+ - **日志刷屏**:将 MCP 延迟工具索引的诊断日志降为 debug 级并删除逐工具热路径行,避免长会话下日志文件被撑到 GB 级。
42
+ - **Linux Sandbox**:在 WorkBuddy Linux 中启用 sandbox-cli 后端,并使用 pipe 模式执行命令。
@@ -0,0 +1,20 @@
1
+ # 🚀 CodeBuddy Code v2.121.1 发布
2
+
3
+ ## 📦 版本信息
4
+
5
+ | 组件 | 版本 |
6
+ |------|------|
7
+ | CodeBuddy Code CLI | v2.121.1 |
8
+ | Agent SDK JS | v0.3.214 |
9
+ | Agent SDK Python | v0.3.213 |
10
+
11
+ ## 🐛 问题修复
12
+
13
+ - **子 Agent 卡在 preparing / ESC 崩溃**:修复本地 CLI 下主 Agent 调用 Agent 工具起子 Agent 后,子 Agent 长时间卡在 preparing 阶段不执行、且按 ESC 中断时进程崩溃的问题。子 Agent 在未启用 sandbox 时不再等待一个永不就绪的会话;准备阶段被中断时不再产生未处理异常;并为 MCP 工具列表查询补充请求超时,避免慢/无响应的 MCP 服务阻塞子 Agent 启动。
14
+ - **工具调用流式解析**:修复部分模型将工具调用的 id 和 name 拆分到不同流式分片时,客户端无法识别导致工具调用失败、会话报错的问题。现已放宽首个分片的识别条件,允许后续分片补发工具名,兼容协议允许的字段拆分场景。
15
+ - **Web UI 崩溃**:修复 chat 页面因循环依赖导致浏览器崩溃的问题。
16
+ - **会话恢复列表**:过滤掉没有真实用户输入的空壳会话(如新建后立刻切走、仅留下命令记账消息的会话),避免标题回退显示成命令名。
17
+
18
+ ## 📝 文档更新
19
+
20
+ - **HTTP API / Daemon 文档**:补充 `/api/v1/runs` 的请求头与请求体说明,示例统一为 Gateway Protocol 格式,并新增请求体字段表。