前言¶
在 DeepSeek Harness(DSH)里跑多个对话时,常见需求是:有的会话只给只读类工具,有的放开写入和 shell,还有的只想让模型在工作区内读写文件。宿主侧沙箱模式(read-only、workspace-write 等)往往是 profile 或会话级的大开关,很难做到「A 会话关 write、B 会话全开、C 会话禁 shell 且路径锁在工作区」且互不影响。
下面介绍的 dsh-tool-picker(维护者 ptilroko)是社区插件目录 SkillHub 上归类为 admin-security 的包:在 agent 作用域 用 Host API 掩码工具列表并可选路径守卫,客户端提供输入框左侧工具面板与设置页。设置落在 profile 磁盘上,重启不丢。
这是什么¶
dsh-tool-picker 给 DSH 增加 按会话 的工具开关,以及 访客模式(Guest mode):文件类工具只允许访问当前会话工作区内的路径,并关闭 shell、子代理等工作流类工具。Host 侧通过 ctx.tools.restrict() 与 ctx.tools.guard() 实现,被关掉的工具在 schema、查找、执行三处同时不可见——不是 UI 上藏一下而已。
核心功能¶
会话工具栏¶
输入框左侧「工具」按钮打开面板:
- 逐项开关当前会话可用工具(如
read、write、edit、glob、grep、web_search等) - 顶部搜索框过滤工具名
- 「访客模式」快捷键(仅当前会话)
- 底部显示「已启用 / 总数」
只列出 可被限制的 工具:全局注册与上层继承的工具;会话自己注册的工具不在此列。
访客模式(workspace-only)¶
开启后会关闭 bash、pwsh、shell、terminal、exec、subagent、workflow 等(子代理不继承守卫,故整类禁用)。对 read、read_image、write、edit、glob、grep 增加路径守卫:仅允许工作区内路径。判断先做字面 resolve(),再做 realpath(),工作区内的 junction/软链接指向系统目录也会被拦住。越界时模型收到明确拒绝理由,例如:
访客模式:read 不能访问工作区之外的路径 "C:\Windows\win.ini"(工作区:E:\work\demo)
访客模式:glob 的模式 "../**/*.json" 可能越出工作区(工作区:E:\work\demo)
这是 工具层 守卫,与宿主沙箱模式无关;在 danger-full-access 下仍生效。在关闭 shell 类工具之前,守卫管不住 shell 里执行的命令——因此访客模式会直接关掉 shell 类工具。
模板¶
可将一套工具开关与访客状态存为模板,一键套用到任意会话,支持导出/导入 JSON。仓库内 presets.json 为可导入样例,结构示例:
{
"version": 2,
"templates": {
"访客模式": { "tools": ["bash", "pwsh", "subagent", "workflow"], "guest": true },
"只读模式": { "tools": ["bash", "pwsh", "write", "edit"], "guest": false }
}
}
设置页:访客模式¶
设置左侧增加「访客模式」页:
- 新对话默认开启:新会话自动带访客模式,已有会话不受影响
- 按会话设置:列出侧边栏会话逐个开关;已归档、子会话不出现
斜杠命令¶
/tools 列出本会话工具与开关状态
/tools off write,edit 关掉指定工具(逗号分隔)
/tools on write 打开
/tools guest [on|off] 切换访客模式(不带参数则取反)
/tools default [on|off] 新对话是否默认开访客模式
/tools reset 清掉本会话记录,恢复全部工具
/tools templates 列出模板
/tools save <名字> 把当前状态存成模板
/tools apply <名字> 套用模板
/tools delete <名字> 删除模板
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议阅读 GitHub 源码 与 MIT 许可证。
环境要求(来自 package.json):Node >=22.12.0,DSH ^0.2.0-rc.1。插件管理器读取 engines.dsh,不满足会拦截安装/启用。
通过插件管理器(推荐)¶
在 DSH 里让模型执行:
plugin_manager action=install_bundle target=<本地绝对路径 或 本仓库 npm spec>
或将本包加入 profile 的 dsh.profile.bundles,由 loader 加载。
手动¶
在 <profile>/cordis.patch.yml 中插入 bundle 条目:
- insert:
- id: dsh-tool-picker
name: 'dsh-tool-picker'
要求:包为 ESM("type": "module");exports 须包含 "./package.json",否则客户端模块表可能静默跳过整个客户端;dsh.bundle.patch 指向 cordis.patch.yml;dsh.client.inject 声明依赖的客户端服务包。
状态与恢复¶
持久化路径:
<profile>/data/dsh-tool-picker/state.json
disabled 记录 被关掉 的工具名(新工具默认开启)。state.json 是缓存;重开会话时优先从会话日志 session.requestHeader() 与 developer/message 中的 tool 变更块恢复,换机器或删除 state 也不会悄悄把已隐藏的工具加回。访客模式由插件偏好记录,恢复时按「shell 与子代理全关、文件工具仍在」等特征反推。
restrict/guard 失败会记入会话 degraded,面板与 /tools 会提示;路径守卫拒绝会累计 blocked 并显示最后一次原因。
适用场景与注意¶
适合需要在 同一 Harness 里并行多种信任级别对话的开发者或管理员:例如对外演示会话开访客模式,内部调试会话保留 shell。
已知限制(README 原文):
- 只能 移除 工具,不能凭空添加
run_code不能点名限制(PTC 传输层)- 会话自注册工具不受控
- 子代理不继承父会话守卫
- 访客模式不替代 DSH 沙箱;更严格时可配合
workspace-write/read-only - 修改
client.js后须 重启宿主,仅刷新页面不够
客户端 bundle 在宿主启动时快照,属实现细节,部署时需知晓。
结尾¶
dsh-tool-picker 把「本会话能用哪些工具、文件是否只能碰工作区」做成可持久、可模板、可斜杠命令操作的配置,并与会话日志对齐,避免状态与模型实际所见工具不一致。
- 目录页:https://www.skillhub.cn/plugins/ptilroko/dsh-tool-picker
- 仓库:https://github.com/ptilroko/dsh-tool-picker
社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态以「一切皆插件」为方向,选用第三方插件时请自行审阅源码与权限影响。