@harness-mix/cli 0.1.4 → 0.1.6

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 (146) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +26 -96
  3. package/docs/chatgpt-web-sidebar.md +7 -1
  4. package/docs/cross-platform.md +15 -0
  5. package/docs/harness-handoff-design.md +377 -0
  6. package/docs/harness-management.md +28 -1
  7. package/docs/multi-agent-collaboration.md +9 -9
  8. package/docs/native-codex.md +21 -10
  9. package/output/native-build/harness-mix-shim.exe +0 -0
  10. package/output/native-build/renderer-extension.js +2596 -135
  11. package/package.json +20 -10
  12. package/scripts/chatgpt-context-ui-smoke.cjs +16 -0
  13. package/scripts/codex-accounts-test.cjs +81 -0
  14. package/scripts/codex-accounts-ui-smoke.cjs +70 -0
  15. package/scripts/collaboration-test.cjs +8 -3
  16. package/scripts/collaboration-ui-smoke.cjs +40 -26
  17. package/scripts/e2e-integrations.cjs +52 -0
  18. package/scripts/e2e-native-host.cjs +39 -0
  19. package/scripts/handoff-checkpoint-test.cjs +83 -0
  20. package/scripts/install-native.cjs +4 -1
  21. package/scripts/integrations-test.cjs +123 -0
  22. package/scripts/integrations-ui-smoke.cjs +124 -0
  23. package/scripts/native-protocol-test.cjs +180 -5
  24. package/scripts/native-secret-test.cjs +2 -2
  25. package/scripts/native-shim-test.cjs +20 -4
  26. package/scripts/native-sidebar-test.cjs +7 -0
  27. package/scripts/native-skill-roots-test.cjs +90 -0
  28. package/scripts/native-ui-smoke.cjs +58 -2
  29. package/scripts/publish-native-package.cjs +8 -5
  30. package/scripts/support/integrations-mcp-fixture.cjs +15 -0
  31. package/scripts/switch-harness-test.cjs +27 -1
  32. package/scripts/test-live-mentions.cjs +152 -0
  33. package/src/main/adapters/acp.js +3 -3
  34. package/src/main/adapters/antigravity.js +17 -17
  35. package/src/main/adapters/claude.js +50 -10
  36. package/src/main/adapters/codebuddy.js +1 -0
  37. package/src/main/adapters/codex-app-server.js +20 -13
  38. package/src/main/adapters/codex.js +25 -5
  39. package/src/main/adapters/cursor.js +5 -1
  40. package/src/main/adapters/dsh.js +9 -1
  41. package/src/main/adapters/grok.js +7 -3
  42. package/src/main/adapters/hermes.js +8 -0
  43. package/src/main/adapters/kiro.js +2 -1
  44. package/src/main/adapters/managed-mcp.js +25 -0
  45. package/src/main/adapters/native-acp.js +4 -4
  46. package/src/main/adapters/omp.js +11 -0
  47. package/src/main/adapters/openclaw.js +6 -0
  48. package/src/main/adapters/opencode.js +13 -3
  49. package/src/main/adapters/pi.js +5 -0
  50. package/src/main/adapters/qoder.js +1 -0
  51. package/src/main/adapters/trae.js +4 -0
  52. package/src/main/adapters/zcode.js +3 -0
  53. package/src/main/harness-adapter/manifest.js +17 -2
  54. package/src/main/host/collaboration.js +57 -11
  55. package/src/main/host/handoff-access.js +53 -0
  56. package/src/main/host/handoff-checkpoints.js +206 -0
  57. package/src/main/host/handoff-mcp.cjs +38 -0
  58. package/src/main/host/handoff-tools.js +13 -0
  59. package/src/main/host/handoff.js +28 -6
  60. package/src/main/host/integrations.js +339 -0
  61. package/src/main/host/runtime.js +95 -15
  62. package/src/main/host/store.js +4 -4
  63. package/src/main/native/codex-accounts.js +260 -0
  64. package/src/main/native/host.js +1 -1
  65. package/src/main/native/launcher.js +2 -2
  66. package/src/main/native/protocol.js +176 -14
  67. package/src/main/native/redact.js +1 -1
  68. package/src/main/native/rs/crates/shim/src/main.rs +155 -12
  69. package/src/main/native/thread-list.js +3 -0
  70. package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
  71. package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts.map +1 -1
  72. package/src/native-ui/renderer-extension/dist/types/index.d.ts +4 -0
  73. package/src/native-ui/renderer-extension/dist/types/index.d.ts.map +1 -1
  74. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts +2 -0
  75. package/src/native-ui/renderer-extension/dist/types/renderer-agent-picker.d.ts.map +1 -1
  76. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
  77. package/src/native-ui/renderer-extension/dist/types/renderer-chatgpt-context.d.ts +36 -0
  78. package/src/native-ui/renderer-extension/dist/types/renderer-chatgpt-context.d.ts.map +1 -0
  79. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts +1 -0
  80. package/src/native-ui/renderer-extension/dist/types/renderer-codex-account-state.d.ts.map +1 -1
  81. package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts +3 -1
  82. package/src/native-ui/renderer-extension/dist/types/renderer-composer-dom.d.ts.map +1 -1
  83. package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts +53 -0
  84. package/src/native-ui/renderer-extension/dist/types/renderer-harness-handoff.d.ts.map +1 -0
  85. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +11 -0
  86. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
  87. package/src/native-ui/renderer-extension/dist/types/renderer-integrations-client.d.ts +105 -0
  88. package/src/native-ui/renderer-extension/dist/types/renderer-integrations-client.d.ts.map +1 -0
  89. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +7 -1
  90. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
  91. package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts +1 -0
  92. package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts.map +1 -1
  93. package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts +2 -0
  94. package/src/native-ui/renderer-extension/dist/types/settings/accounts-list.d.ts.map +1 -1
  95. package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts +1 -0
  96. package/src/native-ui/renderer-extension/dist/types/settings/accounts-page.d.ts.map +1 -1
  97. package/src/native-ui/renderer-extension/dist/types/settings/integrations-page.d.ts +6 -0
  98. package/src/native-ui/renderer-extension/dist/types/settings/integrations-page.d.ts.map +1 -0
  99. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts +5 -0
  100. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts.map +1 -1
  101. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +8 -4
  102. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
  103. package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
  104. package/src/native-ui/renderer-extension/src/harness-mix-settings.ts +4 -1
  105. package/src/native-ui/renderer-extension/src/index.ts +28 -0
  106. package/src/native-ui/renderer-extension/src/renderer-agent-icon.ts +4 -4
  107. package/src/native-ui/renderer-extension/src/renderer-agent-picker.ts +46 -6
  108. package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +115 -18
  109. package/src/native-ui/renderer-extension/src/renderer-chatgpt-context.ts +87 -0
  110. package/src/native-ui/renderer-extension/src/renderer-codex-account-state.ts +10 -0
  111. package/src/native-ui/renderer-extension/src/renderer-composer-dom.ts +10 -0
  112. package/src/native-ui/renderer-extension/src/renderer-harness-handoff.ts +330 -0
  113. package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +556 -123
  114. package/src/native-ui/renderer-extension/src/renderer-integrations-client.ts +59 -0
  115. package/src/native-ui/renderer-extension/src/renderer-model-client.ts +17 -1
  116. package/src/native-ui/renderer-extension/src/renderer-settings-lifecycle.ts +2 -0
  117. package/src/native-ui/renderer-extension/src/settings/accounts-list.ts +16 -1
  118. package/src/native-ui/renderer-extension/src/settings/accounts-page.ts +32 -3
  119. package/src/native-ui/renderer-extension/src/settings/integrations-page.ts +1474 -0
  120. package/src/native-ui/renderer-extension/src/settings/localization.ts +32 -13
  121. package/src/native-ui/renderer-extension/src/settings/pages.ts +49 -18
  122. package/src/native-ui/renderer-extension/src/settings/shell.css +103 -0
  123. package/src/native-ui/renderer-extension/test/renderer-agent-picker.test.ts +44 -13
  124. package/src/native-ui/renderer-extension/test/renderer-chatgpt-context.test.ts +21 -0
  125. package/src/native-ui/renderer-extension/test/renderer-codex-account-state.test.ts +13 -1
  126. package/src/native-ui/renderer-extension/test/renderer-harness-handoff.test.ts +20 -0
  127. package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +9 -2
  128. package/src/native-ui/renderer-extension/test/settings/localization.test.ts +1 -1
  129. package/src/native-ui/renderer-extension/test/settings/pages.test.ts +77 -8
  130. package/src/native-ui/renderer-extension/test/settings/shell.test.ts +6 -0
  131. package/src/native-ui/shared-contracts/dist/codex-accounts.d.ts +19 -4
  132. package/src/native-ui/shared-contracts/dist/codex-accounts.d.ts.map +1 -1
  133. package/src/native-ui/shared-contracts/dist/codex-accounts.js +2 -0
  134. package/src/native-ui/shared-contracts/dist/codex-accounts.js.map +1 -1
  135. package/src/native-ui/shared-contracts/dist/index.d.ts +2 -2
  136. package/src/native-ui/shared-contracts/dist/index.d.ts.map +1 -1
  137. package/src/native-ui/shared-contracts/dist/index.js +1 -1
  138. package/src/native-ui/shared-contracts/dist/index.js.map +1 -1
  139. package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts +29 -0
  140. package/src/native-ui/shared-contracts/dist/thread-harness-switch.d.ts.map +1 -1
  141. package/src/native-ui/shared-contracts/dist/thread-harness-switch.js +13 -0
  142. package/src/native-ui/shared-contracts/dist/thread-harness-switch.js.map +1 -1
  143. package/src/native-ui/shared-contracts/dist/tsconfig.tsbuildinfo +1 -1
  144. package/src/native-ui/shared-contracts/src/codex-accounts.ts +2 -0
  145. package/src/native-ui/shared-contracts/src/index.ts +8 -1
  146. package/src/native-ui/shared-contracts/src/thread-harness-switch.ts +17 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.5 — 2026-09-13
