dsh-tool-picker:按會話控制 DSH 工具與訪客模式

前言

在 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 上藏一下而已。

核心功能

會話工具欄

輸入框左側「工具」按鈕打開面板:

  1. 逐項開關當前會話可用工具(如 read、write、edit、glob、grep、web_search 等)
  2. 頂部搜索框過濾工具名
  3. 「訪客模式」快捷鍵(僅當前會話)
  4. 底部顯示「已啓用 / 總數」

只列出 可被限制的 工具:全局註冊與上層繼承的工具;會話自己註冊的工具不在此列。

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

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

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

小夜