mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
* fix: 添加 usage 字段缺失时的防御性防护 第三方 API(如智谱 GLM)在某些流式响应中不返回 usage 字段, 导致 usage.input_tokens 访问 undefined 崩溃并连锁影响后续所有请求。 - claude.ts: content_block_stop 创建消息时 fallback 到 EMPTY_USAGE - LocalAgentTask.tsx: usage 为 undefined 时提前返回 - tokens.ts: getTokenCountFromUsage 加 null guard 和 ?? 0 - cost-tracker.ts: input_tokens/output_tokens 加 ?? 0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: ACP Plan 展示 — 支持 session/update plan 类型的可视化 补全 PlanUpdate 类型定义(PlanEntry/Priority/Status),新建 PlanView 组件 渲染进度条、状态图标和优先级标签,在 ChatInterface 中处理 plan 更新逻辑。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: 穷鬼模式下跳过 verification agent 以节省 token Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test: 补充 RCS 后端 + 前端测试覆盖 (+116 tests) 后端新增 3 个测试文件 (70 tests): - automationState: normalize/snapshot/equals 纯函数 - client-payload: toClientPayload 协议转换 - transport-normalize: normalizePayload + extractContent 前端新增 2 个测试文件 (46 tests): - utils: formatTime/statusClass/truncate/extractEventText 等 - api-client: getUuid/setUuid/api GET/POST 错误处理 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: RCS ACP 页面添加权限模式选择器 + 权限响应修复 - 新增权限模式选择器 UI(6种模式:默认/自动接受编辑/跳过权限/规划/不询问/自动判断) - 权限模式通过 ACP _meta 从 web → acp-link → agent 全链路传递 - 修复 PermissionPanel 点击"允许"发送 cancelled 而非 selected 的 bug - 权限模式和模型选择持久化到 localStorage - acp-link 直接连接路径同步支持 permissionMode 透传 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: RCS Web UI 重构 + QR 修复 + ACP 扫描自动跳转 - RCS Web UI 组件全面重构: Dialog 迁移 Radix UI, lazy loading, 主题系统改进, 组件样式优化 - IdentityPanel QR 码显示修复: requestAnimationFrame 延迟绘制 解决 Radix Dialog Portal 挂载时序问题 - ACP QR 扫描自动跳转: IdentityPanel 扫描 ACP 格式 { url, token } 后存储 sessionStorage 并跳转 /code/?acp=1 - 新增 ACPDirectView 组件: ACP 直连视图, 用 ACPClient 连接并 渲染 ACPMain 聊天界面 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: ACP 权限管道改进 — 模式同步 + bypass 检测 + 统一权限流水线 - agent.ts: applySessionMode 同步 appState.toolPermissionContext.mode - agent.ts: bypassPermissions 可用性检测 (非 root 或 sandbox 环境) - permissions.ts: createAcpCanUseTool 接入 hasPermissionsToUseTool 统一权限流水线, 替代原来分散的处理逻辑 - permissions.ts: 支持 onModeChange 回调, 模式变更时实时同步 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: acp-link 支持 permissionMode 默认值传递给 agent 客户端 (Zed/VS Code 等) 的 new_session 不一定携带 permissionMode, 导致 agent 收到 _meta: undefined, permission 回退到 default。 修复: handleNewSession 使用 fallback 链: 客户端传值 > config.permissionMode > ACP_PERMISSION_MODE 环境变量 使用: ACP_PERMISSION_MODE=auto acp-link claude Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 更新文档及说明 * fix: 修复类型错误 * chore: 提交脚本 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
206 lines
7.3 KiB
Markdown
206 lines
7.3 KiB
Markdown
# acp-link — ACP 代理服务器
|
||
|
||
> 源码目录:`packages/acp-link/`
|
||
> PR: #292
|
||
> 新增时间:2026-04-18
|
||
|
||
## 一、功能概述
|
||
|
||
`acp-link` 是一个 ACP (Agent Client Protocol) 代理服务器,将 WebSocket 客户端桥接到 ACP agent 的 stdio 接口。它让 ACP agent(如 Claude Code)可以通过 WebSocket 远程访问,而不仅限于本地 stdio。
|
||
|
||
### 核心特性
|
||
|
||
- **WebSocket → stdio 桥接**:将浏览器/远程客户端的 WebSocket 连接转换为 ACP agent 的 stdin/stdout NDJSON 流
|
||
- **会话管理**:创建、加载、恢复、列出、关闭会话
|
||
- **权限审批流程**:客户端可远程审批 agent 的工具权限请求
|
||
- **RCS 集成**:可与 Remote Control Server (RCS) 连接,将 ACP agent 注册到 RCS 并通过 Web UI 交互
|
||
- **HTTPS 支持**:内置自签名证书生成,支持安全连接
|
||
- **Token 认证**:自动生成或通过环境变量配置认证 token
|
||
|
||
## 二、架构
|
||
|
||
### 独立模式
|
||
|
||
```
|
||
┌──────────────────┐ WebSocket ┌──────────────────┐ stdio/NDJSON ┌──────────────┐
|
||
│ 浏览器/客户端 │ ◄──────────────►│ acp-link │ ◄────────────────►│ ACP Agent │
|
||
│ (WS Client) │ ws://host:port │ (Proxy Server) │ spawn subprocess │ (Claude等) │
|
||
└──────────────────┘ └──────────────────┘ └──────────────┘
|
||
```
|
||
|
||
### RCS 集成模式
|
||
|
||
```
|
||
┌──────────────┐ WebSocket ┌──────────────────┐ stdio/NDJSON ┌──────────────┐
|
||
│ RCS Web UI │ ◄──────────────►│ Remote Control │ ◄─────────────────►│ acp-link │
|
||
│ (/code/*) │ ACP Relay WS │ Server (RCS) │ ACP events │ + Agent │
|
||
└──────────────┘ └──────────────────┘ └──────────────┘
|
||
```
|
||
|
||
### 文件结构
|
||
|
||
```
|
||
packages/acp-link/
|
||
├── src/
|
||
│ ├── server.ts # 主服务器:WS 连接管理、会话管理、权限处理、消息桥接
|
||
│ ├── rcs-upstream.ts # RCS 上游客户端:REST 注册 + WS identify 两步流程
|
||
│ ├── cert.ts # TLS 证书生成(自签名)
|
||
│ ├── logger.ts # 日志模块
|
||
│ ├── types.ts # JSON-RPC 和 ACP 协议类型定义
|
||
│ ├── cli/
|
||
│ │ ├── bin.ts # CLI 入口
|
||
│ │ ├── command.ts # 命令行参数解析
|
||
│ │ ├── app.ts # 应用启动
|
||
│ │ └── context.ts # 上下文配置
|
||
│ └── __tests__/ # 测试(cert, server, types)
|
||
├── package.json
|
||
└── tsconfig.json
|
||
```
|
||
|
||
## 三、安装与使用
|
||
|
||
### 基本用法
|
||
|
||
```bash
|
||
# 直接运行(在 monorepo 中)
|
||
# 注意:claude 本身不支持 ACP,需要用 ccb-bun --acp 启动 ACP agent
|
||
bun packages/acp-link/src/cli/bin.ts ccb-bun -- --acp
|
||
|
||
# 指定端口和主机
|
||
acp-link --port 9000 --host 0.0.0.0 ccb-bun -- --acp
|
||
|
||
# 启用 HTTPS(自签名证书)
|
||
acp-link --https ccb-bun -- --acp
|
||
|
||
# 调试模式
|
||
acp-link --debug ccb-bun -- --acp
|
||
```
|
||
|
||
### CLI 参考
|
||
|
||
```
|
||
USAGE
|
||
acp-link [--port value] [--host value] [--debug] [--no-auth] [--https] <command>...
|
||
acp-link --help
|
||
acp-link --version
|
||
|
||
FLAGS
|
||
[--port] Port to listen on [default = 9315]
|
||
[--host] Host to bind to [default = localhost]
|
||
[--debug] Enable debug logging to file
|
||
[--no-auth] Disable authentication (dangerous)
|
||
[--https] Enable HTTPS with self-signed cert
|
||
-h --help Print help information and exit
|
||
-v --version Print version information and exit
|
||
|
||
ARGUMENTS
|
||
command... Agent command followed by its arguments (e.g. "ccb-bun -- --acp")
|
||
```
|
||
|
||
## 四、认证
|
||
|
||
默认启动时自动生成随机 token。客户端连接时需通过 query 参数传递:
|
||
|
||
```
|
||
ws://localhost:9315/ws?token=<your-token>
|
||
```
|
||
|
||
配置固定 token:
|
||
|
||
```bash
|
||
ACP_AUTH_TOKEN=my-fixed-token acp-link ccb-bun -- --acp
|
||
```
|
||
|
||
禁用认证(不推荐,仅用于开发):
|
||
|
||
```bash
|
||
acp-link --no-auth ccb-bun -- --acp
|
||
```
|
||
|
||
## 五、RCS 集成
|
||
|
||
acp-link 支持将 ACP agent 注册到 Remote Control Server,通过 Web UI 远程操控。
|
||
|
||
### 连接方式
|
||
|
||
```bash
|
||
# 通过环境变量配置 RCS 连接
|
||
ACP_RCS_URL=http://localhost:3000 \
|
||
ACP_RCS_TOKEN=sk-rcs-your-key \
|
||
ACP_RCS_NAME=my-agent \
|
||
acp-link ccb-bun -- --acp
|
||
```
|
||
|
||
### 注册流程(两步)
|
||
|
||
1. **REST 注册**:通过 `POST /v1/environments/bridge` 向 RCS 注册环境
|
||
2. **WS identify**:建立 WebSocket 连接后发送 `identify` 消息(携带 agentId),替代完整 `register`
|
||
|
||
```
|
||
acp-link RCS
|
||
│ │
|
||
│── POST /v1/environments/bridge ──►│ (REST 注册)
|
||
│◄── { agentId, sessionId } ───────│
|
||
│ │
|
||
│── WS connect ─────────────────►│ (WebSocket)
|
||
│── identify { agentId } ────────►│ (WS 标识)
|
||
│◄── registered ─────────────────│
|
||
│ │
|
||
│── ACP events ─────────────────►│ (双向消息转发)
|
||
│◄── user prompts/permissions ───│
|
||
```
|
||
|
||
## 六、权限模式
|
||
|
||
### permissionMode 传递链
|
||
|
||
权限模式通过整条链路传递:Web UI → RCS → acp-link → ACP agent。
|
||
|
||
支持的权限模式:
|
||
- `default` — 每次请求权限确认
|
||
- `auto` — 自动判断
|
||
- `acceptEdits` — 自动接受编辑
|
||
- `plan` — 规划模式
|
||
- `dontAsk` — 不询问
|
||
- `bypassPermissions` — 绕过权限(需 sandbox 环境)
|
||
|
||
### fallback 链
|
||
|
||
当客户端未显式传递 permissionMode 时,使用以下 fallback 链:
|
||
|
||
```
|
||
客户端传值 > config.permissionMode > ACP_PERMISSION_MODE 环境变量
|
||
```
|
||
|
||
示例:
|
||
|
||
```bash
|
||
ACP_PERMISSION_MODE=auto acp-link ccb-bun -- --acp
|
||
```
|
||
|
||
## 七、权限管道(2026-04-18 改进)
|
||
|
||
### 模式同步
|
||
|
||
`applySessionMode` 在 agent 切换权限模式时同步 `appState.toolPermissionContext.mode`,确保内部权限上下文与 ACP 客户端状态一致。
|
||
|
||
### 统一权限流水线
|
||
|
||
`createAcpCanUseTool` 接入 `hasPermissionsToUseTool` 统一权限流水线,替代原来分散的处理逻辑。支持 `onModeChange` 回调,模式变更时实时同步。
|
||
|
||
### bypass 检测
|
||
|
||
`bypassPermissions` 模式增加可用性检测 — 仅在非 root 或 sandbox 环境中允许启用,防止权限绕过的安全风险。
|
||
|
||
## 八、环境变量
|
||
|
||
| 变量 | 说明 |
|
||
|------|------|
|
||
| `ACP_AUTH_TOKEN` | 固定认证 token(默认自动生成) |
|
||
| `ACP_PERMISSION_MODE` | 默认权限模式 fallback |
|
||
| `ACP_RCS_URL` | RCS 服务器地址(启用 RCS 集成) |
|
||
| `ACP_RCS_TOKEN` | RCS API token |
|
||
| `ACP_RCS_NAME` | Agent 名称(在 RCS 中显示) |
|
||
| `ACP_RCS_CHANNEL_GROUP` | Channel group ID |
|
||
| `ACP_MAX_SESSIONS` | 最大会话数 |
|