用 dsh-drag-and-drop 把拖入文件的本机绝对路径写进 DeepSeek Harness 输入框

前言

DeepSeek Harness(dsh)官方仓库把核心理念写成「Everything is a Plugin」:界面、工具、工作区能力都可以按 profile 叠加。它的工具读的是本机上的真实路径,改的也是这些路径旁边的依赖文件。网页对话却经常卡在另一件事上:浏览器出于安全考虑,通常不会把拖入文件的真实文件系统路径交给页面,最多给一个本地文件 URI,很多时候什么都不给。

结果很常见。把文件拖进普通网页输入框,要么变成上传(一份副本,和原来的目录、相对引用、邻近依赖切断关系),要么只能手敲绝对路径,盘符、空格、UNC 都容易写错。社区插件 dsh-drag-and-drop 补的就是这一段:在运行 dsh 的那台机器上,把拖入的文件或文件夹还原成本机绝对路径,再写进当前对话输入框。文件本身不上传、不移动、不复制。

社区插件目录是独立站点,和 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。下面按目录详情页、插件 GitHub 仓库(含 README.zh.mdpackage.jsonCHANGELOG.md)以及 DeepSeek Harness 官方仓库交叉核对后整理。

这是什么

dsh-drag-and-drop 是一款面向 DeepSeek Harness Web UI 的记忆类插件,由 bill9109 维护,许可证为 BSD-3-Clause,主要语言是 JavaScript。仓库当前版本号是 0.1.5package.jsonCHANGELOG.md 一致,发布说明日期为 2026-08-14)。GitHub 仓库 bill9109/dsh-drag-and-drop 目前有 15 颗星;社区目录页收录日期为 2026-08-15。

一句话定位:把本地文件或文件夹拖到 DeepSeek Harness 页面任意位置,其原始绝对路径就会插入当前会话输入框。

它解决的不是「把文件变成附件」,而是让智能体继续对着原来那份文件工作。目录把它分在「记忆」类,和知识图谱、跨会话记忆不是同一类能力:它记住的是文件在磁盘上的位置,避免上传副本把上下文弄丢。

package.json 声明了 dsh.bundledsh.client,属于官方 profile / bundle 模型下的 Web 端插件,不需要改 dsh 源码,也不再依赖旧的 config.yaml。CHANGELOG 0.1.4 把包名迁到了 @omdsh-dev/dsh-drag-and-drop,README 里的安装示例也写过 github:omdsh-dev/dsh-drag-and-drop。社区目录收录并给出安装命令的是 bill9109/dsh-drag-and-drop;下文安装以目录页原文为准。

核心功能

目录页和仓库 README 列出的能力一致,可以分成拖拽交互、路径形态、定位策略三块。

拖拽与写入

  • 把文件拖到 Web UI 任意位置,插入原始绝对路径。
  • 拖拽过程中全页面压暗并模糊,作为可松开的提示。
  • 支持文件和文件夹;一次拖入多个项目时,每个路径占一行。
  • 通过 DSH 的输入状态服务写入草稿,不直接改输入框 DOM。
  • 定位失败时弹出插件 toast:可手动关闭,8 秒后自动消失,鼠标悬停会暂停计时。

路径形态与文件处理

  • 输出 macOS、Linux、Windows 的原生路径。
  • 支持 POSIX 路径、Windows 盘符路径和 UNC 网络路径。
  • 不上传、不移动、不复制文件;也不会修改或删除文件。
  • 多数情况下只读元数据。只有多个候选同名且同大小时,才读取少量内容做采样指纹;大文件采样仍冲突时,才计算完整 SHA-256。定位和指纹都在运行 dsh 的本机完成。

候选怎么确认

浏览器藏起真实路径时,插件不会把磁盘上第一个同名文件直接塞进输入框。仓库说明的筛选顺序是:

  1. 先按完整文件名文件大小过滤。修改时间只用于排序,不当成身份。
  2. 只剩一个候选时,直接用该路径,不读文件内容。
  3. 多个候选时,比较文件开头、中间、结尾的采样指纹;大文件采样仍冲突,才算完整 SHA-256。
  4. 若干路径对应字节完全相同的副本时,弹出路径列表,由用户选择要插入的那一条。

