harness-mix 0.1.0 → 0.1.3

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 (222) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +111 -35
  3. package/config/codex-desktop-compatibility.json +6 -0
  4. package/docs/harness-management.md +4 -1
  5. package/docs/images/codex-desktop-home.png +0 -0
  6. package/docs/images/codex-desktop-session.png +0 -0
  7. package/docs/kiro-cursor-integration.md +3 -0
  8. package/docs/multi-agent-collaboration.md +71 -71
  9. package/docs/native-acp.md +122 -0
  10. package/docs/native-codex.md +29 -6
  11. package/docs/superpowers/specs/2026-09-13-native-hardening-design.md +326 -0
  12. package/output/native-build/desktop-controller.mjs +21 -15
  13. package/output/native-build/harness-mix-secret.exe +0 -0
  14. package/output/native-build/harness-mix-shim.exe +0 -0
  15. package/output/native-build/renderer-extension.js +2322 -1826
  16. package/package.json +22 -5
  17. package/scripts/antigravity-adapter-test.cjs +507 -152
  18. package/scripts/build-native.cjs +53 -46
  19. package/scripts/codebuddy-migration-test.cjs +47 -0
  20. package/scripts/collaboration-recovery-test.cjs +22 -2
  21. package/scripts/collaboration-test.cjs +13 -7
  22. package/scripts/collaboration-ui-smoke.cjs +10 -5
  23. package/scripts/concurrency-layers-test.cjs +2 -0
  24. package/scripts/diagnostics.cjs +60 -0
  25. package/scripts/dsh-adapter-test.cjs +3 -0
  26. package/scripts/dsh-collaboration-acp-test.cjs +19 -0
  27. package/scripts/e2e-collaboration.cjs +5 -3
  28. package/scripts/e2e-native-acp.cjs +42 -0
  29. package/scripts/harness-health-check.cjs +72 -0
  30. package/scripts/kiro-cursor-adapters-test.cjs +82 -0
  31. package/scripts/native-acp-depth-test.cjs +189 -0
  32. package/scripts/native-job-object-test.cjs +79 -0
  33. package/scripts/native-protocol-test.cjs +27 -2
  34. package/scripts/native-secret-test.cjs +57 -0
  35. package/scripts/native-update-apply-test.cjs +215 -0
  36. package/scripts/native-updater-test.cjs +10 -1
  37. package/scripts/native-vendor-adapters-test.cjs +49 -1
  38. package/scripts/thread-title-test.cjs +93 -0
  39. package/scripts/tool-concurrency-regression-test.cjs +3 -2
  40. package/scripts/workspace-test.cjs +2 -14
  41. package/src/assets/icons/codebuddy-color.svg +1 -0
  42. package/src/assets/icons/cursor-cli-color.svg +1 -0
  43. package/src/assets/icons/cursor.svg +1 -0
  44. package/src/assets/icons/kiro-cli-color.svg +11 -0
  45. package/src/assets/icons/model-grok.svg +1 -0
  46. package/src/main/adapters/acp-interactions.js +132 -0
  47. package/src/main/adapters/acp.js +28 -8
  48. package/src/main/adapters/antigravity.js +1368 -895
  49. package/src/main/adapters/claude.js +139 -18
  50. package/src/main/adapters/codebuddy-history.js +90 -0
  51. package/src/main/adapters/codebuddy.js +2 -0
  52. package/src/main/adapters/codex.js +22 -10
  53. package/src/main/adapters/cursor.js +2 -0
  54. package/src/main/adapters/dsh-web-host.js +3 -10
  55. package/src/main/adapters/dsh.js +38 -7
  56. package/src/main/adapters/grok.js +126 -10
  57. package/src/main/adapters/index.js +4 -2
  58. package/src/main/adapters/kiro-history.js +43 -0
  59. package/src/main/adapters/kiro.js +2 -0
  60. package/src/main/adapters/native-acp-command.js +47 -0
  61. package/src/main/adapters/native-acp.js +435 -0
  62. package/src/main/adapters/openclaw-gateway.js +2 -6
  63. package/src/main/adapters/opencode-server.js +7 -6
  64. package/src/main/adapters/opencode.js +26 -14
  65. package/src/main/adapters/pi-family.js +37 -10
  66. package/src/main/adapters/qoder.js +5 -33
  67. package/src/main/adapters/trae.js +5 -17
  68. package/src/main/adapters/workbuddy.js +2 -67
  69. package/src/main/adapters/zcode.js +5 -36
  70. package/src/main/harness-adapter/event-normalizer.js +31 -12
  71. package/src/main/host/collaboration-worktree.js +75 -6
  72. package/src/main/host/collaboration.js +28 -2
  73. package/src/main/host/jsonl.js +2 -1
  74. package/src/main/host/native-history.js +5 -0
  75. package/src/main/host/runtime.js +130 -7
  76. package/src/main/host/session-history.js +2 -2
  77. package/src/main/host/store.js +73 -42
  78. package/src/main/native/config.js +53 -49
  79. package/src/main/native/host.js +46 -2
  80. package/src/main/native/icons.js +105 -101
  81. package/src/main/native/launcher.js +79 -13
  82. package/src/main/native/process-utils.js +30 -0
  83. package/src/main/native/protocol.js +833 -552
  84. package/src/main/native/redact.js +35 -0
  85. package/src/main/native/rs/Cargo.lock +4 -0
  86. package/src/main/native/rs/Cargo.toml +1 -1
  87. package/src/main/native/rs/crates/secret/Cargo.toml +10 -0
  88. package/src/main/native/rs/crates/secret/src/main.rs +262 -0
  89. package/src/main/native/rs/crates/shim/src/job.rs +83 -0
  90. package/src/main/native/rs/crates/shim/src/main.rs +236 -207
  91. package/src/main/native/secure-store.js +58 -0
  92. package/src/main/native/update-state.js +110 -0
  93. package/src/main/native/updater.js +300 -8
  94. package/src/main/native/usage.js +84 -8
  95. package/src/main/shared-contracts/item.js +1 -0
  96. package/src/main/workspace/files.js +76 -65
  97. package/src/main/workspace/review-controller.js +102 -102
  98. package/src/main/workspace/review.js +88 -83
  99. package/src/native-ui/README.md +4 -0
  100. package/src/native-ui/desktop-control/dist/main-process-title-policy.d.ts.map +1 -1
  101. package/src/native-ui/desktop-control/dist/main-process-title-policy.js +38 -0
  102. package/src/native-ui/desktop-control/dist/main-process-title-policy.js.map +1 -1
  103. package/src/native-ui/desktop-control/dist/production-controller.d.ts.map +1 -1
  104. package/src/native-ui/desktop-control/dist/production-controller.js +4 -1
  105. package/src/native-ui/desktop-control/dist/production-controller.js.map +1 -1
  106. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.d.ts +1 -0
  107. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.d.ts.map +1 -1
  108. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.js +22 -11
  109. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-policy.js.map +1 -1
  110. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.d.ts +1 -1
  111. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.d.ts.map +1 -1
  112. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js +7 -3
  113. package/src/native-ui/desktop-control/dist/renderer-draft-prewarm-runtime.js.map +1 -1
  114. package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
  115. package/src/native-ui/desktop-control/src/main-process-title-policy.ts +38 -0
  116. package/src/native-ui/desktop-control/src/production-controller.ts +4 -1
  117. package/src/native-ui/desktop-control/src/renderer-draft-prewarm-policy.ts +19 -11
  118. package/src/native-ui/desktop-control/src/renderer-draft-prewarm-runtime.ts +7 -4
  119. package/src/native-ui/desktop-control/test/main-process-title-policy.test.ts +2 -0
  120. package/src/native-ui/desktop-control/test/production-controller.test.ts +4 -1
  121. package/src/native-ui/desktop-control/test/renderer-draft-prewarm-policy.test.ts +36 -5
  122. package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts +6 -4
  123. package/src/native-ui/renderer-extension/dist/types/agent-selection-state.d.ts.map +1 -1
  124. package/src/native-ui/renderer-extension/dist/types/harness-mix-icons.d.ts.map +1 -1
  125. package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts.map +1 -1
  126. package/src/native-ui/renderer-extension/dist/types/index.d.ts +2 -0
  127. package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -1
  128. package/src/native-ui/renderer-extension/dist/types/renderer-agent-icon.d.ts.map +1 -1
  129. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -1
  130. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
  131. package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts +40 -0
  132. package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts.map +1 -0
  133. package/src/native-ui/renderer-extension/dist/types/renderer-credits-control.d.ts.map +1 -1
  134. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
  135. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +8 -0
  136. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
  137. package/src/native-ui/renderer-extension/dist/types/renderer-new-thread-preference.d.ts.map +1 -1
  138. package/src/native-ui/renderer-extension/dist/types/renderer-sidebar-agent-icons.d.ts.map +1 -1
  139. package/src/native-ui/renderer-extension/dist/types/renderer-usage-control.d.ts.map +1 -1
  140. package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts +6 -4
  141. package/src/native-ui/renderer-extension/dist/types/settings/connections-page.d.ts.map +1 -1
  142. package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts +8 -1
  143. package/src/native-ui/renderer-extension/dist/types/settings/harness-accounts.d.ts.map +1 -1
  144. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts +16 -0
  145. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts.map +1 -1
  146. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +4 -3
  147. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
  148. package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
  149. package/src/native-ui/renderer-extension/dist/types/versioned-renderer-adapter.d.ts.map +1 -1
  150. package/src/native-ui/renderer-extension/src/agent-group-preference.ts +1 -1
  151. package/src/native-ui/renderer-extension/src/agent-selection-state.ts +33 -16
  152. package/src/native-ui/renderer-extension/src/assets/README.md +8 -38
  153. package/src/native-ui/renderer-extension/src/harness-mix-icons.ts +8 -1
  154. package/src/native-ui/renderer-extension/src/harness-mix-settings.ts +9 -1
  155. package/src/native-ui/renderer-extension/src/index.ts +9 -0
  156. package/src/native-ui/renderer-extension/src/renderer-agent-icon.ts +146 -145
  157. package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +2 -1
  158. package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +2995 -2929
  159. package/src/native-ui/renderer-extension/src/renderer-collab-cards.ts +198 -0
  160. package/src/native-ui/renderer-extension/src/renderer-credits-control.ts +32 -12
  161. package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +139 -46
  162. package/src/native-ui/renderer-extension/src/renderer-model-client.ts +7 -2
  163. package/src/native-ui/renderer-extension/src/renderer-new-thread-preference.ts +2 -0
  164. package/src/native-ui/renderer-extension/src/renderer-sidebar-agent-icons.ts +2 -1
  165. package/src/native-ui/renderer-extension/src/renderer-usage-control.ts +34 -3
  166. package/src/native-ui/renderer-extension/src/settings/accounts.css +80 -4
  167. package/src/native-ui/renderer-extension/src/settings/connections-page.ts +1394 -1354
  168. package/src/native-ui/renderer-extension/src/settings/harness-accounts.ts +89 -28
  169. package/src/native-ui/renderer-extension/src/settings/icons.ts +141 -141
  170. package/src/native-ui/renderer-extension/src/settings/localization.ts +800 -752
  171. package/src/native-ui/renderer-extension/src/settings/pages.ts +632 -615
  172. package/src/native-ui/renderer-extension/src/settings/shell.css +2238 -2149
  173. package/src/native-ui/renderer-extension/src/settings/shell.ts +329 -329
  174. package/src/native-ui/renderer-extension/src/settings/trigger.ts +323 -323
  175. package/src/native-ui/renderer-extension/src/versioned-renderer-adapter.ts +13 -2
  176. package/src/native-ui/renderer-extension/test/codebuddy-migration.test.ts +22 -0
  177. package/src/native-ui/renderer-extension/test/harness-mix-icons.test.ts +58 -0
  178. package/src/native-ui/renderer-extension/test/renderer-collab-cards.test.ts +45 -0
  179. package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +1 -0
  180. package/src/native-ui/renderer-extension/test/settings/harness-settings.test.ts +7 -3
  181. package/src/native-ui/renderer-extension/test/settings/localization.test.ts +80 -80
  182. package/src/native-ui/renderer-extension/test/settings/pages.test.ts +2000 -2000
  183. package/src/native-ui/renderer-extension/test/versioned-renderer-adapter.test.ts +13 -0
  184. package/src/native-ui/shared-contracts/dist/harness-accounts.d.ts +20 -6
  185. package/src/native-ui/shared-contracts/dist/harness-accounts.d.ts.map +1 -1
  186. package/src/native-ui/shared-contracts/dist/harness-accounts.js +4 -1
  187. package/src/native-ui/shared-contracts/dist/harness-accounts.js.map +1 -1
  188. package/src/native-ui/shared-contracts/dist/harness-models.d.ts +22 -0
  189. package/src/native-ui/shared-contracts/dist/harness-models.d.ts.map +1 -1
  190. package/src/native-ui/shared-contracts/dist/harness-models.js +2 -1
  191. package/src/native-ui/shared-contracts/dist/harness-models.js.map +1 -1
  192. package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -1
  193. package/src/native-ui/shared-contracts/dist/updates.js +1 -1
  194. package/src/native-ui/shared-contracts/dist/updates.js.map +1 -1
  195. package/src/native-ui/shared-contracts/src/harness-accounts.ts +4 -1
  196. package/src/native-ui/shared-contracts/src/harness-models.ts +6 -1
  197. package/src/native-ui/shared-contracts/src/updates.ts +78 -78
  198. package/docs/images/harness-mix-home.png +0 -0
  199. package/docs/images/harness-mix-session.png +0 -0
  200. package/scripts/git-test.cjs +0 -33
  201. package/src/assets/icons/activity-compact.svg +0 -1
  202. package/src/assets/icons/activity-edit.svg +0 -1
  203. package/src/assets/icons/activity-terminal.svg +0 -1
  204. package/src/assets/icons/commands.svg +0 -1
  205. package/src/assets/icons/home-chat.svg +0 -1
  206. package/src/assets/icons/home-folder.svg +0 -1
  207. package/src/assets/icons/thread-fork.svg +0 -1
  208. package/src/main/workspace/git.js +0 -73
  209. package/src/main/workspace/ipc.js +0 -50
  210. package/src/main/workspace/terminal.js +0 -36
  211. package/src/native-ui/renderer-extension/src/assets/claude-agent.svg +0 -3
  212. package/src/native-ui/renderer-extension/src/assets/codex-logo-bright.png +0 -0
  213. package/src/native-ui/renderer-extension/src/assets/codex-logo-transparent.png +0 -0
  214. package/src/native-ui/renderer-extension/src/assets/codex-logo.png +0 -0
  215. package/src/native-ui/renderer-extension/src/assets/codexhost-icon.png +0 -0
  216. package/src/native-ui/renderer-extension/src/assets/codexhost-logo-transparent.png +0 -0
  217. package/src/native-ui/renderer-extension/src/assets/codexhost-logo.png +0 -0
  218. package/src/native-ui/renderer-extension/src/assets/codexhost-readme.svg +0 -8
  219. package/src/native-ui/renderer-extension/src/assets/pi-agent.svg +0 -4
  220. package/src/native-ui/renderer-extension/src/settings/accounts-quota-interactive.prototype.html +0 -1418
  221. package/src/native-ui/renderer-extension/src/settings/update-notes.preview.html +0 -491
  222. package/src/native-ui/renderer-extension/src/settings/windows-update.preview.html +0 -2135
