dsh-tree-task-flow 0.2.0 → 0.3.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 +86 -38
- package/client.js +426 -463
- package/config.example.yml +27 -0
- package/cordis.patch.yml +5 -4
- package/lib/auto-continue.js +3 -5
- package/lib/commands.js +26 -26
- package/lib/http.js +12 -5
- package/lib/index.js +23 -16
- package/lib/pause.js +138 -0
- package/lib/plan.js +5 -6
- package/lib/prompt.js +28 -30
- package/lib/tools.js +1 -62
- package/package.json +2 -2
- package/enable.example.yml +0 -4
package/README.md
CHANGED
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
**目标 → 任务 → 子任务**三级树,每个节点完成时由模型提交结果,插件随即把这个节点的
|
|
5
5
|
**执行过程**从上下文里折叠掉,只留下那条结果。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**安装即启用**:`dsh plugin add` 之后就生效,不需要再改任何配置。
|
|
8
|
+
不想用的时候,在 profile 里写一句 `enabled: false` 就能关掉,关掉后一个字节都不碰会话。
|
|
8
9
|
|
|
9
10
|
## 它解决什么
|
|
10
11
|
|
|
11
12
|
长任务跑到后半程,上下文里绝大多数内容是**过程**:读过哪些文件、试过哪些错、
|
|
12
13
|
执行过哪些命令。这些内容对后面没有用,但会一直占着位置——每多一轮,
|
|
13
|
-
|
|
14
|
+
喂给模型的上下文就更长一分,而其中真正需要留住的只有寥寥几句。
|
|
14
15
|
|
|
15
16
|
真正需要留给后面的只有一句话:**这一步做完了,它产出了什么。**
|
|
16
17
|
|
|
@@ -24,7 +25,7 @@
|
|
|
24
25
|
## 上下文怎么长
|
|
25
26
|
|
|
26
27
|
```
|
|
27
|
-
[节点 0] 系统提示词(身份 / 工具 schema /
|
|
28
|
+
[节点 0] 系统提示词(身份 / 工具 schema / 工具说明) ← 不随计划变化
|
|
28
29
|
[用户消息]
|
|
29
30
|
[目标级汇总] ← 换目标时逐条累积
|
|
30
31
|
[任务级汇总] ← 换任务时逐条累积
|
|
@@ -56,13 +57,13 @@
|
|
|
56
57
|
|
|
57
58
|
```
|
|
58
59
|
检查点:任务「重构解析器」(t-3) 的子节点已全部结束。
|
|
59
|
-
|
|
60
|
+
此刻轮到你的判断:用 tree_task_plan 继续给 t-3 拆子节点,
|
|
61
|
+
或者用 tree_task_done 提交这个任务的结果并完成它。
|
|
60
62
|
```
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
检查点只拦模型(`tools/pre-execute`),拦不住人:`/task-tree` 命令随时能接管。
|
|
64
|
+
**检查点只是提示,不是闸门。** 它出现在 `tree_task_done` 的回执、树上和汇总消息里,
|
|
65
|
+
但插件**不会拦住任何工具**——"这一层到底做完了没有"由模型判断,插件既不替它定死,
|
|
66
|
+
也不靠拒绝别的工具把它逼到墙角。
|
|
66
67
|
|
|
67
68
|
## 六个工具
|
|
68
69
|
|
|
@@ -81,55 +82,69 @@
|
|
|
81
82
|
|
|
82
83
|
需要 Node.js 22.19 以上,以及能运行 `dsh`。
|
|
83
84
|
|
|
85
|
+
**从 npm 安装**:
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
dsh plugin --profile web add dsh-tree-task-flow
|
|
89
|
+
```
|
|
90
|
+
|
|
84
91
|
**从源码目录安装**(装成 `link:`,改完源码重启即生效)。把仓库克隆到任意目录,
|
|
85
92
|
然后指向那个目录:
|
|
86
93
|
|
|
87
94
|
```powershell
|
|
88
95
|
dsh plugin --profile web add <插件目录>
|
|
89
|
-
dsh --profile web --dump-config # 输出里应出现 task-tree 这一行
|
|
90
96
|
```
|
|
91
97
|
|
|
92
|
-
|
|
98
|
+
`dsh plugin add` 会把包加进 profile 的 `dsh.profile.bundles`,而本包自带的
|
|
99
|
+
`cordis.patch.yml`(由 `package.json` 的 `dsh.bundle.patch` 指定)会顺势把
|
|
100
|
+
`task-tree` 这一行插进插件列表——**装上即启用,不需要再改任何配置**。装完可以核对:
|
|
93
101
|
|
|
94
102
|
```powershell
|
|
95
|
-
dsh
|
|
103
|
+
dsh --profile web --dump-config # 输出里应出现 task-tree 这一行,且不带 config
|
|
96
104
|
```
|
|
97
105
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
## 启用
|
|
106
|
+
**必须重启 `dsh web` 才生效**——运行中的会话不追溯,新工具要在新会话里才会出现。
|
|
101
107
|
|
|
102
|
-
|
|
108
|
+
## 关闭
|
|
103
109
|
|
|
104
|
-
|
|
110
|
+
不想要了,除了 `dsh plugin remove` 卸掉,也可以只把它关掉。在
|
|
111
|
+
`$DSH_HOME/profiles/<名字>/cordis.patch.yml` 里写:
|
|
105
112
|
|
|
106
113
|
```yaml
|
|
107
114
|
- id: task-tree
|
|
108
115
|
config:
|
|
109
|
-
enabled:
|
|
116
|
+
enabled: false
|
|
110
117
|
```
|
|
111
118
|
|
|
112
|
-
然后重启 `dsh web`。仓库里的 `
|
|
119
|
+
然后重启 `dsh web`。仓库里的 `config.example.yml` 有可以直接抄的完整版本。
|
|
113
120
|
|
|
114
121
|
> ⚠️ profile 这一层按行覆盖时 `config` 是**整体替换**,不是逐字段深合并——
|
|
115
122
|
> 覆盖时要把想保留的字段一起写全,没写的会走插件默认值(见下面的配置表)。
|
|
116
123
|
|
|
117
|
-
|
|
118
|
-
|
|
124
|
+
关掉之后插件**一个字节都不碰会话**:不注册工具、不加提示词段落、不折叠、不续行、
|
|
125
|
+
不挂暂停闸门。只留一条 `/task-tree` 命令,让你确认它是被关掉的以及怎么打开。
|
|
119
126
|
|
|
120
127
|
## 界面
|
|
121
128
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
-
|
|
127
|
-
|
|
129
|
+
**输入框上方的「树形任务流」条目**(和内置的待办、目标条目并排,宽度与消息正文对齐)。
|
|
130
|
+
外观照内置条目做——用的是同一套 UI 基座(`@deepseek-ai/dsh-client-ui-primitives`
|
|
131
|
+
的图标、Tooltip 与 CSS 变量),所以它看起来就是内置的一部分:
|
|
132
|
+
|
|
133
|
+
- **折叠时**是目标条那样的 36px 单行条:左边清单图标,中间「阶段标签 + 目标标题 + 进度」,
|
|
134
|
+
右边一排圆形图标按钮——**暂停/继续**、清空计划、展开。
|
|
135
|
+
阶段标签四种:进行中 / 已暂停 / 检查点 / 已全部完成。
|
|
136
|
+
- **展开后**是待办清单那样的卡片:三级树之间有竖线与拐角连线,层级一眼看得出来;
|
|
137
|
+
同一层的节点之间、节点内部的各个内容块之间,各有一条分界线。
|
|
138
|
+
当前节点用虚线圈标出,已完成打勾、丢弃的划掉。
|
|
139
|
+
- 节点标题**不缩略**:有多长写多长,多了自动换行。
|
|
140
|
+
- 提交的结果**默认只占一行**,点一下摊开看全文。
|
|
141
|
+
- 节点上可以直接完成、丢弃,不用敲命令。
|
|
142
|
+
- 数据每 4 秒自动拉一次,模型在后台改计划时界面会自己跟上。
|
|
128
143
|
|
|
129
144
|
**没有计划的会话一个像素都不占**——读不到计划就返回 `null`,不会平白挤掉内置的
|
|
130
145
|
待办与目标条目。
|
|
131
146
|
|
|
132
|
-
开关不在界面上,在 profile 的 `cordis.patch.yml`
|
|
147
|
+
开关不在界面上,在 profile 的 `cordis.patch.yml` 里(见上面的「关闭」一节)。
|
|
133
148
|
|
|
134
149
|
## 命令
|
|
135
150
|
|
|
@@ -140,8 +155,8 @@ dsh plugin --profile web add dsh-tree-task-flow
|
|
|
140
155
|
| `/task-tree` | 查看本会话的任务树与检查点状态 |
|
|
141
156
|
| `/task-tree done <id> <结果>` | 提交某个节点的结果并完成它 |
|
|
142
157
|
| `/task-tree drop <id>` | 丢弃某个节点 |
|
|
143
|
-
| `/task-tree
|
|
144
|
-
| `/task-tree resume` |
|
|
158
|
+
| `/task-tree pause` | 暂停:正在跑的工具跑完就停住,不再往下推进 |
|
|
159
|
+
| `/task-tree resume` | 继续:从停住的地方接着跑,不往会话里插消息 |
|
|
145
160
|
| `/task-tree reset` | 清掉本会话的计划树 |
|
|
146
161
|
|
|
147
162
|
## 配置
|
|
@@ -150,12 +165,33 @@ dsh plugin --profile web add dsh-tree-task-flow
|
|
|
150
165
|
|
|
151
166
|
| 字段 | 默认 | 说明 |
|
|
152
167
|
|---|---|---|
|
|
153
|
-
| `enabled` | `
|
|
168
|
+
| `enabled` | `true` | 总开关;**装上即启用**,写 `false` 关掉 |
|
|
154
169
|
| `autoContinue` | `false` | 模型停下时是否自动续行 |
|
|
155
170
|
| `maxAutoRounds` | `5` | 连续自动续行的轮次上限 |
|
|
156
|
-
| `promptOrder` | `
|
|
171
|
+
| `promptOrder` | `1800` | 工具说明段落的排序 |
|
|
157
172
|
| `rootDir` | `null` | 状态目录,默认 `$DSH_HOME/dsh-task-tree` |
|
|
158
173
|
|
|
174
|
+
## 暂停与继续
|
|
175
|
+
|
|
176
|
+
界面上的暂停按钮(或 `/task-tree pause`)是**真暂停**,不是"关掉自动续行":
|
|
177
|
+
|
|
178
|
+
- **正在执行的那个工具会正常跑完**,不会被中途掐断;
|
|
179
|
+
- 它跑完之后,会话就静静停在原地——不再发起模型请求,也不再往下走一步;
|
|
180
|
+
- **全程不往会话里插任何消息**,上下文干干净净。
|
|
181
|
+
|
|
182
|
+
继续(界面按钮或 `/task-tree resume`)就是从这个岔口放行:模型从它原本要请求的地方
|
|
183
|
+
接着请求,同样**零新增消息**。任务树的进度停在哪儿,就从哪儿接着跑。
|
|
184
|
+
|
|
185
|
+
闸门开在 agent 的 `agent/pre-step` 上——一个 step 走完、工具结果都已落盘、模型还没
|
|
186
|
+
发起下一次请求的那一刻。这是唯一同时满足"不打断工具"和"不留痕迹"的位置:再晚一点
|
|
187
|
+
的 `agent/turn-stopping` 一旦放行,就得靠 `steer()` 推一条消息才能续上,那就留下痕迹了。
|
|
188
|
+
|
|
189
|
+
**闸门只拦自动推进,不拦真人发言。** 暂停期间你自己发一条消息,说明你要它跑,
|
|
190
|
+
插件会直接放行并解除暂停,不会把你堵在门外。
|
|
191
|
+
|
|
192
|
+
暂停期间人按界面上的停止(中断本轮)也不会卡住:闸门盯着本轮的取消信号,
|
|
193
|
+
信号一 abort 就立刻放行。
|
|
194
|
+
|
|
159
195
|
## 自动续行的四道闸门
|
|
160
196
|
|
|
161
197
|
`autoContinue` 默认关闭,开着也只是**兜底**:`tree_task_done` 的返回文本里已经带了
|
|
@@ -171,6 +207,9 @@ dsh plugin --profile web add dsh-tree-task-flow
|
|
|
171
207
|
|
|
172
208
|
队列里还有排队输入时也不抢,让用户先说话。
|
|
173
209
|
|
|
210
|
+
另外,**暂停会一并压住它**:`/task-tree pause` 之后,即使模型自己停了下来,
|
|
211
|
+
兜底也不会把它重新拉起来;`/task-tree resume` 再放开。
|
|
212
|
+
|
|
174
213
|
## 状态文件
|
|
175
214
|
|
|
176
215
|
全部在 `$DSH_HOME/dsh-task-tree/` 下,**以 `sessionId` 为键**:
|
|
@@ -197,8 +236,9 @@ dsh plugin --profile web add dsh-tree-task-flow
|
|
|
197
236
|
2. **折叠是尽力而为的。** 游标被压缩遮掉时收不起来,但结果一定进上下文。
|
|
198
237
|
面板上看到某段过程还在,通常是这个原因。
|
|
199
238
|
|
|
200
|
-
3.
|
|
201
|
-
|
|
239
|
+
3. **模型看到的工具说明不随计划变化,也不复述工具清单。** 那一段只讲什么时候用
|
|
240
|
+
这组工具、完成时守什么规矩;每个工具的用法由它自己的 `description` 承担。
|
|
241
|
+
要了解计划就让模型调 `tree_task_status`。
|
|
202
242
|
|
|
203
243
|
4. **每次折叠,界面上的"系统提示词"卡片会重新渲染一次,但提示词一个字都没变。**
|
|
204
244
|
DSH 把"上下文被替换过"记成一次请求序列的边界,界面在 `reason` 不是 `change`
|
|
@@ -209,6 +249,10 @@ dsh plugin --profile web add dsh-tree-task-flow
|
|
|
209
249
|
5. **改需求用「丢弃 + 追加」,不要重建整棵树。** 丢掉的节点留在树里可查,
|
|
210
250
|
它和完成的节点会合进同一条汇总。
|
|
211
251
|
|
|
252
|
+
6. **暂停不留痕迹。** 暂停后模型看到的是"没有下一条请求",看不到任何"你被暂停了"
|
|
253
|
+
之类的提示;继续之后也不会有"继续"消息进上下文。想让模型知道中间发生过什么,
|
|
254
|
+
得自己发消息说。
|
|
255
|
+
|
|
212
256
|
## 不做的事
|
|
213
257
|
|
|
214
258
|
| 不做 | 原因 |
|
|
@@ -216,18 +260,22 @@ dsh plugin --profile web add dsh-tree-task-flow
|
|
|
216
260
|
| 资料 / 文件快照 / 记忆 | 上下文里值得留下的只有结果,其余靠模型自己重读 |
|
|
217
261
|
| 文件回退 / 撤销 | 改需求用「丢弃 + 追加」 |
|
|
218
262
|
| 多目标并行(多个根) | 单活动计划,数据结构已预留扩展 |
|
|
219
|
-
| 把计划内容注入提示词 |
|
|
263
|
+
| 把计划内容注入提示词 | 计划状态由 `tree_task_status` 现取,提示词里只放不随计划变化的说明 |
|
|
220
264
|
|
|
221
265
|
## 自检
|
|
222
266
|
|
|
223
|
-
|
|
267
|
+
六个自检脚本都不 import 任何 `@deepseek-ai/*` 运行时包——插件以 `link:` 方式安装时,
|
|
224
268
|
从插件目录往上找不到宿主作用域的包,一旦 import 就根本跑不起来。
|
|
269
|
+
`verify-client.mjs` 因此自带一套最小的 `window` / `document` / React 替身,
|
|
270
|
+
真去物化 `client.js`、真调一次 `apply`、真渲染一遍条目。
|
|
225
271
|
|
|
226
272
|
```powershell
|
|
227
|
-
node verify-entry.mjs #
|
|
228
|
-
node verify-tools.mjs # 工具层:schema、result
|
|
273
|
+
node verify-entry.mjs # 入口装配:默认(安装即启用)/ 显式关闭两条路径各注册了什么
|
|
274
|
+
node verify-tools.mjs # 工具层:schema、result 必填、三级约束
|
|
229
275
|
node verify-region.mjs # 折叠行为:游标推进、降级追加、检查点提示
|
|
230
276
|
node verify-plan.mjs # 计划树纯逻辑:状态流转、自动完成、丢弃级联
|
|
277
|
+
node verify-pause.mjs # 暂停闸门:挂起、放行、取消信号、真人发言、会话隔离
|
|
278
|
+
node verify-client.mjs # 客户端条目:挂载点、样式注入、文案键集、四种渲染态
|
|
231
279
|
```
|
|
232
280
|
|
|
233
281
|
`verify-region.mjs` 用假 session 忠实复刻了 DSH surface 的三条硬规则
|
|
@@ -244,7 +292,7 @@ dsh plugin --profile web remove dsh-tree-task-flow
|
|
|
244
292
|
|
|
245
293
|
## 设计文档
|
|
246
294
|
|
|
247
|
-
- `docs/02-DSH插件开发方案.md` ——
|
|
295
|
+
- `docs/02-DSH插件开发方案.md` —— 完整设计:上下文组成、游标、折叠、检查点
|
|
248
296
|
- `docs/01-AIDesktop联动设计整理.md` —— 本插件最初的设计来源
|
|
249
297
|
|
|
250
298
|
## 许可
|