Repository navigation
Replies: 1 comment
|
补充一个不同触发位置的实例,以及一条会影响修法的实测。 环境:Windows 11 build 26200;Desktop 版 DeepSeek Harness 44.0.0, 触发位置与主贴不同:不是 症状: 定位(同主贴的逐 handler 插桩): 受控验证:只从 HKCU 的 一条会影响修法的实测:「目标 exe 不存在」本身不足以复现。 版本差异:我这边的表现不是控件完全消失,而是应用列表为空、回退到「显示文件位置」,可能与入口(交付卡片 / desktop 版)有关。 |
Uh oh!
There was an error while loading. Please reload this page.
[Bug] Windows 上单个损坏的 shell 关联 handler 会让原生打开能力全部消失(应用列表 500)
@deepseek-ai/dsh-native-command(主因)、@deepseek-ai/dsh-client-ui-deliverables(放大与不可观测性)、@deepseek-ai/dsh-host-open-in-app@deepseek-ai/dsh@0.2.0-rc.2(npm 发行版,非源码 checkout)10.0.19041),PowerShell 5.1,profileweb,dsh web绑定127.0.0.1:3080摘要
dsh-native-command的 Windows 应用枚举(DshFileAssociations.List)对每个已注册 shell handler 直接调用IHandler.GetName(),没有异常保护。只要机器上存在一个登记残留但已损坏的 handler(例如某个已卸载程序留下的HKCU\Software\Classes\Applications\<app>.exe记录),GetName()就抛E_FAIL (0x80004005),导致:powershell.exe退出码 1、无 stdout;nativeFileApplications()抛出 →session.workspacePathApplications()抛gateway/internal;/api/present.open(GET 应用列表分支)返回 500;用户可见结果:「无法获取本机应用,无法用默认应用打开交付物」,但侧边栏预览始终可用。
复现
任选一个磁盘上存在的文件:
失败时的真实报错(被
output()或 PowerShell 的$ErrorActionPreference='Stop'转成一个失败进程):逐 handler 插桩后可精确定位到具体是哪一个损坏:
根因链
dsh-native-command/WINDOWS_ASSOCIATIONS的List()对比同一个源文件里的其它调用点都是有保护的:
IconData()用try { handler.GetIconLocation(…) } catch (Exception) { … }(约 585–609 行),而这个循环里没有。一个坏 handler 就能终止整张列表。windowsFileApplications()把该 C# 放进$ErrorActionPreference = 'Stop'的脚本执行;异常变成 terminating error,powershell.exe退出码 1、stdout 为空,runNativeCommand(execFile)reject。dsh-host-open-in-app/dsh-api-session-controller:探测路径上的output()把失败静默吞成null(开菜单按钮因此永远不出现),而文件级查询nativeFileApplications直接抛。dsh-client-ui-deliverables路由(registerPresentOpen)把一切异常压成一句纯文本:failureStatus()只把ENOENT/ENOTDIR/not-found映射为 404,其它一律 500,且不写任何日志、不回传 cause。这直接导致排查成本极高:浏览器只看到 500,服务端控制台一行都没有。期望行为
GetName/GetUIName/GetIconLocation/IsRecommended逐调用try/catch,坏条目跳过而不是让整个列表失败;openNativeAssociatedPath/revealNativePath根本不走这条枚举;500 "…unavailable."。证据
HKCU\Software\Classes\Applications\AxureRP8.exe\shell\open\command="D:\Axure RP 8\AxureRP8.exe" "%1",而D:\Axure RP 8已删除;HKCU\Software\Classes\md_auto_file\shell\edit\command="C:\Program Files\Microsoft Office\root\Office16\Winword.exe" /n "%1",该 64 位路径不存在(真实 Word 在Program Files (x86))。.json、.md、.ini等所有扩展名都会命中(SHAssocEnumHandlers会把这类登记注入每个扩展名的枚举)。try/catch的版本 →handlers=15 broken=0,正常返回 14 条应用;List()→ 抛0x80004005。.json与.md的nativeFileApplications()均恢复OK (14 apps),而openNativeAssociatedPath()/revealNativePath()前后都是 OK —— 说明坏的只有枚举,不是打开。建议优先级
List()内GetName/GetUIName加重试或 try/catch(核心修复,两行级别);OpenRegistered()里的handler.GetName(同上);dsh-api-session-controller.SessionController.workspacePathApplications()捕获异常返回部分/空列表,或把枚举失败与「无桌面」区分开;/api/present.open与/api/changes.open记录 cause。附:用于定位的插桩脚本(可作回归测试素材)
环境补充
dsh --version/ 包:@deepseek-ai/dsh@0.2.0-rc.2,profileweb(bundles:dsh-base、dsh-web-app、dsh-experimental-auto-review)http://127.0.0.1:3080(无 SSH、无 WSL、无容器,SESSIONNAME=Console)canOpenNativePath()=true,nativeFileManager()=explorerAll reactions