dsh-client-auto-continue 0.10.2 → 0.11.1

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/README.md CHANGED
@@ -70,11 +70,17 @@ On host boot it also scans the live sessions: a session whose last turn ended wi
70
70
 
71
71
  The browser half is a thin shell: the settings card, plus a status bridge that shows notifications (with Resume now / Pause this session 1h buttons, routed back to the host engine) and feeds the card's stats / paused-sessions panels.
72
72
 
73
+ ### Recovery workflow
74
+
75
+ The diagram summarizes the automatic recovery path, the loop-guard restart path, and the exit to human intervention. Click it to open the full-size version.
76
+
77
+ [![dsh-auto-continue recovery workflow](docs/auto-continue-workflow.en.svg)](docs/auto-continue-workflow.en.svg)
78
+
73
79
  ## Quick Start
74
80
 
75
81
  DSH plugins install into a **profile** (`dsh web` → `web` profile). Install, restart `dsh web`, done.
76
82
 
77
- > **Use the latest DSH (recommended: 0.1.2-alpha.1 or newer).** Run `dsh --version` before installing. Plugin v0.8.2 supports the new 0.1.2 client-store module layout and retains a fallback for DSH 0.1.0-rc.7 through 0.1.1; rc.6 and earlier remain unsupported (`list slot ... requires options.id`). Preview releases may appear on the [official DSH releases page](https://github.com/deepseek-ai/deepseek-harness/releases) before the public npm tag catches up.
83
+ > **Use the latest DSH (recommended: 0.1.2-alpha.4 or newer).** Run `dsh --version` before installing. Plugin v0.11.1 supports the settings API used by DSH 0.1.2-alpha.2+ (including alpha.3 and alpha.4) while retaining compatibility with DSH 0.1.0-rc.7 through 0.1.1; rc.6 and earlier remain unsupported (`list slot ... requires options.id`). Preview releases may appear on the [official DSH releases page](https://github.com/deepseek-ai/deepseek-harness/releases) before the public npm tag catches up.
78
84
 
79
85
  ### From npm (recommended)
80
86
 
@@ -146,7 +152,9 @@ dsh web
146
152
 
147
153
  ## Configuration
148
154
 
149
- Everything is configurable from the GUI — no file or console edits needed. Open **Settings → Plugins** and find the **dsh-client-auto-continue** configuration card, right where every other plugin's config lives. Besides the fields below, the card shows a live **stats panel** (today's activity with a reset button) and the list of **paused sessions** (each with a per-session resume button).
155
+ Everything is configurable from the GUI — no file or console edits needed. Open **Settings → Plugins Plugin configuration**. **Auto Continue** appears as a collapsed card alongside the other plugins; click the card or its right-hand chevron to expand the full configuration in place. Besides the fields below, the expanded card shows a live **stats panel** (today's activity with a reset button) and the list of **paused sessions** (each with a per-session resume button).
156
+
157
+ The **Continuity Relay** card groups controls by handoff, safety, recovery, loop breaking, and live status. Its header also keeps the open-source repository and a **Star on GitHub** shortcut within reach.
150
158
 
151
159
  **Or skip the GUI and edit the config file directly** — the engine reads the plugin's section from `~/.dsh/settings.yaml` (one shared file for every plugin's sections), so this works in any install, patched or not. The file is watched and re-read automatically, so changes apply live; restart `dsh web` if a page that was already open doesn't pick them up. Fields you leave out fall back to the defaults in the table below.
152
160
 
@@ -184,7 +192,7 @@ auto-continue:
184
192
 
185
193
  **How the card works:**
186
194
 
187
- ![Stats & paused sessions](docs/screenshots/07-card-panels.png)
195
+ ![The collapsed Auto Continue card in the plugin configuration list](docs/screenshots/02-settings-card.png)
188
196
 
189
197
  - Edits are **staged** — nothing reaches the disk until you hit **Save**; an unsaved badge marks the card while drafts are pending, and **Discard** drops them
190
198
  - A field you changed shows an **Overridden** badge with a per-field **Reset to default** button that restores the built-in value
package/README.zh.md CHANGED
@@ -70,11 +70,17 @@
70
70
 
71
71
  浏览器半侧是瘦壳: 设置卡片 + 一条状态桥(展示通知, 带「立即续跑 / 暂停该会话 1 小时」按钮并把动作回传给宿主引擎; 驱动卡片里的统计与暂停面板)。
72
72
 
73
+ ### 恢复流程
74
+
75
+ 下图汇总了自动恢复主链、循环守卫重启路径和等待人工介入的出口。点击图片可查看原尺寸版本。
76
+
77
+ [![dsh-auto-continue 恢复流程](docs/auto-continue-workflow.svg)](docs/auto-continue-workflow.svg)
78
+
73
79
  ## 快速开始
74
80
 
75
81
  DSH 插件安装进 **profile**(`dsh web` 对应 `web` profile)。安装后重启 `dsh web` 即可。
76
82
 
77
- > **请使用最新 DSH(推荐 0.1.2-alpha.1 或更高版本)。** 安装前先运行 `dsh --version`。插件 v0.8.2 已支持 0.1.2 的新 client-store 模块布局, 同时为 DSH 0.1.0-rc.7 至 0.1.1 保留兼容回退; rc.6 及更早版本仍不支持(`list slot ... requires options.id`)。预览版可能先发布在 [DSH 官方 Releases](https://github.com/deepseek-ai/deepseek-harness/releases), 公开 npm 标签会稍后跟进。
83
+ > **请使用最新 DSH(推荐 0.1.2-alpha.4 或更高版本)。** 安装前先运行 `dsh --version`。插件 v0.11.1 已支持 DSH 0.1.2-alpha.2+ 使用的设置 API(包括 alpha.3 alpha.4), 同时继续兼容 DSH 0.1.0-rc.7 至 0.1.1; rc.6 及更早版本仍不支持(`list slot ... requires options.id`)。预览版可能先发布在 [DSH 官方 Releases](https://github.com/deepseek-ai/deepseek-harness/releases), 公开 npm 标签会稍后跟进。
78
84
 
79
85
  ### 从 npm 安装(推荐)
80
86
 
@@ -146,7 +152,9 @@ dsh web
146
152
 
147
153
  ## 配置
148
154
 
149
- 所有参数都可以在 GUI 里配置——无需改文件或控制台。打开 **设置 → 插件**, 找到 **dsh-client-auto-continue** 的配置卡片, 和其他插件的配置放在一起。除了下面的字段, 卡片还带一个**统计面板**(今日活动, 可一键清零)和**已暂停会话**列表(每个都可单独解除)。
155
+ 所有参数都可以在 GUI 里配置——无需改文件或控制台。打开 **设置 → 插件 插件配置**, **自动继续**会像其他插件一样显示为列表中的折叠卡片; 点击卡片或右侧箭头即可在当前位置展开完整配置。除了下面的字段, 展开后的卡片还带一个**统计面板**(今日活动, 可一键清零)和**已暂停会话**列表(每个都可单独解除)。
156
+
157
+ 新版**中断接力器**会按接力方式、安全节奏、恢复雷达、循环断路器与现场状态组织配置; 卡片顶部也直接放出了开源仓库和 **Star on GitHub** 入口。
150
158
 
151
159
  **或者跳过 GUI, 直接编辑配置文件** — 引擎从 `~/.dsh/settings.yaml` 读取插件段落(所有插件的设置都在这一个文件里), 因此无论是否打过补丁都能用。文件被监听、自动重读, 改动即时生效; 若已打开的页面没反应, 重启 `dsh web` 即可。没填写的字段会回落到下表中的默认值。
152
160
 
@@ -184,7 +192,7 @@ auto-continue:
184
192
 
185
193
  **卡片操作说明:**
186
194
 
187
- ![统计与暂停会话](docs/screenshots/07-card-panels.png)
195
+ ![插件配置列表中的自动继续折叠卡片](docs/screenshots/02-settings-card.png)
188
196
 
189
197
  - 修改是**暂存式**的——点「保存」之前不会写入磁盘; 有待保存草稿时卡片显示「未保存」徽章, 「放弃」可丢弃草稿
190
198
  - 改动过的字段会带「已覆盖」徽章, 并有逐字段的「恢复默认」按钮(回到内置默认值)
@@ -0,0 +1,40 @@
1
+ Lucide Icons
2
+ https://lucide.dev/
3
+
4
+ ISC License
5
+
6
+ Copyright (c) 2026 Lucide Icons and Contributors
7
+
8
+ Permission to use, copy, modify, and/or distribute this software for any
9
+ purpose with or without fee is hereby granted, provided that the above
10
+ copyright notice and this permission notice appear in all copies.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+
20
+ The Radio icon is derived from Feather Icons and is used under the MIT License:
21
+
22
+ Copyright (c) 2013-present Cole Bemis
23
+
24
+ Permission is hereby granted, free of charge, to any person obtaining a copy
25
+ of this software and associated documentation files (the "Software"), to deal
26
+ in the Software without restriction, including without limitation the rights
27
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
28
+ copies of the Software, and to permit persons to whom the Software is
29
+ furnished to do so, subject to the following conditions:
30
+
31
+ The above copyright notice and this permission notice shall be included in all
32
+ copies or substantial portions of the Software.
33
+
34
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
37
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
39
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
40
+ SOFTWARE.
@@ -0,0 +1,155 @@
1
+ {
2
+ "schema_version": 2,
3
+ "diagram_type": "workflow",
4
+ "meta": {
5
+ "title": "dsh-auto-continue 插件流程",
6
+ "locale": "zh-CN",
7
+ "animation": "trace",
8
+ "visual_preset": "signal-flow",
9
+ "quality_profile": "showcase",
10
+ "views": [
11
+ {
12
+ "id": "auto_recovery",
13
+ "label": "自动恢复主链",
14
+ "focus": ["turn_end", "classify_failure", "safety_gate", "grace_wait", "compose_prompt", "agent_followup", "recovery_feedback"],
15
+ "note": "从非人为中断判定,到安全调度、自动续跑与恢复记账。"
16
+ },
17
+ {
18
+ "id": "loop_recovery",
19
+ "label": "循环守卫",
20
+ "focus": ["turn_end", "agent_cancel", "safety_gate", "compose_prompt", "agent_followup"],
21
+ "note": "检测空转后取消当前回合,并用 loopText 重新进入受控恢复链。"
22
+ },
23
+ {
24
+ "id": "human_feedback",
25
+ "label": "人工介入与反馈",
26
+ "focus": ["safety_gate", "manual_stop", "recovery_feedback"],
27
+ "note": "查看不自动继续的出口,以及浏览器端的状态、通知与操作入口。"
28
+ }
29
+ ],
30
+ "legend": {
31
+ "mode": "auto",
32
+ "entries": {
33
+ "messagebus": { "label": "会话事件" },
34
+ "backend": { "label": "宿主处理" },
35
+ "security": { "label": "安全判定" },
36
+ "cloud": { "label": "Agent 队列" },
37
+ "frontend": { "label": "浏览器反馈" },
38
+ "external": { "label": "人工介入" }
39
+ }
40
+ },
41
+ "output": "docs/auto-continue-workflow.html"
42
+ },
43
+ "lanes": [
44
+ { "id": "session", "label": "DSH 会话与浏览器" },
45
+ { "id": "engine", "label": "AutoContinueRunner" },
46
+ { "id": "agent", "label": "Agent 执行与中断", "variant": "exception" }
47
+ ],
48
+ "groups": [
49
+ { "id": "host_core", "label": "安全恢复链", "lane": "engine", "fromCol": 1, "toCol": 4, "variant": "emphasis" }
50
+ ],
51
+ "mainPath": [
52
+ "turn_end",
53
+ "classify_failure",
54
+ "safety_gate",
55
+ "grace_wait",
56
+ "compose_prompt",
57
+ "agent_followup",
58
+ "recovery_feedback"
59
+ ],
60
+ "semanticChecks": {
61
+ "allowedRoots": ["turn_end"],
62
+ "allowedTerminals": ["manual_stop", "recovery_feedback"],
63
+ "requiredPaths": [
64
+ { "from": "turn_end", "to": "agent_followup" },
65
+ { "from": "agent_cancel", "to": "agent_followup" },
66
+ { "from": "agent_followup", "to": "recovery_feedback" }
67
+ ]
68
+ },
69
+ "nodes": [
70
+ {
71
+ "id": "turn_end",
72
+ "lane": "session",
73
+ "col": 0,
74
+ "type": "messagebus",
75
+ "label": "收到会话信号",
76
+ "sublabel": "turn/end 或启动扫描"
77
+ },
78
+ {
79
+ "id": "classify_failure",
80
+ "lane": "engine",
81
+ "col": 1,
82
+ "type": "backend",
83
+ "label": "识别中断原因",
84
+ "sublabel": "错误、令牌上限与扫描"
85
+ },
86
+ {
87
+ "id": "safety_gate",
88
+ "lane": "engine",
89
+ "col": 2,
90
+ "type": "security",
91
+ "label": "检查恢复条件",
92
+ "sublabel": "分类、暂停、冷却、上限"
93
+ },
94
+ {
95
+ "id": "grace_wait",
96
+ "lane": "engine",
97
+ "col": 3,
98
+ "type": "backend",
99
+ "label": "等待宽限期",
100
+ "sublabel": "新回合或用户消息会取消"
101
+ },
102
+ {
103
+ "id": "compose_prompt",
104
+ "lane": "engine",
105
+ "col": 4,
106
+ "type": "backend",
107
+ "label": "组装续跑消息",
108
+ "sublabel": "模板 + 工具幂等护栏"
109
+ },
110
+ {
111
+ "id": "agent_followup",
112
+ "lane": "agent",
113
+ "col": 5,
114
+ "type": "cloud",
115
+ "label": "agent.followup",
116
+ "sublabel": "进入 Agent inbox",
117
+ "tag": "排队发送"
118
+ },
119
+ {
120
+ "id": "recovery_feedback",
121
+ "lane": "session",
122
+ "col": 5,
123
+ "type": "frontend",
124
+ "label": "恢复与反馈",
125
+ "sublabel": "清零、退避、SSE 状态"
126
+ },
127
+ {
128
+ "id": "agent_cancel",
129
+ "lane": "agent",
130
+ "col": 1,
131
+ "type": "security",
132
+ "label": "agent.cancel",
133
+ "sublabel": "守卫命中,保留 inbox"
134
+ },
135
+ {
136
+ "id": "manual_stop",
137
+ "lane": "session",
138
+ "col": 3,
139
+ "type": "external",
140
+ "label": "等待人工介入",
141
+ "sublabel": "停止、永久错误、达上限"
142
+ }
143
+ ],
144
+ "edges": [
145
+ { "id": "e_event_classify", "from": "turn_end", "to": "classify_failure", "label": "会话事实", "role": "main" },
146
+ { "id": "e_classify_gate", "from": "classify_failure", "to": "safety_gate", "label": "中断原因", "role": "main", "variant": "emphasis" },
147
+ { "id": "e_gate_grace", "from": "safety_gate", "to": "grace_wait", "label": "允许恢复", "role": "main", "variant": "emphasis" },
148
+ { "id": "e_grace_prompt", "from": "grace_wait", "to": "compose_prompt", "label": "宽限期内无新回合", "role": "main", "variant": "emphasis" },
149
+ { "id": "e_prompt_followup", "from": "compose_prompt", "to": "agent_followup", "label": "排队续跑", "role": "main", "variant": "emphasis" },
150
+ { "id": "e_followup_result", "from": "agent_followup", "to": "recovery_feedback", "label": "turn/end + SSE", "role": "return" },
151
+ { "id": "e_loop_cancel", "from": "turn_end", "to": "agent_cancel", "label": "运行中反复输出或工具调用", "role": "branch", "variant": "security" },
152
+ { "id": "e_cancel_gate", "from": "agent_cancel", "to": "safety_gate", "label": "aborted + loopText", "role": "return", "variant": "security" },
153
+ { "id": "e_gate_manual", "from": "safety_gate", "to": "manual_stop", "label": "不可自动恢复", "role": "error" }
154
+ ]
155
+ }
@@ -0,0 +1,155 @@
1
+ {
2
+ "schema_version": 2,
3
+ "diagram_type": "workflow",
4
+ "meta": {
5
+ "title": "dsh-auto-continue Plugin Workflow",
6
+ "locale": "en",
7
+ "animation": "trace",
8
+ "visual_preset": "signal-flow",
9
+ "quality_profile": "showcase",
10
+ "views": [
11
+ {
12
+ "id": "auto_recovery",
13
+ "label": "Automatic recovery",
14
+ "focus": ["turn_end", "classify_failure", "safety_gate", "grace_wait", "compose_prompt", "agent_followup", "recovery_feedback"],
15
+ "note": "Classify a non-human interruption, apply recovery safeguards, resume the agent, and record the outcome."
16
+ },
17
+ {
18
+ "id": "loop_recovery",
19
+ "label": "Loop guard",
20
+ "focus": ["turn_end", "agent_cancel", "safety_gate", "compose_prompt", "agent_followup"],
21
+ "note": "Cancel a spinning turn, preserve loop context, and re-enter the guarded recovery path."
22
+ },
23
+ {
24
+ "id": "human_feedback",
25
+ "label": "Human action & feedback",
26
+ "focus": ["safety_gate", "manual_stop", "recovery_feedback"],
27
+ "note": "Inspect non-recoverable exits and the browser-side status, notification, and action surface."
28
+ }
29
+ ],
30
+ "legend": {
31
+ "mode": "auto",
32
+ "entries": {
33
+ "messagebus": { "label": "Session event" },
34
+ "backend": { "label": "Host processing" },
35
+ "security": { "label": "Safety gate" },
36
+ "cloud": { "label": "Agent queue" },
37
+ "frontend": { "label": "Browser feedback" },
38
+ "external": { "label": "Human action" }
39
+ }
40
+ },
41
+ "output": "docs/auto-continue-workflow.en.html"
42
+ },
43
+ "lanes": [
44
+ { "id": "session", "label": "DSH session & browser" },
45
+ { "id": "engine", "label": "AutoContinueRunner" },
46
+ { "id": "agent", "label": "Agent execution & interrupts", "variant": "exception" }
47
+ ],
48
+ "groups": [
49
+ { "id": "host_core", "label": "Safe recovery path", "lane": "engine", "fromCol": 1, "toCol": 4, "variant": "emphasis" }
50
+ ],
51
+ "mainPath": [
52
+ "turn_end",
53
+ "classify_failure",
54
+ "safety_gate",
55
+ "grace_wait",
56
+ "compose_prompt",
57
+ "agent_followup",
58
+ "recovery_feedback"
59
+ ],
60
+ "semanticChecks": {
61
+ "allowedRoots": ["turn_end"],
62
+ "allowedTerminals": ["manual_stop", "recovery_feedback"],
63
+ "requiredPaths": [
64
+ { "from": "turn_end", "to": "agent_followup" },
65
+ { "from": "agent_cancel", "to": "agent_followup" },
66
+ { "from": "agent_followup", "to": "recovery_feedback" }
67
+ ]
68
+ },
69
+ "nodes": [
70
+ {
71
+ "id": "turn_end",
72
+ "lane": "session",
73
+ "col": 0,
74
+ "type": "messagebus",
75
+ "label": "Session signal",
76
+ "sublabel": "turn/end or boot scan"
77
+ },
78
+ {
79
+ "id": "classify_failure",
80
+ "lane": "engine",
81
+ "col": 1,
82
+ "type": "backend",
83
+ "label": "Classify cause",
84
+ "sublabel": "Error / token / scan"
85
+ },
86
+ {
87
+ "id": "safety_gate",
88
+ "lane": "engine",
89
+ "col": 2,
90
+ "type": "security",
91
+ "label": "Recovery gate",
92
+ "sublabel": "Pause / backoff / cap"
93
+ },
94
+ {
95
+ "id": "grace_wait",
96
+ "lane": "engine",
97
+ "col": 3,
98
+ "type": "backend",
99
+ "label": "Grace wait",
100
+ "sublabel": "New turn cancels"
101
+ },
102
+ {
103
+ "id": "compose_prompt",
104
+ "lane": "engine",
105
+ "col": 4,
106
+ "type": "backend",
107
+ "label": "Build prompt",
108
+ "sublabel": "Template + tool guard"
109
+ },
110
+ {
111
+ "id": "agent_followup",
112
+ "lane": "agent",
113
+ "col": 5,
114
+ "type": "cloud",
115
+ "label": "agent.followup",
116
+ "sublabel": "Enter Agent inbox",
117
+ "tag": "Queued"
118
+ },
119
+ {
120
+ "id": "recovery_feedback",
121
+ "lane": "session",
122
+ "col": 5,
123
+ "type": "frontend",
124
+ "label": "Restore status",
125
+ "sublabel": "Reset + SSE state"
126
+ },
127
+ {
128
+ "id": "agent_cancel",
129
+ "lane": "agent",
130
+ "col": 1,
131
+ "type": "security",
132
+ "label": "agent.cancel",
133
+ "sublabel": "Guard hit; keep inbox"
134
+ },
135
+ {
136
+ "id": "manual_stop",
137
+ "lane": "session",
138
+ "col": 3,
139
+ "type": "external",
140
+ "label": "Human action",
141
+ "sublabel": "Pause / error / cap"
142
+ }
143
+ ],
144
+ "edges": [
145
+ { "id": "e_event_classify", "from": "turn_end", "to": "classify_failure", "label": "Session facts", "role": "main" },
146
+ { "id": "e_classify_gate", "from": "classify_failure", "to": "safety_gate", "label": "Failure cause", "role": "main", "variant": "emphasis" },
147
+ { "id": "e_gate_grace", "from": "safety_gate", "to": "grace_wait", "label": "Recovery allowed", "role": "main", "variant": "emphasis" },
148
+ { "id": "e_grace_prompt", "from": "grace_wait", "to": "compose_prompt", "label": "No new turn", "role": "main", "variant": "emphasis" },
149
+ { "id": "e_prompt_followup", "from": "compose_prompt", "to": "agent_followup", "label": "Queue followup", "role": "main", "variant": "emphasis" },
150
+ { "id": "e_followup_result", "from": "agent_followup", "to": "recovery_feedback", "label": "turn/end + SSE", "role": "return" },
151
+ { "id": "e_loop_cancel", "from": "turn_end", "to": "agent_cancel", "label": "Repeated output or tool calls", "role": "branch", "variant": "security" },
152
+ { "id": "e_cancel_gate", "from": "agent_cancel", "to": "safety_gate", "label": "aborted + loopText", "role": "return", "variant": "security" },
153
+ { "id": "e_gate_manual", "from": "safety_gate", "to": "manual_stop", "label": "Manual action required", "role": "error" }
154
+ ]
155
+ }