package/CHANGELOG.md ADDED
@@ -0,0 +1,19 @@
1
+ # Changelog
2
+
3
+ ## 0.1.3 — 2026-09-13
4
+
5
+ - Added multi-agent collaboration support (@ mentions composer, thread delegation, worktree isolation).
6
+ - Cleaned up legacy standalone workbench UI services, throwaway HTML prototypes, and unused icon assets.
7
+ - Enhanced native harness adapters and settings management.
8
+
9
+ ## 0.1.2 — 2026-09-13
10
+
11
+ - Hardened native process supervision, DPAPI secret store, and dual-channel auto-update.
12
+
13
+
14
+ - Added native ACP adapters for CodeBuddy, Kiro CLI, Cursor CLI and Qoder.
15
+ - Added explicit ACP bridge configuration for ZCode and Trae without claiming an unverified vendor entry point.
16
+ - Renamed WorkBuddy to CodeBuddy while preserving legacy task, history and preference identifiers.
17
+ - Added image capability negotiation, bounded ACP event draining, idle/hard turn timeouts, cancellation fallback and stuck-tool diagnostics.
18
+ - Added durable multi-agent recovery checkpoints and verified DSH → CodeBuddy collaboration.
19
+ - Updated the README and native integration documentation with installation, verification and capability limits.
package/README.md CHANGED
@@ -1,20 +1,63 @@
1
1
  # Harness Mix
2
2
 
3
- <p align="center">
4
- <img src="src/assets/brand-harness-mix.png" width="92" alt="Harness Mix logo">
5
- </p>
6
-
7
- <p align="center"><strong>Codex 原生 UI,连接多个原生 Coding Harness。</strong></p>
3
+ <p align="center">
4
+ <img src="src/assets/brand-harness-mix.png" width="92" alt="Harness Mix logo">
5
+ </p>
6
+
7
+ <p align="center">
8
+ ⭐ 如果这个项目对你有帮助,请给我们一个 <a href="https://github.com/emo-xiaoyu/harness-mix">Star</a>! ⭐
9
+ </p>
10
+
11
+ <p align="center"><strong>Codex 原生 UI,连接多个原生 Coding Harness。</strong></p>
8
12
 
9
13
  <p align="center">
10
14
  <a href="LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg"></a>
11
15
  <img alt="UI" src="https://img.shields.io/badge/UI-Codex%20Desktop-412991.svg">
