oh-my-opencode-slim 2.1.0 → 2.2.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 (61) hide show
  1. package/README.ja-JP.md +31 -30
  2. package/README.ko-KR.md +31 -30
  3. package/README.md +57 -33
  4. package/README.zh-CN.md +29 -28
  5. package/dist/agents/index.d.ts +0 -4
  6. package/dist/cli/index.js +90 -16
  7. package/dist/cli/providers.d.ts +7 -7
  8. package/dist/companion/manager.d.ts +3 -0
  9. package/dist/config/constants.d.ts +12 -1
  10. package/dist/config/council-schema.d.ts +37 -12
  11. package/dist/config/schema.d.ts +691 -6
  12. package/dist/config/strip-orchestrator-model.d.ts +9 -0
  13. package/dist/council/council-manager.d.ts +7 -3
  14. package/dist/hooks/command-hook-utils.d.ts +5 -0
  15. package/dist/hooks/foreground-fallback/index.d.ts +53 -7
  16. package/dist/hooks/image-hook.d.ts +1 -0
  17. package/dist/hooks/index.d.ts +2 -1
  18. package/dist/hooks/phase-reminder/index.d.ts +3 -1
  19. package/dist/hooks/post-file-tool-nudge/index.d.ts +15 -9
  20. package/dist/hooks/session-lifecycle.d.ts +11 -0
  21. package/dist/hooks/task-session-manager/index.d.ts +14 -2
  22. package/dist/index.js +2804 -801
  23. package/dist/interview/document.d.ts +2 -1
  24. package/dist/interview/service.d.ts +2 -0
  25. package/dist/interview/ui.d.ts +0 -1
  26. package/dist/multiplexer/cmux/close-policy.d.ts +20 -0
  27. package/dist/multiplexer/cmux/index.d.ts +102 -0
  28. package/dist/multiplexer/cmux/session-lifecycle.d.ts +92 -0
  29. package/dist/multiplexer/cmux/session-state.d.ts +45 -0
  30. package/dist/multiplexer/factory.d.ts +0 -9
  31. package/dist/multiplexer/herdr/index.d.ts +7 -3
  32. package/dist/multiplexer/index.d.ts +3 -1
  33. package/dist/multiplexer/session-manager.d.ts +14 -6
  34. package/dist/multiplexer/shared.d.ts +31 -0
  35. package/dist/multiplexer/tmux/index.d.ts +0 -1
  36. package/dist/multiplexer/types.d.ts +5 -2
  37. package/dist/multiplexer/zellij/index.d.ts +0 -1
  38. package/dist/tools/cancel-task.d.ts +2 -2
  39. package/dist/tools/smartfetch/utils.d.ts +3 -1
  40. package/dist/tui-state.d.ts +5 -5
  41. package/dist/tui.d.ts +1 -0
  42. package/dist/tui.js +130 -29
  43. package/dist/utils/background-job-board.d.ts +5 -1
  44. package/dist/utils/background-job-coordinator.d.ts +72 -0
  45. package/dist/utils/background-job-store.d.ts +46 -0
  46. package/dist/utils/councillor-models.d.ts +20 -0
  47. package/dist/utils/escape-html.d.ts +1 -0
  48. package/dist/utils/frontmatter.d.ts +6 -0
  49. package/dist/utils/index.d.ts +3 -1
  50. package/dist/utils/internal-initiator.d.ts +6 -1
  51. package/dist/utils/logger.d.ts +0 -2
  52. package/dist/utils/session.d.ts +1 -1
  53. package/oh-my-opencode-slim.schema.json +728 -1
  54. package/package.json +1 -1
  55. package/src/skills/clonedeps/SKILL.md +32 -29
  56. package/src/skills/codemap.md +7 -3
  57. package/src/skills/deepwork/SKILL.md +17 -6
  58. package/src/skills/oh-my-opencode-slim/SKILL.md +3 -3
  59. package/src/skills/release-smoke-test/SKILL.md +2 -2
  60. package/src/skills/verification-planning/SKILL.md +103 -0
  61. package/src/skills/worktrees/SKILL.md +14 -7
package/README.md CHANGED
@@ -30,19 +30,14 @@ The main idea is simple: instead of forcing one model to do everything, the plug
30
30
 
