dsh-open-in-app:DeepSeek Harness Web UI 插件,用于从会话头部打开工作区文件夹

前言

在使用 DeepSeek Harness (DSH) Web UI 进行智能体开发时,开发者经常需要从浏览器环境切换回本地文件系统,打开当前会话的工作区文件夹。这种跨窗口的操作会打断工作流。dsh-open-in-app 插件通过在 DSH Web UI 的会话头部工具行集成一个 Codex 风格的控件,提供了一键打开文件夹的能力。

核心功能

该插件在会话头部工具行新增了一个胶囊状的拆分控件。控件包含一个文件夹按钮和一个下拉箭头。

  1. 文件夹按钮:点击后使用上次为该工作区选择的应用打开文件夹。如果无历史记录,则回退到默认编辑器(优先级:VS Code > Cursor > Windsurf > Zed > …)。按钮上会显示对应应用的图标。
  2. 下拉箭头:点击展开菜单,包含“最近使用”、“系统默认应用”以及主机上已安装的终端和编辑器白名单。每一项均带有应用图标(如 macOS 的 Finder、Windows 的资源管理器)。
  3. Remote 端点:插件在宿主端注册了 openInApp 服务,提供 listApps、openWith、openDefault、openDefaultEditor 四个方法,供其他插件或逻辑调用。

安装与启用

插件安装命令如下:

dsh plugin --profile web add dsh-open-in-app

安装完成后,必须重启 dsh web 应用。插件加载器与客户端模块图在启动时组合,新增插件不支持热重载。重启后,该控件会出现在会话标题旁。

典型用法

  1. 在聊天窗口右上角找到该控件。
  2. 直接点击文件夹图标,使用默认或上次选择的应用打开工作区。
  3. 点击下拉箭头,选择特定应用(如 Terminal、VS Code)打开。
  4. 若需自定义白名单,编辑 lib/apps.js 中的 WHITELIST 数组。

白名单与配置

菜单中的应用由白名单控制。默认白名单包含常用的终端和编辑器,如 Terminal、iTerm2、Ghostty、Warp、VS Code、Cursor、Zed 等。

要增删条目,需编辑 lib/apps.js 中的 WHITELIST 数组。每个条目为 { id, category, match, exact? } 结构:
* id:规范显示名(也是原生打开命令必须能找到的名称)。
* match:用于子串匹配的别名。
* exact:用于全名匹配,防止短名称冲突(如 code 误匹配 CodeRunner)。

技术细节与注意事项

  • 平台实现:
    • macOS:通过 sips 转换 .icns 为 32px PNG,使用 open -a "<app>" <path>。
    • Windows:通过 PowerShell 提取 .exe 内嵌图标,使用 cmd /c start "" <exe> <path>。
    • Linux:解析 .desktop 文件,使用 gtk-launch <id> <path> 或回退到 xdg-open。
  • 图标解析:仅读取枚举的应用路径和 freedesktop 图标主题目录,缓冲区上限 256KB。缓存机制按源路径 + mtime,降低重复打开开销。
  • 安全与权限:
    • Remote 端点不在特权方法列表中,仅限 loopback 或可信主机访问。
    • 打开路径派生原生进程,路径来自会话自身的 cwd。
    • 命令失败(如应用缺失)会在菜单中显示错误行,不抛出异常。
  • 开发约束:客户端 bundle 必须保持自包含,无构建步骤。

结尾

dsh-open-in-app 通过在 Web UI 中嵌入原生文件系统操作能力,简化了智能体开发中的环境切换流程。该插件基于 MIT 许可证开源,适合需要频繁在浏览器与本地编辑器之间切换的开发者使用。

插件目录 | GitHub 仓库

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

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

小夜