2026-06-09 23:15:17 +08:00
|
|
|
|
---
|
|
|
|
|
|
tags: [acp, websocket, proxy, claude-code, remote]
|
|
|
|
|
|
create time: 2026-06-09 22:30
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-06-08 23:08:57 +08:00
|
|
|
|
# acp-link — ACP 代理服务器
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
`acp-link` 是一个 ACP 代理服务器,将 WebSocket 客户端桥接到 ACP agent 的 stdio 接口。它让 ACP agent(如 Claude Code)可以通过 WebSocket 远程访问,而不仅限于本地 stdio。
|
|
|
|
|
|
|
|
|
|
|
|
> [!info]
|
2026-06-08 23:08:57 +08:00
|
|
|
|
> 源码目录:`packages/acp-link/`
|
|
|
|
|
|
> PR: #292
|
|
|
|
|
|
> 新增时间:2026-04-18
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
## 正文
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
### 核心特性
|
|
|
|
|
|
|
|
|
|
|
|
- **WebSocket → stdio 桥接**:将浏览器/远程客户端的 WebSocket 连接转换为 ACP agent 的 stdin/stdout NDJSON 流
|
|
|
|
|
|
- **会话管理**:创建、加载、恢复、列出、关闭会话
|
|
|
|
|
|
- **权限审批流程**:客户端可远程审批 agent 的工具权限请求
|
|
|
|
|
|
- **RCS 集成**:可与 Remote Control Server (RCS) 连接,将 ACP agent 注册到 RCS 并通过 Web UI 交互
|
|
|
|
|
|
- **HTTPS 支持**:内置自签名证书生成,支持安全连接
|
|
|
|
|
|
- **Token 认证**:自动生成或通过环境变量配置认证 token
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 架构
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 独立模式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
```mermaid
|
|
|
|
|
|
graph LR
|
|
|
|
|
|
A["浏览器/客户端 WS Client"] -->|"ws://host:port WebSocket"| B["acp-link Proxy Server"]
|
|
|
|
|
|
B -->|"spawn subprocess stdio/NDJSON"| C["ACP Agent Claude等"]
|
2026-06-08 23:08:57 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### RCS 集成模式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
```mermaid
|
|
|
|
|
|
graph LR
|
|
|
|
|
|
A["RCS Web UI /code/*"] -->|"ACP Relay WS WebSocket"| B["Remote Control Server RCS"]
|
|
|
|
|
|
B -->|"ACP events stdio/NDJSON"| C["acp-link + Agent"]
|
2026-06-08 23:08:57 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 文件结构
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
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
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 安装与使用
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 基本用法
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```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
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### CLI 参考
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
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")
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 认证
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
默认启动时自动生成随机 token。客户端连接时不要把 token 放在 URL 中:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
ws://localhost:9315/ws
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
> [!warning]
|
|
|
|
|
|
> 无法发送 `Authorization` header 的 WebSocket 客户端需要使用 `rcs.auth.<base64url-token>` 子协议传递 token。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
配置固定 token:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ACP_AUTH_TOKEN=my-fixed-token acp-link ccb-bun -- --acp
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
禁用认证(不推荐,仅用于开发):
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
acp-link --no-auth ccb-bun -- --acp
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### RCS 集成
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
acp-link 支持将 ACP agent 注册到 Remote Control Server,通过 Web UI 远程操控。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 连接方式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 通过环境变量配置 RCS 连接
|
|
|
|
|
|
ACP_RCS_URL=http://localhost:3000 \
|
|
|
|
|
|
ACP_RCS_TOKEN=sk-rcs-your-key \
|
|
|
|
|
|
acp-link ccb-bun -- --acp
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 注册流程(两步)
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
1. **REST 注册**:通过 `POST /v1/environments/bridge` 向 RCS 注册环境
|
|
|
|
|
|
2. **WS identify**:建立 WebSocket 连接后发送 `identify` 消息(携带 agentId),替代完整 `register`
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
> [!warning]
|
|
|
|
|
|
> RCS 的 ACP WebSocket 连接不接受 URL query token。acp-link 会通过 `rcs.auth.<base64url-token>` WebSocket 子协议发送 `ACP_RCS_TOKEN`。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
```mermaid
|
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
|
participant AL as acp-link
|
|
|
|
|
|
participant RCS as RCS
|
|
|
|
|
|
AL->>RCS: POST /v1/environments/bridge (REST 注册)
|
|
|
|
|
|
RCS-->>AL: { agentId, sessionId }
|
|
|
|
|
|
AL->>RCS: WS connect (WebSocket)
|
|
|
|
|
|
AL->>RCS: identify { agentId } (WS 标识)
|
|
|
|
|
|
RCS-->>AL: identified
|
|
|
|
|
|
AL->>RCS: ACP events (双向消息转发)
|
|
|
|
|
|
RCS-->>AL: user prompts/permissions
|
2026-06-08 23:08:57 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 权限模式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### permissionMode 传递链
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
权限模式通过整条链路传递:Web UI → RCS → acp-link → ACP agent。
|
|
|
|
|
|
|
|
|
|
|
|
支持的权限模式:
|
2026-06-09 23:15:17 +08:00
|
|
|
|
|
2026-06-08 23:08:57 +08:00
|
|
|
|
- `default` — 每次请求权限确认
|
|
|
|
|
|
- `auto` — 自动判断
|
|
|
|
|
|
- `acceptEdits` — 自动接受编辑
|
|
|
|
|
|
- `plan` — 规划模式
|
|
|
|
|
|
- `dontAsk` — 不询问
|
|
|
|
|
|
- `bypassPermissions` — 绕过权限(需 sandbox 环境)
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### fallback 链
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
当客户端未显式传递 permissionMode 时,使用以下 fallback 链:
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
> 客户端传值 > config.permissionMode > ACP_PERMISSION_MODE 环境变量
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ACP_PERMISSION_MODE=auto acp-link ccb-bun -- --acp
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 权限管道(2026-04-18 改进)
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 模式同步
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
`applySessionMode` 在 agent 切换权限模式时同步 `appState.toolPermissionContext.mode`,确保内部权限上下文与 ACP 客户端状态一致。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 统一权限流水线
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
`createAcpCanUseTool` 接入 `hasPermissionsToUseTool` 统一权限流水线,替代原来分散的处理逻辑。支持 `onModeChange` 回调,模式变更时实时同步。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### bypass 检测
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
`bypassPermissions` 模式增加可用性检测 — 仅在非 root 或 sandbox 环境中允许启用,防止权限绕过的安全风险。
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 环境变量
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 变量 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| `ACP_AUTH_TOKEN` | 固定认证 token(默认自动生成) |
|
|
|
|
|
|
| `ACP_PERMISSION_MODE` | 默认权限模式 fallback |
|
|
|
|
|
|
| `ACP_RCS_URL` | RCS 服务器地址(启用 RCS 集成) |
|
|
|
|
|
|
| `ACP_RCS_TOKEN` | RCS API token |
|
2026-06-09 23:15:17 +08:00
|
|
|
|
|
|
|
|
|
|
## 关联笔记
|
|
|
|
|
|
|
|
|
|
|
|
- [[acp-zed]]
|
|
|
|
|
|
- [[remote-control-self-hosting]]
|
|
|
|
|
|
- [[bridge-mode]]
|