12
- <img alt="Platform" src="https://img.shields.io/badge/platform-Windows-0078D4.svg">
13
- </p>
14
-
15
- Harness Mix 是接入官方 Codex Desktop 原生界面的本地内核:通过本地编译的 CLI Shim 接管桌面的 app-server 协议,把 Pi、Claude Code、DeepSeek Harness、Antigravity 和 Codex 统一进同一套原生 UI。会话生命周期、模型调用、多轮对话、审批与文件差异全部由本仓库的 Host Runtime + Protocol Core + 原生适配器管理;凭据与权限决定仍属于各原生 Harness。
16
-
17
- ![Harness Mix 首页](docs/images/harness-mix-home.png)
16
+ <img alt="Platform" src="https://img.shields.io/badge/platform-Windows-0078D4.svg">
17
+ </p>
18
+
19
+ <p align="center"><strong>当前注册的 Harness(16 个)</strong></p>
20
+
21
+ <table align="center">
22
+ <tbody>
23
+ <tr>
24
+ <td align="center"><img src="src/assets/icons/antigravity-color.svg" width="28" height="28" alt="Antigravity"><br><sub>Antigravity</sub></td>
25
+ <td align="center"><img src="src/assets/icons/codex-harness.svg" width="28" height="28" alt="Codex"><br><sub>Codex</sub></td>
26
+ <td align="center"><img src="src/assets/icons/claude-color.svg" width="28" height="28" alt="Claude Code"><br><sub>Claude Code</sub></td>
27
+ <td align="center"><img src="src/assets/icons/pi.svg" width="28" height="28" alt="Pi"><br><sub>Pi</sub></td>
28
+ </tr>
29
+ <tr>
30
+ <td align="center"><img src="src/assets/icons/omp-color.svg" width="28" height="28" alt="Oh My Pi"><br><sub>Oh My Pi</sub></td>
31
+ <td align="center"><img src="src/assets/icons/deepseek-color.svg" width="28" height="28" alt="DeepSeek Harness"><br><sub>DeepSeek</sub></td>
32
+ <td align="center"><img src="src/assets/icons/opencode-color.svg" width="28" height="28" alt="OpenCode"><br><sub>OpenCode</sub></td>
33
+ <td align="center"><img src="src/assets/icons/grok-color.svg" width="28" height="28" alt="Grok"><br><sub>Grok</sub></td>
34
+ </tr>
35
+ <tr>
36
+ <td align="center"><img src="src/assets/icons/openclaw-color.svg" width="28" height="28" alt="OpenClaw"><br><sub>OpenClaw</sub></td>
37
+ <td align="center"><img src="src/assets/icons/hermes-color.svg" width="28" height="28" alt="Hermes"><br><sub>Hermes</sub></td>
38
+ <td align="center"><img src="src/assets/icons/qoder-color.svg" width="28" height="28" alt="Qoder"><br><sub>Qoder</sub></td>
39
+ <td align="center"><img src="src/assets/icons/codebuddy-color.svg" width="28" height="28" alt="CodeBuddy"><br><sub>CodeBuddy</sub></td>
40
+ </tr>
41
+ <tr>
42
+ <td align="center"><img src="src/assets/icons/kiro-cli-color.svg" width="28" height="28" alt="Kiro"><br><sub>Kiro</sub></td>
43
+ <td align="center"><img src="src/assets/icons/cursor.svg" width="28" height="28" alt="Cursor"><br><sub>Cursor</sub></td>
44
+ <td align="center"><img src="src/assets/icons/zcode-color.svg" width="28" height="28" alt="ZCode"><br><sub>ZCode</sub></td>
45
+ <td align="center"><img src="src/assets/icons/trae-color.svg" width="28" height="28" alt="Trae"><br><sub>Trae</sub></td>
46
+ </tr>
47
+ </tbody>
48
+ </table>
49
+
50
+ <p align="center"><sub>图标与 Harness 能力均来自项目自身的注册表;只有本机已安装且握手成功的 Harness 才会进入真实运行。</sub></p>
51
+
52
+ Harness Mix 是接入官方 Codex Desktop 原生界面的本地内核。它通过本地编译的 CLI Shim 对接桌面的 app-server 协议,把包括 Antigravity、Codex、Pi、Oh My Pi、Claude Code、DeepSeek Harness、OpenCode、Grok、OpenClaw、Hermes、Qoder、CodeBuddy、Kiro CLI、Cursor CLI、ZCode 和 Trae 在内的原生 Coding Harness 接入同一套 UI。Host Runtime 与 Protocol Core 管理任务映射、协作和事件投影;模型调用、工具执行、原生会话与凭据仍由各 Harness 自己管理。
53
+
54
+ ## 界面预览
55
+
56
+ <p align="center">
57
+ <img src="docs/images/codex-desktop-home.png" width="960" alt="Codex Desktop 原生首页中的 Harness Mix">
58
+ </p>
59
+
60
+ 预览来自当前 Codex Desktop 原生窗口:Harness Mix 作为原生扩展入口出现在桌面工具栏和 Composer 中,会话、模型、工具与权限仍由 Codex Desktop 及各 Harness 管理。
18
61
 
19
62
  ## 能做什么
20
63
 
@@ -22,10 +65,13 @@ Harness Mix 是接入官方 Codex Desktop 原生界面的本地内核:通过
22
65
  - 流式呈现回答、思考、命令执行、工具调用、文件变更和上下文压缩。
23
66
  - 调用每个 Harness 原生提供的模型、权限、上下文用量和快捷指令。
24
67
  - 会话中原地切换 Harness(`/switch <Harness 名> [备注]` 或 `codexhost/thread/harness/switch`):会话历史与文件现场保留在 Host 线程上,切换后首轮自动携带一次性上下文信封;切回旧 Harness 时按其原生机制(Pi `--session` / Claude `resume`)恢复原会话。
25
- - 原生 Diff、审批与提问组件直接渲染,审批路由回原生 Harness,不代替用户作出权限决定。
68
+ - 原生 Diff、审批与提问组件直接渲染,审批路由回原生 Harness,不代替用户作出权限决定。
69
+ - CodeBuddy、Kiro 和 Cursor 使用原生 ACP 加厂商专用接口:提问、计划确认、配置确认、取消恢复、上下文与历史按各自协议处理。功能和验证范围见下表,不将通用 ACP 能力视为所有 CLI 都已支持。
26
70
  - 通过 Adapter 注册新 Harness,UI 侧无需理解厂商协议。
27
71
 
28
- ![Harness Mix 会话](docs/images/harness-mix-session.png)
72
+ <p align="center">
73
+ <img src="docs/images/codex-desktop-session.png" width="960" alt="Codex Desktop 原生会话中的 Harness Mix">
74
+ </p>
29
75
 
30
76
  ## 原生接入
31
77
 
@@ -38,16 +84,22 @@ Harness Mix 是接入官方 Codex Desktop 原生界面的本地内核:通过
38
84
  | Pi | `pi --mode rpc` | 会话恢复、模型目录、Usage、原生命令、Fork |
39
85
  | Oh My Pi | `omp --mode rpc`(Pi 家族协议,见 `pi-family.js`) | 与 Pi 同源:会话、模型、思考档位、权限、Fork、Usage |
40
86
  | Claude Code | `@anthropic-ai/claude-agent-sdk` 的 `query()` | 持久会话、流式消息、工具、权限、模型与 Resume |
41
- | DeepSeek Harness | `npm run dsh -- web` | Web Remote、Typert RPC、WebSocket 事件、会话与模型控制 |
87
+ | DeepSeek Harness | 普通任务 `npm run dsh -- web`;协作主任务 `npm run dsh -- --profile acp` | Web Remote/Typert RPC;主任务使用官方 ACP 的会话级 MCP;WebSocket 事件、会话与模型控制 |
42
88
  | OpenCode | `opencode serve`(原生 HTTP / SSE,见 `opencode.js`) | 会话、模型目录、权限模式、图片、Fork |
43
89
  | Grok | `grok agent stdio`(独立适配 ACP 基础消息与 `_x.ai/*` 厂商扩展,见 `grok.js`) | 会话、模型、思考档位、原生命令目录、Token Usage、原生 Fork |
44
90
  | OpenClaw | 本机 Gateway loopback WebSocket(`openclaw-gateway.js` + `openclaw.js`) | 会话与恢复、流式增量、工具与命令输出、exec/plugin 审批回路由、模型与思考档位逐轮覆盖 |
45
91
  | Hermes | `hermes acp`(ACP over stdio,共享 `acp.js` 工厂) | 会话持久化/恢复/Fork、流式回答与思考、工具、审批、模型选择 |
