前言¶
在 DSH Web GUI 的 Session 头部,「在应用中打开工作目录」分裂按钮会把当前工作目录交给本机应用打开。Windows 上该能力走 shell-open 通道,由 @deepseek-ai/dsh-native-command 执行。若你遇到过:按钮变回空闲、界面不报错,但资源管理器窗口始终没有弹出——这与上游在某些主机上的已知限制一致。下面介绍社区插件 dsh-open-folder-fix 如何在不破坏 VS Code、Windows Terminal 等其它「在应用中打开」选项的前提下,只修正 Explorer 打开目录的行为。
这是什么¶
dsh-open-folder-fix 由 Martlet-Tech 维护,仓库地址为 github.com/Martlet-Tech/dsh-open-folder-fix。插件通过 Cordis bundle patch 与浏览器注入,在 Windows 上把打开工作目录的 Explorer 调用从上游的 explorer.exe "<file:// URI>" 改为 explorer.exe /e,<目录>,解决「报告成功却不开窗」的问题。
社区目录页:skillhub.cn/plugins/Martlet-Tech/dsh-open-folder-fix。SkillHub 为 DSH 社区插件目录,与 DeepSeek / 幻方无官方从属关系;安装方式以目录页与 DSH 当前版本的插件管理文档为准。已抓取资料中未给出固定的 CLI 安装命令,请勿自行拼接未在文档中出现的 dsh plugin add 形式。
问题背景¶
上游在 0.1.7-rc.1 等版本对 Windows 使用类似下面的调用:
explorer.exe "<目录的 file:// URI>"
更早版本则走 PowerShell Invoke-Item。两者在部分 Windows 主机上症状相同:dsh-native-command 的 Known Limitations 指出,在非交互会话等环境下,explorer.exe 可能不调用文件关联,约 1 秒后仍以退出码 1 返回;上游把退出码 1 当作「已交接给桌面进程」,再配合 launchWatchMs 看门狗,导致「窗口未开」与「已成功打开」在 DSH 侧无法区分。
README 中在 Windows 10 19045.7663 上的对比示例:openNativePath 报告成功但 Explorer 窗口数不变;而 explorer.exe /e,D:\Projects\dshell 能稳定新开窗口。
核心功能¶
Host 侧¶
- 注册独立路由
POST /open-folder-fix/open,路径刻意不与上游/open-in-app/*重叠,避免webServer.register重复注册导致插件加载失败。 - 非 Windows(非
win32)请求返回 501;macOS / Linux 仍使用上游行为。 - 可配置项
launchWatchMs(默认 1500):观察explorer.exe交接后早期 spawn 失败的时间窗口;成功不与进程退出码绑定(Explorer 委派后常返回退出码 1,与上游runExplorer的处理一致)。
浏览器侧¶
- 从上游公开的
/open-in-app/apps读取已安装应用列表;仅对explorer这一 id 转发到本插件路由,其余应用(VS Code、Windows Terminal、Git Bash 等)仍 POST 到上游/open-in-app/open。 - 通过
cordis.patch.yml禁用上游ui-open-in-app浏览器半边,避免与插件争抢同一 slot cell id(open-in-app)导致注册顺序不确定。 - 上游
@deepseek-ai/dsh-host-open-in-app保持挂载,继续提供应用目录与图标;Explorer 图标仍走/open-in-app/icon/explorer。
包结构(便于理解行为)¶
package.json bundle 清单:声明 dsh.bundle.patch 与 dsh.client
cordis.patch.yml 禁用上游 ui-open-in-app,插入本插件的 Host 行
index.js Host:注册 POST /open-folder-fix/open
client.js 浏览器:接管 Session 头部分裂按钮
插件仅使用 Node 内置模块,不 import @deepseek-ai/dsh-native-command 的 revealNativePath(/select, 用于定位文件,与本插件打开工作目录无关)。
配置¶
Host 导出的 Config 必须符合 Standard Schema(含 ~standard.validate)。Cordis 的 resolveConfig 在发现插件导出 Config 时会无条件调用 Config['~standard'].validate(config);若写成普通字段描述对象,会导致 DSH 组合树启动阶段抛错、整个 DSH 无法启动。正确实现见仓库 index.js 中的 Config。
| 配置项 | 说明 |
|---|---|
launchWatchMs |
默认 1500,范围校验见 Config.validate;仅用于 spawn 错误等早期失败观察 |
安装与启用¶
- 在 SkillHub 目录页 查看当前是否可安装及版本(资料中 package 版本为 1.0.0)。
- 按你使用的 DSH 版本,通过 profile 的 bundle / 插件管理流程安装该 bundle(具体命令以目录页与官方文档为准;资料未提供可引用的固定 CLI 字符串)。
- 启用后刷新 Web GUI;若 profile 里包为符号链接指向本地开发目录,改代码后刷新页面即可生效,无需重复
install_bundle。
重复安装注意: 同路径再次 install_bundle 可能触发上游 plugin-manager 的 ambiguous-install(依赖变化识别逻辑)。开发调试时优先依赖符号链接与刷新,而非反复重装。
典型用法¶
安装并启用 bundle 后,无需额外 CLI:
- 在 DSH 中打开一个 Session,确认工作区目录在 Windows 上有效。
- 点击 Session 头部「在应用中打开工作目录」分裂按钮,选择 Explorer(或列表中与
explorerid 对应的项)。 - 预期行为:资源管理器新开窗口并进入该工作目录。其它应用入口仍走上游逻辑,行为与未装本插件时一致。
Host 侧实际执行的 Explorer 形式为:
explorer.exe /e,<目录>
README 还记录了 explorer.exe <目录>、explorer.exe /select,<父目录> 等变体的行为差异;本插件选用 /e,<目录> 作为稳定新开窗口的方案。
适用场景与注意¶
适合谁: 在 Windows 上使用 DSH Web GUI,且「打开工作目录」经常无窗口、无报错的技术用户与智能体开发者。
边界:
- 仅 Windows 有意义;其它平台请依赖上游。
- 不修改上游 native-command 里「在资源管理器中显示某个文件」的路径。
- 插件 Host 代码在 DSH 进程权限下运行;安装前应阅读仓库源码与许可证(package.json 为
@local/dsh-open-folder-fix,private: true,以 GitHub 仓库为准)。
DSH 生态强调「一切皆插件」;本插件是社区维护的补丁型 bundle,不是 DSH 核心发行版的一部分。
结尾¶
dsh-open-folder-fix 用最小侵入的方式修正 Windows 上 Explorer 打开工作目录的参数,并保留上游应用列表与其它应用的启动路径。若你正被「按钮成功但文件夹没出来」困扰,可以从目录页进入仓库阅读实测表格与 patch 设计,再决定是否加入 profile。
- 目录页:https://www.skillhub.cn/plugins/Martlet-Tech/dsh-open-folder-fix
- GitHub:https://github.com/Martlet-Tech/dsh-open-folder-fix