4
+
5
+ - Added graphical cross-Harness task handoff in the native Codex Desktop composer, with continue, execute-plan, independent-review, and reanalyze modes.
6
+ - Added persistent, hashed handoff checkpoints with bounded redacted conversation, plan, file, Git, test, build, command, and error evidence.
7
+ - Added task-scoped read-only MCP access for capable Harnesses while preserving bounded-summary fallback for other native protocols.
8
+ - Added native Codex account management and Harness-scoped MCP/Skills integration controls.
9
+ - Preserved native ownership of sessions, models, tools, credentials, permissions, and approvals across handoffs.
10
+
3
11
  ## 0.1.3 — 2026-09-13
4
12
 
5
13
  - Added multi-agent collaboration support (@ mentions composer, thread delegation, worktree isolation).
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Harness Mix
2
2
 
3
- macOS/Linux 已加入源码构建与启动适配(待目标系统真机验收);安装方式、Linux 桌面前提和支持边界见 [跨平台指南](docs/cross-platform.md)。
3
+ macOS/Linux 已加入源码构建与启动适配;目标系统的完整桌面验收仍需在对应机器执行。安装方式、Linux 桌面前提和支持边界见 [跨平台指南](docs/cross-platform.md)。
4
4
 
5
5
  <p align="center">
6
6
  <img src="src/assets/brand-harness-mix.png" width="92" alt="Harness Mix logo">