31
31
  To explore the agents themselves, see **[Meet the Pantheon](#meet-the-pantheon)**. For the full feature set, see **[Features & Workflows](#features-and-workflows)** below.
32
32
 
33
- ### Manage Agent Skills with LazySkills
33
+ ### OpenAI GPT-5.6
34
34
 
35
35
  <p align="center">
36
- <a href="https://github.com/alvinunreal/lazyskills">
37
- <img src="img/lazyskills-wide.svg" alt="LazySkills" width="720">
38
- </a>
36
+ <img src="img/openai-gpt-5-6-pantheon.jpeg" alt="OpenAI GPT-5.6 Pantheon: Terra, Sol, and Luna" width="100%">
39
37
  </p>
40
38
 
41
- **[LazySkills](https://github.com/alvinunreal/lazyskills)** is a terminal UI for managing agent skills. It gives you one place to see what is installed, which agents can use each skill, why visibility may be broken, and what actions are safe to run next.
42
-
43
- <p align="center">
44
- <a href="https://github.com/alvinunreal/lazyskills"><b>Explore LazySkills →</b></a>
45
- </p>
39
+ The default [OpenAI preset](docs/openai-preset.md) maps Terra to Orchestrator,
40
+ Sol to Oracle, and Luna to the fast specialist lanes.
46
41
 
47
42
  ### What Users Say
48
43
 
@@ -137,7 +132,7 @@ Then:
137
132
  > It's **recommended** to understand how background orchestration works. The **[Orchestrator prompt](https://github.com/alvinunreal/oh-my-opencode-slim/blob/master/src/agents/orchestrator.ts#L28)** contains the scheduler rules, specialist routing logic, and thresholds for when work should be assigned to background agents. You can always delegate manually by calling a subagent via: `@agentName <task>`
138
133
 
139
134
  > [!TIP]
140
- > Because background agents are now the default workflow, it is **highly recommended** to enable and configure **[Multiplexer Integration](docs/multiplexer-integration.md)**. It automatically opens each agent in a dedicated Tmux, Zellij, or Herdr pane, so you can watch specialists work live while the Orchestrator continues coordinating the session.
135
+ > Because background agents are now the default workflow, it is **highly recommended** to enable and configure **[Multiplexer Integration](docs/multiplexer-integration.md)**. It automatically opens each agent in a dedicated Tmux, Zellij, Herdr, or cmux pane, so you can watch specialists work live while the Orchestrator continues coordinating the session.
141
136
 
142
137
  The default generated configuration includes both `openai` and `opencode-go` presets.
143
138
 
@@ -147,12 +142,12 @@ The default generated configuration includes both `openai` and `opencode-go` pre
147
142
  "preset": "openai",
148
143
  "presets": {
149
144
  "openai": {
150
- "orchestrator": { "model": "openai/gpt-5.5", "variant": "medium", "skills": ["*"], "mcps": ["*", "!context7"] },
151
- "oracle": { "model": "openai/gpt-5.5", "variant": "high", "skills": ["simplify"], "mcps": [] },
152
- "librarian": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "gh_grep"] },
153
- "explorer": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": [] },
154
- "designer": { "model": "openai/gpt-5.4-mini", "variant": "medium", "skills": [], "mcps": [] },
155
- "fixer": { "model": "openai/gpt-5.5", "variant": "low", "skills": [], "mcps": [] }
145
+ "orchestrator": { "model": "openai/gpt-5.6-terra", "variant": "medium", "skills": ["*"], "mcps": ["*", "!context7"] },
146
+ "oracle": { "model": "openai/gpt-5.6-sol", "variant": "high", "skills": ["simplify"], "mcps": [] },
147
+ "librarian": { "model": "openai/gpt-5.6-luna", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "gh_grep"] },
148
+ "explorer": { "model": "openai/gpt-5.6-luna", "variant": "low", "skills": [], "mcps": [] },
149
+ "designer": { "model": "openai/gpt-5.6-luna", "variant": "medium", "skills": [], "mcps": [] },
150
+ "fixer": { "model": "openai/gpt-5.6-luna", "variant": "medium", "skills": [], "mcps": [] }
156
151
  },
157
152
  "opencode-go": {
158
153
  "orchestrator": { "model": "opencode-go/glm-5.2", "skills": [ "*" ], "mcps": [ "*", "!context7" ] },
@@ -166,9 +161,17 @@ The default generated configuration includes both `openai` and `opencode-go` pre
166
161
  }
