Skip to content

Releases

@zhengjunyao/dsh-restart v0.2.0

Choose a tag to compare

@zhengjy01 zhengjy01 released this 19 Sep 10:29

@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 新地址引导

Choose a tag to compare

@zhengjy01 zhengjy01 released this 19 Sep 01:11

新增 (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

Choose a tag to compare

@zhengjy01 zhengjy01 released this 13 Sep 13:35

修复

  • 系统提示与发布脚本认 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

Choose a tag to compare

@zhengjy01 zhengjy01 released this 12 Sep 04:02

就绪判定修复(@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

Choose a tag to compare

@zhengjy01 zhengjy01 released this 12 Sep 03:21

@zhengjunyao/dsh-restart 0.1.0