DeepSeek Harness macOS 面板与菜单点不动:原生目录选择器与锚点失效排查
「Mac 的访达是不是坏了?搜索不能用,侧边栏也打不开别的文件夹」——这是社区里一位用户的原始描述。实际那是 DSH 自己的目录选择器,面板弹出来了,但焦点根本不在它身上。 同一台机器上还有另一类「点得动但位置不对」的菜单问题,两者看着都像 UI 坏了,修法完全不同(#10748、#10607)。
DeepSeek Harness 分诊表:三种「点不动」
先看是整块不能交互、还是局部不能交互、还是能交互但位置不对——三类分别指向焦点、窗口层级、锚点三个层面。
| 症状 | 交互对象 | 判断方向 |
|---|---|---|
| 侧边栏、搜索框都不能用 | 系统级原生面板 | 面板不是 key window |
| 右侧文件列表能进,左侧点不动 | 同一面板的两个区域 | 左侧是 AppKit table view |
| 菜单能点,但背景透字、位置偏 | 页面内 web 菜单 | CSS 锚点没生效 |
判别顺序建议固定:先确认「点得动吗」,再确认「点得动的是哪一块」,最后才看视觉。
DSH插件 第一类:面板整体拿不到焦点
面板是以 accessory 应用身份弹出的,激活调用写在面板创建之前;此时进程还没有窗口,系统把焦点直接还了回去。
- 现象:点「增加新文件夹」弹出面板,点侧边栏没反应,点搜索框打字也没有光标。
- 社区做的独立复现:直接跑那段 JXA,面板由
osascript进程弹出。 - 面板托管的服务是
Open and Save Panel Service (osascript),说明它是系统级面板而不是网页元素。 - 同一时段
mdfind正常返回,排除 Spotlight 索引损坏。 - 结论:
activateIgnoringOtherApps(true)在NSOpenPanel.openPanel之前调用,面板以「可见但不是 key window」出现。
DeepSeek Harness 第二类:右侧能点、左侧点不动
侧边栏是 AppKit 的 table view,acceptsFirstMouse 返回 NO,首次点击被当成「激活窗口」消费;右侧文件列表是文件对话框自己的 out-of-process 视图,照常接受点击。
- 观察细节:右侧能正常进出目录,左侧任何一项都点不动。
- 切换目录后侧边栏会跟着高亮——那是面板根据当前路径自己同步的,不是点击反馈,很容易误判成「能点」。
- 探测方法:用同一段脚本分别在「面板创建前激活」与「面板创建后激活」两种时机下读
panel.isKeyWindow与NSApp.isActive。 - 社区结果:当前代码 6 次里 5 次
isKeyWindow为 false;挪到创建之后 6/6 为 true。 - 修法就是把激活那一行从
openPanel之前移到面板建好之后、runModal之前。 - 补丁在本地分支
fix/macos-panel-activation(cb461ebb87),并在native-picker.spec.ts里加了断言把调用顺序钉住,15 项测试通过。
DeepSeek插件 第三类:菜单能点,但位置和外观不对
anchor-name 与 position-anchor 经 var() 中转时,真实 Chromium 不应用这个替换,backing 于是没有锚点可依,尺寸退化成 0×0。
- 看现象:菜单只有 45% 半透明层,压在网页内容上透出模糊文字,压在窗口透明区则呈均匀亮灰。
- 采样对比:故障时约 (135,135,135),设计上 backing 生效时应为不透明深灰约 (42,43,46)。
- 看实现:
MenuSurface.tsx把锚点名注入成--dsh-menu-anchor,CSS 侧写anchor-name: var(--dsh-menu-anchor)与position-anchor: var(--dsh-menu-anchor)。 - 看探测:
CSS.supports对anchor-name、position-anchor、anchor()全部返回 true,但布局不应用。 - 看尺寸:backing 的
getBoundingClientRect()是 0×0;同一窗口里改成字面量锚名后,backing 与 surface 完全对齐。 - 看回退:
top: anchor(top)、left: anchor(left)没有回退值,无效就停在 auto;anchor-size(width, 0px)取显式回退,就是 0。固定定位加 auto 偏移加零尺寸,就是你看到的错位。 - 修法:在
MenuSurface.tsx里直接内联写这两个属性——surface 上写anchor-name,backing 上写position-anchor,用同一个生成的字符串,去掉自定义属性中转。
DeepSeek Harness 两步验证:别把两类混在一起
先确认焦点,再确认锚点;两个实验都不需要改代码。
- 焦点实验:点面板任意位置一次,再点侧边栏。如果第二次生效,就是「首次点击被激活消耗」。
- 也可以换一个已知能用的目录选择入口(例如网页里的上传控件)对照,确认不是全系统问题。
- 锚点实验:打开菜单,看背景是否透出页面文字;再用开发者工具把 backing 的锚名改成字面量,看是否对齐。
- 对齐了就说明是变量中转的问题,不是透明度或模糊材质配置。
DSH插件 补丁长什么样
修复本身只有两行位置的调整:一个是把激活调用后移,一个是把两个锚点属性从变量换成字面量。
- 目录面板这一处,把激活从面板创建前挪到创建后、
runModal之前:
var panel = $.NSOpenPanel.openPanel;
panel.message = argv[0];
// 面板已存在时才激活,否则 accessory 应用会把焦点直接还回去
app.activateIgnoringOtherApps(true);
if (panel.runModal !== $.NSModalResponseOK) return '';
- 菜单这一处,把 surface 上的
anchor-name与 backing 上的position-anchor直接写成同一个生成字符串,不再经var()。 - 两处改动都不影响其它平台分支,样式表仍然只做消费方。
- 改完各跑一次对应测试:目录选择器 15 项通过;菜单侧靠对齐结果肉眼可验。
修复后的验证
验证标准很具体:焦点在面板上,锚点在 backing 上。
- 重新打开目录面板,点侧边栏任意一项,应当直接切换目录。
- 点搜索框,光标应当出现并能输入。
- 打开菜单,背景应当是不透明深灰,不再透出页面文字。
- 缩放窗口再开菜单,方向与位置应当跟随触发按钮。
注意事项
- 别把它当成访达故障。面板外观与访达几乎一致,社区建议在面板提示或文档里注明「这是 DSH 的目录选择器」。
- 别用「高亮」判断可点击。侧边栏高亮是同步当前路径的结果。
- 别只改 CSS 变量名。变量名怎么改都还是经过中转,问题在替换本身。
- 别期待重启解决。两类都是代码层面的时序与属性问题。
- 记录系统版本。社区在 macOS 26.4、27.2 上都复现过,版本差异不是分界线。
如果你的问题是「面板能点,但选完目录没反应」,那不属于这两类,去查工作区创建链路与 ACL。相关排查见 DeepSeek Harness macOS 桌面端:全屏点检查更新后黑屏与窗口消失的排查。
常见问题
不是,那是 DeepSeek Harness 的原生目录选择器,外观和访达几乎一致。面板以「可见但不是 key window」的状态出现,侧边栏的点击被当成「激活窗口」消耗掉,右侧文件列表因为走独立的 out-of-process 视图反而正常。
同一个根因,DeepSeek Harness 的目录面板不是 key 窗口,拿不到键盘焦点。非 key 窗口拿不到键盘焦点,搜索框点了也不会出现光标。社区在 macOS 26.4 上复现,并确认 mdfind 正常,所以不是 Spotlight 索引问题。
有,社区给了 DeepSeek Harness 的本地补丁:把 activateIgnoringOtherApps(true) 从 NSOpenPanel.openPanel 之前挪到面板创建之后、runModal 之前。探测显示原来是 6 次里 5 次 isKeyWindow 为 false,改后 6/6 为 true。补丁在本地分支,官方未合。
不是,问题在 DeepSeek Harness 的 CSS 锚点定位。MenuSurface 的 macOS backing 依赖 CSS 锚点定位,而 anchor-name / position-anchor 经 var() 传入时 Chromium 不应用,backing 尺寸为 0×0,只剩 45% 半透明层。把两个属性直接内联写就能对齐。
看交互对象就能分开 DeepSeek Harness 的两类 UI 问题:系统级弹窗(选目录)点不动属于焦点问题;页面内菜单能点但位置或外观错属于锚点问题。前者靠调整激活时序,后者靠去掉 CSS 变量中转。
相关术语
- key window
- key window 是 macOS 中当前接收键盘与鼠标事件的窗口。非 key 窗口上的部分控件会把首次点击用于激活窗口,从而「看得见但点不动」。— https://github.com/deepseek-ai/deepseek-harness/discussions/10748
- NSOpenPanel
- NSOpenPanel 是 macOS 的原生打开/保存面板。DSH 的目录选择器通过 JXA 在 osascript 里调用它,因此面板由独立的系统进程托管。— https://github.com/deepseek-ai/deepseek-harness/discussions/10748
- acceptsFirstMouse
- acceptsFirstMouse 是 AppKit 控件的一个属性,决定非 key 窗口上的首次点击是否直接生效。返回 NO 时,首次点击只用于激活窗口。— https://github.com/deepseek-ai/deepseek-harness/discussions/10748
- anchor-name
- anchor-name 是 CSS 锚点定位属性,给元素命名以便其他元素相对它定位。经 CSS 自定义属性中转时,Chromium 可能不应用该替换,导致定位整体失效。— https://github.com/deepseek-ai/deepseek-harness/discussions/10607
来源
- #10748 — macOS 添加工作区:原生目录面板的侧边栏无法点击· deepseek-ai(GitHub Discussions)
- #10607 — MenuSurface 的 macOS backing 在真实 Chromium 上从未生效· deepseek-ai(GitHub Discussions)
- deepseek-ai/deepseek-harness(源码仓库)· GitHub