@open-agfs/dsh-agfs:給 DeepSeek Harness 裝一個不佔端口的文件瀏覽器

前言

用 dsh web 做智能體開發時,常有這樣的時刻:agent 在工作區裏寫了一批文件,你想自己翻一翻目錄、看一眼日誌或截圖,而不是讓模型逐個描述。常見做法是另起一個靜態文件服務——多一個進程、多一個端口要維護;或者退回終端敲 ls,文件一多效率就下來了。

DSH 的理念是「一切皆插件」。下面介紹的 @open-agfs/dsh-agfs 是這個思路下的一個具體實現:它把文件瀏覽器 Web 應用直接掛在 dsh web 的宿主 webserver 上,不開獨立端口,也不起子進程。

這是什麼

@open-agfs/dsh-agfs 由 openAGFS 維護,MIT 許可證,當前版本 0.1.9。它由三部分組成:

  • 由宿主 webserver 提供的 React 前端與 REST API;
  • 一個 /dsh-agfs 對話框命令;
  • browse_filesread_file 兩個模型工具。

分工很清楚:人在瀏覽器裏瀏覽、搜索、預覽和整理文件;模型通過工具列出、搜索和讀取瀏覽根下的文本文件。雙方面對同一個瀏覽根,不需要爲「看文件」單獨起服務。

核心功能

文件瀏覽

  • 列表與搜索、文本預覽(markdown、代碼、日誌)、圖片預覽;
  • 文件夾的創建、重命名、複製、刪除;
  • 麪包屑導航,逐級點回根目錄;
  • 視圖切換(列表/卡片網格)與三種顯示尺寸(窗口面板、整個視圖、全屏);
  • 側邊欄提供項目目錄、快速訪問(Desktop/Downloads/Documents 等)、自定義根目錄與驅動器;
  • 工具欄搜索支持遞歸模式,上限 200 條命中。

前端隨包離線分發:React/ReactDOM 打包在包內,啓動無需 CDN,也不依賴 Babel(圖標仍走 cdnjs,見後文已知限制)。

會話聯動

  • 本地打開(僅本地模式):右下角浮動按鈕可在系統文件管理器中打開當前目錄;
  • 一鍵 AI 分析(僅本地模式):右鍵文件或文件夾輸入需求,dsh 會創建工作區並喚醒新會話進行分析。

模型工具

插件註冊兩個模型工具:

  • browse_files(參數 pathkeywordrecursive):列出目錄,或按關鍵字搜索條目名,可選遞歸;
  • read_file(參數 path):讀取瀏覽器根下的文本文件內容。

有了這兩個工具,模型可以直接查看目錄結構和文件內容,而不只是文件名。

路徑安全與響應頭

瀏覽被限制在可瀏覽根內;strictRoot 開啓後執行實路徑檢查,symlink/junction 逃逸會被攔截並返回 400 envelope;另有 readOnly 只讀模式與 remoteMode。響應附帶安全頭 X-Content-Type-Options: nosniffX-Frame-Options: DENYReferrer-Policy: no-referrer

API 端點位於 ${basePath}/api/file_browser/ 下,路徑同樣限制在可瀏覽根內;search 支持 recursive=1,有 200 條命中上限和目錄深度上限 5。

安裝與啓用

插件通過 dsh.bundle 一行安裝,以 profile layer 激活。Node 版本要求 ^22.19.0 || >=24.0.0

方式一:對話框安裝

在 DeepSeek Harness 對話框裏直接讓 agent 安裝,例如:

Install the file-browser plugin dsh-agfs

agent 會調用 shell 工具執行:

dsh plugin --profile web add @open-agfs/dsh-agfs

這條鏈路要求 agent 的 shell 工具(bash/pwsh)可用。web profile 默認禁用 shell 工具,需要在 Settings → tools/permissions 裏啓用,或在 agent 請求批准時放行;不方便開 shell 工具就用方式二。

方式二:CLI 一行安裝

dsh plugin --profile web add @open-agfs/dsh-agfs

升級到最新版:

dsh plugin --profile web add @open-agfs/dsh-agfs@latest

無論哪種方式,安裝後都需要重啓 dsh web 才能生效。

源碼 overlay(開發調試)

從倉庫 checkout 出發,可以通過 --patch 掛載源碼:

- insert:
    - id: dsh-agfs
      name: 'file:///absolute/path/to/dsh-agfs/src/index.ts'

然後運行 dsh web --patch ./overlay.yml

典型用法

經過上面的步驟,在對話框運行:

/dsh-agfs

系統默認瀏覽器會打開文件瀏覽器並報告 URL;當前會話帶工作區目錄(session cwd)時,瀏覽器直接定位到該工作區。

若配置了 openOnCommand: false,這一步只報告 URL,不自動打開瀏覽器。

配置

配置存於 profile 的 user patch 層($DSH_HOME/profiles/<name>/cordis.patch.yml):

- id: dsh-agfs
  config:
    fileRoot: 'D:/projects/my-project'
    readOnly: true

常用配置項:

  • fileRoot:文件瀏覽器的根目錄;
  • readOnly:只讀模式;
  • strictRoot:實路徑檢查,攔截 symlink/junction 逃逸;
  • remoteMode:遠程模式;
  • openOnCommand/dsh-agfs 是否自動打開系統默認瀏覽器。

適用場景與注意事項

適合的場景:在 dsh web 裏做日常開發、需要人工覈對 agent 產出的文件;希望模型具備列目錄、搜條目名、讀文本文件的能力,而不想爲此單獨維護一個文件服務。

使用前注意:

  1. 插件以當前 dsh 進程的權限運行。安裝前建議閱讀源碼和許可證(MIT),確認符合自己的安全要求再裝。
  2. Font Awesome 圖標仍從 cdnjs 加載。無網絡時應用本身可用(React/ReactDOM 已隨包分發),只是沒有圖標。
  3. 搜索只匹配條目名,未實現遞歸內容搜索;遞歸模式有 200 條命中上限、目錄深度上限 5。
  4. 縮略圖直接傳輸原圖,不做縮放。
  5. openOnCommand 觸發的瀏覽器在運行 dsh 的主機上打開,對遠程客戶端來說這個行爲可能出乎意料。

結尾

簡單回顧:@open-agfs/dsh-agfs 把文件瀏覽器掛進 dsh web 的宿主進程,不開端口、不起子進程;/dsh-agfs 直達當前會話的工作區,browse_filesread_file 讓模型能直接查看瀏覽根下的文件。如果你在用 DSH 做開發,值得一試。

  • GitHub 倉庫:https://github.com/openAGFS/dsh-agfs
  • 社區目錄收錄頁:https://www.skillhub.cn/plugins/openAGFS/dsh-agfs(社區獨立維護的目錄站點,與 DeepSeek / 幻方無官方從屬關係)
羽毛球分组比赛记分
小程序二维码

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

小夜