Replies: 1 comment
这条泄漏结构上成立,而且我核到了源头那一行1. 源头与文档// apps/desktop-host/src/index.ts:36
ELECTRON_RUN_AS_NODE: '1',而
⇒ 也就是说:宿主进程自己就带着这个变量(这是它在 Electron 里当纯 Node 跑的必要条件)。于是任何用"继承父进程环境"的方式拉起来的 Electron 应用,都会以 Node 模式启动——表现正是你写的"无窗口、无报错"。你的因果链成立。 我也核到了你点的那个函数确实存在: export const launchDetachedApp: OpenInAppLauncher = (command, args, options) => …
// 并在 :148 被选用:launch: internals.launch ?? launchDetachedApp2. 为什么"非 Electron 路径正常"这条对照很有力你观察到的不对称( 3. 修法建议(两条,建议都要)
第 2 条尤其值得写进报告:它解释了为什么这不会只错一次。 4. 一个同族线索(对你有利)
5. 版本提醒你在 一条边界我确认的是变量注入点、文档化的设计意图、以及 |
Uh oh!
There was an error while loading. Please reload this page.
现象
官方桌面客户端
@deepseek-ai/dsh-desktop@0.1.7-rc.2(bundled runtime@deepseek-ai/dsh-desktop-runtime@0.1.7-rc.2,Windows 11)里,任何"启动 Electron 系外部应用"的入口都静默失效:@deepseek-ai/dsh-host-open-in-app+@deepseek-ai/dsh-client-ui-open-in-app)在桌面版里点 VS Code 项同理(launchDetachedApp用scrubbedParentEnv(),而它不清这个变量);explorer.exe交系统外壳的"默认应用打开 / 显示文件位置")不受影响。根因链
桌面壳的 Electron 主进程在拉起 dsh 宿主时注入模式开关(
app.asar/lib/main.js):(
@deepseek-ai/dsh-desktop-host也把同一变量写进它给 packageManager 的env。)宿主本身确实是"Electron 二进制以 Node 模式"运行,所以这个变量必须在启动时存在 —— 但它随后留在了宿主的process.env里。于是宿主进程 spawn 出去的任何子进程都继承它,例如插件的
spawn(cmd, args, { detached: true, stdio: 'ignore' })(不覆盖env)→ 传给了 Windows 打开器rundll32.exe→ 再传给Code.exe。VS Code 自己也是 Electron 应用:它看到
ELECTRON_RUN_AS_NODE=1就退化为纯 Node,把文件路径/URL 当脚本执行 →SyntaxError→ 立即退出。用户侧看到的就是"点了没反应"。实测证据(同机、同命令,只差父进程是否带该变量)
rundll32.exe url.dll,FileProtocolHandler vscode://file/D:/dsh/AGENTS.mdCode.exe进程数 0Code.exe11 个进程,窗口标题AGENTS.md - Visual Studio CodeCode.exe D:\dsh\AGENTS.mdD:\dsh\AGENTS.md:1 SyntaxError … at node:electron/js2c/node_init … Node.js v24.20.0另外,
packages/subprocess/subprocess/src/index.ts:44的SENSITIVE_ENV_PATTERN = /KEY|PASSWORD|SECRET|TOKEN/i不会命中ELECTRON_RUN_AS_NODE→scrubbedParentEnv()原样保留,所以走该清理的官方 spawn 同样中招。建议(两处,任一处都能止血,建议都做)
desktopNodeEnvironment只在"启动宿主这一次"的 spawn 上设置该变量,宿主进程启动后把它从process.env中删除(或桌面壳在交给插件的 env 里剔除)。原则:Electron 的进程级模式开关绝不该出现在传递给第三方插件/外部应用的继承环境里。scrubbedParentEnv():把ELECTRON_RUN_AS_NODE(以及同类 Electron 模式开关,如ELECTRON_NO_ATTACH_CONSOLE、ELECTRON_FORCE_WINDOW_MENU_BAR)加入固有丢弃名单 —— 它属于"宿主实现细节",与DSH_*同类,不属于要传给子进程的用户环境。关联
launchExternal继承 env 亦应清洗)All reactions