dsh-tree-task-flow 0.3.7 → 0.3.8

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 CHANGED
@@ -27,15 +27,16 @@
27
27
  规则只有一条,**只看表层,与计划树无关**:
28
28
 
29
29
  ```
30
- 从「上一次 tree_task_done 之后的第一个 create / plan」之后
30
+ 从「上一次 tree_task_done 之后的第一个 tree_task_create」之后
31
31
  → 到本次 tree_task_done 之前,这一段收走
32
32
  ```
33
33
 
34
- 起点是上一次 `tree_task_done` 之后的**第一个** `tree_task_create` / `tree_task_plan`;
35
- 会话里还没有过 `tree_task_done` 时,就是表层第一个 `create` / `plan`。
36
- **中间的 `create` / `plan` 不再是切点**——它们连同过程一起收走。
37
- 起点那次调用自己的调用**与返回**留在上下文里,本次 `tree_task_done` 的调用与返回
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
- ——那一段里若夹着别的 `create` / `plan` 调用,它们也一并收走。
93
+ ——那一段里若夹着 `tree_task_plan` 调用,它也跟着一起收走。
93
94
 
94
95
  **子任务全部结束,不会让父节点自动完成。** 那一刻树进入**检查点**,
95
96
  也就是上表第二种返回。
@@ -288,8 +289,8 @@ dsh --profile web --dump-config # 输出里应出现 task-tree 这一
288
289
  空 `result` 会被拒绝。所以要写清"产出了什么",写成能独立看懂的样子——
289
290
  过程会丢,别把过程写进去。
290
291
 
291
- 2. **折叠只看表层。** 起点是上一次 `done` 之后的第一个 `create` / `plan`,
292
- 中间的 `create` / `plan` 不再是切点,会连同过程一起收走;区间里没有过程时
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_*` 工具适用长线任务,当目标和资料分析完成后,如果用户要求或判断任务较为复杂,可以将任务执行计划分为目标、任务交付节点、任务执行步骤三级写入任务树,借助工具来推进项目;完成步骤或任务时提交后续步骤需要的 result,内容可以是:产物/结论/问题/有哪些需要注意的坑。";
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` 之后的第一个 `create` / `plan`」之后,
6
+ * 从「上一次 `tree_task_done` 之后的第一个 `tree_task_create`」之后,
7
7
  * 到本次 `tree_task_done` 之前,中间那一段过程收走。
8
8
  *
9
- * 更早没有 `tree_task_done` 时,起点取表层第一个 `create` / `plan`;区间里一次
10
- * `create` / `plan` 都没有时,回退到上一次 `tree_task_done` 之后(更早没有 `done`
11
- * 则是表层开头)。起点那次调用、以及本次 `done` 的调用与返回,都留在表层上——
12
- * 那是模型看"计划是什么、下一步干什么"的地方;被跨过的其它 `create` / `plan`
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
- * 这一段过程里原本还有一次 `tree_task_plan` 的调用与返回——它夹在 create 与 done 之间,
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
- const BOUNDARY_TOOLS = new Set(["tree_task_create", "tree_task_plan", "tree_task_done"]);
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` / `tree_task_plan`。 */
193
- function isPlanCall(event) {
194
- const names = toolNamesOf(event);
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
- * `create` / `plan`**——更早没有 `done` 时,起点是表层第一个 `create` / `plan`。
204
- * 中间的 `create` / `plan` 不是切点:它们连同过程一起被收走。
207
+ * `tree_task_create`**——更早没有 `done` 时,起点是表层第一个 `tree_task_create`。
208
+ * `tree_task_plan` 不是边界:它跟过程、工具结果一样落在区间里被收走。
205
209
  *
206
- * 区间里一次 `create` / `plan` 都没有时,起点退回上一次 `done` 之后(更早没有 `done`
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 / plan。
240
+ // 起点:上一次 done 之后最早的那次 create。
237
241
  let startIdx = -1;
238
242
  for (let index = prevDoneIdx + 1; index < endIdx; index += 1) {
239
- if (isPlanCall(session.eventAt(nodes[index]))) {
243
+ if (isCreateCall(session.eventAt(nodes[index]))) {
240
244
  startIdx = index;
241
245
  break;
242
246
  }
243
247
  }
244
- // 区间里没有 create / plan:退回上一次 done 之后(更早没有 done 就是表层开头)。
248
+ // 区间里没有 create:退回上一次 done 之后(更早没有 done 就是表层开头)。
245
249
  if (startIdx === -1) startIdx = prevDoneIdx;
246
250
 
247
251
  // 区间从起点调用的 `tool/result` 之后开始;找不到起点(-1)就退回表层第一个节点之后
package/lib/tools.js CHANGED
@@ -133,10 +133,8 @@ export function registerTools(ctx, { store, cfg }) {
133
133
  name: "tree_task_plan",
134
134
  description:
135
135
  "给一个节点追加子节点:给目标追加任务,给任务追加子任务。" +
136
- "给任务追加的是步骤(一两次工具调用能做完的事),别把任务拆到只剩一两个步骤。" +
137
- "子任务是最低一级,不能再往下拆。" +
138
- "子任务全部结束后父节点不会自动完成:插件会接着告诉你这一层的结果够不够," +
139
- "够了就用 tree_task_done 提交,不够再补步骤。",
136
+ "给任务追加的是步骤(需要一次性做完的事情)。" +
137
+ "子任务是最低一级,不能再往下拆。",
140
138
  parameters: {
141
139
  type: "object",
142
140
  additionalProperties: false,
@@ -182,10 +180,8 @@ export function registerTools(ctx, { store, cfg }) {
182
180
  "完成一个节点并提交它的结果(目标 / 任务 / 子任务都给它的 id)。**必须写 result**:" +
183
181
  "插件会把这个节点从开始到现在的执行过程从上下文里折叠掉,换成一条只携带这段结果的汇总消息。" +
184
182
  "任务的 result 写交付物与验收方式(文件在哪、怎么跑、验出什么、已知限制);" +
185
- "子任务的 result 一句话说清这步做了什么就够。" +
186
- "子任务全部结束后父节点不会自动完成:插件会在返回里告诉你这一层的结果够不够," +
187
- "够就用它自己的 id 再调一次。" +
188
- "返回内容就是下一步该干什么;这次调用与它的返回都留在上下文里,被收起的只是它前面的执行过程。",
183
+ "子任务的 result 一句话说清这步做了什么、结果如何就够。" +
184
+ "这次调用与它的返回都会留在上下文里,被收起的只是它前面的执行过程。",
189
185
  parameters: {
190
186
  type: "object",
191
187
  additionalProperties: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-tree-task-flow",
3
- "version": "0.3.7",
3
+ "version": "0.3.8",
4
4
  "description": "树形任务流:把多步任务组织成目标→任务→子任务三级树,节点完成时由 AI 提交结果,插件随即把该节点的执行过程从上下文里折叠掉,只留下结果。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",