文件夹先按名称搜索。唯一候选直接返回,不遍历浏览器里的目录树;多个同名候选再比较排序后的相对路径、项目类型和文件大小。结构仍相同的目录,会对最多 24 个按确定性规则选出的文件做内容采样;还是无法区分则交给用户选择。目录遍历最多处理 10,000 个项目、32 层,不跟随符号链接或 Windows junction。

路径如何定位

如果浏览器提供了本地文件 URI,插件会直接转成当前操作系统的原生路径。

如果浏览器隐藏了原始路径,定位顺序如下(仓库 README 与 0.1.5 的 CHANGELOG 一致):

  1. 当前 Workspace
  2. 其他已注册 Workspace
  3. Desktop、Documents、Downloads
  4. 各搜索根内三层以内的浅层扫描:根的直接子项、直接子目录里的直接子项、再下一层的直接子项。CHANGELOG 0.1.5 写明这一层是为了命中类似 ~/Downloads/dump2 11/iotclaw.ndjson 这种「常用目录下再嵌两层」的拖入;以前只探直接子项时,后面的有界递归会在超大 Downloads 树里把 20,000 项预算耗完,最后弹出「未能定位原始路径」。
  5. 操作系统文件索引
  6. 有边界的平台目录搜索

系统索引按平台分工:

  • macOS:Spotlight
  • Linux:优先 plocate,其次 locate
  • Windows:优先 Everything CLI,其次 PowerShell

Linux 在索引没有候选时,还会搜用户主目录以及 /mnt/media 下的挂载点。Windows 则会搜用户目录和可用的固定磁盘。每一层都是先看搜索根的直接子项,再查该范围内的索引,最后才递归。

搜索是有上限的,避免把整块磁盘扫一遍:

  • 单次外部索引命令超时 3 秒
  • 最多保留 100 个候选路径
  • 三层浅层扫描每个搜索根最多展开 4,096 个直接子目录
  • 每个递归搜索根最多访问 20,000 个目录项
  • 读不到的目录和文件会被忽略

安装与启用

社区目录页给出的安装命令是:

dsh plugin add github:bill9109/dsh-drag-and-drop

这是目录页原文,不要凭插件名自己拼 GitHub 地址。仓库 README 同时说明:这是 Web UI 的 bundle,应装进 web profile,官方 dsh 文档里的形态也是 dsh plugin --profile <profile> add github:owner/repo。实际装到网页界面时,更稳妥的写法是:

dsh plugin --profile web add github:bill9109/dsh-drag-and-drop

也可以从本地 checkout 安装:

dsh plugin --profile web add /path/to/dsh-drag-and-drop

仓库已经提交构建产物(lib/),安装后不需要再执行构建。package.jsonengines 要求 Node.js ^20.0.0 || >=22.0.0

目录页提示:如需可复现安装,请固定 commit 哈希。当前 main 最新提交为 09088d6890866eda57adee6864cd2fbf8281f679(2026-08-14,对应 0.1.5 的三层浅层定位),可以写成:

dsh plugin --profile web add github:bill9109/dsh-drag-and-drop#09088d6890866eda57adee6864cd2fbf8281f679

安装后按你平时启动 DSH Web UI 的方式重启,再刷新浏览器。插件会出现在浏览器引导数据 __DSH_BOOT__ 里,client bundle 随新页面加载。只装不重启、不硬刷新,页面上不会有拖拽提示。

升级(README):

dsh plugin --profile web update github:bill9109/dsh-drag-and-drop

若当初按 README 示例从 omdsh-dev 安装,把上面的仓库名换成 omdsh-dev/dsh-drag-and-drop 即可。本地路径安装则对替换后的 checkout 再执行一次 add

卸载要用包名。CHANGELOG 0.1.4 之后包名是 @omdsh-dev/dsh-drag-and-drop

dsh plugin --profile web remove @omdsh-dev/dsh-drag-and-drop