167
162
  ```
168
163
 
164
+ ### Preset Docs
165
+
166
+ - **[OpenAI Preset](docs/openai-preset.md)** — the default generated preset; runs all agents on OpenAI models.
167
+ - **[OpenCode Go Preset](docs/opencode-go-preset.md)** — runs the agents on OpenCode Go models; enables the Observer agent for visual analysis since its orchestrator model isn't multimodal.
168
+ - **[Author's Preset](docs/authors-preset.md)** — the exact config the author runs day to day, with third-party skills.
169
+ - **[$30 Preset](docs/thirty-dollars-preset.md)** — a mixed-provider setup built around Codex Plus and GitHub Copilot Pro for about $30/month.
170
+ - **[OpenCode Zen Free Preset](docs/opencode-zen-free-preset.md)** — every agent runs on an opencode free model; no usage cost.
171
+
169
172
  ### For Alternative Providers
170
173
 
171
- To use custom providers or a mixed-provider setup, use **[Configuration](docs/configuration.md)** for the full reference. If you want a ready-made starting point, check the **[Author's Preset](docs/authors-preset.md)** and **[$30 Preset](docs/thirty-dollars-preset.md)** - the `$30` preset is the best cheap setup.
174
+ To use custom providers or a mixed-provider setup, use **[Configuration](docs/configuration.md)** for the full reference.
172
175
 
173
176
  ### ✅ Verify Your Setup
174
177
 
@@ -206,6 +209,9 @@ verification while specialists do the work in their own lanes.
206
209
  agents are currently active, including parallel background specialists.
207
210
  - **[Deepwork](#deepwork)** - a structured workflow for large, multi-file, risky,
208
211
  or phased coding work using persistent plan files and Oracle review gates.
212
+ - **[Verification Planning](#verification-planning)** - plans a project-specific
213
+ evidence path before non-trivial implementation, including verification
214
+ affordances when the system needs to become more legible to an agent.
209
215
  - **[Reflect](#reflect)** - reviews repeated work patterns and suggests reusable skills,
210
216
  agents, commands, config rules, prompt rules, or project playbooks.
211
217
  - **[Worktrees](#worktrees)** - manages Git worktrees as isolated coding lanes
@@ -220,7 +226,7 @@ V2 makes background specialists the default mental model: the Orchestrator plans
220
226
  the work graph, launches the right agents, avoids overlapping write ownership,
221
227
  and waits for terminal task results before acting on them.
222
228
 
223
- See **[Background Orchestration](docs/v2-background-orchestration.md)** for the
229
+ See **[Background Orchestration](docs/background-orchestration.md)** for the
224
230
  full scheduler model.
225
231
 
226
232
  #### Companion
@@ -260,6 +266,18 @@ Start it with:
260
266
  See **[Skills](docs/skills.md#deepwork)** for when to use it and how the workflow
261
267
  runs.
262
268
 
269
+ #### Verification Planning
270
+
271
+ Verification Planning gives the Orchestrator a way to decide how a non-trivial
272
+ change will be proven before implementation begins. It frames the claim, designs
273
+ project-specific evidence paths, and can create a small verification affordance
274
+ when the system cannot directly reveal the decisive state to an agent. For
275
+ unfamiliar capabilities, it asks the Librarian for focused research before
276
+ choosing an approach.
277
+
278
+ See **[Skills](docs/skills.md#verification-planning)** for the evidence-path
279
+ workflow and its safety boundaries.
280
+
263
281
  #### Reflect
264
282
 
265
283
  Reflect helps the Orchestrator learn from repeated workflow friction. It reviews
@@ -335,12 +353,12 @@ rules.
335
353
  </tr>
336
354
  <tr>
337
355
  <td colspan="2">
338
- <b>Default Model:</b> <code>openai/gpt-5.5 (medium)</code>
356
+ <b>Default Model:</b> <code>openai/gpt-5.6-terra (medium)</code>
339
357
  </td>
340
358
  </tr>
341
359
  <tr>
342
360
  <td colspan="2">
343
- <b>Recommended Models:</b> <code>openai/gpt-5.5 (medium)</code> <code>anthropic/claude-fable-5</code> <code>anthropic/claude-opus-4-8</code>
361
+ <b>Recommended Models:</b> <code>openai/gpt-5.6-terra (medium)</code> <code>anthropic/claude-fable-5</code> <code>anthropic/claude-opus-4-8</code>
344
362
  </td>
345
363
  </tr>
346
364
  <tr>
@@ -376,7 +394,7 @@ rules.
376
394
  </tr>
377
395
  <tr>
378
396
  <td colspan="2">
379
- <b>Default Model:</b> <code>openai/gpt-5.4-mini</code>
397
+ <b>Default Model:</b> <code>openai/gpt-5.6-luna</code>
380
398
  </td>
381
399
  </tr>
382
400
  <tr>
@@ -417,12 +435,12 @@ rules.
417
435
  </tr>
418
436
  <tr>
419
437
  <td colspan="2">
420
- <b>Default Model:</b> <code>openai/gpt-5.5 (high)</code>
438
+ <b>Default Model:</b> <code>openai/gpt-5.6-sol (high)</code>
421
439
  </td>
422
440
  </tr>
423
441
  <tr>
424
442
  <td colspan="2">
425
- <b>Recommended Models:</b> <code>openai/gpt-5.5 (xhigh)</code> <code>anthropic/claude-fable-5</code> <code>anthropic/claude-opus-4-8 (xhigh)</code>
443
+ <b>Recommended Models:</b> <code>openai/gpt-5.6-sol (xhigh)</code> <code>anthropic/claude-fable-5</code> <code>anthropic/claude-opus-4-8 (xhigh)</code>
426
444
  </td>
427
445
  </tr>
428
446
  <tr>
@@ -507,7 +525,7 @@ rules.
507
525
  </tr>
508
526
  <tr>
509
527
  <td colspan="2">
510
- <b>Default Model:</b> <code>openai/gpt-5.4-mini</code>
528
+ <b>Default Model:</b> <code>openai/gpt-5.6-luna</code>
511
529
  </td>
512
530
  </tr>
513
531
  <tr>
@@ -548,7 +566,7 @@ rules.
548
566
  </tr>
549
567
  <tr>
550
568
  <td colspan="2">
551
- <b>Default Model:</b> <code>openai/gpt-5.4-mini</code>
569
+ <b>Default Model:</b> <code>openai/gpt-5.6-luna</code>
552
570
  </td>
553
571
  </tr>
554
572
  <tr>
@@ -589,12 +607,12 @@ rules.
589
607
  </tr>
590
608
  <tr>
591
609
  <td colspan="2">
592
- <b>Default Model:</b> <code>openai/gpt-5.5 (low)</code>
610
+ <b>Default Model:</b> <code>openai/gpt-5.6-luna (medium)</code>
593
611
  </td>
594
612
  </tr>
595
613
  <tr>
596
614
  <td colspan="2">
597
- <b>Recommended Models:</b> <code>openai/gpt-5.5 (low)</code> <code>anthropic/claude-sonnet-4-6</code>
615
+ <b>Recommended Models:</b> <code>openai/gpt-5.6-luna (medium)</code> <code>anthropic/claude-sonnet-4-6</code>
598
616
  </td>
599
617
  </tr>
600
618
  <tr>
@@ -611,7 +629,7 @@ rules.
611
629
  ### Observer: The Silent Witness
612
630
 
613
631
  > [!NOTE]
614
- > **Why a separate agent?** If your Orchestrator model is not multimodal, enable Observer to handle images, screenshots, PDFs, and other visual files. Observer is disabled by default and gives the Orchestrator a dedicated multimodal reader without forcing you to change your main reasoning model. Set `disabled_agents: []` and an `observer` model in your configuration. The bundled `opencode-go` install preset does this automatically because its GLM Orchestrator is not multimodal.
632
+ > **Why a separate agent?** If your Orchestrator model is not multimodal, enable Observer to handle images, screenshots, and other visual files. Observer is disabled by default and gives the Orchestrator a dedicated multimodal reader without forcing you to change your main reasoning model. Set `disabled_agents: []` and an `observer` model in your configuration. The bundled `opencode-go` install preset does this automatically because its GLM Orchestrator is not multimodal. Omitting `image_routing` preserves existing conditional Observer behavior. Set `image_routing: "auto"` only when Observer is enabled, or `"direct"` to always pass image attachments to the Orchestrator.
615
633
 
616
634
  <table>
617
635
  <tr>
@@ -625,7 +643,7 @@ rules.
625
643
 
626
644
  - Images, screenshots, diagrams → `read` tool (native image support)
627
645
  - PDFs and binary documents → `read` tool (text + structure extraction)
628
- - **Disabled by default** - enable with `"disabled_agents": []` and configure a vision-capable model; installing with `--preset=opencode-go` enables it with `opencode-go/kimi-k2.6`
646
+ - **Disabled by default** - enable with `"disabled_agents": []` and configure a vision-capable model; installing with `--preset=opencode-go` enables it with `opencode-go/kimi-k2.6`. Image attachments route to Observer by default when it is enabled; set `"image_routing": "direct"` to keep them on the Orchestrator.
629
647
 
630
648
  </td>
631
649
  </tr>
@@ -636,7 +654,7 @@ rules.
636
654
  </tr>
637
655
  <tr>
638
656
  <td colspan="2">
639
- <b>Default Model:</b> <code>openai/gpt-5.4-mini</code> - <i>configure a vision-capable model to enable</i>
657
+ <b>Default Model:</b> <code>openai/gpt-5.6-luna</code> - <i>configure a vision-capable model to enable</i>
640
658
  </td>
641
659
  </tr>
642
660
  <tr>
@@ -661,7 +679,7 @@ Use this section as a map: start with installation, then jump to features, confi
661
679
  | **[Council](docs/council.md)** | Run multiple models in parallel and synthesize a single answer with `@council` |
662
680
  | **[Custom Agents](docs/configuration.md#custom-agents)** | Define your own specialists with custom prompts, models, MCP access, and Orchestrator delegation rules |
663
681
  | **[ACP Agents](docs/acp-agents.md)** | Connect external ACP-compatible agents such as Claude Code ACP or Gemini ACP as delegatable subagents |
664
- | **[Multiplexer Integration](docs/multiplexer-integration.md)** | Watch agents work live in Tmux, Zellij, or Herdr panes |
682
+ | **[Multiplexer Integration](docs/multiplexer-integration.md)** | Watch agents work live in Tmux, Zellij, Herdr, or cmux panes |
665
683
  | **[Codemap](docs/codemap.md)** | Generate hierarchical codemaps to understand large codebases faster |
666
684
  | **[Clonedeps](docs/clonedeps.md)** | Clone selected dependency source into an ignored local workspace for inspection |
667
685
  | **[Worktrees](docs/worktrees.md)** | Use `.slim/worktrees/` lanes for isolated parallel or risky coding work |
@@ -678,7 +696,7 @@ Use this section as a map: start with installation, then jump to features, confi
678
696
  | **[Project Customization](docs/project-local-customization.md)** | Repository-specific custom agents, prompt overrides, per-agent skills, and precedence |
679
697
  | **[Background Orchestration](docs/background-orchestration.md)** | Scheduler-first orchestrator model built around native background subagents |
680
698
  | **[Maintainer Guide](docs/maintainers.md)** | Issue triage rules, label meanings, support routing, and repo maintenance workflow |
681
- | **[Skills](docs/skills.md)** | Bundled skills such as `simplify`, `codemap`, `clonedeps`, `deepwork`, `reflect`, `worktrees`, and `oh-my-opencode-slim` |
699
+ | **[Skills](docs/skills.md)** | Bundled skills such as `simplify`, `codemap`, `clonedeps`, `deepwork`, `verification-planning`, `reflect`, `worktrees`, and `oh-my-opencode-slim` |
682
700
  | **[MCPs](docs/mcps.md)** | `websearch`, `context7`, `gh_grep`, and how MCP permissions work per agent |
683
701
  | **[Tools](docs/tools.md)** | Built-in tool capabilities like `webfetch`, LSP tools, code search, and formatters |
684
702
 
@@ -699,7 +717,7 @@ Use this section as a map: start with installation, then jump to features, confi
699
717
  <p><sub>Every merged contribution leaves a mark on the realm.</sub></p>
700
718
 
701
719
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
702
- [![All Contributors](https://img.shields.io/badge/all_contributors-72-orange.svg?style=flat-square)](#contributors-)
720
+ [![All Contributors](https://img.shields.io/badge/all_contributors-76-orange.svg?style=flat-square)](#contributors-)
703
721
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
704
722
  </div>
705
723
 
@@ -806,6 +824,12 @@ Use this section as a map: start with installation, then jump to features, confi
806
824
  <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>
807
825
  <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>
808
826
  </tr>
827
+ <tr>
828
+ <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>
829
+ <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>
830
+ <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>
831
+ <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>
832
+ </tr>
809
833
  </tbody>
810
834
  </table>
811
835
 
package/README.zh-CN.md CHANGED
@@ -32,19 +32,13 @@ oh-my-opencode-slim 是一个用于 OpenCode 的智能体编排插件。它内
32
32
 
33
33
  要了解智能体本身,请参阅 **[认识众神殿](#meet-the-pantheon)**。如需了解完整特性集,请参阅下方的 **[特性与工作流](#features-and-workflows)**。
34
34
 
35
- ### LazySkills 管理智能体技能
35
+ ### OpenAI GPT-5.6
36
36
 
37
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>
38
+ <img src="img/openai-gpt-5-6-pantheon.jpeg" alt="OpenAI GPT-5.6 众神殿:Terra、Sol 和 Luna" width="720">
41
39
  </p>
42
40
 
43
- **[LazySkills](https://github.com/alvinunreal/lazyskills)** 是一个用于管理智能体技能的终端 UI。它让你可以在一个地方查看已安装的技能、哪些智能体可以使用每个技能、为什么可见性可能失效,以及接下来可以安全执行哪些操作。
44
-
45
- <p align="center">
46
- <a href="https://github.com/alvinunreal/lazyskills"><b>探索 LazySkills →</b></a>
47
- </p>
41
+ 默认的 [OpenAI 预设](docs/openai-preset.md) Terra 映射为 Orchestrator、Sol 映射为 Oracle、Luna 映射为快速专家通道。
48
42
 
49
43
  ### 用户怎么说
50
44
 
@@ -134,7 +128,7 @@ bun run build
134
128
  > **建议**了解后台编排的工作原理。**[编排者提示词 (Orchestrator prompt)](https://github.com/alvinunreal/oh-my-opencode-slim/blob/master/src/agents/orchestrator.ts#L28)** 包含调度规则、专家路由逻辑,以及何时应把工作分配给后台智能体的阈值。您始终可以通过以下方式手动委派任务:`@智能体名称 <任务内容>`
135
129
 
136
130
  > [!TIP]
137
- > 由于后台智能体现在是默认工作流,**强烈建议**启用并配置 **[Multiplexer Integration](docs/multiplexer-integration.md)**。它会自动在专用的 Tmux、Zellij 或 Herdr 窗格中打开每个智能体,让您在 Orchestrator 继续协调会话时,实时跟进各个专家智能体的工作。
131
+ > 由于后台智能体现在是默认工作流,**强烈建议**启用并配置 **[Multiplexer Integration](docs/multiplexer-integration.md)**。它会自动在专用的 Tmux、Zellij、Herdrcmux 窗格中打开每个智能体,让您在 Orchestrator 继续协调会话时,实时跟进各个专家智能体的工作。
138
132
 
139
133
  默认生成的配置包含 `openai` 和 `opencode-go` 两个预设:
140
134
 
@@ -144,12 +138,12 @@ bun run build
144
138
  "preset": "openai",
145
139
  "presets": {
146
140
  "openai": {
147
- "orchestrator": { "model": "openai/gpt-5.5", "variant": "medium", "skills": ["*"], "mcps": ["*", "!context7"] },
148
- "oracle": { "model": "openai/gpt-5.5", "variant": "high", "skills": ["simplify"], "mcps": [] },
149
- "librarian": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "gh_grep"] },
150
- "explorer": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": [] },
151
- "designer": { "model": "openai/gpt-5.4-mini", "variant": "medium", "skills": [], "mcps": [] },
152
- "fixer": { "model": "openai/gpt-5.5", "variant": "low", "skills": [], "mcps": [] }
141
+ "orchestrator": { "model": "openai/gpt-5.6-terra", "variant": "medium", "skills": ["*"], "mcps": ["*", "!context7"] },
142
+ "oracle": { "model": "openai/gpt-5.6-sol", "variant": "high", "skills": ["simplify"], "mcps": [] },
143
+ "librarian": { "model": "openai/gpt-5.6-luna", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "gh_grep"] },
144
+ "explorer": { "model": "openai/gpt-5.6-luna", "variant": "low", "skills": [], "mcps": [] },
145
+ "designer": { "model": "openai/gpt-5.6-luna", "variant": "medium", "skills": [], "mcps": [] },
146
+ "fixer": { "model": "openai/gpt-5.6-luna", "variant": "medium", "skills": [], "mcps": [] }
153
147
  },
154
148
  "opencode-go": {
155
149
  "orchestrator": { "model": "opencode-go/glm-5.2", "skills": [ "*" ], "mcps": [ "*", "!context7" ] },
@@ -197,6 +191,7 @@ V2 将 oh-my-opencode-slim 变成了以调度器为核心的多智能体工作
197
191
  - **[后台智能体](#后台智能体)** - Orchestrator 现在会把专家作为后台任务派发,跟踪任务/会话 ID,等待完成事件,并在继续之前整合结果。
198
192
  - **[Companion](#companion)** - 可选的浮动桌面窗口会显示当前活跃的智能体,包括并行运行的后台专家。
199
193
  - **[Deepwork](#deepwork)** - 面向大型、多文件、高风险或分阶段编码工作的结构化工作流,使用持久化计划文件和 Oracle 评审关卡。
194
+ - **[验证规划](#验证规划)** - 在非平凡实现前规划项目特定的证据路径;当系统需要更易被智能体理解时,可加入验证能力。
200
195
  - **[Reflect](#reflect)** - 回顾重复出现的工作模式,并建议可复用的 skill、智能体、命令、配置规则、提示词规则或项目 playbook。
201
196
  - **[Worktrees](#worktrees)** - 将 Git worktree 作为隔离编码通道管理,并为复杂、高风险或并行任务提供安全协议。
202
197
  - **[oh-my-opencode-slim Skill](#oh-my-opencode-slim-skill)** - 随包提供的配置技能,可安全调优模型、提示词、自定义智能体、MCP 访问、预设和插件行为。
@@ -236,6 +231,12 @@ Deepwork 适用于重型编码会话:大范围重构、多阶段功能、高
236
231
 
237
232
  何时使用以及工作流如何运行,请参阅 **[Skills](docs/skills.md#deepwork)**。
238
233
 
234
+ #### 验证规划
235
+
236
+ 验证规划让 Orchestrator 在开始非平凡实现前,先决定如何证明变更有效。它会界定要成立的主张、设计项目特定的证据路径;当系统无法直接向智能体揭示决定性状态时,还可创建小型验证能力。面对不熟悉的能力时,它会在选择方案前请 Librarian 做有针对性的研究。
237
+
238
+ 证据路径工作流及其安全边界见 **[Skills](docs/skills.md#verification-planning)**。
239
+
239
240
  #### Reflect
240
241
 
241
242
  Reflect 帮助 Orchestrator 从重复出现的工作流摩擦中学习。它会回顾近期工作和现有资产,然后建议最小且有用的改进:skill、自定义智能体、命令、配置规则、提示词规则、MCP 权限变更或项目 playbook。如果证据不足,它应建议什么都不创建。
@@ -303,12 +304,12 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
303
304
  </tr>
304
305
  <tr>
305
306
  <td colspan="2">
306
- <b>默认模型:</b> <code>openai/gpt-5.5 (medium)</code>
307
+ <b>默认模型:</b> <code>openai/gpt-5.6-terra (medium)</code>
307
308
  </td>
308
309
  </tr>
309
310
  <tr>
310
311
  <td colspan="2">
311
- <b>推荐模型:</b> <code>openai/gpt-5.5 (medium)</code> <code>anthropic/claude-opus-4.6</code>
312
+ <b>推荐模型:</b> <code>openai/gpt-5.6-terra (medium)</code> <code>anthropic/claude-opus-4.6</code>
312
313
  </td>
313
314
  </tr>
314
315
  <tr>
@@ -344,7 +345,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
344
345
  </tr>
345
346
  <tr>
346
347
  <td colspan="2">
347
- <b>默认模型:</b> <code>openai/gpt-5.4-mini</code>
348
+ <b>默认模型:</b> <code>openai/gpt-5.6-luna</code>
348
349
  </td>
349
350
  </tr>
350
351
  <tr>
@@ -385,12 +386,12 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
385
386
  </tr>
386
387
  <tr>
387
388
  <td colspan="2">
388
- <b>默认模型:</b> <code>openai/gpt-5.5 (high)</code>
389
+ <b>默认模型:</b> <code>openai/gpt-5.6-sol (high)</code>
389
390
  </td>
390
391
  </tr>
391
392
  <tr>
392
393
  <td colspan="2">
393
- <b>推荐模型:</b> <code>openai/gpt-5.5 (high)</code> <code>google/gemini-3.1-pro-preview (high)</code>
394
+ <b>推荐模型:</b> <code>openai/gpt-5.6-sol (high)</code> <code>google/gemini-3.1-pro-preview (high)</code>
394
395
  </td>
395
396
  </tr>
396
397
  <tr>
@@ -475,7 +476,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
475
476
  </tr>
476
477
  <tr>
477
478
  <td colspan="2">
478
- <b>默认模型:</b> <code>openai/gpt-5.4-mini</code>
479
+ <b>默认模型:</b> <code>openai/gpt-5.6-luna</code>
479
480
  </td>
480
481
  </tr>
481
482
  <tr>
@@ -516,7 +517,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
516
517
  </tr>
517
518
  <tr>
518
519
  <td colspan="2">
519
- <b>默认模型:</b> <code>openai/gpt-5.4-mini</code>
520
+ <b>默认模型:</b> <code>openai/gpt-5.6-luna</code>
520
521
  </td>
521
522
  </tr>
522
523
  <tr>
@@ -557,12 +558,12 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
557
558
  </tr>
558
559
  <tr>
559
560
  <td colspan="2">
560
- <b>默认模型:</b> <code>openai/gpt-5.5 (low)</code>
561
+ <b>默认模型:</b> <code>openai/gpt-5.6-luna (medium)</code>
561
562
  </td>
562
563
  </tr>
563
564
  <tr>
564
565
  <td colspan="2">
565
- <b>推荐模型:</b> <code>openai/gpt-5.5 (low)</code>
566
+ <b>推荐模型:</b> <code>openai/gpt-5.6-luna (medium)</code>
566
567
  </td>
567
568
  </tr>
568
569
  <tr>
@@ -604,7 +605,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
604
605
  </tr>
605
606
  <tr>
606
607
  <td colspan="2">
607
- <b>默认模型:</b> <code>openai/gpt-5.4-mini</code> - <i>需配置具有视觉能力的模型以启用</i>
608
+ <b>默认模型:</b> <code>openai/gpt-5.6-luna</code> - <i>需配置具有视觉能力的模型以启用</i>
608
609
  </td>
609
610
  </tr>
610
611
  <tr>
@@ -629,7 +630,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
629
630
  | **[Council](docs/council.md)** | 使用 `@council` 并行运行多个模型并合成单一答案 |
630
631
  | **[自定义智能体](docs/configuration.md#custom-agents)** | 使用自定义提示词、模型、MCP 访问和 Orchestrator 委派规则定义自己的专家 |
631
632
  | **[ACP Agents](docs/acp-agents.md)** | 将 Claude Code ACP 或 Gemini ACP 等外部 ACP 兼容智能体连接为可委派子智能体 |
632
- | **[多路复用器集成](docs/multiplexer-integration.md)** | 在 Tmux、Zellij 或 Herdr 窗格中实时观看智能体工作 |
633
+ | **[多路复用器集成](docs/multiplexer-integration.md)** | 在 Tmux、Zellij、Herdrcmux 窗格中实时观看智能体工作 |
633
634
  | **[Codemap](docs/codemap.md)** | 生成层级代码地图,更快理解大型代码库 |
634
635
  | **[Clonedeps](docs/clonedeps.md)** | 将选定的依赖源码克隆到被忽略的本地工作区中以供检查 |
635
636
  | **[Worktrees](docs/worktrees.md)** | 使用 `.slim/worktrees/` 通道进行隔离的并行或高风险编码工作 |
@@ -645,7 +646,7 @@ Worktrees 将 Git worktree 作为安全、隔离的编码通道管理,默认
645
646
  | **[配置](docs/configuration.md)** | 配置文件位置、JSONC 支持、提示词覆盖和完整选项参考 |
646
647
  | **[后台编排](docs/background-orchestration.md)** | 围绕原生后台子智能体构建的调度器优先 Orchestrator 模型 |
647
648
  | **[维护者指南](docs/maintainers.md)** | issue 分流规则、标签含义、支持路由和仓库维护工作流 |
648
- | **[Skills](docs/skills.md)** | `simplify`、`codemap`、`clonedeps`、`deepwork`、`reflect`、`worktrees` 和 `oh-my-opencode-slim` 等捆绑技能 |
649
+ | **[Skills](docs/skills.md)** | `simplify`、`codemap`、`clonedeps`、`deepwork`、`verification-planning`、`reflect`、`worktrees` 和 `oh-my-opencode-slim` 等捆绑技能 |
649
650
  | **[MCPs](docs/mcps.md)** | `websearch`、`context7`、`gh_grep` 以及每个智能体的 MCP 权限机制 |
650
651
  | **[Tools](docs/tools.md)** | `webfetch`、LSP 工具、代码搜索和格式化工具等内置工具能力 |
651
652
 
@@ -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
@@ -293,14 +293,43 @@ 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
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!`;
296
- var PHASE_REMINDER = `<internal_reminder>${PHASE_REMINDER_TEXT}</internal_reminder>`;
296
+ function formatSystemReminder(text) {
297
+ return `<system-reminder>
298
+ ${text}
299
+ </system-reminder>`;
300
+ }
301
+ var PHASE_REMINDER = formatSystemReminder(PHASE_REMINDER_TEXT);
297
302
  // src/config/council-schema.ts
