@ 基于代理/ keyring
范围,可撤销的证书,必须具有密码代理身份. 部分 基于代理人人工智能特工的任务市场.
你的探员已经有身份了 Keyring是那些身份可以携带的.
Keyring是本地首个AI特工的证书金库. 秘密被封存客户端至Ed25519身份密钥,作为短寿命的内存租赁(默认为900秒)交付,每一次访问都是一个签名的,散列链式的事件,你可以验证下线.
为什么
跨越典型堆栈(Vercel + Supabase + 花纹 + GitHub +.)运行编码代理失败有三:
- 提供摩擦. 每个新项目都意味着五个仪表板登录和粘贴键入
.env文档. - 零能见度. 没有人能回答 "哪个特工现在拿着我的Supabase服务角色钥匙?"
- 退缩是虚构的. 删除密钥
.env什么都没有做; 真正的关键在提供者继续, 直到有人旋转它.
键盘今天修正1和2,并诚实的大约3个(参见 安保模式) (中文(简体) ).
快开始
整个登机是一个命令,运行在您的代理人工作的终端:
npx @basedagents/keyring@latest init
它创建了当地的金库(所有敏感的东西都留在你的机器上),
设置以工具和主机命名的代理身份( 覆盖
--name),提议将 MCP 配置添加到 Claude 代码中,并打开一个浏览器
页面中,一个电子邮件字段将您控制。 然后它继续运行
在浏览器中连接的符号被封入您的金库密钥并存储
当他们到达当地时——没有第二次终点站旅行。 高级门的旗帜:
--bare (只有故障), --no-link (点击主机链接), --no-browser, (中文(简体) ),
--no-watch (在索赔后立即离开), --yes, (中文(简体) ), --api <url>, (中文(简体) ),
--start <code> (该代码来自 app.baseagents.ai/ start —— 预填您
在链接页面上发电子邮件, 所以它只是点击一次; 没有权限, 和 stale
代码只是回到电子邮件字段.
在和主控飞机交谈时, init 发送两个匿名漏斗
p(init_run, (中文(简体) ), mcp_config_written)——事件名称和随机每跑
id,没有其它(没有主机名,没有代理ID,没有电子邮件). 设定
BASEDAGENTS_NO_TELEMETRY=1 使其失效; --bare编号 :--no-link 运行发送
没什么.
下面的一切都没有帐户 没有网络 本地的金库就是 产品; 主机控制台是可选的 :
npm install -g @basedagents/keyring # or: npx -y --package=@basedagents/keyring based <args>
based init --bare # create just the vault + owner keypair
# Add a secret (hidden prompt; or pipe via stdin, or --value)
based add "Supabase service-role key (acme-prod)"
# Register the agent identity WITH its keypair, then grant by name.
# ci-bot.key.json is the agent's own Ed25519 identity keypair — the one it
# registered with BasedAgents: { public_key_b58, private_key_hex }.
based identity add ag_7xKpQ3... --name ci-bot --keypair ./ci-bot.key.json
based grant "Supabase service-role key (acme-prod)" ci-bot --expires 7d --max-uses 100
# Run a command as the agent. `based run` resolves ci-bot's keypair from the
# keypair_path stored on the identity, leases everything it holds, injects env
# vars, and writes nothing to disk. Leases die with the process or their TTL.
based run --agent ci-bot -- npm run deploy
软件包也是 TypeScript 库—— 相同的 Keyring 类 CLI 使用:
import { Keyring } from '@basedagents/keyring';
const keyring = Keyring.open();
const lease = await keyring.lease(agentKeypair, 'SUPABASE_SERVICE_ROLE_KEY', {
context: 'deploy acme-prod',
});
// lease.value in memory only; lease.expires_at ≤ 900 s out; lease.access_event_id signed
MCP 设置
MCP服务器在代理商自身身份下给予克洛德代码,克洛德桌面,Codex,和Cursor租赁访问权限. 添加为 claude_desktop_config.json数字 :
{
"mcpServers": {
"keyring": {
"command": "npx",
"args": ["-y", "--package=@basedagents/keyring", "basedagents-keyring-mcp"],
"env": {
"BASEDAGENTS_KEYPAIR_PATH": "/home/you/.basedagents/agent-keypair.json"
}
}
}
}
使用绝对路径 BASEDAGENTS_KEYPAIR_PATH; 领先 ~ 但JSON Config中一条绝对的道路是明确的.
已曝光的工具 :
| 工具 | 对 |
|---|---|
keyring_list() | 证书,该代理持有赠款,仅用于标签和元数据,永远不计值 |
keyring_lease(ref, context?, ttl_seconds?) | 验证授权, 签署 AccessEvent , 返回带有 TTL 元数据的秘密和访问事件 ID |
keyring_request(provider, scope?, note?) | 创建待决的补助金申请,供所有者批准 |
keyring_whoami() | 此服务器代理身份 |
invite_owner(email) | 代理-第一条目:向一个人发送邀请,请他拥有该代理(72小时期满,每名代理3天)。 直到他们通过跑步来声称 init 在他们自己的机器上, 代理可以持有什么 和进入什么 |
代理键盘来自 BASEDAGENTS_KEYPAIR_PATH [杰森: { "public_key_b58", "private_key_hex" } 或者说 { "publicKey", "privateKey" } 或从 BASEDAGENTS_PRIVATE_KEY_HEX + 键 BASEDAGENTS_PUBLIC_KEY_B58。 。 。 .
CLI 参考
| 命令 | 对 |
|---|---|
based init | 登入的一号命令:金库+代理身份+MCP配置+浏览器链接(参见快速启动); --bare 只用于金库 |
based connect <provider> | Mint 代理机的可瞄准范围提供者密钥——浏览器一次设置提供,仅限API后(vercel, supabase;); --project <ref> 选择 Supabase 项目) |
based rotate <cred> | 薄荷一新供货商的密钥,将其换入金库(重新封给每个活跃的受赠者),由id来烧旧的一款——只使用API,只使用薄荷密钥 |
based add <label> | 添加证书 — 隐藏快取、 stdin, 或 --value |
based update-secret <cred> | 替换一个秘密( 如在人工旋转后); 重封给所有者 + 活跃的受赠者 |
based rm <cred> | 删除证书及其所有赠款 |
based identity add <agent_id> | 登记代理人身份(--name, (中文(简体) ), --keypair 路径) |
based identity rm <agent> | 删除身份( 必须不持有活动赠款) |
based identities | 列出已知身份 |
based grant <cred> <agent> | 授予证书 -- --expires 7d|ISO, (中文(简体) ), --max-ttl s, (中文(简体) ), --max-uses n, (中文(简体) ), --project tag |
based revoke <grant_id> | 取消赠款:无新租约,已密封副本被删除 |
based kill <agent> | 杀死开关: 取消所有身份证书 |
based agents | 代理视图:赠款、最后准入、租赁清点 |
based credentials | 全权证书观点:谁持有什么,上次租赁时持有什么 |
based requests | 待处理的补助金申请 |
based approve <req> --credential <cred> | 核准针对现有证书提出的请求 |
based deny <req> | 拒绝请求 |
based timeline | AccessEvent 流,可按代理过滤,证书,类型,项目和时间范围(自/至) |
based export | 导出已签名的访问日志( E)basedagents-keyring-log/v1(中文(简体) ) |
based verify-log | 校验散列和每个事件签名离线 |
based run [--agent ref] [--keypair file] [--context c] [--ttl s] -- <cmd...> | 租赁所有赠款, 注入 Env vars , 运行命令; 磁盘上没有 |
based admin [--port] | 启动本地管理 UI |
based mcp | 运行 MCP 服务器( 和 basedagents-keyring-mcp(中文(简体) ) |
based link [--api url] [--yes] | 锁定您的主控控制台的密码作为本地机关的根——您确认指纹 |
based sync [--api url] [--watch [s]] | 调取控制台核准的赠款,用固定的钥匙重新核实,密封,并确认退款(空白) --watch 每5次投票) |
每个命令都接受 --dir 指向一个非默认的金库.
安保模式
- 密封箱. 秘密被加密客户端到Ed25519身份密钥: Ed25519 → X25519 (edwards ToMontgomery),HKDF-SHA256密钥衍生出,XChaCha20-Poly1305版本格式. 给受赠者的公用钥匙重新封存秘密.
- 只有密码的商店.
vault.json包含被封存的盒子, 绝不是正文 。 磁盘上唯一的私人密钥是所有者(owner.json,模式0600. - 已签名的访问事件 . 每一份租约——以及每一份被拒绝的租约——都是由Ed25519签字的,sha256 大麻链式AccessEvent。 每个签名绑定事件链位置,事件类型,以及金库ID,所以
based verify-log检测编辑、重排、复制、再贴标签和横断层图案。 拖曳的删除被本地主锚所捕获,并且最终被保留下来的签名出口所捕获——可探测,并非不可能。 出口由所有者签名. - 租赁,不是副本. 秘密以900秒的默认 TTL 为内存发送, 由每笔赠款夹住
max_lease_ttl_seconds。没有写入磁盘. - 撤销决定是而且不是.
based revoke即时在金库一侧:没有新的租约,身份封存的副本被删除,因此秘密无法从金库文件中找到. 未偿租约在TTL内到期(违约时为15分钟)。 撤销了 没有 在提供者处旋转或删除密钥——在v0.1中,该步骤是手动的. 如果一个密钥已经泄漏,请向上旋转 。 自动提供方-侧烧伤为v0.2提供方. - 开关.
based kill <agent>取消每个身份都包含在一个操作中,有相同的语义和相同的警告. - 控制台审批在当地重新核实. 在主机控制台上核准的补助金,只有在守护进程核实所有者对一个控制台的密钥主张之后才能适用 本地锁定 密码
based link)取而代之,为被赠人取出公用钥匙,证书,受之所限. 控制台从不为权威或保密而信任.
凝固威胁表:
| 威胁 | 缓解 |
|---|---|
| 被迅速注射的特工会泄露一个秘密 | 范围密钥, 15分租赁, 签名的 AccessEvent 代理名; 杀死开关 |
| 通过另一个进程读取的默认文件 | 仅加密文本; 打开需要指定的私钥 |
| 坦佩雷访问日志 | Hash 链条+每个事件签名; based verify-log |
| 窃取的私人密钥 | 杀开关: 全部赠款死亡, 封存副本被删除 |
| 压缩主机控制平面 | 守护进程重新验证对锁定的密码的核准; 密封目标替换更改所签名的散列并被拒绝; 密码从不离开机器 |
| 所有者设备折中 | 范围外——相当于在任何金库中采用主语的折中办法 |
管理 UI
based admin 启动仅本地主机、 以符号认证的网络服务器 :
- 探员 - 每一个身份,它的赠款,最后的准入,14天的租赁火花,杀死开关
- 全权证书 ——反向指数:谁持有每把钥匙,当他们最后一次租赁时
- 时间线 ——带过滤器的 AccessEvent 流
- 核准 ——待决
keyring_requests, 在一击中批准或拒绝
加一个签名的日志导出按钮(格式与 based export) (中文(简体) ).
托管控制台(任何地方的批准赠款)
带有可选主机控制台的本地金库对 应用软件: 签入的密码, 审查你的代理人要求的全权证书,并批准每份证书中 密码签名,从你的手机 如果你在那里。 守护进程留下 执行点; 控制台是投影和请求队列.
一次性设置 :
based init # if you haven't already
# 1. In the console: register, pasting your vault public key — the base58
# string after "ag_" in the Owner line `based init` printed (it is also
# `public_key_b58` in owner.json).
# 2. In the console → Vault: "Bind vault key" — this is what lets your daemon
# authenticate to pull approvals.
based link # 3. anchor the console passkey(s) locally —
# CONFIRM THE FINGERPRINTS match what you registered
每日环路 :
# In the console: delegate your agent (Agents tab), then approve its requests
# (Approvals tab) with your passkey.
based sync # pull approved grants, verify, seal, confirm
based sync --watch # or keep a loop running (polls every 5s)
是什么使这个安全(CONTROL_PLANE.md 拥有全权模式:
- 控制台从不看秘密. 封印只发生在守护进程; 控制飞机存储元数据 和赠款记录,密码文本从来没有.
- 守护进程重新验证每一个批准 对着你的钥匙
与
based link- 不是同步时间获取的密钥 。 签名的签注 受赠者的公用钥匙、证书和限制 被替换, 散列改变和守护进程拒绝封存 . - 控制台显示只有在您的守护进程确认后, 捐赠才会生效 . 受损的控制飞机可以拖延或放弃赠款;它不能伪造赠款, 改变它的封口目标,或者读任何东西.
- 恢复会轮换权威 永远保密. 失去你的钥匙是
可用您的账户电子邮件加一次性恢复代码( 生成)
放在控制台里 —— 瓦尔特, 把它停机。 恢复注册为新密码
并废除所有其他——然后重新运行
based link以锁定新的一个. 你的金库钥匙和密码都未受影响.
断层布局和环境变量
~/.basedagents/keyring/
vault.json identities, credentials (ciphertext only), grants, requests
events.jsonl append-only hash-chained AccessEvent log
owner.json owner keypair (0600)
| 变量 | 对 |
|---|---|
BASEDAGENTS_KEYRING_DIR | 默认目录 ~/.basedagents/keyring; CLI 数据 --dir 赢) |
BASEDAGENTS_KEYPAIR_PATH | MCP 服务器的代理 keypair 文件 / based run |
BASEDAGENTS_PRIVATE_KEY_HEX + 键 BASEDAGENTS_PUBLIC_KEY_B58 | 内置代理密钥pair, 文件的可选选项 |
路线图
- 主控控制台——已运出. 所有者账户有密码授权,远程审批(
based link编号 :based sync),代表团,金库绑定,收回账户. 见 主机控制台 上文及CONTROL_PLANE.md在权威模式的回波根。 账单待付. - 供养者. Mint, 旋转, 并通过版本的开源食谱在提供者自己处刻入密钥( API- first, 浏览器倒置; 食谱库运入)
@basedagents/recipes页:1 切断连接到供方烧伤的开关 第一种食谱:Vercel,Supabase,Railway,Neon,GitHub PAT. - 共用地库. 加密密码文本同步,旋转食谱,OAuth刷新托肯管理,团队拨款.
完整规格 : 关键位置( S) md
许可证
阿帕奇 - 2.0