dsh-autorestart 0.6.2 → 0.7.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/locale/zh.json CHANGED
@@ -1,48 +1,99 @@
1
1
  {
2
- "meta": {
3
- "title": "Autorestart — 重启续接",
4
- "description": "让 Agent 的工作跨 DSH 重启不中断:持久检查点、启动时重新武装目标或注入续接消息,以及 Agent 可自行请求的“空闲即重启”。"
5
- },
6
- "backupChoice": {
7
- "title": "重启前自动备份:要不要把已安装的插件也一起备份?",
8
- "body": "每次重启前会快照当前配置,万一重启后起不来就能自动回退。",
9
- "withPlugins": "配置 + 已安装插件",
10
- "withPluginsHint": "多约 3 秒、约 117 MB;插件把启动搞坏时也能回退。",
11
- "configOnly": "只备份配置",
12
- "configOnlyHint": "瞬间完成、约 66 KB;插件问题无法回退,需要手动重装。",
13
- "footnote": "以后可在 设置 → 自动重启与关机 修改",
14
- "pickPrimary": "用这个",
15
- "pickSecondary": "只备份配置",
16
- "recommended": "推荐",
17
- "dismissAria": "关闭这个一次性提示"
18
- },
19
- "settings": {
20
- "nav": "自动重启与关机",
21
- "groups": {
22
- "restart": "重启相关设置",
23
- "shutdown": "关机相关设置"
24
- },
25
- "seconds": {
26
- "label": "关机倒数秒数",
27
- "immediate": "不倒数(立即关机)",
28
- "value": "{n} 秒",
29
- "hint": "所有会话收工后,屏幕上会显示这段倒数(可点「不关了」取消),数完才关机;想要更多落盘时间就把倒数调大。"
30
- },
31
- "restartGrace": {
32
- "label": "重启前等待",
33
- "immediate": "不等(立即重启)",
34
- "value": "{n} 秒",
35
- "hint": "重启没有倒数环节,会话一收工就会立刻重启;如果你装了“会话结束后才写”的记忆/总结类插件,把这里调大(默认 0 秒)。"
36
- },
37
- "backup": {
38
- "label": "重启前备份",
39
- "hint": "每次重启前先快照一次当前配置;万一重启后起不来,能自动回退。"
40
- },
41
- "backupPlugins": {
42
- "label": "备份包含已安装插件",
43
- "hint": "关闭后只备份 DSH 自身状态,不含 profile 里的插件目录。"
44
- },
45
- "error": "没能保存设置:{message}"
2
+ "label": "待重启",
3
+ "busyPrefix": " · 等待 ",
4
+ "busySuffix": " 个任务结束",
5
+ "idle": " · 空闲后自动重启",
6
+ "goalActive": " · 被某个自动续跑的 goal 占着",
7
+ "goalExhausted": " · 某个任务的 goal 轮次额度已用完,无法续跑",
8
+ "settling": " · 还在等这段安静期",
9
+ "parkedGoals": " · 已停泊 {n} 个 goal,重启后自动继续",
10
+ "parkButton": "停泊并重启",
11
+ "parkButtonAria": "停泊该会话的 goal,并立即请求重启",
12
+ "parkBusy": "停泊中…",
13
+ "parkError": "停泊失败:{message}",
14
+ "tooltip": "等待其他会话空闲后自动重启;重启后会自动继续本会话进度",
15
+ "tooltipBusy": "等待其他任务结束(计数含“排队但还没开始”的任务)后自动重启;重启后本会话会自动继续进度",
16
+ "tooltipWithError": "等待其他会话空闲后自动重启;重启后本会话会自动继续进度。{message}",
17
+ "dotAria": "待重启",
18
+ "panelHeading": "待重启",
19
+ "panelStateBusy": "等待其他会话空闲后重启",
20
+ "panelStateIdle": "等待空闲窗口后重启",
21
+ "panelStateGoalActive": "等待其他会话停泊它自动续跑的 goal",
22
+ "panelStateGoalExhausted": "等待其他会话的 goal(轮次额度已用完)",
23
+ "panelBlockedTitle": "占用会话:{title}",
24
+ "panelBlockedGeneric": "有一个任务正在运行",
25
+ "panelBlockedSession": "会话「{label}」正在运行",
26
+ "panelBlockedSubagent": "{name}正在运行",
27
+ "panelBlockedSubagentGeneric": "有一个子智能体正在运行",
28
+ "panelBlockedSubagentGroup": "会话「{label}」的 {n} 个子智能体正在运行",
29
+ "panelBlockedSubagentGroupGeneric": "有 {n} 个子智能体正在运行",
30
+ "panelBlockedRestartPending": "等这次重启完成后再关机",
31
+ "panelGoalActiveLine": "占用会话「{title}」:goal 正在自动续跑(goal-active)",
32
+ "panelGoalExhaustedLine": "占用会话「{title}」:goal 轮次额度已用完,无法继续(goal-exhausted)",
33
+ "panelParkedTitle": "已停泊的 goal(重启后自动继续):",
34
+ "panelParkedGoal": "会话 {session} · {goal}",
35
+ "panelWaiting": "已等待 {duration}",
36
+ "panelResume": "重启后本会话会自动继续进度",
37
+ "longWaitPill": " · 已等 {duration} · {n} 项任务在跑",
38
+ "longWaitTooltip": "已等 {duration}。在跑:{blockers}",
39
+ "blockerGeneric": "有会话",
40
+ "blockerJoin": "、",
41
+ "blockerGroupSubagents": "{label}({n} 个子智能体)",
42
+ "blockerGroupSubagentsGeneric": "{n} 个子智能体",
43
+ "blockerMore": "…等 {n} 项",
44
+ "blockersTitleLine": "占用会话:{blockers}",
45
+ "durationSeconds": "{n} 秒",
46
+ "durationMinutes": "{n} 分 {m} 秒",
47
+ "durationHours": "{n} 小时 {m} 分",
48
+ "durationMinutesShort": "{n} 分钟",
49
+ "durationHoursShort": "{n} 小时",
50
+ "durationHoursMinutesShort": "{n} 小时 {m} 分",
51
+ "cancelPanelTasks": "这次重启还在等 {n} 个任务结束",
52
+ "cancelPanelOthers": "还有 {n} 个会话也在等这次重启",
53
+ "cancelPanelOthersAfter": "还剩 {n} 个会话在等",
54
+ "cancelPanelAria": "待重启详情",
55
+ "cancelButton": "取消我的这次重启",
56
+ "cancelButtonAria": "取消我的这次重启",
57
+ "cancelConfirmTitle": "取消你的这次重启?",
58
+ "cancelConfirmOnlyMe": "取消后这次重启就不会发生了。",
59
+ "cancelConfirmOthers": "还有 {n} 个会话也在等这次重启——取消只影响你自己,他们仍会重启。",
60
+ "cancelConfirmUnknown": "当前会话未知,无法只撤自己。",
61
+ "cancelConfirmButton": "确认取消",
62
+ "cancelConfirmButtonAria": "确认取消这次重启",
63
+ "cancelDismissButton": "再想想",
64
+ "cancelDismissButtonAria": "算了,不取消",
65
+ "cancelFailed": "没能取消这次重启。",
66
+ "cancelFailedWith": "没能取消这次重启:{message}",
67
+ "cancelNotRequester": "这个会话没有请求这次重启,所以什么都没取消。",
68
+ "cancelNothingPending": "现在没有待重启的请求。",
69
+ "cancelUnknownSession": "当前会话未知,无法只撤自己。",
70
+ "cancelNoRoute": "找不到取消接口(宿主版本太旧)。",
71
+ "backupChoiceTitle": "重启前自动备份:要不要把已安装的插件也一起备份?",
72
+ "backupChoiceBody": "每次重启前会快照当前配置,万一重启后起不来就能自动回退。",
73
+ "backupChoiceWithPlugins": "配置 + 已安装插件",
74
+ "backupChoiceWithPluginsHint": "多约 3 秒、约 117 MB;插件把启动搞坏时也能回退。",
75
+ "backupChoiceConfigOnly": "只备份配置",
76
+ "backupChoiceConfigOnlyHint": "瞬间完成、约 66 KB;插件问题无法回退,需要手动重装。",
77
+ "backupChoiceFootnote": "以后可在 设置 → 自动重启与关机 修改",
78
+ "backupChoicePickPrimary": "用这个",
79
+ "backupChoicePickSecondary": "只备份配置",
80
+ "backupChoiceRecommended": "推荐",
81
+ "backupChoiceDismissAria": "关闭这个一次性提示",
82
+ "backupChoiceError": "保存失败:{message}",
83
+ "supervisor": {
84
+ "title": "让 DSH 自己把自己拉起来?",
85
+ "body": "现在这个 DSH 托管实例是手动/外部启动的——它挂了不会自己回来。我可以给你装一个自带的守护:登录时自动启动,进程掉了自动拉起,启动失败自动回滚上次快照。守护不会碰你的会话数据,只做「拉起 + 看住 + 回滚」三件事。",
86
+ "changes": "会改什么:新增 <stateDir>/supervisor/(守护脚本 + 配置 + 日志 + 锁);Windows 注册一条登录自启记录(计划任务 dsh-autorestart-web),Linux 注册一个 systemd 用户服务。不改:会话数据、模型配置、已装插件。",
87
+ "rights": "需要什么权限:Windows 不需要管理员(用「登录时运行」;若该机策略禁止普通用户建计划任务,会自动降级到「启动文件夹」,同样不需要);Linux 需要能写自己的家目录(systemctl --user,普通用户即可)。",
88
+ "uninstall": "怎么卸:设置页「开机自启 → 卸载」一键;或手动 schtasks /Delete /TN \"dsh-autorestart-web\" /F(Linux:systemctl --user disable --now dsh-autorestart-web.service && rm ~/.config/systemd/user/dsh-autorestart-web.service),两者都要再删掉 <stateDir>/supervisor/ 目录。",
89
+ "install": "帮我装(推荐)",
90
+ "installHint": "会写一个守护脚本到 <stateDir>/supervisor/,并在 Windows 注册一条登录自启记录 / Linux 注册一个 systemd 用户服务。不需要管理员。之后宿主进程退出,守护会在几秒内拉起它;起不来会自动回滚到重启前的快照。随时可以在设置里一键卸载。",
91
+ "keep": "保持我现在的启动方式",
92
+ "keepHint": "什么都不改。你现在用什么启动就继续用什么。代价:宿主进程退出后不会自动回来——重启功能会退化成「只能在有外部守护时生效」。",
93
+ "later": "以后再说",
94
+ "laterHint": "这张卡片不再出现。你可以随时在「设置 → 自动重启与关机 → 开机自启」里手动装。",
95
+ "error": "操作失败:{message}",
96
+ "busy": "正在处理…"
46
97
  },
47
98
  "sleep": {
48
99
  "button": {
@@ -61,26 +112,26 @@
61
112
  },
62
113
  "countdown": {
63
114
  "caption": {
64
- "20": "鲸鱼娘开始收网了",
65
- "19": "备份已经替你打包好",
66
- "18": "没说完的话,再讲一句",
67
- "17": "大家都在慢慢安静下来",
68
- "16": "最后再巡一圈房间",
69
- "15": "海面开始变暗了",
70
- "14": "灯一盏一盏熄了",
71
- "13": "房间已经安静下来",
72
- "12": "还有一小会儿",
73
- "11": "再看一眼屏幕吧",
74
- "10": "鲸鱼娘在数最后几秒",
75
- "9": "灯已经关了一半",
76
- "8": "声音越来越小",
77
- "7": "马上就到道别的时候了",
78
- "6": "最后一口海水",
79
- "5": "晚风越来越轻",
80
- "4": "说声晚安吧",
81
- "3": "真的只剩三秒啦",
82
- "2": "还来得及说声再见",
83
115
  "1": "晚安 🌙",
116
+ "2": "还来得及说声再见",
117
+ "3": "真的只剩三秒啦",
118
+ "4": "说声晚安吧",
119
+ "5": "晚风越来越轻",
120
+ "6": "最后一口海水",
121
+ "7": "马上就到道别的时候了",
122
+ "8": "声音越来越小",
123
+ "9": "灯已经关了一半",
124
+ "10": "鲸鱼娘在数最后几秒",
125
+ "11": "再看一眼屏幕吧",
126
+ "12": "还有一小会儿",
127
+ "13": "房间已经安静下来",
128
+ "14": "灯一盏一盏熄了",
129
+ "15": "海面开始变暗了",
130
+ "16": "最后再巡一圈房间",
131
+ "17": "大家都在慢慢安静下来",
132
+ "18": "没说完的话,再讲一句",
133
+ "19": "备份已经替你打包好",
134
+ "20": "鲸鱼娘开始收网了",
84
135
  "default": "晚安 🌙"
85
136
  },
86
137
  "remaining": "还剩 {n} 秒",
@@ -117,11 +168,143 @@
117
168
  "error": "保存失败:{message}"
118
169
  }
119
170
  },
171
+ "nav": "自动重启与关机",
172
+ "settings": {
173
+ "groups": {
174
+ "restart": "重启相关设置",
175
+ "shutdown": "关机相关设置",
176
+ "supervisor": "开机自启",
177
+ "report": "报告问题"
178
+ },
179
+ "seconds": {
180
+ "label": "关机倒数秒数",
181
+ "immediate": "不倒数(立即关机)",
182
+ "value": "{n} 秒",
183
+ "hint": "所有会话收工后,屏幕上会显示这段倒数(可点「不关了」取消),数完才关机;想要更多落盘时间就把倒数调大。"
184
+ },
185
+ "restartGrace": {
186
+ "label": "重启前等待",
187
+ "hint": "重启没有倒数环节,会话一收工就会立刻重启;如果你装了“会话结束后才写”的记忆/总结类插件,把这里调大(默认 0 秒)。",
188
+ "value": "{n} 秒",
189
+ "immediate": "不等(立即重启)"
190
+ },
191
+ "backup": {
192
+ "label": "重启前备份",
193
+ "hint": "每次重启前先快照一次当前配置;万一重启后起不来,能自动回退。",
194
+ "list": "现在备份了什么",
195
+ "count": "当前 {n} 份",
196
+ "keep": "最多保留 {n} 份,超出自动删最旧的那份。",
197
+ "empty": "还没有备份;每次重启前会自动生成一份。",
198
+ "path": "存放路径",
199
+ "copyPath": "复制路径",
200
+ "copied": "路径已复制",
201
+ "copyFailed": "复制失败,请手动选中上面的路径",
202
+ "withPlugins": "含已装插件",
203
+ "withoutPlugins": "只有配置"
204
+ },
205
+ "backupPlugins": {
206
+ "label": "备份包含已安装插件",
207
+ "hint": "关闭后只备份 DSH 自身状态,不含 profile 里的插件目录。"
208
+ },
209
+ "supervisor": {
210
+ "status": "当前由",
211
+ "installed": "插件守护",
212
+ "external": "你自己的方式",
213
+ "unknown": "未知",
214
+ "off": "关闭",
215
+ "capable": "重启能力",
216
+ "capableYes": "可用:宿主退出后会自动回来",
217
+ "capableNo": "不可用:宿主退出后不会自动回来",
218
+ "install": "装上守护",
219
+ "uninstall": "卸载守护",
220
+ "hint": "守护是一个独立进程:登录时自动启动,宿主进程掉了自动拉起,启动失败自动回滚上次快照。不需要管理员。",
221
+ "noInstallDesktop": "桌面版自带重启,这里不用装守护。",
222
+ "noInstallExternal": "已经有别的守护在管这个宿主:再装一个会两个一起拉起、抢同一个端口,所以这里不提供安装。",
223
+ "noInstallUnknown": "宿主没说清是谁在拉起它,所以这里不提供安装。",
224
+ "access": "当前访问链接",
225
+ "accessHint": "重启后 token 会变,链接也会变。这个链接一直是最新的。",
226
+ "pending": "卸载没有完成,请手动执行:{commands}",
227
+ "reason": "说明",
228
+ "command": "重启命令",
229
+ "derive": "推导重启命令",
230
+ "apply": "就用这条命令",
231
+ "revert": "撤销",
232
+ "noCommand": "推不出可重放的重启命令",
233
+ "plan": "干跑预览",
234
+ "reason.ok": "可以用这条命令重新拉起这个 DSH。",
235
+ "reason.desktop-app": "桌面版自带重启,不用管这条命令。",
236
+ "reason.not-a-web-host": "这个 DSH 不是网页型宿主,没有端口也没有监听器。",
237
+ "reason.argv-unavailable": "读不回启动命令行(它是被一个特殊方式拉起来的),所以不猜。",
238
+ "reason.external-supervisor": "已经有别的守护在管这个进程:装第二个会抢端口。改为「优雅退出,让它拉起我」。",
239
+ "reason.container-no-init": "这台机器没有开机自启机制(容器),所以不承诺自动拉起。",
240
+ "reason.port-not-fixable": "端口每次都变,浏览器会被踢出去;得先把端口固定下来。",
241
+ "reason.supervised": "插件自己的守护在管这个进程,重启直接交给它。",
242
+ "status.external": "我记下的启动方式:由你的脚本拉起(重启交给它,我不插手)",
243
+ "status.bareWritten": "我记下的启动方式:按你确认过的那条命令重启",
244
+ "status.bareUnknown": "我还不知道怎么把你拉起来",
245
+ "status.unknown": "我看不出你是怎么启动的(我不猜,也不会自己乱拉)",
246
+ "status.selfSupervised": "我记下的启动方式:插件自己的守护在管(重启交给它)",
247
+ "status.container": "这里没有\"登录时自启\"这回事:由编排器负责",
248
+ "redetect": "重新检测",
249
+ "deriveHelp": "帮我看看怎么重启",
250
+ "technical": "技术细节",
251
+ "technicalHint": "以下是插件实际会执行的命令",
252
+ "previous": "撤销后会还原成",
253
+ "app": "桌面版自带重启",
254
+ "startup": "启动方式",
255
+ "startup.bare": "手动启动(没人管它)",
256
+ "startup.external": "由别的守护在管",
257
+ "startup.container": "容器里(由编排器管)",
258
+ "startup.desktop": "桌面版自带重启",
259
+ "startup.selfSupervised": "插件自己的守护在管",
260
+ "startup.unknown": "认不出是谁拉起它的",
261
+ "autostart": "开机自启怎么做"
262
+ },
263
+ "report": {
264
+ "label": "遇到问题了?",
265
+ "github": "复制诊断信息并去 GitHub 提问题",
266
+ "hint": "诊断信息里没有你的访问令牌,也没有任何密钥;把它贴进 issue,我们就能看出问题出在哪。",
267
+ "email": "没有 GitHub 账号?发邮件到 {email}",
268
+ "copy": "复制诊断信息",
269
+ "copyFailed": "复制失败,请手动复制这段",
270
+ "issueTitle": "重启 / 开机自启相关的问题",
271
+ "issueBody": "请把刚才复制的诊断信息粘贴到下面。\n\n## 发生了什么\n\n\n## 期望什么\n\n\n## 怎么复现\n"
272
+ },
273
+ "error": "没能保存设置:{message}",
274
+ "autostartKind": {
275
+ "other": "其他方式",
276
+ "windows-task": "Windows 计划任务",
277
+ "windows-startup": "Windows 启动文件夹",
278
+ "systemd-user": "systemd 用户服务",
279
+ "systemd-system": "systemd 系统服务",
280
+ "wsl-systemd": "WSL 里的 systemd",
281
+ "wsl-no-systemd": "WSL(没有 systemd)",
282
+ "container": "容器",
283
+ "desktop": "桌面版自带重启",
284
+ "unknown": "认不出",
285
+ "pm2": "pm2(进程守护工具)"
286
+ },
287
+ "startupWhy": {
288
+ "desktop": "这个进程就是桌面客户端本体,它自己会重启自己",
289
+ "bare": "它是被人在终端里手动起的,没人管它",
290
+ "external": "它是由另一个守护进程拉起来的",
291
+ "container": "它跑在容器里,由编排器负责",
292
+ "unknown": "看不出它是怎么被拉起来的",
293
+ "self-supervised": "它由本插件自己的守护在管"
294
+ }
295
+ },
296
+ "meta": {
297
+ "title": "dsh-autorestart — 重启不断线",
298
+ "description": "让 DeepSeek Harness 重启后接着干活:落盘的检查点、启动时重新武装 goal 或给一条续接提示,以及一次等人闲下来的优雅重启。"
299
+ },
300
+ "text": {
301
+ "missing": "(这条文案还没写)"
302
+ },
120
303
  "announcement": {
121
304
  "title": "新功能:收工关机",
122
305
  "line1": "左侧栏最底部多了一个 🌙「收工关机」按钮。",
123
306
  "line2": "点一下 → 所有会话收工后倒数 {n} 秒关机。",
124
- "line2Generic": "点一下 → 所有会话收工后倒数几秒关机。",
307
+ "line2.generic": "点一下 → 所有会话收工后倒数几秒关机。",
125
308
  "line3": "想改行为,去「设置 → 自动重启与关机」。",
126
309
  "disabled": "按钮目前关闭,可在设置里打开。",
127
310
  "button": "知道了",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-autorestart",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "description": "DeepSeek Harness plugin: restart without losing work. Waits until every conversation is idle, restarts the host, then automatically resumes the interrupted sessions. AI-generated, not human-reviewed: use with caution.",
6
6
  "license": "MIT",
@@ -31,6 +31,9 @@
31
31
  "index.js",
32
32
  "client.js",
33
33
  "lib/**/*.js",
34
+ "supervisor/supervisor.js",
35
+ "scripts/*.ps1",
36
+ "scripts/*.cmd",
34
37
  "cordis.patch.yml",
35
38
  "locale/*.json",
36
39
  "icon.svg",
@@ -46,7 +49,9 @@
46
49
  "client": {
47
50
  "platform": "web",
48
51
  "immediately": true,
49
- "inject": ["@deepseek-ai/dsh-client-ui-conversation"]
52
+ "inject": [
53
+ "@deepseek-ai/dsh-client-ui-conversation"
54
+ ]
50
55
  },
51
56
  "compatibility": {
52
57
  "dshReleases": {
package/screenshots.json CHANGED
@@ -1,5 +1,7 @@
1
- [
2
- "assets/screenshot-1.png",
3
- "assets/screenshot-2.png",
4
- "assets/screenshot-3.png"
1
+ [
2
+ "assets/screenshot-1.png",
3
+ "assets/screenshot-2.png",
4
+ "assets/screenshot-3.png",
5
+ "assets/screenshot-4.png",
6
+ "assets/screenshot-5.png"
5
7
  ]
@@ -0,0 +1,27 @@
1
+ @echo off
2
+ rem dsh-autorestart - the emergency switch.
3
+ rem
4
+ rem Double-click this file when DSH does not start any more after the plugin was
5
+ rem enabled: it takes "dsh-autorestart" out of the profile's bundles list, so the
6
+ rem next start of DSH comes up WITHOUT this plugin. Restart DSH afterwards.
7
+ rem
8
+ rem (An optional first argument points at another package.json - that is how the
9
+ rem script is tested; without an argument the real desktop profile is used.)
10
+ rem
11
+ rem NOTE: this file is ASCII on purpose. cmd.exe reads a batch file with the
12
+ rem console code page, and a UTF-8 character in it would shift the rest of the
13
+ rem line and be run as a command. The Chinese explanation comes from the
14
+ rem PowerShell script below (and from docs/README.zh.md).
15
+ setlocal
16
+ if "%~1"=="" goto :real-profile
17
+ powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0emergency-toggle.ps1" -Action disable -PackageJson "%~1"
18
+ goto :done
19
+ :real-profile
20
+ powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0emergency-toggle.ps1" -Action disable
21
+ :done
22
+ set "RC=%ERRORLEVEL%"
23
+ echo.
24
+ echo The result is above. Restart DSH for it to take effect.
25
+ echo To try the plugin again: run emergency-toggle.ps1 -Action enable
26
+ pause
27
+ exit /b %RC%