命令会把包从 profile 和 dsh.profile.bundles 里移除。卸载后同样需要重启 Web UI 并硬刷新浏览器。

典型用法

仓库给出的操作只有三步,没有额外配置项。

  1. 从 Finder、Linux 文件管理器或 Windows 资源管理器,把文件或文件夹拖到 DSH Web UI 的任意位置。
  2. 出现全页面拖拽提示后再松开。插件把定位到的原始绝对路径写入当前会话输入框。
  3. 一次拖入多个项目时,输入框里每个路径占一行,可以直接发给智能体去读、跑或改这些路径。

Linux 侧要求文件管理器提供 text/uri-list。macOS 说明支持 Finder 拖拽和 Spotlight,并写明已在 macOS 的 Chrome 上验证。Windows 支持盘符路径和 UNC;浏览器隐藏路径时优先走 Everything CLI,没有 Everything 时用 PowerShell 搜用户目录和固定磁盘。

README 里的排查表可以直接对照:

现象 处理
拖入后没有任何反应 再拖一次,确认全页面提示出现。用 dsh --profile web --dump-config \| grep drag-and-drop 确认 bundle 已在 profile 中,并确认安装后重启过 Web UI、做过硬刷新
多个同名副本时路径不对 候选先按完整文件名和大小过滤,只在剩余文件之间采样内容;仍有完全相同副本时会弹出选择列表,在那里指定路径
大磁盘上定位很慢 Linux 安装 plocate,Windows 安装 Everything 及其命令行工具,并尽量把文件放在 Workspace 或 Desktop / Documents / Downloads 里
macOS / Linux 拖入文件夹失败 文件夹按名称匹配 Workspace 和常用目录;浏览器隐藏路径时,落在所有可搜索根之外的文件夹无法定位,需要移进 Workspace 或装上系统索引
安装后插件未加载 重启 Web UI 并硬刷新。client bundle 只在插件进入 __DSH_BOOT__ 后的新页面加载

适用场景与注意事项

适合在 Web UI 里把本机文件交给智能体处理、又不希望上传副本的人,例如:

  • 把工作区里的源码、日志、配置拖进对话,让工具按原路径读取和修改
  • 一次拖入多个相关文件,按行给出路径
  • Windows 上需要 UNC 网络路径,或 Linux / macOS 上需要 POSIX 绝对路径

不适合、或需要先看清边界的情况:

  • 只在 TUI / 无 Web UI 的 profile 里用 dsh。这是 Web 端 client bundle,装错 profile 不会出现拖拽层。
  • 文件完全在 Workspace、常用目录和系统索引之外,而浏览器又隐藏了路径。文件夹尤其容易失败。
  • 磁盘上存在多份字节完全相同的副本:插件不会猜,会让你选。
  • 把「记忆」理解成跨会话知识图谱。它不抽取三元组,也不压缩对话历史。

安装前应阅读仓库源码和 BSD-3-Clause 许可证。目录页写明:插件以当前 dsh 进程的权限运行,安装时可能执行代码。 这和官方文档对 git 安装的提醒一致:允许构建或安装,等于允许这包代码在你的机器上、在 agent 沙箱之外执行。不信任的仓库不要装;需要可复现环境时固定 commit,避免后续 push 悄悄改掉运行内容。

社区里还有名称相近、交互不同的衍生仓库(例如把拖入项做成输入框上方芯片,而不是把路径文本写入草稿)。选用前核对 GitHub 地址是 bill9109/dsh-drag-and-drop,不要只搜插件名。

小结

dsh-drag-and-drop 做的事情很窄:在浏览器不肯交出真实路径的前提下,于运行 dsh 的本机上把拖入的文件还原成绝对路径,再写进当前对话。它不上传、不复制,优先在 Workspace 和常用目录里找,找不到再走有界索引。对依赖真实文件系统的 Web UI 工作流,这比手敲路径或上传副本更不容易把上下文弄断。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-drag-and-drop/

GitHub:https://github.com/bill9109/dsh-drag-and-drop

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

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

小夜