dsh-credential-handoff
English | 中文
状态:功能插件,已在 DeepSeek Harness 0.1.0-rc.6 上测试。
dsh-credential-handoff 让 agent 向用户索要一个指定名称的凭据,而无须把秘密放进模型上下文。浏览器会弹出会话局部的密码对话框,把值写入 DSH 的凭据服务,最后只向工具调用返回固定的状态元数据。
问题
agent 能发现某个凭据缺失,但让用户把密钥粘进普通聊天,密钥就会落进对话记录和模型上下文。本插件为这个时刻提供一条只写的交接路径。
行为
request_credential 工具接受一个凭据引用(如 TAVILY_API_KEY)、可选的标签和原因。每个会话同一时刻只允许一个待处理的请求;对话框十分钟后过期。工具结果只报告该引用,以及它是新建的还是替换的。
HTTPS 下允许提交凭据;明文 HTTP 下只对精确的回环主机(localhost、127.0.0.1 和 IPv6 回环)放行。非回环的明文 HTTP 提交,界面控件和提交处理都会拦下。
非目标
本包不是保险库、加密提供者、凭据查看器,也不为子进程注入凭据,更不是 DSH 凭据 provider 的替代品。它无法保护被攻陷的浏览器、宿主进程或 DSH 凭据后端。
机制
- Host:注册
request_credential,等待一个带标签的userQuestions请求。 - Client:只处理这个带标签的问题,直接调用
credentials.set。 - 结果:用固定文本回答待处理的问题,返回不含值的元数据。
秘密不会出现在本插件产生的问题回答、工具结果、常规日志或会话事件负载里。
兼容性
已在 DeepSeek Harness 0.1.0-rc.6、Node.js ^22.19.0 || >=24、pnpm >=10 上测试。DSH 仍是发布候选版本,后续版本可能改动 question、credential 或 client-slot 的约定。
安装
dsh plugin --profile web add "github:xiaohj233/dsh-credential-handoff#v0.1.0"安装后重启 Web profile。
配置
无需任何插件设置,模型直接调用:
{"ref":"TAVILY_API_KEY","label":"Tavily API key","reason":"Required for Tavily search"}凭据引用采用 shell 风格命名:以字母或下划线开头,后面跟字母、数字或下划线。
卸载
dsh plugin --profile web remove dsh-credential-handoff移除插件会一并移除工具和对话框,但不会删除 DSH 凭据 provider 里已存好的凭据。
安全
不要把 DSH Web 控制面暴露给不可信网络。拦下明文非回环提交,只保证本插件不会经由这条通道把秘密发出去,并不会给 DSH 加上认证;配置的凭据 provider 自身的存储特性需要另行审查。
测试
npm test
npm run check:syntax
npm run scan:secrets -- synthetic-test-value lib/index.js lib/client.js test/validate.test.js
npm pack --dry-run测试覆盖:引用校验、秘密形态处理、传输分类、问题/结果映射和包语法。
局限性与上游现状
DSH 已提供 resolve、describe、set、unset 凭据服务,本插件只是补了一个会话局部的交接 UI 和模型工具,不会把凭据值读回浏览器或模型。
rc.6 的通用问题 UI 总会提供一个 Other 文本答案;若客户端的接管 bundle 加载失败,回退问题会提醒用户不要粘贴秘密、直接取消,但宿主无法去掉那个通用字段。直接客户端也可以绕过本插件调用 DSH 自己的凭据 API;更广的 Web 控制面的传输与认证仍是上游的职责。
License
MIT。详见 LICENSE。