前言¶
在 DSH 里让 Agent 代填 API key、改 .env 或处理带身份证号的文本时,常见做法是把整段内容粘进对话。明文会进入会话日志、发往模型服务商的请求以及各类备份,事后难以收回。下面介绍社区插件 dsh-secret-vault(维护者 yuloop,分类 admin-security):把交接从聊天通道挪到本机私密投放箱,Agent 只拿到不透明句柄和不含值的字段摘要,正文不进上下文。
这是什么¶
dsh-secret-vault 是 DeepSeek Harness(DSH)的 bundle 插件,简介为:hand secrets to the agent without them entering the context。你在网页私密面板粘贴密钥、配置、银行短信或混杂 PII 的文本;插件把正文写入本机随机名文件(权限 0600),只向模型暴露句柄、类型/长度/指纹级摘要,以及经掩码后的内容分类建议。参数里若用路径或命令指向私密目录的工具调用会被拒绝,其余工具照常;工具返回进上下文前还会对常见凭据样式做出口打码。
核心功能¶
本地投放与生命周期¶
正文落在随机 tmp-<32 hex> 文件名中,目录 700、文件 600,单份上限 128 KiB。每天 04:00 清理已用文件,未用文件 24 小时后过期。state.json 不含任何值(项目测试对此有断言)。
字段抽取与分类(模型不参与)¶
确定性字段抽取(< 1 ms):网址、模型名、密钥(长度 + 指纹)、PII(大陆身份证 GB 11643、银行卡 Luhn + 前缀、手机号号段、同句关键词的验证码、邮箱)、标签、JSON 路径。
内容分类 pipeline:规则 → TF-IDF 线性模型 → 拒判;类别包括 provider-config、server-login、db-credential、bank-sms、identity、api-keys、mixed、unknown,并附带 sensitivity、confidence、evidence 与一行 advice。分类器只看到定长占位符骨架([[SECRET]] / [[PII]] / [[URL]]),骨架不落盘。分类结果仅为建议,界面只标标签,由人确认,不会自动触发动作。
守卫与出口打码(4.5.x)¶
守卫(4.5.0 收窄)只拒绝「参数是路径/命令且指向私密目录」的调用(如 file_path、command、cwd、paths);read/cat/glob 拿不到字节,与存储无关的命令仍可执行。出口打码(4.5.0)在工具返回进入上下文前,将 sk-/AKIA/ghp_/JWT/Bearer 等高熵样式替换为「前 4 字符 + 指纹」。存储异常时 fail-closed 收窄:仅拒绝会碰到存储的调用,不再冻结整会话工具。
暴露给模型的工具¶
| 工具 | 作用 |
|---|---|
private_local_status |
返回 mode、限制说明、句柄与 shape(类型/敏感级/依据/建议/计数),不含值 |
private_local_process |
六种固定文本变换:copy、trim_edges、normalize_newlines、json_pretty、json_compact、dedupe_lines |
private_local_process + operation:"write_secret" |
把值写入目标配置文件的指定键(.env/.ini/.properties/.yml/.toml/.json/.php/.js/.ts),返回 {ok, status, target, keyPath, changed, fingerprint},值不出现在返回里 |
没有删除工具、没有 shell、没有 HTTP:模型够不到字节,只能在摘要与句柄周围干活。
宿主机救援命令¶
不依赖浏览器,命令永不打印明文值:
secret-vault status [session] # 列出条目与锁定状态(只读)
secret-vault fields [id] # 字段摘要 + 分类
secret-vault cleanup # 立即执行 04:00 的清理
secret-vault purge <session> --yes # 删除该会话的文件(不可恢复)
无软链时可用:node bin/secret-vault.mjs …。
安装与启用¶
DSH 要求 dsh >= 0.2.0。在插件管理器中添加 bundle spec:
git+https://github.com/yuloop/dsh-secret-vault
或在「设置 → 插件 → 插件市场 → 添加索引 URL」中加入:
https://raw.githubusercontent.com/yuloop/dsh-secret-vault/main/marketplace/index.json
索引加入后插件会出现在「发现」页。安装前建议阅读 GitHub 仓库 源码与 MIT 许可证。
典型用法¶
- 点输入框旁的钥匙图标,粘贴密钥、配置、银行短信或夹杂值的杂乱文本。
- 保存。面板显示一行摘要,例如:
模型供应商配置 · 敏感:secret · 网址2 · 模型1 · 密钥1。 - 直接说明任务。模型调用
private_local_status获取句柄,按摘要行事,无需把路径粘进聊天。 - 用完后在界面删除(二次确认),或等待每日清理。
换 API key 的典型 write_secret 请求体如下(值仅存在于本地句柄,不出现在返回里):
{"reference": "tmp-<32hex>", "operation": "write_secret",
"target": "/root/project/config/secrets.local.php", "key_path": "AI_API_KEY", "mode": "first-secret"}
mode: "whole"(默认)取整段去首尾空白;first-secret 取识别到的第一个密钥跨度。目标不存在时按格式生成初始内容;已存在时只改匹配处,其余字节与权限位保留。
适用场景与安全边界¶
适合: 需要在 DSH 会话里让 Agent 协助写配置、换 key、处理含 PII 的本地文本,又希望明文不进入 LLM 上下文与日志的开发者或运维。
构造上保证: 正文不经聊天、附件或 LLM 通道;私密相关工具结果只带类型、长度和指纹;分类器只看掩码骨架。
不保证: 插件以当前 DSH 进程同一用户运行,无操作系统级隔离;其他进程、其他插件、备份或 root shell 仍可能读到文件。守卫防误操作,不防蓄意脚本外泄。通过 write_secret 写入的配置文件本身会保留一份明文副本。社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-secret-vault 把「交接凭据」从聊天通道拆到本机投放箱:Agent 拿句柄和摘要干活,明文不进模型上下文;配合守卫、出口打码与有限的 write_secret,覆盖常见的换 key 与本地配置写入场景。进一步了解可访问 SkillHub 目录页 与 GitHub:yuloop/dsh-secret-vault。