yingblock/dsh-plugin-files-download:为 DSH 文件树增加逐行下载按钮

前言

在 DeepSeek Harness(DSH)的 Web GUI 中查看项目文件树时,逐个下载文件需要反复点击或打开外部工具。本地开发中,几百 MB 的文件往往需要完整缓存才能下载,增加了内存开销。本文介绍的插件通过在每一行文件右侧添加 ↓ 下载按钮,将文件按原文件名直接流式下载,无需在页面缓冲。

插件定位

  • 名称:yingblock/dsh-plugin-files-download
  • 维护者:Yingblock
  • 分类:客户端
  • 核心功能:在 DSH Web GUI 文件树的每一行文件上增加下载按钮,点击后通过 Host 路由流式下载,支持大文件且不占用页面内存。

安装与启用

插件以预构建 JavaScript 打包,无需构建步骤。

  1. 从 GitHub 直接安装:
dsh plugin --profile web add github:Yingblock/dsh-plugin-files-download
  1. 或从本地路径安装:
dsh plugin --profile web add /path/to/dsh-plugin-files-download
  1. 或在 cordis.patch.yml 中手动添加:
- insert:
    - id: files-download
      name: dsh-plugin-files-download

安装后重启 dsh web。浏览器端需要硬刷新(Ctrl+Shift+R)以加载新的客户端图。

卸载

dsh plugin --profile web remove dsh-plugin-files-download

使用方式

  1. 打开右侧 Sidebar 的 Files 标签页。
  2. 每行文件右侧显示 ↓ 控制,始终可见;目录行无控制。
  3. 点击控制,浏览器会以文件原文件名保存到磁盘。

架构说明

插件分为 Host 与 Browser 两半:

  • Host:lib/index.js,在连接认证范围内注册 GET|HEAD /api/workspace-file.download?sessionId=…&path=…。根据 Session 的 workspace root 查找文件,校验路径有效性,然后通过 ctx.workspaceFiles 以 1 MiB 窗口流式输出,响应头包含 content-disposition: attachment。
  • Browser:lib/client.js,向文件树的 sidebar.right.files.row.actions 填充一个 <a download>,由浏览器下载管理器接管进度与取消。

文件树本身由 @deepseek-ai/dsh-client-ui-sidebar-files 定义,本插件仅填充该插槽。

要求

  • DSH 版本:任何声明了 sidebar.right.files.row.actions 插槽的构建(ui-sidebar-files)。
  • Node:>= 22(Host 使用 AbortSignal.any 和 WHATWG ReadableStream)。
  • 浏览器:任意现代浏览器;下载为普通导航,不依赖客户端专属 API。

验证

  1. 服务器端验证未认证请求返回 401:
curl -s -o /dev/null -w '%{http_code}\n' \
  'http://127.0.0.1:3080/api/workspace-file.download?sessionId=x&path=y'
  1. 认证后,正常文件返回 200 并流式输出字节;参数缺失返回 400;未知会话返回 404;文件不存在或非常规文件返回 404 或 422。

  2. 浏览器控制台可检查诊断对象:

JSON.stringify(globalThis.__DSH_FILES_DOWNLOAD__)
// {"apply":true,"registered":true,"renders":9,"version":"single-seat"}

renders 为当前渲染的文件行数。

限制

  • 仅支持文件下载,不支持目录或打包下载。
  • 路由基于当前 Session 的 workspace root,冷会话会回退到持久层 header-only stat。
  • 下载权限与 ctx.fs 一致,可下载文件树可读的路径。
  • 保存名称为文件自身的 basename,由浏览器处理非法或冲突的名称。
  • 控件设计为始终可见,如需改为悬停显示,需在树组件样式表恢复 .actions { opacity: 0 } 并添加 .item:hover .actions 规则。

许可证

MIT,详见 LICENSE。

参考资料

  • GitHub:https://github.com/Yingblock/dsh-plugin-files-download
  • SkillHub 目录页:https://www.skillhub.cn/plugins/Yingblock/dsh-plugin-files-download
羽毛球分组比赛记分
小程序二维码

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

小夜