Agent Client Protocol(ACP)是一个基于 JSON-RPC 的、用于与 agent 运行时对话的协议。dsh 随附一个自动化专用 ACP 服务器(packages/acp/acp),跑在 JSON-RPC stdio 上:编程式客户端创建全新的 harness agent、发送文本/图片提示、收集已提交的 assistant 文本/图片、按策略解析一次性权限请求,并取消工作。仓库内的主要客户端是 dsh-subagent-acp(见 子代理)。
| 包 | 角色 |
|---|---|
@deepseek-ai/dsh-acp | 基于 JSON-RPC stdio 的 ACP 服务器插件 |
@deepseek-ai/dsh-subagent-acp | ACP 支撑的子代理传输 |
这个包是什么(以及不是什么)
来自 packages/acp/acp/README.md:这个包是一个传输适配器,不是 UI 集成,也不是能力接缝。它不暴露编辑器导航、转录重放、命令、模式、配置选择器、elicitation、推理、计划、标题或工具呈现——交互式渲染与人类提问属于 Web host 与 client 模块。服务器的界面刻意保持小巧:只有自动化契约。
插件与配置
apply(ctx, config) 在 stdin/stdout 上打开一个 AgentSideConnection 并驱动 ctx.agents。stdout 保留给协议帧。
| 配置 | 默认 | 含义 |
|---|---|---|
provider | — | 每个创建 agent 的初始 provider 路由 |
model | — | 每个创建 agent 的初始模型 |
两个字段都是可选的,以便另一个 agent/请求监听者提供目标;可运行的 ACP 组合两者都需要。
协议契约
| 方法 | 行为 |
|---|---|
initialize | 协商支持的版本。宣告 mcpCapabilities: { http: true }、sessionCapabilities: { close, list, resume },并且只有挂载持久附件存储、且配置的确切提供方/模型解析后明确支持图片输入时才公布图片提示词能力;音频与嵌入上下文保持 false。不宣告 editor、terminal 或 filesystem 能力。 |
authenticate | 空操作,因为服务器不宣告任何认证方法。 |
| (任务方法) | 每个任务全新 agent、有序文本/图片提示进、已提交 assistant 文本/图片块出、一次性权限请求按策略解析、支持取消。 |
图片提示词端到端持久化:桥接层只准入栅格格式(PNG、JPEG、WebP、GIF),在保存任何内容前先校验完整图片批次并重新检查会话的最新确切路由,在用户事件前提交全部图片,并丢弃内联 base64,使持久消息只包含经过校验的附件引用。已提交的 assistant 图片在以内联 base64 交付前会重新读取并校验完整性。准入失败(不支持的 mime、非规范 base64、模型不支持图片输入)以 invalid params 拒绝;存储或路由校验失败则报告内部错误。音频与嵌入上下文输入一律拒绝。
实现位于 packages/acp/acp/src/——index.ts(插件、连接循环、方法派发)、codec.ts(stdio 上的 JSON-RPC 帧编解码)与 invariant.ts(其不变量伴侣,遵循仓库的每包不变量约定)。
消费者:dsh-subagent-acp
ACP 服务器不是独立的产品界面;在 dsh 内部它是 acp 子代理传输的后端。当 agent 通过 ctx.subagents 以 ACP 传输 spawn 子代理时,dsh-subagent-acp 启动 ACP 服务器(子进程中通过 stdio 讲 ACP 的全新 harness agent)并通过它代理委派——给子代理一个隔离的进程边界,同时保持统一的子代理 API(传输矩阵见 子代理:spawn、fork、acp、codex/claude-code/dsh-sdk)。
可运行的应用
上游移除顶层 examples/ 树(commit 4125514a08)时,examples/acp-agent 与 packages/examples/acp-demo 一并退役。ACP 应用现在是随发布提供的 bundle packages/bundle/acp-app——用 dsh --profile acp 运行:
| 路径 | 角色 |
|---|---|
packages/bundle/acp-app | 基于 dsh-base 的纯自动化 ACP stdio 应用;挂载 ACP 桥 |
apps/cli/tests/profiles/acp/ | profile 级 ACP 测试(原 examples/acp-agent 测试套件) |
会话控制、模型选项与 MCP 挂载
除任务方法外,服务器表面自 demo 时代以来已扩展。实现拆分在 packages/acp/acp/src/:
| 文件 | 职责 |
|---|---|
index.ts | 插件、AgentSideConnection、方法分发 |
codec.ts | stdio 上的 JSON-RPC 帧编解码 |
model-control.ts | setSessionConfigOption——按会话的模型路由/选项控制(methods.agent.session.setConfigOption) |
mcp.ts | 通过 mcpCapabilities: { http: true } 宣告的 MCP 挂载 |
session.ts | session/close、session/list、session/resume 实现 |
updates.ts | 推送给客户端的实时更新 |
invariant.ts | 每包不变量伴生文件 |
关键源文件
| 仓库相对路径 | 提供什么 |
|---|---|
packages/acp/acp/src/index.ts | 插件、AgentSideConnection、方法派发 |
packages/acp/acp/src/{model-control,mcp,session,updates}.ts | 会话选项、MCP 挂载、会话生命周期、实时更新 |
packages/acp/acp/src/codec.ts | JSON-RPC 帧编解码 |
packages/subagent/subagent-acp/src/ | ACP 子代理传输 |
packages/bundle/acp-app/ | 可运行的 ACP 应用(dsh --profile acp) |