oh-my-opencode-slim 2.1.1 → 2.2.1

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 (43) hide show
  1. package/README.ja-JP.md +113 -118
  2. package/README.ko-KR.md +141 -123
  3. package/README.md +102 -145
  4. package/README.zh-CN.md +112 -118
  5. package/dist/agents/index.d.ts +0 -4
  6. package/dist/cli/index.js +57 -20
  7. package/dist/cli/providers.d.ts +11 -4
  8. package/dist/config/constants.d.ts +11 -1
  9. package/dist/config/schema.d.ts +680 -2
  10. package/dist/config/strip-orchestrator-model.d.ts +9 -0
  11. package/dist/hooks/command-hook-utils.d.ts +5 -0
  12. package/dist/hooks/foreground-fallback/index.d.ts +40 -28
  13. package/dist/hooks/image-hook.d.ts +1 -0
  14. package/dist/hooks/index.d.ts +1 -1
  15. package/dist/index.js +1992 -455
  16. package/dist/interview/document.d.ts +2 -1
  17. package/dist/interview/ui.d.ts +0 -1
  18. package/dist/multiplexer/cmux/close-policy.d.ts +20 -0
  19. package/dist/multiplexer/cmux/index.d.ts +102 -0
  20. package/dist/multiplexer/cmux/session-lifecycle.d.ts +92 -0
  21. package/dist/multiplexer/cmux/session-state.d.ts +45 -0
  22. package/dist/multiplexer/factory.d.ts +0 -9
  23. package/dist/multiplexer/herdr/index.d.ts +2 -0
  24. package/dist/multiplexer/index.d.ts +3 -1
  25. package/dist/multiplexer/session-manager.d.ts +10 -2
  26. package/dist/multiplexer/shared.d.ts +8 -1
  27. package/dist/multiplexer/types.d.ts +5 -2
  28. package/dist/multiplexer/zellij/index.d.ts +1 -1
  29. package/dist/tools/smartfetch/utils.d.ts +3 -1
  30. package/dist/tui-state.d.ts +5 -5
  31. package/dist/tui.js +87 -27
  32. package/dist/utils/escape-html.d.ts +1 -0
  33. package/dist/utils/frontmatter.d.ts +6 -0
  34. package/dist/utils/index.d.ts +1 -1
  35. package/dist/utils/logger.d.ts +0 -2
  36. package/oh-my-opencode-slim.schema.json +717 -2
  37. package/package.json +1 -1
  38. package/src/skills/clonedeps/SKILL.md +32 -29
  39. package/src/skills/codemap.md +5 -3
  40. package/src/skills/deepwork/SKILL.md +17 -6
  41. package/src/skills/verification-planning/SKILL.md +102 -0
  42. package/src/skills/worktrees/SKILL.md +14 -7
  43. package/src/skills/release-smoke-test/SKILL.md +0 -159
package/README.zh-CN.md CHANGED
@@ -22,30 +22,32 @@
22
22
 
23
23
  </div>
24
24
 
25
- ---
26
-
27
25
  ## 什么是该插件?
28
26
 
29
27
  oh-my-opencode-slim 是一个用于 OpenCode 的智能体编排插件。它内置了一支专业的智能体团队,可以在同一个编排者(Orchestrator)下,完成侦察代码库、查询最新文档、审查架构、处理 UI 工作以及执行范围明确的实现任务。
30
28
 
