dsh-client-auto-continue 0.3.1 → 0.4.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/README.md +45 -10
- package/README.zh.md +43 -8
- package/docs/banner-dark.svg +1 -25
- package/docs/banner-zh-dark.svg +1 -25
- package/docs/banner-zh.svg +1 -25
- package/docs/banner.svg +1 -25
- package/docs/demo-zh.svg +1 -50
- package/docs/demo.svg +1 -50
- package/docs/social-preview.png +0 -0
- package/docs/social-preview.svg +1 -43
- package/lib/client.js +6 -3
- package/lib/client.js.map +2 -2
- package/lib/types/client/locales.d.ts +1 -0
- package/lib/types/client/settings-card.d.ts +3 -3
- package/package.json +1 -1
- package/scripts/patch-expose.mjs +69 -33
package/README.md
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
<a href="https://www.npmjs.com/package/dsh-client-auto-continue"><img src="https://img.shields.io/npm/dm/dsh-client-auto-continue?label=downloads" alt="npm downloads"></a>
|
|
17
17
|
<a href="https://github.com/HsiangNianian/dsh-auto-continue/stargazers"><img src="https://img.shields.io/github/stars/HsiangNianian/dsh-auto-continue?logo=github&label=Stars" alt="GitHub stars"></a>
|
|
18
18
|
<a href="https://github.com/HsiangNianian/dsh-auto-continue/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-65a30d?style=flat" alt="MIT license"></a>
|
|
19
|
+
<a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome · DSH plugin"></a>
|
|
19
20
|
<br>
|
|
20
21
|
<img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat&logo=typescript&logoColor=fff" alt="TypeScript">
|
|
21
22
|
<img src="https://img.shields.io/badge/esbuild-FFCF00?style=flat&logo=esbuild&logoColor=000" alt="esbuild">
|
|
@@ -36,10 +37,10 @@ For [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh we
|
|
|
36
37
|
|
|
37
38
|
**Smart recovery** (all configurable):
|
|
38
39
|
|
|
39
|
-
- **Error classification** — transient failures (network / timeout / 5xx…) are auto-resumed; permanent ones
|
|
40
|
-
- **Adaptive backoff** — consecutive failures wait longer each time (
|
|
40
|
+
- **Error classification** — transient failures (network / timeout / 5xx / 429…) are auto-resumed; permanent ones are **skipped** and notified, because retrying them never helps. A failure counts as permanent when its HTTP status is 401/403 or its code/message matches auth, credential/API-key, balance/quota, unknown-model, or context-length/overflow keywords. Turn classification off to resume everything
|
|
41
|
+
- **Adaptive backoff** — consecutive failures wait longer each time (cooldown × factor: 20s → 40s → 80s…), capped at the max backoff, instead of hammering a broken upstream
|
|
41
42
|
- **Templated continue text** — `continueText` supports `{code}` `{message}` `{status}` `{tool}` `{turn}` placeholders, so the resume message can carry the failure context ("继续 (git push failed: UPSTREAM)")
|
|
42
|
-
- **Browser notifications** — optional alerts when auto-continue fires, gives up, or hits a permanent error
|
|
43
|
+
- **Browser notifications** — optional alerts when auto-continue fires, gives up, or hits a permanent error; the browser asks for permission on first use, and nothing is shown again after a denial
|
|
43
44
|
|
|
44
45
|
It watches the live event streams and reacts to:
|
|
45
46
|
|
|
@@ -60,6 +61,8 @@ The plugin opens two extra SSE streams in the browser — `events.mux` (session
|
|
|
60
61
|
|
|
61
62
|
On page load / reconnect it also scans the most recently updated sessions: a session whose last turn ended with a non-human reason **within the scan window** (default 15 minutes), with no later `turn/start` or user message, gets resumed automatically too (e.g. the host crashed while the browser was closed).
|
|
62
63
|
|
|
64
|
+
With the page open in several tabs, a localStorage mutex plus a shared per-session cooldown stamp guarantee exactly one tab sends — no duplicated 「继续」.
|
|
65
|
+
|
|
63
66
|
All knobs live in the plugin's settings card — see [Configuration](#configuration).
|
|
64
67
|
|
|
65
68
|
---
|
|
@@ -77,6 +80,17 @@ dsh plugin --profile web add dsh-client-auto-continue
|
|
|
77
80
|
dsh web
|
|
78
81
|
```
|
|
79
82
|
|
|
83
|
+
### Directly from GitHub (no clone needed)
|
|
84
|
+
|
|
85
|
+
Installs straight from the repository's default branch — built artifacts are committed, so no local clone or build step:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
dsh plugin --profile web add github:HsiangNianian/dsh-auto-continue
|
|
89
|
+
dsh web
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
> This tracks the `main` branch rather than released tags — great for trying the latest changes, while the npm method above is the stable choice. Switching between install sources is just re-running `dsh plugin --profile web add <other-spec>`; the profile dependency is replaced in place.
|
|
93
|
+
|
|
80
94
|
### From this repository
|
|
81
95
|
|
|
82
96
|
Requires Node.js ≥ 18.
|
|
@@ -107,11 +121,12 @@ dsh web
|
|
|
107
121
|
|
|
108
122
|
> Switching from a manual install to `dsh plugin add`? Remove the manual `insert` entry first — the bundle patch registers the row and a duplicate would conflict.
|
|
109
123
|
|
|
110
|
-
> **Known DSH limitation (0.1.0-rc.6):** the web
|
|
111
|
-
>
|
|
112
|
-
>
|
|
113
|
-
>
|
|
114
|
-
>
|
|
124
|
+
> **Known DSH limitation (0.1.0-rc.6):** the web settings surface only exposes
|
|
125
|
+
> namespaces on a hardcoded allowlist in the installed `@deepseek-ai/dsh-host-apiproxy`
|
|
126
|
+
> bundle. Until upstream moves exposure into `settings.register()`, one idempotent
|
|
127
|
+
> vendor patch makes exposure **registry-driven** — every namespace a plugin
|
|
128
|
+
> registers (this one or any other) becomes visible, with no plugin-specific
|
|
129
|
+
> strings anywhere. Run it once, and re-run after reinstalling dsh:
|
|
115
130
|
>
|
|
116
131
|
> ```sh
|
|
117
132
|
> node node_modules/dsh-client-auto-continue/scripts/patch-expose.mjs
|
|
@@ -122,7 +137,7 @@ dsh web
|
|
|
122
137
|
> covers every reachable dsh installation: the profile-linked copy, a global
|
|
123
138
|
> `npm i -g @deepseek-ai/dsh` install, and the invoking directory's own. The
|
|
124
139
|
> auto-continue engine itself works without this patch — it only gates the
|
|
125
|
-
> GUI settings
|
|
140
|
+
> GUI settings section.
|
|
126
141
|
|
|
127
142
|
### Verify & uninstall
|
|
128
143
|
|
|
@@ -142,7 +157,16 @@ dsh web
|
|
|
142
157
|
|
|
143
158
|
## Configuration
|
|
144
159
|
|
|
145
|
-
Everything is configurable from the GUI — no file or console edits needed. Open **Settings →
|
|
160
|
+
Everything is configurable from the GUI — no file or console edits needed. Open **Settings → Auto continue** — the plugin's own section, placed right after **Agent presets**.
|
|
161
|
+
|
|
162
|
+
**How the card works:**
|
|
163
|
+
|
|
164
|
+
- 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
|
|
165
|
+
- A field you changed shows an **Overridden** badge with a per-field **Reset to default** button that restores the built-in value
|
|
166
|
+
- Boolean fields are **tri-state**: *Inherit* (use the default) / *On* / *Off*
|
|
167
|
+
- Invalid drafts (non-numbers, values below the minimum) block the save with a hint
|
|
168
|
+
- In a read-only deployment the card shows the stored values but disables every control
|
|
169
|
+
- Changes apply immediately after Save and persist in `~/.dsh/settings.yaml` (uninstalling the plugin leaves the section behind — harmless, delete it by hand if you like)
|
|
146
170
|
|
|
147
171
|
| Field | Default | Description |
|
|
148
172
|
| --- | --- | --- |
|
|
@@ -165,6 +189,17 @@ Everything is configurable from the GUI — no file or console edits needed. Ope
|
|
|
165
189
|
|
|
166
190
|
---
|
|
167
191
|
|
|
192
|
+
## Privacy & permissions
|
|
193
|
+
|
|
194
|
+
The plugin is browser-only and touches **no files, credentials, or network beyond the dsh host**:
|
|
195
|
+
|
|
196
|
+
- It opens the same two read-only event streams the web UI already uses (no extra server, no third-party endpoints)
|
|
197
|
+
- The only write it ever performs is `sessions.prompt` — the same call the Send button makes — with the text you configured
|
|
198
|
+
- Browser storage is limited to small `localStorage` keys for cross-tab coordination
|
|
199
|
+
- Browser notifications are opt-in (`notify` setting) and permission is requested on first use only
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
168
203
|
## Development
|
|
169
204
|
|
|
170
205
|
```bash
|
package/README.zh.md
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
<a href="https://www.npmjs.com/package/dsh-client-auto-continue"><img src="https://img.shields.io/npm/dm/dsh-client-auto-continue?label=downloads" alt="npm downloads"></a>
|
|
17
17
|
<a href="https://github.com/HsiangNianian/dsh-auto-continue/stargazers"><img src="https://img.shields.io/github/stars/HsiangNianian/dsh-auto-continue?logo=github&label=Stars" alt="GitHub stars"></a>
|
|
18
18
|
<a href="https://github.com/HsiangNianian/dsh-auto-continue/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-65a30d?style=flat" alt="MIT license"></a>
|
|
19
|
+
<a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome · DSH plugin"></a>
|
|
19
20
|
<br>
|
|
20
21
|
<img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat&logo=typescript&logoColor=fff" alt="TypeScript">
|
|
21
22
|
<img src="https://img.shields.io/badge/esbuild-FFCF00?style=flat&logo=esbuild&logoColor=000" alt="esbuild">
|
|
@@ -36,10 +37,10 @@
|
|
|
36
37
|
|
|
37
38
|
**智能恢复**(全部可配置):
|
|
38
39
|
|
|
39
|
-
- **错误分类** — 临时性错误(网络 / 超时 / 5xx 等)自动续跑;
|
|
40
|
-
- **自适应退避** — 连续失败时等待时间递增(
|
|
40
|
+
- **错误分类** — 临时性错误(网络 / 超时 / 5xx / 429 等)自动续跑; 永久性错误跳过并通知, 因为重试也没用。判定为永久性的条件: HTTP 状态码 401/403, 或 code/message 命中认证、凭据/API Key、余额/配额、模型不存在、上下文长度/超限等关键词。关闭分类后则全部自动继续
|
|
41
|
+
- **自适应退避** — 连续失败时等待时间递增(冷却 × 系数: 20s → 40s → 80s…), 有上限, 不再对故障上游狂轰滥炸
|
|
41
42
|
- **模板化继续文本** — `continueText` 支持 `{code}` `{message}` `{status}` `{tool}` `{turn}` 占位符, 续跑消息可携带失败上下文(如「继续 (git push 失败: UPSTREAM)」)
|
|
42
|
-
- **浏览器通知** — 可选: 自动继续成功 / 放弃 /
|
|
43
|
+
- **浏览器通知** — 可选: 自动继续成功 / 放弃 / 遇到永久性错误时弹出提醒; 首次使用时请求权限, 被拒绝后不再打扰
|
|
43
44
|
|
|
44
45
|
插件监听实时事件流, 对以下情况作出反应:
|
|
45
46
|
|
|
@@ -60,6 +61,8 @@
|
|
|
60
61
|
|
|
61
62
|
页面启动 / 重连时, 插件还会扫描最近更新的会话: 若某个会话的最后一个回合在**扫描时间窗**(默认 15 分钟)内以非人为原因结束, 且之后没有新的 `turn/start` 或用户消息, 也会被自动续跑(例如浏览器关闭期间宿主崩溃的情况)。
|
|
62
63
|
|
|
64
|
+
多个标签页同时打开时, 通过 localStorage 互斥锁 + 共享的每会话冷却记录保证**只有一个标签页发送**——不会重复出现两条「继续」。
|
|
65
|
+
|
|
63
66
|
所有参数都在插件的设置卡片中调整——见 [配置](#配置)。
|
|
64
67
|
|
|
65
68
|
---
|
|
@@ -77,6 +80,17 @@ dsh plugin --profile web add dsh-client-auto-continue
|
|
|
77
80
|
dsh web
|
|
78
81
|
```
|
|
79
82
|
|
|
83
|
+
### 直接从 GitHub 安装(无需克隆)
|
|
84
|
+
|
|
85
|
+
直接从仓库默认分支安装——构建产物已提交入库, 无需本地克隆或构建:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
dsh plugin --profile web add github:HsiangNianian/dsh-auto-continue
|
|
89
|
+
dsh web
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
> 该方式跟踪 `main` 分支而不是发布 tag——适合尝鲜最新改动, 稳定性首选上面的 npm 方式。切换安装来源只需重新执行 `dsh plugin --profile web add <其他来源>`, profile 依赖会被就地替换。
|
|
93
|
+
|
|
80
94
|
### 从本仓库安装
|
|
81
95
|
|
|
82
96
|
需要 Node.js ≥ 18。
|
|
@@ -107,10 +121,11 @@ dsh web
|
|
|
107
121
|
|
|
108
122
|
> 从手动安装切换到 `dsh plugin add` 时, 请先删掉手动加的 `insert` 条目——包自带的 bundle patch 会注册插件行, 重复注册会冲突。
|
|
109
123
|
|
|
110
|
-
> **已知 DSH 限制(0.1.0-rc.6):** webui
|
|
124
|
+
> **已知 DSH 限制(0.1.0-rc.6):** webui 的设置区只暴露已安装
|
|
111
125
|
> `@deepseek-ai/dsh-host-apiproxy` 包中硬编码白名单里的设置命名空间。在官方把暴露
|
|
112
|
-
> 逻辑移入 `settings.register()` 之前,
|
|
113
|
-
>
|
|
126
|
+
> 逻辑移入 `settings.register()` 之前, 需要执行一次幂等的供应商补丁, 让暴露变成
|
|
127
|
+
> **注册表驱动**——任何插件注册的命名空间(本插件或其他插件)都会自动可见, 补丁中
|
|
128
|
+
> 没有任何插件相关的硬编码字符串。执行一次即可, 重新安装 dsh 后重跑:
|
|
114
129
|
>
|
|
115
130
|
> ```sh
|
|
116
131
|
> node node_modules/dsh-client-auto-continue/scripts/patch-expose.mjs
|
|
@@ -119,7 +134,7 @@ dsh web
|
|
|
119
134
|
>
|
|
120
135
|
> 补丁脚本随 npm 包一起发布(无需克隆仓库), 并覆盖所有可达的 dsh 安装: profile
|
|
121
136
|
> 链接副本、全局 `npm i -g @deepseek-ai/dsh` 安装、以及当前目录的安装。自动续跑
|
|
122
|
-
> 引擎本身不依赖这个补丁——它只影响 GUI
|
|
137
|
+
> 引擎本身不依赖这个补丁——它只影响 GUI 设置区是否可见。
|
|
123
138
|
|
|
124
139
|
### 验证与卸载
|
|
125
140
|
|
|
@@ -139,7 +154,16 @@ dsh web
|
|
|
139
154
|
|
|
140
155
|
## 配置
|
|
141
156
|
|
|
142
|
-
所有参数都可以在 GUI 里配置——无需改文件或控制台。打开 **设置 →
|
|
157
|
+
所有参数都可以在 GUI 里配置——无需改文件或控制台。打开 **设置 → 自动继续**——插件专属设置区, 位于 **Agent 预设** 之后。
|
|
158
|
+
|
|
159
|
+
**卡片操作说明:**
|
|
160
|
+
|
|
161
|
+
- 修改是**暂存式**的——点「保存」之前不会写入磁盘; 有待保存草稿时卡片显示「未保存」徽章, 「放弃」可丢弃草稿
|
|
162
|
+
- 改动过的字段会带「已覆盖」徽章, 并有逐字段的「恢复默认」按钮(回到内置默认值)
|
|
163
|
+
- 布尔字段是三态:**继承**(用默认)/ 开 / 关
|
|
164
|
+
- 非法输入(非数字、小于最小值)会阻止保存并给出提示
|
|
165
|
+
- 只读部署中卡片只显示已存值, 所有控件禁用
|
|
166
|
+
- 保存后立即生效, 持久化在 `~/.dsh/settings.yaml`(卸载插件会留下该段落, 无害, 想清理可手动删除)
|
|
143
167
|
|
|
144
168
|
| 字段 | 默认 | 说明 |
|
|
145
169
|
| --- | --- | --- |
|
|
@@ -162,6 +186,17 @@ dsh web
|
|
|
162
186
|
|
|
163
187
|
---
|
|
164
188
|
|
|
189
|
+
## 隐私与权限
|
|
190
|
+
|
|
191
|
+
插件是纯浏览器端, **不触碰任何文件、凭据, 也不访问 dsh 宿主以外的网络**:
|
|
192
|
+
|
|
193
|
+
- 只复用 webui 本身就在用的两条只读事件流(无额外服务、无第三方端点)
|
|
194
|
+
- 唯一会执行的写入是 `sessions.prompt`——与点「发送」按钮完全相同的调用, 内容为你配置的文本
|
|
195
|
+
- 浏览器存储仅限于少量 `localStorage` 键(跨标签页协调用)
|
|
196
|
+
- 浏览器通知是可选开启的(`notify` 设置), 仅在首次使用时请求一次权限
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
165
200
|
## 开发
|
|
166
201
|
|
|
167
202
|
```bash
|
package/docs/banner-dark.svg
CHANGED
|
@@ -1,25 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#0b1220"/>
|
|
5
|
-
<stop offset="60%" stop-color="#0c2336"/>
|
|
6
|
-
<stop offset="100%" stop-color="#111a33"/>
|
|
7
|
-
</linearGradient>
|
|
8
|
-
<linearGradient id="bar" x1="0" y1="0" x2="1" y2="0">
|
|
9
|
-
<stop offset="0%" stop-color="#38bdf8"/>
|
|
10
|
-
<stop offset="100%" stop-color="#818cf8"/>
|
|
11
|
-
</linearGradient>
|
|
12
|
-
</defs>
|
|
13
|
-
<rect width="1200" height="260" fill="url(#bg)"/>
|
|
14
|
-
<!-- accent bar -->
|
|
15
|
-
<rect x="0" y="252" width="1200" height="8" fill="url(#bar)"/>
|
|
16
|
-
<!-- Continue chip -->
|
|
17
|
-
<rect x="76" y="70" width="148" height="116" rx="26" fill="#f8fafc"/>
|
|
18
|
-
<text x="150" y="136" font-size="34" font-weight="700" fill="#0f172a" text-anchor="middle">Continue</text>
|
|
19
|
-
<!-- title -->
|
|
20
|
-
<text x="268" y="122" font-size="54" font-weight="800" fill="#f8fafc">dsh-auto-continue</text>
|
|
21
|
-
<!-- subtitle -->
|
|
22
|
-
<text x="270" y="164" font-size="26" fill="#94a3b8">DSH Web UI plugin — auto-continue interrupted requests</text>
|
|
23
|
-
<!-- caption -->
|
|
24
|
-
<text x="270" y="202" font-size="21" fill="#7dd3fc" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">turn/end · error | interrupted | max-tokens → prompt("Continue")</text>
|
|
25
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 1200 260"><defs><linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop offset="0%" stop-color="#0b1220"/><stop offset="60%" stop-color="#0c2336"/><stop offset="100%" stop-color="#111a33"/></linearGradient><linearGradient id="bar" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#38bdf8"/><stop offset="100%" stop-color="#818cf8"/></linearGradient></defs><rect width="1200" height="260" fill="url(#bg)"/><rect width="1200" height="8" x="0" y="252" fill="url(#bar)"/><rect width="148" height="116" x="76" y="70" fill="#f8fafc" rx="26"/><text x="150" y="136" fill="#0f172a" font-size="34" font-weight="700" text-anchor="middle">Continue</text><text x="268" y="122" fill="#f8fafc" font-size="54" font-weight="800">dsh-auto-continue</text><text x="270" y="164" fill="#94a3b8" font-size="26">DSH Web UI plugin — auto-continue interrupted requests</text><text x="270" y="202" fill="#7dd3fc" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="21">turn/end · error | interrupted | max-tokens → prompt("Continue")</text></svg>
|
package/docs/banner-zh-dark.svg
CHANGED
|
@@ -1,25 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#0b1220"/>
|
|
5
|
-
<stop offset="60%" stop-color="#0c2336"/>
|
|
6
|
-
<stop offset="100%" stop-color="#111a33"/>
|
|
7
|
-
</linearGradient>
|
|
8
|
-
<linearGradient id="bar" x1="0" y1="0" x2="1" y2="0">
|
|
9
|
-
<stop offset="0%" stop-color="#38bdf8"/>
|
|
10
|
-
<stop offset="100%" stop-color="#818cf8"/>
|
|
11
|
-
</linearGradient>
|
|
12
|
-
</defs>
|
|
13
|
-
<rect width="1200" height="260" fill="url(#bg)"/>
|
|
14
|
-
<!-- accent bar -->
|
|
15
|
-
<rect x="0" y="252" width="1200" height="8" fill="url(#bar)"/>
|
|
16
|
-
<!-- 继续 chip -->
|
|
17
|
-
<rect x="76" y="70" width="116" height="116" rx="26" fill="#f8fafc"/>
|
|
18
|
-
<text x="134" y="150" font-size="58" font-weight="700" fill="#0f172a" text-anchor="middle">继续</text>
|
|
19
|
-
<!-- title -->
|
|
20
|
-
<text x="236" y="122" font-size="54" font-weight="800" fill="#f8fafc">dsh-auto-continue</text>
|
|
21
|
-
<!-- subtitle -->
|
|
22
|
-
<text x="238" y="164" font-size="26" fill="#94a3b8">DSH Web UI plugin — auto-continue interrupted requests</text>
|
|
23
|
-
<!-- caption -->
|
|
24
|
-
<text x="238" y="202" font-size="21" fill="#7dd3fc" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">turn/end · error | interrupted | max-tokens → prompt("继续")</text>
|
|
25
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 1200 260"><defs><linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop offset="0%" stop-color="#0b1220"/><stop offset="60%" stop-color="#0c2336"/><stop offset="100%" stop-color="#111a33"/></linearGradient><linearGradient id="bar" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#38bdf8"/><stop offset="100%" stop-color="#818cf8"/></linearGradient></defs><rect width="1200" height="260" fill="url(#bg)"/><rect width="1200" height="8" x="0" y="252" fill="url(#bar)"/><rect width="116" height="116" x="76" y="70" fill="#f8fafc" rx="26"/><text x="134" y="150" fill="#0f172a" font-size="58" font-weight="700" text-anchor="middle">继续</text><text x="236" y="122" fill="#f8fafc" font-size="54" font-weight="800">dsh-auto-continue</text><text x="238" y="164" fill="#94a3b8" font-size="26">DSH Web UI plugin — auto-continue interrupted requests</text><text x="238" y="202" fill="#7dd3fc" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="21">turn/end · error | interrupted | max-tokens → prompt("继续")</text></svg>
|
package/docs/banner-zh.svg
CHANGED
|
@@ -1,25 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#f8fafc"/>
|
|
5
|
-
<stop offset="60%" stop-color="#e0f2fe"/>
|
|
6
|
-
<stop offset="100%" stop-color="#e0e7ff"/>
|
|
7
|
-
</linearGradient>
|
|
8
|
-
<linearGradient id="bar" x1="0" y1="0" x2="1" y2="0">
|
|
9
|
-
<stop offset="0%" stop-color="#0ea5e9"/>
|
|
10
|
-
<stop offset="100%" stop-color="#6366f1"/>
|
|
11
|
-
</linearGradient>
|
|
12
|
-
</defs>
|
|
13
|
-
<rect width="1200" height="260" fill="url(#bg)"/>
|
|
14
|
-
<!-- accent bar -->
|
|
15
|
-
<rect x="0" y="252" width="1200" height="8" fill="url(#bar)"/>
|
|
16
|
-
<!-- 继续 chip -->
|
|
17
|
-
<rect x="76" y="70" width="116" height="116" rx="26" fill="#0f172a"/>
|
|
18
|
-
<text x="134" y="150" font-size="58" font-weight="700" fill="#e2e8f0" text-anchor="middle">继续</text>
|
|
19
|
-
<!-- title -->
|
|
20
|
-
<text x="236" y="122" font-size="54" font-weight="800" fill="#0f172a">dsh-auto-continue</text>
|
|
21
|
-
<!-- subtitle -->
|
|
22
|
-
<text x="238" y="164" font-size="26" fill="#475569">DSH Web UI plugin — auto-continue interrupted requests</text>
|
|
23
|
-
<!-- caption -->
|
|
24
|
-
<text x="238" y="202" font-size="21" fill="#64748b" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">turn/end · error | interrupted | max-tokens → prompt("继续")</text>
|
|
25
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 1200 260"><defs><linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop offset="0%" stop-color="#f8fafc"/><stop offset="60%" stop-color="#e0f2fe"/><stop offset="100%" stop-color="#e0e7ff"/></linearGradient><linearGradient id="bar" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#0ea5e9"/><stop offset="100%" stop-color="#6366f1"/></linearGradient></defs><rect width="1200" height="260" fill="url(#bg)"/><rect width="1200" height="8" x="0" y="252" fill="url(#bar)"/><rect width="116" height="116" x="76" y="70" fill="#0f172a" rx="26"/><text x="134" y="150" fill="#e2e8f0" font-size="58" font-weight="700" text-anchor="middle">继续</text><text x="236" y="122" fill="#0f172a" font-size="54" font-weight="800">dsh-auto-continue</text><text x="238" y="164" fill="#475569" font-size="26">DSH Web UI plugin — auto-continue interrupted requests</text><text x="238" y="202" fill="#64748b" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="21">turn/end · error | interrupted | max-tokens → prompt("继续")</text></svg>
|
package/docs/banner.svg
CHANGED
|
@@ -1,25 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#f8fafc"/>
|
|
5
|
-
<stop offset="60%" stop-color="#e0f2fe"/>
|
|
6
|
-
<stop offset="100%" stop-color="#e0e7ff"/>
|
|
7
|
-
</linearGradient>
|
|
8
|
-
<linearGradient id="bar" x1="0" y1="0" x2="1" y2="0">
|
|
9
|
-
<stop offset="0%" stop-color="#0ea5e9"/>
|
|
10
|
-
<stop offset="100%" stop-color="#6366f1"/>
|
|
11
|
-
</linearGradient>
|
|
12
|
-
</defs>
|
|
13
|
-
<rect width="1200" height="260" fill="url(#bg)"/>
|
|
14
|
-
<!-- accent bar -->
|
|
15
|
-
<rect x="0" y="252" width="1200" height="8" fill="url(#bar)"/>
|
|
16
|
-
<!-- Continue chip -->
|
|
17
|
-
<rect x="76" y="70" width="148" height="116" rx="26" fill="#0f172a"/>
|
|
18
|
-
<text x="150" y="136" font-size="34" font-weight="700" fill="#e2e8f0" text-anchor="middle">Continue</text>
|
|
19
|
-
<!-- title -->
|
|
20
|
-
<text x="268" y="122" font-size="54" font-weight="800" fill="#0f172a">dsh-auto-continue</text>
|
|
21
|
-
<!-- subtitle -->
|
|
22
|
-
<text x="270" y="164" font-size="26" fill="#475569">DSH Web UI plugin — auto-continue interrupted requests</text>
|
|
23
|
-
<!-- caption -->
|
|
24
|
-
<text x="270" y="202" font-size="21" fill="#64748b" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">turn/end · error | interrupted | max-tokens → prompt("Continue")</text>
|
|
25
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="260" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 1200 260"><defs><linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop offset="0%" stop-color="#f8fafc"/><stop offset="60%" stop-color="#e0f2fe"/><stop offset="100%" stop-color="#e0e7ff"/></linearGradient><linearGradient id="bar" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#0ea5e9"/><stop offset="100%" stop-color="#6366f1"/></linearGradient></defs><rect width="1200" height="260" fill="url(#bg)"/><rect width="1200" height="8" x="0" y="252" fill="url(#bar)"/><rect width="148" height="116" x="76" y="70" fill="#0f172a" rx="26"/><text x="150" y="136" fill="#e2e8f0" font-size="34" font-weight="700" text-anchor="middle">Continue</text><text x="268" y="122" fill="#0f172a" font-size="54" font-weight="800">dsh-auto-continue</text><text x="270" y="164" fill="#475569" font-size="26">DSH Web UI plugin — auto-continue interrupted requests</text><text x="270" y="202" fill="#64748b" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="21">turn/end · error | interrupted | max-tokens → prompt("Continue")</text></svg>
|
package/docs/demo-zh.svg
CHANGED
|
@@ -1,50 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="420"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#0b1220"/>
|
|
5
|
-
<stop offset="100%" stop-color="#0e1a2e"/>
|
|
6
|
-
</linearGradient>
|
|
7
|
-
<linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
|
|
8
|
-
<stop offset="0%" stop-color="#38bdf8"/>
|
|
9
|
-
<stop offset="100%" stop-color="#818cf8"/>
|
|
10
|
-
</linearGradient>
|
|
11
|
-
</defs>
|
|
12
|
-
<rect width="720" height="420" rx="20" fill="url(#bg)"/>
|
|
13
|
-
<!-- header -->
|
|
14
|
-
<rect x="0" y="0" width="720" height="46" rx="20" fill="#111c30"/>
|
|
15
|
-
<rect x="0" y="30" width="720" height="16" fill="#111c30"/>
|
|
16
|
-
<circle cx="22" cy="23" r="5" fill="#f87171"/><circle cx="38" cy="23" r="5" fill="#fbbf24"/><circle cx="54" cy="23" r="5" fill="#34d399"/>
|
|
17
|
-
<text x="600" y="28" font-size="13" fill="#64748b" text-anchor="end">dsh web — 会话</text>
|
|
18
|
-
<rect x="0" y="46" width="720" height="3" fill="url(#accent)" opacity="0.7"/>
|
|
19
|
-
<!-- chat area -->
|
|
20
|
-
<text x="40" y="92" font-size="14" fill="#94a3b8">你</text>
|
|
21
|
-
<rect x="40" y="100" width="300" height="34" rx="10" fill="#1e293b"/>
|
|
22
|
-
<text x="52" y="121" font-size="13" fill="#e2e8f0">优化一下这个函数</text>
|
|
23
|
-
<text x="40" y="164" font-size="14" fill="#94a3b8">助手</text>
|
|
24
|
-
<!-- 助手 typing phase A (visible 0-1.2s and 4.2-5.2s) -->
|
|
25
|
-
<g>
|
|
26
|
-
<animate attributeName="opacity" values="1;1;0;0;0;0;1;1;0" keyTimes="0;0.24;0.28;0.5;0.6;0.84;0.88;1;1" dur="5.2s" repeatCount="indefinite"/>
|
|
27
|
-
<rect x="40" y="172" width="150" height="34" rx="10" fill="#0f1b2e" stroke="#23324a"/>
|
|
28
|
-
<circle cx="70" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" values="0.3;1;0.3" dur="0.9s" repeatCount="indefinite"/></circle>
|
|
29
|
-
<circle cx="88" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" values="0.3;1;0.3" dur="0.9s" begin="0.3s" repeatCount="indefinite"/></circle>
|
|
30
|
-
<circle cx="106" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" values="0.3;1;0.3" dur="0.9s" begin="0.6s" repeatCount="indefinite"/></circle>
|
|
31
|
-
</g>
|
|
32
|
-
<!-- error banner phase B (1.4-2.4s) -->
|
|
33
|
-
<g>
|
|
34
|
-
<animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.28;0.32;0.48;0.52;1" dur="5.2s" repeatCount="indefinite"/>
|
|
35
|
-
<rect x="40" y="236" width="420" height="40" rx="10" fill="#2a1215" stroke="#b91c1c"/>
|
|
36
|
-
<circle cx="64" cy="256" r="7" fill="#f87171"/>
|
|
37
|
-
<text x="82" y="261" font-size="13" fill="#fecaca">请求中断 — 网络错误 (UPSTREAM)</text>
|
|
38
|
-
</g>
|
|
39
|
-
<!-- auto 继续 bubble phase C (2.6-3.8s) -->
|
|
40
|
-
<g>
|
|
41
|
-
<animate attributeName="opacity" values="0;0;0;1;1;0;0" keyTimes="0;0.32;0.5;0.54;0.72;0.76;1" dur="5.2s" repeatCount="indefinite"/>
|
|
42
|
-
<rect x="40" y="300" width="150" height="36" rx="10" fill="#0c4a6e" stroke="#38bdf8" stroke-width="1.5"/>
|
|
43
|
-
<text x="52" y="323" font-size="13" fill="#e0f2fe">⏳ 自动发送: 继续</text>
|
|
44
|
-
<text x="210" y="323" font-size="12" fill="#38bdf8">来自 dsh-auto-continue</text>
|
|
45
|
-
</g>
|
|
46
|
-
<!-- 助手 resumed phase D (4.2-5.2s): same typing group reused -->
|
|
47
|
-
<!-- footer status bar -->
|
|
48
|
-
<rect x="0" y="402" width="720" height="18" fill="#0d1524"/>
|
|
49
|
-
<text x="360" y="414" font-size="11" fill="#475569" text-anchor="middle">宽限 3s → 自动「继续」→ 恢复 — 循环演示</text>
|
|
50
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="420" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 720 420"><defs><linearGradient id="bg" x1="0" x2="0" y1="0" y2="1"><stop offset="0%" stop-color="#0b1220"/><stop offset="100%" stop-color="#0e1a2e"/></linearGradient><linearGradient id="accent" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#38bdf8"/><stop offset="100%" stop-color="#818cf8"/></linearGradient></defs><rect width="720" height="420" fill="url(#bg)" rx="20"/><rect width="720" height="46" x="0" y="0" fill="#111c30" rx="20"/><rect width="720" height="16" x="0" y="30" fill="#111c30"/><circle cx="22" cy="23" r="5" fill="#f87171"/><circle cx="38" cy="23" r="5" fill="#fbbf24"/><circle cx="54" cy="23" r="5" fill="#34d399"/><text x="600" y="28" fill="#64748b" font-size="13" text-anchor="end">dsh web — 会话</text><rect width="720" height="3" x="0" y="46" fill="url(#accent)" opacity=".7"/><text x="40" y="92" fill="#94a3b8" font-size="14">你</text><rect width="300" height="34" x="40" y="100" fill="#1e293b" rx="10"/><text x="52" y="121" fill="#e2e8f0" font-size="13">优化一下这个函数</text><text x="40" y="164" fill="#94a3b8" font-size="14">助手</text><g><animate attributeName="opacity" dur="5.2s" keyTimes="0;0.24;0.28;0.5;0.6;0.84;0.88;1;1" repeatCount="indefinite" values="1;1;0;0;0;0;1;1;0"/><rect width="150" height="34" x="40" y="172" fill="#0f1b2e" stroke="#23324a" rx="10"/><circle cx="70" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" dur="0.9s" repeatCount="indefinite" values="0.3;1;0.3"/></circle><circle cx="88" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" begin="0.3s" dur="0.9s" repeatCount="indefinite" values="0.3;1;0.3"/></circle><circle cx="106" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" begin="0.6s" dur="0.9s" repeatCount="indefinite" values="0.3;1;0.3"/></circle></g><g><animate attributeName="opacity" dur="5.2s" keyTimes="0;0.28;0.32;0.48;0.52;1" repeatCount="indefinite" values="0;0;1;1;0;0"/><rect width="420" height="40" x="40" y="236" fill="#2a1215" stroke="#b91c1c" rx="10"/><circle cx="64" cy="256" r="7" fill="#f87171"/><text x="82" y="261" fill="#fecaca" font-size="13">请求中断 — 网络错误 (UPSTREAM)</text></g><g><animate attributeName="opacity" dur="5.2s" keyTimes="0;0.32;0.5;0.54;0.72;0.76;1" repeatCount="indefinite" values="0;0;0;1;1;0;0"/><rect width="150" height="36" x="40" y="300" fill="#0c4a6e" stroke="#38bdf8" stroke-width="1.5" rx="10"/><text x="52" y="323" fill="#e0f2fe" font-size="13">⏳ 自动发送: 继续</text><text x="210" y="323" fill="#38bdf8" font-size="12">来自 dsh-auto-continue</text></g><rect width="720" height="18" x="0" y="402" fill="#0d1524"/><text x="360" y="414" fill="#475569" font-size="11" text-anchor="middle">宽限 3s → 自动「继续」→ 恢复 — 循环演示</text></svg>
|
package/docs/demo.svg
CHANGED
|
@@ -1,50 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="420"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#0b1220"/>
|
|
5
|
-
<stop offset="100%" stop-color="#0e1a2e"/>
|
|
6
|
-
</linearGradient>
|
|
7
|
-
<linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
|
|
8
|
-
<stop offset="0%" stop-color="#38bdf8"/>
|
|
9
|
-
<stop offset="100%" stop-color="#818cf8"/>
|
|
10
|
-
</linearGradient>
|
|
11
|
-
</defs>
|
|
12
|
-
<rect width="720" height="420" rx="20" fill="url(#bg)"/>
|
|
13
|
-
<!-- header -->
|
|
14
|
-
<rect x="0" y="0" width="720" height="46" rx="20" fill="#111c30"/>
|
|
15
|
-
<rect x="0" y="30" width="720" height="16" fill="#111c30"/>
|
|
16
|
-
<circle cx="22" cy="23" r="5" fill="#f87171"/><circle cx="38" cy="23" r="5" fill="#fbbf24"/><circle cx="54" cy="23" r="5" fill="#34d399"/>
|
|
17
|
-
<text x="600" y="28" font-size="13" fill="#64748b" text-anchor="end">dsh web — session</text>
|
|
18
|
-
<rect x="0" y="46" width="720" height="3" fill="url(#accent)" opacity="0.7"/>
|
|
19
|
-
<!-- chat area -->
|
|
20
|
-
<text x="40" y="92" font-size="14" fill="#94a3b8">you</text>
|
|
21
|
-
<rect x="40" y="100" width="300" height="34" rx="10" fill="#1e293b"/>
|
|
22
|
-
<text x="52" y="121" font-size="13" fill="#e2e8f0">Refactor this function</text>
|
|
23
|
-
<text x="40" y="164" font-size="14" fill="#94a3b8">agent</text>
|
|
24
|
-
<!-- agent typing phase A (visible 0-1.2s and 4.2-5.2s) -->
|
|
25
|
-
<g>
|
|
26
|
-
<animate attributeName="opacity" values="1;1;0;0;0;0;1;1;0" keyTimes="0;0.24;0.28;0.5;0.6;0.84;0.88;1;1" dur="5.2s" repeatCount="indefinite"/>
|
|
27
|
-
<rect x="40" y="172" width="150" height="34" rx="10" fill="#0f1b2e" stroke="#23324a"/>
|
|
28
|
-
<circle cx="70" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" values="0.3;1;0.3" dur="0.9s" repeatCount="indefinite"/></circle>
|
|
29
|
-
<circle cx="88" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" values="0.3;1;0.3" dur="0.9s" begin="0.3s" repeatCount="indefinite"/></circle>
|
|
30
|
-
<circle cx="106" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" values="0.3;1;0.3" dur="0.9s" begin="0.6s" repeatCount="indefinite"/></circle>
|
|
31
|
-
</g>
|
|
32
|
-
<!-- error banner phase B (1.4-2.4s) -->
|
|
33
|
-
<g>
|
|
34
|
-
<animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.28;0.32;0.48;0.52;1" dur="5.2s" repeatCount="indefinite"/>
|
|
35
|
-
<rect x="40" y="236" width="420" height="40" rx="10" fill="#2a1215" stroke="#b91c1c"/>
|
|
36
|
-
<circle cx="64" cy="256" r="7" fill="#f87171"/>
|
|
37
|
-
<text x="82" y="261" font-size="13" fill="#fecaca">Request interrupted — network error (UPSTREAM)</text>
|
|
38
|
-
</g>
|
|
39
|
-
<!-- auto 继续 bubble phase C (2.6-3.8s) -->
|
|
40
|
-
<g>
|
|
41
|
-
<animate attributeName="opacity" values="0;0;0;1;1;0;0" keyTimes="0;0.32;0.5;0.54;0.72;0.76;1" dur="5.2s" repeatCount="indefinite"/>
|
|
42
|
-
<rect x="40" y="300" width="150" height="36" rx="10" fill="#0c4a6e" stroke="#38bdf8" stroke-width="1.5"/>
|
|
43
|
-
<text x="52" y="323" font-size="13" fill="#e0f2fe">⏳ auto-sent: 继续</text>
|
|
44
|
-
<text x="210" y="323" font-size="12" fill="#38bdf8">by dsh-auto-continue</text>
|
|
45
|
-
</g>
|
|
46
|
-
<!-- agent resumed phase D (4.2-5.2s): same typing group reused -->
|
|
47
|
-
<!-- footer status bar -->
|
|
48
|
-
<rect x="0" y="402" width="720" height="18" fill="#0d1524"/>
|
|
49
|
-
<text x="360" y="414" font-size="11" fill="#475569" text-anchor="middle">grace 3s → auto 继续 → resume — looped demo</text>
|
|
50
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="420" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 720 420"><defs><linearGradient id="bg" x1="0" x2="0" y1="0" y2="1"><stop offset="0%" stop-color="#0b1220"/><stop offset="100%" stop-color="#0e1a2e"/></linearGradient><linearGradient id="accent" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#38bdf8"/><stop offset="100%" stop-color="#818cf8"/></linearGradient></defs><rect width="720" height="420" fill="url(#bg)" rx="20"/><rect width="720" height="46" x="0" y="0" fill="#111c30" rx="20"/><rect width="720" height="16" x="0" y="30" fill="#111c30"/><circle cx="22" cy="23" r="5" fill="#f87171"/><circle cx="38" cy="23" r="5" fill="#fbbf24"/><circle cx="54" cy="23" r="5" fill="#34d399"/><text x="600" y="28" fill="#64748b" font-size="13" text-anchor="end">dsh web — session</text><rect width="720" height="3" x="0" y="46" fill="url(#accent)" opacity=".7"/><text x="40" y="92" fill="#94a3b8" font-size="14">you</text><rect width="300" height="34" x="40" y="100" fill="#1e293b" rx="10"/><text x="52" y="121" fill="#e2e8f0" font-size="13">Refactor this function</text><text x="40" y="164" fill="#94a3b8" font-size="14">agent</text><g><animate attributeName="opacity" dur="5.2s" keyTimes="0;0.24;0.28;0.5;0.6;0.84;0.88;1;1" repeatCount="indefinite" values="1;1;0;0;0;0;1;1;0"/><rect width="150" height="34" x="40" y="172" fill="#0f1b2e" stroke="#23324a" rx="10"/><circle cx="70" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" dur="0.9s" repeatCount="indefinite" values="0.3;1;0.3"/></circle><circle cx="88" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" begin="0.3s" dur="0.9s" repeatCount="indefinite" values="0.3;1;0.3"/></circle><circle cx="106" cy="189" r="4" fill="#64748b"><animate attributeName="opacity" begin="0.6s" dur="0.9s" repeatCount="indefinite" values="0.3;1;0.3"/></circle></g><g><animate attributeName="opacity" dur="5.2s" keyTimes="0;0.28;0.32;0.48;0.52;1" repeatCount="indefinite" values="0;0;1;1;0;0"/><rect width="420" height="40" x="40" y="236" fill="#2a1215" stroke="#b91c1c" rx="10"/><circle cx="64" cy="256" r="7" fill="#f87171"/><text x="82" y="261" fill="#fecaca" font-size="13">Request interrupted — network error (UPSTREAM)</text></g><g><animate attributeName="opacity" dur="5.2s" keyTimes="0;0.32;0.5;0.54;0.72;0.76;1" repeatCount="indefinite" values="0;0;0;1;1;0;0"/><rect width="150" height="36" x="40" y="300" fill="#0c4a6e" stroke="#38bdf8" stroke-width="1.5" rx="10"/><text x="52" y="323" fill="#e0f2fe" font-size="13">⏳ auto-sent: 继续</text><text x="210" y="323" fill="#38bdf8" font-size="12">by dsh-auto-continue</text></g><rect width="720" height="18" x="0" y="402" fill="#0d1524"/><text x="360" y="414" fill="#475569" font-size="11" text-anchor="middle">grace 3s → auto 继续 → resume — looped demo</text></svg>
|
package/docs/social-preview.png
CHANGED
|
Binary file
|
package/docs/social-preview.svg
CHANGED
|
@@ -1,43 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="640"
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0%" stop-color="#0b1220"/>
|
|
5
|
-
<stop offset="55%" stop-color="#0c2336"/>
|
|
6
|
-
<stop offset="100%" stop-color="#101a30"/>
|
|
7
|
-
</linearGradient>
|
|
8
|
-
<linearGradient id="glow" x1="0" y1="0" x2="1" y2="0">
|
|
9
|
-
<stop offset="0%" stop-color="#38bdf8" stop-opacity="0.16"/>
|
|
10
|
-
<stop offset="100%" stop-color="#818cf8" stop-opacity="0.16"/>
|
|
11
|
-
</linearGradient>
|
|
12
|
-
<linearGradient id="bar" x1="0" y1="0" x2="1" y2="0">
|
|
13
|
-
<stop offset="0%" stop-color="#38bdf8"/>
|
|
14
|
-
<stop offset="100%" stop-color="#818cf8"/>
|
|
15
|
-
</linearGradient>
|
|
16
|
-
<linearGradient id="chip" x1="0" y1="0" x2="0" y2="1">
|
|
17
|
-
<stop offset="0%" stop-color="#f8fafc"/>
|
|
18
|
-
<stop offset="100%" stop-color="#e2e8f0"/>
|
|
19
|
-
</linearGradient>
|
|
20
|
-
</defs>
|
|
21
|
-
<rect width="1280" height="640" fill="url(#bg)"/>
|
|
22
|
-
<rect x="0" y="0" width="1280" height="300" fill="url(#glow)"/>
|
|
23
|
-
<!-- Continue chip -->
|
|
24
|
-
<rect x="88" y="120" width="250" height="180" rx="40" fill="url(#chip)"/>
|
|
25
|
-
<text x="213" y="226" font-size="64" font-weight="800" fill="#0f172a" text-anchor="middle">Continue</text>
|
|
26
|
-
<!-- title -->
|
|
27
|
-
<text x="400" y="200" font-size="76" font-weight="800" fill="#f8fafc">dsh-auto-continue</text>
|
|
28
|
-
<!-- subtitle -->
|
|
29
|
-
<text x="402" y="258" font-size="32" fill="#94a3b8">DSH Web UI plugin — auto-continue interrupted requests</text>
|
|
30
|
-
<!-- caption -->
|
|
31
|
-
<text x="402" y="316" font-size="24" fill="#7dd3fc" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">turn/end · error | interrupted | max-tokens → prompt("Continue")</text>
|
|
32
|
-
<!-- feature pills -->
|
|
33
|
-
<rect x="402" y="368" width="250" height="56" rx="28" fill="#1e293b" stroke="#334155"/>
|
|
34
|
-
<text x="527" y="403" font-size="22" fill="#e2e8f0" text-anchor="middle">auto-resume on failure</text>
|
|
35
|
-
<rect x="668" y="368" width="264" height="56" rx="28" fill="#1e293b" stroke="#334155"/>
|
|
36
|
-
<text x="800" y="403" font-size="22" fill="#e2e8f0" text-anchor="middle">GUI-configurable settings</text>
|
|
37
|
-
<rect x="948" y="368" width="240" height="56" rx="28" fill="#1e293b" stroke="#334155"/>
|
|
38
|
-
<text x="1068" y="403" font-size="22" fill="#e2e8f0" text-anchor="middle">dsh plugin add</text>
|
|
39
|
-
<!-- repo line -->
|
|
40
|
-
<text x="402" y="500" font-size="26" fill="#64748b">github.com/HsiangNianian/dsh-auto-continue</text>
|
|
41
|
-
<!-- accent bar -->
|
|
42
|
-
<rect x="0" y="628" width="1280" height="12" fill="url(#bar)"/>
|
|
43
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="640" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif" viewBox="0 0 1280 640"><defs><linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop offset="0%" stop-color="#0b1220"/><stop offset="55%" stop-color="#0c2336"/><stop offset="100%" stop-color="#101a30"/></linearGradient><linearGradient id="glow" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#38bdf8" stop-opacity=".16"/><stop offset="100%" stop-color="#818cf8" stop-opacity=".16"/></linearGradient><linearGradient id="bar" x1="0" x2="1" y1="0" y2="0"><stop offset="0%" stop-color="#38bdf8"/><stop offset="100%" stop-color="#818cf8"/></linearGradient><linearGradient id="chip" x1="0" x2="0" y1="0" y2="1"><stop offset="0%" stop-color="#f8fafc"/><stop offset="100%" stop-color="#e2e8f0"/></linearGradient></defs><rect width="1280" height="640" fill="url(#bg)"/><rect width="1280" height="300" x="0" y="0" fill="url(#glow)"/><rect width="250" height="180" x="88" y="120" fill="url(#chip)" rx="40"/><text x="213" y="226" fill="#0f172a" font-size="64" font-weight="800" text-anchor="middle">Continue</text><text x="400" y="200" fill="#f8fafc" font-size="76" font-weight="800">dsh-auto-continue</text><text x="402" y="258" fill="#94a3b8" font-size="32">DSH Web UI plugin — auto-continue interrupted requests</text><text x="402" y="316" fill="#7dd3fc" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="24">turn/end · error | interrupted | max-tokens → prompt("Continue")</text><rect width="250" height="56" x="402" y="368" fill="#1e293b" stroke="#334155" rx="28"/><text x="527" y="403" fill="#e2e8f0" font-size="22" text-anchor="middle">auto-resume on failure</text><rect width="264" height="56" x="668" y="368" fill="#1e293b" stroke="#334155" rx="28"/><text x="800" y="403" fill="#e2e8f0" font-size="22" text-anchor="middle">GUI-configurable settings</text><rect width="240" height="56" x="948" y="368" fill="#1e293b" stroke="#334155" rx="28"/><text x="1068" y="403" fill="#e2e8f0" font-size="22" text-anchor="middle">dsh plugin add</text><text x="402" y="500" fill="#64748b" font-size="26">github.com/HsiangNianian/dsh-auto-continue</text><rect width="1280" height="12" x="0" y="628" fill="url(#bar)"/></svg>
|
package/lib/client.js
CHANGED
|
@@ -558,6 +558,7 @@ var AutoContinueRunner = class {
|
|
|
558
558
|
|
|
559
559
|
// src/client/locales.ts
|
|
560
560
|
var zh = {
|
|
561
|
+
"nav": "自动继续",
|
|
561
562
|
"card.title": "自动继续",
|
|
562
563
|
"card.description": "请求因网络等原因(非人为)中断后, 自动发送「继续」续跑。",
|
|
563
564
|
"field.continueText": "继续文本",
|
|
@@ -604,6 +605,7 @@ var zh = {
|
|
|
604
605
|
"chrome.off": "关"
|
|
605
606
|
};
|
|
606
607
|
var en = {
|
|
608
|
+
"nav": "Auto continue",
|
|
607
609
|
"card.title": "Auto continue",
|
|
608
610
|
"card.description": "When a request is interrupted by a non-human cause, automatically send 「继续」 to resume.",
|
|
609
611
|
"field.continueText": "Continue text",
|
|
@@ -1338,12 +1340,13 @@ function apply(ctx) {
|
|
|
1338
1340
|
current = new AutoContinueRunner(ctx.connection.api, () => resolveConfig(scope.getSnapshot().value));
|
|
1339
1341
|
const controller = new AutoContinueSettingsCardController(scope);
|
|
1340
1342
|
ctx.slots.inject(
|
|
1341
|
-
"settings.
|
|
1343
|
+
"settings.section",
|
|
1342
1344
|
() => ctx.slots.register(
|
|
1343
1345
|
{
|
|
1344
|
-
name: "settings.
|
|
1346
|
+
name: "settings.section",
|
|
1345
1347
|
id: "auto-continue",
|
|
1346
|
-
order:
|
|
1348
|
+
order: 21,
|
|
1349
|
+
label: () => ctx.locale.bind(NS)("nav"),
|
|
1347
1350
|
locale: NS,
|
|
1348
1351
|
inject: () => controller.inject()
|
|
1349
1352
|
},
|