ARS — Auth 中继服务
在本地页面中,所有者键入一个请求代理的代码或密码—— npm OTP, 认证器- 应用程序代码, 登录—— 因此该值从未通过聊天或LLM上下文.
愿景
舰队自行运行了100%——而真正需要主人之手的几分时刻(从他手机中一次性的代码,只有他知道密码)则在一整页上取取取他5秒,从不做终端,从不聊天,从不做复制.
特派团
让舰队中的每一个特工都有一个简单,安全的方法来要求拥有者一个秘密值,并给拥有者一个简单,安全的地方来回答:代理询问,他得到一个通知,他打过一次,只有请求代理收到它——一次——并且该值从未被LLM存储,记录或看到.
这是什么
今天,当一个代理点击 npm 发布需要一次性代码,一个有双因子登录或密码的网站,工作就会停止. 拥有者必须在终端中注意到,阅读请求,将价值粘贴到聊天中——在记录片和AI的记忆中着陆.
ARS去掉这个。 它是一个小型的网络服务,运行在主人的Mac上,只能从Mac本身获得:
- 一个特工问.
POST http://127.0.0.1:<port>/v1/asks与谁所问;与问;与什么所答code, (中文(简体) ),password, (中文(简体) ),text或者说approve) (中文(简体) ). - 主人闻已. 一个macOS通知名谁问和为什么,和问页打开他的浏览器.
- 他回答了. 一个字段(按密码显示,数字表示代码), 发送 或者说 关于。 。 。 .
- 经纪人得到它,一次. 毒剂长发
GET /v1/asks/:id?wait=55; 第一部读出答案并擦去. 后来读到的只是回答.
承诺
- 从来没有存储,从来没有登录. 答案只存在于记忆中,直到读取或过期. 审计清单显示 谁要求什么和何时 从不值钱.
- 过期. 10分钟后未答复的询问已无法回答.
- 惟有行者能诵. 每个请求都带有自己的读取符号,只有被请求的BID本能才能读取.
- 探员证明他们是谁. 每一次代理电话都携带一张布罗贝里身份证;店主看见谁从机票上问话(
edge m1 · session lens),从不从代理写出短信. - 只有这个Mac——对于特工来说,是舰队的私人网络. 义务为
127.0.0.1并有防范网页的警卫试图接近它。 其它Macs上的代理联系到这个Mac's Tailscale地址上的代理API(而别无他法);窗口,历史和应答都停留在回转上. - 而不是一个捷径 经过主人自己的话. 一个
approve请求是常规确认;部署有破坏性的迁移,DNS,env翻转等需要他的直接命令.
谁用
- 镜头 - 一个测试步骤
fill [field] from owner "<question>"询问 ARS 并键入答案,所以点击 2FA 的流量会持续运行. - 任何 cc 会话 - 要求Npm检察官办公室之前
npm publish,有一个curl。 。 。 .
从 cc 会话中询问
从朋友那里得到一张票(有效300 s——每通电话取一张新票),然后问和等待:
T=$(curl -s -m 5 "http://127.0.0.1:4123/api/edge-ticket?audience=https://ars.broberg.ai&scope=ars:request&session=$BUDDY_SESSION_NAME" | jq -r .ticket)
curl -s -X POST http://127.0.0.1:7480/v1/asks -H "authorization: Bearer $T" -H 'content-type: application/json' \
-d '{"requester":"my-session: npm publish","question":"npm OTP for @broberg/x 1.2.3","kind":"code"}'
# → { id, read_token, … }; then GET /v1/asks/<id>?wait=55 with the same kind of header + x-ars-read-token
从另一个Mac开始,使用这个Mac的尾图地址,而不是 127.0.0.1 (印刷品: scripts/install.sh,比如说. http://100.78.170.62:7480) (中文(简体) ).
通过环境变量将答案传递到下一个命令(npm_config_otp=…),从不作为聊天中的文本.
- 后来:蜂鸣 ——移动版本(推向iPhone)相同
/v1/asks合同,所以消费者只更改地址.
状态
计划。 见 docs/PLAN.md 合同,故事和推出.
配对——只有窗口可以回答
ARS窗口第一次在Mac上打开,它要求6位数代码,ARS只显示为macOS通知. 正确的代码将窗口对起来;从那时起,它只能看到等待的询问和回答. ARS只保留窗口钥匙的散列(~/Library/Application Support/ARS/owner.json) (中文(简体) ).
诚实的极限:配对会阻止任何程序简单地拨打ARS并回答自己的要求. 它不会停止一个像你一样运行和驱动浏览器的程序. 当BID给Mac会话一个身份时,这个会移动到BID.
进入卡片(卡片-F406)
开始 docs/MIGRATION.md ——什么卡片取而代之,挂载,历史导入,声音/语音,客户端和开关订单.
src/core/是询问核心(存储,四个状态,单读,过期,已读取). 它只进口node:crypto测试使它保持这样.src/contract.test.ts这是/v1/asks合同。 运行它对任何主机:ARS_CONTRACT_URL=http://host:port bun test src/contract.test.ts。所有者答案需要适配器(ARS:ARS_CONTRACT_PAIR_CODE报告为跳过.
在主机( 软件包) 中使用 ARS
仅存一文. @broberg/auth-relay 船型脚本源(engines.bun); 节点主机不能导入. 把它固定好 保守秘密.
import { createAsksRoute, webRoot } from '@broberg/auth-relay';
import { serveStatic } from 'hono/bun';
app.route('/ars', createAsksRoute({
auth: (req) => /* your agent auth */ ({ principal: 'agent-123', label: 'components' }), // null → 401
delivery: {
notify: ({ id, label, question, pageUrl }) => { /* tell the owner; never gets an answer */ },
isOwner: (c) => /* your owner session check */ true,
},
pageUrl: (id) => `https://host/ars/?ask=${id}`,
}));
app.get('/ars', (c) => c.redirect('/ars/')); // the window's URLs are relative
app.use('/ars/*', serveStatic({ root: webRoot, rewriteRequestPath: (p) => p.replace(/^\/ars/, '') }));
auth.label是所有者视之为请求者;一个答案只能由principal问了.- 把自己的主机/JSON警卫放在前面(AS独立使用)
localRequestGuard从@broberg/local-guard/hono) (中文(简体) ). - 若为
isOwner表示不,窗口显示ARS的配对屏幕——一个拥有自己登录的宿主应该将主人送去. - 证明你的主人:
defineContractSuite({ baseUrl, adapter, agentHeaders, guards })财务报告和审定财务报表defineNoPersistSuite(start)从@broberg/auth-relay/testing。 。 。 .