dsh-client-auto-continue 0.11.0 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -4
- package/README.zh.md +10 -4
- package/docs/auto-continue-workflow-icons.LICENSE.txt +40 -0
- package/docs/auto-continue-workflow.archify.json +155 -0
- package/docs/auto-continue-workflow.en.archify.json +155 -0
- package/docs/auto-continue-workflow.en.html +14844 -0
- package/docs/auto-continue-workflow.en.svg +530 -0
- package/docs/auto-continue-workflow.html +14844 -0
- package/docs/auto-continue-workflow.svg +530 -0
- package/docs/screenshots/02-settings-card.png +0 -0
- package/lib/client.js +0 -12
- package/lib/client.js.map +2 -2
- package/lib/index.js +3 -3
- package/lib/types/client/locales.d.ts +0 -1
- package/package.json +2 -2
- package/scripts/apply-workflow-icons.mjs +165 -0
- package/src/client/locales.ts +0 -2
- package/src/client/settings-card.tsx +0 -1
- package/src/client/styles.ts +0 -9
- package/src/index.ts +5 -5
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
|
+
[](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.
|
|
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,9 +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
|
|
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).
|
|
150
156
|
|
|
151
|
-
The
|
|
157
|
+
The settings 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.
|
|
152
158
|
|
|
153
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.
|
|
154
160
|
|
|
@@ -186,7 +192,7 @@ auto-continue:
|
|
|
186
192
|
|
|
187
193
|
**How the card works:**
|
|
188
194
|
|
|
189
|
-

|
|
190
196
|
|
|
191
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
|
|
192
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
|
+
[](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.
|
|
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,9 +152,9 @@ dsh web
|
|
|
146
152
|
|
|
147
153
|
## 配置
|
|
148
154
|
|
|
149
|
-
所有参数都可以在 GUI 里配置——无需改文件或控制台。打开 **设置 →
|
|
155
|
+
所有参数都可以在 GUI 里配置——无需改文件或控制台。打开 **设置 → 插件 → 插件配置**, **自动继续**会像其他插件一样显示为列表中的折叠卡片; 点击卡片或右侧箭头即可在当前位置展开完整配置。除了下面的字段, 展开后的卡片还带一个**统计面板**(今日活动, 可一键清零)和**已暂停会话**列表(每个都可单独解除)。
|
|
150
156
|
|
|
151
|
-
|
|
157
|
+
新版配置卡会按接力方式、安全节奏、恢复雷达、循环断路器与现场状态组织配置; 卡片顶部也直接放出了开源仓库和 **Star on GitHub** 入口。
|
|
152
158
|
|
|
153
159
|
**或者跳过 GUI, 直接编辑配置文件** — 引擎从 `~/.dsh/settings.yaml` 读取插件段落(所有插件的设置都在这一个文件里), 因此无论是否打过补丁都能用。文件被监听、自动重读, 改动即时生效; 若已打开的页面没反应, 重启 `dsh web` 即可。没填写的字段会回落到下表中的默认值。
|
|
154
160
|
|
|
@@ -186,7 +192,7 @@ auto-continue:
|
|
|
186
192
|
|
|
187
193
|
**卡片操作说明:**
|
|
188
194
|
|
|
189
|
-

|
|
190
196
|
|
|
191
197
|
- 修改是**暂存式**的——点「保存」之前不会写入磁盘; 有待保存草稿时卡片显示「未保存」徽章, 「放弃」可丢弃草稿
|
|
192
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
|
+
}
|