298
303
  import { z } from "zod";
299
- var ModelIdSchema = z.string().regex(/^[^/\s]+\/[^\s]+$/, 'Expected provider/model format (e.g. "openai/gpt-5.4-mini")');
304
+
305
+ // src/utils/councillor-models.ts
306
+ function normalizeCouncillorModels(model, fallbackVariant) {
307
+ const raw = Array.isArray(model) ? model : [model];
308
+ return raw.map((entry) => typeof entry === "string" ? { id: entry, variant: fallbackVariant } : { id: entry.id, variant: entry.variant ?? fallbackVariant });
309
+ }
310
+
311
+ // src/config/council-schema.ts
312
+ var ModelIdSchema = z.string().regex(/^[^/\s]+\/[^\s]+$/, 'Expected provider/model format (e.g. "openai/gpt-5.6-luna")');
313
+ var CouncillorModelEntrySchema = z.object({
314
+ id: ModelIdSchema,
315
+ variant: z.string().optional()
316
+ });
317
+ var CouncillorModelSchema = z.union([
318
+ ModelIdSchema,
319
+ z.array(z.union([ModelIdSchema, CouncillorModelEntrySchema])).min(1)
320
+ ]).describe('Model ID in provider/model format (e.g. "openai/gpt-5.6-luna"), or an ' + "ordered fallback chain (array of model IDs or { id, variant } entries) " + "tried in order until one responds.");
300
321
  var CouncillorConfigSchema = z.object({
301
- model: ModelIdSchema.describe('Model ID in provider/model format (e.g. "openai/gpt-5.4-mini")'),
322
+ model: CouncillorModelSchema,
302
323
  variant: z.string().optional(),
303
324
  prompt: z.string().optional().describe("Optional role/guidance injected into the councillor user prompt")
325
+ }).transform((c) => {
326
+ const models = normalizeCouncillorModels(c.model, c.variant);
327
+ return {
328
+ model: models[0].id,
329
+ variant: c.variant,
330
+ prompt: c.prompt,
331
+ models
332
+ };
304
333
  });