46
- | Qoder | `qoder acp`(阿里 Qoder CLI,共享 `acp.js` 工厂) | 会话、流式回答与思考、工具、审批、模型选择 |
47
- | Workbuddy | `codebuddy acp`(腾讯 Workbuddy / CodeBuddy CLI,共享 `acp.js` 工厂) | 会话、流式回答与思考、工具、审批、模型选择 |
48
- | ZCode | `zcode acp`(智谱 AI ZCode CLI,共享 `acp.js` 工厂) | 会话、流式回答与思考、工具、审批、GLM 模型识别 |
49
- | Trae | `traecli acp serve`(字节跳动 Trae CLI Agent,共享 `acp.js` 工厂) | 会话、流式回答与思考、工具、审批、模型选择 |
50
-
92
+ | Qoder | `qodercli --acp` / `qoder --acp`(官方 CLI,`native-acp.js`) | 原生会话、配置、审批、工具、恢复;图片按握手能力启用 |
93
+ | CodeBuddy | `codebuddy --acp` + `_codebuddy.ai/*` | 原生提问与提交重试、审批作用范围、取消后重连恢复、模型/思考/模式、原生历史导入、去重 Token/Credits |
94
+ | Kiro CLI | `kiro-cli acp --agent-engine v3 --auth-method cli` + `_kiro/*` | 原生提问、带作用范围的 consent、模型/effort、上下文查询、原生压缩与 fork(后两项需握手支持) |
95
+ | Cursor CLI | `cursor-agent acp` + `cursor/*` | 单选/多选提问、计划接受/拒绝、原生模型变体/模式、会话恢复、完成后的 Diff 投影 |
96
+ | ZCode | 需显式配置兼容 ACP 桥接程序(尚未验证) | 本机 0.16.5 仅确认 `app-server --stdio`;不能直接作为 ACP 启动 |
97
+ | Trae | 需显式配置兼容 ACP 程序(尚未验证) | 官方 trae-agent 未发现 ACP 入口;不再使用猜测的启动/安装命令 |
98
+
99
+ CodeBuddy、Kiro CLI、Cursor CLI、Qoder、ZCode 和 Trae 均已接入默认选择器、模型偏好、侧栏图标与共享 ACP 引擎;其中只有已安装且握手成功的 Harness 才会进入真实运行。原 Workbuddy 已更名为 CodeBuddy;旧任务、切换历史、模型偏好与名称别名保留兼容。DSH 协作主任务也使用官方 ACP,普通任务继续使用 Web Remote。
100
+
101
+ 2026-09-12 健康检查:Pi、DSH、Claude Code、Codex、Grok、CodeBuddy 的真实文本回路通过;OpenCode 被账户余额阻断,Qoder 被 Credits 额度阻断,OMP、Hermes、Kiro、Cursor 本机未安装。图片真实回路通过 Antigravity、Pi、Claude Code、Codex、Grok、CodeBuddy;DSH 与 OpenClaw 的当前模型拒绝图片,Qoder/OpenCode 分别被额度/余额阻断。ZCode、Trae 目前只有显式 ACP 桥接配置入口,未证明官方 CLI 提供 ACP 服务。报告见 [`output/harness-health/1789191914230/report.json`](output/harness-health/1789191914230/report.json) 和 [`output/harness-health/1789191791797/report.json`](output/harness-health/1789191791797/report.json);完整安装与边界见 [原生 ACP 深度适配](docs/native-acp.md)。
102
+
51
103
  能力只在 Adapter 的 `manifest` 中声明。界面根据真实能力显示入口,不靠 Harness 名称猜测功能;厂商特有字段会保留在原生引用和载荷中。
52
104
 
53
105
  ## 架构
@@ -71,9 +123,11 @@ flowchart TB
71
123
  Registry --> OpenClaw[OpenClaw Gateway loopback WS]
72
124
  Registry --> Hermes[Hermes ACP stdio]
73
125
  Registry --> Qoder[Qoder ACP stdio]
74
- Registry --> Workbuddy[Workbuddy ACP stdio]
75
- Registry --> ZCode[ZCode ACP stdio]
76
- Registry --> Trae[Trae ACP stdio]
126
+ Registry --> CodeBuddy[CodeBuddy ACP + native extensions]
127
+ Registry --> Kiro[Kiro ACP + native extensions]
128
+ Registry --> Cursor[Cursor ACP + native extensions]
129
+ Registry --> ZCode[ZCode 显式 ACP 桥接入口 未验证]
130
+ Registry --> Trae[Trae 显式 ACP 入口 未验证]
77
131
  ```
78
132
 
79
133
  ```text
@@ -117,15 +171,32 @@ module.exports = {
117
171
  };
118
172
  ```
119
173
 
120
- ## 本地运行
121
-
122
- 开发环境需要 Windows、近期 Node.js LTS 和 npm。应用不会读取或保存 Harness 的账户密钥,请先在对应的原生 CLI 中完成安装与登录。
174
+ ## 本地运行
175
+
176
+ 开发环境需要 Windows、近期 Node.js LTS 和 npm。应用不会读取或保存 Harness 的账户密钥,请先在对应的原生 CLI 中完成安装与登录。
123
177
 
124
178
  ```powershell
125
179
  git clone https://github.com/emo-xiaoyu/harness-mix.git
126
180
  cd harness-mix
127
- npm install
128
- ```
181
+ npm install
182
+ ```
183
+
184
+ ### 从 npm 安装
185
+
186
+ Harness Mix 发布为 Windows x64 npm 包,包内包含已构建的 Shim、Desktop Controller 和 Renderer 扩展。安装后可从任意工作目录启动:
187
+
188
+ ```powershell
189
+ npm install --global harness-mix
190
+ harness-mix
191
+ ```
192
+
193
+ 升级到最新版本:
194
+
195
+ ```powershell
196
+ npm update --global harness-mix
197
+ ```
198
+
199
+ 首次运行会重启已打开的 Codex Desktop。npm 包只分发 Harness Mix 本身;各 Harness 的 CLI、登录状态、模型额度和权限仍需按下表在本机单独安装和配置。
129
200
 
130
201
  ### 运行方式
131
202
 
@@ -136,10 +207,15 @@ npm start
136
207
 
137
208
  常用原生依赖:
138
209
 
139
- - Codex:安装 `@openai/codex`,确保 `codex` 命令可用。
140
- - Pi:确保 `pi.cmd` 可用。
141
- - Claude Code:SDK 已由 npm 依赖安装,认证仍由 Claude Code 环境管理。
142
- - DeepSeek Harness:使用本项目锁定的 `@deepseek-ai/dsh@0.1.2-rc.1`。可通过 `HARNESS_MIX_DSH_ROOT` 显式指定源码目录,但版本必须被内核支持。
210
+ - Codex:安装 `@openai/codex`,确保 `codex` 命令可用。
211
+ - Pi:确保 `pi.cmd` 可用。
212
+ - Claude Code:SDK 已由 npm 依赖安装,认证仍由 Claude Code 环境管理。
213
+ - DeepSeek Harness:使用本项目锁定的 `@deepseek-ai/dsh@0.1.2-rc.1`。可通过 `HARNESS_MIX_DSH_ROOT` 显式指定源码目录,但版本必须被内核支持。
214
+ - CodeBuddy:安装官方 `codebuddy` CLI 并完成登录;旧 WorkBuddy 安装也可通过兼容别名继续使用。
215
+ - Kiro CLI:安装 `kiro-cli`,启用 `acp` 子命令并完成 CLI 登录。
216
+ - Cursor CLI:安装 `cursor-agent` 并完成 CLI 登录。
217
+ - Qoder:安装 `qodercli`(或 `qoder`)并完成 CLI 登录;ACP 入口由本机版本决定。
218
+ - ZCode / Trae:只有在拥有已验证的 ACP 兼容桥接程序时才配置 `HARNESS_MIX_ZCODE_ACP_EXECUTABLE` / `HARNESS_MIX_TRAE_EXECUTABLE`,项目不会猜测官方入口。
143
219
 
144
220
  原生接入方式、数据目录和验证说明见 [原生 Codex 接入](docs/native-codex.md)。
145
221
 
@@ -165,7 +241,7 @@ npm run e2e:codex
165
241
 
166
242
  ## 设计原则
167
243
 
168
- 1. **原生能力优先**:Adapter 翻译协议,不重新实现 Harness。
244
+ 1. **原生能力优先**:Adapter 翻译协议,不重新实现 Harness。
169
245
  2. **诚实声明能力**:只有完成接线和验证的能力才进入 `manifest`。
170
246
  3. **惰性恢复**:打开历史任务只读取本地投影,发送新消息时才恢复原生进程。
171
247
  4. **可回放事件**:Core Event 保持稳定顺序,可用于恢复、投影和确定性校验。
@@ -173,9 +249,9 @@ npm run e2e:codex
173
249
 
174
250
  ## 项目状态
175
251
 
176
- - [内核迁移状态](CORE-MIGRATION-STATUS.md)
177
- - [下一步计划](NEXT-STEPS.md)
178
- - [设计验收记录](design-qa.md)
252
+ - [内核迁移状态](CORE-MIGRATION-STATUS.md)
253
+ - [下一步计划](NEXT-STEPS.md)
254
+ - [Codex Desktop 原生接入说明](docs/native-codex.md)
179
255
 
