Repository navigation
Releases
Releases · zhengjy01/dsh-restart
@zhengjunyao/dsh-restart v0.2.0
@zhengjunyao/dsh-restart v0.2.0
新增 (Added)
- 永久入口
GET /api/dsh-restart/goto(可收藏、永不过期):一次 303 到本进程当前
token 的相对地址(Location: /?token=…),origin 由浏览器自己补——所以从
localhost:3080打开的标签页不会被拽到127.0.0.1:3080(cookie 按 authority 分区,
拽过去等于白换)。与/auth同为 loopback-only、故意免 cookie。这是「复制地址开新标签页」
的替代品:收藏它,任何时候(cookie 没了、停在纯文本 401 页、重启期间手刷过头)点一下就能进站。
遮罩与设置卡片的 401 卡片主按钮/复制按钮已改为这条永久地址,原「本次 token 地址」降为兜底。 - 等待文案明确「请勿手动刷新」:重启窗口内自己按刷新会落进浏览器的
ERR_CONNECTION_REFUSED(那一刻页面已被浏览器错误页替换,插件救不了),所以等待提示改为
「端口会先空约 3–5 秒,请勿手动刷新:本页会自己回来」。(实测依据:18:03 那次重启 t+1.5s 新进程已在跑、t+4s 插件树已在处理请求——页面只要插件路由一应答就立刻自己刷新,不等助手那个含 4s 确认窗的ready after 8.4s判定;原先写 8–10 秒是把助手的判定账本当成了页面回来的时间。) - 401 原地换回 cookie(不再要求复制地址):旧标签页检出 401 后,不再只是给出链接,
而是用本进程当前 launch token 在原地发一次交换请求(redirect: 'manual',303 的
Set-Cookie会被浏览器保存,但页面不跳转),随后重新校验HEAD /:确认已认证才让
页面自己刷新回应用,否则静默回落到原有的「用新 token 地址打开」链接。
这意味着一次重启结束时,页面是自己回来的——用户不需要复制地址开新标签页,
之后的普通刷新也照常可用。cookie 完全无法保存的环境不会更差:交换不会把页面带进
宿主的纯文本 401 页。
修复 (Fixed)
- token 地址改为跟随当前标签页的 authority:旧实现对
localhost:3080打开的标签页
也返回127.0.0.1:3080的 token 地址,而 cookie 是按 authority 分区的、换过去既丢
站点状态又常常换不回登录。现在只从宿主取 token,origin 用标签页自己的——换回的 cookie
正好落在用户正在用的那个 authority 上,同一标签页刷新即可长期有效。 - 原地换回每个页面加载只尝试一次(
authExchangeTried),认证成功后复位:既不会在
cookie 根本无法保存时反复空转,也不会让「重启 → 换回」只能用一次。
安装
dsh plugin --profile web add @zhengjunyao/dsh-restart@0.2.0本版要点
- 401 自愈:旧标签页检出 401 后不再只给链接,而是用本进程 token 在原地换回 cookie(
redirect:'manual'),重校验确认已认证才让页面自己刷新——重启结束页面自己回来。 - 永久入口
GET /api/dsh-restart/goto:303 到当前 token 的相对地址,可收藏、不会过期(cookie 按 authority 分区,相对地址保证localhost标签页不被拽到127.0.0.1)。 - 刷新守卫:重启窗口内挂
beforeunload(phase 门控),误刷变成一次可取消的确认,而不是把页面连同插件一起刷死。
v0.1.3 — 旧标签页自愈 + 401 新地址引导
新增 (Added)
- 旧标签页自愈:重启失败态只活在页面(内存 + sessionStorage),宿主恢复后不再需要
用户手动刷新——失败态会持续探测(watchdog)、标签页重新获得焦点/可见时立刻复查
(visibilitychange/focus),并在挂载时先问宿主:宿主已回答就丢掉持久化的失败记录,
绝不复活一段已经过期的「启动失败」文案。请求重启这一步本身失败(例如宿主正好在重启窗口)
也会进入探测循环,而不是停在下发失败上。 - 401 新地址引导:每次
dsh web启动都会换一个 launch token,旧标签页 URL 里的旧
token 在 cookie 失效时被 401 拒。客户端现在用HEAD /检出 401,并通过新增的
GET /api/dsh-restart/auth(loopback-only、故意免 cookie)取回本进程当前的
token 地址,在遮罩与面板给出可点击的「用新 token 地址打开」+「复制新地址」;
自动刷新前会先做这一步预检,401 时不再导航进宿主的纯文本 401 页。 - 宿主侧
RouteContext新增可选的authUrl()提供者:由connection服务
(authenticatedUrl)lazily 产出当前 token 地址;无该服务的 headless profile 回落纯 origin。
修复 (Fixed)
probeOnce命中就绪后先判认证再决定是否location.reload(),避免旧 token 页面刷新后
落进 401 纯文本页。- 失败态不再停止探测:
retryBoot重试失败、startRestart下发失败都会重新排队探测,
失败探测间隔固定为 3s。
测试 (Tests)
- 新增
tests/selfheal.mjs:以桩替换sessionStorage/location/fetch,驱动
真实构建产物lib/client.js,覆盖「构造失败态 → 宿主恢复 → 页面自愈」与
「命中 401 → 给出当前 token 地址、且不刷新进 401 页」。 tests/routes.mjs补/auth路由(免 cookie / loopback / 方法守卫、token 每次请求实时
读取而非缓存)与「connection服务 →/auth」装配断言。测试升至 208 项断言(6 套件)。
兼容性 (Compatibility)
- DSH:
>=0.1.5-rc.1 - Node:
^22.19.0 || >=24.0.0 - DSH peer:^0.1.0-rc.6 || ^0.1.1-rc.1 || ^0.1.2-alpha.1 || ^0.1.5-rc.1
@zhengjunyao/dsh-restart 0.1.2 — 路径说明与发布凭据认 DSH_HOME
修复
- 系统提示与发布脚本认
DSH_HOME:config.ts早已按「DSH_RESTART_HOME→DSH_HOME→~/.dsh」解析配置/日志目录,但给模型的路径说明只写死~/.dsh,可移植性静态体检因此仍报「写.dsh但不认DSH_HOME」。现在说明改为显式以DSH_HOME优先,release.mjs读 npm token 时也认DSH_HOME(与 release-kit 模板一致)。
验证
npm test(smoke / helper / routes / handoff / launchd)全部通过;DSH_HOME单测在 smoke 中已有断言npm run verify(隔离DSH_HOME+ tarball 安装)✅ 通过,静态体检 warn 消失
@zhengjunyao/dsh-restart 0.1.1
就绪判定修复(@ZhengJunyao 之外无变更)。
Fixed
- 就绪判定不再只凭端口应答:
dsh web先绑端口、后加载插件树,所以「端口应答」不等于「宿主起来了」。修复前一次重启可能被报成ready after 4.0s,而新宿主几秒后死于plugin tree failed to load … timed out waiting for the writer lock——假成功正是这个助手要消灭的东西。 - 现在判定就绪需三条同时成立(端口应答 + 进程存活 + 启动输出无 boot 致命行),并分两个窗口:
readyConfirmMs(默认 4s,报就绪前先守住)与bootWatchMs(默认 30s,报了就绪后继续观察,把「起来又死」改判为失败并撤回readyAt)。 - 致命行只认 boot 阶段必死的输出(
plugin tree failed to load),不用宽泛报错正则——健康宿主启动时本来就会打印session/list failed之类的报错形状噪音。
完整变更见 CHANGELOG.md。
@zhengjunyao/dsh-restart 0.1.0
@zhengjunyao/dsh-restart 0.1.0