dsh-tree-task-flow 0.1.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/LICENSE +21 -0
- package/README.md +250 -0
- package/client.js +921 -0
- package/cordis.patch.yml +20 -0
- package/enable.example.yml +4 -0
- package/lib/auto-continue.js +132 -0
- package/lib/commands.js +189 -0
- package/lib/http.js +243 -0
- package/lib/index.js +110 -0
- package/lib/plan.js +430 -0
- package/lib/prompt.js +56 -0
- package/lib/region.js +345 -0
- package/lib/store.js +126 -0
- package/lib/tools.js +308 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 viyiviyi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# dsh-tree-task-flow · 树形任务流
|
|
2
|
+
|
|
3
|
+
给 DeepSeek Harness 的**树形任务流**:把一件需要多步做完的事组织成
|
|
4
|
+
**目标 → 任务 → 子任务**三级树,每个节点完成时由模型提交结果,插件随即把这个节点的
|
|
5
|
+
**执行过程**从上下文里折叠掉,只留下那条结果。
|
|
6
|
+
|
|
7
|
+
装上不等于启用。插件默认关闭,不会在没人点头的时候改动任何会话。
|
|
8
|
+
|
|
9
|
+
## 它解决什么
|
|
10
|
+
|
|
11
|
+
长任务跑到后半程,上下文里绝大多数内容是**过程**:读过哪些文件、试过哪些错、
|
|
12
|
+
执行过哪些命令。这些内容对后面没有用,但会一直占着位置——每多一轮,
|
|
13
|
+
模型要被喂的就越长,缓存也越容易被顶掉。
|
|
14
|
+
|
|
15
|
+
真正需要留给后面的只有一句话:**这一步做完了,它产出了什么。**
|
|
16
|
+
|
|
17
|
+
所以这里的分工是:
|
|
18
|
+
|
|
19
|
+
| | 内容 | 去向 |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| 过程 | 读文件、试错、命令输出 | 节点完成时**整段折叠掉** |
|
|
22
|
+
| 结果 | 模型在 `tree_task_done` 里提交的 `result` | 留下来,供后续节点引用 |
|
|
23
|
+
|
|
24
|
+
## 上下文怎么长
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
[节点 0] 系统提示词(身份 / 工具 schema / 静态说明) ← 会话内逐字节不变
|
|
28
|
+
[用户消息]
|
|
29
|
+
[目标级汇总] ← 换目标时逐条累积
|
|
30
|
+
[任务级汇总] ← 换任务时逐条累积
|
|
31
|
+
[子任务汇总] [子任务汇总] … ← 同级逐条累积,互不卷走
|
|
32
|
+
[当前子任务的执行过程] ← 下一次折叠的对象
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
每一层有一个**游标**,记着"这一层总结到哪儿了"。节点完成时,插件把
|
|
36
|
+
**游标之后到末尾**这一整段替换成一条汇总消息:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
子任务完成 → 替换 [上个游标之后, 末尾] → 本子任务的汇总
|
|
40
|
+
任务完成 → 替换 [进任务时的边界之后, 末尾] → 本任务的汇总
|
|
41
|
+
目标完成 → 替换 [进目标时的边界之后, 末尾] → 目标的汇总
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
游标自己留在替换范围**之外**,所以同级上一条汇总消息不会被这一次折叠卷走。
|
|
45
|
+
这就是"同级完成不互相屏蔽"的来由。
|
|
46
|
+
|
|
47
|
+
游标失效时(被压缩遮掉、或它之后本来就什么都没有)折叠**降级为纯追加**:
|
|
48
|
+
过程收不起来,但提交的结果照样进上下文。**收不起来可以,丢掉结果不行。**
|
|
49
|
+
|
|
50
|
+
折叠发生在 `agent/pre-step`——上一轮已结束、下一个请求还没构造的那一刻。
|
|
51
|
+
工具执行中途不能折叠,那时 surface 还在增长,替换会把自己卷进去。
|
|
52
|
+
|
|
53
|
+
## 检查点
|
|
54
|
+
|
|
55
|
+
**子任务全部结束,不会让父节点自动完成。** 那一刻树进入**检查点**:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
检查点:任务「重构解析器」(t-3) 的子节点已全部结束。
|
|
59
|
+
此刻只放行两个工具:tree_task_plan 与 tree_task_done。
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
检查点只放行 `tree_task_plan`(继续拆子节点)和 `tree_task_done`(提交结果并完成),
|
|
63
|
+
其余工具**一律被拒**。"这一层到底做完了没有"要由模型判断,不能被计数规则替它定死。
|
|
64
|
+
|
|
65
|
+
检查点只拦模型(`tools/pre-execute`),拦不住人:`/task-tree` 命令随时能接管。
|
|
66
|
+
|
|
67
|
+
## 六个工具
|
|
68
|
+
|
|
69
|
+
| 工具 | 用途 |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `tree_task_status` | 查看整棵树、各节点状态与已提交的结果,以及现在该推进哪个节点 |
|
|
72
|
+
| `tree_task_create` | 建立计划:一个目标 + 若干任务 |
|
|
73
|
+
| `tree_task_plan` | 给一个节点追加子节点:给目标追加任务,给任务追加子任务 |
|
|
74
|
+
| `tree_task_done` | 完成一个节点并提交它的结果,**`result` 必填** |
|
|
75
|
+
| `tree_task_update` | 修改一个节点的标题或说明 |
|
|
76
|
+
| `tree_task_drop` | 丢弃一个节点;丢弃任务会连同它的子任务一起丢弃 |
|
|
77
|
+
|
|
78
|
+
层级固定三级,子任务是最低一级,不能再往下拆。
|
|
79
|
+
|
|
80
|
+
## 安装
|
|
81
|
+
|
|
82
|
+
需要 Node.js 22.19 以上,以及能运行 `dsh`。
|
|
83
|
+
|
|
84
|
+
**从源码目录安装**(装成 `link:`,改完源码重启即生效)。把仓库克隆到任意目录,
|
|
85
|
+
然后指向那个目录:
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
dsh plugin --profile web add <插件目录>
|
|
89
|
+
dsh --profile web --dump-config # 输出里应出现 task-tree 这一行
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**从 npm 安装**:
|
|
93
|
+
|
|
94
|
+
```powershell
|
|
95
|
+
dsh plugin --profile web add dsh-tree-task-flow
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**装完必须重启 `dsh web`**——运行中的会话不追溯。
|
|
99
|
+
|
|
100
|
+
## 启用
|
|
101
|
+
|
|
102
|
+
**装上 ≠ 启用,插件默认是关的**(`enabled: false`)。
|
|
103
|
+
|
|
104
|
+
在 `$DSH_HOME/profiles/web/cordis.patch.yml` 里加:
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
- id: task-tree
|
|
108
|
+
config:
|
|
109
|
+
enabled: true
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
然后重启 `dsh web`。仓库里的 `enable.example.yml` 可以直接抄。
|
|
113
|
+
|
|
114
|
+
> ⚠️ profile 这一层按行覆盖时 `config` 是**整体替换**,不是逐字段深合并——
|
|
115
|
+
> 覆盖时要把想保留的字段一起写全,没写的会走插件默认值(见下面的配置表)。
|
|
116
|
+
|
|
117
|
+
没启用时插件**一个字节都不碰会话**:不注册工具、不加提示词段落、不折叠、不续行。
|
|
118
|
+
只留一条 `/task-tree` 命令让你确认"装了但没开"以及怎么开。
|
|
119
|
+
|
|
120
|
+
## 界面
|
|
121
|
+
|
|
122
|
+
**输入框上方的「树形任务流」条目**(和内置的待办、目标条目并排,宽度与消息正文对齐):
|
|
123
|
+
|
|
124
|
+
- 折叠时一行:标题 + `已完成/总数 · 当前节点`
|
|
125
|
+
- 展开后是三级树,当前节点高亮,已完成节点直接显示已提交的结果
|
|
126
|
+
- 节点上可以直接完成、丢弃,不用敲命令
|
|
127
|
+
- 顶部状态条:「停止自动续行」「清空计划」「刷新」
|
|
128
|
+
|
|
129
|
+
**设置 → 树形任务流**:显示插件当前是启用还是未启用,并逐条列明启用后会影响什么,
|
|
130
|
+
以及怎么开、怎么关。
|
|
131
|
+
|
|
132
|
+
## 命令
|
|
133
|
+
|
|
134
|
+
`/task-tree` **不经过模型**,直接执行:
|
|
135
|
+
|
|
136
|
+
| 命令 | 作用 |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `/task-tree` | 查看本会话的任务树与检查点状态 |
|
|
139
|
+
| `/task-tree done <id> <结果>` | 提交某个节点的结果并完成它 |
|
|
140
|
+
| `/task-tree drop <id>` | 丢弃某个节点 |
|
|
141
|
+
| `/task-tree stop` | 停止本会话的自动续行 |
|
|
142
|
+
| `/task-tree resume` | 重新允许自动续行(需 config 里 `autoContinue` 为 true) |
|
|
143
|
+
| `/task-tree reset` | 清掉本会话的计划树 |
|
|
144
|
+
|
|
145
|
+
## 配置
|
|
146
|
+
|
|
147
|
+
默认值全在 `lib/index.js` 的 `DEFAULT_CONFIG` 里:
|
|
148
|
+
|
|
149
|
+
| 字段 | 默认 | 说明 |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| `enabled` | `false` | 总开关 |
|
|
152
|
+
| `autoContinue` | `false` | 模型停下时是否自动续行 |
|
|
153
|
+
| `maxAutoRounds` | `5` | 连续自动续行的轮次上限 |
|
|
154
|
+
| `promptOrder` | `2000` | 静态说明段落的排序 |
|
|
155
|
+
| `rootDir` | `null` | 状态目录,默认 `$DSH_HOME/dsh-task-tree` |
|
|
156
|
+
|
|
157
|
+
## 自动续行的四道闸门
|
|
158
|
+
|
|
159
|
+
`autoContinue` 默认关闭,开着也只是**兜底**:`tree_task_done` 的返回文本里已经带了
|
|
160
|
+
"请继续执行下一个子任务",模型通常会在同一轮里接着做。这里兜的是模型仍然停下来的情况。
|
|
161
|
+
|
|
162
|
+
开启后仍有四道闸门,缺一不可:
|
|
163
|
+
|
|
164
|
+
1. **默认关**——`autoContinue: false` 时不注册续行逻辑。
|
|
165
|
+
2. **中断即停**——用户按下停止(`agent/turn-stopping` 且 `signal.aborted`),
|
|
166
|
+
这个会话就被标记为不再自动续行,直到真人再发一条消息。
|
|
167
|
+
3. **内置 goal 活跃时不插手**——`goals` 服务里有活跃 goal 就完全让路。
|
|
168
|
+
4. **轮次上限**——连续续行达到 `maxAutoRounds` 就停;只有真人发的消息才重置配额。
|
|
169
|
+
|
|
170
|
+
队列里还有排队输入时也不抢,让用户先说话。
|
|
171
|
+
|
|
172
|
+
## 状态文件
|
|
173
|
+
|
|
174
|
+
全部在 `$DSH_HOME/dsh-task-tree/` 下,**以 `sessionId` 为键**:
|
|
175
|
+
|
|
176
|
+
| 文件 | 内容 |
|
|
177
|
+
|---|---|
|
|
178
|
+
| `plans/<sessionId>.json` | 计划树(每个会话一棵) |
|
|
179
|
+
| `surfaces/<sessionId>.json` | 三层的折叠游标 `{ key, cursor }` |
|
|
180
|
+
|
|
181
|
+
> 目录名沿用插件改名前的标识,为的是不让既有的计划文件失联;插件名与它无关。
|
|
182
|
+
|
|
183
|
+
计划属于建立它的那个会话。放到会话无关的位置,任何一个会话的计划都会被
|
|
184
|
+
所有会话读到——那等于把不相干的节点指派塞进别人的上下文。
|
|
185
|
+
|
|
186
|
+
写入一律走「临时文件 + rename」,进程崩在写入中途也不会留下半截 JSON。
|
|
187
|
+
插件**绝不直接写会话日志**,会话里的一切都走 `session.append()`。
|
|
188
|
+
|
|
189
|
+
## 你会观察到的行为
|
|
190
|
+
|
|
191
|
+
1. **完成必须写 `result`。** 节点的执行过程会被折叠掉,`result` 是它唯一的出口;
|
|
192
|
+
空 `result` 会被拒绝。所以要写清"产出了什么",写成能独立看懂的样子——
|
|
193
|
+
过程会丢,别把过程写进去。
|
|
194
|
+
|
|
195
|
+
2. **折叠是尽力而为的。** 游标被压缩遮掉时收不起来,但结果一定进上下文。
|
|
196
|
+
面板上看到某段过程还在,通常是这个原因。
|
|
197
|
+
|
|
198
|
+
3. **模型看到的是静态的工具组说明,不随计划变化。** 提示词一变,整个上下文
|
|
199
|
+
从第一个 token 起失去缓存。要了解计划就让模型调 `tree_task_status`。
|
|
200
|
+
|
|
201
|
+
4. **每次折叠,界面上的"系统提示词"卡片会重新渲染一次,但提示词一个字都没变。**
|
|
202
|
+
DSH 把"上下文被替换过"记成一次请求序列的边界,界面在 `reason` 不是 `change`
|
|
203
|
+
的请求上都会渲染这张卡片,而复用的是同一个锚点,所以卡片不会变多,位置也不动。
|
|
204
|
+
这是 DSH 的固有语义,插件只能把替换次数压到最低——**一次折叠只替换真正变化的
|
|
205
|
+
那一层**,典型的完成一个节点只产生一次替换。
|
|
206
|
+
|
|
207
|
+
5. **改需求用「丢弃 + 追加」,不要重建整棵树。** 丢掉的节点留在树里可查,
|
|
208
|
+
它和完成的节点会合进同一条汇总。
|
|
209
|
+
|
|
210
|
+
## 不做的事
|
|
211
|
+
|
|
212
|
+
| 不做 | 原因 |
|
|
213
|
+
|---|---|
|
|
214
|
+
| 资料 / 文件快照 / 记忆 | 上下文里值得留下的只有结果,其余靠模型自己重读 |
|
|
215
|
+
| 文件回退 / 撤销 | 改需求用「丢弃 + 追加」 |
|
|
216
|
+
| 多目标并行(多个根) | 单活动计划,数据结构已预留扩展 |
|
|
217
|
+
| 把计划内容注入提示词 | 提示词必须逐字节不变,否则整个上下文失去缓存 |
|
|
218
|
+
|
|
219
|
+
## 自检
|
|
220
|
+
|
|
221
|
+
三个自检脚本都不 import 任何 `@deepseek-ai/*` 运行时包——插件以 `link:` 方式安装时,
|
|
222
|
+
从插件目录往上找不到宿主作用域的包,一旦 import 就根本跑不起来。
|
|
223
|
+
|
|
224
|
+
```powershell
|
|
225
|
+
node verify-entry.mjs # 入口装配:启用/未启用两条路径各注册了什么
|
|
226
|
+
node verify-tools.mjs # 工具层:schema、result 必填、检查点闸门、三级约束
|
|
227
|
+
node verify-region.mjs # 折叠行为:游标推进、降级追加、检查点提示
|
|
228
|
+
node verify-plan.mjs # 计划树纯逻辑:状态流转、自动完成、丢弃级联
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
`verify-region.mjs` 用假 session 忠实复刻了 DSH surface 的三条硬规则
|
|
232
|
+
(替换保持位置、`sourceEventSeqs` 必须覆盖全部遮蔽节点、节点 0 重写约束),
|
|
233
|
+
否则测出来的东西不算数。
|
|
234
|
+
|
|
235
|
+
## 卸载
|
|
236
|
+
|
|
237
|
+
```powershell
|
|
238
|
+
dsh plugin --profile web remove dsh-tree-task-flow
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
状态目录不会自动清理,需要的话手动删 `$DSH_HOME/dsh-task-tree`。
|
|
242
|
+
|
|
243
|
+
## 设计文档
|
|
244
|
+
|
|
245
|
+
- `docs/02-DSH插件开发方案.md` —— 完整设计:上下文组成、游标、折叠、检查点、缓存推理
|
|
246
|
+
- `docs/01-AIDesktop联动设计整理.md` —— 本插件最初的设计来源
|
|
247
|
+
|
|
248
|
+
## 许可
|
|
249
|
+
|
|
250
|
+
MIT
|