dsh-tree-task-flow 0.3.7 → 0.3.9
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 +11 -10
- package/lib/prompt.js +1 -1
- package/lib/region.js +24 -20
- package/lib/tools.js +7 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,15 +27,16 @@
|
|
|
27
27
|
规则只有一条,**只看表层,与计划树无关**:
|
|
28
28
|
|
|
29
29
|
```
|
|
30
|
-
从「上一次 tree_task_done 之后的第一个
|
|
30
|
+
从「上一次 tree_task_done 之后的第一个 tree_task_create」之后
|
|
31
31
|
→ 到本次 tree_task_done 之前,这一段收走
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
起点是上一次 `tree_task_done` 之后的**第一个** `tree_task_create
|
|
35
|
-
会话里还没有过 `tree_task_done` 时,就是表层第一个 `
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
起点是上一次 `tree_task_done` 之后的**第一个** `tree_task_create`;
|
|
35
|
+
会话里还没有过 `tree_task_done` 时,就是表层第一个 `tree_task_create`;
|
|
36
|
+
区间里一次 `tree_task_create` 都没有时,回退到上一次 `tree_task_done` 之后。
|
|
37
|
+
**`tree_task_plan` 不是边界**——它的调用与返回跟普通过程一样,随这一段一起收走。
|
|
38
|
+
起点那次 `create` 的调用与返回留在上下文里,本次 `tree_task_done` 的调用与返回
|
|
39
|
+
同样留着(模型靠它们看"计划是什么、下一步干什么")。
|
|
39
40
|
折叠只收它们**之间**的过程,换成一条计数通告:
|
|
40
41
|
|
|
41
42
|
```
|
|
@@ -89,7 +90,7 @@ tree_task消息:接下来需要进行步骤:「步骤二」(s-4)。
|
|
|
89
90
|
|
|
90
91
|
两样都**不重复提交内容**(`result` 就在这次调用的参数里)。折叠时,**这次
|
|
91
92
|
`tree_task_done` 的调用连同它的返回原样留在上下文里**,被收走的只是它**前面**那段过程
|
|
92
|
-
|
|
93
|
+
——那一段里若夹着 `tree_task_plan` 调用,它也跟着一起收走。
|
|
93
94
|
|
|
94
95
|
**子任务全部结束,不会让父节点自动完成。** 那一刻树进入**检查点**,
|
|
95
96
|
也就是上表第二种返回。
|
|
@@ -116,7 +117,7 @@ tree_task消息:接下来需要进行步骤:「步骤二」(s-4)。
|
|
|
116
117
|
| 层 | 是什么 | 怎么算分对了 |
|
|
117
118
|
|---|---|---|
|
|
118
119
|
| **L1 目标** | 最终要交付的东西 | 一个会话可以有多个,按创建顺序排;每个都写清要交付什么 |
|
|
119
|
-
| **L2 任务** | **交付节点** |
|
|
120
|
+
| **L2 任务** | **交付节点** | 一件能独立验收的交付内容——一个文件、一条能跑的命令、一份结论,也可以是件需要完成或验证的事、一个检查点;下面覆盖多个步骤,别拆到只剩一两个 |
|
|
120
121
|
| **L3 子任务** | **步骤** | 任务内部一两次工具调用能做完的事 |
|
|
121
122
|
|
|
122
123
|
**折叠次数跟着 `tree_task_done` 的次数走**:每完成一个节点就折一次,界面也会因此多一张
|
|
@@ -288,8 +289,8 @@ dsh --profile web --dump-config # 输出里应出现 task-tree 这一
|
|
|
288
289
|
空 `result` 会被拒绝。所以要写清"产出了什么",写成能独立看懂的样子——
|
|
289
290
|
过程会丢,别把过程写进去。
|
|
290
291
|
|
|
291
|
-
2. **折叠只看表层。** 起点是上一次 `done` 之后的第一个 `create
|
|
292
|
-
|
|
292
|
+
2. **折叠只看表层。** 起点是上一次 `done` 之后的第一个 `create`;
|
|
293
|
+
`tree_task_plan` 不是边界,它的调用与返回跟过程一样会被收走;区间里没有过程时
|
|
293
294
|
什么都不注入,夹着你的消息时整段不折——那一段原样留着(往前折丢需求、
|
|
294
295
|
往后折丢回应),代价是上下文不收缩。
|
|
295
296
|
|
package/lib/prompt.js
CHANGED
|
@@ -23,7 +23,7 @@ export const SECTION_NAME = "dsh-tree-task-flow";
|
|
|
23
23
|
export const DEFAULT_ORDER = 1800;
|
|
24
24
|
|
|
25
25
|
/** 段落正文。 */
|
|
26
|
-
export const SECTION_TEXT = "`tree_task_*`
|
|
26
|
+
export const SECTION_TEXT = "`tree_task_*` 工具适用长线任务,当目标和资料分析完成后,如果用户要求或判断任务较为复杂,可以将任务执行计划分为目标、任务、任务执行步骤三级写入任务树,借助工具来推进项目;将目标按照可独立交付的节点分为多个任务,任务节点需要准确表述清楚需求;将任务按照“需一次性处理并交付产物”分为多个步骤;完成步骤或任务时提交后续步骤需要的 result,提交内容可以是:产物/结论/问题/有哪些需要注意的坑;执行过程上下文将会在完成时被隐藏。";
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* 注册段落。调用方必须包在 `ctx.effect()` 里,否则热更新后会重复注册而抛错。
|
package/lib/region.js
CHANGED
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 规则只有一条,**只看表层,与计划树无关**:
|
|
5
5
|
*
|
|
6
|
-
* 从「上一次 `tree_task_done` 之后的第一个 `
|
|
6
|
+
* 从「上一次 `tree_task_done` 之后的第一个 `tree_task_create`」之后,
|
|
7
7
|
* 到本次 `tree_task_done` 之前,中间那一段过程收走。
|
|
8
8
|
*
|
|
9
|
-
* 更早没有 `tree_task_done` 时,起点取表层第一个 `
|
|
10
|
-
* `create`
|
|
11
|
-
*
|
|
12
|
-
* 那是模型看"计划是什么、下一步干什么"
|
|
13
|
-
*
|
|
9
|
+
* 更早没有 `tree_task_done` 时,起点取表层第一个 `tree_task_create`;区间里一次
|
|
10
|
+
* `create` 都没有时,回退到上一次 `tree_task_done` 之后(更早没有 `done` 则是
|
|
11
|
+
* 表层开头)。起点那次调用、以及本次 `done` 的调用与返回,都留在表层上——
|
|
12
|
+
* 那是模型看"计划是什么、下一步干什么"的地方。
|
|
13
|
+
*
|
|
14
|
+
* 边界只有 `create` 与 `done` 两个:**`tree_task_plan` 不是边界**,它的调用与返回
|
|
15
|
+
* 跟普通过程一样,落在区间里就被收走。
|
|
14
16
|
*
|
|
15
17
|
* 判定表见 `docs/06-折叠范围规则.md`。
|
|
16
18
|
*
|
|
@@ -28,8 +30,8 @@
|
|
|
28
30
|
* [tree_task_done 调用] [返回:接下来需要进行步骤:「二」(s-4)。]
|
|
29
31
|
* [当前这一段执行过程] ← 下一次折叠的对象
|
|
30
32
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
+
* 这一段过程里还夹着一次 `tree_task_plan` 的调用与返回——它不是边界,
|
|
34
|
+
* 于是随这一条通告一起收走了。
|
|
33
35
|
*
|
|
34
36
|
* 时机是 `agent/pre-step`:上一轮已结束、下一个请求还没构造。工具执行中途不能折叠
|
|
35
37
|
* ——那一刻 surface 还在增长,替换会把自己卷进去。
|
|
@@ -45,8 +47,11 @@ const PLUGIN = "dsh-tree-task-flow";
|
|
|
45
47
|
/** 三层固定的名字。只给界面用的游标同步按这个顺序走。 */
|
|
46
48
|
const LEVELS = ["goal", "task", "step"];
|
|
47
49
|
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
+
/**
|
|
51
|
+
* 边界调用:只有 `tree_task_create` 与 `tree_task_done`。它们的调用与返回不进替换区间,
|
|
52
|
+
* 是折叠的起止点。**`tree_task_plan` 不在其中**——它跟别的过程一样,落在区间里就被收走。
|
|
53
|
+
*/
|
|
54
|
+
const BOUNDARY_TOOLS = new Set(["tree_task_create", "tree_task_done"]);
|
|
50
55
|
|
|
51
56
|
/** 注入消息的抬头。 */
|
|
52
57
|
const NOTICE_PREFIX = "tree_task消息:";
|
|
@@ -189,10 +194,9 @@ function summaryLine(count, files) {
|
|
|
189
194
|
return touched === 0 ? base : `${base} · 涉及 ${touched} 个文件`;
|
|
190
195
|
}
|
|
191
196
|
|
|
192
|
-
/** 这条 assistant 消息里有没有 `tree_task_create
|
|
193
|
-
function
|
|
194
|
-
|
|
195
|
-
return names.includes("tree_task_create") || names.includes("tree_task_plan");
|
|
197
|
+
/** 这条 assistant 消息里有没有 `tree_task_create`。 */
|
|
198
|
+
function isCreateCall(event) {
|
|
199
|
+
return toolNamesOf(event).includes("tree_task_create");
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
/**
|
|
@@ -200,10 +204,10 @@ function isPlanCall(event) {
|
|
|
200
204
|
*
|
|
201
205
|
* 从末尾往前找最近的一次边界调用,**它必须是 `tree_task_done`**(它就是这次完成的
|
|
202
206
|
* 那一下);再往前找上一次 `tree_task_done`,起点就是**它之后最早的那次
|
|
203
|
-
* `
|
|
204
|
-
*
|
|
207
|
+
* `tree_task_create`**——更早没有 `done` 时,起点是表层第一个 `tree_task_create`。
|
|
208
|
+
* `tree_task_plan` 不是边界:它跟过程、工具结果一样落在区间里被收走。
|
|
205
209
|
*
|
|
206
|
-
* 区间里一次 `create`
|
|
210
|
+
* 区间里一次 `create` 都没有时,起点退回上一次 `done` 之后(更早没有 `done`
|
|
207
211
|
* 则是表层第一个节点之后)——那时区间多半会撞上真人消息,于是整段不折,这是安全的那一侧。
|
|
208
212
|
*
|
|
209
213
|
* @param session - 当前会话。
|
|
@@ -233,15 +237,15 @@ export function foldRange(session) {
|
|
|
233
237
|
}
|
|
234
238
|
}
|
|
235
239
|
|
|
236
|
-
// 起点:上一次 done 之后最早的那次 create
|
|
240
|
+
// 起点:上一次 done 之后最早的那次 create。
|
|
237
241
|
let startIdx = -1;
|
|
238
242
|
for (let index = prevDoneIdx + 1; index < endIdx; index += 1) {
|
|
239
|
-
if (
|
|
243
|
+
if (isCreateCall(session.eventAt(nodes[index]))) {
|
|
240
244
|
startIdx = index;
|
|
241
245
|
break;
|
|
242
246
|
}
|
|
243
247
|
}
|
|
244
|
-
// 区间里没有 create
|
|
248
|
+
// 区间里没有 create:退回上一次 done 之后(更早没有 done 就是表层开头)。
|
|
245
249
|
if (startIdx === -1) startIdx = prevDoneIdx;
|
|
246
250
|
|
|
247
251
|
// 区间从起点调用的 `tool/result` 之后开始;找不到起点(-1)就退回表层第一个节点之后
|
package/lib/tools.js
CHANGED
|
@@ -78,9 +78,10 @@ export function registerTools(ctx, { store, cfg }) {
|
|
|
78
78
|
ctx.tools.register({
|
|
79
79
|
name: "tree_task_create",
|
|
80
80
|
description:
|
|
81
|
-
"新增一个目标:这个目标 +
|
|
81
|
+
"新增一个目标:这个目标 + 它下面的若干任务。一个会话可以有多个目标," +
|
|
82
82
|
"按调用顺序排在计划里——已经建过的目标和它们的历史都留着,不会被这次调用替换掉。" +
|
|
83
|
-
"
|
|
83
|
+
"这里的任务是交付节点——一件能独立验收的交付内容,可以是需要完成或验证的某件事," +
|
|
84
|
+
"也可以是一个检查点,不是步骤本身。" +
|
|
84
85
|
"建完记得用 tree_task_plan 给这个目标下的第一个任务拆子任务。",
|
|
85
86
|
parameters: {
|
|
86
87
|
type: "object",
|
|
@@ -133,10 +134,8 @@ export function registerTools(ctx, { store, cfg }) {
|
|
|
133
134
|
name: "tree_task_plan",
|
|
134
135
|
description:
|
|
135
136
|
"给一个节点追加子节点:给目标追加任务,给任务追加子任务。" +
|
|
136
|
-
"
|
|
137
|
-
"子任务是最低一级,不能再往下拆。"
|
|
138
|
-
"子任务全部结束后父节点不会自动完成:插件会接着告诉你这一层的结果够不够," +
|
|
139
|
-
"够了就用 tree_task_done 提交,不够再补步骤。",
|
|
137
|
+
"给任务追加的是步骤(需要一次性做完的事情)。" +
|
|
138
|
+
"子任务是最低一级,不能再往下拆。",
|
|
140
139
|
parameters: {
|
|
141
140
|
type: "object",
|
|
142
141
|
additionalProperties: false,
|
|
@@ -182,10 +181,8 @@ export function registerTools(ctx, { store, cfg }) {
|
|
|
182
181
|
"完成一个节点并提交它的结果(目标 / 任务 / 子任务都给它的 id)。**必须写 result**:" +
|
|
183
182
|
"插件会把这个节点从开始到现在的执行过程从上下文里折叠掉,换成一条只携带这段结果的汇总消息。" +
|
|
184
183
|
"任务的 result 写交付物与验收方式(文件在哪、怎么跑、验出什么、已知限制);" +
|
|
185
|
-
"子任务的 result
|
|
186
|
-
"
|
|
187
|
-
"够就用它自己的 id 再调一次。" +
|
|
188
|
-
"返回内容就是下一步该干什么;这次调用与它的返回都留在上下文里,被收起的只是它前面的执行过程。",
|
|
184
|
+
"子任务的 result 一句话说清这步做了什么、结果如何就够。" +
|
|
185
|
+
"这次调用与它的返回都会留在上下文里,被收起的只是它前面的执行过程。",
|
|
189
186
|
parameters: {
|
|
190
187
|
type: "object",
|
|
191
188
|
additionalProperties: false,
|