@@ -10,12 +10,14 @@ macOS/Linux 已加入源码构建与启动适配(待目标系统真机验收
10
10
  ⭐ 如果这个项目对你有帮助,请给我们一个 <a href="https://github.com/emo-xiaoyu/harness-mix">Star</a>! ⭐
11
11
  </p>
12
12
 
13
- <p align="center"><strong>Codex 原生 UI,连接多个原生 Coding Harness。</strong></p>
13
+ <p align="center"><strong>Codex 原生 UI,连接多个原生 Coding Harness,并让任务在它们之间无缝接力。</strong></p>
14
14
 
15
15
  <p align="center">
16
- <a href="LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg"></a>
17
- <img alt="UI" src="https://img.shields.io/badge/UI-Codex%20Desktop-412991.svg">
18
- <img alt="Platform" src="https://img.shields.io/badge/platform-Windows-0078D4.svg">
16
+ <a href="LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg"></a>
17
+ <img alt="UI" src="https://img.shields.io/badge/UI-Codex%20Desktop-412991.svg">
18
+ <img alt="Windows" src="https://img.shields.io/badge/platform-Windows-0078D4.svg">
19
+ <img alt="macOS" src="https://img.shields.io/badge/platform-macOS-555555.svg">
20
+ <img alt="Linux" src="https://img.shields.io/badge/platform-Linux-FCC624.svg">
19
21
  </p>
20
22
 
21
23
  <p align="center"><strong>当前注册的 Harness(16 个)</strong></p>
@@ -66,16 +68,29 @@ Harness Mix 是接入官方 Codex Desktop 原生界面的本地内核。它通
66
68
  - 在 Codex Desktop 原生输入框中选择 Harness 并发起会话。
67
69
  - 流式呈现回答、思考、命令执行、工具调用、文件变更和上下文压缩。
68
70
  - 调用每个 Harness 原生提供的模型、权限、上下文用量和快捷指令。
69
- - 会话中原地切换 Harness(`/switch <Harness 名> [备注]` `codexhost/thread/harness/switch`):会话历史与文件现场保留在 Host 线程上,切换后首轮自动携带一次性上下文信封;切回旧 Harness 时按其原生机制(Pi `--session` / Claude `resume`)恢复原会话。
71
+ - 会话中可从原生 Harness 选择器图形化“接力当前任务”:选择目标、接力模式、交接内容和可选说明后确认;会话历史与文件现场保留在 Host 线程上。Host 会持久化脱敏的接力检查点,首轮发送紧凑摘要;支持原生 MCP 的 Harness 还可按当前任务作用域读取历史、计划、文件与测试证据。`/switch <Harness 名> [备注]` 保留为键盘入口;切回旧 Harness 时按其原生机制(Pi `--session` / Claude `resume`)恢复原会话。
70
72
  - 原生 Diff、审批与提问组件直接渲染,审批路由回原生 Harness,不代替用户作出权限决定。
71
73
  - CodeBuddy、Kiro 和 Cursor 使用原生 ACP 加厂商专用接口:提问、计划确认、配置确认、取消恢复、上下文与历史按各自协议处理。功能和验证范围见下表,不将通用 ACP 能力视为所有 CLI 都已支持。
72
- - 通过 Adapter 注册新 Harness,UI 侧无需理解厂商协议。
74
+ - 通过 Adapter 注册新 Harness,UI 侧无需理解厂商协议。
75
+ - 原生设置中的「MCP」和「Skills」是独立页面:MCP 使用服务器列表与详情编辑流程,Skills 支持把 Markdown 文件或完整技能文件夹直接拖入安装;配置在下一次原生会话打开时生效,凭据和审批继续由原生 Harness 管理。
73
76
 
74
77
  <p align="center">
75
78
  <img src="docs/images/codex-desktop-session.png" width="960" alt="Codex Desktop 原生会话中的 Harness Mix">
76
79
  </p>
77
-
78
- ## 原生接入
80
+
81
+ ## 特色功能:跨 Harness 任务接力
82
+
83
+ 一个 Harness 负责分析,另一个执行方案,再切回原 Harness 复核——整个过程都留在同一个 Codex Desktop 原生任务窗口中。点击输入框旁带接力角标的 Harness 图标,选择目标 Harness 和接力方式即可,不需要复制 Prompt、另开终端或重新整理上下文。
84
+
85
+ - **现场不丢**:保留任务标题、对话记录、工作目录、未提交文件、Git 状态和 Review 记录。
86
+ - **上下文可追溯**:Host 创建持久化、带内容哈希的接力检查点;目标先收到紧凑摘要,支持原生 MCP 时还可按需读取历史、计划、文件与脱敏测试证据。
87
+ - **四种接力方式**:继续执行、执行上一方案、独立审查、重新分析,可在确认弹窗中选择要交接的内容并补充说明。
88
+ - **可以切回来**:每个 Harness 的原生 Session、模型和选项独立保存;切回时使用其原生恢复能力继续原会话。
89
+ - **原生安全边界不变**:不迁移账号凭据、审批决定、待审批状态、原始 Tool Call ID 或私有协议对象;目标 Harness 必须重新核对真实工作区并自行发起权限请求。
90
+
91
+ 不支持按需读取工具的 Harness 会明确退化为有界摘要,不会伪装成完整上下文迁移。完整流程、数据结构和验收边界见 [跨 Harness 接力设计](docs/harness-handoff-design.md) 与 [Harness 管理说明](docs/harness-management.md)。
92
+
93
+ ## 原生接入
79
94
 
80
95
  通过 Codex Desktop 内的 Harness 选择器统一查看连接、筛选模型和保存每个 Harness 的新对话默认模型。具体流程与原生边界见 [Harness 管理说明](docs/harness-management.md)。
81
96
 
@@ -104,78 +119,9 @@ CodeBuddy、Kiro CLI、Cursor CLI、Qoder、ZCode 和 Trae 均已接入默认选
104
119
 
105
120
  能力只在 Adapter 的 `manifest` 中声明。界面根据真实能力显示入口,不靠 Harness 名称猜测功能;厂商特有字段会保留在原生引用和载荷中。
106
121
 
107
- ## 架构
108
-
109
- ```mermaid
110
- flowchart TB
111
- Desktop[Codex Desktop 原生 UI] --> Shim[Harness Mix CLI Shim]
112
- Shim --> Host[原生 Host 入口 src/main/native]
113
- Host --> Runtime[Host Runtime]
114
- Runtime --> Core[Protocol Core]
115
- Runtime --> Store[(Thread and session store)]
116
- Runtime --> Registry[Adapter registry]
117
- Registry --> Antigravity[Antigravity CLI]
118
- Registry --> Codex[Codex app-server]
119
- Registry --> Pi[Pi RPC]
120
- Registry --> OMP[Oh My Pi RPC]
121
- Registry --> Claude[Claude Agent SDK]
122
- Registry --> DSH[DSH Web Remote]
123
- Registry --> OpenCode[OpenCode Server HTTP / SSE]
124
- Registry --> Grok[Grok native stdio + vendor extensions]
125
- Registry --> OpenClaw[OpenClaw Gateway loopback WS]
126
- Registry --> Hermes[Hermes ACP stdio]
127
- Registry --> Qoder[Qoder ACP stdio]
128
- Registry --> CodeBuddy[CodeBuddy ACP + native extensions]
129
- Registry --> Kiro[Kiro ACP + native extensions]
130
- Registry --> Cursor[Cursor ACP + native extensions]
131
- Registry --> ZCode[ZCode 显式 ACP 桥接入口 未验证]
132
- Registry --> Trae[Trae 显式 ACP 入口 未验证]
133
- ```
134
-
135
- ```text
136
- src/
137
- ├─ main/
138
- │ ├─ adapters/ # 每个 Harness 的原生适配器
139
- │ ├─ harness-adapter/ # Manifest、能力与适配器契约
140
- │ ├─ host/ # 编排、恢复、持久化与事件投影
141
- │ ├─ native/ # 原生模式:Launcher、Shim、Host 入口、协议桥
142
- │ └─ protocol-core/ # Thread / Turn / Item 统一语义
143
- ├─ native-ui/
144
- │ ├─ renderer-extension/ # 注入 Codex Desktop 的渲染扩展(选择器、模型目录)
145
- │ ├─ desktop-control/ # CDP 控制器与请求桥
146
- │ └─ shared-contracts/ # 渲染侧与内核共享的协议契约
147
- └─ assets/icons/ # Harness 与模型图标(编译期嵌入)
148
- ```
149
-
150
- 新增 Harness 时,实现同形 Adapter 并注册到 `src/main/adapters/index.js`。核心形态如下:
151
-
152
- ```js
153
- module.exports = {
154
- manifest: {
155
- id,
156
- name,
157
- icon,
158
- capabilities: { streaming, tools, approvals, models, resume, fork, usage }
159
- },
160
- create(emit) {
161
- return {
162
- inspect,
163
- open,
164
- send,
165
- cancel,
166
- close,
167
- respond,
168
- listModelsFor,
169
- setModel,
170
- fork
171
- };
172
- }
173
- };
174
- ```
175
-
176
122
  ## 本地运行
177
123
 
178
- 开发环境需要 Windows、近期 Node.js LTS 和 npm。应用不会读取或保存 Harness 的账户密钥,请先在对应的原生 CLI 中完成安装与登录。
124
+ 开发环境需要 Windows、macOS 或 Linux,近期 Node.js LTS 和 npm。应用不会读取或保存 Harness 的账户密钥,请先在对应的原生 CLI 中完成安装与登录;平台前提和真机验收范围见 [跨平台指南](docs/cross-platform.md)。
179
125
 
180
126
  ```powershell
181
127
  git clone https://github.com/emo-xiaoyu/harness-mix.git
@@ -241,22 +187,6 @@ npm run e2e:codex
241
187
 
242
188
  部分 E2E 会启动真实 Harness,可能需要本机安装、登录或模型额度。测试生成物写入 `output/`,不应提交到仓库。
243
189
 
244
- ## 设计原则
245
-
246
- 1. **原生能力优先**:Adapter 翻译协议,不重新实现 Harness。
247
- 2. **诚实声明能力**:只有完成接线和验证的能力才进入 `manifest`。
248
- 3. **惰性恢复**:打开历史任务只读取本地投影,发送新消息时才恢复原生进程。
249
- 4. **可回放事件**:Core Event 保持稳定顺序,可用于恢复、投影和确定性校验。
250
- 5. **凭据隔离**:账号、令牌、沙箱和权限决定由原生程序管理。
251
-
252
- ## 项目状态
253
-
254
- - [内核迁移状态](CORE-MIGRATION-STATUS.md)
255
- - [下一步计划](NEXT-STEPS.md)
256
- - [Codex Desktop 原生接入说明](docs/native-codex.md)
257
-
258
- Harness Mix 参考了 [codex-host](https://github.com/BytePioneer-AI/codex-host) 的插件化组织方式,并使用 [OpenAI Codex](https://github.com/openai/codex) 官方 app-server 协议完成 Codex 原生接入。
259
-
260
- ## License
190
+ ## License
261
191
 
262
192
  Harness Mix 基于 [Apache License 2.0](LICENSE) 发布。第三方组件仍适用各自的许可证;归属信息见 [NOTICE](NOTICE)。
@@ -1,6 +1,6 @@
1
1
  # ChatGPT 网页侧边对话
2
2
 
3
- > 历史设计记录:当前 Harness Mix 原生模式不包含下文所述的 `side-chat` / `web-chat` 实现,相关源码和 `smoke:web-chat` 入口已不在当前仓库中。本文仅保留方案边界,不能作为当前功能或可执行验收说明。
3
+ > `side-chat` / `web-chat` 是历史设计,相关源码和 `smoke:web-chat` 入口已不在当前仓库中。当前原生模式只增强 Codex Desktop 自带的 Quick chat,提供“添加到会话”上下文桥。
4
4
 
5
5
  ## 官方实现参考
6
6
 
@@ -20,6 +20,12 @@
20
20
 
21
21
  “添加到当前 Harness”优先导入网页选中文字;未选择时读取当前页面已加载的用户与助手消息文本,附带页面标题和来源链接。只填入草稿,由用户点击发送。图片附件不会自动下载或导入;网页未加载的历史消息也不会导入。网页结构变化导致读取失败时会显示提示,可选中文字重试。
22
22
 
23
+ 当前实现位于 `src/native-ui/renderer-extension/src/renderer-chatgpt-context.ts`。Quick chat 标题栏的“添加到会话”优先使用面板内选中文字,否则读取当前已打开聊天中明确标记为 user/assistant 的已加载消息;内容经脱敏、最多 12 条/24000 字符截断后,作为“不可信历史资料”写入当前主 Composer 草稿。只写草稿,不自动发送,同一草稿只允许一条引用。
24
+
25
+ - 添加到其他 Harness:发送时由当前 Harness 创建/继续它自己的原生 Session,使用该 Harness 的模型、工具、权限和账号额度;不继承 ChatGPT 的会话 ID、系统提示或工具状态。
26
+ - 添加到 Codex:发送时由当前 Composer 绑定的 Codex 账号处理并消耗该账号额度;同样只是上下文引用,不把 ChatGPT conversation 恢复成 Codex Thread。新任务使用 Composer 当前选择的账号,旧任务保持原账号。
27
+ - 两种目标共用原生 Composer 和同一份上下文包。发送前可用现有 Harness/账号选择器确认目标,Quick chat 不增加第二套会话 UI。
28
+
23
29
  登录和模型选择使用网站原生界面。浏览器会话由 Electron 管理;应用不读取、导出或代理 Cookie、Token。远程页面启用 sandbox、contextIsolation,关闭 nodeIntegration,不注入本地 IPC preload。登录弹窗使用相同浏览器会话。
24
30
 
25
31
  实现:`src/main/side-chat/web.js`、`src/renderer/web-chat.js`、`src/renderer/web-chat.css`。原 app-server 侧边模块保留在源码中,但生产入口和 preload 已停止接入它。
@@ -71,3 +71,18 @@ npm start -- --no-update
71
71
  CI 增加 Windows/macOS/Linux 的 Node 22/24 内核测试和本机构建,真实 Shim fixture 检查路由、Unicode、带空格参数、环境变量及 EOF;这些不需要账户。配置 CI 不等于已执行 CI。当前 Windows 开发机不能代替 macOS/Linux 真机结果。
72
72
 
73
73
  在每种目标 OS/CPU 上运行 `npm run check`、`npm run test:core-all`、`npm run build:native`、`npm run test:platform`、`npm run test:shim`、`npm run e2e:native`,再启动真实桌面,逐个验证所需 Harness 的模型列表、Thinking、流式工具输出、原生审批、取消、历史恢复及退出清理。记录 OS、CPU、桌面版本和证据后,才能增加该平台的 `desktop-e2e` 记录。后续发布矩阵需要覆盖 macOS Intel/Apple Silicon、Linux x64/arm64,不能用单个平台的构建文件混发。
74
+
75
+ ## Native npm 包发布
76
+
77
+ 平台包的名字固定为 `@harness-mix/native-<platform>-<arch>`。在目标机器完成构建和 Shim fixture 后,从仓库根目录执行:
78
+
79
+ ```sh
80
+ node scripts/publish-native-package.cjs darwin arm64 --publish
81
+ node scripts/publish-native-package.cjs darwin x64 --publish
82
+ node scripts/publish-native-package.cjs linux x64 --publish
83
+ node scripts/publish-native-package.cjs linux arm64 --publish
84
+ node scripts/publish-native-package.cjs win32 x64 --publish
85
+ node scripts/publish-native-package.cjs win32 arm64 --publish
86
+ ```
87
+
88
+ 脚本默认检查目标二进制是否存在,再生成带 `os`/`cpu` 限制的包;本次可用 `--source-only` 发布平台元数据占位包,安装时会提示目标机器执行 `npm run build:native`。主包通过 `optionalDependencies` 选择平台包。当前已发布 `@harness-mix/native-win32-x64@0.1.4`,其余目标先发布 source-only `0.1.4`,正式二进制完成后必须升级版本,不能覆盖同一 npm 版本。
@@ -0,0 +1,377 @@
1
+ # Harness 跨会话任务接力设计
2
+
3
+ > 实施状态(2026-09-13):P0–P4 已在当前工作区落地,包括持久化检查点、脱敏证据、四种图形化模式、受当前任务约束的只读 MCP 查询,以及 `checkpoint-created → verifying → active/failed` 状态。P5 已完成脚本级链路与真实 Electron 组件渲染,尚未重启用户正在运行的 Codex Desktop 做 A → B → A 人工验收。
4
+
5
+ ## 1. 背景
6
+
7
+ Harness Mix 支持在同一个 Codex Desktop 原生任务窗口中使用不同的 Coding Harness。典型场景包括:
8
+
9
+ - Harness A 完成问题分析,由 Harness B 继续编码。
10
+ - Harness A 给出解决方案,由 Harness B 执行方案。
11
+ - Harness A 完成修改,由 Harness B 独立审查。
12
+ - 当前 Harness 暂停、不可用或额度不足,切换其他 Harness 继续任务。
13
+ - 完成阶段性工作后切回原 Harness 复核。
14
+
15
+ 任务接力的目标不是简单切换模型,也不是创建一个互不相关的新会话,而是在保留任务窗口、对话记录和文件现场的前提下,更换继续执行任务的原生 Harness。
16
+
17
+ ## 2. 设计目标
18
+
19
+ 任务接力需要满足以下目标:
20
+
21
+ 1. 保留同一个 Harness Mix 任务窗口、标题和可见对话历史。
22
+ 2. 保留工作目录、文件变更、Git 状态和 Review 记录。
23
+ 3. 让目标 Harness 获得足够的任务语义和验证证据。
24
+ 4. 支持以后切回原 Harness,并恢复其原生会话。
25
+ 5. 不复制或代理账号凭据。
26
+ 6. 不迁移审批决定、待审批状态或私有工具状态。
27
+ 7. 不把不同 Harness 的工具调用协议强行互相转换。
28
+ 8. 所有交互继续在 Codex Desktop 原生界面中呈现,不增加第二套任务 UI。
29
+
30
+ ## 3. 当前实现
31
+
32
+ 当前实现采用“Host 线程保留 + 一次性上下文信封”的方式。
33
+
34
+ ### 3.1 切换过程
35
+
36
+ 切换时:
37
+
38
+ 1. 确认当前任务没有正在执行的回合、待结算的文件变更或正在建立的 Harness 连接。
39
+ 2. 关闭当前 Harness 的原生进程。
40
+ 3. 将当前 Harness 的原生 Session ID、会话文件、模型和选项写入 `harnessChain`。
41
+ 4. 将任务的当前执行者切换为目标 Harness。
42
+ 5. 如果目标 Harness 以前执行过该任务,恢复它原来的原生 Session;否则创建新的原生 Session。
43
+ 6. 创建 `pendingHandoff`,等待用户发送下一条真实消息。
44
+ 7. 下一条消息发送时注入隐藏的 `[Harness Mix handoff]` 上下文信封。
45
+ 8. 信封成功发送后清除 `pendingHandoff`。
46
+
47
+ `/switch <Harness 名> [备注]` 仍可作为键盘入口;图形入口位于任务输入框旁的 Harness 选择器中。
48
+
49
+ ### 3.2 当前交接内容
50
+
51
+ 当前上下文信封包含:
52
+
53
+ - 任务标题和工作目录。
54
+ - 消息总数。
55
+ - 最近最多 10 条用户或助手消息,并保持真实先后顺序。
56
+ - 总文本预算最多 24,000 字符。
57
+ - 普通消息最多保留 4,000 字符。
58
+ - 最新一条助手方案最多保留 12,000 字符。
59
+ - 最近计划。
60
+ - 最多 20 个变更文件。
61
+ - 用户填写的交接说明。
62
+
63
+ 目标 Harness 被明确要求使用自己的工具检查真实文件状态,再继续修改。
64
+
65
+ ### 3.3 当前不会传递的内容
66
+
67
+ 当前实现不会向目标 Harness 传递:
68
+
69
+ - 原始工具调用栈。
70
+ - Tool Call ID、Interaction ID 或审批 ID。
71
+ - Shell 和其他工具的完整原始输出。
72
+ - 待审批、待回答或尚未完成的交互状态。
73
+ - 原 Harness 的私有内存和私有协议状态。
74
+ - 凭据、令牌、账号密钥或敏感环境变量。
75
+
76
+ 如果测试结果或错误信息已经写入原 Harness 的最终回答,它会作为助手消息的一部分进入交接上下文;如果信息只存在于工具卡片中,则当前不会完整传递。
77
+
78
+ ## 4. 当前方案的局限
79
+
80
+ 一次性 Prompt 信封实现简单,但存在以下限制:
81
+
82
+ - 对话较长时必须截断,无法保证所有历史都进入目标上下文。
83
+ - 工具结果主要依赖原 Harness 是否在最终回答中主动总结。
84
+ - 大量上下文一次性注入会占用目标 Harness 的上下文窗口。
85
+ - 目标 Harness 无法按需获取某条历史、某个测试结果或某个文件证据。
86
+ - 信封发送后即清除,缺少可重复查询和审计的交接对象。
87
+ - 仅靠自然语言摘要难以稳定表达计划状态、错误来源和验证结果。
88
+
89
+ ## 5. 推荐方案:持久化接力检查点
90
+
91
+ 推荐将任务接力升级为:
92
+
93
+ > Host 持久化的 Handoff Checkpoint + 紧凑首轮摘要 + 按需读取上下文和证据。
94
+
95
+ 切换时不再只生成临时 Prompt,而是创建一份不可变、可审计的接力检查点。目标 Harness 首轮收到紧凑摘要,并可按需读取详细信息。
96
+
97
+ ### 5.1 核心流程
98
+
99
+ ```text
100
+ 源 Harness
101
+
102
+ Host 创建 Handoff Checkpoint
103
+ ├─ 任务目标与约束
104
+ ├─ 决策和计划状态
105
+ ├─ 对话索引
106
+ ├─ 文件与 Diff 证据
107
+ ├─ 测试和错误证据
108
+ └─ 来源与内容哈希
109
+
110
+ 切换到目标 Harness
111
+
112
+ 目标 Harness 接收紧凑摘要
113
+
114
+ 目标 Harness 按需读取历史或证据
115
+
116
+ 目标 Harness 核对工作区后继续执行
117
+ ```
118
+
119
+ ### 5.2 建议的数据结构
120
+
121
+ ```json
122
+ {
123
+ "checkpointId": "handoff-...",
124
+ "threadId": "thread-...",
125
+ "sourceHarnessId": "claude-code",
126
+ "targetHarnessId": "pi",
127
+ "createdAt": 1789300000000,
128
+ "intent": "execute-plan",
129
+ "note": "按上一位给出的方案继续执行",
130
+ "task": {
131
+ "title": "修复登录模块",
132
+ "cwd": "E:/project",
133
+ "objective": "...",
134
+ "constraints": ["..."],
135
+ "decisions": ["..."]
136
+ },
137
+ "plan": {
138
+ "completed": ["..."],
139
+ "inProgress": ["..."],
140
+ "pending": ["..."]
141
+ },
142
+ "conversationRefs": [
143
+ { "messageId": "...", "role": "assistant", "digest": "..." }
144
+ ],
145
+ "fileState": {
146
+ "gitHead": "...",
147
+ "diffDigest": "...",
148
+ "changedFiles": ["src/login.js"]
149
+ },
150
+ "evidenceRefs": ["evidence-1", "evidence-2"],
151
+ "unresolved": ["..."],
152
+ "contentDigest": "..."
153
+ }
154
+ ```
155
+
156
+ 该对象应保存在 Host 的独立持久化存储中,不写入用户项目目录,也不要求某个 Harness 自己维护。
157
+
158
+ ## 6. 标准化证据记录
159
+
160
+ 工具调用不应原样迁移,但可以转换为有界、脱敏、只读的证据记录。
161
+
162
+ ```json
163
+ {
164
+ "evidenceId": "evidence-1",
165
+ "kind": "test",
166
+ "sourceHarnessId": "claude-code",
167
+ "command": "npm run test:core-all",
168
+ "exitCode": 0,
169
+ "summary": "核心测试全部通过",
170
+ "stdoutExcerpt": "...",
171
+ "stderrExcerpt": "",
172
+ "files": [],
173
+ "createdAt": 1789300000000,
174
+ "contentDigest": "..."
175
+ }
176
+ ```
177
+
178
+ ### 6.1 建议保留的证据
179
+
180
+ - 测试命令、退出码和结果摘要。
181
+ - 构建命令、退出码和关键诊断。
182
+ - 有界、脱敏后的 stdout/stderr 片段。
183
+ - Git 状态和 Diff 摘要。
184
+ - 文件变更路径与内容哈希。
185
+ - 未解决错误及其来源。
186
+ - 只读检查结果。
187
+
188
+ ### 6.2 明确禁止迁移的内容
189
+
190
+ - 凭据、令牌和敏感环境变量。
191
+ - 原生审批结果或待审批状态。
192
+ - 可重放的 Tool Call ID 和 Interaction ID。
193
+ - 未完成操作的自动重试指令。
194
+ - 原 Harness 专用的内部对象或协议帧。
195
+ - 未经脱敏的完整环境信息。
196
+
197
+ 证据内容需要经过统一脱敏和大小限制,并标记为来自历史会话的不可信数据。
198
+
199
+ ## 7. 按需上下文读取
200
+
201
+ 目标 Harness 不需要一次性接收全部历史。Host 可以提供只读查询能力:
202
+
203
+ - `handoff/get`:读取检查点摘要。
204
+ - `handoff/conversation/list`:分页读取相关对话。
205
+ - `handoff/evidence/list`:列出测试、错误和构建证据。
206
+ - `handoff/evidence/read`:读取指定证据。
207
+ - `handoff/files/list`:读取文件变化和 Diff 摘要。
208
+ - `handoff/plan/read`:读取结构化计划状态。
209
+
210
+ 具体传输方式应按 Harness 的真实能力选择:
211
+
212
+ - 支持原生 MCP 的 Harness:提供只读、当前任务授权的本地 MCP 工具。
213
+ - 支持其他原生扩展协议的 Harness:通过对应 Adapter 映射只读读取能力。
214
+ - 不支持按需工具的 Harness:退化为有界的一次性上下文信封,并明确声明限制。
215
+
216
+ 不能假定所有 Harness 都支持同一种工具协议。
217
+
218
+ ## 8. 图形交互设计
219
+
220
+ ### 8.1 入口
221
+
222
+ 已由 Harness Mix 管理的任务,在输入框旁当前 Harness 图标上显示接力角标。点击后,选择其他可用 Harness。
223
+
224
+ ### 8.2 接力确认弹窗
225
+
226
+ 弹窗建议包含:
227
+
228
+ - 当前 Harness → 目标 Harness。
229
+ - 接力模式。
230
+ - 可选交接说明。
231
+ - 将要交接的内容预览。
232
+ - 当前回合运行状态。
233
+ - 取消和确认接力按钮。
234
+
235
+ ### 8.3 接力模式
236
+
237
+ 建议提供四种模式:
238
+
239
+ | 模式 | 行为 |
240
+ | --- | --- |
241
+ | 继续执行 | 沿用当前目标、计划和未完成步骤 |
242
+ | 执行上一方案 | 优先携带最新方案、待办和验证要求 |
243
+ | 独立审查 | 保留证据,但要求目标 Harness 重新检查结论 |
244
+ | 重新分析 | 重点携带目标和文件现场,弱化上一 Harness 的结论 |
245
+
246
+ ### 8.4 内容预览
247
+
248
+ 用户可查看或选择是否包含:
249
+
250
+ - 最新方案。
251
+ - 近期对话。
252
+ - 当前计划。
253
+ - 测试和构建证据。
254
+ - 文件变更摘要。
255
+ - 未解决错误。
256
+
257
+ 凭据、审批和私有工具状态不应出现在可选项中,因为它们始终禁止迁移。
258
+
259
+ ## 9. 目标 Harness 的接管确认
260
+
261
+ 目标 Harness 不应直接相信历史数据。建议在开始编辑前完成接管确认:
262
+
263
+ 1. 读取接力摘要。
264
+ 2. 检查当前工作目录。
265
+ 3. 检查 Git 状态和 Diff。
266
+ 4. 核对关键文件和未完成计划。
267
+ 5. 报告接管成功,或说明检查点与真实文件状态之间的差异。
268
+
269
+ Host 可将接力状态表示为:
270
+
271
+ ```text
272
+ checkpoint-created → target-opening → verifying → active
273
+ ↘ failed
274
+ ```
275
+
276
+ 接管失败时保留检查点和原 Harness 会话引用,允许用户切回或更换其他 Harness。
277
+
278
+ ## 10. 原生所有权与安全边界
279
+
280
+ 任务接力不能改变 Harness Mix 的原生所有权原则:
281
+
282
+ - 每个 Harness 继续拥有自己的原生 Session、模型调用和工具执行。
283
+ - 每个 Harness 继续使用自己的账号和凭据存储。
284
+ - 权限请求由目标 Harness 按自己的协议重新发起。
285
+ - Host 不复制审批结果,不自动批准任何请求。
286
+ - Host 只保存非敏感任务检查点和脱敏证据。
287
+ - 历史文本、证据和摘要统一标记为不可信数据,不能提升为高优先级指令。
288
+ - 目标 Harness 必须以真实文件状态为最终依据。
289
+
290
+ ## 11. 官方 Codex 的特殊边界
291
+
292
+ Codex Desktop 中的“官方原生 Codex”任务由官方 app-server 直接拥有,不经过 Harness Mix HostRuntime。Harness Mix 无法诚实地原地更换这种线程的执行者。
293
+
294
+ 可支持的方式是“一键克隆为 Harness Mix 管理任务”:
295
+
296
+ 1. 读取允许访问的任务上下文。
297
+ 2. 创建新的 Harness Mix Host 任务。
298
+ 3. 创建首个 Handoff Checkpoint。
299
+ 4. 在原生界面中打开新任务。
300
+
301
+ 这种方式可以在交互上接近接力,但底层是新任务,界面必须明确提示,不能伪装成原官方线程。
302
+
303
+ 使用 Harness Mix 管理的 `Codex(协作)` 时,可以参与真正的同任务跨 Harness 接力。
304
+
305
+ ## 12. 当前实现与推荐方案对比
306
+
307
+ | 当前实现 | 推荐实现 |
308
+ | --- | --- |
309
+ | 一次性 Prompt 信封 | 持久化 Handoff Checkpoint |
310
+ | 固定截取近期文本 | 紧凑摘要加按需分页读取 |
311
+ | 传递变更文件清单 | 传递 Diff 摘要、哈希和来源 |
312
+ | 工具结果依赖最终回答 | 标准化、脱敏的证据记录 |
313
+ | 信封发送后清除 | 检查点可审计、可重复查询 |
314
+ | 新 Harness 直接继续 | 先核对工作区并确认接管 |
315
+ | 单一接力行为 | 继续、执行方案、审查、重新分析四种模式 |
316
+
317
+ ## 13. 分阶段实施计划
318
+
319
+ ### P0:持久化接力基础
320
+
321
+ - 定义 `HandoffCheckpoint` 和 `HandoffEvidence` 数据结构。
322
+ - 增加独立、串行化的 Host 存储。
323
+ - 在切换时生成不可变检查点。
324
+ - 保留当前一次性信封作为兼容投影。
325
+ - 使用稳定内容哈希支持去重和审计。
326
+
327
+ ### P1:证据归一化
328
+
329
+ - 从 Core Item 中抽取测试、命令、错误和文件证据。
330
+ - 统一脱敏、截断和大小限制。
331
+ - 禁止保存凭据、审批状态和可重放工具 ID。
332
+ - 增加证据来源与内容哈希。
333
+
334
+ ### P2:图形化模式与预览
335
+
336
+ - 在接力弹窗中增加四种接力模式。
337
+ - 增加“将要交接的内容”预览。
338
+ - 展示运行中、检查中、接管成功和失败状态。
339
+ - 保持所有 UI 位于现有原生任务界面。
340
+
341
+ ### P3:按需读取能力
342
+
343
+ - 实现 Host 侧只读 Handoff API。
344
+ - 对支持原生 MCP 的 Harness 提供受限读取工具。
345
+ - 为其他 Adapter 提供能力映射或明确降级。
346
+ - 增加分页、权限校验和当前任务作用域限制。
347
+
348
+ ### P4:接管确认与恢复
349
+
350
+ - 目标 Harness 首轮执行确定性工作区核对。
351
+ - 记录目标接管确认和差异。
352
+ - 接管失败时支持重试、切回或更换目标。
353
+ - 重启后保留检查点,但不自动重放可能产生副作用的操作。
354
+
355
+ ### P5:真实桌面验收
356
+
357
+ - Harness A 给出长方案,Harness B 完整接收并执行。
358
+ - Harness A 产生测试失败证据,Harness B 按需读取并修复。
359
+ - Harness B 修改文件后切回 Harness A 审查。
360
+ - 验证运行中阻止接力、不可用 Harness、接管失败和重启恢复。
361
+ - 验证凭据、审批与原始工具 ID 从未进入检查点。
362
+ - 在真实重启后的 Codex Desktop 中验证选择、弹窗、确认、首轮发送和切回流程。
363
+
364
+ ## 14. 验收标准
365
+
366
+ 推荐方案完成后,应满足:
367
+
368
+ - 用户不需要输入命令即可完成任务接力。
369
+ - 任务窗口、标题、对话和文件现场保持不变。
370
+ - 最新长方案不会因普通单轮截断而丢失关键内容。
371
+ - 目标 Harness 可以按需读取历史和标准化证据。
372
+ - 工具调用协议和审批状态不会跨 Harness 迁移。
373
+ - 接力检查点可持久化、查询、校验和审计。
374
+ - 不支持按需读取的 Harness 会明确降级,不静默丢失能力。
375
+ - 切回旧 Harness 时恢复其原生会话和模型选项。
376
+ - 所有凭据、权限和审批继续由各原生 Harness 所有。
377
+ - 真实桌面完成 A → B → A 的端到端接力验证。
@@ -18,7 +18,9 @@ CodeBuddy 的旧名称 Workbuddy 自动兼容,已有原生会话 ID 不变。
18
18
  | DeepSeek Harness | 原生 Web Remote 模型目录中的供应商 | 在独立、安全隔离的应用窗口中打开 DSH 原生管理页面,进入设置管理供应商 |
19
19
  | CodeBuddy / Kiro CLI / Cursor CLI | 可执行文件版本检测;打开会话后读取原生目录 | 在各自 CLI 完成原生登录,再刷新检测;不读取或复制登录凭据 |
20
20
 
21
- Pi / DSH 显示「已配置」而非「已登录」,目录存在不能证明凭据通过在线验证。登录与配置仍使用原生程序自己的账号存储,Harness Mix 不复制账号密钥。当前使用各原生程序的本机账号环境,不提供独立多账号池。
21
+ Pi / DSH 显示「已配置」而非「已登录」,目录存在不能证明凭据通过在线验证。登录与配置仍使用原生程序自己的账号存储,Harness Mix 不复制账号密钥。Codex 例外地支持多个原生隔离档案:默认账号继续使用官方 Desktop 的 `CODEX_HOME`,附加账号各自由 Codex app-server 在独立 `CODEX_HOME` 内完成设备码登录、令牌刷新与额度读取;Harness Mix 只保存档案 ID、显示名和活动选择。
22
+
23
+ 切换 Codex 账号只作用于下一条新任务,不会改写正在运行或已经创建的任务。附加账号的新任务通过 Codex Adapter 固定到创建时的账号档案,因此可以在编辑器账号菜单中无感换号,同时在「账号」设置页并行查看各账号的 5 小时/7 天额度和刷新时间。
22
24
 
23
25
  修改登录前会检查该 Harness 是否有运行中的任务。Codex 登录连接保留至完成、取消或五分钟超时;关闭设置不会取消浏览器登录,应用退出会取消待完成的登录。
24
26
 
@@ -31,14 +33,39 @@ Pi / DSH 显示「已配置」而非「已登录」,目录存在不能证明
31
33
  - 选择「跟随原生默认」可清除 Harness Mix 的默认模型覆盖。
32
34
  - 配置或登录完成后刷新状态和目录,使新的供应商与模型可见。
33
35
 
36
+ ## 任务接力
37
+
38
+ 已由 Harness Mix 管理的任务可以在同一个原生任务窗口中更换 Harness。点击输入框旁带接力角标的当前 Harness 图标,选择另一个可用 Harness;确认弹窗会显示接力方向,可选择“继续执行”“执行上一方案”“独立审查”或“重新分析”,并可勾选交接内容、填写可选说明。当前回合仍在运行时需要先停止或等待完成。
39
+
40
+ 接力只关闭当前原生进程并更换底层原生会话,任务标题、可见对话、工作目录、文件变更和 Review 记录不变。Host 会在自己的数据目录中保存不可重放的脱敏检查点,包含对话、计划、标准化工具证据、Core 文件记录以及切换瞬间的 Git HEAD、状态和 Diff 摘要。目标 Harness 收到的下一条真实消息会附带紧凑摘要;支持原生 MCP 的 Harness 可通过只读、当前任务作用域的工具按需读取详细证据,不支持时会明确降级为有界摘要。目标仍需用自己的工具核对真实文件状态。切回用过的 Harness 时,支持恢复的适配器会恢复原生会话及其模型设置。
41
+
42
+ 接力不会传递凭据、环境密钥、审批决定、待审批状态、原始 Tool Call ID 或 Harness 私有协议对象。目标 Harness 的权限请求仍由它自己重新发起,Host 不会自动批准或自动重放操作。
43
+
44
+ 官方 Codex 任务由官方 app-server 直接拥有,不经过 HostRuntime,因此不会显示接力入口;需要使用 Harness Mix 管理的 `Codex(协作)` 才能参与这种跨 Harness 接力。`/switch <Harness 名> [备注]` 继续作为键盘快捷入口。
45
+
46
+ ## MCP 与 Skills
47
+
48
+ 设置页把「MCP」和「Skills」拆成两个独立入口,均可按 Harness 和作用域管理。全局配置适用于该 Harness 的全部项目;项目配置按服务名覆盖全局配置。MCP 使用接近 Codex 的服务器列表与详情编辑流程,支持搜索、逐项添加参数、启停和删除。MCP 只保存 stdio 可执行文件与参数,禁止保存令牌、密码和环境变量。账号与凭据继续由原生 Harness 环境管理。
49
+
50
+ Harness Mix 不改写各 Harness 已有的 MCP 配置文件。启用的托管配置在新建、恢复、Fork 或回退后的下一次原生会话打开时,通过各 Harness 的原生会话配置接口传入。正在运行的会话不会热改配置。Claude Code 与 OpenCode 可返回原生连接状态和工具名称;其他已接入 Harness 会区分「已配置」「已传入会话」和「连接状态未报告」,不会把保存成功当成已连接。
51
+
52
+ Skills 从每个 Harness 已声明的原生目录发现:全部 16 个 Harness 都登记了全局/项目根目录,所以设置页不再出现「暂未配置原生技能目录」。根目录来自各 Harness 官方文档与已安装程序自身的扫描代码,例如 Codex 的 `~/.agents/skills` 与兼容保留的 `$CODEX_HOME/skills`、Kiro 专用的 `.kiro/skills`、Trae IDE 的 `.trae/skills` 与 TraeCode CLI 的 `.traecli/skills`、Hermes 的 `~/.hermes/skills`。打开原生会话时会先创建缺失的根目录,已安装但从未运行过的 Harness 也能立即发现技能;某个目录创建失败只会提示并跳过,不会阻止会话打开。可以把单个 Markdown 文件直接拖入并作为 `SKILL.md` 安装,也可以拖入或选择根目录含 `SKILL.md` 的完整技能文件夹。拖入内容经过同一套限制:拒绝路径逃逸、同名覆盖、超过 10 MB 或 500 个文件的技能。原有本机绝对目录安装协议仍兼容。停用会把整个技能目录移动到相邻的 Harness Mix 保留目录,恢复时原样移回;不删除技能内容。共享 `.agents/skills` 的修改会影响读取同一目录的 Harness。
53
+
54
+ 当前 MCP 会话注入支持 Claude Code、Codex(协作入口)、OpenCode、Grok、Antigravity,以及使用通用 ACP 接入的 CodeBuddy、Kiro、Cursor、Qoder 和 Hermes。DSH 配置托管 MCP 后会使用其官方 ACP profile 打开该会话;未配置时仍走 Web Remote。Pi/OMP 的 MCP 扩展机制不是通用原生 MCP 声明,当前只保留已有协作工具注入;设置页会明确显示不支持。每个 Harness 都登记了原生技能根目录,只有链接到其他位置的目录(junction/symlink)保持只读。
55
+
34
56
  ## 验证
35
57
 
36
58
  ```powershell
37
59
  npm run test:native-ui
60
+ npm run test:integrations
61
+ npm run smoke:integrations-ui
62
+ npm run e2e:integrations
38
63
  npm run smoke:native-ui
39
64
  npm run e2e:native
40
65
  ```
41
66
 
42
67
  `test:native-ui` 覆盖账号字段白名单、模型供应商身份、并发默认值保存、登录连接生命周期和设置页渲染逻辑。`smoke:native-ui` 使用 Electron 与模拟原生响应,检查 Renderer 注入及设置界面的关键交互。
43
68
 
69
+ `test:integrations` 覆盖作用域覆盖、持久化、敏感字段拒绝、原生状态投影和 Skills 安装/停用/恢复。`smoke:integrations-ui` 在隔离的 Electron Renderer 中执行设置页完整交互。`e2e:integrations` 默认使用 Claude Code 打开真实原生会话,验证 MCP 连接、工具发现和项目 Skill 加载;可用 `--harness=opencode` 等参数验证其他已安装 Harness。该验收不发送模型消息,也不会自动处理审批。
70
+
44
71
  `e2e:native` 是只读协议验收:读取可用 Harness 与模型目录,不执行登录/退出或修改凭据。完整账号管理和 DSH 原生页面重开仍需在真实 Codex Desktop 重启验收中人工确认,不能由这条命令代替。