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/lib/tools.js CHANGED
@@ -1,15 +1,11 @@
1
1
  /**
2
2
  * 六个 `tree_task_*` 工具。
3
3
  *
4
- * 工具本身**只做状态读写**——不注入消息、不动 surface。
4
+ * 工具本身**只做状态读写**——不注入消息、不动 surface,也不拦任何别的工具。
5
5
  * 「完成时把这个节点的执行过程从上下文里折起来、换成一条携带它结果的汇总」
6
6
  * 那件事完全由 `agent/pre-step` 监听器负责(它比对游标与 `activePath` 就知道
7
7
  * 哪一层刚结束)。
8
8
  *
9
- * 这边唯一的 hook 是**检查点闸门**:它也不碰会话、不碰 surface,只是在
10
- * `tools/pre-execute` 上拦一道——检查点期间除了拆子节点和提交结果,别的工具一律
11
- * 拒掉。判断本身在纯函数 `checkpointGate` 里,方便单测。
12
- *
13
9
  * 工具能决定的只有一件事:**这个节点算不算做完了**。而它做完了就必须交出
14
10
  * `result`——插件正是拿这段文字去顶替它整段执行过程。没有结果的完成会让那段
15
11
  * 上下文白白消失,所以 `result` 是必填的。
@@ -23,11 +19,9 @@
23
19
 
24
20
  import {
25
21
  addChildren,
26
- checkpointOf,
27
22
  complete,
28
23
  createPlan,
29
24
  dropNode,
30
- levelLabel,
31
25
  renderContinue,
32
26
  renderTree,
33
27
  updateNode,
@@ -55,43 +49,6 @@ function childLabel(level) {
55
49
  return level === "goal" ? "任务" : "子任务";
56
50
  }
57
51
 
58
- /**
59
- * 检查点期间放行的工具,就这两个。
60
- *
61
- * 检查点是"这一层只剩一个判断"的时刻:继续往下拆,或者交出结果收尾。
62
- * 那一刻再多放行任何一个工具,模型都可以绕开这个判断继续埋头干活,
63
- * 检查点也就成了摆设。所以这里是白名单,不是黑名单。
64
- */
65
- export const CHECKPOINT_ALLOWED = Object.freeze(["tree_task_plan", "tree_task_done"]);
66
-
67
- /** 在检查点里被挡下时,给模型看的话:局面是什么、只剩哪两条路。 */
68
- function checkpointDenyReason(toolName, checkpoint) {
69
- const label = levelLabel(checkpoint.level);
70
- const id = checkpoint.node.id;
71
- return [
72
- `现在是检查点:${label}「${checkpoint.node.title}」(${id}) 的子节点已全部结束。`,
73
- `此刻只放行两个工具:tree_task_plan 继续给 ${id} 拆子节点,` +
74
- `或者 tree_task_done(id="${id}", result="…") 提交这个${label}的结果并完成它。`,
75
- `工具 "${toolName}" 不在放行范围内,已被拒绝。`,
76
- ].join("\n");
77
- }
78
-
79
- /**
80
- * 检查点闸门的判定。
81
- *
82
- * **纯函数**——不读磁盘、不碰会话,只看出入参,所以可以直接单测。
83
- * 注册处只负责把当前计划读出来、把 `checkpointOf` 的结果递进来。
84
- *
85
- * @param toolName - 模型这次要调的工具名。
86
- * @param checkpoint - `checkpointOf(plan)` 的结果;`null` 表示不在检查点。
87
- * @returns `{ kind: "allow" }`,或 `{ kind: "deny", reason }`。
88
- */
89
- export function checkpointGate(toolName, checkpoint) {
90
- if (checkpoint === null || checkpoint === undefined) return { kind: "allow" };
91
- if (CHECKPOINT_ALLOWED.includes(toolName)) return { kind: "allow" };
92
- return { kind: "deny", reason: checkpointDenyReason(toolName, checkpoint) };
93
- }
94
-
95
52
  /**
96
53
  * 注册全部工具。
97
54
  *
@@ -101,24 +58,6 @@ export function checkpointGate(toolName, checkpoint) {
101
58
  export function registerTools(ctx, { store, cfg }) {
102
59
  const sessionOf = (exec) => exec?.agent?.session?.id ?? null;
103
60
 
104
- /**
105
- * 检查点的硬闸门。
106
- *
107
- * 先跑完下游,别人已经拒了就尊重别人的决定——那多半是审批或 hook;
108
- * 只有一路放行到这里,才轮到用检查点收敛。
109
- *
110
- * 计划按会话取,所以闸门只对"正处于检查点的那个会话"生效,
111
- * 别的会话照常使用全部工具。
112
- */
113
- ctx.on("tools/pre-execute", async (exec, next) => {
114
- const decision = await next();
115
- if (decision?.kind !== "allow") return decision;
116
-
117
- const checkpoint = checkpointOf(store.readPlan(sessionOf(exec)));
118
- const verdict = checkpointGate(exec?.name, checkpoint);
119
- return verdict.kind === "allow" ? decision : verdict;
120
- });
121
-
122
61
  // ---------------------------------------------------------------- 计划树
123
62
 
124
63
  ctx.tools.register({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-tree-task-flow",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "树形任务流:把多步任务组织成目标→任务→子任务三级树,节点完成时由 AI 提交结果,插件随即把该节点的执行过程从上下文里折叠掉,只留下结果。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -13,7 +13,7 @@
13
13
  "lib",
14
14
  "client.js",
15
15
  "cordis.patch.yml",
16
- "enable.example.yml",
16
+ "config.example.yml",
17
17
  "README.md"
18
18
  ],
19
19
  "dsh": {
@@ -1,4 +0,0 @@
1
- # 显式启用插件用。默认 enabled 是 false——装上不等于启用。
2
- - id: task-tree
3
- config:
4
- enabled: true