跳过主要内容
S

dsh-mimavault

startime-ltk/dsh-mimavault

把本机 MimaVault 密码库接入 DSH,提供 7 个工具用于元数据检索、条目读取、剪贴板复制、动态验证码、口令生成、域名受限的 API 调用与需人工确认的清空请求。默认对接 MimaVault 桌面应用(需另行安装);可选的内置模式以明文保存条目。

安装

dsh plugin --profile web add github:startime-ltk/dsh-mimavault

README

dsh-mimavault

把本机 MimaVault(密匣) 密码库接进 DeepSeek Harness,让 DSH 能检索密码、API Key、动态令牌 —— 同时不让明文进入模型上下文。

它是怎么工作的

DSH Host 进程                          MimaVault 进程(须已解锁)
┌───────────────────────┐              ┌──────────────────────────┐
│ dsh-mimavault 插件     │  HTTP+Token  │ LocalApiServer           │
│  vault_search          │ ───────────► │  只监听 127.0.0.1:随机端口 │
│  vault_entry           │              │  仅在解锁期间可用          │
│  vault_copy            │              │  AES 密钥始终留在本进程内  │
│  vault_totp            │ ◄─────────── │                          │
│  vault_generate        │   元数据/状态  │                          │
│  vault_call_api        │              │                          │
└───────────────────────┘              └──────────────────────────┘

插件本身不碰任何加密数据,它只是本地 API 的客户端。真正的解密发生在 MimaVault 进程里。

v0.3.0 起支持两种数据源(侧栏面板里切换)。上图画的是默认的 external 模式。 builtin 模式不装 PC 密匣也能用,但条目以明文存盘、不加密 —— 详见下方「两种模式」。

两种模式

external(默认,更安全)builtin(免安装,不加密)
数据在哪PC 密匣的加密库%APPDATA%/MimaVault/builtin-vault.json(明文 JSON)
密钥在哪密匣进程内,PBKDF2 派生无主密码、无加密
要不要装密匣要不用
明文是否进 DSH 进程否是
谁能读库需主密码解锁任何能读该文件的程序
vault_call_api正常(进程隔离 + 域名白名单)默认关闭,需显式配置 enableBuiltinCallApi: true

切换只影响本插件,两套数据互相独立:拨到内置库时,PC 密匣里的条目不会自动出现。

内置明文库的安全边界(务必知情)

内置模式是按「不设主密码」的要求实现的:条目明文写入本地文件,界面里也明确写着「明文存盘,不加密」。任何能读到该文件的进程(含 DSH 的 pwsh/bash 工具、同机程序、备份/同步软件)都能看到全部密码。

因此内置模式下:

  • 插件不再能提供 external 模式那种「能力上拿不到明文」的架构保证,只剩「工具约定不返回」;
  • vault_copy 改由 Host 写系统剪贴板(detached PowerShell,30 秒条件清除),明文会经过 DSH 所在的机器;
  • vault_call_api 默认关闭(密钥与出站请求同处一个进程,少一层隔离);
  • 想更安全,装 PC 密匣并切回 external 即可,内置库数据保留不动。

内置库条目管理

内置库支持在侧栏面板里手动新增 / 编辑 / 删除条目:

  • 点「新增条目」打开表单:分类、平台(必填)、账号、密码(可切明文显示)、邮箱、手机、TOTP、备注
  • 分类专属字段按所选分类动态出现(WiFi 的 SSID、银行卡的卡号/CVV、证件的证件号、API Key 的 Key/接口地址/模型)
  • TOTP 可填完整 otpauth:// 链接,也可直接粘 Base32 密钥(自动规范化;非法输入拒绝而不是静默写坏数据)
  • 列表每行有「编辑」「删」按钮;编辑时预填完整字段(含明文,仅供浏览器面板,不经过模型工具)
  • 删除前弹确认框

所有写操作由宿主 POST /plugins/dsh-mimavault/entries 完成,POST /entry 供编辑预填。 仅内置库模式可用,PC 密匣模式下这些入口会提示到密匣界面里管理。

数据互通(不经过 AI)

内置库通过导入密匣导出的明文 CSV 互通:在密匣里「导出 CSV(明文)」→ 侧栏面板粘贴 → 点「导入 CSV」。解析在 Host 里用 builtin-store.js 的 CSV 状态机完成,不把明文发给模型、不进对话记录。

支持 MimaVault CsvUtil 的表头别名(name/username/password/notes/totp 及 api_key/wifi_ssid/bank_card_no 等专属列)、UTF-8 BOM、引号转义、内嵌换行、空行跳过,并能从专属字段推断分类。

不要用「把明文贴给 AI 让它转格式」的方式:那会把整个库的明文一次性送进会话历史与模型服务商,而且模型容易改错密码里的 0/O、1/l/I。CSV 导入是纯机械映射,精确且不过模型。

清除(二次确认)

  • 侧栏「清空内置库」按钮 → 生成清除请求 → 弹确认框 → **人点「确认清空」**才执行;
  • AI 也可调 vault_clear 发起请求,但不能直接删除,必须等同一个人点确认;
  • 执行前自动留一份备份(builtin-vault.json.backup),面板有「从备份恢复」;
  • 请求 5 分钟过期,确认令牌不匹配会被拒。

安全模型

