Files
qwen-code/packages/vscode-ide-companion/docs-tmp/ACP_IMPLEMENTATION_STATUS.md
yiliang114 732220e651 wip(vscode-ide-companion): 实现 quick win 功能
- 将 WebView 调整到编辑器右侧
- 添加 ChatHeader 组件,实现会话下拉菜单
- 替换模态框为紧凑型下拉菜单
- 更新会话切换逻辑,显示当前标题
- 清理旧的会话选择器样式
基于 Claude Code v2.0.43 UI 分析实现。
2025-11-19 00:16:45 +08:00

237 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ACP 协议实现状态对比
## 概述
ACP (Agent Communication Protocol) 是基于 JSON-RPC 2.0 的双向通信协议,用于 IDE 客户端与 AI Agent 服务器之间的通信。
- **协议定义**: Google 开源的标准协议Apache-2.0 License
- **协议版本**: 1
- **传输格式**: JSON-RPC 2.0,通过 stdin/stdout 进行行分隔的 JSON 通信
## 架构说明
```
┌─────────────────┐ ┌──────────────────┐
│ IDE Client │ │ Agent Server │
│ (VSCode 扩展) │◄──── JSON-RPC ────►│ (qwen CLI) │
└─────────────────┘ └──────────────────┘
```
### 角色定义
- **Client (VSCode 扩展)**:
- 提供 UI 界面
- 处理文件读写
- 请求用户权限
- 接收并展示 Agent 的消息
- **Server (qwen CLI)**:
- 处理 LLM 交互
- 执行工具调用
- 管理会话状态
- 流式返回响应
## 协议方法对比
### 1. Agent Methods (CLI 实现VSCode 调用)
这些是 **qwen CLI** 作为 Server 实现的方法,**VSCode 扩展** 作为 Client 调用:
| 方法 | CLI 实现 | VSCode 调用 | 功能描述 | 文件位置 |
| ---------------- | -------- | ----------- | ------------------------- | ------------------------------------------------------------------------------------ |
| `initialize` | ✅ | ✅ | 协议初始化,交换能力信息 | CLI: `zedIntegration.ts:105-136`<br>VSCode: `AcpConnection.ts:439-461` |
| `authenticate` | ✅ | ✅ | 用户认证OAuth/API Key | CLI: `zedIntegration.ts:138-148`<br>VSCode: `AcpConnection.ts:463-471` |
| `session/new` | ✅ | ✅ | 创建新的聊天会话 | CLI: `zedIntegration.ts:150-191`<br>VSCode: `AcpConnection.ts:473-485` |
| `session/load` | ❌ | ✅ | 加载历史会话 | CLI: 已定义但禁用(返回 `loadSession: false`<br>VSCode: `AcpConnection.ts:541-553` |
| `session/prompt` | ✅ | ✅ | 发送用户消息给 Agent | CLI: `zedIntegration.ts:234-240`<br>VSCode: `AcpConnection.ts:487-496` |
| `session/cancel` | ✅ | ❌ | 取消当前生成 | CLI: `zedIntegration.ts:226-232`<br>VSCode: **未实现** |
**自定义扩展方法(非标准 ACP:**
| 方法 | CLI 实现 | VSCode 调用 | 功能描述 | 文件位置 |
| ---------------- | -------- | ----------- | -------------- | ---------------------------------- |
| `session/list` | ❌ | ✅ | 列出所有会话 | VSCode: `AcpConnection.ts:498-511` |
| `session/switch` | ❌ | ✅ | 切换到指定会话 | VSCode: `AcpConnection.ts:513-521` |
### 2. Client Methods (VSCode 实现CLI 调用)
这些是 **VSCode 扩展** 作为 Client 实现的方法,**qwen CLI** 作为 Server 调用:
| 方法 | VSCode 实现 | CLI 调用 | 功能描述 | 文件位置 |
| ---------------------------- | ----------- | -------- | -------------------------------- | ------------------------------------------------------------------------ |
| `session/update` | ✅ | ✅ | 流式发送会话更新notification | CLI: `acp.ts:69-74`<br>VSCode: `AcpConnection.ts:280-283` (via callback) |
| `session/request_permission` | ✅ | ✅ | 请求用户授权工具执行 | CLI: `acp.ts:82-89`<br>VSCode: `AcpConnection.ts:330-359` |
| `fs/read_text_file` | ✅ | ✅ | 读取文件内容 | CLI: `acp.ts:91-98`<br>VSCode: `AcpConnection.ts:361-403` |
| `fs/write_text_file` | ✅ | ✅ | 写入文件内容 | CLI: `acp.ts:100-107`<br>VSCode: `AcpConnection.ts:405-436` |
## Session Update 类型对比
`session/update` 是一个 notification不需要响应支持多种更新类型
| 更新类型 | CLI 发送 | VSCode 处理 | 功能描述 | 实现位置 |
| --------------------- | -------- | ----------- | -------------------- | ------------------------------------------------------------------- |
| `user_message_chunk` | ✅ | ✅ | 用户消息片段 | CLI: `zedIntegration.ts:N/A` (echo back)<br>VSCode: Webview 渲染 |
| `agent_message_chunk` | ✅ | ✅ | Agent 回复片段 | CLI: `zedIntegration.ts:310-322`<br>VSCode: Webview 渲染 |
| `agent_thought_chunk` | ✅ | ⚠️ | Agent 思考过程 | CLI: `zedIntegration.ts:318` (thought=true)<br>VSCode: 需要特殊样式 |
| `tool_call` | ✅ | ✅ | 工具调用开始 | CLI: `zedIntegration.ts:500-509`<br>VSCode: 显示 ToolCall 组件 |
| `tool_call_update` | ✅ | ✅ | 工具调用完成/失败 | CLI: `zedIntegration.ts:560-566`<br>VSCode: 更新 ToolCall 状态 |
| `plan` | ✅ | ⚠️ | 任务计划TodoList | CLI: `zedIntegration.ts:547-552`<br>VSCode: 需要实现 Plan UI |
## 功能缺失对比
### VSCode 扩展缺失的功能
| 功能 | 影响 | 建议优先级 |
| -------------------------- | -------------------------- | ---------- |
| `session/cancel` 方法 | 用户无法取消正在运行的请求 | 🔴 高 |
| `agent_thought_chunk` 展示 | 看不到 Agent 的思考过程 | 🟡 中 |
| `plan` 类型展示 | 看不到 Agent 的任务计划 | 🟡 中 |
| Audio/Image content blocks | 不支持多模态输入 | 🟢 低 |
| Embedded resources | 不支持嵌入式资源 | 🟢 低 |
| `session/load` | CLI 本身不支持,优先级低 | 🟢 低 |
### CLI 缺失的功能
| 功能 | 影响 | 建议优先级 |
| ---------------- | ------------------------ | ---------- |
| `session/load` | 无法恢复历史会话 | 🟡 中 |
| `session/list` | 需要 VSCode 扩展自己管理 | 🟢 低 |
| `session/switch` | 需要 VSCode 扩展自己管理 | 🟢 低 |
## 能力声明对比
### CLI Agent Capabilities
```typescript
{
protocolVersion: 1,
authMethods: [
{ id: 'use_openai', name: 'Use OpenAI API key' },
{ id: 'qwen_oauth', name: 'Qwen OAuth' }
],
agentCapabilities: {
loadSession: false, // ❌ 不支持加载历史会话
promptCapabilities: {
image: true, // ✅ 支持图片输入
audio: true, // ✅ 支持音频输入
embeddedContext: true // ✅ 支持嵌入式上下文
}
}
}
```
### VSCode Client Capabilities
```typescript
{
protocolVersion: 1,
clientCapabilities: {
fs: {
readTextFile: true, // ✅ 支持读文件
writeTextFile: true // ✅ 支持写文件
}
}
}
```
## 工具类型 (Tool Kinds)
所有工具调用都有一个 `kind` 字段,用于分类:
| Kind | 描述 | 示例 |
| --------- | -------- | ------------------------- |
| `read` | 读取操作 | Read, ReadManyFiles, Glob |
| `edit` | 编辑操作 | Edit, Write |
| `delete` | 删除操作 | Delete files/directories |
| `move` | 移动操作 | Move/rename files |
| `search` | 搜索操作 | Grep, Search |
| `execute` | 执行操作 | Bash, RunCommand |
| `think` | 思考操作 | Task (sub-agent) |
| `fetch` | 网络请求 | WebFetch, API calls |
| `other` | 其他操作 | TodoWrite, etc. |
## 权<><E69D83><EFBFBD>确认流程
```mermaid
sequenceDiagram
participant CLI as qwen CLI
participant VSCode as VSCode Extension
participant User as User
CLI->>VSCode: session/request_permission
Note over CLI,VSCode: 包含 toolCall 详情和选项
VSCode->>User: 显示权限请求 UI
User->>VSCode: 选择选项 (allow_once/always/reject)
VSCode->>CLI: 返回用户选择
CLI->>CLI: 根据选择执行或取消工具
```
权限选项类型:
- `allow_once`: 仅允许一次
- `allow_always`: 始终允许(针对文件/命令/服务器)
- `reject_once`: 拒绝一次
- `reject_always`: 始终拒绝
## Schema <20><><EFBFBD>
### 如何使用 Schema
VSCode 扩展现在有完整的 Zod schema 定义:
```typescript
import * as schema from './acp/schema.js';
// 验证请求
const params: schema.InitializeRequest = {
protocolVersion: schema.PROTOCOL_VERSION,
clientCapabilities: { ... }
};
// 运行时验证
schema.initializeRequestSchema.parse(params);
```
### 验证的好处
1. **类型安全**: TypeScript 编译时检查
2. **运行时验证**: 捕获协议不匹配错误
3. **文档化**: Schema 即文档
4. **一目了然**: 清楚知道哪些字段是必需的
## 下一步建议
### 高优先级
1. **实现 `session/cancel`**: 允许用户取消正在运行的请求
-`AcpConnection` 中实现 `cancel()` 方法
- 在 Webview UI 添加取消按钮
2. **实现 `agent_thought_chunk` 展示**: 显示 Agent 的思考过程
- 在 Webview 中添加 "思考中..." 样式
- 可折叠显示详细思考内容
### 中优先级
3. **实现 `plan` 类型展示**: 显示任务计划列表
- 设计 Todo/Plan 组件
- 实时更新任务状态
4. **添加 Schema 验证**: 在更多关键位置添加运行时验证
- `session/new` 参数验证
- `session/prompt` 参数验证
- 所有 `session/update` 类型验证
### 低优先级
5. **支持多模态内容**: 图片、音频输入
6. **支持嵌入式资源**: Resource blocks
7. **实现 `session/load`**: 需要先等 CLI 支持
## 参考资源
- **Schema 定义**: `packages/vscode-ide-companion/src/acp/schema.ts`
- **CLI 实现**: `packages/cli/src/zed-integration/`
- **VSCode 实现**: `packages/vscode-ide-companion/src/acp/AcpConnection.ts`
- **协议来源**: Google (Apache-2.0 License)