dsh-file-preview:在 DSH Web 聊天里就地预览本地文件与链接

前言

在 DeepSeek Harness(DSH)里和智能体协作时,对话里经常出现三类「看得见却不好立刻打开」的内容:助手给出的本地路径、会话附件文件名、以及 http(s) 外链。默认界面里它们多半是普通文本或链接,要确认内容往往得切到资源管理器、另开浏览器标签,或自己拼 file:// 路径。

dsh-file-preview 是维护者 dadgrand 发布的客户端类 DSH 插件(当前版本 0.1.0,MIT 许可证)。它在 Web UI 里拦截聊天中的相关点击,在对话上方弹出模态窗口,就地预览图片、PDF、Office 文档、文本与代码等,并提供复制、在浏览器中打开、在文件管理器中显示、用系统默认应用打开等操作。插件托管于社区目录 SkillHub,与 DeepSeek / 幻方无官方从属关系;DSH 生态奉行「一切皆插件」,可按需从目录或 GitHub 获取源码核对后再安装。

这是什么

一句话:dsh-file-preview 为 DSH Web 界面提供会话内文件与链接预览能力——点击路径、附件名或外链即可打开预览模态框,而不必离开当前聊天页。

实现上分为两半(见项目 README):

  • Host(index.js 与 lib/host/):在 DSH 的 webServer 上注册 /api/dsh-file-preview/*,从磁盘读文件、按需把 Office 转为 PDF、拉取链接元数据、执行系统级打开/定位等动作。
  • Client(lib/client.js):在浏览器侧捕获点击、渲染模态框,文本与图片的剪贴板复制由客户端完成。

package.json 要求 Node >=20,DSH 引擎 >=0.2.0-rc.2;客户端配置为 platform: web、immediately: true,加载后即可参与点击拦截。

核心功能

预览与内容类型

Host 通过 GET /meta 判断文件类型,preview 字段可为 image、pdf、text、markdown、code、html、office、video、audio 或 none。常见能力包括:

  • 二进制与流式读取:GET /raw(支持 Range,适合 PDF/音视频)。
  • 文本抽取:GET /text(UTF-8,异常字节时 Windows 上可回退 Windows-1251)。
  • Office:GET /office-pdf 依赖组合里是否挂载 officeToPdf 服务(桌面配置里常见 office-to-pdf 插件);未挂载时返回 501 office-unavailable,客户端可退化为「用默认应用打开」。
  • 外链:GET /link 在 5 秒超时、最多 512 KiB 响应体内抓取标题、描述、站点名等元数据(仅 http/https)。

转换得到的 PDF 缓存在 $DSH_HOME/cache/file-preview/;除该目录外插件不向磁盘写入其他位置。

模态框中的操作

模态框内动作与 Host POST /action 对应(需 Content-Type: application/json):

action 含义
open 用系统默认应用打开文件
reveal 在文件管理器中定位文件
browser 在系统浏览器中打开 URL
copy-file 将文件本身放入系统剪贴板(Windows / macOS;Linux 返回 action-unavailable)

纯文本、图片、链接的「复制」不在 Host 实现,由客户端通过浏览器剪贴板 API 处理。

聊天里会拦截哪些点击

README 说明客户端在 window 上注册捕获阶段 click 监听,典型来源包括:

  • Markdown 里的本地路径链接(fileLink 按钮,路径在 title 或文本中);
  • 助手图片 img[src*="api/file?path="];
  • Deliverable 卡片、data-changed-files 中的绝对路径;
  • 普通 a[href^="http"] 外链;
  • 用户附件 [data-message-attachments]:DOM 里往往只有文件名,因此会调用 GET /resolve,优先在 $DSH_HOME/attachments 按 basename 找最新文件,否则在请求 cwd 下搜索。

无需修改 DSH 核心或其它插件包即可工作。

安全边界(loopback fence)

所有 API 仅对 loopback 调用方响应:校验 remoteAddress、Host、可选的 sec-fetch-site / Origin,并对跨站请求返回 403。若环境中挂载了 connection 服务,还会走 connection.requestRejection,与 dsh-host-open-in-app 同类。

读文件范围由配置 readScope 控制:

  • 默认 readScope: any:在桌面场景下,经上述校验的本机 DSH 页面可预览机器上任意已存在路径(含工作区外、UNC 等)。请求仍只来自本机 loopback,属于产品上的显式取舍。
  • readScope: roots:路径必须落在请求 cwd、$DSH_HOME、os.homedir()、os.tmpdir() 以及 allowRoots 之内,否则 403 outside-allowed-roots。

注意:/action 对用户指定的已存在路径不做 roots 限制(README 明确说明),安装前应结合权限与配置评估风险。

Host 进程在 Desktop 下以 ELECTRON_RUN_AS_NODE=1 运行,不能 require('electron');打开文件与 file-drop 剪贴板通过系统命令(如 xdg-open、explorer.exe)完成。

安装与启用

官方说明:仅通过 DSH 的 Plugin Manager 安装,使用 install_bundle 并传入插件目录的绝对路径(例如你本地克隆或解压后的 .../plugins/dsh-file-preview);不要手改 profile。资料中未提供 dsh plugin add github:... 一类 CLI 一键命令,请勿凭插件名拼接。

安装完成后 profile 中会出现:

  • package.json 的 dependencies["dsh-file-preview"] = "link: <路径>";
  • dsh.profile.bundles 包含 dsh-file-preview;
  • Cordis 树中的 file-preview 行。

启用 / 禁用:在 Plugin Manager 中切换 file-preview 行(或 set_plugin / set_bundle)。Host 侧 ESM 需重启 DSH Host 进程;客户端脚本需刷新页面(有 watcher 时可 HMR)。

回滚:先禁用 file-preview,再对 dsh-file-preview 执行 remove_bundle;PDF 缓存需手动清理 $DSH_HOME/cache/file-preview/。

环境要求:engines.node >= 20,dsh.engines.dsh >= 0.2.0-rc.2。

配置项

在 Cordis 中 file-preview 行的 config 可调整(未知键会被忽略并回退默认值):

config:
  readScope: any
  allowRoots: ['D:/projects', '\\\\server\\share']
  officeTimeoutMs: 120000
  copyFileTimeoutMs: 3000
  linkTimeoutMs: 5000
  linkMaxBytes: 524288
  resolveMaxDepth: 8
  resolveMaxEntries: 20000

若希望限制可读路径,将 readScope 设为 roots 并配置 allowRoots,例如:

config:
  readScope: roots
  allowRoots: ['D:/projects', '\\\\server\\share']

典型用法

用法以「在聊天里点击」为主,无需额外命令:

  1. 让助手在回复里写出可点击的本地路径,或上传附件;点击路径或附件名,应弹出预览模态框。
  2. 对 PDF、图片、Markdown/代码文本,在模态框内直接查看;对 .docx 等 Office 文件,在已安装 office-to-pdf 且服务可用时内嵌 PDF 预览。
  3. 需要落地到系统时,使用模态框中的「在资源管理器中显示」「默认应用打开」或「在浏览器中打开」(外链)。

开发与自检(来自 README,需在插件源码目录执行):

cd plugins/dsh-file-preview
node --check index.js
node scripts/check-bundle.mjs
node scripts/unit-host.mjs

客户端会在 GET 请求上附带 ?seat=...(如 overlay-mounted),可通过 GET /api/dsh-file-preview/status 查看 lastClientSeat 与请求计数,确认浏览器侧 bundle 已挂载。

适用场景与注意

适合谁:日常在 DSH Web / Desktop 聊天里频繁核对生成文件、日志片段、PDF 或 Office 交付物的开发者;希望少切换窗口、在会话内完成「看一眼再决定要不要打开」的场景。

平台差异:README 写明 Windows 为首要目标;macOS / Linux 通过 open / xdg-open 等通用启动方式支持。Linux 上 copy-file 不可用;WSL 路径互转未实现(与 dsh-native-command 不同)。

权限与信任:插件以当前 DSH Host 进程的系统权限读文件、执行打开命令。默认 readScope: any 时可读本机任意存在路径。安装前请阅读 GitHub 仓库 源码与 MIT 许可证,并在不信任环境下改用 readScope: roots。

依赖:Office 内嵌预览依赖组合中的 officeToPdf 服务;无服务时仍可走系统打开,但无法在模态框内转 PDF。

结尾

dsh-file-preview 把「路径、附件、外链」从聊天里的死文字变成可预览、可一键落到系统的交互,Host 与 Client 分工清晰,并通过 loopback 与可配置的 readScope 界定读盘范围。若要查看简介与版本信息,可打开社区目录页 dadgrand/dsh-file-preview;实现细节与 API 表以 GitHub README 为准。

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

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

小夜