跳到正文
capri 基于 ACP 协议的远程 Agent 控制台
readme

基于 ACP 协议的远程 Agent 控制台

把本机的 Agent,装进任何一块屏幕

手机、平板、另一台电脑的浏览器里,继续本机正在跑的会话。Agent 仍然在你自己的机器上读文件、跑命令;浏览器只负责掌控。

▸ 一个进程、一个端口,同时提供 Web 界面和接口。

capri-host — Agent 节点

    
capabilities

能力 — 按 --help 的样子排

-a, --anywhere 换个屏幕,接着说在手机、平板、另一台电脑的浏览器里,继续本机正在跑的会话。恢复会话不重放全量历史,打开就能接上。
-s, --switch 多台机器,一个入口左上角切换节点:家里的、办公室的、服务器上的。每台机器一个标识,中继负责找到它。
-p, --parity 该有的都有斜杠命令、权限审批、图片、后台任务、Git / MCP / 记忆——对齐终端界面的常用能力。
-l, --local 代码不出你的机器Agent 在节点那台机器上自己读文件、跑命令。浏览器只发指令、看结果。中继不执行任何命令。
-o, --onebinary 一个进程,一个端口节点二进制里嵌着前端构建产物,打开根路径就是界面,同端口提供接口。不用 nginx。
-t, --transport 先 QUIC,挡了就退节点到中继默认走 QUIC;UDP 被挡时自动回退 WebSocket,功能不受影响。域名经代理丢 UDP 时可强制拨号地址。
-p, --pairing 配一次,之后就忘了它中继启动打印六位配对码,十五分钟有效。配对成功后 token 写在那台机器上,重启只需要中继地址。
-q, --quiet 没人看的时候安静中继模式下没有浏览器订阅时,节点暂停实时上报以省流量;打开页面自动恢复。
components

三个组件

capri-fe:5173

浏览器控制台

对齐终端界面常用能力的 Web 前端:斜杠命令、权限审批、图片、后台任务、Git / MCP / 记忆。左上角随手切换机器。

  • 会话续传,不重放全量历史
  • 权限审批与作用域记忆
  • 图片、后台任务、子代理视图
  • 密钥只存在这台浏览器里
capri-host:8765

Agent 节点

跑在有 Agent 的那台机器上,自动拉起内核,并把 Web 界面一起端出来。不用 nginx,不用另起静态服务器。

  • 单进程内嵌前端构建产物
  • 本机直连或中继两种模式
  • 无人订阅时暂停上报省流量
  • 配对 token 落盘,重启免配对
capri-hub:8787

中继节点

汇集你所有的节点:家里的、办公室的、服务器上的。它不执行任何命令,只做配对、发现和转发。

  • QUIC 主通道,挡了自动回退
  • 六位配对码,十五分钟有效
  • 浏览器门禁与 CORS 收口
  • 只在一台机器上用时不必部署
architecture

一次请求要走的路

浏览器 ──▶ 中继 :8787 ──▶ 节点 :8765 ──▶ 内核
                       │
                       └── QUIC :8788 ⇄ WebSocket
浏览器 任何设备只负责掌控:发指令、看结果、审批权限。门禁密钥存在本地,不进构建产物。
中继 HTTP 8787配对、发现、转发三件事。不执行命令,不落业务数据。可选,单机场景省掉。
主通道 QUIC UDP 8788节点与中继之间的长连接。UDP 被安全组挡住时自动回退 WebSocket。
节点 HTTP 8765你的机器。拉起内核、内嵌界面、代理接口,同一个端口全都给了。
内核 stdio JSON-RPC以标准输入输出跑的 Agent 进程,按 ACP 协议交换会话事件、工具调用与权限请求。

▸ 只在一台机器上用?不必起中继,直接跑节点即可。

0组件
0端口起步
0位配对码
0分钟有效
0命令在中继执行
synopsis

快速开始

本机:一条命令
chmod +x ./capri-host
./capri-host
# 浏览器打开 http://localhost:8765
从 Releases 下载对应平台的二进制即可。
从源码跑
go run ./cmd/capri-host
需要 Go 1.26 以上。
起中继
FE_TOKEN=$(openssl rand -hex 24) go run ./cmd/capri-hub
启动日志里有六位配对码。生产务必设门禁密钥。
把节点接进来
HUB_URL=http://your-relay:8787 \
HUB_PAIR_CODE=XXXXXX \
HOST_ID=macbook HOST_NAME="办公室 Mac" \
  ./capri-host
每台机器给一个不同的标识。
查看 / 换新配对码
curl http://127.0.0.1:8787/api/pairing
curl -X POST http://127.0.0.1:8787/api/pairing/rotate
码填错或过期就换一个,节点带新码重启。
前端开发
npm install
npm run dev
# 代理默认指向本机节点;换目标:
VITE_PROXY_TARGET=http://your-relay:8787 npm run dev
开发服务器会把接口与事件流代理过去。
environment

环境变量

PORT HTTP 端口(界面 + 接口)默认 8765 · 节点
GROK_BIN Grok Build 可执行文件默认 grok · 节点
HOST_ID 多节点时用来区分默认 local · 节点
HOST_NAME 界面上显示的名字默认 Local Host · 节点
FE_TOKEN 入口鉴权;与中继同语义,建议同值默认 — · 节点
HUB_URL 设置后进入中继模式默认 — · 节点
HUB_PAIR_CODE 一次性配对码默认 — · 节点
HOST_TOKEN 已配对 token,优先于配对码默认 — · 节点
XAI_API_KEY 可选;否则用内核自带登录默认 — · 节点
HUB_QUIC_HOST 强制 QUIC 拨号地址(代理丢 UDP 时用)默认 — · 节点
PORT HTTP 端口默认 8787 · 中继
QUIC_PORT 节点主通道 UDP 端口默认 8788 · 中继
FE_TOKEN 浏览器访问密钥,生产必设默认 — · 中继
REQUIRE_FE_TOKEN 设为 1 时,没配密钥会拒绝启动默认 — · 中继
CORS_ORIGINS 生产写成前端真实源默认 * · 中继
VITE_PROXY_TARGET 开发代理目标默认 http://localhost:8765 · 前端
j/k 滚动 g/G 首尾 1-8 跳章 ? 键位 内容指纹 cf2b8019b7cd