自托管零知识凭据库。人管授权,库管秘密。模型永远不接触明文。
仓库 · 当前版本 v0.1.0 · 署名 Orgin MovingDOT 动点科技
Agent Vault 把「谁可以拿哪一个字段」从模型上下文里拿出来,交给人来批。服务器只保存密文。每台设备独立隔离。默认拒绝。Agent 全程只负责申请与粘贴,看不到密码。
需要 Node.js 22。数据目录与程序文件分开:升级只换程序,不碰凭据库。
git clone https://github.com/WilliamWang1721/Agent-Vaults.git
cd Agent-Vaults
docker compose up -d打开 http://localhost:8080。数据在命名卷 agent-vault-data,换镜像或 docker compose pull 都不会清掉。
指定版本:
git checkout v0.1.0
docker compose up -dgit clone https://github.com/WilliamWang1721/Agent-Vaults.git
cd Agent-Vaults
npm install
npm run dev开发服务默认监听 0.0.0.0:8080。未设置 DATABASE_URL 时用本机 PGLite(目录 .pglite);设置了则连 Postgres。
生产构建:
npm run build
npm run preview- 打开 Releases,下载 v0.1.0 的 Source code(zip / tar.gz)。
- 解压覆盖程序目录。不要覆盖数据目录(
.pglite或 Postgres;Docker 则是agent-vault-data)。 npm install && npm run build后重启。
已经在跑的实例:控制台 → 设置 → 版本切换,选择 GitHub Release,会覆盖 src / migrations 等程序文件,凭据库不动。
| 部署方式 | 怎么升级 | 数据在哪 |
|---|---|---|
| 本实例 / 源码 | 设置里点版本,或覆盖源码目录 | .pglite 或 DATABASE_URL |
| Docker | docker compose pull && docker compose up -d |
卷 agent-vault-data |
| 二进制 | 替换可执行文件 | 数据目录原处保留 |
浏览器打开实例后是全屏引导,每页只做一件事:
- 新建凭据库,或上传加密备份包恢复整套数据
- 设定主密码(至少 10 个字符)
- 抄下 12 词恢复码
- 可选:打开浏览器通知
结束后进入主界面。侧栏「帮助」有全部功能说明。
主密码只在这台浏览器里派生密钥。服务器看不到,也不能替你重置。主密码和恢复码同时丢失则无法恢复。
控制台 设备 → 新建设备 后打开设备详情,签发配对码。
Agent 只做两件事:安装官方助手,用助手登录。不要让它自己写密钥或调用凭据库 HTTP。
- 把
skills/agent-vault-device/SKILL.md放到 Agent 的 skills 目录。 - 设备页点 复制变量提示词,交给 AI。
- 助手会克隆本仓库并运行:
npm run agent -- pair --origin <VAULT_ORIGIN> --device-id <DEVICE_ID> --code <INVITE_CODE>- 屏幕上出现短认证串后,你在控制台点「允许此设备」。
- 登录网站时:
npm run agent -- fill https://github.com --purpose "log in"助手把字段拷到剪贴板,Agent 在登录框粘贴即可。
设备页打开 单提示词,复制整段。内容同样是安装助手并跑 pair / fill。
配对完成后,设备页 MCP 标签复制 mcpServers。密钥已写在本机 ~/.agent-vault/device.json,不必再填私钥。
- Agent 用命令行向服务器申请某一账户的一个或多个字段(例如 GitHub 的用户名、密码、一次性验证码)。
- 申请必须写明:时间、设备、账户、字段、次数、用途、交付方式(剪贴板 / MCP / SSH Agent)。
- 若含 TOTP:命令行立刻收到「停止推理、准备快速粘贴」。你批准后,控制台等到新的 30 秒窗口初期才封装当前 6 位数字。
- 你在控制台看到 Agent 自己写的用途,选择批准或拒绝。拒绝必须写明原因。
- 批准后,服务器把所申请字段的密封包回传命令行(不是整条条目)。
- 命令行本地解密。
clipboard时按「用户名 → 密码 → 其他 → 验证码」依次写入剪贴板,Agent 只负责粘贴。 - 粘贴完成或超时后,命令行清空剪贴板,并
POST /v1/access-requests/:id/consume。 - 授权用尽。失败或验证码窗口已过,必须重新申请,不能复用旧值。
没有 Computer 的 Agent 绑定 MCP(POST /v1/mcp,工具 vault_catalog / vault_request / vault_poll)。MCP 客户端持有设备密钥并负责解密;模型仍不应复述明文。
- 凭证:登录、GitHub(账号与 PAT)、API、SSH、信用卡;自定义字段、TOTP、条目图标
- CSV:兼容 Apple Passwords / Google Password Manager / Microsoft Edge / 1Password;导出必须验证主密码
- 设备配对、短认证串、按「设备 × 来源」策略(拒绝 / 每次确认 / 会话自动)
- Agent 命令行一次申请多字段;一次性剪贴板;MCP;本机 SSH Agent
- 登录时限、到期退出截图、断线告警
- 浏览器通知 + ntfy / Telegram / Discord / Slack / Bark / 飞书 / 钉钉 / 企业微信 / Gotify / Pushover / Server酱 / Webhook
- Passkey 登录控制台(解锁条目仍要主密码)
- 加密整库备份与恢复(和 CSV 不是一回事)
- 空闲自动锁定、12 词恢复码、控制台 TOTP
- 版本切换器读取 GitHub Release
| 用途 | 算法 |
|---|---|
| 口令拉伸 | Argon2id(64 MiB,t=3) |
| 条目封装 | AES-256-GCM,带 AAD |
| 字段一次性包 | 独立 AES 密钥 + X25519 封装到设备 |
| 密钥派生 | HKDF-SHA256 |
| 设备身份 | Ed25519 签名请求(x-av-* 头) |
| SSH | OpenSSH Ed25519 |
原则:
- 零知识:主密码只在本机派生。条目封装后才离开浏览器。
- 按字段发放:批准只封装申请的那几个字段。
- 一次性:剪贴板用毕即销毁。
remaining_uses归零后密封包删除。 - 默认拒绝:未授权的来源立刻拒绝。
- 按设备隔离:封装密钥、申请、策略都绑定到单台设备。
明文、主密码、恢复码、GitHub PAT 不会上传。配对码只登记身份。
GitHub PAT 在「新增条目 → GitHub → Personal Access Token」里保存,可标注仓库与权限。不要把 PAT 提交进本仓库或写进对话。
加密整库备份与 CSV 不同:备份打包条目密文、设备、策略、设置、Passkey 公钥、通知渠道,再用你单独设定的备份密钥加密成 ZIP。空实例可在首次引导里恢复。条目仍需原来的主密码才能解锁。
设备请求一律要带 x-av-device / x-av-ts / x-av-nonce / x-av-sig。
| 方法 | 路径 | 用途 |
|---|---|---|
| POST | /v1/pair/start |
用配对码登记公钥,返回短认证串 |
| POST | /v1/pair/complete |
控制台确认后激活设备 |
| GET | /v1/catalog |
列出本设备被授权的条目(无秘密) |
| POST | /v1/access-requests |
申请一个或多个字段 |
| GET | /v1/access-requests/:id |
轮询批准结果 |
| POST | /v1/access-requests/:id/consume |
用尽并销毁密封包 |
| POST | /v1/mcp |
MCP JSON-RPC |
| GET | /v1/review/inbox |
Dangerous Only:待审批档案 |
| GET | /v1/review/:id |
单条档案 |
| POST | /v1/review/:id/decide |
批准或拒绝(拒绝必须带原因) |
默认关闭。开启必须在设置里输入「我了解风险」并验证主密码。
- 本机审批接口:本地 AI 用令牌拉取待处理申请的全量元数据(不含明文),直接批准或拒绝。
- Auto Review:按 OpenAI 协议接入本机小模型。提示词已锁死,只能输出
{"decision":"是|否","deny_reason":"..."}。
模型看不到密码。误判仍会错误发放凭据。生产关键路径不要开。
npm run typecheck
npm test
npm run build署名:Orgin MovingDOT 动点科技。