前言¶
在 DeepSeek Harness(dsh)里跑智能体时,账号、密钥、TOTP 种子往往还要单独开密码管理器或本地 YAML。常见 GUI(KeePassXC、Bitwarden 等)面向「人独占」的二进制库:难 diff、审计弱,若把主密码交给 Agent,边界就模糊了。用 sops + age 加密的 YAML 仓库则相反:allowlist 加密保留可读结构,git 留历史,脚本也好接——缺的是和 DSH Web 一体的操作面板。
下面介绍社区插件 dsh-plugin-sops-vault(维护者 skyzhao1223,SkillHub 分类 admin-security)。它把本机 sops + age + git 凭据库挂进 DSH Web GUI 侧栏;模型侧不获得本插件提供的工具,Agent 集成最多只能看到从加密文件解析出的结构,明文仅在用户点击「揭示」时由 Host 流向浏览器。
这是什么¶
一句话:DSH 插件,在 Web 侧栏提供 Vault 面板,由 Host 半部通过 /vault-api 同源调用,在宿主机上直接驱动 sops 与 git,读写 <vaultDir> 下的 secrets.yaml、.sops.yaml 等。
与「把密钥塞进 Agent 工具」不同,README 用架构图强调硬边界:侧栏列表、搜索、分组、详情抽屉里的按字段揭示/复制/编辑/删除,以及 TOTP 动态码,都走浏览器与 Host 的 same-origin fetch(带 Origin 校验);不向模型开放明文通道。
核心功能¶
以下能力均来自项目 README 与 package.json 描述(当前包版本 0.3.5,MIT 许可证)。
侧栏 Vault 面板¶
- 按前缀分组的条目行、搜索、git dirty 标记。
- 详情抽屉:单字段 👁 揭示、复制、编辑、删除;实时 TOTP 与倒计时环。
- 新建条目、安全审计;可从浏览器 Authenticator 扩展一键导入种子。
- 种类过滤:仅 TOTP 的「动态码」视图(类似 Authenticator)。
- 两级分组:group → company → entries;可为 group / company / entry 配置 logo(
logos.json+<vaultDir>/logos/)。 - 访问日志(不记录字段明文);界面支持中英文。
Host API(/vault-api)¶
统一 JSON 形态 {ok, data|error}。常用端点包括:
| 端点 | 方法 | 作用 |
|---|---|---|
/vault-api/meta |
GET | 全库结构,不解密解析加密文件 |
/vault-api/reveal |
POST | 单字段明文({name, field}),对应人工点击 |
/vault-api/totp |
POST | Host 侧根据种子计算当前 6 位码 |
/vault-api/totp-batch |
POST | 一次解密批量动态码,支撑动态码视图 |
/vault-api/audit |
GET | allowlist/泄漏审计报告 |
/vault-api/audit-log |
GET | 访问日志尾部 |
/vault-api/set / rm / create / save |
POST | 写字段、删字段、新建条目、git 提交 |
/vault-api/dirty |
GET | git 工作区是否脏 |
/vault-api/import-scan / import-apply |
GET / POST | 扫描并导入 Chrome Authenticator 扩展中的 TOTP |
Logo 上传走 /vault-api/logo 等路由;SVG 被拒绝,栅格图有大小与类型嗅探限制,详见 README。
与 DSH 版本的兼容¶
插件同时适配 DSH shell 两代接口:shell.run(0.1.x)与 shell.execute + execution.result(0.2.x),按次 feature detect。
前置条件¶
Host 上需要:
- Node.js
^22.19.0 || >=24.0.0,pnpm。 - PATH 上有
sops、age、git(README 示例:brew install sops age)。 - 凭据库目录,默认
~/Vault(可通过配置vaultDir覆盖),建议用 sops-vault-kit 的./install.sh初始化,包含: secrets.yaml:sops 加密 YAML,条目在顶层systems:下;.sops.yaml:allowlist 模式(unencrypted_regex,仅如url/appid/env/owner/note等字段明文);- age 密钥可被 sops 读取(Linux 默认
~/.config/sops/age/keys.txt,或SOPS_AGE_KEY_FILE)。 - 已能运行
dsh web(Host 需要webServer与shell服务)。
无需额外守护进程;插件直接调用 sops 与 git。
安装与启用¶
官方 README 给出的本地构建与挂载流程如下。注意:--patch 是 全局 dsh 选项,应写成 dsh web --patch <file>,不要把其它 web 选项插在 --patch 前面(例如 dsh web --no-open --patch … 会解析失败)。
git clone https://github.com/skyzhao1223/dsh-plugin-sops-vault && cd dsh-plugin-sops-vault
pnpm install
pnpm build # tsc (node half + types) + tsdown (browser bundle)
pnpm test # 127 unit tests
pnpm verify # load-path check against the built artifact
dsh web --patch "$PWD/cordis.yml"
overlay 会插入一行插件配置,例如:
- insert:
- id: vault-panel
name: './lib/index.js'
# config:
# vaultDir: ~/Vault # leading ~ is expanded
# sopsBin: sops # resolved via PATH
# gitBin: git
# timeoutMs: 15000
若改为发布包安装,将 name 换为安装到 dsh 树后的包名。重新构建 client bundle 后需刷新浏览器。
典型用法¶
- 只看结构、不给 Agent 明文:通过
/vault-api/meta或侧栏列表查看条目名、分组与哪些字段已加密;这与 README 中「模型最多看到结构」的设计一致。 - 人工揭示与复制:在详情抽屉对某一字段点击揭示,Host 执行
POST /vault-api/reveal,明文只进入当前浏览器会话。 - 动态码:打开 TOTP 视图或单条 TOTP;批量场景由
totp-batch减少重复解密。 - 维护库:在面板内编辑字段后
save提交 git;用audit检查 allowlist 是否泄漏敏感字段名。 - 从 Authenticator 迁移:工具栏「导入动态码」经
import-scan/import-apply读取本机 Chrome 系浏览器里 Authenticator 扩展的 LevelDB 数据(只读解析,无原生依赖),再写入 vault。
凭据文件形态以 sops-vault-kit 为准:业务数据写在 systems: 映射下,公开元数据字段名与 .sops.yaml 规则一致。
适用场景与注意¶
适合谁:已经或打算用 sops + age + git 管理个人/小团队密钥,并在 DSH Web 里希望「人点才出明文」、同时让 Agent 侧最多感知条目结构(例如配合自定义集成读 meta,而非本插件给模型的工具)。
安全与权限:
- 插件以当前 dsh 进程权限 在 Host 上执行
sops、git和读浏览器配置目录(导入 TOTP 时);安装前应阅读源码与 MIT 许可证,确认信任维护者与发布来源。 - 远程 logo URL 会向对应主机暴露你的 IP 与打开面板的时间,UI 中有提示。
- 社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本文事实以 GitHub README 为准。
结尾¶
dsh-plugin-sops-vault 补的是「加密 YAML 凭据库 + DSH Web」之间的 GUI 缺口:git 可审计、sops 可脚本化,侧栏负责日常操作,并把明文揭示锁在人的一次点击之后。进一步了解与截图见 GitHub 仓库(含 中文 README)与 SkillHub 目录页。