前言¶
在 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 生態以「一切皆插件」爲方向,選用第三方插件時請自行審閱源碼與權限影響。