Repository navigation
Replies: 1 comment
|
你的诊断基本全对,我把泄漏链四段都在最新代码上钉了行号;但你援引的先例语义是反的,这条要改,否则维护者会顺着错方向看。 1. 泄漏链:四段可逐段复核
你的 2. 一个很能说明问题的细节桌面端在同一批里还注入了 而且契约层面也站不住: 失败文案来自 3.
|
|
你的诊断基本全对,我把泄漏链四段都在最新代码上钉了行号;但你援引的先例语义是反的,这条要改,否则维护者会顺着错方向看。 1. 泄漏链:四段可逐段复核
你的 2. 一个很能说明问题的细节桌面端在同一批里还注入了 而且契约层面也站不住: 失败文案来自 3.
|
Uh oh!
There was an error while loading. Please reload this page.
DSH 桌面版:
ELECTRON_RUN_AS_NODE=1泄漏到子进程,导致"在应用中打开(VS Code)"必然失败环境
0.2.0-rc.2C:\Users\zhaoruibo\AppData\Local\Programs\DeepSeek Harness\WindowsApps/App Paths均为 Windows 语义)desktop(默认,仅@deepseek-ai/dsh-base+@deepseek-ai/dsh-web-app,无第三方插件)%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe,手动打开完全正常现象
在 Web 界面右上角点击"用 VS Code 打开"(open-in-app),界面提示「打开失败,请重试」。
实测(VS Code 事先完全未运行,观察 60 秒):
Code进程数%APPDATA%\Code\logs目录数20261009T163404,16:34:15)即:VS Code 主进程从未启动,也没有产生任何日志目录——失败发生在 Electron 主进程初始化之前,不是界面误报。
复现
Code.exe进程未出现,%APPDATA%\Code\logs无新目录同一台机器上,直接双击开始菜单里的 VS Code 正常打开工作区。
根因
ELECTRON_RUN_AS_NODE=1从桌面版宿主进程泄漏到了它启动的所有子进程。1. 桌面版入口无条件注入该变量
app.asar/lib/main.js(Electron 主入口)中:它被用于拉起宿主进程(
app.asar/lib/main.js,HostProcess.start()):因此宿主进程自己的
process.env里就有ELECTRON_RUN_AS_NODE=1,并会被其所有子进程继承。2. 子进程环境清洗不过滤它
@deepseek-ai/dsh-subprocess的scrubbedParentEnv():ELECTRON_RUN_AS_NODE既不命中敏感词也不以DSH_开头 → 原样传给外部应用。3. 于是 Electron 系应用被强制当 Node 跑
@deepseek-ai/dsh-host-open-in-app用spawn(command, args, { detached: true, stdio: 'ignore', env: { ...scrubbedParentEnv(), ...options.env } })启动Code.exe --cd=<workspace>。子进程继承ELECTRON_RUN_AS_NODE=1后,Electron 进入 Node 模式,不会创建窗口,并在极早期退出。同一台机器上实测:
Code.exe --cd=<dir>,环境含ELECTRON_RUN_AS_NODE=1Code.exe --cd=<dir>,环境不含该变量dsh-host-open-in-app的启动器有 1 秒观察窗,规则是"spawn 失败或在窗口内非 0 退出即判失败":退出码 9 → reject → 界面显示「打开失败,请重试」。
4. 不是本机环境配置造成的
为避免误判,已确认该变量只存在于运行时,注册表与环境变量持久层都没有:
HKCU:\Environment→ 无该值HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment→ 无该值[Environment]::GetEnvironmentVariable('ELECTRON_RUN_AS_NODE','User'/'Machine')→ 均为空process.env.ELECTRON_RUN_AS_NODE === "1"因此这不是用户配置问题,而是桌面版自身的注入 + 未清理。
影响面
ELECTRON_RUN_AS_NODE作为 Node 模式选择开关)。dsh --profile desktop,用户自己的干净终端)时不会出现,因为该变量不在环境里。建议修复
@deepseek-ai/dsh-desktop-host在接收启动环境后,从自身process.env中删除ELECTRON_RUN_AS_NODE(Electron 的 Node 模式选择只在启动那一刻生效,删除后不影响该进程自身运行)。这样宿主进程的一切子进程都干净。ELECTRON_RUN_AS_NODE(以及ELECTRON_NO_ATTACH_CONSOLE、ELECTRON_FORCE_IS_PACKAGED等 Electron 选择变量)加入scrubbedParentEnv()的过滤名单——这是所有"启动外部程序"路径共用的清洗函数。dsh-host-open-in-app的launchDetachedApp里,对options.env显式清除该变量(env: { ...scrubbedParentEnv(), ...options.env, ELECTRON_RUN_AS_NODE: undefined })。注意这一处只管 open-in-app,其他 spawner(终端、skill 调用等)仍会中招,故建议优先做 1 或 2。补充:仓库里已有正确处理该变量的先例可参照——
dsh-ptc-runtime-node的说明为"Host 仅在子进程启动时保留ELECTRON_RUN_AS_NODE…bootstrap 在求值模型代码前删除该选择变量",其实现里也有key.toUpperCase() !== "ELECTRON_RUN_AS_NODE"的过滤。open-in-app 这条路径只是漏了同样的清理。可选的加固建议
dsh-host-open-in-app目前把"启动器 1 秒内非 0 退出"直接当作启动失败。对 Electron 类应用,"主进程立刻退出但已把请求交给既有实例"是正常行为(例如--reuse-window场景),纯退出码判定容易误报。可考虑:对声明的 GUI 适配器放宽为"进程表/窗口出现"判定,或在错误信息中带上子进程的实际退出码与 stderr 尾部,便于定位(当前只显示笼统的「请重试」)。临时规避(用户侧)
dsh --profile desktop),在自己的干净终端里启动,该变量不存在,open-in-app 正常。All reactions