# 第八章:跨机器与跨团队协作 -- Bridge、Remote Control、ACP > 让 Claude 从另一台机器、浏览器或 IDE 里被操控。 ## Bridge 模式与 Remote Control -- 在浏览器里用 Claude Bridge 模式是 Claude Code 的远程控制核心。启用后,你的本地 Claude Code 会话可以被远程客户端(浏览器、Web UI、其他工具)访问和操控。这在你想从另一台机器控制本地的 Claude,或者让团队成员在浏览器里审批权限请求时特别有用。 Bridge 由 `BRIDGE_MODE` feature flag 控制,dev 模式和默认构建都已启用。你不需要额外做任何事来开启它,只需要使用对应命令即可。 有两种常见的启动方式。第一种是从 REPL 内部启动:在 Claude Code 的对话中输入 `/remote-control`,它会将当前会话桥接到远程控制服务,并在终端显示一个 URL。 ``` > /remote-control Remote Control connecting... This session is available via Remote Control at https://rcs.example.com/code?bridge=abc123 ``` 再次输入 `/remote-control` 会弹出对话框,提供三个选项:断开连接、显示二维码(方便手机扫码)、或继续当前连接。 第二种方式是通过命令行直接启动,这会进入"环境型"Remote Control 模式,注册一个可被分配工作的环境: ```bash # 以下五个命令完全等价 claude remote-control claude rc claude remote claude sync claude bridge ``` 启动后,终端会持续轮询任务,等待远程客户端分配工作。浏览器打开终端显示的 URL 后即可创建会话、发送消息、审批权限请求。 ### 自托管 Remote Control Server (RCS) RCS 是 Bridge 模式的服务端,负责接收 CLI 的注册、分发任务、转发消息。它可以部署在你自己的服务器上,所有数据流经你控制的网络,不经过任何第三方基础设施。 RCS 是一个纯内存的 HTTP + WebSocket 服务,基于 Hono 框架构建。它支持两套传输协议:V1 的 WebSocket 长连接和 V2 的 SSE + HTTP POST。 部署 RCS 最简单的方式是 Docker。在项目根目录执行: ```bash docker build -t rcs:latest -f packages/remote-control-server/Dockerfile . ``` 然后启动容器: ```bash docker run -d \ --name rcs \ -p 3000:3000 \ -e RCS_API_KEYS=sk-rcs-your-secret-key-here \ -e RCS_BASE_URL=https://rcs.example.com \ --restart unless-stopped \ rcs:latest ``` 也可以用 Docker Compose: ```yaml version: "3.8" services: rcs: build: context: . dockerfile: packages/remote-control-server/Dockerfile ports: - "3000:3000" environment: - RCS_API_KEYS=sk-rcs-your-secret-key-here - RCS_BASE_URL=https://rcs.example.com restart: unless-stopped ``` RCS 的核心配置通过环境变量控制。`RCS_API_KEYS` 是唯一的必填项,它既是客户端认证的 API Key,也用于 JWT 令牌签名,务必设置一个足够强的密钥。 在 Claude Code 这边,连接到自托管 RCS 只需要设置两个环境变量: ```bash export CLAUDE_BRIDGE_BASE_URL="https://rcs.example.com" export CLAUDE_BRIDGE_OAUTH_TOKEN="sk-rcs-your-secret-key-here" ``` 设置 `CLAUDE_BRIDGE_BASE_URL` 后,代码会自动识别为自托管模式,跳过所有云端门控检查,不需要 claude.ai 账户。之后正常启动 Claude Code 并执行 `/remote-control` 即可。 如果你使用反向代理(Nginx 或 Caddy),需要确保代理支持 WebSocket 升级: ```nginx server { listen 443 ssl; server_name rcs.example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400s; } } ``` Caddy 会自动处理 WebSocket 升级,配置更简单: ``` rcs.example.com { reverse_proxy localhost:3000 } ``` ### RCS Web UI RCS 自带一个 Web 控制面板,通过 `/code/*` 路径访问。它是一个 React 19 + Vite + Radix UI 构建的单页应用,支持暗色和亮色主题切换。 Web UI 提供的核心功能包括: - 查看所有已注册的运行环境,区分 Claude Code 和 ACP Agent 类型 - 创建和管理远程会话,实时查看对话消息和工具调用 - 审批 Claude Code 的工具权限请求,支持六种权限模式切换 - 查看 Plan 可视化,包含进度条、状态图标和优先级标签 - 查看 Autopilot 状态(`standby` 等待下一轮、`sleeping` 模型休眠中) - 通过 QR 码扫码快速连接 Web UI 使用 UUID 认证,无需用户账户系统,适合部署在受信任的内网环境中。 ## ACP 协议 -- 把 Claude Code 接入 IDE ACP(Agent Client Protocol)是一种标准化的 stdio 协议,允许 IDE 和编辑器通过 stdin/stdout 的 NDJSON 流驱动 AI Agent。Claude Code 实现了完整的 ACP agent 端,可以被 Zed、Cursor 等支持 ACP 的客户端直接调用。 启用 ACP 模式只需要 `--acp` 参数。它是一个 CLI 快速路径(位于 `src/entrypoints/cli.tsx` 中),由 `FEATURE_ACP` feature flag 控制。 ```bash claude --acp ``` 启动后,Claude Code 不再进入 REPL,而是通过 stdin/stdout 与 ACP 客户端通信。所有 console 输出都被重定向到 stderr,避免干扰 ACP 的 NDJSON 协议流。 ### 在 Zed 中接入 Claude Code Zed 是最典型的 ACP 客户端。打开 Zed 的设置(`Cmd+,`),在 `settings.json` 中添加: ```json { "agent_servers": { "claude-code": { "type": "custom", "command": "claude", "args": ["--acp"] } } } ``` 如果你需要显式传入 API 凭证(而不是依赖 `settings.json` 中的配置),可以在 `env` 字段中指定: ```json { "agent_servers": { "claude-code": { "command": "claude", "args": ["--acp"], "env": { "ANTHROPIC_BASE_URL": "https://api.example.com/v1", "ANTHROPIC_AUTH_TOKEN": "sk-xxx" } } } } ``` 重启 Zed 后,按 `Cmd+'` 打开 Agent Panel,在顶部下拉菜单中选择 "claude-code" 即可开始对话。 在 ACP 模式下,Claude Code 支持完整的会话管理(新建、恢复、加载、分叉、关闭)、斜杠命令和 Skills(输入 `/` 查看列表,如 `/commit`、`/review`)、权限审批、模型切换和模式切换。当 Zed 重启时,之前的会话可以自动恢复并回放历史消息。 ### 权限模式与 ACP 权限管道 ACP 模式下的权限系统与 REPL 模式略有不同。当 Claude 需要使用某个工具时,权限请求会被转发到 ACP 客户端(如 Zed),由用户在 IDE 中选择 Allow、Reject 或 Always Allow。 支持六种权限模式:`default`(每次确认)、`auto`(自动判断)、`acceptEdits`(自动接受文件编辑)、`plan`(规划模式)、`dontAsk`(不询问,未预批准则拒绝)、`bypassPermissions`(绕过所有权限检查,仅在非 root 或 sandbox 环境下可用)。 权限模式可以通过环境变量设置默认值: ```bash ACP_PERMISSION_MODE=auto claude --acp ``` 也可以在 ACP 客户端中动态切换。当 Claude 处于 Plan 模式并执行退出计划时,ACP 会显示一个特殊的选项面板,让你选择退出后进入哪种模式(auto、acceptEdits、default、plan、bypassPermissions)。 ## acp-link -- 通过网络暴露 ACP Agent ACP 协议本身基于 stdio,意味着 ACP agent 只能在本机使用。`acp-link` 是一个 WebSocket 代理服务器,将远程 WebSocket 客户端桥接到本地 ACP agent 的 stdio 接口,让 ACP agent 可以通过网络访问。 ### 独立使用 最基本的用法:启动 acp-link,让它管理一个 ACP agent 子进程: ```bash acp-link claude --acp ``` 默认监听 `localhost:9315`。你也可以指定端口和主机: ```bash acp-link --port 9000 --host 0.0.0.0 claude --acp ``` 启用 HTTPS(自动生成自签名证书): ```bash acp-link --https claude --acp ``` acp-link 启动后会自动生成一个随机认证 token。WebSocket 客户端通过 `rcs.auth.` 子协议传递 token。如果需要固定 token: ```bash ACP_AUTH_TOKEN=my-fixed-token acp-link claude --acp ``` 开发环境下可以禁用认证(不推荐在生产环境使用): ```bash acp-link --no-auth claude --acp ``` ### 与 RCS 集成 acp-link 可以将 ACP agent 注册到 RCS,通过 RCS 的 Web UI 进行交互。设置两个环境变量即可: ```bash ACP_RCS_URL=http://localhost:3000 \ ACP_RCS_TOKEN=sk-rcs-your-key \ acp-link claude --acp ``` 注册流程分两步:首先通过 REST API 向 RCS 注册环境,然后建立 WebSocket 连接并发送 identify 消息。之后 ACP agent 会出现在 RCS Web UI 的环境列表中,与普通 Claude Code 会话一起管理和监控。 ## IDE 集成 -- 在编辑器里使用 Claude Code 除了通过 ACP 协议接入 Zed 等原生 ACP 客户端,Claude Code 还提供 `/ide` 命令,帮助检测和连接正在运行的 IDE。这个命令会自动扫描本地已安装的 IDE(包括 JetBrains 系列和各种终端),并提供选择界面。 在 REPL 中输入: ``` /ide ``` Claude Code 会检测本地运行的 IDE 和支持的终端,让你选择要连接的目标。连接后,Claude Code 可以通过 IDE 的 Language Server Protocol 获取代码上下文,提供更精准的编辑建议。 ## SSH 远程模式 `SSH_REMOTE` feature 允许 Claude Code 通过 SSH 在远程机器上工作。在 main.tsx 中通过 `feature('SSH_REMOTE')` 控制,当启用时会接管 `--ssh` 参数和相关的 SSH 连接逻辑。 启用 SSH 远程模式后,Claude Code 可以在远程机器上启动会话,通过 SSH 隧道保持通信。这对于在服务器或 CI 环境中使用 Claude Code 特别有用。`/remote-setup` 命令提供辅助设置流程,`/remote-env` 命令提供远程环境管理界面。 ## 常见问题 **Remote Control is not available in this build** -- `BRIDGE_MODE` feature flag 未启用。使用 dev 模式(`bun run dev`)默认启用,或确保构建时包含该 flag。 **认证失败 (401 Unauthorized)** -- 检查 `CLAUDE_BRIDGE_OAUTH_TOKEN` 是否与 RCS 的 `RCS_API_KEYS` 中的值完全匹配,注意排除多余空格或换行。 **WebSocket 连接中断** -- 如果使用反向代理,确认已配置 WebSocket 升级(`Upgrade` / `Connection` 头),`proxy_read_timeout` 建议设为 86400 秒。 **RCS 重启后数据丢失** -- RCS 使用纯内存存储,重启后所有会话和环境数据都会清除。`/app/data` 卷已预留但当前未使用。 ## 下一步 - 想配置 Provider 和模型,看 [第二章](./02-providers.md) - 想了解权限模式和安全配置,看 [第九章](./09-budget-caching-hooks.md) - 想在 CI 流水线中使用 Claude Code,看 [第十一章](./11-ci-integration.md) - 想处理连接问题和其他报错,看 [第十章](./10-troubleshooting.md)