前言¶
在使用 DeepSeek Harness (DSH) Web UI 进行智能体开发时,开发者经常需要从浏览器环境切换回本地文件系统,打开当前会话的工作区文件夹。这种跨窗口的操作会打断工作流。dsh-open-in-app 插件通过在 DSH Web UI 的会话头部工具行集成一个 Codex 风格的控件,提供了一键打开文件夹的能力。
核心功能¶
该插件在会话头部工具行新增了一个胶囊状的拆分控件。控件包含一个文件夹按钮和一个下拉箭头。
- 文件夹按钮:点击后使用上次为该工作区选择的应用打开文件夹。如果无历史记录,则回退到默认编辑器(优先级:VS Code > Cursor > Windsurf > Zed > …)。按钮上会显示对应应用的图标。
- 下拉箭头:点击展开菜单,包含“最近使用”、“系统默认应用”以及主机上已安装的终端和编辑器白名单。每一项均带有应用图标(如 macOS 的 Finder、Windows 的资源管理器)。
- Remote 端点:插件在宿主端注册了
openInApp服务,提供listApps、openWith、openDefault、openDefaultEditor四个方法,供其他插件或逻辑调用。
安装与启用¶
插件安装命令如下:
dsh plugin --profile web add dsh-open-in-app
安装完成后,必须重启 dsh web 应用。插件加载器与客户端模块图在启动时组合,新增插件不支持热重载。重启后,该控件会出现在会话标题旁。
典型用法¶
- 在聊天窗口右上角找到该控件。
- 直接点击文件夹图标,使用默认或上次选择的应用打开工作区。
- 点击下拉箭头,选择特定应用(如 Terminal、VS Code)打开。
- 若需自定义白名单,编辑
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。
- macOS:通过
- 图标解析:仅读取枚举的应用路径和 freedesktop 图标主题目录,缓冲区上限 256KB。缓存机制按源路径 + mtime,降低重复打开开销。
- 安全与权限:
- Remote 端点不在特权方法列表中,仅限 loopback 或可信主机访问。
- 打开路径派生原生进程,路径来自会话自身的
cwd。 - 命令失败(如应用缺失)会在菜单中显示错误行,不抛出异常。
- 开发约束:客户端 bundle 必须保持自包含,无构建步骤。
结尾¶
dsh-open-in-app 通过在 Web UI 中嵌入原生文件系统操作能力,简化了智能体开发中的环境切换流程。该插件基于 MIT 许可证开源,适合需要频繁在浏览器与本地编辑器之间切换的开发者使用。