180
256
  Harness Mix 参考了 [codex-host](https://github.com/BytePioneer-AI/codex-host) 的插件化组织方式,并使用 [OpenAI Codex](https://github.com/openai/codex) 官方 app-server 协议完成 Codex 原生接入。
181
257
 
@@ -18,6 +18,12 @@
18
18
  "level": "protocol-and-smoke",
19
19
  "checkedAt": "2026-09-11",
20
20
  "notes": "Install inspection, protocol suite, native build and offscreen Electron smoke passed; full restarted Desktop acceptance remains pending."
21
+ },
22
+ {
23
+ "desktopVersion": "26.908.4834.0",
24
+ "level": "desktop-e2e",
25
+ "checkedAt": "2026-09-13",
26
+ "notes": "Restarted isolated Desktop acceptance passed with the 26.908 connection snapshot and draft identity contracts: Renderer request bridge ready, native input editable, Pi selected with its model, external turn routed through Harness Mix HostRuntime, and exact live Pi response rendered."
21
27
  }
22
28
  ]
23
29
  }
@@ -4,7 +4,9 @@
4
4
 
5
5
  ## 连接
6
6
 
7
- 分别检查 Codex、Claude Code、Pi、DeepSeek Harness 的本机安装状态,显示原生接口、诊断信息和检查耗时。检测不会发送用户消息。程序可用不等于账号已登录。
7
+ 按当前适配器注册表检查本机安装状态,包括 CodeBuddy、Kiro CLI 和 Cursor CLI。检测不会发送用户消息;程序可用不等于账号已登录。Kiro/Cursor 提供官方安装链接与刷新检测,不猜测 npm 安装包。
8
+
9
+ CodeBuddy 的旧名称 Workbuddy 自动兼容,已有原生会话 ID 不变。配置路径、专用协议和验证边界见 [原生 ACP 适配说明](native-acp.md)。
8
10
 
9
11
  ## 账号
10
12
 
@@ -14,6 +16,7 @@
14
16
  | Claude Code | 原生 `claude auth status --json` | 打开原生认证窗口执行 `claude auth login/logout`,完成后刷新 |
15
17
  | Pi | 原生 RPC 模型目录中的供应商 | 打开 Pi 原生交互终端,使用 `/login` 与 `/logout` |
16
18
  | DeepSeek Harness | 原生 Web Remote 模型目录中的供应商 | 在独立、安全隔离的应用窗口中打开 DSH 原生管理页面,进入设置管理供应商 |
19
+ | CodeBuddy / Kiro CLI / Cursor CLI | 可执行文件版本检测;打开会话后读取原生目录 | 在各自 CLI 完成原生登录,再刷新检测;不读取或复制登录凭据 |
17
20
 
18
21
  Pi / DSH 显示「已配置」而非「已登录」,目录存在不能证明凭据通过在线验证。登录与配置仍使用原生程序自己的账号存储,Harness Mix 不复制账号密钥。当前使用各原生程序的本机账号环境,不提供独立多账号池。
19
22
 
