@harness-mix/cli 0.2.3 → 0.3.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.
- package/CHANGELOG.md +24 -0
- package/README.md +469 -467
- package/docs/harness-management.md +1 -1
- package/docs/multi-agent-collaboration.md +3 -1
- package/docs/native-acp.md +138 -127
- package/output/native-build/desktop-controller.mjs +1 -1
- package/output/native-build/renderer-extension.js +172 -23
- package/package.json +13 -9
- package/scripts/acp-image-test.cjs +69 -0
- package/scripts/adapters-test.cjs +25 -0
- package/scripts/antigravity-adapter-test.cjs +647 -626
- package/scripts/codex-accounts-test.cjs +34 -0
- package/scripts/codex-adapter-test.cjs +238 -127
- package/scripts/collaboration-test.cjs +577 -262
- package/scripts/collaboration-ui-smoke.cjs +25 -3
- package/scripts/e2e-delegate.cjs +1 -1
- package/scripts/e2e-hermes-image.cjs +60 -0
- package/scripts/jsonl-stdin-test.cjs +40 -31
- package/scripts/kiro-cursor-adapters-test.cjs +124 -100
- package/scripts/native-acp-depth-test.cjs +30 -5
- package/scripts/native-update-apply-test.cjs +269 -215
- package/scripts/native-update.cjs +78 -0
- package/scripts/native-vendor-adapters-test.cjs +196 -154
- package/scripts/openclaw-adapter-test.cjs +121 -3
- package/scripts/openclaw-mcp-probe.cjs +100 -0
- package/scripts/openclaw-mcp-tool-probe.cjs +55 -0
- package/scripts/openclaw-thinking-probe.cjs +73 -0
- package/scripts/salvage-rollout-writes.cjs +72 -0
- package/scripts/storage-verification-test.cjs +11 -0
- package/scripts/zcode-adapter-test.cjs +329 -0
- package/scripts/zcode-live-probe.cjs +66 -0
- package/src/main/adapters/antigravity.js +1428 -1418
- package/src/main/adapters/claude.js +15 -7
- package/src/main/adapters/codex-app-server.js +29 -11
- package/src/main/adapters/codex.js +690 -649
- package/src/main/adapters/native-acp-command.js +51 -48
- package/src/main/adapters/native-acp.js +47 -12
- package/src/main/adapters/omp.js +7 -2
- package/src/main/adapters/openclaw.js +534 -343
- package/src/main/adapters/pi-family.js +35 -8
- package/src/main/adapters/qoder.js +12 -8
- package/src/main/adapters/zcode.js +925 -10
- package/src/main/host/collaboration-tools.js +1 -1
- package/src/main/host/collaboration.js +971 -714
- package/src/main/host/jsonl.js +130 -120
- package/src/main/host/runtime.js +9 -3
- package/src/main/host/verification-gates.js +14 -2
- package/src/main/native/codex-accounts.js +15 -4
- package/src/main/native/config.js +9 -9
- package/src/main/native/launcher.js +252 -237
- package/src/main/native/process-utils.js +157 -57
- package/src/main/native/protocol.js +1227 -1187
- package/src/main/native/update-state.js +123 -110
- package/src/main/native/updater.js +460 -394
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js +3 -1
- package/src/native-ui/desktop-control/dist/renderer-cdp-control-session.js.map +1 -1
- package/src/native-ui/desktop-control/dist/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/desktop-control/src/renderer-cdp-control-session.ts +358 -358
- package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts +1 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-collab-cards.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +29 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts +4 -0
- package/src/native-ui/renderer-extension/dist/types/renderer-team-cards.d.ts.map +1 -1
- package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
- package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +3224 -3181
- package/src/native-ui/renderer-extension/src/renderer-collab-cards.ts +25 -0
- package/src/native-ui/renderer-extension/src/renderer-model-client.ts +27 -0
- package/src/native-ui/renderer-extension/src/renderer-team-cards.ts +93 -13
- package/src/native-ui/renderer-extension/src/settings/connections-page.ts +2 -2
- package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +47 -1
|
@@ -51,7 +51,7 @@ Harness Mix 不改写各 Harness 已有的 MCP 配置文件。启用的托管配
|
|
|
51
51
|
|
|
52
52
|
Skills 从每个 Harness 已声明的原生目录发现:全部 17 个 Harness 都登记了全局/项目根目录,所以设置页不再出现「暂未配置原生技能目录」。根目录来自各 Harness 官方文档与已安装程序自身的扫描代码,例如 Codex 的 `~/.agents/skills` 与兼容保留的 `$CODEX_HOME/skills`、Kiro 专用的 `.kiro/skills`、Trae IDE 的 `.trae/skills` 与 TraeCode CLI 的 `.traecli/skills`、Hermes 的 `~/.hermes/skills`、Cline 的 `~/.cline/skills` 与项目 `.cline/skills`。打开原生会话时会先创建缺失的根目录,已安装但从未运行过的 Harness 也能立即发现技能;某个目录创建失败只会提示并跳过,不会阻止会话打开。可以把单个 Markdown 文件直接拖入并作为 `SKILL.md` 安装,也可以拖入或选择根目录含 `SKILL.md` 的完整技能文件夹。拖入内容经过同一套限制:拒绝路径逃逸、同名覆盖、超过 10 MB 或 500 个文件的技能。原有本机绝对目录安装协议仍兼容。停用会把整个技能目录移动到相邻的 Harness Mix 保留目录,恢复时原样移回;不删除技能内容。共享 `.agents/skills` 的修改会影响读取同一目录的 Harness。
|
|
53
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)保持只读。
|
|
54
|
+
当前 MCP 会话注入支持 Claude Code、Codex(协作入口)、OpenCode、Grok、Antigravity,以及使用通用 ACP 接入的 CodeBuddy、Kiro、Cursor、Qoder 和 Hermes。OpenClaw 走独立的注册表路线:托管服务器以 `harness-mix/<服务名>` 自有键合并进 `~/.openclaw/openclaw.json` 的 `mcp.servers`(OpenClaw 官方集中式 MCP 客户端注册表),只增删改自有键、写回前做"去自有键后逐键等值"断言,用户手写的服务器定义绝不触碰。上游 CLI `openclaw mcp set` 的整档规范化写入会触发 size-drop 守卫,故不走 CLI/RPC 写入面;首次推送会把 PowerShell 风格排版规整为标准 JSON(内容逐键保留)。实测(Gateway 2026.5.12)`mcp.servers` 仅在 Gateway 启动时被 agent 运行消费:由 Harness Mix 拉起的 Gateway 启动即生效;已在运行的 Gateway 需重启后新工具才可用(会话打开时给出对应提示)。DSH 配置托管 MCP 后会使用其官方 ACP profile 打开该会话;未配置时仍走 Web Remote。Pi/OMP 的 MCP 扩展机制不是通用原生 MCP 声明,当前只保留已有协作工具注入;设置页会明确显示不支持。每个 Harness 都登记了原生技能根目录,只有链接到其他位置的目录(junction/symlink)保持只读。
|
|
55
55
|
|
|
56
56
|
## 验证
|
|
57
57
|
|
|
@@ -50,6 +50,8 @@ Agent Team 复用同一套原生 Harness Session,但把 `Team`、`Member`、`T
|
|
|
50
50
|
- Claude 的 `canUseTool` 和 Codex MCP elicitation 继续走原生审批。需要确认时,用户在相应任务的审批界面处理;自动验证不会代答。
|
|
51
51
|
- 主任务 Fork 会重新绑定自己的协作身份,不复用源任务的子任务访问权。
|
|
52
52
|
- task_id、父子会话、任务文本、结果、worktree 起点以及 Team/Member/Task/Message 在独立串行存储中持久化;重启后在途 Job、Team Task 和 Member 一起变为 interrupted,不会继续显示为“工作中”,也不自动重复执行有副作用的操作。点击「继续协作」向原主任务发送续跑请求,主模型用 `list_delegations` / `resume_delegation` 恢复原子会话,并把同一 Team Task/Member 原子地切回进行中。原生会话丢失或无法恢复会明确报错。会话鉴权标识不持久化,重启重新签发。
|
|
53
|
+
- 团队看板是可操作的(principal 是用户,授权在 Host 的 `collaboration.userAction` 统一裁决):任务卡可「取消」进行中任务(走与 `cancel_delegation` 相同的结算路径)、「重试/改派」失败或中断任务(目标限既有成员,任务重置为待开始并保留 `reassignedFrom` 痕迹);成员卡可「追问」以 lead 身份发团队消息;摘要卡与 Workbench 头部有「继续协作」,一次性委派的协作卡上有「恢复此任务」。改派与继续协作要求 lead 回合空闲:Host 向 lead 线程注入一条指令回合(指令自带目标成员的 `#` 提及,走与用户手打提及完全相同的授权路径),由 lead 在该回合内重新派发或恢复。协议面为 `harnessmix/thread/team/task/cancel`、`team/task/reassign`、`team/message/send`、`harnessmix/thread/collaboration/continue`。
|
|
54
|
+
- 任务失败必达 lead 邮箱:失败结算时以 `system` 伪参与者(不进 roster、不投递)写入一条带原因的通知,lead 无需轮询也能从 `get_team_state` 看到失败。`assign_team_task` 可声明 `retry {max 1..3}`:失败时 Host 在同一 lead 回合内自动重派给原成员(复用其会话与工作区,提示词附上次失败原因与“不要重放已完成副作用”),预算耗尽才落 failed;未声明则失败即落定。用户主动取消不是失败:不通知、不重试。
|
|
53
55
|
|
|
54
56
|
## 支持与验证范围
|
|
55
57
|
|
|
@@ -79,7 +81,7 @@ npm run e2e:native
|
|
|
79
81
|
npm run build:native
|
|
80
82
|
```
|
|
81
83
|
|
|
82
|
-
`test:collaboration` 使用真实 MCP stdio 子进程、本地鉴权桥和受控原生会话 Adapter 验证并发、结果、跟进、取消、跨任务访问限制、Agent Team
|
|
84
|
+
`test:collaboration` 使用真实 MCP stdio 子进程、本地鉴权桥和受控原生会话 Adapter 验证并发、结果、跟进、取消、跨任务访问限制、Agent Team 身份/任务依赖/成员邮箱、时间轴持久化和共享快照策略,并覆盖看板用户操作(取消/改派/重试/追问/继续协作,含 lead 回合空闲约束与协议透传)、任务失败的 lead 邮箱 system 通知与 `retry` 自动重派、忙碌收件人排队投递与未读计数清零。`test:collaboration` 与 `test:collaboration-recovery` 已并入 `test:core-all`。UI smoke 检查摘要入口、内嵌工作台、Lead/成员职责、真实 Harness 图标、成员会话跳转、成员任务列、通信流、时间轴、看板操作按钮(失败/中断任务的重试/改派/恢复、进行中任务的取消)、lead 忙碌时「继续协作」的禁用态与成员未读徽标,截图位于 `output/collaboration-ui/team-inline-expanded.png`。这不是完整 Codex Desktop 的真实模型交互验收;构建过程不会重启当前桌面。
|
|
83
85
|
|
|
84
86
|
2026-09-12 验证:Pi→Claude 两个真实子任务分别在不同 worktree 运行,DSH→CodeBuddy 两个真实子任务也在独立 worktree 完成并由 DSH 主会话汇总 `COLLAB_VERIFIED`。恢复测试覆盖持久化身份、原子会话续跑、不重复建任务;Git 测试覆盖脏目录起点、暂存区保留、过期预览拒绝、冲突时不部分应用。Native Protocol 覆盖父子任务归属与原生 MCP 工具卡片,Electron 仅覆盖原生输入框中的协作引用增强。Runtime 保持 Adapter `open()` 返回对象的同一身份,避免原生回调更新到浅拷贝而被活动回合闸门丢弃。
|
|
85
87
|
## 统一历史
|
package/docs/native-acp.md
CHANGED
|
@@ -1,127 +1,138 @@
|
|
|
1
|
-
# CodeBuddy、Kiro CLI、Cursor CLI 与其他原生 ACP 接入
|
|
2
|
-
|
|
3
|
-
CodeBuddy、Kiro CLI、Cursor CLI、Qoder 和 Cline 使用原生 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
|
-
| `cline` | `cline --acp` | `HARNESS_MIX_CLINE_EXECUTABLE` | [Cline CLI](https://docs.cline.bot/usage/cli-overview);官方文档与源码均确认 ACP |
|
|
19
|
-
|
|
20
|
-
Qoder 在 Windows 上识别 npm 包并直接启动官方 JavaScript bundle。ZCode 的
|
|
21
|
-
`app-server --stdio` 使用厂商协议,不能直接填入 ACP 程序路径。旧的 `zcode acp`、
|
|
22
|
-
`traecli acp serve` 缺少官方依据,已移除;未配置桥接时明确显示不可用。
|
|
23
|
-
Trae 官方开源项目的命令名是 `trae-cli`,不代表它具备 ACP 服务模式。
|
|
24
|
-
本项目不自动安装第三方桥接器,也不复制其凭据同步或默认 yolo 策略。
|
|
25
|
-
|
|
26
|
-
CodeBuddy 优先使用明确指定的路径,再搜索 PATH 和 WorkBuddy 桌面自带的
|
|
27
|
-
CodeBuddy CLI。旧变量 `HARNESS_MIX_WORKBUDDY_EXECUTABLE` 继续有效,新变量优先。
|
|
28
|
-
`workbuddy` 是兼容别名;只注册一个 CodeBuddy 适配器。启动时迁移 Host 任务和
|
|
29
|
-
Harness 切换历史中的旧 ID,保留原生会话 ID、文件位置和对话内容。
|
|
30
|
-
Renderer 读取旧默认模型和分组偏好时同步迁移旧名称。
|
|
31
|
-
|
|
32
|
-
Cursor 在 Windows 上识别官方版本目录并直接运行其 Node bundle。
|
|
33
|
-
不使用含义不明确的 `agent` 命令,因为它也可能属于 Grok。
|
|
34
|
-
显式路径无效会报错,不能静默转向其他安装。
|
|
35
|
-
|
|
36
|
-
## 专用适配
|
|
37
|
-
|
|
38
|
-
| 能力 | CodeBuddy | Kiro CLI | Cursor CLI |
|
|
39
|
-
| --- | --- | --- | --- |
|
|
40
|
-
| 模型/配置 | 原生 model、thought_level、mode;等待确认 | 原生 model、effortLevel;auto 不显示独立 effort | 保留完整模型变体及原生执行模式 |
|
|
41
|
-
| 审批 | 保留原生 optionId 与单次/持久范围 | 原生选项;consent 携带会话/工作区及资源元数据 | 原生 optionId 与作用范围 |
|
|
42
|
-
| 提问 | AskUserQuestion → resolveInterruption;旧 question 回调;失败可重试 | `_kiro/userInput` 文字/选项 | `cursor/ask_question` 单选/多选 |
|
|
43
|
-
| 计划 | ACP plan 投影 | ACP plan 投影 | `cursor/create_plan` 接受/拒绝/取消 |
|
|
44
|
-
| 取消 | 等待取消完成,再关闭、重连、load 同一会话并恢复确认过的配置 | 原生 cancel;超时关闭并报故障 | 原生 cancel;超时关闭并报故障 |
|
|
45
|
-
| 恢复 | session/load;加载期间不重复输出历史 | session/load | session/load |
|
|
46
|
-
| 压缩/fork | 不支持 | 仅调用握手声明的 compact/fork;不伪造检查点 | 不支持 |
|
|
47
|
-
| 用量 | 按原生 model request ID 去重 Token/Credits;标准 ACP 上下文 | 原生上下文百分比、usage 元数据 Credits 去重 | 不声明用量 |
|
|
48
|
-
| 原生历史导入 | JSONL 当前 parent 链,校验 cwd/session/path/大小/环 | 仅现有 Host 历史与原生恢复 | 仅现有 Host 历史与原生恢复 |
|
|
49
|
-
|
|
50
|
-
共享处理包括:每会话独立进程、会话级 MCP 注入、拒绝并发提交和忙时改配置、
|
|
51
|
-
30 秒启动/配置/取消超时、忽略其他会话和旧连接事件、工具终态去重、仅在工具
|
|
52
|
-
成功后投影原生完整 Diff。已知 Cursor 损坏的 diff header 回退保持为工具输出,
|
|
53
|
-
不猜测文件内容。Credits 保持独立字段,不换算为美元。
|
|
54
|
-
|
|
55
|
-
多选问题目前通过输入 JSON 字符串数组表达;选项会展示在问题中,提交时按原生
|
|
56
|
-
选项 ID 校验。CodeBuddy 允许原生提问支持的自定义回答。
|
|
57
|
-
|
|
58
|
-
## 能力边界
|
|
59
|
-
|
|
60
|
-
- 这是针对本项目接口实现的适配,不是完整移植上游项目的插件系统。
|
|
61
|
-
- 原生子 Agent 的独立卡片、后台生命周期与子会话历史浏览尚未实现。
|
|
62
|
-
CodeBuddy 带 parentToolCallId 的子 Agent 内容不会混入父回答。
|
|
63
|
-
- Kiro fork 只读取并校验原生 session.json/messages.jsonl 的最新完整 turn_end,
|
|
64
|
-
将真实 messageId 传入原生 fork;压缩、tombstone 或缺失边界明确拒绝。
|
|
65
|
-
- Kiro 原生历史导入、Cursor 的内部 SQLite 历史导入未实现;恢复已有 Host
|
|
66
|
-
任务使用原生 session/load,不读写其私有数据库。
|
|
67
|
-
- CodeBuddy/Kiro/Cursor/Qoder 的图片以 ACP image block 传递,仅在原生握手声明
|
|
68
|
-
`promptCapabilities.image` 时接受;缺失能力时拒绝,不能静默丢图。2026-09-12
|
|
69
|
-
实机图片回路在 CodeBuddy 通过;Kiro/Cursor 未安装,Qoder 被额度阻断。DSH 和
|
|
70
|
-
OpenClaw 的当前模型明确拒绝图片,属于模型能力限制而非 Host 丢图。
|
|
71
|
-
- 精确消息回退、CodeBuddy/Cursor fork、账号配额查询不声明支持。
|
|
72
|
-
- Kiro autopilot 不伪装为 Host 权限级别;未知扩展请求明确报不支持。
|
|
73
|
-
- Cline 官方 ACP(apps/cli/src/acp)已核对:握手声明 loadSession 与图片输入,
|
|
74
|
-
session/new 返回 plan/act 模式与模型目录,审批走标准 session/request_permission。
|
|
75
|
-
其事件投影没有 plan 条目、diff 内容块、usage_update 或 thinking 档位配置,
|
|
76
|
-
对应能力一律不声明;提问以审批选项形式出现,不伪造独立提问通道。
|
|
77
|
-
- 部分 CLI 不提供原生 Diff 或用量,缺失时不从当前文件/估算值补造。
|
|
78
|
-
- CodeBuddy/Kiro/Cursor/Qoder/Cline/ZCode/Trae 的 ACP 会话可接收每会话 MCP 定义,
|
|
79
|
-
但只有本机安装且握手成功的程序才会开放入口;ZCode、Trae 仍需显式兼容 ACP
|
|
80
|
-
桥接器,不能把其 app-server 或普通 CLI 当成 ACP。
|
|
81
|
-
- DSH 协作主任务走官方 `dsh --profile acp`,由同一 ACP 引擎接收 session-scoped
|
|
82
|
-
MCP;普通 DSH 任务继续使用 Web Remote。Runtime 保持 Adapter `open()` 返回
|
|
83
|
-
的会话对象身份,避免原生回调更新到浅拷贝而被活动回合闸门丢弃。
|
|
84
|
-
|
|
85
|
-
## 验证
|
|
86
|
-
|
|
87
|
-
```powershell
|
|
88
|
-
npm run test:native-acp-depth
|
|
89
|
-
npm run test:kiro-cursor
|
|
90
|
-
npm run test:core-all
|
|
91
|
-
npm run test:native-ui
|
|
92
|
-
npm run e2e:native-acp
|
|
93
|
-
npm run e2e:native
|
|
94
|
-
npm run health:harnesses -- --live
|
|
95
|
-
npm run health:harnesses -- --live --image-only --image=<绝对图片路径>
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
深度协议测试使用模拟原生子进程,覆盖取消/重连后继续、配置确认、忙时拒绝、
|
|
99
|
-
会话隔离、审批原生 ID、提问失败重试、多选、计划拒绝、Kiro 上下文/fork、
|
|
100
|
-
Diff 去重、历史 parent 环和 Credits 去重。这些测试不是模型执行证据。
|
|
101
|
-
|
|
102
|
-
2026-09-12 实机结果:CodeBuddy 2.132.0 返回 17 个模型和 8 个模式,完成文本
|
|
103
|
-
回复后关闭进程,session/load 同一原生会话并再次回复成功。此版本当前模型未
|
|
104
|
-
返回独立思考选项,因此未伪造档位。Kiro/Cursor 未在 PATH 和默认目录发现,
|
|
105
|
-
真实模型、专用交互以及重启桌面验收待安装登录后完成。日志保存在
|
|
106
|
-
`output/native-acp-live/1789182835967/report.json`(本地构建产物,不提交)。
|
|
107
|
-
|
|
108
|
-
Qoder 1.1.49 实机完成 ACP 初始化、创建会话,返回 1 个模型和 5 个原生模式。
|
|
109
|
-
文本请求返回账号 Credits 额度耗尽,因此模型回复、恢复和工具执行尚未通过实机验证。
|
|
110
|
-
日志:`output/native-acp-live/1789187177461/report.json`。
|
|
111
|
-
新增六种协议配置的模拟进程回归、延迟 ACP 最终事件回归和图片握手拒绝测试;
|
|
112
|
-
ZCode/Trae 的模拟测试只验证共享引擎,不能作为其官方 CLI 已接通的证据。
|
|
113
|
-
|
|
114
|
-
2026-09-12 全 Harness 健康检查(均在独立临时工作目录执行):文本回路通过
|
|
115
|
-
Pi、DSH、Claude Code、Codex、Grok、CodeBuddy;OpenCode 被账户余额阻断,Qoder
|
|
116
|
-
被 Credits 额度阻断,OMP、Hermes、Kiro、Cursor 未安装。图片回路通过
|
|
117
|
-
Antigravity、Pi、Claude Code、Codex、Grok、CodeBuddy;DSH/OpenClaw 的当前模型
|
|
118
|
-
拒绝图片,Qoder/OpenCode 分别被额度/余额阻断。报告:
|
|
119
|
-
`output/harness-health/1789191914230/report.json`(文本)和
|
|
120
|
-
`output/harness-health/1789191791797/report.json`(图片)。
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
的
|
|
126
|
-
|
|
127
|
-
|
|
1
|
+
# CodeBuddy、Kiro CLI、Cursor CLI 与其他原生 ACP 接入
|
|
2
|
+
|
|
3
|
+
CodeBuddy、Kiro CLI、Cursor CLI、Qoder 和 Cline 使用原生 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
|
+
| `cline` | `cline --acp` | `HARNESS_MIX_CLINE_EXECUTABLE` | [Cline CLI](https://docs.cline.bot/usage/cli-overview);官方文档与源码均确认 ACP |
|
|
19
|
+
|
|
20
|
+
Qoder 在 Windows 上识别 npm 包并直接启动官方 JavaScript bundle。ZCode 的
|
|
21
|
+
`app-server --stdio` 使用厂商协议,不能直接填入 ACP 程序路径。旧的 `zcode acp`、
|
|
22
|
+
`traecli acp serve` 缺少官方依据,已移除;未配置桥接时明确显示不可用。
|
|
23
|
+
Trae 官方开源项目的命令名是 `trae-cli`,不代表它具备 ACP 服务模式。
|
|
24
|
+
本项目不自动安装第三方桥接器,也不复制其凭据同步或默认 yolo 策略。
|
|
25
|
+
|
|
26
|
+
CodeBuddy 优先使用明确指定的路径,再搜索 PATH 和 WorkBuddy 桌面自带的
|
|
27
|
+
CodeBuddy CLI。旧变量 `HARNESS_MIX_WORKBUDDY_EXECUTABLE` 继续有效,新变量优先。
|
|
28
|
+
`workbuddy` 是兼容别名;只注册一个 CodeBuddy 适配器。启动时迁移 Host 任务和
|
|
29
|
+
Harness 切换历史中的旧 ID,保留原生会话 ID、文件位置和对话内容。
|
|
30
|
+
Renderer 读取旧默认模型和分组偏好时同步迁移旧名称。
|
|
31
|
+
|
|
32
|
+
Cursor 在 Windows 上识别官方版本目录并直接运行其 Node bundle。
|
|
33
|
+
不使用含义不明确的 `agent` 命令,因为它也可能属于 Grok。
|
|
34
|
+
显式路径无效会报错,不能静默转向其他安装。
|
|
35
|
+
|
|
36
|
+
## 专用适配
|
|
37
|
+
|
|
38
|
+
| 能力 | CodeBuddy | Kiro CLI | Cursor CLI |
|
|
39
|
+
| --- | --- | --- | --- |
|
|
40
|
+
| 模型/配置 | 原生 model、thought_level、mode;等待确认 | 原生 model、effortLevel;auto 不显示独立 effort | 保留完整模型变体及原生执行模式 |
|
|
41
|
+
| 审批 | 保留原生 optionId 与单次/持久范围 | 原生选项;consent 携带会话/工作区及资源元数据 | 原生 optionId 与作用范围 |
|
|
42
|
+
| 提问 | AskUserQuestion → resolveInterruption;旧 question 回调;失败可重试 | `_kiro/userInput` 文字/选项 | `cursor/ask_question` 单选/多选 |
|
|
43
|
+
| 计划 | ACP plan 投影 | ACP plan 投影 | `cursor/create_plan` 接受/拒绝/取消 |
|
|
44
|
+
| 取消 | 等待取消完成,再关闭、重连、load 同一会话并恢复确认过的配置 | 原生 cancel;超时关闭并报故障 | 原生 cancel;超时关闭并报故障 |
|
|
45
|
+
| 恢复 | session/load;加载期间不重复输出历史 | session/load | session/load |
|
|
46
|
+
| 压缩/fork | 不支持 | 仅调用握手声明的 compact/fork;不伪造检查点 | 不支持 |
|
|
47
|
+
| 用量 | 按原生 model request ID 去重 Token/Credits;标准 ACP 上下文 | 原生上下文百分比、usage 元数据 Credits 去重 | 不声明用量 |
|
|
48
|
+
| 原生历史导入 | JSONL 当前 parent 链,校验 cwd/session/path/大小/环 | 仅现有 Host 历史与原生恢复 | 仅现有 Host 历史与原生恢复 |
|
|
49
|
+
|
|
50
|
+
共享处理包括:每会话独立进程、会话级 MCP 注入、拒绝并发提交和忙时改配置、
|
|
51
|
+
30 秒启动/配置/取消超时、忽略其他会话和旧连接事件、工具终态去重、仅在工具
|
|
52
|
+
成功后投影原生完整 Diff。已知 Cursor 损坏的 diff header 回退保持为工具输出,
|
|
53
|
+
不猜测文件内容。Credits 保持独立字段,不换算为美元。
|
|
54
|
+
|
|
55
|
+
多选问题目前通过输入 JSON 字符串数组表达;选项会展示在问题中,提交时按原生
|
|
56
|
+
选项 ID 校验。CodeBuddy 允许原生提问支持的自定义回答。
|
|
57
|
+
|
|
58
|
+
## 能力边界
|
|
59
|
+
|
|
60
|
+
- 这是针对本项目接口实现的适配,不是完整移植上游项目的插件系统。
|
|
61
|
+
- 原生子 Agent 的独立卡片、后台生命周期与子会话历史浏览尚未实现。
|
|
62
|
+
CodeBuddy 带 parentToolCallId 的子 Agent 内容不会混入父回答。
|
|
63
|
+
- Kiro fork 只读取并校验原生 session.json/messages.jsonl 的最新完整 turn_end,
|
|
64
|
+
将真实 messageId 传入原生 fork;压缩、tombstone 或缺失边界明确拒绝。
|
|
65
|
+
- Kiro 原生历史导入、Cursor 的内部 SQLite 历史导入未实现;恢复已有 Host
|
|
66
|
+
任务使用原生 session/load,不读写其私有数据库。
|
|
67
|
+
- CodeBuddy/Kiro/Cursor/Qoder 的图片以 ACP image block 传递,仅在原生握手声明
|
|
68
|
+
`promptCapabilities.image` 时接受;缺失能力时拒绝,不能静默丢图。2026-09-12
|
|
69
|
+
实机图片回路在 CodeBuddy 通过;Kiro/Cursor 未安装,Qoder 被额度阻断。DSH 和
|
|
70
|
+
OpenClaw 的当前模型明确拒绝图片,属于模型能力限制而非 Host 丢图。
|
|
71
|
+
- 精确消息回退、CodeBuddy/Cursor fork、账号配额查询不声明支持。
|
|
72
|
+
- Kiro autopilot 不伪装为 Host 权限级别;未知扩展请求明确报不支持。
|
|
73
|
+
- Cline 官方 ACP(apps/cli/src/acp)已核对:握手声明 loadSession 与图片输入,
|
|
74
|
+
session/new 返回 plan/act 模式与模型目录,审批走标准 session/request_permission。
|
|
75
|
+
其事件投影没有 plan 条目、diff 内容块、usage_update 或 thinking 档位配置,
|
|
76
|
+
对应能力一律不声明;提问以审批选项形式出现,不伪造独立提问通道。
|
|
77
|
+
- 部分 CLI 不提供原生 Diff 或用量,缺失时不从当前文件/估算值补造。
|
|
78
|
+
- CodeBuddy/Kiro/Cursor/Qoder/Cline/ZCode/Trae 的 ACP 会话可接收每会话 MCP 定义,
|
|
79
|
+
但只有本机安装且握手成功的程序才会开放入口;ZCode、Trae 仍需显式兼容 ACP
|
|
80
|
+
桥接器,不能把其 app-server 或普通 CLI 当成 ACP。
|
|
81
|
+
- DSH 协作主任务走官方 `dsh --profile acp`,由同一 ACP 引擎接收 session-scoped
|
|
82
|
+
MCP;普通 DSH 任务继续使用 Web Remote。Runtime 保持 Adapter `open()` 返回
|
|
83
|
+
的会话对象身份,避免原生回调更新到浅拷贝而被活动回合闸门丢弃。
|
|
84
|
+
|
|
85
|
+
## 验证
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
npm run test:native-acp-depth
|
|
89
|
+
npm run test:kiro-cursor
|
|
90
|
+
npm run test:core-all
|
|
91
|
+
npm run test:native-ui
|
|
92
|
+
npm run e2e:native-acp
|
|
93
|
+
npm run e2e:native
|
|
94
|
+
npm run health:harnesses -- --live
|
|
95
|
+
npm run health:harnesses -- --live --image-only --image=<绝对图片路径>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
深度协议测试使用模拟原生子进程,覆盖取消/重连后继续、配置确认、忙时拒绝、
|
|
99
|
+
会话隔离、审批原生 ID、提问失败重试、多选、计划拒绝、Kiro 上下文/fork、
|
|
100
|
+
Diff 去重、历史 parent 环和 Credits 去重。这些测试不是模型执行证据。
|
|
101
|
+
|
|
102
|
+
2026-09-12 实机结果:CodeBuddy 2.132.0 返回 17 个模型和 8 个模式,完成文本
|
|
103
|
+
回复后关闭进程,session/load 同一原生会话并再次回复成功。此版本当前模型未
|
|
104
|
+
返回独立思考选项,因此未伪造档位。Kiro/Cursor 未在 PATH 和默认目录发现,
|
|
105
|
+
真实模型、专用交互以及重启桌面验收待安装登录后完成。日志保存在
|
|
106
|
+
`output/native-acp-live/1789182835967/report.json`(本地构建产物,不提交)。
|
|
107
|
+
|
|
108
|
+
Qoder 1.1.49 实机完成 ACP 初始化、创建会话,返回 1 个模型和 5 个原生模式。
|
|
109
|
+
文本请求返回账号 Credits 额度耗尽,因此模型回复、恢复和工具执行尚未通过实机验证。
|
|
110
|
+
日志:`output/native-acp-live/1789187177461/report.json`。
|
|
111
|
+
新增六种协议配置的模拟进程回归、延迟 ACP 最终事件回归和图片握手拒绝测试;
|
|
112
|
+
ZCode/Trae 的模拟测试只验证共享引擎,不能作为其官方 CLI 已接通的证据。
|
|
113
|
+
|
|
114
|
+
2026-09-12 全 Harness 健康检查(均在独立临时工作目录执行):文本回路通过
|
|
115
|
+
Pi、DSH、Claude Code、Codex、Grok、CodeBuddy;OpenCode 被账户余额阻断,Qoder
|
|
116
|
+
被 Credits 额度阻断,OMP、Hermes、Kiro、Cursor 未安装。图片回路通过
|
|
117
|
+
Antigravity、Pi、Claude Code、Codex、Grok、CodeBuddy;DSH/OpenClaw 的当前模型
|
|
118
|
+
拒绝图片,Qoder/OpenCode 分别被额度/余额阻断。报告:
|
|
119
|
+
`output/harness-health/1789191914230/report.json`(文本)和
|
|
120
|
+
`output/harness-health/1789191791797/report.json`(图片)。
|
|
121
|
+
|
|
122
|
+
2026-09-21 Hermes 实机验证(v0.21.3,自定义 Anthropic 兼容端点):ACP initialize 实测
|
|
123
|
+
上报 PromptCapabilities(image=True) 与 loadSession=true;session/new 强制要求 mcpServers
|
|
124
|
+
字段,注入行为完整的 stdio MCP 服务器后正常创建会话(acp-capabilities-probe 自带的
|
|
125
|
+
极简 dummy server 会让 Hermes 的 MCP 客户端握手挂起,属探针局限,非 Hermes 问题)。
|
|
126
|
+
图片回路:8x8 红色 PNG 经 session/prompt image 块送入并到达 provider API(当日可用
|
|
127
|
+
的 MiniMax Anthropic 兼容端点对图片请求返回 500,模型层不可见 —— 与 OpenClaw 早前
|
|
128
|
+
"当前模型拒绝图片仍计 ✅" 的口径一致,harness 侧接线已打通)。文本回路经同一端点
|
|
129
|
+
的 MiniMax-M3 实测通过(one-shot 回复正常)。日志:
|
|
130
|
+
`output/openclaw-thinking-probe/`、`output/openclaw-mcp-probe/`(同日 OpenClaw
|
|
131
|
+
thinking/MCP 实测证据也在此目录)。
|
|
132
|
+
|
|
133
|
+
## 参考与图标
|
|
134
|
+
|
|
135
|
+
协议字段对照了上游 adapters 提交(7cc4db87)
|
|
136
|
+
的 codebuddy、kiro-cli、cursor-cli 实现及接口说明;其测试结果不视为本项目证据。
|
|
137
|
+
CodeBuddy 和 Cursor 图标取自该提交的官方品牌资源副本,Kiro 沿用仓库已有
|
|
138
|
+
官方 SVG。品牌标志归原所有者所有,不表示厂商背书。
|
|
@@ -950,7 +950,7 @@ function sleep(milliseconds) {
|
|
|
950
950
|
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
951
951
|
}
|
|
952
952
|
function sameAgents(actual, expected) {
|
|
953
|
-
return actual.length === expected.length &&
|
|
953
|
+
return actual.length === expected.length && expected.every((agent) => actual.includes(agent));
|
|
954
954
|
}
|
|
955
955
|
function isPrimaryRendererUrl(value) {
|
|
956
956
|
try {
|