dsh-shutdown-guard 1.5.1 → 1.6.0
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 +35 -0
- package/README.en.md +69 -18
- package/README.md +70 -19
- package/README.ru.md +69 -18
- package/assets/icon-shield-2-128.png +0 -0
- package/lib/client.js +2096 -184
- package/lib/index.mjs +1534 -51
- package/package.json +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# Changelog
|
|
2
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
|
+
|
|
3
38
|
## v1.5.1 — 2026-11-04
|
|
4
39
|
|
|
5
40
|
- 三语界面:中文 / English / Русский。宿主侧文案目录 78 键、侧边栏卡片 74 键,三语键集齐平、零缺失;日志与提示全部改走 `t(lang, key)`,`lib/index.mjs` 内已无硬编码中文串。
|
package/README.en.md
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
<p align="center"><img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/banner.png" width="880" alt="Shutdown Guard — automatic shutdown when tasks finish, a night-watch card in the sidebar"></p>
|
|
5
5
|
|
|
6
|
-
[](CHANGELOG.md)
|
|
7
7
|
[](https://ltayshark0637.github.io/dsh-Shutdown-Guard/demo.html)
|
|
8
8
|
[](https://github.com/deepseek-ai)
|
|
9
9
|
[](#constraints)
|
|
10
10
|
[](LICENSE)
|
|
11
|
+
[](https://dshbase.com/plugins/dsh-shutdown-guard/) [](https://awesome-dsh-plugin.com/p/ltayshark0637/dsh-Shutdown-Guard/)
|
|
11
12
|
|
|
12
13
|
Adds a "shut down automatically when all tasks finish" card to the DeepSeek Harness sidebar, with a more varied and polished visual treatment, decision logic, and customization. It sits below Skill Center and above the session list, and updates in real time with task state.
|
|
13
14
|
|
|
@@ -33,16 +34,24 @@ If any one is missing, it does not shut down and writes the reason on the card a
|
|
|
33
34
|
|
|
34
35
|
## Three looks
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
37
|
+
The same look in light and dark; the trilingual captures live in `docs/screenshots/` as `<nn>-armed-<look>-<lang>-<theme>.png`.
|
|
38
|
+
|
|
39
|
+
| Minimal (light) | Radar (light) | Terminal (light) |
|
|
40
|
+
|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|
|
|
41
|
+
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/03-armed-a-en-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/09-armed-b-en-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/15-armed-c-en-light.png" width="250"> |
|
|
42
|
+
|
|
43
|
+
| Minimal (dark) | Radar (dark) | Terminal (dark) |
|
|
44
|
+
|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|
|
|
45
|
+
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/04-armed-a-en-dark.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/10-armed-b-en-dark.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/16-armed-c-en-dark.png" width="250"> |
|
|
46
|
+
| Large status text + one-line explanation, scrolling hazard tape at the bottom (red-and-yellow while standing by) | Radar + a status line, sessions and background jobs shown as dots | Three terminal lines (command, counts, waiting) over six gate indicator lights |
|
|
40
47
|
|
|
41
48
|
Dots in the radar are added and removed, never reordered: when the count changes, the dots you are looking at do not jump.
|
|
42
49
|
|
|
50
|
+
The hazard tape along the bottom of the card and the floating window follows the state: in the built-in palettes it sits in two quiet shades of the theme colour while the card is off or blocked, and from the moment you arm it until the shutdown actually runs it goes back to the familiar red-and-yellow stripes. The change is a 280 ms fade, not a flash. With Claude Style or DeepSeek Blue the tape never switches to red-and-yellow; it keeps following that theme throughout — the stripes would clash there.
|
|
51
|
+
|
|
43
52
|
<p align="center"><img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/anim-radar.gif" width="330" alt="Radar sweep"></p>
|
|
44
53
|
|
|
45
|
-
|
|
54
|
+
Pick one of the three thumbnail cards in the Appearance tab; it takes effect immediately, no restart. The picture switches with the UI language and the lightness of the surface behind it.
|
|
46
55
|
|
|
47
56
|
## Six runtime states
|
|
48
57
|
|
|
@@ -87,15 +96,19 @@ When nobody is at the desk, the plugin covers three things for you:
|
|
|
87
96
|
|:-------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------:|
|
|
88
97
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/10-sidebar-hold.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/11-sidebar-fire.png" width="250"> |
|
|
89
98
|
|
|
90
|
-
The card is
|
|
99
|
+
The card is pinned to this sidebar slot by default; the button on the card header opens it as a standalone floating window that stays in view when you switch sessions (see "Other details" below).
|
|
91
100
|
|
|
92
101
|
## Other details
|
|
93
102
|
|
|
103
|
+
- **Floating window**: the button in the card's top-right corner opens the status panel in a window of its own, so it stays in view when you switch to another session. The "compact floating window" switch in settings is on by default and keeps only the status and countdown; turn it off for the full panel.
|
|
104
|
+
|
|
94
105
|
- **Vertical collapse**: collapsed it keeps only the title and status; click the title to expand.
|
|
95
106
|
|
|
96
107
|
<img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/16-folded.png" width="250" align="right" alt="Collapsed state">
|
|
97
108
|
|
|
98
|
-
- **Theme adaptation**: the card carries its own `--dsp-*` palette and picks light or dark automatically from the host surface's brightness; you can also force dark / light / Claude Style.
|
|
109
|
+
- **Theme adaptation**: the card carries its own `--dsp-*` palette and picks light or dark automatically from the host surface's brightness; you can also force dark / light / Claude Style. The settings page always follows the host theme.
|
|
110
|
+
|
|
111
|
+
- **Language**: "follow system" by default — `LC_ALL` / `LC_MESSAGES` / `LANG`, then the `Intl` locale, finally `en`; you can also pin Chinese / English / Russian. The "follow" state for language and theme is held by the host, so it is not duplicated per device.
|
|
99
112
|
|
|
100
113
|
- **Event log**: the settings page shows recent events and "why it did not shut down last time"; the full stream is in `data/events.log`.
|
|
101
114
|
|
|
@@ -107,12 +120,12 @@ The card is currently pinned to this sidebar slot. A future version plans to mak
|
|
|
107
120
|
|:---------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------:|
|
|
108
121
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/12-settings-dark.png" width="380"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/13-settings-light.png" width="380"> |
|
|
109
122
|
|
|
110
|
-
|
|
123
|
+
Four tabs: **Appearance** / **Vigil** / **Notifications** / **Status**. It opens on Appearance, and every switch takes effect immediately.
|
|
111
124
|
|
|
112
|
-
- **
|
|
113
|
-
- "All sessions idle" is the floor condition, always on and not switchable.
|
|
114
|
-
-
|
|
115
|
-
-
|
|
125
|
+
- **Appearance**: five rows, no group header — the three thumbnail cards (Minimal / Radar / Terminal, the picture following the UI language and the lightness of the surface), theme (follow / dark / light / Claude Style), collapse by default, compact floating window, UI language.
|
|
126
|
+
- **Vigil**: the "custom profiles" switch sits alone at the top, outside any group; turning it on reveals the **Profiles** group, which lists the default profile and every custom one with switch, make-default, rename and delete, plus **+ New** at the end. Below it, the **Watch behaviour** group puts the four gate rows ahead of AFK: "All sessions idle" is the floor condition, always on and not switchable; "Background jobs finished" blocks background jobs; "skip this round if any session errored" blocks erroring batches; the countdown length is only editable in a custom profile. "AFK auto-answer" comes last and states "replies never select an option for you; turn this off and questions come to you as usual."
|
|
127
|
+
- **Notifications**: one group — a master switch plus four per-kind switches (countdown started / shutting down / first block / block recovered). Arming, disarming and cancelling by hand stay silent.
|
|
128
|
+
- **Status**: one group — current block, why it did not shut down last time, recent events.
|
|
116
129
|
|
|
117
130
|
## Light and third-party themes
|
|
118
131
|
|
|
@@ -120,7 +133,7 @@ Three groups: Appearance / When to shut down / Status. Every switch takes effect
|
|
|
120
133
|
|:-----------------------------------------------------:|:------------------------------------------------------:|
|
|
121
134
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/14-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/15-claude.png" width="250"> |
|
|
122
135
|
|
|
123
|
-
The card does not inherit the host palette; it brings its own, while the settings page follows the host theme.
|
|
136
|
+
The card does not inherit the host palette; it brings its own, while the settings page follows the host theme. Claude Style in that row does not need the plugin first: without dsh-claude-style the card uses a built-in look-alike palette (terracotta) and a grey note appears under the theme row; install the plugin and it follows the live palette instead, the note gone. If the plugin is installed but set to `palette: host`, you get our own amber palette — not the terracotta.
|
|
124
137
|
|
|
125
138
|
## Installation
|
|
126
139
|
|
|
@@ -164,16 +177,54 @@ While AFK auto-pilot is on, the plugin answers the agent's questions and injects
|
|
|
164
177
|
|
|
165
178
|
## Configuration
|
|
166
179
|
|
|
167
|
-
|
|
180
|
+
Configuration has two layers: one **default profile** and any number of **custom profiles**. Each profile carries its own countdown length, both gate switches, AFK and the four notification switches.
|
|
181
|
+
|
|
182
|
+
Three sources, lowest priority first:
|
|
183
|
+
|
|
184
|
+
1. `cordis.patch.yml` (the shipped patch inside the plugin package)
|
|
185
|
+
2. `data/config.json` (persisted at runtime; whatever the settings page changes lands here)
|
|
186
|
+
3. `POST /config` (runtime change, also persisted)
|
|
187
|
+
|
|
188
|
+
### Why the default profile is locked
|
|
189
|
+
|
|
190
|
+
The default profile is **everyone's safe floor**: 60 seconds, wait for background jobs, skip erroring batches — all hard-wired, not editable. The reasoning is practical:
|
|
191
|
+
|
|
192
|
+
- 60 seconds is the shortest window in which you can still see the card and hit cancel; at 10 seconds the cost of an accidental shutdown dwarfs the minute you saved.
|
|
193
|
+
- Because the default cannot drift, you can always switch back to it without wondering whether your last tweak is still in effect.
|
|
194
|
+
- Want something else? Fine — but you have to create a custom profile explicitly, and the edit lands there, never on the floor.
|
|
195
|
+
|
|
196
|
+
### Creating a custom profile
|
|
197
|
+
|
|
198
|
+
Settings → **Appearance** → **Profiles** → `+ New`: it copies the current profile, you name it (≤24 characters) and save; it becomes the active profile.
|
|
199
|
+
|
|
200
|
+
- A fresh install has exactly one profile, the default one. The second one has to be created with `+ New` — no empty slots are pre-seeded.
|
|
201
|
+
- Turn the "custom profiles" switch off and back on, and you land on the profile you were using; if that one was deleted in the meantime, you stay on the default profile.
|
|
202
|
+
- On upgrade, slots you never touched are cleaned up. A profile you renamed, or one whose switches you changed at least once, is kept.
|
|
203
|
+
- Every custom profile can be made the default, renamed, or deleted.
|
|
204
|
+
- Deleting the profile in use falls back to the default profile, with a confirmation first.
|
|
205
|
+
- When the "custom profiles" master switch is off, no custom profile applies and the default is used.
|
|
206
|
+
|
|
207
|
+
### Keys
|
|
208
|
+
|
|
209
|
+
These live per profile:
|
|
168
210
|
|
|
169
211
|
| Key | Range | Default | Description |
|
|
170
212
|
| --------------- | ------ | ------ | ----------------------------------------- |
|
|
171
213
|
| `countdownSec` | 10–600 | 60 | Seconds of countdown before shutdown (fixed at 60 in the default profile, not editable) |
|
|
172
|
-
| `marginSec` | 0–60 | 5 | Extra margin passed to `shutdown /t` |
|
|
173
214
|
| `onlyOnSuccess` | bool | `true` | Skip the shutdown when any session in this batch errored |
|
|
174
215
|
| `blockOnJobs` | bool | `true` | Skip the shutdown while background jobs are running |
|
|
175
216
|
| `afkAutoAnswer` | bool | `true` | Answer questions and perform error recovery for the user while armed |
|
|
176
|
-
| `
|
|
217
|
+
| `notify` | object | all `true` | The four notification switches: `countdown` / `fired` / `blocked` / `recovered` |
|
|
218
|
+
|
|
219
|
+
Global (not tied to a profile):
|
|
220
|
+
|
|
221
|
+
| Key | Range | Default | Description |
|
|
222
|
+
| ---------- | ------ | ------ | ---- |
|
|
223
|
+
| `language` | enum | `auto` | UI language; `auto` follows the system language (`LC_ALL` / `LC_MESSAGES` / `LANG` → `Intl` → `en`), or pin it to `zh` / `en` / `ru` |
|
|
224
|
+
| `customEnabled` | bool | `false` | Whether custom profiles may be used |
|
|
225
|
+
| `activeProfileId` | string | `default` | The profile currently in effect |
|
|
226
|
+
|
|
227
|
+
`marginSec` (0–60, default 5) adds extra headroom to `shutdown /t`.
|
|
177
228
|
|
|
178
229
|
### Retry policies
|
|
179
230
|
|
|
@@ -199,7 +250,7 @@ retryPolicies:
|
|
|
199
250
|
|
|
200
251
|
An unknown `code` falls back to `transient`; malformed policies are dropped and the defaults are kept. The currently effective assignments are available from `retryAssign` and `retryPolicies` in `/state`.
|
|
201
252
|
|
|
202
|
-
UI preferences live in the browser's `localStorage
|
|
253
|
+
**Where preferences live**: card look, theme and collapse are pure UI preferences and live in the browser's `localStorage` (`dsh-shutdown-guard.variant` / `.theme` / `.folded`); the compact floating window and the four notification switches are owned by the host (`data/ui.json`); language and the profile keys land in `data/config.json`.
|
|
203
254
|
|
|
204
255
|
## HTTP API
|
|
205
256
|
|
package/README.md
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
<p align="center"><img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/banner.png" width="880" alt="Shutdown Guard — 任务完成后自动关机,侧边栏守夜卡片"></p>
|
|
5
5
|
|
|
6
|
-
[](CHANGELOG.md)
|
|
7
7
|
[](https://ltayshark0637.github.io/dsh-Shutdown-Guard/demo.html)
|
|
8
8
|
[](https://github.com/deepseek-ai)
|
|
9
9
|
[](#约束)
|
|
10
10
|
[](LICENSE)
|
|
11
|
+
[](https://dshbase.com/plugins/dsh-shutdown-guard/) [](https://awesome-dsh-plugin.com/p/ltayshark0637/dsh-Shutdown-Guard/)
|
|
11
12
|
|
|
12
13
|
为 DeepSeek Harness 中的侧边栏添加「所有任务完成后自动关机」卡片,拥有更好且多样的视觉效果、判定逻辑与个性化定制。位于「技能中心」下方、会话列表上方,随任务状态实时变化。
|
|
13
14
|
|
|
@@ -33,16 +34,24 @@
|
|
|
33
34
|
|
|
34
35
|
## 三种外观
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
37
|
+
同一种外观,浅色与深色各一张;三语版本的截图在 `docs/screenshots/` 里按 `<序号>-armed-<外观>-<语言>-<主题>.png` 命名。
|
|
38
|
+
|
|
39
|
+
| 极简(浅色) | 雷达(浅色) | 终端(浅色) |
|
|
40
|
+
|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|
|
|
41
|
+
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/01-armed-a-zh-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/07-armed-b-zh-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/13-armed-c-zh-light.png" width="250"> |
|
|
42
|
+
|
|
43
|
+
| 极简(深色) | 雷达(深色) | 终端(深色) |
|
|
44
|
+
|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|
|
|
45
|
+
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/02-armed-a-zh-dark.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/08-armed-b-zh-dark.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/14-armed-c-zh-dark.png" width="250"> |
|
|
46
|
+
| 大标题 + 一句话说明,底部滚动的警示带(待命时红黄) | 雷达 + 状态行,会话与后台任务以圆点呈现 | 三行终端:命令、计数、等待,下面六段判定条件指示灯 |
|
|
40
47
|
|
|
41
48
|
雷达里的圆点按数量增删、不重排:数量变化时,你正在看的那几个点不会跳位置。
|
|
42
49
|
|
|
50
|
+
卡片和悬浮窗底部的警示带都跟着状态走:默认配色下,未武装或被阻断时是同色相的深浅两档,安静不抢眼;从武装开始,一直到真正执行关机为止,回到经典的红黄斜纹。切换是 280ms 的渐变,不会闪。Claude Style 与 DeepSeek 蓝这两档配色不切红黄,全程跟着各自的主题色走——红黄在它们那儿是撞色。
|
|
51
|
+
|
|
43
52
|
<p align="center"><img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/anim-radar.gif" width="330" alt="雷达扫描"></p>
|
|
44
53
|
|
|
45
|
-
|
|
54
|
+
在设置的「外观」标签页里,三张缩略图卡片各代表一种外观,点一下立即生效,无需重启;缩略图会跟着当前界面语言与背景深浅自动换成对应的一张。
|
|
46
55
|
|
|
47
56
|
## 六种运行状态
|
|
48
57
|
|
|
@@ -87,15 +96,19 @@
|
|
|
87
96
|
|:-------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------:|
|
|
88
97
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/10-sidebar-hold.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/11-sidebar-fire.png" width="250"> |
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
卡片默认固定在侧边栏的这个位置;点卡头右侧的按钮可拉成独立悬浮窗口,切到别的会话也看得见(见下方「其他」)。
|
|
91
100
|
|
|
92
101
|
## 其他
|
|
93
102
|
|
|
103
|
+
- **悬浮窗口**:点卡片右上角按钮可把状态面板拉成独立悬浮窗口,切到别的会话也看得见。设置里的「悬浮窗简洁模式」默认开启,只留状态与倒计时;关掉后显示完整面板。
|
|
104
|
+
|
|
94
105
|
- **纵向折叠**:收起只留标题和状态,点标题展开。
|
|
95
106
|
|
|
96
107
|
<img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/16-folded.png" width="250" align="right" alt="折叠态">
|
|
97
108
|
|
|
98
|
-
- **主题自适应**:卡片自带 `--dsp-*` 调色板,按宿主表面亮度自动取深浅色;也可强制锁定深色 / 浅色 / Claude Style
|
|
109
|
+
- **主题自适应**:卡片自带 `--dsp-*` 调色板,按宿主表面亮度自动取深浅色;也可强制锁定深色 / 浅色 / Claude Style 配色。设置页则始终跟宿主主题走。
|
|
110
|
+
|
|
111
|
+
- **语言**:默认「跟随系统」,取 `LC_ALL` / `LC_MESSAGES` / `LANG`,再退到 `Intl` 区域设置,最后回落 `en`;也可固定为中文 / English / Русский。语言与主题的「跟随」状态由宿主持有,换设备不会各存一份。
|
|
99
112
|
|
|
100
113
|
- **事件日志**:设置页里能看最近的事件与「上次为什么没关机」,完整流水在 `data/events.log`。
|
|
101
114
|
|
|
@@ -107,12 +120,12 @@
|
|
|
107
120
|
|:---------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------:|
|
|
108
121
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/12-settings-dark.png" width="380"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/13-settings-light.png" width="380"> |
|
|
109
122
|
|
|
110
|
-
|
|
123
|
+
分四个标签页:**外观** / **守夜** / **通知** / **状态**。打开时停在外观页,所有开关立即生效。
|
|
111
124
|
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
125
|
+
- **外观**:一页五行,没有组标题——三张带缩略图的卡片样式(极简 / 雷达 / 终端,缩略图随界面语言与宿主背景深浅换图)、主题(跟随 / 深色 / 浅色 / Claude Style)、默认折叠、悬浮窗简洁模式、界面语言。
|
|
126
|
+
- **守夜**:最上面是「自定义配置」开关,独立一行、不挂在任何组下;打开后才出现「配置」组,里面是默认配置与各份自定义配置的列表,可切换、设为默认、重命名、删除,末尾是「+ 新建」。再往下是「守夜行为」组,四行判定闸排在 AFK 之前:「会话都停下来」是底线条件,始终开启,不可关;「后台任务跑完」挡后台任务;「有会话报错就跳过这一轮」挡出错批次;「倒计时时长」仅自定义配置可调。最后是「AFK 自动回答」,说明里写明「回复不会替你选中任何选项,关闭后提问照常弹给你」。
|
|
127
|
+
- **通知**:一个组,状态变化通知总开关 + 四类分开关(进入倒计时 / 即将关机 / 首次阻断 / 阻断恢复);手动武装、解除、取消不提醒。
|
|
128
|
+
- **状态**:一个组,当前阻断、上次为什么没关机、最近事件。
|
|
116
129
|
|
|
117
130
|
## 浅色与第三方主题
|
|
118
131
|
|
|
@@ -120,7 +133,7 @@
|
|
|
120
133
|
|:-----------------------------------------------------:|:------------------------------------------------------:|
|
|
121
134
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/14-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/15-claude.png" width="250"> |
|
|
122
135
|
|
|
123
|
-
|
|
136
|
+
卡片不套用宿主配色,自带调色板;设置页则跟宿主主题走。主题里的 Claude Style 不必先装插件:没装 dsh-claude-style 时用的是内置的近似配色(陶土橙),主题行下面会多一行灰字说明;装上插件后自动跟随它的实时配色,那行说明随即消失。插件装了、但把 palette 设成 host 的,用的是我们自己的琥珀配色,不会是陶土橙。
|
|
124
137
|
|
|
125
138
|
## 安装
|
|
126
139
|
|
|
@@ -164,16 +177,54 @@ AFK 自动接管开启时,插件会在武装期间替你回答 agent 的提问
|
|
|
164
177
|
|
|
165
178
|
## 配置
|
|
166
179
|
|
|
167
|
-
|
|
180
|
+
配置分两层:**默认配置**一份,**自定义配置**任意多份。每份配置各自带倒计时时长、两条判定开关、AFK 与四类通知开关。
|
|
181
|
+
|
|
182
|
+
三处来源,优先级从低到高:
|
|
183
|
+
|
|
184
|
+
1. `cordis.patch.yml`(插件包内的出厂 patch)
|
|
185
|
+
2. `data/config.json`(运行时持久化,设置页改的东西落在这里)
|
|
186
|
+
3. `POST /config`(运行时改,改动同样落盘)
|
|
187
|
+
|
|
188
|
+
### 默认配置为什么锁定
|
|
189
|
+
|
|
190
|
+
默认配置是**所有人的安全底线**:60 秒倒计时、等后台任务、出错跳过,这三条被写死在默认配置里,改不了。理由很实际——
|
|
191
|
+
|
|
192
|
+
- 60 秒是「看到卡片还能点取消」的最短窗口;调到 10 秒,误关机的代价远大于省下的那一分钟。
|
|
193
|
+
- 默认配置被锁死后,你随时可以把它切回来,不用担心自己上一次调过的参数还在生效。
|
|
194
|
+
- 想改?可以,但必须显式新建一份自定义配置,改的也是那一份,不污染底线。
|
|
195
|
+
|
|
196
|
+
### 怎么新建自定义配置
|
|
197
|
+
|
|
198
|
+
设置页 → **外观** → **配置** → `+ 新建`:从当前配置复制一份,起个名字(≤24 字),保存即成为当前配置。
|
|
199
|
+
|
|
200
|
+
- 新装只有一份「默认配置」。要第二份就点 `+ 新建`,不会再预先塞几个空槽。
|
|
201
|
+
- 「自定义配置」关掉再打开,会回到关之前用的那一份;那一份已被删除的话,停在默认配置。
|
|
202
|
+
- 升级时,从头到尾没动过的空槽会被清理掉;改过名字、或动过其中任一开关的配置都会保留。
|
|
203
|
+
- 每份自定义配置都能「设为默认」(之后新会话默认用它)、「重命名」、「删除」。
|
|
204
|
+
- 删除当前正在用的一份会回落到默认配置,删除前会二次确认。
|
|
205
|
+
- 「自定义配置」总开关关掉时,所有自定义配置不可用,运行时一律按默认配置走。
|
|
206
|
+
|
|
207
|
+
### 配置项
|
|
208
|
+
|
|
209
|
+
以下键在每份配置里各存一份:
|
|
168
210
|
|
|
169
211
|
| 键 | 范围 | 默认 | 说明 |
|
|
170
212
|
| --------------- | ------ | ------ | ----------------------------------------- |
|
|
171
|
-
| `countdownSec` | 10–600 | 60 |
|
|
172
|
-
| `marginSec` | 0–60 | 5 | 传给 `shutdown /t` 的额外余量 |
|
|
213
|
+
| `countdownSec` | 10–600 | 60 | 关机前倒计时秒数(默认配置固定 60,不可改) |
|
|
173
214
|
| `onlyOnSuccess` | bool | `true` | 本批次有会话报错时跳过关机 |
|
|
174
215
|
| `blockOnJobs` | bool | `true` | 有运行中的后台任务时跳过关机 |
|
|
175
216
|
| `afkAutoAnswer` | bool | `true` | 武装期间替用户回答提问、做错误恢复 |
|
|
176
|
-
| `
|
|
217
|
+
| `notify` | 对象 | 全 `true` | 四类通知开关:`countdown` / `fired` / `blocked` / `recovered` |
|
|
218
|
+
|
|
219
|
+
全局(不属于某份配置):
|
|
220
|
+
|
|
221
|
+
| 键 | 范围 | 默认 | 说明 |
|
|
222
|
+
| --------- | ------ | ------ | ---- |
|
|
223
|
+
| `language` | 枚举 | `auto` | 界面语言;`auto` 跟随系统语言(`LC_ALL` / `LC_MESSAGES` / `LANG` → `Intl` → `en`),也可固定为 `zh` / `en` / `ru` |
|
|
224
|
+
| `customEnabled` | bool | `false` | 是否允许使用自定义配置 |
|
|
225
|
+
| `activeProfileId` | string | `default` | 当前生效的配置 id |
|
|
226
|
+
|
|
227
|
+
此外 `marginSec`(0–60,默认 5)用于给 `shutdown /t` 留额外余量。
|
|
177
228
|
|
|
178
229
|
### 重试策略
|
|
179
230
|
|
|
@@ -199,7 +250,7 @@ retryPolicies:
|
|
|
199
250
|
|
|
200
251
|
未知 `code` 回落 `transient`;形状写错的策略会被丢弃并保留默认值。当前生效的分配可从 `/state` 的 `retryAssign`、`retryPolicies` 读到。
|
|
201
252
|
|
|
202
|
-
|
|
253
|
+
**偏好存在哪**:卡片样式 / 主题 / 折叠属于纯界面偏好,存在浏览器 `localStorage`(`dsh-shutdown-guard.variant` / `.theme` / `.folded`);悬浮窗简洁模式与四类通知开关由宿主持有(`data/ui.json`);语言与配置项落在 `data/config.json`。
|
|
203
254
|
|
|
204
255
|
## HTTP 接口
|
|
205
256
|
|
package/README.ru.md
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
<p align="center"><img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/banner.png" width="880" alt="Shutdown Guard — автоматическое выключение после завершения задач, ночная карточка на боковой панели"></p>
|
|
5
5
|
|
|
6
|
-
[](CHANGELOG.md)
|
|
7
7
|
[](https://ltayshark0637.github.io/dsh-Shutdown-Guard/demo.html)
|
|
8
8
|
[](https://github.com/deepseek-ai)
|
|
9
9
|
[](#ограничения)
|
|
10
10
|
[](LICENSE)
|
|
11
|
+
[](https://dshbase.com/plugins/dsh-shutdown-guard/) [](https://awesome-dsh-plugin.com/p/ltayshark0637/dsh-Shutdown-Guard/)
|
|
11
12
|
|
|
12
13
|
Добавляет в боковую панель DeepSeek Harness карточку «выключить компьютер после завершения всех задач» — с более разнообразным и качественным оформлением, логикой принятия решения и настройкой под себя. Карточка расположена под «Центром навыков» и над списком сессий и обновляется в реальном времени вместе с состоянием задач.
|
|
13
14
|
|
|
@@ -33,16 +34,24 @@
|
|
|
33
34
|
|
|
34
35
|
## Три варианта оформления
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
37
|
+
Один и тот же вариант в светлой и тёмной теме; снимки на трёх языках лежат в `docs/screenshots/` под именами `<nn>-armed-<вариант>-<язык>-<тема>.png`.
|
|
38
|
+
|
|
39
|
+
| Минимальный (светлая) | Радар (светлая) | Терминал (светлая) |
|
|
40
|
+
|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|
|
|
41
|
+
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/05-armed-a-ru-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/11-armed-b-ru-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/17-armed-c-ru-light.png" width="250"> |
|
|
42
|
+
|
|
43
|
+
| Минимальный (тёмная) | Радар (тёмная) | Терминал (тёмная) |
|
|
44
|
+
|:------------------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------:|
|
|
45
|
+
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/06-armed-a-ru-dark.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/12-armed-b-ru-dark.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/18-armed-c-ru-dark.png" width="250"> |
|
|
46
|
+
| Крупный заголовок + одна строка пояснения, внизу бегущая лента (красно-жёлтая, пока карточка на посту) | Радар + строка состояния, сессии и фоновые задачи показаны точками | Три строки терминала (команда, счётчики, ожидание) над шестью индикаторами условий |
|
|
40
47
|
|
|
41
48
|
Точки на радаре только добавляются и удаляются, но не переставляются: при изменении количества те точки, на которые вы смотрите, не прыгают на другие места.
|
|
42
49
|
|
|
50
|
+
Лента по нижнему краю карточки и плавающего окна меняется вместе с состоянием: в штатных палитрах, пока карточка выключена или заблокирована, она держится в двух спокойных оттенках цвета темы; с момента включения режима и до самого выключения возвращаются привычные красно-жёлтые полосы. Смена идёт плавно, за 280 мс, без вспышек. В палитрах Claude Style и DeepSeek Blue лента на красно-жёлтое не переключается и всё время следует за цветом темы — там полосы просто спорят с остальным.
|
|
51
|
+
|
|
43
52
|
<p align="center"><img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/anim-radar.gif" width="330" alt="Сканирование радара"></p>
|
|
44
53
|
|
|
45
|
-
Переключается
|
|
54
|
+
Переключается на вкладке «Оформление»: три карточки с миниатюрами, щелчок применяется сразу, перезапуск не нужен; миниатюра меняется вместе с языком интерфейса и светлотой фона.
|
|
46
55
|
|
|
47
56
|
## Шесть состояний работы
|
|
48
57
|
|
|
@@ -87,15 +96,19 @@
|
|
|
87
96
|
|:-------------------------------------------------------------------------------------------:|:---------------------------------------------------------------------------------------:|
|
|
88
97
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/10-sidebar-hold.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/11-sidebar-fire.png" width="250"> |
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
По умолчанию карточка закреплена именно в этом месте боковой панели; кнопка в её заголовке открывает карточку как отдельное плавающее окно, которое остаётся на виду при переключении сессий (см. «Прочее» ниже).
|
|
91
100
|
|
|
92
101
|
## Прочее
|
|
93
102
|
|
|
103
|
+
- **Плавающее окно**: кнопка в правом верхнем углу карточки открывает панель состояния в отдельном окне — она остаётся на виду, даже когда вы переключились на другую сессию. Переключатель «компактное плавающее окно» в настройках включён по умолчанию и оставляет только статус и обратный отсчёт; выключите его, чтобы видеть полную панель.
|
|
104
|
+
|
|
94
105
|
- **Вертикальное сворачивание**: в свёрнутом виде остаются только заголовок и статус; нажмите на заголовок, чтобы развернуть.
|
|
95
106
|
|
|
96
107
|
<img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/16-folded.png" width="250" align="right" alt="Свёрнутое состояние">
|
|
97
108
|
|
|
98
|
-
- **Адаптация к теме**: у карточки собственная палитра `--dsp-*`, светлые и тёмные цвета выбираются автоматически по яркости поверхности хоста; можно также принудительно задать тёмную / светлую / Claude Style.
|
|
109
|
+
- **Адаптация к теме**: у карточки собственная палитра `--dsp-*`, светлые и тёмные цвета выбираются автоматически по яркости поверхности хоста; можно также принудительно задать тёмную / светлую / Claude Style. Страница настроек всегда следует теме хоста.
|
|
110
|
+
|
|
111
|
+
- **Язык**: по умолчанию «как в системе» — `LC_ALL` / `LC_MESSAGES` / `LANG`, затем региональные настройки `Intl`, в последнюю очередь `en`; можно закрепить китайский / английский / русский. Состояние «следовать» для языка и темы хранит хост, поэтому оно не дублируется на каждом устройстве.
|
|
99
112
|
|
|
100
113
|
- **Журнал событий**: на странице настроек видны последние события и «почему в прошлый раз не выключилось»; полный поток — в `data/events.log`.
|
|
101
114
|
|
|
@@ -107,12 +120,12 @@
|
|
|
107
120
|
|:---------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------:|
|
|
108
121
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/12-settings-dark.png" width="380"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/13-settings-light.png" width="380"> |
|
|
109
122
|
|
|
110
|
-
|
|
123
|
+
Четыре вкладки: **Оформление** / **Охрана** / **Уведомления** / **Состояние**. Открывается на «Оформлении», все переключатели действуют сразу.
|
|
111
124
|
|
|
112
|
-
-
|
|
113
|
-
- «Все сессии остановились» — базовое условие, включено всегда и не
|
|
114
|
-
-
|
|
115
|
-
-
|
|
125
|
+
- **Оформление**: пять строк без заголовка группы — три карточки с миниатюрами («Минимальный» / «Радар» / «Терминал», миниатюра подбирается по языку интерфейса и светлоте фона), тема (как в системе / тёмная / светлая / Claude Style), сворачивание по умолчанию, компактное плавающее окно, язык интерфейса.
|
|
126
|
+
- **Охрана**: сверху отдельной строкой, вне групп, стоит переключатель «пользовательские профили»; когда он включён, появляется группа **Профили** — список профиля по умолчанию и всех пользовательских с переключением, назначением по умолчанию, переименованием и удалением, в конце **+ Создать**. Ниже группа **Поведение охраны** ставит четыре строки условий перед AFK: «Все сессии остановились» — базовое условие, включено всегда и не отключается; «Фоновые задачи завершены» блокирует фоновые задачи; «пропустить этот раунд при ошибке в сессии» блокирует партии с ошибками; длительность обратного отсчёта меняется только в пользовательском профиле. Последним идёт «Автоответ в AFK»: «ответы не выбирают за вас ни один вариант; после отключения вопросы снова приходят вам».
|
|
127
|
+
- **Уведомления**: одна группа — общий переключатель и четыре отдельных (начался отсчёт / выключение сейчас / первая блокировка / блокировка снята). Ручное включение охраны, снятие и отмена отсчёта не уведомляют.
|
|
128
|
+
- **Состояние**: одна группа — текущая блокировка, почему в прошлый раз не выключилось, последние события.
|
|
116
129
|
|
|
117
130
|
## Светлая тема и сторонние темы
|
|
118
131
|
|
|
@@ -120,7 +133,7 @@
|
|
|
120
133
|
|:-----------------------------------------------------:|:------------------------------------------------------:|
|
|
121
134
|
| <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/14-light.png" width="250"> | <img src="https://cdn.jsdelivr.net/gh/ltayshark0637/dsh-Shutdown-Guard@main/docs/screenshots/15-claude.png" width="250"> |
|
|
122
135
|
|
|
123
|
-
Карточка не наследует палитру хоста, у неё своя; страница настроек следует теме хоста.
|
|
136
|
+
Карточка не наследует палитру хоста, у неё своя; страница настроек следует теме хоста. Для Claude Style в этой строке плагин заранее не нужен: без dsh-claude-style карточка берёт встроенную похожую палитру (терракота), а под строкой темы появляется серая пояснительная строка; после установки плагина цвета подхватываются у него, и пояснение исчезает. Если плагин стоит, но у него выставлено `palette: host`, берётся наша янтарная палитра — не терракота.
|
|
124
137
|
|
|
125
138
|
## Установка
|
|
126
139
|
|
|
@@ -164,16 +177,54 @@ dsh plugin --profile web add github:ltayshark0637/dsh-Shutdown-Guard
|
|
|
164
177
|
|
|
165
178
|
## Настройка
|
|
166
179
|
|
|
167
|
-
|
|
180
|
+
Настройка делится на два уровня: один **профиль по умолчанию** и любое число **пользовательских профилей**. У каждого профиля свои длительность отсчёта, оба условия-«ворота», AFK и четыре переключателя уведомлений.
|
|
181
|
+
|
|
182
|
+
Три источника, от низкого приоритета к высокому:
|
|
183
|
+
|
|
184
|
+
1. `cordis.patch.yml` (заводской патч внутри пакета плагина)
|
|
185
|
+
2. `data/config.json` (сохраняется во время работы; сюда попадает всё, что меняется на странице настроек)
|
|
186
|
+
3. `POST /config` (изменение во время работы, тоже сохраняется)
|
|
187
|
+
|
|
188
|
+
### Почему профиль по умолчанию зафиксирован
|
|
189
|
+
|
|
190
|
+
Профиль по умолчанию — **безопасная нижняя граница для всех**: 60 секунд, ждать фоновые задачи, пропускать партии с ошибками — всё зашито, менять нельзя. Причины практические:
|
|
191
|
+
|
|
192
|
+
- 60 секунд — самое короткое окно, в котором вы ещё успеваете увидеть карточку и нажать отмену; при 10 секундах цена случайного выключения намного больше сэкономленной минуты.
|
|
193
|
+
- Раз профиль по умолчанию не дрейфует, к нему всегда можно вернуться, не гадая, действует ли ещё прошлая правка.
|
|
194
|
+
- Нужно иначе? Можно, но придётся явно создать пользовательский профиль — правка уйдёт в него, а не в нижнюю границу.
|
|
195
|
+
|
|
196
|
+
### Как создать пользовательский профиль
|
|
197
|
+
|
|
198
|
+
Настройки → **Оформление** → **Профили** → `+ Создать`: профиль копируется из текущего, вы задаёте имя (до 24 символов) и сохраняете — он становится активным.
|
|
199
|
+
|
|
200
|
+
- При чистой установке есть ровно один профиль — по умолчанию. Второй создаётся через `+ Создать`; пустые слоты заранее больше не заводятся.
|
|
201
|
+
- Если выключить переключатель «пользовательские профили» и снова включить, вы вернётесь к тому профилю, которым пользовались; если его успели удалить — останетесь на профиле по умолчанию.
|
|
202
|
+
- При обновлении слоты, которых вы ни разу не касались, вычищаются. Профиль, который вы переименовали или в котором меняли хотя бы один переключатель, сохраняется.
|
|
203
|
+
- Любой пользовательский профиль можно сделать профилем по умолчанию, переименовать или удалить.
|
|
204
|
+
- Удаление используемого профиля возвращает профиль по умолчанию; перед удалением запрашивается подтверждение.
|
|
205
|
+
- Когда общий переключатель «пользовательские профили» выключен, ни один пользовательский профиль не применяется и используется профиль по умолчанию.
|
|
206
|
+
|
|
207
|
+
### Ключи
|
|
208
|
+
|
|
209
|
+
Эти ключи хранятся в каждом профиле отдельно:
|
|
168
210
|
|
|
169
211
|
| Ключ | Диапазон | По умолчанию | Описание |
|
|
170
212
|
| --------------- | ------ | ------ | ----------------------------------------- |
|
|
171
213
|
| `countdownSec` | 10–600 | 60 | Секунды обратного отсчёта перед выключением (в профиле по умолчанию фиксировано 60, не меняется) |
|
|
172
|
-
| `marginSec` | 0–60 | 5 | Дополнительный запас, передаваемый в `shutdown /t` |
|
|
173
214
|
| `onlyOnSuccess` | bool | `true` | Пропускать выключение при ошибке в любой сессии этой партии |
|
|
174
215
|
| `blockOnJobs` | bool | `true` | Пропускать выключение, пока выполняются фоновые задачи |
|
|
175
216
|
| `afkAutoAnswer` | bool | `true` | Отвечать на вопросы за пользователя и выполнять восстановление после ошибок во время охраны |
|
|
176
|
-
| `
|
|
217
|
+
| `notify` | объект | все `true` | Четыре переключателя уведомлений: `countdown` / `fired` / `blocked` / `recovered` |
|
|
218
|
+
|
|
219
|
+
Глобальные (не привязаны к профилю):
|
|
220
|
+
|
|
221
|
+
| Ключ | Диапазон | По умолчанию | Описание |
|
|
222
|
+
| ---------- | ------ | ------ | ---- |
|
|
223
|
+
| `language` | список | `auto` | Язык интерфейса; `auto` следует языку системы (`LC_ALL` / `LC_MESSAGES` / `LANG` → `Intl` → `en`), можно закрепить `zh` / `en` / `ru` |
|
|
224
|
+
| `customEnabled` | bool | `false` | Разрешено ли использовать пользовательские профили |
|
|
225
|
+
| `activeProfileId` | string | `default` | Профиль, который действует сейчас |
|
|
226
|
+
|
|
227
|
+
Кроме того, `marginSec` (0–60, по умолчанию 5) добавляет запас к `shutdown /t`.
|
|
177
228
|
|
|
178
229
|
### Политики повторов
|
|
179
230
|
|
|
@@ -199,7 +250,7 @@ retryPolicies:
|
|
|
199
250
|
|
|
200
251
|
Неизвестный `code` откатывается к `transient`; политики с неверной структурой отбрасываются, а значения по умолчанию сохраняются. Действующие назначения можно прочитать из `retryAssign` и `retryPolicies` в `/state`.
|
|
201
252
|
|
|
202
|
-
|
|
253
|
+
**Где хранятся предпочтения**: оформление карточки, тема и сворачивание — чисто интерфейсные настройки, они лежат в браузерном `localStorage` (`dsh-shutdown-guard.variant` / `.theme` / `.folded`); компактное плавающее окно и четыре переключателя уведомлений принадлежат хосту (`data/ui.json`); язык и ключи профилей попадают в `data/config.json`.
|
|
203
254
|
|
|
204
255
|
## HTTP-интерфейс
|
|
205
256
|
|