dsh-secret-ask: A DSH Plugin to Prevent Keys from Entering the Conversation

前言

智能体要调一个带 API key、token 或密码的命令时,常见做法是让用户把值粘贴到聊天里。值一旦进入对话,就同时进了消息记录、模型上下文和会话日志,事后清理成本高,误粘贴的风险也存在。

zayyehtut 维护的 dsh-secret-ask 换了一条流程:插件弹出一张遮罩卡片收值,值直接经本地回环请求写入本地凭据存储,不落聊天;需要时再由插件把它注入到单条命令的环境变量里。下面介绍它的能力、安装与用法。

这是什么

dsh-secret-ask 是 DeepSeek Harness 的插件,作者 zayyehtut,MIT 许可证,版本 1.0.0,声明的环境是 dsh >=0.2.1-rc.5 <0.3.0-0(README 标注在 0.2.1-rc.5 上测试)。它解决的问题是:让智能体临时申请一个秘密值,同时保证该值不出现在对话消息、模型上下文或会话日志里。

插件本体是纯 ESM JavaScript,客户端只有一个 React 遮罩卡片,不需要编译步骤。

核心功能

遮罩卡片收值。 卡片带密码框和显示切换,输入的值只存在于该卡片的 React 状态里,卡片卸载即清空。保存后提交到本地凭据存储 $DSH_HOME/.credentials.yaml。

三个工具。 ask_secret 申请并存储秘密,run_with_secret 在单条命令中使用,forget_secret 按名删除。模型只能看到秘密的名称和是否已配置,看不到值。

单命令注入。 值作为环境变量传给那一条子进程,命令输出里与存储值精确匹配的文本会被替换成 ***。

取消是干净的。 选择「Not now」只报告请求已取消,不存储任何部分值或草稿。

安装与启用

官方给出三种方式。

方式一,DeepSeek Harness 桌面应用(README 标为最简单):

  1. 在左侧栏打开 Plugins。
  2. 点 Add plugin,在包字段粘贴:
   github:zayyehtut/dsh-secret-ask
  1. 点 Install,然后 Enable now。
  2. 重载一次窗口,让客户端卡片加载完成。

方式二,命令行(dsh web 场景):

dsh plugin --profile web add github:zayyehtut/dsh-secret-ask

装完重启 dsh web。如果用的是自定义 profile,把 web 换成你的 profile 名。

需要注意的是,桌面应用使用自己管理的 profile,往 profiles/web 做 CLI 安装不会在桌面应用里显示,桌面用户应走方式一。

方式三,社区 dsh-market 目录。插件已提交到该目录,出现后搜索 Secret Ask 即可一键安装。

典型用法

首次运行时,让智能体去做一件需要秘密值的事,例如:“用我的 GitHub token 发布这个。”

  1. 智能体调用 ask_secret,对话框出现标题为 Secret requested 的卡片,显示变量名和一行用途说明。
  2. 粘贴值,按 Save(或回车)。卡片确认,智能体继续,值不会回显到对话记录。
  3. 之后智能体需要值时调用 run_with_secret,例如执行读取 $env:GITHUB_TOKEN 的命令。

如果某个名称已经存有值,ask_secret 默认不重复请求,除非智能体传 replace: true。

三个工具的职责与模型可见信息如下:

工具 作用 模型看到的信息
ask_secret 申请具名秘密并存储;已配置时为 no-op,除非 replace: true 名称 + 已配置标志
run_with_secret 在单条 PowerShell 命令中把具名秘密作为环境变量传入 脱敏后的输出 + 退出码
forget_secret 按名删除已存秘密 名称 + 已配置标志

当命令需要秘密但该名称未配置时,调用会以 not configured: NAME 失败,提示智能体先调 ask_secret。

配置

插件默认在 bundle 中插入一行,卡片模式开启。要改行为,在 profile 的 cordis.patch.yml 里加一条对应 patch:

- id: secret-ask
  config:
    entryMode: card        # card = 遮罩卡片(默认);question = 原生问题卡片
    timeoutMs: 600000      # 卡片等待时长,单位毫秒;上限 1 小时
    # enabled: false       # 挂载该行但不注册任何工具

entryMode: question 改用原生问题卡片,存储逻辑相同,但原生卡片会在 Web UI 里保留草稿,因此 README 建议保留卡片模式。enabled: false 是分阶段安装开关:行照常挂载,但不注册工具。

安全与隐私

值不进入模型上下文。工具参数和结果只带名称;卡片的提交请求把值直接发给本地进程。README 同时说明了几条边界,使用前值得确认:

  • 提交路由 /api/secret-ask 只接受回环 POST,要求 x-dsh-secret-ask: 1 头、同源校验、请求体上限 64 KiB,且不记录、不回显值。
  • 卡片不写浏览器存储(无 localStorage、无草稿存储、不入对话),输入在卸载和提交后清除。
  • 输出脱敏是精确匹配,只替换长度 4 字符以上的存储值;命令若对秘密做了转换或编码,仍可能打印结果。
  • 凭据文件对同一 Windows 用户下运行的任何程序可读,这与 Harness 自身凭据存储的限制一致,插件不是隔离沙箱。
  • run_with_secret 在常规沙箱策略下执行单条命令,工具返回后不会让进程继续存活,也没有后台任务或沙箱提权。

故障排查方面,卡片不出现通常是页面在插件加载前就打开了,重载窗口即可;卡片默认等待 10 分钟,超时会提示 No value was entered before the request timed out,重载后再次调用工具即可。

适用场景与注意

适合需要临时给智能体提供 API key、token、密码,又希望值不进对话、不进会话日志的场景,尤其是通过 dsh web 或桌面应用使用、已经依赖 Harness 凭据存储的用户。

安装前注意两点:一是插件以当前 DSH 进程的权限运行,凭据文件对同用户进程可读,不应把它当作隔离边界;二是从源码或目录安装前,应自行查看源码并确认许可证(本插件为 MIT)。生态背景上,DSH 的理念是“一切皆插件”,社区目录 dsh-market 是独立站点,与 DeepSeek / 幻方没有官方从属关系,插件也不是官方应用商店上架项。

结尾

dsh-secret-ask 的价值在于把“临时提供秘密值”这件事从聊天里挪出去:遮罩卡片收值、本地凭据存储保留、按需单命令注入并做输出脱敏,流程简单,也没有额外服务依赖。目录页见 https://www.skillhub.cn/plugins/zayyehtut/dsh-secret-ask ,源码见 https://github.com/zayyehtut/dsh-secret-ask 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye