dsh-open-folder-fix:修正 Windows 上 DSH「打开工作区」无窗口问题

前言

在 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 错误等早期失败观察

安装与启用

  1. 在 SkillHub 目录页 查看当前是否可安装及版本(资料中 package 版本为 1.0.0)。
  2. 按你使用的 DSH 版本,通过 profile 的 bundle / 插件管理流程安装该 bundle(具体命令以目录页与官方文档为准;资料未提供可引用的固定 CLI 字符串)。
  3. 启用后刷新 Web GUI;若 profile 里包为符号链接指向本地开发目录,改代码后刷新页面即可生效,无需重复 install_bundle。

重复安装注意: 同路径再次 install_bundle 可能触发上游 plugin-manager 的 ambiguous-install(依赖变化识别逻辑)。开发调试时优先依赖符号链接与刷新,而非反复重装。

典型用法

安装并启用 bundle 后,无需额外 CLI:

  1. 在 DSH 中打开一个 Session,确认工作区目录在 Windows 上有效。
  2. 点击 Session 头部「在应用中打开工作目录」分裂按钮,选择 Explorer(或列表中与 explorer id 对应的项)。
  3. 预期行为:资源管理器新开窗口并进入该工作目录。其它应用入口仍走上游逻辑,行为与未装本插件时一致。

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
羽毛球分组比赛记分
小程序二维码

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

小夜