# 更新说明 > 每版按主题分块:**emoji 小标题 + 要点列表**。这一版没有的版块**直接省略**,不写「无」、不硬凑。 > > **通用升级方式**:spec 要带**准确版本号**(刚发布的版本 24 小时内会被 DSH 的供应链策略跳过, > 按名字装会停在旧版);装完**重启一次 DSH** 才生效。 > > 0.1.0 到 0.3.0 只在本地使用,没有发布到 npm;npm 上最早的版本是 **0.3.1**。 --- ## v0.3.16 — 自检看得见、还快了 3 倍 ⚡ ⚡ **自检从 29 秒压到 9 秒** - 五条派发探针**默认不再实跑**:每条都要真的起一个脚本宿主进程,杀毒软件会拦、会弹授权窗口, 在被拦的机器上这一步能磨二十多秒 —— 恰好是「自检很慢」的主因 - 端口枚举改成**先查一次进程表**:原来每个连接查一次 WMI,几十个连接就是十秒 - 路由探测不再写死端口(43120 那种空端口,探两次白等四秒) 🔍 **默认模式改成「读策略」** - 新增「安全环境」一节:Windows Script Host 策略、PowerShell 生效执行策略、 已安装的安全软件、Defender 受控文件夹访问 / ASR、AppLocker - 这些查询**只读、在进程内完成、不创建任何进程**,所以不会触发杀软授权窗口 - 想拿实测证据时:`tools\diagnose.cmd -DeepProbe` 再跑一次 📊 **进度看得见** - 自检脚本每走一步写一行进度,页面读出来画成**进度条**:第几步 / 共几步 / 这一步在干什么 - 跑完自动撤掉遮罩并给出报告完整路径 📌 **背景** - 主人反馈「点完自检一片安静,不知道它动没动」,而且怀疑是杀软在弹授权 --- ## v0.3.15 — 修掉「能关闭但拉不起来」🩹 🩹 **就绪握手** - **助手先报「我准备好了」**:助手校验完 exe 路径与凭据之后才写 `helper ready`,宿主**必须等到这一行**才敢关 DSH。 以前只要助手往日志写一行就算通过 ✗ —— 于是助手明明报了 ABORT,宿主照样把 DSH 关掉, 用户看到的就是「DSH 消失了、没回来」 - **助手报 ABORT 时绝不关 DSH**:三条派发通道都不就绪就直接放弃这次重启, 弹窗里原样带上助手给出的原因 🌏 **中文路径** - 借 Explorer 派发时用的包装脚本改成 **UTF-16LE + BOM**。原来按 ASCII 写盘, 装在 `C:\Users\-\新建文件夹\` 这类路径下会被毁成乱码 (实测 `新建文件夹` → `苞圅9`,与用户报告里那行一字不差),助手因此拒绝动手 📋 **报告可读性** - 自检报告读 `restart.log` 时改用 UTF-8:以前按默认编码读,宿主写的中文路径在报告里显示成乱码, 看起来像插件本身坏了 📌 **背景** - 一台**纯净无插件**的机器上,WMI 创建进程被安全策略挡住;插件退到 Explorer 通道后, 又因为上面的编码问题没能把 DSH 拉起来。这份报告是自检系统第一次实战,四条证据一次到手 🔒 **编码合同(防回归)** - 新增**编码合同测试**:非 ASCII 的 `.ps1` 必须带 UTF-8 BOM、`.vbs`/`.cmd` 必须纯 ASCII,改坏了直接变红 - 新增**中文路径金丝雀**:用产品自己的写法生成包装脚本,真的交给 wscript 跑一遍, 确认 `新建文件夹` 这类路径原样送达(当年就是它变成 `苞圅9`,害得 DSH 关闭后没起来) --- ## v0.3.14 — 内置自检系统 + 重启提速 ⚡ 🔍 **自检系统** - 按钮**右键菜单**:「自检并生成诊断报告」/「复制诊断信息」/「查看版本」 - **出错自动自检**:重启请求被拒时、点了变灰的按钮时、宿主发现「上一次启动是失败的」时 - **助手也会自检**:DSH 被关掉之后只有助手还活着 —— 它启动新实例失败、或者新实例起来 12 秒内又死了,就自动生成报告并弹窗 - **报告位置会明确报出来**:脚本把路径写进 last-report.txt,页面显示完整路径,助手弹窗里也带着同一个路径 - 自检脚本 `tools/diagnose.ps1` 加双击入口 `tools/diagnose.cmd`,**全程只读**,报告写到桌面并用记事本打开 - 报告里有什么:结论速览、**派发能力矩阵**(五条通道各自报「进程建了没 / 还活着吗 / 脚本产出了没」)、环境、全部进程命令行、插件文件与哈希、**市场锁是否卡死**、上次启动停在哪个阶段、GPU 崩溃次数、端口、路由、完整 restart.log ⚡ **重启提速:56 秒 → 14 秒左右** - 修掉 `taskkill /PID undefined`:那条「优雅关闭」从来没生效过,每次重启都在白等助手兜底 - 等待循环里的存活判断从「同步起一个 PowerShell」换成 `process.kill(pid, 0)`(前者把等 3 秒拖成了 10~45 秒) - 优雅关闭只给 1 秒:DSH 有托盘,WM_CLOSE 只会把它收进托盘 - 强杀之前的身份核对与等待**并行**,不再串在关键路径上 - 外壳探测移出启动路径,改成挂载后空闲预热 - 助手兜底等待从 25 秒收紧到 10 秒 - 剩下约 7 秒是 DSH 自己启动,插件动不了 🛡️ **防止误杀** - 宿主与助手在强杀之前都会核对**exe 路径 + 创建时间**,而不只看 PID —— Windows 会复用 PID 值 🧊 **界面与提示** - 重启冷却 **5 秒**;冷却被拒不再自动自检,弹窗语气变成「稍等一下再试」 - 被拒之后立刻撤掉遮罩,不再留着「正在热重启 DSH…」的画面 - 同一份诊断报告**只提示一次**,手工跑的报告不推给用户 📦 **安装 / 升级** - spec 要带**准确版本号**(刚发布的版本 24 小时内会被 DSH 的供应链策略跳过),装完**重启一次 DSH** 才生效 --- ## v0.3.11 — 不再把用户的 DSH 搞崩 🩹 🩹 **事故修复** - **优雅关闭优先**:先 `taskkill` 不带 `/F`(等于发 WM_CLOSE),让 DSH 正常收尾、写完状态、释放文件锁; 最多等 12 秒,还在才强杀 - **绝不加 `/T`**:整棵树一起收会连带杀掉正在写状态的子进程,那正是留下 `state.json.lock` 的原因 - **凭据通道**:宿主派发助手前写下 `restart-ticket.json`,放弃重启时删掉它; 助手动手前必须确认凭据还在且新鲜,否则只写一行日志、什么都不碰 - 独立工具 `tools\restart-dsh.vbs` 同步改造:优雅关闭优先、带凭据、失败即撤销 📌 **背景** - 之前反复用 `taskkill /F` 硬杀,打断了 DSH 写 `desktop-market/state.json`,留下 `state.json.lock`; 那把锁记的是持有者 PID,PID 一旦被别的进程复用就永远不会自己释放 —— DSH 之后每次启动都等锁超时, 直接进恢复模式。已经卡住的锁只能人工删除。 --- ## v0.3.10 — 独立工具与备用派发 🧰 🧰 **独立重启工具** - 不再写死外壳 exe 名(原来找 `DeepSeek Harness.exe`,别的构建叫 `DSH Desktop.exe` 时它只会说「没在运行」) - 不再「先杀再等」:等助手的 `[relaunch]` 日志,等不到就换 PowerShell 助手,两条都不吭声就**只提示、不动手** - 端口不再写死 19387,改为从外壳的子进程占用的监听端口里探出来 🚚 **备用派发** - 新增一条**不经过 WMI** 的路:借已经跑着的 Explorer 打开包装脚本,脚本运行在 Explorer 的进程树下 - 派发时把**实际发送的命令行原文**写进日志,并记下最终生效的派发方式 - 确认助手活着不再只认日志:派发回来的 PID 还活着同样算数 🩹 **其他修复** - 修掉按 UTF-16 下标切字节的 bug:日志含中文时会切到旧内容,把没启动的助手误判成已启动 - 助手确认「新实例起来了」时不再把 Electron 的渲染/GPU 子进程算进去 - 新增安全自检开关:`restart-dsh.vbs --check` 与 `restart-dsh.ps1 -Check` 只编译不动手 --- ## v0.3.9 — 助手确认活着之前,绝不杀外壳 🛡️ 🛡️ **安全闸** - 派发助手后先等它往日志写第一行 `[relaunch]`,等不到就换 PowerShell 助手再试 - 两条路都不吭声时**直接放弃重启**并返回可读的错误,而不是先把 DSH 关掉 📌 **背景** - 用户日志里五次重启尝试**没有一行 `[relaunch]`**:助手在他机器上根本没跑起来, 而 `wscript.exe //B` 是静默模式,外壳照样被杀掉,只留下一个消失的 DSH。 --- ## v0.3.8 — 「关掉了但没起来」的防线 🪤 🪤 **防线** - 宿主改成 `taskkill /F /T`,连整棵进程树一起收(后来在 0.3.11 里撤回,理由见那一版) - 助手:清掉外壳残留的子进程;端口若仍被占用,只结束**属于自己这套栈**的进程;启动后**确认新实例真的起来了** - 起不来时依次改走 ShellExecute、`cmd start` 再试;全部失败就弹窗告诉用户手动打开 DSH - PowerShell 兜底助手同步补上这几层 --- ## v0.3.7 — 分清「已安装」与「运行中」🔀 🔀 **版本可见性** - `status.json` 同时报两个版本:`version` 是磁盘上装的那份,`runningVersion` 是此刻真正在跑的宿主模块 - 两者不一致时,按钮提示和弹窗直接写明「已安装 vX,运行中的宿主还是 vY:重启一次 DSH 才会生效」 📌 **背景** - 有用户装好新版本但没重启 DSH,宿主仍在跑旧模块,于是又看到旧版本才会出现的原因码。 --- ## v0.3.6 — 外壳判定不再依赖某份构建的启动标记 🎯 🎯 **判定** - 不再要求宿主 argv 里有字面量 `dsh-desktop-host`(那只是某一份构建的写法) - 改为看父进程本身:不是 Electron 的 `--type=` 子进程、不是终端或解释器,且 exe 名字像 DSH 应用 - 判定规则抽成纯函数并加进单测:六种真实构建写法各一条用例 --- ## v0.3.5 — 中文路径下也能重启 🈶 🈶 **编码修复** - PowerShell 查询父进程时**强制 UTF-8 输出**,并让结果走 base64 往返 - 路径读坏时兜底用宿主自己的 exe:两边文件名相同就认定是同一个程序 - 单测补一条:带中文的路径必须能原样往返 📌 **背景** - 有用户的 DSH 装在 `D:\新建文件夹\` 下,PowerShell 用控制台代码页写 stdout, 路径到 Node 手里已经变成乱码,`existsSync` 判定失败,报 `shell-exe-missing`。 --- ## v0.3.4 — 桌面壳识别与诊断 🧭 🧭 **识别** - 桌面壳识别不再要求父进程 exe 等于宿主自己跑的那个可执行文件(打包方式不同时两者并不相同) - 杀掉外壳之前先确认拿得到外壳 exe,拿不到就报错放弃,避免出现「关掉之后起不来」 🔍 **诊断** - `status.json` 增加 `detect` 段:宿主 exe、父进程 pid/名字/exe/命令行 - 「无法热重启」弹窗显示原因代码和父进程信息,并多一个「复制诊断信息」按钮 --- ## v0.3.3 — 文档精简 📝 📝 **文档** - README 采用仓库上手动精简后的版本 --- ## v0.3.2 — 安装说明与发布元数据 📦 📦 **发布** - 安装说明改为 npm 优先;补齐 `repository`、`homepage`、`bugs`、`publishConfig` - 移除 README 里引用个人截图的排查记录 --- ## v0.3.1 — 首个 npm 版本 🎉 🎉 **首个公开发布** - 发布到 npm(`dsh-hot-restart`) 🌙 **深色模式修复** - 按钮改用深蓝填充:原来用的 brand 主题变量在深色主题下是浅色,导致白底白字看不见 - 确认框的主按钮同步修复 📝 **文档** - README 补齐安装、用法、原理、路由、卸载 --- ## v0.3.0 — 不再出现黑窗口 🪟 🪟 **根因修复** - 重启助手改成 `wscript` 加 VBS:wscript 是 GUI 子系统程序,完全不创建控制台 - 助手经 WMI 派发,脱离 DSH 的 Windows Job,能活到外壳退出之后 - 新实例也由 WMI 拉起,不继承任何控制台 🧰 **工具** - 新增 `tools/restart-dsh.vbs`,双击即静默重启 ✅ **测试** - 单测补两条断言:助手必须零窗口、VBS 必须纯 ASCII 📌 **背景** - 关掉那个黑窗口 DSH 就跟着死:PowerShell 是控制台程序,Win11 会把控制台交给 Windows Terminal 托管, 即便 `-WindowStyle Hidden` 也会弹出可见窗口,被随后启动的 DSH 继承。 --- ## v0.2.0 — 界面简化 🎛️ 🎛️ **一个按钮** - 去掉右键菜单、拖动、状态轮询 - 改成主区域左下角一个固定按钮,点一下弹确认框,确认后重启 --- ## v0.1.2 · v0.1.1 — 小修 🔧 🔧 **修复** - 版本号改为读磁盘上的 `package.json`,重装后日志不会报旧版本 - 状态栏菜单的开关交互修正 - 修正安装与卸载说明 --- ## v0.1.0 — 第一个版本 🌱 🌱 **初始版本** - 页面底部加一条状态栏,右键出菜单:热重启 DSH / 仅重载页面 - 宿主半区三条路由:`status.json`、`restart`、`ui.js`,带回环与同源校验 - 重启助手用 PowerShell,经 WMI 派发