Overview
@luoshuizhiwei/dsh-desktop-restart
README / EN
Package documentation
Registry summary
dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.
Read the full README on GitHubLIMITATIONS
Known limitations
- **只适用于 Electron 桌面版。** 在 `dsh web` 上状态路由会如实报 `desktop: false`,重启按钮禁用;这是设计如此,不是故障。 - **端口动态分配。** helper 将回环监听与本次新主进程及其 host 后代的进程身份关联;不把旧实例的监听当成新实例。无法确认时如实报告就绪未知。 - **显式立即重启仍可能打断任务。** 额外确认后会跳过任务等待;正在写的文件可能停在半路,插件不做回滚。安装中的硬拒绝仍有效。 - **插件安装守卫靠 pid 判断「还活着」。** 如果记录里的进程其实已经退出、而系统恰好把同一个 pid 复用给了别的进程,会被误判成「还在装」。概率很低:`run.json` 只存在于操作进行中或崩溃后的残留,而应用的插件操作会自己清掉残留记录;真遇上时那个进程一结束判断即恢复。应用自己也是这么判的。 - **强杀主进程。** 主进程自身的清理(窗口状态、托盘)不会执行。真正要紧的会话数据在 host 进程里,它会优雅关闭。这是「一键」必须付的代价 —— 主进程没暴露任何可请求的重启通道。 - **兜底清理最后会结束 host,那一瞬间它的会话日志可能不完整。** 只在一种情况下发生:主进程已经结束、端口等了 30 秒还没释放 —— 那说明 host 卡住了,不结束它新实例就绑不上端口。它不会被混在「残留进程」里顺手杀掉,日志里会单独写明。正常情况下端口 1 秒内就释放,这条路径走不到。 - **身份查询失败会停止重启。** 除宿主给出的父 PID 外,还核对可执行文件、父子关系和创建身份;不再因为进程表读不出就直接杀进程。企业策略若禁止进程查询,使用人工退出重开。 - **启动参数必须能够可靠恢复。** 参数不确定则以 `args-uncertain` 拒绝,不会悄悄丢弃参数启动。工作目录固定为可执行文件所在目录。 - **应用自动更新途中重启没有守卫。** 更新流程没有留下可读的状态凭据,这一条只能靠别在更新时点重启。 - **DSH 升级后可能失效。** 实现依赖当前的进程模型与 `ELECTRON_RUN_AS_NODE` 约定;守卫依赖 `agents` / `jobs` 服务与 `.plugin-manager/run.json`,取不到时会静默跳过守卫(而不是拦住重启)。若上游改变 host 的启动方式或给主进程加上重启 IPC,应改用官方通道。 - **只在 Windows 上验证过。** - **第三方皮肤(如 `dsh-claude-style`)会把 `aria-label` 当作可见行标题。** 它接管侧栏底部时按 `aria-label || textContent` 给每一行起名。所以本插件的 `aria-label` 只放**四个字以内的状态词**(「重启应用」「已排程」「重启中」「重试」…),详细提示(「有任务在跑(2 项正在生成或运行工具);点两次仍可重启」)走 `aria-describedby` 指向的视觉隐藏文本 —— 读屏照样念得到,但不会被画成按钮文字。(2026-10-20 修过一次:那句提示曾直接拼进 `aria-label`,在收起态的左下角被皮肤插件渲染成了很长的行标题。)
