跳到正文
Capriops
Capri FE :5173Capri Host :8765Capri Hub :8787

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

Capricorn

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

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

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

三个组件

3 units
Capri FE浏览器控制台 · React 19 · TypeScript · Vite · Tailwind :5173 对齐终端界面常用能力的 Web 前端:斜杠命令、权限审批、图片、后台任务、Git / MCP / 记忆。左上角随手切换机器。
Capri HostAgent 节点 · Go 1.26 · ACP · stdio JSON-RPC :8765 跑在有 Agent 的那台机器上,自动拉起内核,并把 Web 界面一起端出来。不用 nginx,不用另起静态服务器。
Capri Hub中继节点 · Go 1.26 · QUIC · WebSocket :8787 汇集你所有的节点:家里的、办公室的、服务器上的。它不执行任何命令,只做配对、发现和转发。

总览

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

一次请求要走的路

path
01 浏览器任何设备

只负责掌控:发指令、看结果、审批权限。门禁密钥存在本地,不进构建产物。

02 中继HTTP 8787

配对、发现、转发三件事。不执行命令,不落业务数据。可选,单机场景省掉。

03 主通道QUIC UDP 8788

节点与中继之间的长连接。UDP 被安全组挡住时自动回退 WebSocket。

04 节点HTTP 8765

你的机器。拉起内核、内嵌界面、代理接口,同一个端口全都给了。

05 内核stdio JSON-RPC

以标准输入输出跑的 Agent 进程,按 ACP 协议交换会话事件、工具调用与权限请求。

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

内容指纹

derived

这条曲线以内容指纹为随机种子生成,不是流量数据。指纹不变,波形不变。
cf2b8019b7cda9d736a56e25ba286066fba991d85ad38f409fb9f9907371b83d

能力

8 caps
01换个屏幕,接着说

在手机、平板、另一台电脑的浏览器里,继续本机正在跑的会话。恢复会话不重放全量历史,打开就能接上。

02多台机器,一个入口

左上角切换节点:家里的、办公室的、服务器上的。每台机器一个标识,中继负责找到它。

03该有的都有

斜杠命令、权限审批、图片、后台任务、Git / MCP / 记忆——对齐终端界面的常用能力。

04代码不出你的机器

Agent 在节点那台机器上自己读文件、跑命令。浏览器只发指令、看结果。中继不执行任何命令。

05一个进程,一个端口

节点二进制里嵌着前端构建产物,打开根路径就是界面,同端口提供接口。不用 nginx。

06先 QUIC,挡了就退

节点到中继默认走 QUIC;UDP 被挡时自动回退 WebSocket,功能不受影响。域名经代理丢 UDP 时可强制拨号地址。

07配一次,之后就忘了它

中继启动打印六位配对码,十五分钟有效。配对成功后 token 写在那台机器上,重启只需要中继地址。

08没人看的时候安静

中继模式下没有浏览器订阅时,节点暂停实时上报以省流量;打开页面自动恢复。

内容源清单

8 docs · 4688 字
doc01总览 — Capri 是什么、三个组件怎么分工、什么时候需要哪一个。
doc02本机上手 — 一台机器、一个进程、一个端口,五分钟跑起来。
doc03远程与多机 — 起一台中继,把家里和办公室的机器都接进来,从任何地方选机器。
doc04架构与数据通路 — 一次请求从浏览器到 Agent 走过的每一段,以及每段负责什么。
doc05环境变量 — 三个组件的全部环境变量、默认值与含义。
doc06前端开发 — 本地跑前端、把代理指到中继、以及把新界面塞回节点二进制。
doc07日常运维 — 后台运行、开机自启、端口占用、升级顺序。
doc08排障 — 常见现象与处理,按"先看哪里"排序。
unit:5173Capri FE — 浏览器控制台
unit:8765Capri Host — Agent 节点
unit:8787Capri Hub — 中继节点
cap01换个屏幕,接着说
cap02多台机器,一个入口
cap03该有的都有
cap04代码不出你的机器
cap05一个进程,一个端口
cap06先 QUIC,挡了就退
cap07配一次,之后就忘了它
cap08没人看的时候安静
envhostPORT = 8765
envhostGROK_BIN = grok
envhostHOST_ID = local
envhostHOST_NAME = Local Host
envhostFE_TOKEN = —
envhostHUB_URL = —
envhostHUB_PAIR_CODE = —
envhostHOST_TOKEN = —
envhostXAI_API_KEY = —
envhostHUB_QUIC_HOST = —
envhubPORT = 8787
envhubQUIC_PORT = 8788
envhubFE_TOKEN = —
envhubREQUIRE_FE_TOKEN = —
envhubCORS_ORIGINS = *
envfeVITE_PROXY_TARGET = http://localhost:8765
hashsha256cf2b8019b7cda9d736a56e25ba286066fba991d85ad38f409fb9f9907371b83d

快速开始

runbook
本机:一条命令
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
开发服务器会把接口与事件流代理过去。

环境变量

16 params
scope变量默认说明
节点PORT8765HTTP 端口(界面 + 接口)
节点GROK_BINgrokGrok Build 可执行文件
节点HOST_IDlocal多节点时用来区分
节点HOST_NAMELocal Host界面上显示的名字
节点FE_TOKEN入口鉴权;与中继同语义,建议同值
节点HUB_URL设置后进入中继模式
节点HUB_PAIR_CODE一次性配对码
节点HOST_TOKEN已配对 token,优先于配对码
节点XAI_API_KEY可选;否则用内核自带登录
节点HUB_QUIC_HOST强制 QUIC 拨号地址(代理丢 UDP 时用)
中继PORT8787HTTP 端口
中继QUIC_PORT8788节点主通道 UDP 端口
中继FE_TOKEN浏览器访问密钥,生产必设
中继REQUIRE_FE_TOKEN设为 1 时,没配密钥会拒绝启动
中继CORS_ORIGINS*生产写成前端真实源
前端VITE_PROXY_TARGEThttp://localhost:8765开发代理目标