关切做法
明文会不会进对话?不会。 vault_search / vault_entry 只返回元数据,密码、备注内容、TOTP 种子一律不外泄;api_key 之类打码为 ***
需要密码去填表单怎么办?vault_copy → 由 MimaVault 自己写 Windows 剪贴板(复用 ClipboardSafe,30 秒自动清除),明文从未离开密匣进程
需要令牌去调 API 怎么办?vault_call_api → 凭据在插件进程内注入到出站请求,只把对方响应回给模型
代理调用会不会被拐走?三重限制:目标域名必须等于该条目 api_endpoint 的域名;不自动跟随 3xx 跳转;白名单外的域名直接拒绝
没登录时能用吗?不能。MimaVault 未解锁时描述文件不存在,插件直接提示"未运行/未解锁"
锁屏/离开时会怎样?MimaVault 3 分钟无操作自动登出,登出即吊销 API 并删除描述文件,插件立刻失效
别的程序能冒充吗?需要 Bearer token(256 位随机,仅当前用户可读的描述文件)。注意:同用户下的恶意程序仍可读取该文件 —— 这层防护挡的是浏览器 CSRF 与误操作,边界是 Windows 用户隔离

工具

工具作用会返回明文吗
vault_search按关键词/分类检索条目元数据(备注参与命中,但不返回内容)否
vault_entry读取单条元数据否
vault_copy把指定字段复制到剪贴板(密匣侧执行)否
vault_totp取 6 位动态验证码 + 剩余秒数仅短时效验证码
vault_generate生成新的随机口令是(新生成,非库中秘密)
vault_call_api用库中令牌代理发起 HTTP 请求(builtin 模式默认关闭)否(只有对方响应)
vault_clear只发起清空内置库的请求,须人工确认;不直接删数据否

侧栏面板

插件在侧栏面板列表里注册了一行「密匣」(与 purge 同一槽位 sidebar.panellist, order 取 31,紧排在其下方)。

点这一行就会自动尝试拉起密匣(页面挂载时调用宿主 POST /plugins/dsh-mimavault/launch), 面板显示四种状态:

状态含义
已连接密匣本地 API 可用,附端口号
密匣已启动,未就绪进程在跑,但没登录或没勾 Local API (DSH)
密匣未运行点了会尝试启动可执行文件
未找到密匣需要在插件配置里填 appPath

可执行文件路径按「配置 appPath → %LOCALAPPDATA%\Programs\密匣 MimaVault\ → 各盘符 \Programs\密匣 MimaVault\」依次探测,面板底部会显示实际解析到的路径。

面板在 external 模式只显示连接状态;builtin 模式额外提供模式切换、CSV 导入、条目列表、一键清除(二次确认)。面板只展示元数据,不展示任何密码明文。

检查更新

侧栏「关于插件」区块显示当前版本,点「检查更新」走多源查询:

源说明
GitHub 直连raw.githubusercontent.com/.../main/version.txt,带时间戳绕缓存
镜像ghfast.top 代理同一文件
GitHub Tags API仅当上面两个文本源都失败时才问,从 tags 取最大版本

多源取版本号最大者,防止镜像返回旧缓存。不用 jsDelivr CDN 做版本源 —— MimaVault v8.35.4 实测 CDN 会把 version.txt 缓存成几个版本前的旧内容,加时间戳也无效,会让人"更新"回旧版。

版本清单在仓库根 version.txt,格式 版本|Release 页面 URL|一句话说明。

结果 5 分钟缓存,点「检查更新」是强制刷新。发现新版时给出 Release 链接与「全部版本」链接,并提示:

当前 profile 以 link: 挂的是本地开发目录,插件不会自动覆盖它。请拉取新版本后重启 DSH,或在 DSH 插件管理页重新安装。

即:本功能只做检查与提示,不自动下载/替换插件代码。

部署

1. 选择模式

  • external:需要 MimaVault v8.35.5 或更高,启动并登录后托盘勾选 Local API (DSH),确认 %APPDATA%\MimaVault\api.json 已生成。取消勾选/锁定/自动登出/退出程序,API 立即失效。
  • builtin:不需要安装任何东西,侧栏面板里点「内置明文库(免安装)」即可。数据从密匣导出的明文 CSV 导入。

2. DSH 侧

把本包放进 profile。开发期用 link: 挂本地目录:

// %USERPROFILE%\.dsh\profiles\<profile>\package.json
{
  "dependencies": {
    "dsh-mimavault": "link:D:/path/to/dsh-mimavault"
  },
  "dsh": {
    "profile": {
      "bundles": [
        // …原有条目…
        "dsh-mimavault"
      ]
    }
  }
}

然后在 profile 目录执行 pnpm install 并重启 DSH。

配置

在 profile 的 cordis.patch.yml 里覆盖:

- id: dsh-mimavault
  name: dsh-mimavault
  config:
    requestTimeoutMs: 8000      # 调本地 API 的超时
    maxResponseBytes: 20000     # vault_call_api 返回体上限
    allowedHosts:               # 额外放行的域名(默认只允许条目 api_endpoint 的域名)
      - "*.openai.com"
    apiJsonPath: ""             # 一般不用改
    appPath: ""                 # 密匣 exe 路径(不填就自动探测各盘符)
    storePath: ""               # 内置库路径(默认 %APPDATA%/MimaVault/builtin-vault.json)
    enableBuiltinCallApi: false # 内置模式是否允许 vault_call_api(默认关闭,不建议开)
    updateTimeoutMs: 8000       # 检查更新时每个版本源的超时

已知限制

  • external 模式必须先手动启动并登录 MimaVault,插件无法代为解锁(主密码永不经过 DSH 进程)。
  • builtin 模式不加密,明文存盘;两套数据独立,切换不会自动迁移。
  • vault_call_api 只支持单次请求,不处理重定向与分页;builtin 模式默认关闭。
  • 清空内置库必须人工确认;备份文件本身也是明文。
  • 内置库的剪贴板复制依赖 Windows PowerShell;非 Windows 环境不支持。
  • 手动新增/编辑/删除仅在内置库模式可用;PC 密匣的维护仍在其桌面界面完成。
  • 编辑表单会在浏览器面板里短暂显示明文(预填用),请留意周围环境。

许可

MIT

相关插件