第 9 章:ACP、SDK、CLI 与 Desktop——同一个核心的不同外观
9.1 是什么:产品表面通过协议消费 Agent
goose 至少有四种运行入口:终端 CLI、桌面 app、ACP server/API、SDK/外部客户端。它们共享 crates/goose 的 Agent,但在输入、权限、事件和生命周期上扮演不同宿主。
flowchart TB Core[goose::Agent + SessionManager] CLI[goose-cli\nClap + TUI + terminal session] Desktop[ui/desktop\nReact + Electron + ACP websocket] ACP[crates/goose/src/acp\nACP server / filesystem / tools] SDK[goose-sdk\nUniffi / language bindings] Gateway[gateway\nTelegram / pairing / remote entry] Core --> CLI Core --> Desktop Core --> ACP Core --> SDK Core --> Gateway
9.2 源码怎么做:ACP 是一个协议适配层
acp/ 包含 server、server factory、provider、filesystem、response builder、tool call notifier 和 MCP app proxy。它把 AgentEvent 和 custom notification/request 转成 ACP wire shape,同时把客户端的文件、权限、prompt 和工具结果送回 Agent。
当一个工具需要用户确认时,runtime 产生 ActionRequired;桌面端通过 permissionRequests.ts 显示对话框,用户的选择再经过 ACP/custom request 回到 Agent::handle_confirmation。当工具由前端执行时,runtime 只发 FrontendToolRequest,桌面端执行后通过 tool_result_tx 返回对应 id 的结果。
goose-sdk-types 不是 UI 类型的复制品,而是跨语言的稳定 DTO:session update、usage、status message、recipe、schedule、extension、apps、prompt、diagnostics 等请求/通知都在这里定义。goose-sdk 提供 Rust SDK 和可选 Uniffi bindings,说明 runtime 的目标不仅是“内部 CLI”。
9.3 CLI:薄宿主 + 丰富终端体验
goose-cli/src/commands/ 覆盖 configure、doctor、gateway、info、plugin、project、recipe、review、schedule、session、skills、term、tui、update。session/ 负责输入编辑、paste、streaming buffer、thinking 和工具执行展示。它不实现 Agent Loop,而是订阅事件并把事件渲染成终端体验。
9.4 Desktop:协议驱动的本地产品
ui/desktop/src/acp/ 里有 connection、chat session controller/store、notifications、permissions、providers、recipe、schedules、session extensions 等模块;components/ 负责聊天、工具确认、消息列表、session header 和设置。桌面端的优势是可以把复杂的 action-required、MCP App resource、文件拖拽、dictation 和本地更新做成 UI,而 runtime 仍保持平台无关。
9.5 Gateway 与远程入口
gateway/ 的 handler、manager、pairing、telegram 和 format 模块把消息渠道接入 session。它们应被理解为“另一个宿主”,而不是一套新的 Agent:收到远程消息后仍要创建/恢复 session、选择 provider、执行工具并记录 usage。
9.6 为什么这样做:把 UI 变化隔离在协议边界
如果桌面端直接依赖 Agent 内部锁和私有状态,产品升级会很慢;如果所有能力都压成纯文本,又会失去审批、进度、文件和结构化 recipe。ACP/custom requests 的取舍是在两者之间:核心输出一个稳定事件/请求协议,宿主可以按能力渲染,未来也能出现新的 IDE 或移动端 consumer。
源码定位
crates/goose/src/acp/:ACP server、响应构建和文件能力。crates/goose-sdk-types/src/custom_notifications.rs、custom_requests.rs:跨宿主 wire types。crates/goose-sdk/src/:SDK 与 Uniffi。crates/goose-cli/src/commands/、session/:CLI 宿主。ui/desktop/src/acp/、components/:桌面端宿主。crates/goose/src/gateway/:Telegram 等远程入口。