@@ -0,0 +1,3 @@
1
+ # CodeBuddy / Kiro / Cursor 接入
2
+
3
+ 原有基础接入说明已更新为 [原生 ACP 深度适配](native-acp.md),包含 CodeBuddy 更名兼容、厂商专用接口、测试证据与未支持能力。
@@ -1,73 +1,73 @@
1
- # 多 Agent 协作
2
-
3
- ## 用法
4
-
5
- 重新启动 Harness Mix 后,新建或恢复一个 Pi / Oh My Pi / Claude Code / **Codex(协作)** / Grok / OpenCode 任务,输入 `@`,在 **Agents** 页选择目标 Harness;**会话** 页单独提供历史引用。左右键切换分页,上下键选择,Enter/Tab 插入。Codex(协作)通过 Host Adapter 使用原生 app-server;原来的 Codex 入口仍为官方直通。可用目标来自 Host 注册的 Adapter;未就绪的目标不可选。示例:
6
-
7
- ```text
8
- 你负责实现后端。
9
- @claude-code 审查 API 设计,只读,不修改文件。
10
- @pi 为 tests/ 编写测试,不修改 src/。
11
- 收齐结果后由你运行验证并总结。
12
- ```
13
-
14
- 也可直接输入 `@pi`、`@claude`、`@dsh`、`@codex` 等已注册 ID/别名。显式 `[名称](harness-mix://agent/pi)` 引用可随草稿复制;代码块、行内代码和邮箱里的 @ 不作为路由元数据。提及本身由主模型结合用户任务理解,Host 不按文字片段盲目拆任务。
15
-
16
- ## 执行方式
17
-
18
- 借鉴 Codeg 的 [委派工具](https://github.com/xintaofei/codeg/blob/main/src-tauri/src/acp/delegation/tool_schema.json) 和 [Agent 引用路由](https://github.com/xintaofei/codeg/blob/main/src-tauri/src/acp/agent_mentions.rs):
19
-
20
- 1. Host 为主任务提供会话绑定的协作工具。Claude 通过 SDK 的 MCP 配置,Codex Adapter 通过 app-server 的线程 MCP 配置,Pi/OMP 通过原生扩展加载,Grok 通过原生 `session/new` 的 `mcpServers` 槽注入(L1),OpenCode 通过 `OPENCODE_CONFIG_CONTENT` 内联配置注入 `mcp.servers`(L2,运行时最高优先级、不写任何用户配置文件)。
21
- 2. 主模型调用 `delegate_to_agent(agent_type, task)`,立即取得 `task_id`,可以继续发起其他任务。
22
- 3. Host 创建带 `parentThreadId` 的独立原生会话。任务中需要的上下文由主模型明确传递,不复制其他 Harness 的隐藏状态、账户或权限。
23
- 4. `update_agent_plan(steps)` 发布开发、审查、返工和最终验收计划;步骤状态为 pending / in_progress / completed。`get_delegation_status(task_ids, wait_ms)` 收取状态和最终文本;单次等待不超过 60 秒。`message_agent` 在已结束的子会话中继续对话,`cancel_delegation` 取消子任务。
24
- 5. 结果作为真正的原生工具结果返回主模型,由主模型验证、整合并继续执行。Host 额外投影原生 `collabAgentToolCall` 协作卡片(真实子任务 ID、Harness 名称、提示词和最终状态),不代替主模型生成总结。
25
-
26
- `list_agents` 提供真实可用性。旧 `/delegate` 仍是独立的手动委派入口,其完成结果只回投父任务工具卡片,不自动调用父模型。
27
-
28
- ## 执行边界
29
-
30
- - 同一主任务最多四个同时运行的子任务,每轮最多创建十六个;子任务不注入协作工具,不允许递归委派。
31
- - 模型工具委派默认共享主任务目录,子 Agent 使用独立原生会话。开发完成后再委派审查,审查意见通过 `message_agent` 发回原开发者,修复后复用原审查会话复审。主任务应等待依赖步骤完成并避免同时修改相同文件。主任务负责共享目录整体文件快照。显式 `isolation=worktree`(或 Git 项目中的 `auto`)仍创建隔离分支与工作区,保存主目录当前非忽略文件作为起点,保留用户暂存区;隔离改动不会自动出现在主目录。
32
- - 协作不创建独立面板或第二套 UI。父子关系通过原生 `parentThreadId` 投影,子任务进入 Codex 原生任务体系;委派和跟进显示为原生协作卡片;普通工具及轮询仍显示为 MCP 工具卡片,审批在相应原生子任务中处理,文件变化由原生 Changes 界面展示。
33
- - 主任务可调用 `review_delegation_changes` 在原生工具卡片中审查 worktree patch。只有用户明确要求应用时才可调用 `apply_delegation_changes`,并必须提交刚审查得到的 digest。应用前检查 Git patch 冲突;冲突时保留两个目录,交给用户处理。worktree 保留供检查,不自动删除。隔离子任务有独立审查快照;共享子任务仍由主任务记录整体快照。旧 `/delegate` 手动入口仍为共享目录。
34
- - 同目录的无关任务仍受原有执行互斥约束。父任务结束/取消、Host 关闭会取消尚未完成的子任务;30 分钟未完成的子任务会超时。
35
- - 协作 HTTP 桥仅绑定 loopback,以每个主任务的随机本地能力标识鉴权;工具参数校验,子任务归属检查,外部 Origin 拒绝。该标识不是模型账户令牌。Host 不读取或代理原生账户密钥。
36
- - Claude 的 `canUseTool` 和 Codex MCP elicitation 继续走原生审批。需要确认时,用户在相应任务的审批界面处理;自动验证不会代答。
37
- - 主任务 Fork 会重新绑定自己的协作身份,不复用源任务的子任务访问权。
38
- - task_id、父子会话、任务文本、结果和 worktree 起点在独立串行存储中持久化;重启后在途任务变为 interrupted,不自动重复执行有副作用的操作。点击「继续协作」向原主任务发送续跑请求,主模型用 `list_delegations` / `resume_delegation` 恢复原子会话。原生会话丢失或无法恢复会明确报错。会话鉴权标识不持久化,重启重新签发。
39
-
40
- ## 支持与验证范围
41
-
42
- | 入口 | 状态 |
43
- | --- | --- |
44
- | Pi 主任务 | 原生扩展工具;Pi→Pi、Pi→Claude 两条真实模型链路通过 |
45
- | Claude Code 主任务 | SDK MCP 注入;本机真实运行触发原生工具审批,未代答,尚未完成模型闭环验收 |
46
- | Oh My Pi 主任务 | 同 Pi 家族的扩展接线;本机未安装 OMP,真实验收未完成 |
47
- | Codex(协作)主任务 | 已接入选择器、模型/强度、恢复归属、@ 菜单;桌面使用配套 CLI。真实请求已到原生 MCP 审批,尚未完成需授权的闭环 |
48
- | Grok 主任务 | L1:`session/new`/`session/load` 原生 `mcpServers` 槽注入,恢复会话同样携带;真实模型闭环验收待跑 |
49
- | OpenCode 主任务 | L2:`OPENCODE_CONFIG_CONTENT` 内联配置注入 `mcp.servers`(V2 schema),会话结束即失效;真实模型闭环验收待跑 |
50
- | DSH 主任务 | 调研结论:DSH 自带 `@deepseek-ai/dsh-mcp-client`(stdio 配置:`transport/serverName/command/args/env`),门存在;host.call 会话通道的 MCP 注入点待上游确认,确认前保持 target-only |
51
- | 官方 Codex 桌面直通任务 | 保持官方直通,不展示 Host 的 @ 协作菜单;不要把 Adapter 接线等同于已支持这个入口 |
52
- | 其他 Harness 主任务(含 Antigravity) | Agents 页明确提示需要切换可编排的主 Agent,目标不可选;历史引用仍可用;可使用旧 /delegate |
53
- | 子任务目标 | 所有已注册且本机可用的 Adapter;不代表每一对组合都已实测 |
54
-
55
- ```powershell
56
- npm run test:collaboration
57
- npm run test:collaboration-recovery
58
- npm run smoke:collaboration-ui
59
- npm run e2e:collaboration -- --lead=pi --worker=claude
60
- npm run check
61
- npm run test:core-all
62
- npm run test:native-protocol
63
- npm run e2e:native
64
- npm run build:native
65
- ```
66
-
67
- `test:collaboration` 使用真实 MCP stdio 子进程、本地鉴权桥和受控原生会话 Adapter 验证并发、结果、跟进、取消、跨任务访问限制、历史引用提示和共享快照策略。UI smoke 只检查原生输入框内的 Harness/历史会话选择、图标、标识、键盘选取和清理,截图位于 `output/collaboration-ui/mentions.png`。协作过程由 Native Protocol 的原生工具卡片测试覆盖。这不是完整 Codex Desktop 的交互验收;构建过程不会重启当前桌面。
68
-
69
- 2026-09-10 验证:Pi→Claude 两个真实子任务分别在不同 worktree 运行,结果返回主模型并汇总通过。恢复测试覆盖持久化身份、原子会话续跑、不重复建任务;Git 测试覆盖脏目录起点、暂存区保留、过期预览拒绝、冲突时不部分应用。Native Protocol 覆盖父子任务归属与原生 MCP 工具卡片,Electron 仅覆盖原生输入框中的协作引用增强。
70
-
1
+ # 多 Agent 协作
2
+
3
+ ## 用法
4
+
5
+ 重新启动 Harness Mix 后,新建或恢复一个 Pi / Oh My Pi / Claude Code / **Codex(协作)** / Grok / OpenCode / **Antigravity** 任务,输入 `@`,在 **Agents** 页选择目标 Harness;**会话** 页单独提供历史引用。左右键切换分页,上下键选择,Enter/Tab 插入。Codex(协作)通过 Host Adapter 使用原生 app-server;原来的 Codex 入口仍为官方直通。可用目标来自 Host 注册的 Adapter;未就绪的目标不可选。示例:
6
+
7
+ ```text
8
+ 你负责实现后端。
9
+ @claude-code 审查 API 设计,只读,不修改文件。
10
+ @pi 为 tests/ 编写测试,不修改 src/。
11
+ 收齐结果后由你运行验证并总结。
12
+ ```
13
+
14
+ 也可直接输入 `@pi`、`@claude`、`@dsh`、`@codex` 等已注册 ID/别名。显式 `[名称](harness-mix://agent/pi)` 引用可随草稿复制;代码块、行内代码和邮箱里的 @ 不作为路由元数据。提及本身由主模型结合用户任务理解,Host 不按文字片段盲目拆任务。
15
+
16
+ ## 执行方式
17
+
18
+ 借鉴 Codeg 的 [委派工具](https://github.com/xintaofei/codeg/blob/main/src-tauri/src/acp/delegation/tool_schema.json) 和 [Agent 引用路由](https://github.com/xintaofei/codeg/blob/main/src-tauri/src/acp/agent_mentions.rs):
19
+
20
+ 1. Host 为主任务提供会话绑定的协作工具。Claude 通过 SDK 的 MCP 配置,Codex Adapter 通过 app-server 的线程 MCP 配置,Pi/OMP 通过原生扩展加载,Grok 通过原生 `session/new` 的 `mcpServers` 槽注入(L1),OpenCode 通过 `OPENCODE_CONFIG_CONTENT` 内联配置注入 `mcp["harness-mix"]`(V2 schema,运行时最高优先级、不写任何用户配置文件),DSH 协作主任务通过官方 `dsh --profile acp` 的 session-scoped MCP 注入,Antigravity 协作主任务通过 bridge 目录自动生成的 `.agents/plugins/harness-mix` plugin 及 loopback MCP 配置注入与引导词;DSH 普通任务仍走 Web Remote。
21
+ 2. 主模型调用 `delegate_to_agent(agent_type, task)`,立即取得 `task_id`,可以继续发起其他任务。
22
+ 3. Host 创建带 `parentThreadId` 的独立原生会话。任务中需要的上下文由主模型明确传递,不复制其他 Harness 的隐藏状态、账户或权限。
23
+ 4. `update_agent_plan(steps)` 发布开发、审查、返工和最终验收计划;步骤状态为 pending / in_progress / completed。`get_delegation_status(task_ids, wait_ms)` 收取状态和最终文本;单次等待不超过 60 秒。`message_agent` 在已结束的子会话中继续对话,`cancel_delegation` 取消子任务。
24
+ 5. 结果作为真正的原生工具结果返回主模型,由主模型验证、整合并继续执行。Host 额外投影原生 `collabAgentToolCall` 协作卡片(真实子任务 ID、Harness 名称、提示词、最终状态、Worktree 补丁与改动摘要),原生桌面渲染扩展支持点击直接跳转定位到子会话、内联展开语法高亮 Diff 查看改动、以及一键合并回主项目。
25
+
26
+ `list_agents` 提供真实可用性。旧 `/delegate` 仍是独立的手动委派入口,其完成结果只回投父任务工具卡片,不自动调用父模型。
27
+
28
+ ## 执行边界
29
+
30
+ - 同一主任务最多四个同时运行的子任务,每轮最多创建十六个;子任务不注入协作工具,不允许递归委派。
31
+ - 模型工具委派默认共享主任务目录,子 Agent 使用独立原生会话。开发完成后再委派审查,审查意见通过 `message_agent` 发回原开发者,修复后复用原审查会话复审。主任务应等待依赖步骤完成并避免同时修改相同文件。主任务负责共享目录整体文件快照。显式 `isolation=worktree`(或 Git 项目中的 `auto`)仍创建隔离分支与工作区,保存主目录当前非忽略文件作为起点,保留用户暂存区;隔离改动不会自动出现在主目录。
32
+ - 协作不创建独立面板或第二套 UI。父子关系通过原生 `parentThreadId` 投影,子任务进入 Codex 原生任务体系;委派和跟进显示为原生协作卡片;普通工具及轮询仍显示为 MCP 工具卡片,审批在相应原生子任务中处理,文件变化由原生 Changes 界面展示。
33
+ - 主任务可调用 `review_delegation_changes` 在原生工具卡片中审查 worktree patch。只有用户明确要求应用时才可调用 `apply_delegation_changes`,并必须提交刚审查得到的 digest。应用前检查 Git patch 冲突;冲突时结构化输出冲突文件清单及处置指引(工作区手动解决、推送到远程分支开 PR、或一键丢弃)。系统提供 `codexhost/thread/workspace/discard` 一键安全清除 worktree 与删除临时分支,以及 `codexhost/thread/workspace/push` 提交快照并直接推送到 Git 远程分支。worktree 默认保留供检查,不自动删除。隔离子任务有独立审查快照;共享子任务仍由主任务记录整体快照。旧 `/delegate` 手动入口仍为共享目录。
34
+ - 同目录的无关任务仍受原有执行互斥约束。父任务结束/取消、Host 关闭会取消尚未完成的子任务;30 分钟未完成的子任务会超时。
35
+ - 协作 HTTP 桥仅绑定 loopback,以每个主任务的随机本地能力标识鉴权;工具参数校验,子任务归属检查,外部 Origin 拒绝。该标识不是模型账户令牌。Host 不读取或代理原生账户密钥。
36
+ - Claude 的 `canUseTool` 和 Codex MCP elicitation 继续走原生审批。需要确认时,用户在相应任务的审批界面处理;自动验证不会代答。
37
+ - 主任务 Fork 会重新绑定自己的协作身份,不复用源任务的子任务访问权。
38
+ - task_id、父子会话、任务文本、结果和 worktree 起点在独立串行存储中持久化;重启后在途任务变为 interrupted,不自动重复执行有副作用的操作。点击「继续协作」向原主任务发送续跑请求,主模型用 `list_delegations` / `resume_delegation` 恢复原子会话。原生会话丢失或无法恢复会明确报错。会话鉴权标识不持久化,重启重新签发。
39
+
40
+ ## 支持与验证范围
41
+
42
+ | 入口 | 状态 |
43
+ | --- | --- |
44
+ | Pi 主任务 | 原生扩展工具;Pi→Pi、Pi→Claude 两条真实模型链路通过 |
45
+ | Claude Code 主任务 | SDK MCP 注入;本机真实运行触发原生工具审批,未代答,尚未完成模型闭环验收 |
46
+ | Oh My Pi 主任务 | 同 Pi 家族的扩展接线;本机未安装 OMP,真实验收未完成 |
47
+ | Codex(协作)主任务 | 已接入选择器、模型/强度、恢复归属、@ 菜单;桌面使用配套 CLI。真实请求已到原生 MCP 审批,尚未完成需授权的闭环 |
48
+ | Grok 主任务 | L1:`session/new`/`session/load` 原生 `mcpServers` 槽注入,恢复会话同样携带;真实模型闭环验收待跑 |
49
+ | OpenCode 主任务 | L2:`OPENCODE_CONFIG_CONTENT` 使用 `mcp["harness-mix"]`(V2 schema),会话结束即失效;本机真实请求已到官方 API,但被账户余额阻断 |
50
+ | DSH 主任务 | 官方 `dsh --profile acp` 接收 session-scoped `harness-mix` MCP;DSH→CodeBuddy 两个 worktree 子任务和最终 `COLLAB_VERIFIED` 已通过真实模型回路。普通 DSH 任务继续使用 Web Remote |
51
+ | Antigravity 主任务 | 支持主编排(通过 `.agents/plugins/harness-mix` MCP 自动挂载及指导词注入);已接入协同工具与卡片投影 |
52
+ | 官方 Codex 桌面直通任务 | 保持官方直通,不展示 Host 的 @ 协作菜单;不要把 Adapter 接线等同于已支持这个入口 |
53
+ | 其他 Harness 主任务 | Agents 页明确提示需要切换可编排的主 Agent,目标不可选;历史引用仍可用;可使用旧 /delegate |
54
+ | 子任务目标 | 所有已注册且本机可用的 Adapter;不代表每一对组合都已实测 |
55
+
56
+ ```powershell
57
+ npm run test:collaboration
58
+ npm run test:collaboration-recovery
59
+ npm run smoke:collaboration-ui
60
+ npm run e2e:collaboration -- --lead=pi --worker=claude
61
+ npm run check
62
+ npm run test:core-all
63
+ npm run test:native-protocol
64
+ npm run e2e:native
65
+ npm run build:native
66
+ ```
67
+
68
+ `test:collaboration` 使用真实 MCP stdio 子进程、本地鉴权桥和受控原生会话 Adapter 验证并发、结果、跟进、取消、跨任务访问限制、历史引用提示和共享快照策略。UI smoke 只检查原生输入框内的 Harness/历史会话选择、图标、标识、键盘选取和清理,截图位于 `output/collaboration-ui/mentions.png`。协作过程由 Native Protocol 的原生工具卡片测试覆盖。这不是完整 Codex Desktop 的交互验收;构建过程不会重启当前桌面。
69
+
70
+ 2026-09-12 验证:Pi→Claude 两个真实子任务分别在不同 worktree 运行,DSH→CodeBuddy 两个真实子任务也在独立 worktree 完成并由 DSH 主会话汇总 `COLLAB_VERIFIED`。恢复测试覆盖持久化身份、原子会话续跑、不重复建任务;Git 测试覆盖脏目录起点、暂存区保留、过期预览拒绝、冲突时不部分应用。Native Protocol 覆盖父子任务归属与原生 MCP 工具卡片,Electron 仅覆盖原生输入框中的协作引用增强。Runtime 保持 Adapter `open()` 返回对象的同一身份,避免原生回调更新到浅拷贝而被活动回合闸门丢弃。
71
71
  ## 统一历史
72
72
 
73
73
  设置 → 会话导入 → 全部历史,支持按标题、目录和会话 ID 搜索、分页、导入并打开。Pi、Claude、Codex 从本机原生历史发现会话;其余 Harness 当前聚合 Host 已管理的历史,并在来源名称上标为「Host 历史」,尚未接入各自 CLI 的外部会话扫描。
@@ -86,4 +86,4 @@ npm run build:native
86
86
  npm run e2e:collaboration -- --lead=pi --worker=pi --cycle
87
87
  ```
88
88
 
89
- 桌面实测:Pi 主 Agent 切换、Agents/会话切页、Claude 提及精确插入(无重复 @)、图标标识、Antigravity 未支持主编排的提示和草稿清理通过。截图与报告在 `output/collaboration-ui/desktop-*.png` 和 `desktop-report.json`。专用子任务卡片的协议投影已验证;尚未完成真实桌面卡片点击跳转验收。
89
+ 桌面实测与隔离增强:Pi 主 Agent 切换、Agents/会话切页、Claude 提及精确插入(无重复 @)、图标标识和草稿清理通过。原生协作卡片已实装「↗ 查看 @agent 会话」跳转子任务 Thread、「🔍 查看产物 Diff」语法高亮展开与「✓ 合并改动到主项目」操作;Worktree 隔离环境已实装补丁冲突结构化指引、`discardWorkspace` 一键丢弃临时分支与 `pushWorkspace` 远程分支推送协议支持。截图与报告在 `output/collaboration-ui/desktop-*.png` 和 `desktop-report.json`。
@@ -0,0 +1,122 @@
1
+ # CodeBuddy、Kiro CLI、Cursor CLI 与其他原生 ACP 接入
2
+
3
+ CodeBuddy、Kiro CLI、Cursor CLI 和 Qoder 使用原生 ACP stdio,并在 `native-acp.js`、
4
+ `acp-interactions.js` 中处理厂商差异。ZCode、Trae 也复用此引擎,但当前只有显式
5
+ ACP 程序配置入口,尚未验证可用桥接程序,不能称为已完成官方原生接入。
6
+ 不替换原生账号、不代理模型供应商、不自动批准工具请求。
7
+
8
+ ## 安装与旧名称兼容
9
+
10
+ | Harness ID | 原生启动 | 可选路径变量 | 安装入口 |
11
+ | --- | --- | --- | --- |
12
+ | `codebuddy` | `codebuddy --acp` | `HARNESS_MIX_CODEBUDDY_EXECUTABLE` | [CodeBuddy CLI](https://www.codebuddy.ai/docs/cli/overview) |
13
+ | `kiro-cli` | `kiro-cli acp --agent-engine v3 --auth-method cli` | `HARNESS_MIX_KIRO_EXECUTABLE` | [Kiro CLI](https://kiro.dev/docs/cli/) |
14
+ | `cursor-cli` | `cursor-agent acp` | `HARNESS_MIX_CURSOR_EXECUTABLE` | [Cursor CLI](https://cursor.com/docs/cli/installation) |
15
+ | `qoder` | `qodercli --acp` / `qoder --acp` | `HARNESS_MIX_QODER_EXECUTABLE` | [Qoder 官方 ACP 文档](https://docs.qoder.com/cli/acp) |
16
+ | `zcode` | 显式指定 ACP 桥接程序,无附加参数 | `HARNESS_MIX_ZCODE_ACP_EXECUTABLE` | [ZCode](https://zcode.z.ai/);本机原生 CLI 仅确认 app-server |
17
+ | `trae` | 显式指定兼容 ACP 程序,无附加参数 | `HARNESS_MIX_TRAE_EXECUTABLE` | [官方 trae-agent](https://github.com/bytedance/trae-agent);未确认 ACP 支持 |
18
+
19
+ Qoder 在 Windows 上识别 npm 包并直接启动官方 JavaScript bundle。ZCode 的
20
+ `app-server --stdio` 使用厂商协议,不能直接填入 ACP 程序路径。旧的 `zcode acp`、
21
+ `traecli acp serve` 缺少官方依据,已移除;未配置桥接时明确显示不可用。
22
+ Trae 官方开源项目的命令名是 `trae-cli`,不代表它具备 ACP 服务模式。
23
+ 本项目不自动安装第三方桥接器,也不复制其凭据同步或默认 yolo 策略。
24
+
25
+ CodeBuddy 优先使用明确指定的路径,再搜索 PATH 和 WorkBuddy 桌面自带的
26
+ CodeBuddy CLI。旧变量 `HARNESS_MIX_WORKBUDDY_EXECUTABLE` 继续有效,新变量优先。
27
+ `workbuddy` 是兼容别名;只注册一个 CodeBuddy 适配器。启动时迁移 Host 任务和
28
+ Harness 切换历史中的旧 ID,保留原生会话 ID、文件位置和对话内容。
29
+ Renderer 读取旧默认模型和分组偏好时同步迁移旧名称。
30
+
31
+ Cursor 在 Windows 上识别官方版本目录并直接运行其 Node bundle。
32
+ 不使用含义不明确的 `agent` 命令,因为它也可能属于 Grok。
33
+ 显式路径无效会报错,不能静默转向其他安装。
34
+
35
+ ## 专用适配
36
+
37
+ | 能力 | CodeBuddy | Kiro CLI | Cursor CLI |
38
+ | --- | --- | --- | --- |
39
+ | 模型/配置 | 原生 model、thought_level、mode;等待确认 | 原生 model、effortLevel;auto 不显示独立 effort | 保留完整模型变体及原生执行模式 |
40
+ | 审批 | 保留原生 optionId 与单次/持久范围 | 原生选项;consent 携带会话/工作区及资源元数据 | 原生 optionId 与作用范围 |
41
+ | 提问 | AskUserQuestion → resolveInterruption;旧 question 回调;失败可重试 | `_kiro/userInput` 文字/选项 | `cursor/ask_question` 单选/多选 |
42
+ | 计划 | ACP plan 投影 | ACP plan 投影 | `cursor/create_plan` 接受/拒绝/取消 |
43
+ | 取消 | 等待取消完成,再关闭、重连、load 同一会话并恢复确认过的配置 | 原生 cancel;超时关闭并报故障 | 原生 cancel;超时关闭并报故障 |
44
+ | 恢复 | session/load;加载期间不重复输出历史 | session/load | session/load |
45
+ | 压缩/fork | 不支持 | 仅调用握手声明的 compact/fork;不伪造检查点 | 不支持 |
46
+ | 用量 | 按原生 model request ID 去重 Token/Credits;标准 ACP 上下文 | 原生上下文百分比、usage 元数据 Credits 去重 | 不声明用量 |
47
+ | 原生历史导入 | JSONL 当前 parent 链,校验 cwd/session/path/大小/环 | 仅现有 Host 历史与原生恢复 | 仅现有 Host 历史与原生恢复 |
48
+
49
+ 共享处理包括:每会话独立进程、会话级 MCP 注入、拒绝并发提交和忙时改配置、
50
+ 30 秒启动/配置/取消超时、忽略其他会话和旧连接事件、工具终态去重、仅在工具
51
+ 成功后投影原生完整 Diff。已知 Cursor 损坏的 diff header 回退保持为工具输出,
52
+ 不猜测文件内容。Credits 保持独立字段,不换算为美元。
53
+
54
+ 多选问题目前通过输入 JSON 字符串数组表达;选项会展示在问题中,提交时按原生
55
+ 选项 ID 校验。CodeBuddy 允许原生提问支持的自定义回答。
56
+
57
+ ## 能力边界
58
+
59
+ - 这是针对本项目接口实现的适配,不是完整移植 codex-host 的插件系统。
60
+ - 原生子 Agent 的独立卡片、后台生命周期与子会话历史浏览尚未实现。
61
+ CodeBuddy 带 parentToolCallId 的子 Agent 内容不会混入父回答。
62
+ - Kiro fork 只读取并校验原生 session.json/messages.jsonl 的最新完整 turn_end,
63
+ 将真实 messageId 传入原生 fork;压缩、tombstone 或缺失边界明确拒绝。
64
+ - Kiro 原生历史导入、Cursor 的内部 SQLite 历史导入未实现;恢复已有 Host
65
+ 任务使用原生 session/load,不读写其私有数据库。
66
+ - CodeBuddy/Kiro/Cursor/Qoder 的图片以 ACP image block 传递,仅在原生握手声明
67
+ `promptCapabilities.image` 时接受;缺失能力时拒绝,不能静默丢图。2026-09-12
68
+ 实机图片回路在 CodeBuddy 通过;Kiro/Cursor 未安装,Qoder 被额度阻断。DSH 和
69
+ OpenClaw 的当前模型明确拒绝图片,属于模型能力限制而非 Host 丢图。
70
+ - 精确消息回退、CodeBuddy/Cursor fork、账号配额查询不声明支持。
71
+ - Kiro autopilot 不伪装为 Host 权限级别;未知扩展请求明确报不支持。
72
+ - 部分 CLI 不提供原生 Diff 或用量,缺失时不从当前文件/估算值补造。
73
+ - CodeBuddy/Kiro/Cursor/Qoder/ZCode/Trae 的 ACP 会话可接收每会话 MCP 定义,
74
+ 但只有本机安装且握手成功的程序才会开放入口;ZCode、Trae 仍需显式兼容 ACP
75
+ 桥接器,不能把其 app-server 或普通 CLI 当成 ACP。
76
+ - DSH 协作主任务走官方 `dsh --profile acp`,由同一 ACP 引擎接收 session-scoped
77
+ MCP;普通 DSH 任务继续使用 Web Remote。Runtime 保持 Adapter `open()` 返回
78
+ 的会话对象身份,避免原生回调更新到浅拷贝而被活动回合闸门丢弃。
79
+
80
+ ## 验证
81
+
82
+ ```powershell
83
+ npm run test:native-acp-depth
84
+ npm run test:kiro-cursor
85
+ npm run test:core-all
86
+ npm run test:native-ui
87
+ npm run e2e:native-acp
88
+ npm run e2e:native
89
+ npm run health:harnesses -- --live
90
+ npm run health:harnesses -- --live --image-only --image=<绝对图片路径>
91
+ ```
92
+
93
+ 深度协议测试使用模拟原生子进程,覆盖取消/重连后继续、配置确认、忙时拒绝、
94
+ 会话隔离、审批原生 ID、提问失败重试、多选、计划拒绝、Kiro 上下文/fork、
95
+ Diff 去重、历史 parent 环和 Credits 去重。这些测试不是模型执行证据。
96
+
97
+ 2026-09-12 实机结果:CodeBuddy 2.132.0 返回 17 个模型和 8 个模式,完成文本
98
+ 回复后关闭进程,session/load 同一原生会话并再次回复成功。此版本当前模型未
99
+ 返回独立思考选项,因此未伪造档位。Kiro/Cursor 未在 PATH 和默认目录发现,
100
+ 真实模型、专用交互以及重启桌面验收待安装登录后完成。日志保存在
101
+ `output/native-acp-live/1789182835967/report.json`(本地构建产物,不提交)。
102
+
103
+ Qoder 1.1.49 实机完成 ACP 初始化、创建会话,返回 1 个模型和 5 个原生模式。
104
+ 文本请求返回账号 Credits 额度耗尽,因此模型回复、恢复和工具执行尚未通过实机验证。
105
+ 日志:`output/native-acp-live/1789187177461/report.json`。
106
+ 新增六种协议配置的模拟进程回归、延迟 ACP 最终事件回归和图片握手拒绝测试;
107
+ ZCode/Trae 的模拟测试只验证共享引擎,不能作为其官方 CLI 已接通的证据。
108
+
109
+ 2026-09-12 全 Harness 健康检查(均在独立临时工作目录执行):文本回路通过
110
+ Pi、DSH、Claude Code、Codex、Grok、CodeBuddy;OpenCode 被账户余额阻断,Qoder
111
+ 被 Credits 额度阻断,OMP、Hermes、Kiro、Cursor 未安装。图片回路通过
112
+ Antigravity、Pi、Claude Code、Codex、Grok、CodeBuddy;DSH/OpenClaw 的当前模型
113
+ 拒绝图片,Qoder/OpenCode 分别被额度/余额阻断。报告:
114
+ `output/harness-health/1789191914230/report.json`(文本)和
115
+ `output/harness-health/1789191791797/report.json`(图片)。
116
+
117
+ ## 参考与图标
118
+
119
+ 协议字段对照了 [codex-host 7cc4db87](https://github.com/BytePioneer-AI/codex-host/tree/7cc4db87fe5e5aa7f232e592a6ff8f0ff96534c9/packages/adapters)
120
+ 的 codebuddy、kiro-cli、cursor-cli 实现及接口说明;其测试结果不视为本项目证据。
121
+ CodeBuddy 和 Cursor 图标取自该提交的官方品牌资源副本,Kiro 沿用仓库已有
122
+ 官方 SVG。品牌标志归原所有者所有,不表示厂商背书。