31
- 其核心理念非常简单:与其强迫单个模型做所有事情,本插件会将工作的每个部分路由到最适合它的智能体,从而平衡**质量、速度和成本**。
32
-
33
- 要了解智能体本身,请参阅 **[认识众神殿](#meet-the-pantheon)**。如需了解完整特性集,请参阅下方的 **[特性与工作流](#features-and-workflows)**。
29
+ 其核心理念非常简单:与其强迫单个模型做所有事情,本插件会将工作的每个部分路由到最适合它的智能体,从而平衡**质量、速度和成本**。Orchestrator 负责规划工作图,将专家作为后台任务派发,并在继续前整合它们的结果。
34
30
 
35
- ### LazySkills 管理智能体技能
31
+ ### 亮点
36
32
 
37
- <p align="center">
38
- <a href="https://github.com/alvinunreal/lazyskills">
39
- <img src="img/lazyskills-wide.svg" alt="LazySkills" width="720">
40
- </a>
41
- </p>
33
+ - **[七位专业智能体](#meet-the-pantheon)** —— Orchestrator、Explorer、Oracle、Council、Librarian、Designer 和 Fixer。每部分工作都会交给最适合的智能体;可跨任意提供商混用任意模型。
34
+ - **[后台编排](docs/background-orchestration.md)** —— Orchestrator 将专家作为后台任务派发、跟踪并整合结果后再继续;默认并行工作。
35
+ - **[内置 Skills](#skills)** —— 如 `deepwork`、`codemap`、`verification-planning` `reflect` 等基于提示词的工作流,按智能体分配。
36
+ - **[Council](docs/council.md)** —— 使用 `@council` 针对同一问题并行运行多个模型,并综合为一个答案。
37
+ - **[Companion](docs/companion.md)** —— 可选的浮动桌面窗口,显示哪些智能体正在运行,包括并行后台专家。
38
+ - **[多路复用器集成](docs/multiplexer-integration.md)** —— 在 Tmux、Zellij、Herdr 或 cmux 窗格中实时观察智能体工作。
39
+ - **[预设切换](docs/preset-switching.md)** —— 使用 `/preset` 在运行时更换整支团队的模型。
40
+ - **[代码智能工具](docs/tools.md)** —— LSP 工具、支持 25 种语言的 AST 感知搜索,以及用于 Web 搜索、文档和 GitHub 代码搜索的内置 MCP。
41
+ - **[完全可定制](docs/configuration.md)** —— 自定义智能体、提示词覆盖、按智能体控制的 Skill/MCP 权限,以及[项目本地定制](docs/project-local-customization.md)。
42
42
 
43
- **[LazySkills](https://github.com/alvinunreal/lazyskills)** 是一个用于管理智能体技能的终端 UI。它让你可以在一个地方查看已安装的技能、哪些智能体可以使用每个技能、为什么可见性可能失效,以及接下来可以安全执行哪些操作。
43
+ ### OpenAI GPT-5.6
44
44
 
45
45
  <p align="center">
46
- <a href="https://github.com/alvinunreal/lazyskills"><b>探索 LazySkills →</b></a>
46
+ <img src="img/openai-gpt-5-6-pantheon.jpeg" alt="OpenAI GPT-5.6 众神殿:Terra、Sol 和 Luna" width="100%">
47
47
  </p>
48
48
 
49
+ 默认的 [OpenAI 预设](docs/openai-preset.md) 将 Terra 映射为 Orchestrator、Sol 映射为 Oracle、Luna 映射为快速专家通道。
50
+
49
51
  ### 用户怎么说
50
52
 
51
53
  > “任务管理轻松从 5/10 提升到了 8-9/10。Orchestrator 会派出
@@ -134,7 +136,7 @@ bun run build
134
136
  > **建议**了解后台编排的工作原理。**[编排者提示词 (Orchestrator prompt)](https://github.com/alvinunreal/oh-my-opencode-slim/blob/master/src/agents/orchestrator.ts#L28)** 包含调度规则、专家路由逻辑,以及何时应把工作分配给后台智能体的阈值。您始终可以通过以下方式手动委派任务:`@智能体名称 <任务内容>`
135
137
 
136
138
  > [!TIP]
137
- > 由于后台智能体现在是默认工作流,**强烈建议**启用并配置 **[Multiplexer Integration](docs/multiplexer-integration.md)**。它会自动在专用的 Tmux、Zellij 或 Herdr 窗格中打开每个智能体,让您在 Orchestrator 继续协调会话时,实时跟进各个专家智能体的工作。
139
+ > 由于后台智能体现在是默认工作流,**强烈建议**启用并配置 **[Multiplexer Integration](docs/multiplexer-integration.md)**。它会自动在专用的 Tmux、Zellij、Herdrcmux 窗格中打开每个智能体,让您在 Orchestrator 继续协调会话时,实时跟进各个专家智能体的工作。
138
140
 
139
141
  默认生成的配置包含 `openai` 和 `opencode-go` 两个预设:
140
142
 
@@ -152,20 +154,29 @@ bun run build
152
154
  "fixer": { "model": "openai/gpt-5.6-luna", "variant": "medium", "skills": [], "mcps": [] }
153
155
  },
154
156
  "opencode-go": {
155
- "orchestrator": { "model": "opencode-go/glm-5.2", "skills": [ "*" ], "mcps": [ "*", "!context7" ] },
157
+ "orchestrator": { "model": "opencode-go/minimax-m3", "variant": "max", "skills": [ "*" ], "mcps": [ "*", "!context7" ] },
156
158
  "oracle": { "model": "opencode-go/qwen3.7-max", "variant": "max", "skills": ["simplify"], "mcps": [] },
157
- "librarian": { "model": "opencode-go/deepseek-v4-flash", "skills": [], "mcps": [ "websearch", "context7", "gh_grep" ] },
158
- "explorer": { "model": "opencode-go/deepseek-v4-flash", "skills": [], "mcps": [] },
159
+ "librarian": { "model": "opencode-go/deepseek-v4-flash", "variant": "high", "skills": [], "mcps": [ "websearch", "context7", "gh_grep" ] },
160
+ "explorer": { "model": "opencode-go/deepseek-v4-flash", "variant": "max", "skills": [], "mcps": [] },
159
161
  "designer": { "model": "opencode-go/kimi-k2.7-code", "variant": "medium", "skills": [], "mcps": [] },
160
- "fixer": { "model": "opencode-go/deepseek-v4-flash", "variant": "high", "skills": [], "mcps": [] }
162
+ "fixer": { "model": "opencode-go/deepseek-v4-flash", "variant": "high", "skills": [], "mcps": [] },
163
+ "observer": { "model": "opencode-go/mimo-v2.5", "variant": "max", "skills": [], "mcps": [] }
161
164
  }
162
165
  }
163
166
  }
164
167
  ```
165
168
 
169
+ ### 预设文档
170
+
171
+ - **[OpenAI 预设](docs/openai-preset.md)** —— 默认生成的预设;所有智能体均使用 OpenAI 模型。
172
+ - **[OpenCode Go 预设](docs/opencode-go-preset.md)** —— 智能体使用 OpenCode Go 模型;由于其 Orchestrator 模型不支持多模态,因此启用 Observer 进行视觉分析。
173
+ - **[作者的预设](docs/authors-preset.md)** —— 作者日常使用的精确配置,包含第三方 Skills。
174
+ - **[$30 预设](docs/thirty-dollars-preset.md)** —— 围绕 Codex Plus 和 GitHub Copilot Pro 构建的混合服务商方案,每月约 30 美元。
175
+ - **[OpenCode Zen 免费预设](docs/opencode-zen-free-preset.md)** —— 所有智能体均使用 opencode 免费模型;无需使用费用。
176
+
166
177
  ### 针对其他服务商
167
178
 
168
- 要使用自定义模型提供商或混合提供商配置,请参阅 **[配置指南 (docs/configuration.md)](docs/configuration.md)** 以获取完整参考。如果您需要即插即用的起点,请查看 **[作者的预设配置 (docs/authors-preset.md)](docs/authors-preset.md)** 和 **[$30 预设配置 (docs/thirty-dollars-preset.md)](docs/thirty-dollars-preset.md)**(`$30` 预设是性价比最高的便宜配置方案)。
179
+ 要使用自定义模型提供商或混合服务商配置,请参阅完整参考 **[配置](docs/configuration.md)**。
169
180
 
170
181
  ### ✅ 验证您的安装
171
182
 
@@ -190,91 +201,6 @@ ping all agents
190
201
 
191
202
  ---
192
203
 
193
- ### V2 新功能
194
-
195
- V2 将 oh-my-opencode-slim 变成了以调度器为核心的多智能体工作流系统。Orchestrator 专注于规划、委派、结果整合与验证,而专家智能体在各自的工作通道中完成任务。
196
-
197
- - **[后台智能体](#后台智能体)** - Orchestrator 现在会把专家作为后台任务派发,跟踪任务/会话 ID,等待完成事件,并在继续之前整合结果。
198
- - **[Companion](#companion)** - 可选的浮动桌面窗口会显示当前活跃的智能体,包括并行运行的后台专家。
199
- - **[Deepwork](#deepwork)** - 面向大型、多文件、高风险或分阶段编码工作的结构化工作流,使用持久化计划文件和 Oracle 评审关卡。
200
- - **[Reflect](#reflect)** - 回顾重复出现的工作模式,并建议可复用的 skill、智能体、命令、配置规则、提示词规则或项目 playbook。
201
- - **[Worktrees](#worktrees)** - 将 Git worktree 作为隔离编码通道管理,并为复杂、高风险或并行任务提供安全协议。
202
- - **[oh-my-opencode-slim Skill](#oh-my-opencode-slim-skill)** - 随包提供的配置技能,可安全调优模型、提示词、自定义智能体、MCP 访问、预设和插件行为。
203
-
204
- #### 后台智能体
205
-
206
- V2 将后台专家作为默认心智模型:Orchestrator 规划工作图,启动合适的智能体,避免重叠的写入所有权,并在处理终端任务结果后再继续行动。
207
-
208
- 完整调度模型见 **[后台编排](docs/v2-background-orchestration.md)**。
209
-
210
- #### Companion
211
-
212
- 可选 Companion 是一个用于展示实时智能体活动的浮动桌面状态窗口。它显示当前会话状态和活跃智能体,让后台工作一目了然。
213
-
214
- <div align="center">
215
- <img src="img/companion.gif" alt="Companion showing active agents" width="600">
216
- <p><i>左下角视觉伴侣。</i></p>
217
- </div>
218
-
219
- 交互式安装期间,安装器会询问是否启用 Companion,并默认选择 `no`。自动化安装可显式启用:
220
-
221
- ```bash
222
- bunx oh-my-opencode-slim@latest install --companion=yes
223
- ```
224
-
225
- 配置、位置、尺寸和安装详情见 **[Companion](docs/companion.md)**。
226
-
227
- #### Deepwork
228
-
229
- Deepwork 适用于重型编码会话:大范围重构、多阶段功能、高风险架构变更,或需要持久计划的工作。它会创建本地 markdown 进度文件,使用 Oracle 评审关卡,并保持实现阶段结构化。
230
-
231
- 启动方式:
232
-
233
- ```text
234
- /deepwork <heavy coding task>
235
- ```
236
-
237
- 何时使用以及工作流如何运行,请参阅 **[Skills](docs/skills.md#deepwork)**。
238
-
239
- #### Reflect
240
-
241
- Reflect 帮助 Orchestrator 从重复出现的工作流摩擦中学习。它会回顾近期工作和现有资产,然后建议最小且有用的改进:skill、自定义智能体、命令、配置规则、提示词规则、MCP 权限变更或项目 playbook。如果证据不足,它应建议什么都不创建。
242
-
243
- 直接使用:
244
-
245
- ```text
246
- /reflect
247
- /reflect release workflow and checks
248
- ```
249
-
250
- 也可以使用自然语言提示:
251
-
252
- ```text
253
- reflect on my recent workflows
254
- find repeated work worth turning into reusable instructions
255
- ```
256
-
257
- 完整工作流和安全规则见 **[Skills](docs/skills.md#reflect)**。
258
-
259
- #### Worktrees
260
-
261
- Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认位于 `.slim/worktrees/<slug>/`。Orchestrator 负责这些通道的生命周期,在 `.slim/worktrees.json` 中跟踪状态,在通道内调度专家智能体,并在修改 Git 状态前要求明确确认。
262
-
263
- 安全协议见 **[Skills](docs/skills.md#worktrees)**。
264
-
265
- #### oh-my-opencode-slim Skill
266
-
267
- 内置的 `oh-my-opencode-slim` skill 可帮助 Orchestrator 配置和改进插件本身。可用于模型调优、自定义智能体、提示词覆盖、skill/MCP 权限、预设、可选智能体、后台编排以及反复出现的工作流摩擦。
268
-
269
- <div align="center">
270
- <img src="img/oh-my-opencode-skill.png" alt="oh-my-opencode-slim skill in use" width="600">
271
- <p><i>让内置技能帮助调优和改进你的智能体设置。</i></p>
272
- </div>
273
-
274
- 示例和安全规则见 **[Skills](docs/skills.md#oh-my-opencode-slim)**。
275
-
276
- ---
277
-
278
204
  <a id="meet-the-pantheon"></a>
279
205
 
280
206
  ## 🏛️ 认识众神殿
@@ -308,12 +234,12 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
308
234
  </tr>
309
235
  <tr>
310
236
  <td colspan="2">
311
- <b>推荐模型:</b> <code>openai/gpt-5.6-terra (medium)</code> <code>anthropic/claude-opus-4.6</code>
237
+ <b>推荐模型:</b> <code>openai/gpt-5.6-terra (medium)</code> <code>anthropic/claude-fable-5</code> <code>anthropic/claude-opus-4-8</code>
312
238
  </td>
313
239
  </tr>
314
240
  <tr>
315
241
  <td colspan="2">
316
- <b>模型选用指南:</b> 选择您的默认、最强的全能型编程模型。Orchestrator 既是核心编程智能体,又是委派者,因此它需要强大的实现能力、出色的判断力和可靠的指令遵循度。
242
+ <b>模型选用指南:</b> 选择您最强的规划和判断模型。Orchestrator 是工作流管理者:它规划工作、调度后台专家、整合结果并验证产出,因此相比单纯的工作吞吐量,它更需要可靠的指令遵循能力和高层次的技术判断力。
317
243
  </td>
318
244
  </tr>
319
245
  </table>
@@ -349,12 +275,12 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
349
275
  </tr>
350
276
  <tr>
351
277
  <td colspan="2">
352
- <b>推荐模型:</b> <i>无</i>
278
+ <b>推荐模型:</b> <code>openai/gpt-5.3-codex</code> <code>cerebras/zai-glm-4.7</code> <code>fireworks-ai/accounts/fireworks/routers/kimi-k2p6-turbo</code>
353
279
  </td>
354
280
  </tr>
355
281
  <tr>
356
282
  <td colspan="2">
357
- <b>模型选用指南:</b> 选择快速、低成本的模型。Explorer 处理宽泛的侦察工作,因此速度 and 效率通常比使用最强推理模型更重要。
283
+ <b>模型选用指南:</b> 选择快速、低成本的模型。Explorer 处理宽泛的侦察工作,因此速度和效率通常比使用最强推理模型更重要。
358
284
  </td>
359
285
  </tr>
360
286
  </table>
@@ -390,7 +316,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
390
316
  </tr>
391
317
  <tr>
392
318
  <td colspan="2">
393
- <b>推荐模型:</b> <code>openai/gpt-5.6-sol (high)</code> <code>google/gemini-3.1-pro-preview (high)</code>
319
+ <b>推荐模型:</b> <code>openai/gpt-5.6-sol (xhigh)</code> <code>anthropic/claude-fable-5</code> <code>anthropic/claude-opus-4-8 (xhigh)</code>
394
320
  </td>
395
321
  </tr>
396
322
  <tr>
@@ -480,7 +406,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
480
406
  </tr>
481
407
  <tr>
482
408
  <td colspan="2">
483
- <b>推荐模型:</b> <i>无</i>
409
+ <b>推荐模型:</b> <code>openai/gpt-5.3-codex</code> <code>cerebras/zai-glm-4.7</code> <code>fireworks-ai/accounts/fireworks/routers/kimi-k2p6-turbo</code>
484
410
  </td>
485
411
  </tr>
486
412
  <tr>
@@ -521,7 +447,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
521
447
  </tr>
522
448
  <tr>
523
449
  <td colspan="2">
524
- <b>推荐模型:</b> <code>google/gemini-3.1-pro-preview</code> <code>kimi-for-coding/k2p5</code>
450
+ <b>推荐模型:</b> <code>google/gemini-3.5-flash</code> <code>moonshotai/kimi-k2.7-code</code>
525
451
  </td>
526
452
  </tr>
527
453
  <tr>
@@ -562,12 +488,12 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
562
488
  </tr>
563
489
  <tr>
564
490
  <td colspan="2">
565
- <b>推荐模型:</b> <code>openai/gpt-5.6-luna (medium)</code>
491
+ <b>推荐模型:</b> <code>openai/gpt-5.6-luna (medium)</code> <code>anthropic/claude-sonnet-4-6</code>
566
492
  </td>
567
493
  </tr>
568
494
  <tr>
569
495
  <td colspan="2">
570
- <b>模型选用指南:</b> 选择一个快速、可靠的编程模型来执行常规且范围明确的开发工作。Fixer 通常从 Orchestrator 接收具体的计划或受限的指令,非常适合高效执行诸如编写测试、更新测试和直接的代码更改等任务。
496
+ <b>模型选用指南:</b> 为范围明确的实现工作选择可靠的编程模型。Fixer Orchestrator 接收具体计划或受限指令,因此很适合高效完成执行任务和直接的代码变更。
571
497
  </td>
572
498
  </tr>
573
499
  </table>
@@ -579,7 +505,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
579
505
  ### Observer:静默的见证者
580
506
 
581
507
  > [!NOTE]
582
- > **为什么要独立出一个智能体?** 如果您的 Orchestrator 模型不是多模态模型,可以启用 Observer 来处理图像、屏幕截图、PDF 以及其他视觉文件。Observer 默认是禁用的,它在无需您更改核心推理模型的情况下,为 Orchestrator 赋予了专用的多模态读取能力。只需在您的配置中设置 `disabled_agents: []` 并指定一个 `observer` 模型即可。自带的 `opencode-go` 安装预设会自动执行此操作,因为其 GLM Orchestrator 不是多模态模型。
508
+ > **为什么要独立出一个智能体?** 如果您的 Orchestrator 模型不是多模态模型,可以启用 Observer 来处理图像、屏幕截图和其他视觉文件。Observer 默认是禁用的,它在无需您更改核心推理模型的情况下,为 Orchestrator 赋予了专用的多模态读取能力。只需在您的配置中设置 `disabled_agents: []` 并指定一个 `observer` 模型即可。自带的 `opencode-go` 安装预设会自动执行此操作,因为其 GLM Orchestrator 不是多模态模型。省略 `image_routing` 会保留现有的条件式 Observer 行为。仅在启用 Observer 时设置 `image_routing: "auto"`,或设为 `"direct"` 以始终将图片附件直接传给 Orchestrator。
583
509
 
584
510
  <table>
585
511
  <tr>
@@ -593,7 +519,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
593
519
 
594
520
  - 图像、屏幕截图、图表 → `read` 工具(原生图像支持)
595
521
  - PDF 和二进制文档 → `read` 工具(文本 + 结构提取)
596
- - **默认禁用** -- 通过设置 `"disabled_agents": []` 和配置具有视觉能力的模型来启用;若使用 `--preset=opencode-go` 预设安装,将自动使用 `opencode-go/kimi-k2.6` 启用它。
522
+ - **默认禁用** -- 通过设置 `"disabled_agents": []` 和配置具有视觉能力的模型来启用;若使用 `--preset=opencode-go` 预设安装,将自动使用 `opencode-go/mimo-v2.5` 启用它。启用时,图片附件默认会路由至 Observer;设置 `"image_routing": "direct"` 可将其保留给 Orchestrator。
597
523
 
598
524
  </td>
599
525
  </tr>
@@ -616,6 +542,50 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
616
542
 
617
543
  ---
618
544
 
545
+ <a id="skills"></a>
546
+
547
+ ## 🧩 Skills
548
+
549
+ Skills 是注入智能体系统提示词的、基于提示词的指令,用于引导决策、工作流和工具使用。与 MCP(运行中的服务器)不同,Skill 不运行任何进程——它是智能体在任务需要时激活的专用操作手册。安装程序内置八个 Skill,并在插件自动更新时保持更新;本地自定义内容会被保留。
550
+
551
+ | Skill | 用途 | 默认智能体 | 调用方式 |
552
+ |:-----:|------|------------|----------|
553
+ | <img src="img/skills/codemap.webp" width="120" alt="Codemap artifact"><br>[`codemap`](src/skills/codemap/SKILL.md) | 分层仓库地图,让智能体无需反复阅读全部内容也能理解代码库 | `orchestrator` | `run codemap` |
554
+ | <img src="img/skills/deepwork.webp" width="120" alt="Deepwork artifact"><br>[`deepwork`](src/skills/deepwork/SKILL.md) | 面向大型、高风险、多阶段编码会话的结构化工作流,包含审查关卡 | `orchestrator` | `/deepwork <task>` |
555
+ | <img src="img/skills/verification-planning.webp" width="120" alt="Verification Planning artifact"><br>[`verification-planning`](src/skills/verification-planning/SKILL.md) | 在非平凡变更前规划项目特定的证据路径 | `orchestrator` | 非平凡工作前自动调用 |
556
+ | <img src="img/skills/simplify.webp" width="120" alt="Simplify artifact"><br>[`simplify`](src/skills/simplify/SKILL.md) | 保持行为不变地简化代码,提升可读性和可维护性 | `oracle` | 请求简化或在审查期间调用 |
557
+ | <img src="img/skills/worktrees.webp" width="120" alt="Worktrees artifact"><br>[`worktrees`](src/skills/worktrees/SKILL.md) | 将 Git worktree 用作安全、隔离的编码通道,适合高风险或并行工作 | `orchestrator` | `work in a worktree` |
558
+ | <img src="img/skills/clonedeps.webp" width="120" alt="Clonedeps artifact"><br>[`clonedeps`](src/skills/clonedeps/SKILL.md) | 在本地克隆依赖源码,供智能体检查库内部实现 | `orchestrator` | `clone dependencies` |
559
+ | <img src="img/skills/reflect.webp" width="120" alt="Reflect artifact"><br>[`reflect`](src/skills/reflect/SKILL.md) | 将重复的工作流摩擦转化为可复用的 Skill、智能体或配置 | `orchestrator` | `/reflect` |
560
+ | <img src="img/skills/oh-my-opencode-slim.webp" width="120" alt="oh-my-opencode-slim artifact"><br>[`oh-my-opencode-slim`](src/skills/oh-my-opencode-slim/SKILL.md) | 配置并安全改进插件设置本身 | `orchestrator` | 请求调整您的设置 |
561
+
562
+ Skill 分配即权限授予——智能体只能激活被授予的 Skill。请在 `~/.config/opencode/oh-my-opencode-slim.json` 中通过每个智能体的 `skills` 数组进行配置:显式列表、`"*"` 表示全部,或 `"!skill-name"` 用于拒绝某个 Skill。
563
+
564
+ 完整文档请参阅 **[Skills](docs/skills.md)**,或浏览图文概览 **[ohmyopencodeslim.com/skills](https://ohmyopencodeslim.com/skills)**。
565
+
566
+ ---
567
+
568
+ <a id="companion"></a>
569
+
570
+ ## 🖥️ Companion
571
+
572
+ 可选的 Companion 是一个用于展示实时智能体活动的浮动桌面状态窗口。它显示当前会话状态和哪些智能体正在运行,让后台工作一目了然。
573
+
574
+ <div align="center">
575
+ <img src="img/companion.gif" alt="Companion showing active agents" width="600">
576
+ <p><i>左下角视觉伴侣。</i></p>
577
+ </div>
578
+
579
+ 交互式安装期间,安装器会询问是否启用 Companion,并默认选择 `no`。自动化安装可显式启用:
580
+
581
+ ```bash
582
+ bunx oh-my-opencode-slim@latest install --companion=yes
583
+ ```
584
+
585
+ 配置、位置、尺寸和安装详情见 **[Companion](docs/companion.md)**。
586
+
587
+ ---
588
+
619
589
  ## 📚 文档
620
590
 
621
591
  请将本节作为地图:先从安装开始,再根据需要跳转到特性、配置或示例预设。
@@ -629,7 +599,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
629
599
  | **[Council](docs/council.md)** | 使用 `@council` 并行运行多个模型并合成单一答案 |
630
600
  | **[自定义智能体](docs/configuration.md#custom-agents)** | 使用自定义提示词、模型、MCP 访问和 Orchestrator 委派规则定义自己的专家 |
631
601
  | **[ACP Agents](docs/acp-agents.md)** | 将 Claude Code ACP 或 Gemini ACP 等外部 ACP 兼容智能体连接为可委派子智能体 |
632
- | **[多路复用器集成](docs/multiplexer-integration.md)** | 在 Tmux、Zellij 或 Herdr 窗格中实时观看智能体工作 |
602
+ | **[多路复用器集成](docs/multiplexer-integration.md)** | 在 Tmux、Zellij、Herdrcmux 窗格中实时观看智能体工作 |
633
603
  | **[Codemap](docs/codemap.md)** | 生成层级代码地图,更快理解大型代码库 |
634
604
  | **[Clonedeps](docs/clonedeps.md)** | 将选定的依赖源码克隆到被忽略的本地工作区中以供检查 |
635
605
  | **[Worktrees](docs/worktrees.md)** | 使用 `.slim/worktrees/` 通道进行隔离的并行或高风险编码工作 |
@@ -643,9 +613,10 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
643
613
  |-----|----------------|
644
614
  | **[安装指南](docs/installation.md)** | 安装插件、使用 CLI 标志、重置配置并排查设置问题 |
645
615
  | **[配置](docs/configuration.md)** | 配置文件位置、JSONC 支持、提示词覆盖和完整选项参考 |
616
+ | **[项目定制](docs/project-local-customization.md)** | 仓库特定的自定义智能体、提示词覆盖、按智能体分配的 Skill 以及优先级 |
646
617
  | **[后台编排](docs/background-orchestration.md)** | 围绕原生后台子智能体构建的调度器优先 Orchestrator 模型 |
647
618
  | **[维护者指南](docs/maintainers.md)** | issue 分流规则、标签含义、支持路由和仓库维护工作流 |
648
- | **[Skills](docs/skills.md)** | `simplify`、`codemap`、`clonedeps`、`deepwork`、`reflect`、`worktrees` 和 `oh-my-opencode-slim` 等捆绑技能 |
619
+ | **[Skills](docs/skills.md)** | `simplify`、`codemap`、`clonedeps`、`deepwork`、`verification-planning`、`reflect`、`worktrees` 和 `oh-my-opencode-slim` 等捆绑技能 |
649
620
  | **[MCPs](docs/mcps.md)** | `websearch`、`context7`、`gh_grep` 以及每个智能体的 MCP 权限机制 |
650
621
  | **[Tools](docs/tools.md)** | `webfetch`、LSP 工具、代码搜索和格式化工具等内置工具能力 |
651
622
 
@@ -666,7 +637,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
666
637
  <p><sub>每一次合并的贡献都在这片领域留下了印记。</sub></p>
667
638
 
668
639
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
669
- [![All Contributors](https://img.shields.io/badge/all_contributors-59-orange.svg?style=flat-square)](#contributors-)
640
+ [![All Contributors](https://img.shields.io/badge/all_contributors-76-orange.svg?style=flat-square)](#contributors-)
670
641
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
671
642
  </div>
672
643
 
@@ -755,6 +726,29 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
755
726
  <td align="center" valign="top" width="16.66%"><a href="https://github.com/Qesire"><img src="https://avatars.githubusercontent.com/u/102657430?v=4?s=100" width="100px;" alt="Knowingthesea_Qesire"/><br /><sub><b>Knowingthesea_Qesire</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=Qesire" title="Code">💻</a></td>
756
727
  <td align="center" valign="top" width="16.66%"><a href="http://www.flyinghail.net/"><img src="https://avatars.githubusercontent.com/u/157430?v=4?s=100" width="100px;" alt="FENG Hao"/><br /><sub><b>FENG Hao</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=flyinghail" title="Code">💻</a></td>
757
728
  <td align="center" valign="top" width="16.66%"><a href="https://github.com/smatheusblu"><img src="https://avatars.githubusercontent.com/u/5666794?v=4?s=100" width="100px;" alt="Matheus Nogueira Silveira"/><br /><sub><b>Matheus Nogueira Silveira</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=smatheusblu" title="Code">💻</a></td>
729
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/sktr"><img src="https://avatars.githubusercontent.com/u/44969514?v=4?s=100" width="100px;" alt="sktr"/><br /><sub><b>sktr</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=sktr" title="Code">💻</a></td>
730
+ </tr>
731
+ <tr>
732
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/bobbyunknown"><img src="https://avatars.githubusercontent.com/u/62272380?v=4?s=100" width="100px;" alt="Insomnia"/><br /><sub><b>Insomnia</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=bobbyunknown" title="Code">💻</a></td>
733
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/andrescastane"><img src="https://avatars.githubusercontent.com/u/13487870?v=4?s=100" width="100px;" alt="Andres Castañeda"/><br /><sub><b>Andres Castañeda</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=andrescastane" title="Code">💻</a></td>
734
+ <td align="center" valign="top" width="16.66%"><a href="https://zaradacht.com/"><img src="https://avatars.githubusercontent.com/u/24251016?v=4?s=100" width="100px;" alt="Zaradacht Taifour (Zack)"/><br /><sub><b>Zaradacht Taifour (Zack)</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=Zaradacht" title="Code">💻</a></td>
735
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/fslse"><img src="https://avatars.githubusercontent.com/u/90545544?v=4?s=100" width="100px;" alt="fslse"/><br /><sub><b>fslse</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=fslse" title="Code">💻</a></td>
736
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/linze0721"><img src="https://avatars.githubusercontent.com/u/178997622?v=4?s=100" width="100px;" alt="萧瑟"/><br /><sub><b>萧瑟</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=linze0721" title="Code">💻</a></td>
737
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/SisyphusZheng"><img src="https://avatars.githubusercontent.com/u/146103794?v=4?s=100" width="100px;" alt="Zhi"/><br /><sub><b>Zhi</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=SisyphusZheng" title="Code">💻</a></td>
738
+ </tr>
739
+ <tr>
740
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/824156793"><img src="https://avatars.githubusercontent.com/u/19755784?v=4?s=100" width="100px;" alt="lilili"/><br /><sub><b>lilili</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=824156793" title="Code">💻</a></td>
741
+ <td align="center" valign="top" width="16.66%"><a href="http://mikehenke.com/"><img src="https://avatars.githubusercontent.com/u/119844?v=4?s=100" width="100px;" alt="Mike Henke"/><br /><sub><b>Mike Henke</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=mhenke" title="Code">💻</a></td>
742
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/imVinayPandya"><img src="https://avatars.githubusercontent.com/u/5011197?v=4?s=100" width="100px;" alt="Vinay Pandya"/><br /><sub><b>Vinay Pandya</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=imVinayPandya" title="Code">💻</a></td>
743
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/s-shank"><img src="https://avatars.githubusercontent.com/u/241541918?v=4?s=100" width="100px;" alt="Shank"/><br /><sub><b>Shank</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=s-shank" title="Code">💻</a></td>
744
+ <td align="center" valign="top" width="16.66%"><a href="https://rgutzen.github.io/"><img src="https://avatars.githubusercontent.com/u/16289604?v=4?s=100" width="100px;" alt="Robin Gutzen"/><br /><sub><b>Robin Gutzen</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=rgutzen" title="Code">💻</a></td>
745
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/dragon-Elec"><img src="https://avatars.githubusercontent.com/u/197374270?v=4?s=100" width="100px;" alt="Yash"/><br /><sub><b>Yash</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=dragon-Elec" title="Code">💻</a></td>
746
+ </tr>
747
+ <tr>
748
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/Jiajun0413"><img src="https://avatars.githubusercontent.com/u/184531967?v=4?s=100" width="100px;" alt="Liu Jiajun"/><br /><sub><b>Liu Jiajun</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=Jiajun0413" title="Code">💻</a></td>
749
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/umi008"><img src="https://avatars.githubusercontent.com/u/200843810?v=4?s=100" width="100px;" alt="Ulises Millán"/><br /><sub><b>Ulises Millán</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=umi008" title="Code">💻</a></td>
750
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/HighColdHC"><img src="https://avatars.githubusercontent.com/u/35870222?v=4?s=100" width="100px;" alt="HighColdHC"/><br /><sub><b>HighColdHC</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=HighColdHC" title="Code">💻</a></td>
751
+ <td align="center" valign="top" width="16.66%"><a href="https://hardcore.engineer/about"><img src="https://avatars.githubusercontent.com/u/401815?v=4?s=100" width="100px;" alt="Stephan Schielke"/><br /><sub><b>Stephan Schielke</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=stephanschielke" title="Code">💻</a></td>
758
752
  </tr>
759
753
  </tbody>
760
754
  </table>
@@ -29,7 +29,3 @@ export declare function getAgentConfigs(config?: PluginConfig, options?: {
29
29
  * Get the set of disabled agent names from config, applying protection rules.
30
30
  */
31
31
  export declare function getDisabledAgents(config?: PluginConfig): Set<string>;
32
- /**
33
- * Get the list of enabled (non-disabled) agent names.
34
- */
35
- export declare function getEnabledAgentNames(config?: PluginConfig): string[];
package/dist/cli/index.js CHANGED
@@ -292,7 +292,7 @@ var SUBAGENT_NAMES = [
292
292
  var ALL_AGENT_NAMES = ["orchestrator", ...SUBAGENT_NAMES];
293
293
  var PROTECTED_AGENTS = new Set(["orchestrator", "councillor"]);
294
294
  var MAX_POLL_TIME_MS = 5 * 60 * 1000;
295
- var PHASE_REMINDER_TEXT = `!IMPORTANT! Scheduler workflow: plan lanes/dependencies → dispatch background specialists → track task IDs → wait for hook-driven completion → reconcile terminal results → verify. Do not poll running jobs, consume running-job output, or advance dependent work. !END!`;
295
+ var PHASE_REMINDER_TEXT = `!IMPORTANT! Scheduler workflow: First choose the lightest workflow that fits the work. If direct execution is justified, complete it and verify proportionately. Otherwise: plan lanes/dependencies → dispatch background specialists → track task IDs → wait for hook-driven completion → reconcile terminal results → verify. Do not poll running jobs, consume running-job output, or advance dependent work. !END!`;
296
296
  function formatSystemReminder(text) {
297
297
  return `<system-reminder>
298
298
  ${text}
@@ -415,6 +415,33 @@ var ManualPlanSchema = z2.object({
415
415
  librarian: ManualAgentPlanSchema,
416
416
  fixer: ManualAgentPlanSchema
417
417
  }).strict();
418
+ var PermissionActionSchema = z2.enum(["ask", "allow", "deny"]);
419
+ var PermissionRuleSchema = z2.union([
420
+ PermissionActionSchema,
421
+ z2.record(z2.string(), PermissionActionSchema)
422
+ ]);
423
+ var PermissionObjectSchema = z2.object({
424
+ read: PermissionRuleSchema.optional(),
425
+ edit: PermissionRuleSchema.optional(),
426
+ glob: PermissionRuleSchema.optional(),
427
+ grep: PermissionRuleSchema.optional(),
428
+ list: PermissionRuleSchema.optional(),
429
+ bash: PermissionRuleSchema.optional(),
430
+ task: PermissionRuleSchema.optional(),
431
+ external_directory: PermissionRuleSchema.optional(),
432
+ lsp: PermissionRuleSchema.optional(),
433
+ skill: PermissionRuleSchema.optional(),
434
+ todowrite: PermissionActionSchema.optional(),
435
+ question: PermissionActionSchema.optional(),
436
+ webfetch: PermissionActionSchema.optional(),
437
+ websearch: PermissionActionSchema.optional(),
438
+ codesearch: PermissionActionSchema.optional(),
439
+ doom_loop: PermissionActionSchema.optional()
440
+ }).catchall(PermissionRuleSchema);
441
+ var PermissionConfigSchema = z2.union([
442
+ PermissionActionSchema,
443
+ PermissionObjectSchema
444
+ ]);
418
445
  var AgentOverrideConfigSchema = z2.object({
419
446
  model: z2.union([
420
447
  z2.string(),
@@ -433,13 +460,15 @@ var AgentOverrideConfigSchema = z2.object({
433
460
  prompt: z2.string().min(1).optional(),
434
461
  orchestratorPrompt: z2.string().min(1).optional(),
435
462
  options: z2.record(z2.string(), z2.unknown()).optional(),
436
- displayName: z2.string().min(1).optional()
463
+ displayName: z2.string().min(1).optional(),
464
+ permission: PermissionConfigSchema.optional()
437
465
  }).strict();
438
466
  var MultiplexerTypeSchema = z2.enum([
439
467
  "auto",
440
468
  "tmux",
441
469
  "zellij",
442
470
  "herdr",
471
+ "cmux",
443
472
  "none"
444
473
  ]);
445
474
  var MultiplexerLayoutSchema = z2.enum([
@@ -485,7 +514,7 @@ var FailoverConfigSchema = z2.object({
485
514
  retryDelayMs: z2.number().min(0).default(500),
486
515
  maxRetries: z2.number().int().min(0).default(3).describe("Number of consecutive 429/rate-limit responses tolerated on the " + "same model before aborting (or swapping to the next fallback " + "model when a chain is configured)."),
487
516
  retry_on_empty: z2.boolean().default(true).describe("When true (default), empty provider responses are treated as failures, " + "triggering fallback/retry. Set to false to treat them as successes."),
488
- runtimeOverride: z2.boolean().default(true).describe("When true (default), a runtime model selected via /model that is " + "outside the configured fallback chain will still trigger the chain " + "on rate-limit errors. When false, out-of-chain runtime picks are " + "respected and the error surfaces instead of silently falling back " + "to the chain. Models that are members of the chain always fall back " + "regardless of this setting.")
517
+ runtimeOverride: z2.boolean().optional().describe("DEPRECATED: no longer used. Previously controlled whether out-of-chain " + "runtime model picks triggered fallback. Fallback is now always " + "disabled when a user explicitly selects a model via /model.")
489
518
  }).strict();
490
519
  var CompanionConfigSchema = z2.object({
491
520
  enabled: z2.boolean().optional(),
@@ -527,11 +556,13 @@ var PluginConfigSchema = z2.object({
527
556
  preset: z2.string().optional(),
528
557
  setDefaultAgent: z2.boolean().optional(),
529
558
  compactSidebar: z2.boolean().optional().describe("Use the compact TUI sidebar layout. Defaults to true; set false to use the expanded layout."),
559
+ stripOrchestratorModel: z2.boolean().optional().describe("When true, omit orchestrator.model and orchestrator.variant from the SDK config so OpenCode uses the session model selected with /model after subagent dispatch. An explicitly selected preset that sets orchestrator.model is preserved. Defaults to false."),
530
560
  autoUpdate: z2.boolean().optional().describe("Disable automatic installation of plugin updates when false. Defaults to true."),
531
561
  presets: z2.record(z2.string(), PresetSchema).optional(),
532
562
  agents: z2.record(z2.string(), AgentOverrideConfigSchema).optional(),
533
563
  disabled_agents: z2.array(z2.string()).optional().describe("Agent names to disable completely. " + "Disabled agents are not instantiated and cannot be delegated to. " + "Orchestrator and council internal agents (councillor) cannot be disabled. " + "By default, 'observer' is disabled. Remove it from this list and configure a vision-capable model to enable."),
534
- disabled_mcps: z2.array(z2.string()).optional(),
564
+ image_routing: z2.enum(["auto", "direct"]).optional().describe("How image attachments are handled. " + "When omitted, preserves legacy conditional behavior: intercept " + 'attachments only when observer is enabled. "auto": requires ' + "observer to be enabled and saves attachments to disk before " + 'nudging delegation to @observer. "direct": always passes ' + "attachments to the orchestrator untouched."),
565
+ disabled_mcps: z2.array(z2.string()).optional().describe("MCP server names to disable completely. Disabled servers are not " + "started and cannot be used by agents."),
535
566
  disabled_tools: z2.array(z2.string()).optional().describe("Tool names to disable completely. Disabled tools are not registered with OpenCode and cannot be used by agents."),
536
567
  disabled_skills: z2.array(z2.string()).optional().describe("Skill names to disable completely. Disabled skills are not granted to agents, even when referenced by presets or agent overrides."),
537
568
  multiplexer: MultiplexerConfigSchema.optional(),
@@ -595,6 +626,12 @@ var CUSTOM_SKILLS = [
595
626
  allowedAgents: ["orchestrator"],
596
627
  sourcePath: "src/skills/deepwork"
597
628
  },
629
+ {
630
+ name: "verification-planning",
631
+ description: "Plan credible, proportionate evidence before non-trivial implementation",
632
+ allowedAgents: ["orchestrator"],
633
+ sourcePath: "src/skills/verification-planning"
634
+ },
598
635
  {
599
636
  name: "reflect",
600
637
  description: "Review repeated work and suggest reusable workflow improvements",
@@ -607,12 +644,6 @@ var CUSTOM_SKILLS = [
607
644
  allowedAgents: ["orchestrator"],
608
645
  sourcePath: "src/skills/oh-my-opencode-slim"
609
646
  },
610
- {
611
- name: "release-smoke-test",
612
- description: "Validate packed release candidates and bugfixes before public publish",
613
- allowedAgents: ["orchestrator"],
614
- sourcePath: "src/skills/release-smoke-test"
615
- },
616
647
  {
617
648
  name: "worktrees",
618
649
  description: "Manage Git worktrees as OMO safe isolated coding lanes for complex/risky/parallel work",
@@ -634,7 +665,7 @@ var MODEL_MAPPINGS = {
634
665
  fixer: { model: "openai/gpt-5.6-luna", variant: "medium" }
635
666
  },
636
667
  kimi: {
637
- orchestrator: { model: "kimi-for-coding/k2p5" },
668
+ orchestrator: { model: "kimi-for-coding/k2p5", variant: "max" },
638
669
  oracle: { model: "kimi-for-coding/k2p5", variant: "high" },
639
670
  librarian: { model: "kimi-for-coding/k2p5", variant: "low" },
640
671
  explorer: { model: "kimi-for-coding/k2p5", variant: "low" },
@@ -642,7 +673,7 @@ var MODEL_MAPPINGS = {
642
673
  fixer: { model: "kimi-for-coding/k2p5", variant: "low" }
643
674
  },
644
675
  copilot: {
645
- orchestrator: { model: "github-copilot/claude-opus-4.6" },
676
+ orchestrator: { model: "github-copilot/claude-opus-4.6", variant: "max" },
646
677
  oracle: { model: "github-copilot/claude-opus-4.6", variant: "high" },
647
678
  librarian: { model: "github-copilot/grok-code-fast-1", variant: "low" },
648
679
  explorer: { model: "github-copilot/grok-code-fast-1", variant: "low" },
@@ -653,7 +684,7 @@ var MODEL_MAPPINGS = {
653
684
  fixer: { model: "github-copilot/claude-sonnet-4.6", variant: "low" }
654
685
  },
655
686
  "zai-plan": {
656
- orchestrator: { model: "zai-coding-plan/glm-5" },
687
+ orchestrator: { model: "zai-coding-plan/glm-5", variant: "max" },
657
688
  oracle: { model: "zai-coding-plan/glm-5", variant: "high" },
658
689
  librarian: { model: "zai-coding-plan/glm-5", variant: "low" },
659
690
  explorer: { model: "zai-coding-plan/glm-5", variant: "low" },
@@ -661,13 +692,13 @@ var MODEL_MAPPINGS = {
661
692
  fixer: { model: "zai-coding-plan/glm-5", variant: "low" }
662
693
  },
663
694
  "opencode-go": {
664
- orchestrator: { model: "opencode-go/glm-5.2" },
695
+ orchestrator: { model: "opencode-go/minimax-m3", variant: "max" },
665
696
  oracle: { model: "opencode-go/qwen3.7-max", variant: "max" },
666
- librarian: { model: "opencode-go/deepseek-v4-flash" },
667
- explorer: { model: "opencode-go/deepseek-v4-flash" },
697
+ explorer: { model: "opencode-go/deepseek-v4-flash", variant: "max" },
698
+ librarian: { model: "opencode-go/deepseek-v4-flash", variant: "high" },
668
699
  designer: { model: "opencode-go/kimi-k2.7-code", variant: "medium" },
669
700
  fixer: { model: "opencode-go/deepseek-v4-flash", variant: "high" },
670
- observer: { model: "opencode-go/kimi-k2.6" }
701
+ observer: { model: "opencode-go/mimo-v2.5", variant: "max" }
671
702
  }
672
703
  };
673
704
  function isGeneratedPresetName(value) {
@@ -2757,7 +2788,9 @@ async function installCompanionArchive(finalBinaryPath, target, manifest, downlo
2757
2788
  if (tempDir) {
2758
2789
  try {
2759
2790
  rmSync3(tempDir, { recursive: true, force: true });
2760
- } catch {}
2791
+ } catch (err) {
2792
+ log("[updater] install cleanup failed", String(err));
2793
+ }
2761
2794
  }
2762
2795
  }
2763
2796
  }
@@ -2767,7 +2800,9 @@ function readInstallMetadata(binaryPath) {
2767
2800
  if (parsed?.version && parsed.tag && parsed.target) {
2768
2801
  return parsed;
2769
2802
  }
2770
- } catch {}
2803
+ } catch (err) {
2804
+ log("[updater] metadata read failed", String(err));
2805
+ }
2771
2806
  return null;
2772
2807
  }
2773
2808
  function writeInstallMetadata(binaryPath, metadata) {
@@ -2789,7 +2824,9 @@ async function withCompanionInstallLock(binaryPath, timeoutMs, staleMs, run) {
2789
2824
  } finally {
2790
2825
  try {
2791
2826
  rmSync3(lock, { recursive: true, force: true });
2792
- } catch {}
2827
+ } catch (err) {
2828
+ log("[updater] lock release failed", String(err));
2829
+ }
2793
2830
  }
2794
2831
  } catch (err) {
2795
2832
  const code = err.code;