前言¶
DeepSeek Harness(DSH)里的智能体要调用 Git、HTTP API 时,常需要把 token 或 API key 写进工具参数或命令行。这些内容会进入会话日志和模型上下文,事后也难以从记录里彻底抹掉。社区插件 vault-manager(npm 包名 @dreagonmon/vault-manager)把整套凭据生命周期挡在对话之外:秘密只在用户弹窗里输入,主密码不经工具参数传递,执行命令前用占位符展示待审命令,输出中对已用秘密做脱敏。
这是什么¶
vault-manager 由维护者 Dreagonmon 发布,在 DSH 插件目录中归类为 admin-security。它在本地用单个主密码保护加密文件,向 shell 命令注入已保存的凭据,同时约定:智能体只能看到条目名称、备注、时间戳、退出码以及脱敏后的输出,看不到秘密明文和主密码,也无法从工具返回判断主密码是否改成功。
插件以 bundle 形式提供 Host 侧逻辑与 Web 弹窗(shell.overlay),无第三方运行时依赖。
核心能力¶
工具一览¶
| 工具 | 是否弹窗 | 作用 |
|---|---|---|
vault_save |
是 | 保存或覆盖一条凭据;用户输入主密码(首次即设置)与秘密值 |
vault_list |
否 | 列出名称、备注与时间戳,不返回秘密值 |
vault_use |
是 | 运行含 {{条目名}} 占位符的 shell 命令;弹窗展示完整命令供确认,批准后解密、替换、执行,返回退出码与脱敏输出 |
vault_delete |
否 | 删除指定条目 |
vault_change_password |
是 | 修改主密码并整体重加密;工具始终返回中性文案,不向智能体泄露是否成功 |
安全与存储要点¶
- 主密码经 scrypt(N=16384, r=8, p=1)拉伸为 256 位密钥;各秘密值单独 AES-256-GCM 加密。
- 默认 vault 文件路径为
~/.dsh/vault.json(亦可用$DSH_HOME/vault.json),写入权限0600,原子替换。 - 弹窗通过 Harness Web 源上的本地
/vault-api与 Host 通信;带外来Origin的请求会被拒绝。 - 解密后的值仅在单次工具调用期间驻留进程内存;默认每次 save/use/改密都会再次询问主密码。
README 也列出了已知限制:替换后的命令会短暂出现在本机进程命令行(多用户主机上 ps 可见);脱敏只覆盖输出中与秘密完全一致的子串;无浏览器连接或弹窗超时则调用失败且不执行、不保存。
安装与启用¶
官方说明中有三种常见方式:
- 从 npm 注册表安装:通过插件管理器的
install_bundle,包名为@dreagonmon/vault-manager。 - 本地检出时:向
install_bundle传入包目录路径。 - 在能解析该包的 profile 中加入 patch 行。
package.json 要求 Node >= 22.12.0、dsh >= 0.2.0,许可证为 MIT,当前发布版本 1.0.0。
在 profile 中插入插件并可选配置的示例:
- insert:
- id: vault-manager
name: '@dreagonmon/vault-manager'
config:
redactOutput: true
可选 config 字段(均来自 README):
| 字段 | 默认值 | 含义 |
|---|---|---|
path |
~/.dsh/vault.json |
vault 文件位置 |
redactOutput |
true |
命令输出中的秘密替换为 *** |
commandTimeoutMs |
120000 |
命令最长执行时间 |
promptTimeoutMs |
1800000 |
弹窗无响应超时(30 分钟) |
典型用法¶
下面步骤复现 README 中的流程:先存 GitHub PAT,再在 git push URL 中用占位符引用。
agent: vault_save { name: "github-token", note: "PAT for HTTPS git operations" }
user: [popup] master password + secret value
agent: vault_use {
command: "git push https://{{github-token}}@github.com/me/repo.git main",
entries: ["github-token"]
}
user: [popup] reviews the command, types the master password
agent: { exitCode: 0, stdout: "...", stderr: "..." } # secrets redacted
使用 vault_use 时,entries 声明本次会解密哪些条目;命令字符串里用 {{条目名}} 与 vault 中的名称对应。用户在弹窗里看到的是占位符形式的命令,批准并输入主密码后才真正执行。
适用场景与注意¶
适合:需要在 DSH 会话里让智能体「发起」带凭据的操作,但又不希望 token 进入模型上下文或落进可检索日志的开发者;例如 HTTPS Git 推送、调用需 API key 的 curl 等。
使用前请自行核对:插件以当前 DSH Host 进程的用户权限运行,vault 文件与执行的 shell 命令都受该权限约束。安装前建议阅读 GitHub 仓库 源码与 MIT 许可证;目录页见 SkillHub 插件页。DSH 社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
静态加密不能替代主机层面的访问控制:能读取 Host 进程内存或在 vault 文件可读时拿磁盘副本的攻击者,仍在信任边界讨论范围内。
结尾¶
vault-manager 把「录入—审批—执行—回传」拆成弹窗与占位符两道门,把智能体可见面压到元数据与脱敏输出。若你的工作流里频繁出现「Agent 需要秘密但你不愿秘密进上下文」,可按上文安装 bundle,从 vault_save 与 vault_use 试起。
- 目录页:https://www.skillhub.cn/plugins/Dreagonmon/vault-manager
- 源码与文档:https://github.com/Dreagonmon/vault-manager