305
334
  var CouncilPresetSchema = z.record(z.string(), z.record(z.string(), z.unknown())).transform((entries, ctx) => {
306
335
  const councillors = {};
@@ -386,6 +415,33 @@ var ManualPlanSchema = z2.object({
386
415
  librarian: ManualAgentPlanSchema,
387
416
  fixer: ManualAgentPlanSchema
388
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
+ ]);
389
445
  var AgentOverrideConfigSchema = z2.object({
390
446
  model: z2.union([
391
447
  z2.string(),
@@ -404,13 +460,15 @@ var AgentOverrideConfigSchema = z2.object({
404
460
  prompt: z2.string().min(1).optional(),
405
461
  orchestratorPrompt: z2.string().min(1).optional(),
406
462
  options: z2.record(z2.string(), z2.unknown()).optional(),
407
- displayName: z2.string().min(1).optional()
463
+ displayName: z2.string().min(1).optional(),
464
+ permission: PermissionConfigSchema.optional()
408
465
  }).strict();
409
466
  var MultiplexerTypeSchema = z2.enum([
410
467
  "auto",
411
468
  "tmux",
412
469
  "zellij",
413
470
  "herdr",
471
+ "cmux",
414
472
  "none"
415
473
  ]);
416
474
  var MultiplexerLayoutSchema = z2.enum([
@@ -454,7 +512,9 @@ var FailoverConfigSchema = z2.object({
454
512
  enabled: z2.boolean().default(true),
455
513
  timeoutMs: z2.number().min(0).default(15000),
456
514
  retryDelayMs: z2.number().min(0).default(500),
457
- 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.")
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)."),
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."),
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.")
458
518
  }).strict();
459
519
  var CompanionConfigSchema = z2.object({
460
520
  enabled: z2.boolean().optional(),
@@ -495,12 +555,14 @@ function rejectOrchestratorPromptOnOrchestrator(overrides, ctx, pathPrefix) {
495
555
  var PluginConfigSchema = z2.object({
496
556
  preset: z2.string().optional(),
497
557
  setDefaultAgent: z2.boolean().optional(),
498
- compactSidebar: z2.boolean().optional().describe("Use the compact TUI sidebar layout when enabled."),
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."),
499
560
  autoUpdate: z2.boolean().optional().describe("Disable automatic installation of plugin updates when false. Defaults to true."),
500
561
  presets: z2.record(z2.string(), PresetSchema).optional(),
501
562
  agents: z2.record(z2.string(), AgentOverrideConfigSchema).optional(),
502
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."),
503
- 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."),
504
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."),
505
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."),
506
568
  multiplexer: MultiplexerConfigSchema.optional(),
@@ -564,6 +626,12 @@ var CUSTOM_SKILLS = [
564
626
  allowedAgents: ["orchestrator"],
565
627
  sourcePath: "src/skills/deepwork"
566
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
+ },
567
635
  {
568
636
  name: "reflect",
569
637
  description: "Review repeated work and suggest reusable workflow improvements",
@@ -595,12 +663,12 @@ var SCHEMA_URL = "https://unpkg.com/oh-my-opencode-slim@latest/oh-my-opencode-sl
595
663
  var GENERATED_PRESETS = ["openai", "opencode-go"];
596
664
  var MODEL_MAPPINGS = {
597
665
  openai: {
598
- orchestrator: { model: "openai/gpt-5.5", variant: "medium" },
599
- oracle: { model: "openai/gpt-5.5", variant: "high" },
600
- librarian: { model: "openai/gpt-5.4-mini", variant: "low" },
601
- explorer: { model: "openai/gpt-5.4-mini", variant: "low" },
602
- designer: { model: "openai/gpt-5.4-mini", variant: "medium" },
603
- fixer: { model: "openai/gpt-5.5", variant: "low" }
666
+ orchestrator: { model: "openai/gpt-5.6-terra", variant: "medium" },
667
+ oracle: { model: "openai/gpt-5.6-sol", variant: "high" },
668
+ librarian: { model: "openai/gpt-5.6-luna", variant: "low" },
669
+ explorer: { model: "openai/gpt-5.6-luna", variant: "low" },
670
+ designer: { model: "openai/gpt-5.6-luna", variant: "medium" },
671
+ fixer: { model: "openai/gpt-5.6-luna", variant: "medium" }
604
672
  },
605
673
  kimi: {
606
674
  orchestrator: { model: "kimi-for-coding/k2p5" },
@@ -2726,7 +2794,9 @@ async function installCompanionArchive(finalBinaryPath, target, manifest, downlo
2726
2794
  if (tempDir) {
2727
2795
  try {
2728
2796
  rmSync3(tempDir, { recursive: true, force: true });
2729
- } catch {}
2797
+ } catch (err) {
2798
+ log("[updater] install cleanup failed", String(err));
2799
+ }
2730
2800
  }
2731
2801
  }
2732
2802
  }
@@ -2736,7 +2806,9 @@ function readInstallMetadata(binaryPath) {
2736
2806
  if (parsed?.version && parsed.tag && parsed.target) {
2737
2807
  return parsed;
2738
2808
  }
2739
- } catch {}
2809
+ } catch (err) {
2810
+ log("[updater] metadata read failed", String(err));
2811
+ }
2740
2812
  return null;
2741
2813
  }
2742
2814
  function writeInstallMetadata(binaryPath, metadata) {
@@ -2758,7 +2830,9 @@ async function withCompanionInstallLock(binaryPath, timeoutMs, staleMs, run) {
2758
2830
  } finally {
2759
2831
  try {
2760
2832
  rmSync3(lock, { recursive: true, force: true });
2761
- } catch {}
2833
+ } catch (err) {
2834
+ log("[updater] lock release failed", String(err));
2835
+ }
2762
2836
  }
2763
2837
  } catch (err) {
2764
2838
  const code = err.code;