dsh-shutdown-guard 1.6.0 → 1.6.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,173 +1,285 @@
1
- # Changelog
2
-
3
- ## v1.6.0 — 2026-11-06
4
-
5
- - **悬浮窗口**:卡片上多了一个入口,点开是真正的第二个窗口,可以拖到副屏一直盯着倒计时,切到别的会话也看得见。窗口里就是侧边栏卡片本身——同一套状态机、同一套配色、同一枚主按钮,左上角指示点随 `blocked / off / fired / countdown / hold / armed` 变色并呼吸,最近事件留在卡片下方。外观(A / B / C)、主题、语言三项由宿主持有(`POST /ui` 写进 `data/ui.json`,`/state` 的 `ui` 字段读出),在设置里一改,窗口下一轮轮询就重画,不用关重开。之所以不继续只靠 `localStorage`:桌面端的侧边栏与 `window.open` 出来的窗口可能落在不同的存储分区,早先的表现就是「语言能跟随、颜色与外观不跟随」。
6
- - **悬浮窗简洁模式(默认开启)**:只留卡片本身,隐藏顶部品牌行、状态徽章、统计行、最近事件和底部提示;页面背景透明、卡片居中,看起来就是一张悬在桌面上的卡片。开关放在设置页的「外观」组里,窗口内刻意不放切换控件——一个只剩一张卡片的窗口,不该再叠一个开关上去。
7
- - **状态变化发系统通知**:四类分别可开关——进入倒计时、即将关机、首次阻断、阻断恢复。正文只写状态与关键数字(剩余秒数、被哪道闸挡住、重试还有几秒),不含会话标题或路径。手动点「武装 / 解除 / 取消」引起的任何变化一律不提醒(2 秒静默窗口);同一状态按「类型 + 状态 + 阻断原因」做指纹去重,不会连弹。点通知会聚焦已有的悬浮窗,没有则新开一个。
8
- - **会话数改成真数,含子 Agent**:以前只数顶层会话,多智能体协作里后台跑着的子 Agent 完全不可见——父会话闲着的时候卡片甚至显示 0 个会话,看着像什么都没在跑。现在卡片上的会话数是「主会话 + 子 Agent」总数,HUD 与终端里的 agent 数是「正在运行的 agent 数」,两者都取宿主的真数;「N 个会话」那句话同样按总数说。设置页的「状态」组里没有这一行(分组时已移除),会话数只在卡片与终端视图显示。
9
- - **雷达点数改对了,卡片与悬浮窗现在都算到子 agent**:以前只数主会话,团队里派生的子 agent 不画点,看着像只有一两个在跑。现在两处同一口径,都按「运行中的 agent 总数(含子 agent)」算:卡片的外观 B 按这个数画点;悬浮窗的 B 形态圆点、C 形态的 agent 数,以及 A 形态的「N 个会话」也一并换成同源,旁边的统计小字跟着变。两处都最多画 12 个,超出的在右上角显示 `+N`,并补了三语读屏描述「N 个 agent,其中 M 个在运行」——此前它只是一张没有说明的图。**这是一处用户可见的变化**:团队场景(1 个主会话 + 2 个子 agent)下,悬浮窗 B 的圆点会从 1 个变成 3 个。
10
- - **配置升级到 v2(`data/config.json`)**:通知的四类开关与 AFK 自动回答从全局搬进了当前配置——它们描述的是「这台机器上怎么守夜」,跟着配置走才合理,切配置时会一起变。宿主新增 `createProfile` / `renameProfile` / `deleteProfile` / `setDefault` / `updateProfile` 五条命令,写入只认白名单字段,未知键忽略(新客户端不会把旧宿主写坏)。老文件不用手动改:读取时兼容 1.5.1 的全局 `afkAutoAnswer` 和 `ui.json` 里的旧 `notify`,下次保存自动写成 `version: 2`。
11
- - ⚠️ **默认配置改为强锁定**:以前改默认配置的倒计时(60 秒)、边距(5 秒)、两个判定开关和 AFK,会被静默夹紧回原值——用户以为改成功了。现在直接返回 400,并说明是哪个字段不能改。默认配置是安全基线,要自定义请新建一个配置。通知的四类开关不在此列,默认配置下仍可逐项改。
12
- - **设置页改成四个标签页**:外观 / 守夜(自定义配置开关 + 配置 + 守夜行为)/ 通知 / 状态,原来那根长列表按主题拆开,找一项不用再从头滚到底。标签是真 `tablist`:左右方向键与 Home / End 可切;四个面板始终保持挂载(非活动的只是 `hidden`),所以填了一半的配置名、滚到一半的位置,切个标签回来都还在。原先各组的内容一条没少(判定与关机那一组并进了守夜行为),行式骨架也保留:标题与说明在左、控件在右,组间 0.5px 分隔线,组标题各带一枚小图标;说明文字能压一行就压一行,只有 AFK 那条保留完整说明——它得讲清我们会替你回什么、不会替你选什么。
13
- - **卡片样式改成带缩略图的三张卡片**:以前是三个字母药丸(A / B / C),光看字母猜不出长什么样。现在是三张卡片,各配一张 400×256 的高清卡面缩略图——图里就带着「待命 / Armed / Взведено」这些字与卡面底色,下面标「极简 / 雷达 / 终端」。缩略图共 18 张:A / B / C × 中 / 英 / 俄 × 浅 / 深,因为图里有文字,不能靠反色复用。选哪张不看主题名,而是量设置面板实际背景色的亮度(`L > 0.5` 用浅色图;透明白底会往上找第一个不透明祖先),所以换了宿主皮肤、改了 Claude Style 的配色也能选对;切换 200ms 节流,只换 `img.src`,不重建 DOM、不丢选中态。
14
- - **那三张卡片缩略图换成了高清版**:以前放大看发虚,圆点和文字边缘都糊;现在按两倍尺寸出图,设置页里看得清楚,浅色深色下都一样。
15
- - **配置管理界面**:设置页里就能新建(从当前配置复制一份)、重命名、删除、设为默认,不用再改 JSON。默认配置那行只显示倒计时秒数,没有改名与删除按钮——它是安全基线,宿主侧同样会拒绝。删除要按两次:第一次按钮变成「确认删除」(2 秒内再点才生效,超时自动复原);删掉的如果正是当前配置,会自动回落到默认配置。名称留空或超过 24 个字符会在行内提示,失败原因直接显示宿主返回的那句话(比如「自定义配置已关闭」)。宿主与界面不再各自判断「这份配置算不算用过」:列表一律按宿主返回的内容渲染,刚新建的配置哪怕一个开关都没动,也会立刻出现在列表里,不会出现「建了却看不见」。
16
- - **「配置」搬进了「守夜」标签页,「自定义配置」开关提到页面最上面**:开关单独占一行、放在页首,配置块紧跟在它下方,只有开关打开时才渲染(关着时整块不进页面,不是灰掉占位)。「判定与关机」那一组标题已取消,原来那四条判定闸并进了「守夜行为」,排在 AFK 自动回答之前——先定规矩,再看守夜时怎么表现,顺序跟思考顺序一致。顺带把「外观」页里与标签名重复的那条组标题去掉了,页签已经写着「外观」,里面不必再重复一遍。
17
- - **新装不再预生成八个空配置**:以前一进设置页就摆着八个空槽,看着像必须一个个填满;现在只有「默认配置」一行,需要第二份配置时点「+新建」才创建。空槽不再是初始化的一部分,而是按需生成。
18
- - **关掉「自定义配置」再打开,会回到上次用的那份配置**:不用重新点一次;如果那份配置已经被删,就停在「默认配置」,不会指向一个不存在的名字。升级时也会清理旧数据里从没动过的空槽——只有「名字没改过、里面任何一个开关也没动过」的才会消失;**改过名或动过任一开关(倒计时、判定条件、通知、AFK 都算)的配置都会保留**,不会丢数据。
19
- - **旧的「默认 | 1 | 2 | 3」槽位快捷条已移除**:配置切换统一收进上面那个列表,「设为默认」一步到位——点它就直接切到该配置,不再先选槽位再确认。少一处入口,也少一种「刚才切的是哪个」的困惑。
20
- - **开关点下去立刻生效**:点击时本地先置位并重绘,请求在背后发;失败时在那一行显示内联红字「保存失败,已还原」并回滚到宿主值,不静默吞掉。以前要等下一轮 `/state` 轮询回来才变,体感像卡住。
21
- - **控件手感**:分段选择(卡片样式 / 主题 / 语言 / 倒计时)改成滑动切换——高亮块从旧位置滑到新位置,而不是瞬间跳过去;开关拨动带 350ms 回弹动画。纯视觉改动,不改变任何取值逻辑。
22
- - **设置页头部加了 GitHub 与 npm 入口**:标题右侧两枚**单色**图标,分别打开仓库页与 npm 包页,都在新标签打开,悬停才变亮,读屏与悬停各有文字说明;npm 那枚按它自己的长条比例单独放大,不跟方形图标挤成一样大。**有意不显示版本号**——写死一个版本号迟早会和 `package.json` 对不上,要看版本有徽章与 CHANGELOG。
23
- - **`Claude Style` 主题跟随 Claude Style 的实时配色**:当 Claude Style 用自己那套配色时(它的 `data-dsh-claude-palette` 不是 `host`),卡片实时跟随它的表面、文字、次要文字、分隔线、强调色、危险色与轨道;在 Claude Style 里改配色或切明暗,卡片不用刷新就跟着变,也不用重装插件。
24
- - **没装 Claude Style 插件也能选它**:主题选项从现在起叫 `Claude Style`(三语同名,俄文也保留英文原名)。检测不到 dsh-claude-style 时不会把选项藏起来,而是用一套内置的近似配色(陶土橙),并在主题行下面用一行灰字说明;装上插件后这一行消失,自动改跟插件的实时配色。三档别混为一谈:**没装插件** → 内置陶土橙;**装了插件但 palette 是「跟随宿主」** → 走我们自己的琥珀;**装了插件且 palette 是 `claude`** → 才是真正的 Claude 配色。
25
- - **Claude Style 用「跟随宿主」配色时,本插件回到自己的默认配色**:palette 设成 `host`(或根本读不到这个值、或它的变量解析不出来)时,卡片不会去复制一套近黑 / 近白的宿主中性色、把自己变成黑白卡片,而是整档换回我们自己的配色——浅底白卡配深琥珀 `#e08f13`、深底深灰配亮琥珀 `#f0a83a`,胶带平时也取我们自己的琥珀色(真正进入警戒后回到红黄斜纹,见下一条),只沿用宿主的明暗。**想看到真正的 Claude 配色,需要去 Claude Style 的设置里把 palette 切成 `claude`。** 另有一道保险:跟随模式下强调色若恰好没有彩度,会退回同样的琥珀,正常配色下不会触发。
26
- - **警示带会跟着状态变(卡片与悬浮窗都一样)**:用插件自带配色时,未武装与被阻断这两档,警示带是主题色的深浅两档——安静、不抢眼,卡片停在一边时不晃眼;从武装开始,到真正执行关机为止,都是经典的红黄斜纹,那才是这款插件的识别符。切换是渐变的,不会闪。换成 Claude Style 或 DeepSeek 蓝配色时这条不生效:那两档整套都在跟主题走,红黄斜纹在那里正好是撞色,所以全程用主题色的深浅两档。
27
- - **图标**:插件列表里不再显示默认齿轮——`package.json` 的 `icon` 指向一枚盾牌(琥珀底、实心关机符号,36px 档单独画过)。设置页左侧导航里我们那一行也换成同一枚盾牌的单色版,用 CSS `mask` 加 `currentColor` 绘制,深浅主题自动跟随。宿主目前没有官方图标字段,这是 DOM 补丁;宿主将来提供字段时应改用它。设置页里这一项的名称改成产品名 `Shutdown Guard`(三语同一字面量,不翻译),侧边栏卡片标题仍是「任务完成后关机」。
28
- - **文案**:中文界面刻意保留一批英文技术词(`OFF` / `ARMED` / `T-minus` / `shutdown --when idle` 等状态与命令名),解释性文字(说明、计数、按钮、设置页)全为中文;英文与俄文界面各自完整翻译,不受这条混排约定影响。三语键集齐平(134 / 134 / 134)。
29
- - **俄语计数表达修正**:俄语数词要跟着数量变格,中文和英文里「2 个任务 / 2 jobs」的写法照搬到俄语就是病句(旧界面会显示 `2 задач · 3 агентов`)。现在改成冒号式「`фоновых задач: 2 · агентов: 3`」,任何数字都成立,不用再为 1 / 2–4 / 5+ 分别造句子。
30
- - 修复:热重载后侧边栏偶发出现两个卡片(第二个是改动前的旧卡片,文案还是英文)。旧实例留在 DOM 里的节点和它的轮询定时器没人管;现在用实例令牌 `window.__dshShutdownGuardOwner` 定主,新实例挂载即接管,旧实例下一拍发现主人不是自己就清掉自己的节点并停手,`<style>` 标签同样去重。
31
- - 修复:事件视图的语言问题(两处同一根源的漏传)。一处是中文界面里「最近事件」全是英文、增量游标一并失效——`recentEvents()` 的两个调用点漏传 `lang`,参数错位后语言落到英文兜底;另一处是切换语言后事件里的阻断原因仍停在旧语言,俄文界面会出现「…:等待恢复:服务端故障…」这种中俄混排。现在事件文本与阻断原因都在出口按当前语言现渲染,切换后同一批历史事件跟着变;老日志里已有的记录照原样显示,不丢历史。
32
- - 修复:设置菜单里的插件标题不跟随语言。`ctx.locale.register` 注册命名空间,并在切换语言后重新注册 `settings.section` 槽位,两条路径都覆盖,不需要重启 DSH。
33
- - 修复:冷启动后语言丢失。语言偏好改由宿主 `data/ui.json` 持有,`localStorage` 只作首帧兜底,不再依赖某个存储分区。
34
- - 测试:宿主断言 28 → 43 项,新增 `events-i18n-ok`、`events-since-ok`、`events-nested-i18n-ok`、`window-page-ok`、`window-radar-parity-ok`(悬浮窗与卡片的 agent 点数同源)、`window-tape-ok`(悬浮窗警示带与卡片同一套状态规则)、`ui-state-ok`、`ui-compact-ok`、`profile-v2-ok`、`profile-legacy-ok`(后两项覆盖 v1 → v2 读取与旧全局字段迁移)、`agent-total-ok`、`agent-total-fallback-ok`(后两项覆盖子 Agent 计数与宿主不提供成员列表时的回落);发版前又补了 4 条配置用例——空槽按需创建、从没动过的空槽在升级时清理、记住上次用的配置、那份配置被删后回落到默认。客户端从 1 条 bundle smoke 扩到 14 项:雷达 5 条(点数取运行中 agent 总数、不退回主会话数、上限 12 个与 `+N`、读屏描述、宿主不提供该字段时回落)、强调色 4 条(`oklch` 与 `color-mix` 两种推导都不会推出没彩度的灰、灰度强调色能退回琥珀、不用 canvas 取色)、内置配色 3 条(读不到 Claude Style 的配色属性才用内置陶土橙、palette 为 `host` 时不走内置配色、属性为空表示插件已安装)、主题名 1 条(选项显示为 `Claude Style`)。
35
- - 文档:新增面向下载者的 `RELEASE-1.6.0.md`;三份 README 的安装、配置与截图按本版更新,并加上 awesome-dsh-plugin 的收录徽章(贴在 dshbase 那枚旁边)。dsh-plugin.org 与 dpharness 的页面还没上线或还没更新,暂不贴。
36
- - ⚠️ 升级注意:`data/config.json` 无需手动迁移,读取时自动兼容、保存时写成 `version: 2`;默认配置现在拒绝改动,想自定义就新建一个配置;旧版全局的 AFK 与通知开关会并入升级时生效的那个配置。**包变大了,这是预期内的**:设置页那 18 张缩略图以内联 base64 的形式进了 `lib/client.js`(约 300KB),该文件从约 143KB 涨到约 470KB;本版 npm 包约 360 kB(未压缩解包约 750 kB),仍是 11 个文件,不是装错了。
37
-
38
- ## v1.5.1 — 2026-11-04
39
-
40
- - 三语界面:中文 / English / Русский。宿主侧文案目录 78 键、侧边栏卡片 74 键,三语键集齐平、零缺失;日志与提示全部改走 `t(lang, key)`,`lib/index.mjs` 内已无硬编码中文串。
41
- - 新增语言选择器:设置 → 插件 → 任务完成后关机 → 「语言」,切换即时生效——经 `POST /api/dsh-shutdown-guard/config` 的 `language` 字段落盘,卡片强制重绘,不需要重启 DSH。
42
- - 新增 `language` 配置项:取值 `auto` | `zh` | `en` | `ru`,默认 `auto`(跟随系统语言)。它由 `loadStore`(`lib/index.mjs:283`)读取、经 `POST /config` 在运行时写入;**不是** `normalizeProfile` 字段,三份 README 的配置表已单独为它补一行。
43
- - 语言偏好同时写入宿主配置(`data/config.json`)与浏览器 `localStorage`:前者是权威值,后者让卡片在首帧就按所选语言渲染,重启后不再闪一下中文。
44
- - 文档:新增 `README.en.md`、`README.ru.md`,三份 README 的配置表统一补 `language` 行;演示页改成三语(`scripts/demo/i18n.js`,157 键)。
45
- - 修复:切换语言后,事件日志里切换前的旧行会永久停留在旧语言;现在切换时整环重取(`lib/client.js` `setSnapshot`)。
46
- - 修复:`saveStore()` 在 `apply()` 外引用越界变量,写 `data/config.json` 失败时会抛 `ReferenceError`、`log.configWriteFailed` 提示永远打不出来(`lib/index.mjs:292-295`、`:1039`)。
47
- - 可访问性:设置里 5 个开关补 `aria-label`,屏幕阅读器可读出开关名称(未新增文案键)。
48
- - 测试:新增 i18n 目录断言——`LANGS` 固定为三语、`catalogCoverage().missing` 为空、每语键数与基准一致。
49
- - ⚠️ 升级注意:**已有配置无需任何改动或迁移**。`language` 缺省即 `auto`,与 v1.5.0 的行为一致;升级后若想固定语言,在设置里选一次即可。
50
-
51
- ## v1.5.0 — 2026-11-02
52
-
53
- - 改名:`dsh-shutdown-panel` → **`dsh-shutdown-guard`**(Shutdown Guard)。原名只描述了界面,没表达它真正的特长——关机前逐条排除。`shutdown` 仍在包名第二位,市场按关键词搜索时排序不受影响。
54
- - 同步改名:HTTP 前缀 `/api/dsh-shutdown-guard`、`localStorage` 键前缀、`<style data-dsh-shutdown-guard>`、客户端 bundle id、`cordis.patch.yml` 的行 id。
55
- - ⚠️ 升级注意:旧版写在浏览器 `localStorage` 里的外观偏好(`dsh-shutdown-panel.variant` 等)不会迁移,升级后回到默认 A / 跟随主题 / 不折叠。如需保留,手动在设置里重选一次。
56
-
57
- ## v1.4.2 — 2026-11-02
58
-
59
- - 文档补齐:README 按 v1.4 重写(截图、功能矩阵、重试策略、FAQ),新增 CONTRIBUTING.md、LICENSE。
60
- - 修复 README 早前被 PowerShell 写坏的问题( ransient 被吞成
61
- - 新增 est/(服务端 27 项断言 + 客户端 bundle smoke,路径改为相对插件根)与 scripts/(从真实 CSS 生成图库、headless Edge 截图)。
62
-
63
- ## v1.4.1 — 2026-11-02
64
-
65
- - 重试节奏改为按故障类型分别配置:
66
- - 默认分配:RATE_LIMIT →
67
- - WAITING_CODES 增至 6 项,补 TIMEOUT 与 IMAGE_OFFLOAD_REQUIRED。
68
- - 修 bug:setArmed() 只清 locked、没清
69
-
70
- ## v1.4.0 — 2026-11-02
71
-
72
- - 新增阻断态(blocked),插件不因此解除武装:卡片转色、状态行写原因,三种外观都有对应暂停外观。
73
- - halted(灰蓝):额度、凭证、上下文超限、能力不支持、磁盘写满 —— 只有人能处理,按钮变「解除并重试」。
74
- - waiting(灰绿、圆点呼吸):限流、5xx、网络、空响应 —— 到点自动重试,并向会话注入「继续原计划」指令。
75
- - /state 新增 locked、
76
- - 设计文档 docs/blocked-states.md(分级语义、错误码表、重试节奏分析、stuck 归档理由)。
77
-
78
- ## v1.3.9 — 2026-11-02
79
-
80
- - 修复:在分支对话里手动终止任务仍会触发关机。取消和正常结束都表现为 gent/status = idle,插件此前只看到后者。
81
- - 新增 session/event 监听(宿主签名 (session, event)),按两条独立信号识别中断: urn/end 带取消原因;或本轮从 urn/start 到 urn/end 没追加过任何 ssistant/message。
82
- - 命中中断时不武装,并记「已检测到用户中断,本轮不关机」。
83
-
84
- ## v1.3.8 — 2026-11-02
85
-
86
- - 尝试用 AbortError 拦截用户中断。事后证明打不中 —— 终止不走 gent/error,被 v1.3.9 取代。
87
-
88
- ## v1.3.7 — 2026-11-02
89
-
90
- - 引入 HALTED_CODES:额度、凭证、上下文超限等不可恢复错误不再当成普通失败处理(否则会在用户不在场时照常关机),改为置 locked,并在 ryArm() 最前面拦截。
91
-
92
- ## v1.3.6 — 2026-11-02
93
-
94
- - 新语义:当「有会话报错就跳过」关闭、且 AFK 自动回答开启时,出错批次不再永久阻止关机。第 1 次报错让 agent 排查,第 2 次下「收尾」指令;收尾那一轮结束后该会话的错误不再计入拦截条件。
95
- - 仅在「报错就跳过」关闭时生效;该开关打开时出错的批次照旧整轮跳过。
96
- - 重试计数与收尾标记都在武装/解除时清零。
97
- ## v1.3.5 — 2026-11-02
98
-
99
- - 新增调试钩子 POST /api/dsh-shutdown-guard/error-test,仅在 cordis.patch.yml 里设置 debugHooks: true 时注册。它用第一个 root 会话走一遍真实的 AFK 报错恢复链路(注入 + 日志 + 不关机),便于在没有真实崩溃时演练 T4。
100
- - 错误处理逻辑抽成 handleAgentError(agent),事件监听与调试端点共用同一条代码路径。
101
-
102
- ## v1.3.4 — 2026-11-02
103
-
104
- - AFK 错误恢复:武装且 AFK 开关打开时,root 会话报错不再直接跳过/关机,而是向该会话注入一条恢复指令——先定位并修复报错、按原计划继续;同一会话第二次报错则要求它停止重试、把结果与失败原因写成报告落盘后收尾;第三次不再注入。
105
- - 注入走 `agent.followup(message)`(等价于追加一轮用户消息),失败回落 `agent.steer`,都不可用则只记日志、不触发关机。
106
- - 重试次数只在武装/解除时清空,避免「注入 → 重跑 → 再报错」无限循环。
107
- - 另加一层保险:AFK 开关打开时,只要本批次存在报错会话就不武装关机(即使「有会话报错就跳过」是关的),等恢复成功、报错集合清空后再走正常流程。
108
-
109
- ## v1.2.0 – v1.3.3(补记)
110
-
111
- - 事件与 state 跟随插件:data/events.log、data/config.json,1 个默认档 + 8 个自定义档。
112
- - 设置拆成三组:外观 / 何时关机 / 状态,含事件日志。
113
- - 默认配置倒计时锁 60 秒(countdownLocked),自定义档可调。
114
- - AFK 自动回答:武装时替用户回答提问(user-questions/request,prepend 抢在 Web 回答者之前)。
115
- - 「AFK 自动回答」行下移到「倒计时时长」之后。
116
- ## v1.1.1 — 2026-11-02
117
-
118
- - 设置页按 Claude Style 的行式布局重做:每行 14px 标题 + 12px 说明,行间 0.5px 分隔线,上下 14px 留白。
119
- - 控件放大:分段按钮 30px 高 / 13px 字,开关 36×20,滑块 16px。
120
- - 卡片字号同步放大:标题 12.5px、说明 11.5px、按钮 30px 高 / 12.5px、主数字 26px。
121
-
122
- ## v1.1.0 — 2026-11-02
123
-
124
- - 折叠态上下内边距 10→6px(高 42→34px)。
125
- - 警戒带 115°→45°,滚动位移改 28.28px。
126
- - 设置页补齐外观/配色/折叠/判定条件/跳过原因/C 模式说明。
127
- - 新增 POST /config(onlyOnSuccess / blockOnJobs),/state 同步返回。
128
- - 修「设置不跟手」:切换后立即重绘,不再等 1s 轮询。
129
-
130
- ## v1.0.3 — 2026-11-02
131
-
132
- - 警戒带接缝修好:改为单条 2 倍宽元素(`::before`)承载 `repeating-linear-gradient(115deg)`,用 `translateX(-22.07px)` 平移;周期 20/sin115°≈22.07px,不再按 34px 平铺,斜线连续。
133
- - 卡片颜色不再受宿主主题干预:改用自有调色板 `--dsp-*`(bg/fg/muted/line/accent/danger/track/tape-a/tape-b),只在运行时读取宿主表面亮度(probe `var(--dsw-alias-bg-layer-1)`)决定 `data-lum="light|dark"`,浅色用另一套值;字体仍随宿主。
134
- - 终端屏幕改为固定深色(`#0b0d10` / `#9ef0a8`),不再受主题 token 影响;设置分区保留宿主 token(它位于设置页)。
135
-
136
- ## v1.0.2 — 2026-11-02
137
-
138
- - 警戒带改用固定琥珀 #f0a83a + 主题错误红:此前用 --dsw-alias-button-primary-fill,而当前主题的主按钮填充是近白色,条带成了白红相间。
139
- - 卡片与「技能中心」按钮的点击判定区域对齐:host padding:0 12px 8px 0、卡片内边距 8px,实测卡片与面板按钮同为 x=12、宽 256。
140
- - 未开启状态警戒带保持静止但保留 60% 不透明度,不再灰成一片。
141
-
142
- ## v1.0.1 — 2026-11-02
143
-
144
- 修复重启后出现的三个问题。
145
-
146
- ### 修复
147
- - **会话列表消失**:卡片原先注册在 `sidebar.workspaces`,而该槽是 `single` 槽、已被会话浏览器占用;同优先级注册冲突导致会话浏览器整块不再渲染。卡片改为在侧边栏 `regionArea` 顶部插入独立 DOM 节点(React 不管理它),不再占用任何槽位,会话列表恢复正常。
148
- - **卡片左缘未与「技能中心」对齐**:容器改为 `padding:6px 2px 8px`、卡片 `width:100%;margin:0`,左缘与面板行(`margin:0 2px`)对齐到同一 x。
149
- - **警戒带图案/颜色异常**:去掉 `color-mix(... transparent)`,改为实色 `--dsw-alias-button-primary-fill` 与 `--dsw-alias-state-error-primary`,条带高度 10px、`background-size:34px 100%`,保持自右向左滚动。
150
-
151
- ### 变更
152
- - 卡片改为纯 DOM 渲染 + 每秒对齐重挂载(侧边栏折叠/重建后会自动插回),只有设置分区仍用 React。
153
- - 旧插件 `dsh-shutdown-after-task` 已从 profile 依赖、`pnpm.overrides`、`generationProjection`、`bundles`、`desired.json`、`node_modules` 软链与 `.generations/live` 目录中移除。
154
-
155
- ## v1.0.0 — 2026-11-02
156
-
157
- 侧边栏卡片版。
158
-
159
- - 卡片位于「技能中心」下方、会话列表上方。
160
- - 三种外观:A 警戒带 / B 雷达 / C 终端,可在 设置 → 插件 → 任务完成后关机 中切换。
161
- - 纵向折叠:只留标题与状态标签,点击标题展开;可设为默认折叠。
162
- - 状态机可视化:未开启 / 待命 / 等待后台任务 / 倒计时 / 已关机。
163
- - 浅色、深色与第三方主题(如 Claude Style)自适应,颜色统一走 `--dsw-alias-*` token。
164
- - 后台任务守卫(v0.1.1 引入)保留:有运行中的后台任务时不触发;倒计时中出现新任务会 `shutdown /a` 并保持武装。
165
- - 外观与折叠状态写入 `localStorage`。
166
-
167
- ## v0.1.1 — 2026-10-24
168
-
169
- - 新增 `ctx.jobs` 事件订阅:运行中的后台任务会阻止关机;取消倒计时后仍保持武装。
170
-
171
- ## v0.1.0 — 2026-10-21
172
-
173
- - 首个可用版本:复用原插件关机逻辑,UI 为侧边栏底部一行 + `shell.overlay` 弹层。
1
+ # Changelog
2
+
3
+ ## v1.6.1-beta.2 — 2026-11-08
4
+
5
+ > 测试版(beta):`latest` 仍指向 1.6.0,`npm i dsh-shutdown-guard` 不会装到它。装这个版本请用 `npm i dsh-shutdown-guard@1.6.1-beta.2`。
6
+
7
+ - ⚠️ `~` **默认配置下,锁屏 / 注销 / 自定义脚本不再可用**:这三件事会让人离开机器、或让插件去执行一段你未必盯着的代码,所以现在要先开启「自定义配置」。设置页会写明原因「开启「自定义配置」后才能用这个动作」;即使绕过界面直接调接口武装,判定闸也同样拦住,不会进倒计时。
8
+ - `~` **守夜页的行序换了**:倒计时挪到最上面,动作紧随其后;「会话都停下来」移到「后台任务跑完」与「有会话报错就跳过」之前,与判定实际执行的顺序一致。功能没少,位置变了。
9
+ - `+` **不再限制安装平台**:移除了包里的平台限制,macOS 与 Linux 现在能正常安装(此前 npm 会直接以 `EBADPLATFORM` 拒绝);Windows 用户不受影响。
10
+ - 修复:自定义脚本还没上传文件时,下拉里那一项以前是灰的、点不动也没有说明 → 现在可以先选中再挑文件,不能武装时会说清原因。
11
+ - 修复:关闭「自定义配置」后,脚本上传行与确认框整体收起;如果此前选的就是自定义脚本,动作下拉显示一个禁用的「自定义脚本(不可用)」占位,而不是空白。
12
+ - **测试与体积**:宿主断言 **66 项**、客户端 **15 项**全绿;本版 npm 包约 363 kB(未压缩解包约 763 kB),仍是 11 个文件。
13
+
14
+ ## v1.6.1-beta.1 — 2026-11-06
15
+
16
+ > 测试版(beta):`latest` 仍指向 1.6.0,`npm i dsh-shutdown-guard` 不会装到它。装这个版本请用 `npm i dsh-shutdown-guard@1.6.1-beta.1`。
17
+
18
+ - ⚠️ `~` **熔断后不再一直挂着**:配额耗尽、凭据失效这类熔断状态下,以前插件会停在阻断态等你处理,重启 DSH 之后也记不住;现在会照常执行你选的动作——默认还是关机。这是本版唯一会让人觉得「怎么突然关机了」的变化,详版说明见 `RELEASE-1.6.1-beta.1.md` 的升级必读。
19
+ - `~` **倒计时改由插件自己数**:以前 Windows 上的关机/重启交给系统排队,其余动作到点才下发;现在统一由插件自己计时、到点再执行。状态显示与实际发出的时间因此对得上,代价是**倒计时期间 DSH 被退出或杀掉,这次动作就不会执行**。
20
+ - `+` **动作不再只有关机**:关机、重启、睡眠、休眠、锁屏、注销、自定义脚本,共 **7 个可用选项**——倒计时结束执行哪一个,在设置页的动作下拉里选,按配置保存。「重启 DSH」也在列表里,但当前置灰不可选(见下一条)。
21
+ - `+` **自定义脚本改成上传脚本文件**:不再手填命令与参数,选「上传脚本文件」挑一个文件即可,到点由插件执行它;需要参数、管道或重定向,写在脚本里。没上传文件时只是不能武装,并且会说明原因。
22
+ - `+` **动作能力探测**:设置页会标出当前系统上哪些动作不可用及原因(例如这台系统没有可靠锁屏的命令行),不会让你点一个必然失败的选项。
23
+ - `+` **熔断态跨重启保持**:`data/config.json` 从 schema 2(旧版 schema 3 也一样)升到 4,新增 `parked` 字段;配额耗尽、凭据失效这类熔断在重启 DSH 后仍然记着,不再一重启就忘。
24
+ - `+` **macOS 与 Linux 挂载**:宿主不再只认 Windows,darwin / linux 各有自己的动作表与计时方式(**未在真机实测**,差异见 `RELEASE-1.6.1-beta.1.md` 的兼容性一节)。
25
+ - `+` **文档拆成三篇**:新增 `docs/ARCHITECTURE.md`(宿主与界面的分工、状态机、两处渲染的同源约定)、`docs/CONFIG.md`(`data/config.json` 的字段与 version 4 的迁移)、`docs/DEVELOPING.md`(本地挂载、测试、截图脚本);README 改写成面向用户。
26
+ - `-` **手填命令与参数的自定义脚本方式**:改为上传脚本文件;要参数或管道就写在脚本里。
27
+ - `~` **「重启 DSH」列出但不可选(置灰)**:插件够不着 Electron 的 `relaunch()`,而用 `process.exit()` 代替会跳过宿主的清理流程、可能损坏正在跑的会话,所以宁可置灰也不做半吊子实现。
28
+ - `~` **倒计时里取消的语义变诚实**:倒计时改成插件自己数之后,取消就是一条命令都没发过,不会出现「说取消了其实已经发了」。
29
+
30
+ - **测试与体积**:宿主断言 59 → **64 项**全绿,客户端 **14 项**全绿。新增覆盖集中在脚本这条链上——上传后落盘但元数据不泄露脚本内容、没确认的脚本不许武装、脚本内容换过之后原确认失效、缺解释器时报错、脚本文件丢失后拒绝武装;另有插件计时期间一次都不拉起进程、到点恰好执行一次,以及 `data/config.json` 从 schema 2 与从 schema 3 升到 4 的两条迁移路径。本版 npm 包约 360 kB(未压缩解包约 756 kB),仍是 11 个文件。
31
+
32
+ ## v1.6.0 — 2026-11-06
33
+
34
+ **同一张守夜卡片,现在也能单独挂在桌面上。** 这一版把卡片搬出了侧边栏(独立悬浮窗)、把状态变化做成系统通知、把配置体系升到 v2,设置页也跟着重排。
35
+
36
+ ### 升级必读
37
+
38
+ - `data/config.json` 升到 version 2:读取时自动兼容旧的全局 AFK 与 `ui.json` 里的旧通知开关,保存时写成 v2,**不用手改**;但要回退到旧版,请先备份这个文件。
39
+ - 默认配置改为强锁定:改它的倒计时、边距、两个判定开关或 AFK,现在直接返回 400(以前是静默夹紧回原值,容易让人以为改成功了)。要自定义就「+ 新建」一个配置。
40
+ - 通知与 AFK 从全局搬进了配置:它们描述「这台机器上怎么守夜」,跟着配置走才合理,切配置时会一起变。
41
+
42
+ ### `+` 新增
43
+
44
+ - `+` **悬浮窗口**:卡片上多了一个入口,点开是真正的第二个窗口,可以拖到副屏一直盯着倒计时,切到别的会话也看得见。窗口里就是侧边栏卡片本身——同一套状态机、同一套配色、同一枚主按钮,左上角指示点随 `blocked / off / fired / countdown / hold / armed` 变色并呼吸,最近事件留在卡片下方。外观(A / B / C)、主题、语言三项由宿主持有(`POST /ui` 写进 `data/ui.json`,`/state` 的 `ui` 字段读出),在设置里一改,窗口下一轮轮询就重画,不用关重开。之所以不继续只靠 `localStorage`:桌面端的侧边栏与 `window.open` 出来的窗口可能落在不同的存储分区,早先的表现就是「语言能跟随、颜色与外观不跟随」。
45
+ - `+` **悬浮窗简洁模式(默认开启)**:只留卡片本身,隐藏顶部品牌行、状态徽章、统计行、最近事件和底部提示;页面背景透明、卡片居中,看起来就是一张悬在桌面上的卡片。开关放在设置页的「外观」组里,窗口内刻意不放切换控件——一个只剩一张卡片的窗口,不该再叠一个开关上去。
46
+ - `+` **状态变化发系统通知**:四类分别可开关——进入倒计时、即将关机、首次阻断、阻断恢复。正文只写状态与关键数字(剩余秒数、被哪道闸挡住、重试还有几秒),不含会话标题或路径。手动点「武装 / 解除 / 取消」引起的任何变化一律不提醒(2 秒静默窗口);同一状态按「类型 + 状态 + 阻断原因」做指纹去重,不会连弹。点通知会聚焦已有的悬浮窗,没有则新开一个。
47
+ - `+` **会话数改成真数,含子 Agent**:以前只数顶层会话,多智能体协作里后台跑着的子 Agent 完全不可见——父会话闲着的时候卡片甚至显示 0 个会话,看着像什么都没在跑。现在卡片上的会话数是「主会话 + 子 Agent」总数,HUD 与终端里的 agent 数是「正在运行的 agent 数」,两者都取宿主的真数;「N 个会话」那句话同样按总数说。设置页的「状态」组里没有这一行(分组时已移除),会话数只在卡片与终端视图显示。
48
+ - `+` **雷达点数同源**:卡片的外观 B 与悬浮窗的 B / C 形态现在都按「运行中的 agent 总数(含子 agent)」画点,最多 12 个,超出的在右上角显示 `+N`,并补了三语读屏描述「N 个 agent,其中 M 个在运行」——此前它只是一张没有说明的图。
49
+ - `+` **配置升级到 v2(`data/config.json`)**:宿主新增 `createProfile` / `renameProfile` / `deleteProfile` / `setDefault` / `updateProfile` 五条命令,写入只认白名单字段,未知键忽略(新客户端不会把旧宿主写坏)。
50
+ - `+` **配置管理界面**:设置页里就能新建(从当前配置复制一份)、重命名、删除、设为默认,不用再改 JSON。默认配置那行只显示倒计时秒数,没有改名与删除按钮——它是安全基线,宿主侧同样会拒绝。删除要按两次:第一次按钮变成「确认删除」(2 秒内再点才生效,超时自动复原);删掉的如果正是当前配置,会自动回落到默认配置。名称留空或超过 24 个字符会在行内提示,失败原因直接显示宿主返回的那句话(比如「自定义配置已关闭」)。宿主与界面不再各自判断「这份配置算不算用过」:列表一律按宿主返回的内容渲染,刚新建的配置哪怕一个开关都没动,也会立刻出现在列表里,不会出现「建了却看不见」。
51
+ - `+` **设置页改成四个标签页**:外观 / 守夜(自定义配置开关 + 配置 + 守夜行为)/ 通知 / 状态,原来那根长列表按主题拆开,找一项不用再从头滚到底。标签是真 `tablist`:左右方向键与 Home / End 可切;四个面板始终保持挂载(非活动的只是 `hidden`),所以填了一半的配置名、滚到一半的位置,切个标签回来都还在。原先各组的内容一条没少(判定与关机那一组并进了守夜行为),行式骨架也保留:标题与说明在左、控件在右,组间 0.5px 分隔线,组标题各带一枚小图标;说明文字能压一行就压一行,只有 AFK 那条保留完整说明——它得讲清我们会替你回什么、不会替你选什么。
52
+ - `+` **卡片样式改成带缩略图的三张卡片**:以前是三个字母药丸(A / B / C),光看字母猜不出长什么样。现在是三张卡片,各配一张 400×256 的高清卡面缩略图——图里就带着「待命 / Armed / Взведено」这些字与卡面底色,下面标「极简 / 雷达 / 终端」。缩略图共 18 张:A / B / C × 中 / 英 / 俄 × 浅 / 深,因为图里有文字,不能靠反色复用。选哪张不看主题名,而是量设置面板实际背景色的亮度(`L > 0.5` 用浅色图;透明白底会往上找第一个不透明祖先),所以换了宿主皮肤、改了 Claude Style 的配色也能选对;切换 200ms 节流,只换 `img.src`,不重建 DOM、不丢选中态。
53
+ - `+` **缩略图换成了高清版**:以前放大看发虚,圆点和文字边缘都糊;现在按两倍尺寸出图,设置页里看得清楚,浅色深色下都一样。
54
+ - `+` **「配置」搬进了「守夜」标签页**:「自定义配置」开关单独占一行、放在页首,配置块紧跟在它下方,只有开关打开时才渲染(关着时整块不进页面,不是灰掉占位)。「判定与关机」那一组标题已取消,原来那四条判定闸并进了「守夜行为」,排在 AFK 自动回答之前——先定规矩,再看守夜时怎么表现,顺序跟思考顺序一致。顺带把「外观」页里与标签名重复的那条组标题去掉了。
55
+ - `+` **新装不再预生成八个空配置**:以前一进设置页就摆着八个空槽,看着像必须一个个填满;现在只有「默认配置」一行,需要第二份配置时点「+新建」才创建。空槽不再是初始化的一部分,而是按需生成。
56
+ - `+` **记住上次用的配置**:关掉「自定义配置」再打开,会回到上次用的那份配置,不用重新点一次;如果那份配置已经被删,就停在「默认配置」,不会指向一个不存在的名字。升级时也会清理旧数据里从没动过的空槽——只有「名字没改过、里面任何一个开关也没动过」的才会消失;**改过名或动过任一开关(倒计时、判定条件、通知、AFK 都算)的配置都会保留**,不会丢数据。
57
+ - `+` **开关点下去立刻生效**:点击时本地先置位并重绘,请求在背后发;失败时在那一行显示内联红字「保存失败,已还原」并回滚到宿主值,不静默吞掉。以前要等下一轮 `/state` 轮询回来才变,体感像卡住。
58
+ - `+` **控件手感**:分段选择(卡片样式 / 主题 / 语言 / 倒计时)改成滑动切换——高亮块从旧位置滑到新位置,而不是瞬间跳过去;开关拨动带 350ms 回弹动画。纯视觉改动,不改变任何取值逻辑。
59
+ - `+` **设置页头部加了 GitHub 与 npm 入口**:标题右侧两枚**单色**图标,分别打开仓库页与 npm 包页,都在新标签打开,悬停才变亮,读屏与悬停各有文字说明;npm 那枚按它自己的长条比例单独放大,不跟方形图标挤成一样大。**有意不显示版本号**——写死一个版本号迟早会和 `package.json` 对不上,要看版本有徽章与 CHANGELOG。
60
+ - `+` **`Claude Style` 主题跟随实时配色**:当 Claude Style 用自己那套配色时(它的 `data-dsh-claude-palette` 不是 `host`),卡片实时跟随它的表面、文字、次要文字、分隔线、强调色、危险色与轨道;在 Claude Style 里改配色或切明暗,卡片不用刷新就跟着变,也不用重装插件。
61
+ - `+` **没装 Claude Style 插件也能选它**:主题选项从现在起叫 `Claude Style`(三语同名,俄文也保留英文原名)。检测不到 dsh-claude-style 时不会把选项藏起来,而是用一套内置的近似配色(陶土橙),并在主题行下面用一行灰字说明;装上插件后这一行消失,自动改跟插件的实时配色。三档别混为一谈:**没装插件** → 内置陶土橙;**装了插件但 palette 是「跟随宿主」** → 走我们自己的琥珀;**装了插件且 palette 是 `claude`** → 才是真正的 Claude 配色。
62
+ - `+` **警示带会跟着状态变(卡片与悬浮窗都一样)**:用插件自带配色时,未武装与被阻断这两档,警示带是主题色的深浅两档——安静、不抢眼,卡片停在一边时不晃眼;从武装开始,到真正执行关机为止,都是经典的红黄斜纹,那才是这款插件的识别符。切换是渐变的,不会闪。换成 Claude Style 或 DeepSeek 蓝配色时这条不生效:那两档整套都在跟主题走,红黄斜纹在那里正好是撞色,所以全程用主题色的深浅两档。
63
+ - `+` **图标**:插件列表里不再显示默认齿轮——`package.json` 的 `icon` 指向一枚盾牌(琥珀底、实心关机符号,36px 档单独画过)。设置页左侧导航里我们那一行也换成同一枚盾牌的单色版,用 CSS `mask` 加 `currentColor` 绘制,深浅主题自动跟随。设置页里这一项的名称改成产品名 `Shutdown Guard`(三语同一字面量,不翻译),侧边栏卡片标题仍是「任务完成后关机」。
64
+ - `+` **文案**:中文界面刻意保留一批英文技术词(`OFF` / `ARMED` / `T-minus` / `shutdown --when idle` 等状态与命令名),解释性文字(说明、计数、按钮、设置页)全为中文;英文与俄文界面各自完整翻译,不受这条混排约定影响。三语键集齐平(134 / 134 / 134)。
65
+ - `+` **文档**:新增面向下载者的 `RELEASE-1.6.0.md`;三份 README 的安装、配置与截图按本版更新,并加上 awesome-dsh-plugin 的收录徽章(贴在 dshbase 那枚旁边)。
66
+
67
+ ### `-` 移除
68
+
69
+ - `-` **旧的「默认 | 1 | 2 | 3」槽位快捷条**:配置切换统一收进上面那个列表,「设为默认」一步到位——点它就直接切到该配置,不再先选槽位再确认。少一处入口,也少一种「刚才切的是哪个」的困惑。
70
+
71
+ ### `~` 变更
72
+
73
+ - `~` **默认配置从「静默夹紧」变成「明确拒绝」**:以前改它的倒计时(60 秒)、边距(5 秒)、两个判定开关和 AFK,会被夹紧回原值;现在返回 400 并说明是哪个字段不能改。通知的四类开关不在此列,默认配置下仍可逐项改。
74
+ - `~` **通知与 AFK 跟着配置走**:它们从全局搬进当前配置,切换配置时一起变;升级时旧版全局的值会并入升级时生效的那个配置。
75
+ - `~` **Claude Style 用「跟随宿主」配色时,本插件回到自己的默认配色**:palette 设成 `host`(或根本读不到这个值、或它的变量解析不出来)时,卡片不会去复制一套近黑 / 近白的宿主中性色、把自己变成黑白卡片,而是整档换回我们自己的配色——浅底白卡配深琥珀 `#e08f13`、深底深灰配亮琥珀 `#f0a83a`,只沿用宿主的明暗。另有一道保险:跟随模式下强调色若恰好没有彩度,会退回同样的琥珀,正常配色下不会触发。
76
+ - `~` **俄语计数表达修正**:俄语数词要跟着数量变格,中文和英文里「2 个任务 / 2 jobs」的写法照搬到俄语就是病句(旧界面会显示 `2 задач · 3 агентов`)。现在改成冒号式「`фоновых задач: 2 · агентов: 3`」,任何数字都成立,不用再为 1 / 2–4 / 5+ 分别造句子。
77
+
78
+ ### 修复
79
+
80
+ - 修复:热重载后侧边栏偶发出现两个卡片(第二个是改动前的旧卡片,文案还是英文)。旧实例留在 DOM 里的节点和它的轮询定时器没人管;现在用实例令牌 `window.__dshShutdownGuardOwner` 定主,新实例挂载即接管,旧实例下一拍发现主人不是自己就清掉自己的节点并停手,`<style>` 标签同样去重。
81
+ - 修复:事件视图的语言问题(两处同一根源的漏传)。一处是中文界面里「最近事件」全是英文、增量游标一并失效——`recentEvents()` 的两个调用点漏传 `lang`,参数错位后语言落到英文兜底;另一处是切换语言后事件里的阻断原因仍停在旧语言,俄文界面会出现「…:等待恢复:服务端故障…」这种中俄混排。现在事件文本与阻断原因都在出口按当前语言现渲染,切换后同一批历史事件跟着变;老日志里已有的记录照原样显示,不丢历史。
82
+ - 修复:设置菜单里的插件标题不跟随语言。`ctx.locale.register` 注册命名空间,并在切换语言后重新注册 `settings.section` 槽位,两条路径都覆盖,不需要重启 DSH。
83
+ - 修复:冷启动后语言丢失。语言偏好改由宿主 `data/ui.json` 持有,`localStorage` 只作首帧兜底,不再依赖某个存储分区。
84
+
85
+ ### 兼容性与已知限制
86
+
87
+ - **会话数与雷达点数的口径变了**:这是一处用户可见的变化——团队场景(1 个主会话 + 2 个子 agent)下,悬浮窗 B 的圆点会从 1 个变成 3 个。
88
+ - **宿主目前没有官方图标字段**:插件图标是 DOM 补丁,宿主将来提供字段时应改用它。
89
+ - **包变大了,这是预期内的**:设置页那 18 张缩略图以内联 base64 的形式进了 `lib/client.js`(约 300KB),该文件从约 143KB 涨到约 470KB;本版 npm 包约 360 kB(未压缩解包约 750 kB),仍是 11 个文件,不是装错了。
90
+ - **dsh-plugin.org 与 dpharness 的页面**还没上线或还没更新,那里看不到本版。
91
+
92
+ ### 验证
93
+
94
+ - 宿主断言 28 → 43 项,新增 `events-i18n-ok`、`events-since-ok`、`events-nested-i18n-ok`、`window-page-ok`、`window-radar-parity-ok`(悬浮窗与卡片的 agent 点数同源)、`window-tape-ok`(悬浮窗警示带与卡片同一套状态规则)、`ui-state-ok`、`ui-compact-ok`、`profile-v2-ok`、`profile-legacy-ok`(后两项覆盖 v1 → v2 读取与旧全局字段迁移)、`agent-total-ok`、`agent-total-fallback-ok`(后两项覆盖子 Agent 计数与宿主不提供成员列表时的回落);发版前又补了 4 条配置用例——空槽按需创建、从没动过的空槽在升级时清理、记住上次用的配置、那份配置被删后回落到默认。
95
+ - 客户端从 1 条 bundle smoke 扩到 14 项:雷达 5 条(点数取运行中 agent 总数、不退回主会话数、上限 12 个与 `+N`、读屏描述、宿主不提供该字段时回落)、强调色 4 条(`oklch` 与 `color-mix` 两种推导都不会推出没彩度的灰、灰度强调色能退回琥珀、不用 canvas 取色)、内置配色 3 条(读不到 Claude Style 的配色属性才用内置陶土橙、palette 为 `host` 时不走内置配色、属性为空表示插件已安装)、主题名 1 条(选项显示为 `Claude Style`)。
96
+
97
+ ## v1.5.2 — 2026-11-06
98
+
99
+ > 本版内容整体并入 v1.6.0,未单独发布。
100
+
101
+ - `~` **版本号并入 1.6.0**:这一版做的东西(悬浮窗、系统通知、配置 v2、设置页标签化、Claude Style 命名与兜底配色、警示带按状态变色)随 1.6.0 一起发出,npm 上没有 1.5.2 这个版本。
102
+
103
+ ## v1.5.1 — 2026-11-04
104
+
105
+ ### 升级必读
106
+
107
+ - **已有配置无需任何改动或迁移**。`language` 缺省即 `auto`,与 v1.5.0 的行为一致;升级后若想固定语言,在设置里选一次即可。
108
+
109
+ ### `+` 新增
110
+
111
+ - `+` **三语界面**:中文 / English / Русский。宿主侧文案目录 78 键、侧边栏卡片 74 键,三语键集齐平、零缺失;日志与提示全部改走 `t(lang, key)`,`lib/index.mjs` 内已无硬编码中文串。
112
+ - `+` **语言选择器**:设置 → 插件 → 任务完成后关机 → 「语言」,切换即时生效——经 `POST /api/dsh-shutdown-guard/config` 的 `language` 字段落盘,卡片强制重绘,不需要重启 DSH。
113
+ - `+` **`language` 配置项**:取值 `auto` | `zh` | `en` | `ru`,默认 `auto`(跟随系统语言)。它由 `loadStore`(`lib/index.mjs:283`)读取、经 `POST /config` 在运行时写入;**不是** `normalizeProfile` 字段,三份 README 的配置表已单独为它补一行。
114
+ - `+` **语言偏好双写**:同时写入宿主配置(`data/config.json`)与浏览器 `localStorage`——前者是权威值,后者让卡片在首帧就按所选语言渲染,重启后不再闪一下中文。
115
+ - `+` **文档**:新增 `README.en.md`、`README.ru.md`,三份 README 的配置表统一补 `language` 行;演示页改成三语(`scripts/demo/i18n.js`,157 键)。
116
+
117
+ ### 修复
118
+
119
+ - 修复:切换语言后,事件日志里切换前的旧行会永久停留在旧语言;现在切换时整环重取(`lib/client.js` `setSnapshot`)。
120
+ - 修复:`saveStore()` 在 `apply()` 外引用越界变量,写 `data/config.json` 失败时会抛 `ReferenceError`、`log.configWriteFailed` 提示永远打不出来(`lib/index.mjs:292-295`、`:1039`)。
121
+ - 修复:设置里 5 个开关补 `aria-label`,屏幕阅读器可读出开关名称(未新增文案键)。
122
+
123
+ ### 验证
124
+
125
+ - 新增 i18n 目录断言——`LANGS` 固定为三语、`catalogCoverage().missing` 为空、每语键数与基准一致。当时的断言总数与包体积未记录。
126
+
127
+ ## v1.5.0 — 2026-11-02
128
+
129
+ ### 升级必读
130
+
131
+ - 旧版写在浏览器 `localStorage` 里的外观偏好(`dsh-shutdown-panel.variant` 等)不会迁移,升级后回到默认 A / 跟随主题 / 不折叠。如需保留,手动在设置里重选一次。
132
+
133
+ ### `~` 变更
134
+
135
+ - `~` **改名**:`dsh-shutdown-panel` → **`dsh-shutdown-guard`**(Shutdown Guard)。原名只描述了界面,没表达它真正的特长——关机前逐条排除。`shutdown` 仍在包名第二位,市场按关键词搜索时排序不受影响。
136
+ - `~` **同步改名**:HTTP 前缀 `/api/dsh-shutdown-guard`、`localStorage` 键前缀、`<style data-dsh-shutdown-guard>`、客户端 bundle id、`cordis.patch.yml` 的行 id。
137
+
138
+ ### 验证
139
+
140
+ - 当时的断言总数与包体积未记录。
141
+
142
+ ## v1.4.2 — 2026-11-02
143
+
144
+ ### `+` 新增
145
+
146
+ - `+` **文档补齐**:README 按 v1.4 重写(截图、功能矩阵、重试策略、FAQ),新增 `CONTRIBUTING.md`、`LICENSE`。
147
+ - `+` **测试与脚本入库**:新增 `test/`(服务端 27 项断言 + 客户端 bundle smoke,路径改为相对插件根)与 `scripts/`(从真实 CSS 生成图库、headless Edge 截图)。
148
+
149
+ ### 修复
150
+
151
+ - 修复:README 早前被 PowerShell 写坏的问题——`transient` 里的字母被吞、反引号丢失。
152
+
153
+ ### 验证
154
+
155
+ - 当时未记录。
156
+
157
+ ## v1.4.1 — 2026-11-02
158
+
159
+ ### `~` 变更
160
+
161
+ - `~` **重试节奏改为按故障类型分别配置**:`retryPolicies` 定义策略,`retryAssign` 把错误码映射到策略,两者都可从 `cordis.patch.yml` 覆盖。
162
+ - `~` **默认分配**:`RATE_LIMIT` → `rate-limit`(backoff 30→300);`SERVER` / `TRANSPORT` / `TIMEOUT` → `transient`(固定 20s);`EMPTY_RESPONSE` → `empty`(30s);`IMAGE_OFFLOAD_REQUIRED` → `offload`(5s)。
163
+ - `~` **`WAITING_CODES` 增至 6 项**:补 `TIMEOUT` 与 `IMAGE_OFFLOAD_REQUIRED`。
164
+
165
+ ### 修复
166
+
167
+ - 修复:`setArmed()` 只清 `blocked`、没清 `retryAttempt` / `retryAt`,也没取消挂起的重试定时器,导致「解除再武装」后新一轮退避直接从第 2 档(60s)开始。
168
+
169
+ ### 验证
170
+
171
+ - 当时未记录。
172
+
173
+ ## v1.4.0 — 2026-11-02
174
+
175
+ ### `+` 新增
176
+
177
+ - `+` **阻断态(blocked)**:插件不因阻断解除武装——卡片转色、状态行写原因,三种外观都有对应的暂停外观。
178
+ - `+` **两级语义**:`halted`(灰蓝)用于额度、凭证、上下文超限、能力不支持、磁盘写满——只有人能处理,按钮变「解除并重试」;`waiting`(灰绿、圆点呼吸)用于限流、5xx、网络、空响应——到点自动重试,并向会话注入「继续原计划」指令。
179
+ - `+` **`/state` 新增 `blocked`、`retryAttempt`、`retryAt`**;设置页「状态」组新增「当前阻断」行。
180
+ - `+` **设计文档** `docs/blocked-states.md`:分级语义、错误码表、重试节奏分析、stuck 归档理由。
181
+
182
+ ### 验证
183
+
184
+ - 当时未记录。
185
+
186
+ > v1.4.0 之前的段落为早期记录,未按现行格式统一。
187
+
188
+ ## v1.3.9 — 2026-11-02
189
+
190
+ - 修复:在分支对话里手动终止任务仍会触发关机。取消和正常结束都表现为 agent/status = idle,插件此前只看到后者。
191
+ - 新增 session/event 监听(宿主签名 (session, event)),按两条独立信号识别中断:turn/end 带取消原因;或本轮从 turn/start 到 turn/end 没追加过任何 assistant/message。
192
+ - 命中中断时不武装,并记「已检测到用户中断,本轮不关机」。
193
+
194
+ ## v1.3.8 — 2026-11-02
195
+
196
+ - 尝试用 AbortError 拦截用户中断。事后证明打不中 —— 终止不走 agent/error,被 v1.3.9 取代。
197
+
198
+ ## v1.3.7 — 2026-11-02
199
+
200
+ - 引入 HALTED_CODES:额度、凭证、上下文超限等不可恢复错误不再当成普通失败处理(否则会在用户不在场时照常关机),改为置 blocked,并在 tryArm() 最前面拦截。
201
+
202
+ ## v1.3.6 — 2026-11-02
203
+
204
+ - 新语义:当「有会话报错就跳过」关闭、且 AFK 自动回答开启时,出错批次不再永久阻止关机。第 1 次报错让 agent 排查,第 2 次下「收尾」指令;收尾那一轮结束后该会话的错误不再计入拦截条件。
205
+ - 仅在「报错就跳过」关闭时生效;该开关打开时出错的批次照旧整轮跳过。
206
+ - 重试计数与收尾标记都在武装/解除时清零。
207
+
208
+ ## v1.3.5 — 2026-11-02
209
+
210
+ - 新增调试钩子 POST /api/dsh-shutdown-guard/error-test,仅在 cordis.patch.yml 里设置 debugHooks: true 时注册。它用第一个 root 会话走一遍真实的 AFK 报错恢复链路(注入 + 日志 + 不关机),便于在没有真实崩溃时演练 T4。
211
+ - 错误处理逻辑抽成 handleAgentError(agent),事件监听与调试端点共用同一条代码路径。
212
+
213
+ ## v1.3.4 — 2026-11-02
214
+
215
+ - AFK 错误恢复:武装且 AFK 开关打开时,root 会话报错不再直接跳过/关机,而是向该会话注入一条恢复指令——先定位并修复报错、按原计划继续;同一会话第二次报错则要求它停止重试、把结果与失败原因写成报告落盘后收尾;第三次不再注入。
216
+ - 注入走 `agent.followup(message)`(等价于追加一轮用户消息),失败回落 `agent.steer`,都不可用则只记日志、不触发关机。
217
+ - 重试次数只在武装/解除时清空,避免「注入 → 重跑 → 再报错」无限循环。
218
+ - 另加一层保险:AFK 开关打开时,只要本批次存在报错会话就不武装关机(即使「有会话报错就跳过」是关的),等恢复成功、报错集合清空后再走正常流程。
219
+
220
+ ## v1.2.0 – v1.3.3(补记)
221
+
222
+ - 事件与 state 跟随插件:data/events.log、data/config.json,1 个默认档 + 8 个自定义档。
223
+ - 设置拆成三组:外观 / 何时关机 / 状态,含事件日志。
224
+ - 默认配置倒计时锁 60 秒(countdownLocked),自定义档可调。
225
+ - AFK 自动回答:武装时替用户回答提问(user-questions/request,prepend 抢在 Web 回答者之前)。
226
+ - 「AFK 自动回答」行下移到「倒计时时长」之后。
227
+
228
+ ## v1.1.1 — 2026-11-02
229
+
230
+ - 设置页按 Claude Style 的行式布局重做:每行 14px 标题 + 12px 说明,行间 0.5px 分隔线,上下 14px 留白。
231
+ - 控件放大:分段按钮 30px 高 / 13px 字,开关 36×20,滑块 16px。
232
+ - 卡片字号同步放大:标题 12.5px、说明 11.5px、按钮 30px 高 / 12.5px、主数字 26px。
233
+
234
+ ## v1.1.0 — 2026-11-02
235
+
236
+ - 折叠态上下内边距 10→6px(高 42→34px)。
237
+ - 警戒带 115°→45°,滚动位移改 28.28px。
238
+ - 设置页补齐外观/配色/折叠/判定条件/跳过原因/C 模式说明。
239
+ - 新增 POST /config(onlyOnSuccess / blockOnJobs),/state 同步返回。
240
+ - 修「设置不跟手」:切换后立即重绘,不再等 1s 轮询。
241
+
242
+ ## v1.0.3 — 2026-11-02
243
+
244
+ - 警戒带接缝修好:改为单条 2 倍宽元素(`::before`)承载 `repeating-linear-gradient(115deg)`,用 `translateX(-22.07px)` 平移;周期 20/sin115°≈22.07px,不再按 34px 平铺,斜线连续。
245
+ - 卡片颜色不再受宿主主题干预:改用自有调色板 `--dsp-*`(bg/fg/muted/line/accent/danger/track/tape-a/tape-b),只在运行时读取宿主表面亮度(probe `var(--dsw-alias-bg-layer-1)`)决定 `data-lum="light|dark"`,浅色用另一套值;字体仍随宿主。
246
+ - 终端屏幕改为固定深色(`#0b0d10` / `#9ef0a8`),不再受主题 token 影响;设置分区保留宿主 token(它位于设置页)。
247
+
248
+ ## v1.0.2 — 2026-11-02
249
+
250
+ - 警戒带改用固定琥珀 #f0a83a + 主题错误红:此前用 --dsw-alias-button-primary-fill,而当前主题的主按钮填充是近白色,条带成了白红相间。
251
+ - 卡片与「技能中心」按钮的点击判定区域对齐:host padding:0 12px 8px 0、卡片内边距 8px,实测卡片与面板按钮同为 x=12、宽 256。
252
+ - 未开启状态警戒带保持静止但保留 60% 不透明度,不再灰成一片。
253
+
254
+ ## v1.0.1 — 2026-11-02
255
+
256
+ 修复重启后出现的三个问题。
257
+
258
+ ### 修复
259
+ - **会话列表消失**:卡片原先注册在 `sidebar.workspaces`,而该槽是 `single` 槽、已被会话浏览器占用;同优先级注册冲突导致会话浏览器整块不再渲染。卡片改为在侧边栏 `regionArea` 顶部插入独立 DOM 节点(React 不管理它),不再占用任何槽位,会话列表恢复正常。
260
+ - **卡片左缘未与「技能中心」对齐**:容器改为 `padding:6px 2px 8px`、卡片 `width:100%;margin:0`,左缘与面板行(`margin:0 2px`)对齐到同一 x。
261
+ - **警戒带图案/颜色异常**:去掉 `color-mix(... transparent)`,改为实色 `--dsw-alias-button-primary-fill` 与 `--dsw-alias-state-error-primary`,条带高度 10px、`background-size:34px 100%`,保持自右向左滚动。
262
+
263
+ ### 变更
264
+ - 卡片改为纯 DOM 渲染 + 每秒对齐重挂载(侧边栏折叠/重建后会自动插回),只有设置分区仍用 React。
265
+ - 旧插件 `dsh-shutdown-after-task` 已从 profile 依赖、`pnpm.overrides`、`generationProjection`、`bundles`、`desired.json`、`node_modules` 软链与 `.generations/live` 目录中移除。
266
+
267
+ ## v1.0.0 — 2026-11-02
268
+
269
+ 侧边栏卡片版。
270
+
271
+ - 卡片位于「技能中心」下方、会话列表上方。
272
+ - 三种外观:A 警戒带 / B 雷达 / C 终端,可在 设置 → 插件 → 任务完成后关机 中切换。
273
+ - 纵向折叠:只留标题与状态标签,点击标题展开;可设为默认折叠。
274
+ - 状态机可视化:未开启 / 待命 / 等待后台任务 / 倒计时 / 已关机。
275
+ - 浅色、深色与第三方主题(如 Claude Style)自适应,颜色统一走 `--dsw-alias-*` token。
276
+ - 后台任务守卫(v0.1.1 引入)保留:有运行中的后台任务时不触发;倒计时中出现新任务会 `shutdown /a` 并保持武装。
277
+ - 外观与折叠状态写入 `localStorage`。
278
+
279
+ ## v0.1.1 — 2026-10-24
280
+
281
+ - 新增 `ctx.jobs` 事件订阅:运行中的后台任务会阻止关机;取消倒计时后仍保持武装。
282
+
283
+ ## v0.1.0 — 2026-10-21
284
+
285
+ - 首个可用版本:复用原插件关机逻辑,UI 为侧边栏底部一行 + `shell.overlay` 弹层。