我反复碰到的问题

我通过浏览器界面使用 DeepSeek Harness。我经常让 Agent 查看本机文件,或者进入某个本地目录继续处理。

路径就在 Finder 里。我选中文件并按下 Cmd + C,回到 DSH 输入框却得不到绝对路径。我还得选择“拷贝为路径名称”、打开终端,或者手动输入路径。

每种办法都会在“找到文件”和“让 Agent 使用文件”之间多加一步。我一天要重复很多次。

/Users/you/code/my-project/src/index.js

Finder 与浏览器之间的边界

Finder 会在 macOS Pasteboard 中写入原生文件引用列表,不会把绝对路径写成普通剪贴板文本。AppKit 通过 NSFilenamesPboardType 暴露这份列表。

DSH 输入框运行在浏览器里。浏览器的安全规则阻止网页把复制的文件转换成本机绝对路径。没有这条规则,任意网页都能探知我的文件系统结构。

DSH 从未收到这条路径。macOS 把文件引用留在 Host 侧,浏览器无法直接读取。

Finder
  └─ macOS Pasteboard:原生文件列表
         ╳  浏览器文件系统边界
DSH Web 输入框
  └─ 需要一段纯文本绝对路径
文件引用和文本输入框位于一条刻意存在的浏览器边界两侧。

我想要的快捷键

我只需要增加一个快捷键,同时保持普通粘贴不变:

  1. 在 Finder 中选中一个或多个文件、文件夹,按 Cmd + C
  2. 回到 DSH Web。
  3. Ctrl + V
  4. 把绝对路径逐行插入当前草稿。

Cmd + V 继续粘贴普通文本。剪贴板里没有文件路径时,插件忽略 Ctrl + V

我的解法:Host 读取,Client 写入

我写了 dsh-paste-path,一个面向 macOS 和 DSH Web profile 的插件。Host 读取 Pasteboard,Client 写入输入框。

1. 在 Host 侧读取原生 Pasteboard

Host 插件通过带 AppKit 的 osascript 读取 NSFilenamesPboardType。Finder 可以一次复制多个文件。插件会返回路径列表,也接受每一行都是绝对路径的纯文本。

插件提供两个本地接口。第一个检查当前是否有可用路径,第二个在我按下快捷键后返回路径。Host 记录 Pasteboard 的 change count;剪贴板没有变化时,它复用上一次结果。

2. 在 DSH Client 侧写入路径

Client 扩展检测到有效路径后,显示“Ctrl+V 贴路径”。我按下快捷键,它把新路径追加到当前输入框,并跳过重复路径。

我把这个快捷键限定在文件路径场景。其他剪贴板内容仍由浏览器处理。

Finder Cmd+C
    ↓
macOS Pasteboard
    ↓  osascript / AppKit
127.0.0.1 上的 DSH Host 插件
    ↓  同源请求
DSH Web 输入框
    ↓  Ctrl+V
草稿里的绝对路径
插件跨越 Host–Browser 接缝传递路径文本,文件内容留在原处。

剪贴板接口只允许本机访问

剪贴板属于运行 dsh web 的机器。插件只接受 loopback 请求,并在写入路径前检查请求来源。

  • Host 返回路径字符串,文件内容留在原处。
  • Host 拒绝来自非 loopback 地址的剪贴板请求。
  • 插件在 Linux 和 Windows 上不会注册接口。
  • 远程 DSH 需要文件上传或客户端配套程序。

另一台机器上的 DSH 进程无法读取我这台 Mac 的剪贴板。SSH 端口转发会让请求在服务器看来像 loopback,但不会把我的剪贴板带过隧道。

安装

这个插件已经发布到 npm:

dsh plugin --profile web add dsh-paste-path

安装后重启 dsh web 并刷新页面。源码、实现说明和当前限制都在 GitHub 仓库中。

只做路径粘贴

操作系统知道文件路径,浏览器不能把它暴露给任意网页。我主动触发粘贴时,本地 Agent 才得到这条信息。

我保留了浏览器边界,只为一个快捷键增加 loopback 桥接。插件读取路径文本,把它写进草稿,然后停止。