@xgjktech/xg_cwork_im 1.17.0 → 1.17.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.
Files changed (49) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +3 -5
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/connection.d.ts +1 -1
  5. package/dist/src/connection.d.ts.map +1 -1
  6. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  7. package/dist/src/dispatch-mentioned-reply.js +2 -8
  8. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  9. package/dist/src/plan-blocked-notice.d.ts +6 -7
  10. package/dist/src/plan-blocked-notice.d.ts.map +1 -1
  11. package/dist/src/plan-blocked-notice.js +21 -8
  12. package/dist/src/plan-blocked-notice.js.map +1 -1
  13. package/dist/src/plan-blocked-notice.test.js +42 -26
  14. package/dist/src/plan-blocked-notice.test.js.map +1 -1
  15. package/dist/src/plan-event-subscription.d.ts +16 -6
  16. package/dist/src/plan-event-subscription.d.ts.map +1 -1
  17. package/dist/src/plan-event-subscription.js +15 -79
  18. package/dist/src/plan-event-subscription.js.map +1 -1
  19. package/dist/src/plan-event-subscription.test.js +67 -157
  20. package/dist/src/plan-event-subscription.test.js.map +1 -1
  21. package/dist/src/plan-stat-event.d.ts +28 -0
  22. package/dist/src/plan-stat-event.d.ts.map +1 -0
  23. package/dist/src/plan-stat-event.js +68 -0
  24. package/dist/src/plan-stat-event.js.map +1 -0
  25. package/dist/src/plan-stat-event.test.d.ts +2 -0
  26. package/dist/src/plan-stat-event.test.d.ts.map +1 -0
  27. package/dist/src/plan-stat-event.test.js +167 -0
  28. package/dist/src/plan-stat-event.test.js.map +1 -0
  29. package/dist/src/plan-store-access.d.ts +7 -0
  30. package/dist/src/plan-store-access.d.ts.map +1 -1
  31. package/dist/src/plan-store-access.js +20 -0
  32. package/dist/src/plan-store-access.js.map +1 -1
  33. package/dist/src/plan-store-access.test.js +69 -1
  34. package/dist/src/plan-store-access.test.js.map +1 -1
  35. package/dist/src/plan-tool-middleware.d.ts +6 -4
  36. package/dist/src/plan-tool-middleware.d.ts.map +1 -1
  37. package/dist/src/plan-tool-middleware.js +9 -23
  38. package/dist/src/plan-tool-middleware.js.map +1 -1
  39. package/dist/src/plan-tool-middleware.test.js +280 -121
  40. package/dist/src/plan-tool-middleware.test.js.map +1 -1
  41. package/dist/src/plan-ws-registry.d.ts +11 -0
  42. package/dist/src/plan-ws-registry.d.ts.map +1 -0
  43. package/dist/src/plan-ws-registry.js +27 -0
  44. package/dist/src/plan-ws-registry.js.map +1 -0
  45. package/dist/src/plan-ws-registry.test.d.ts +2 -0
  46. package/dist/src/plan-ws-registry.test.d.ts.map +1 -0
  47. package/dist/src/plan-ws-registry.test.js +43 -0
  48. package/dist/src/plan-ws-registry.test.js.map +1 -0
  49. package/package.json +3 -3
@@ -1,7 +1,6 @@
1
1
  import assert from "node:assert/strict";
2
- import { beforeEach, describe, it } from "node:test";
2
+ import { describe, it } from "node:test";
3
3
  import { createPlanToolResultMiddleware } from "./plan-tool-middleware.js";
4
- import { registerToolCallTarget, resetPlanSessionRegistryForTest, } from "./plan-session-registry.js";
5
4
  const FAKE_CTX = { runtime: "openclaw" };
6
5
  function makePlan(overrides = {}) {
7
6
  return {
@@ -36,54 +35,76 @@ function makeSuccessPayload(plan, withEvent = false) {
36
35
  };
37
36
  }
38
37
  class RecordingDeps {
39
- calls = [];
40
- sendTextImpl = async (target, content) => {
41
- this.calls.push({ target, content });
42
- };
43
38
  planById = new Map();
44
- sendText = (target, content) => {
45
- return this.sendTextImpl(target, content);
39
+ planStatCalls = [];
40
+ sendPlanStatImpl = (params) => {
41
+ this.planStatCalls.push(params);
46
42
  };
47
43
  getPlanById = (planId) => {
48
44
  return this.planById.get(planId);
49
45
  };
46
+ sendPlanStat = (params) => {
47
+ this.sendPlanStatImpl(params);
48
+ };
49
+ }
50
+ /** 临时替换 console.warn 统计 [plan-telemetry] 行数,测试结束务必还原。 */
51
+ function captureTelemetryLines(fn) {
52
+ const original = console.warn;
53
+ const lines = [];
54
+ console.warn = (...args) => {
55
+ const line = args.map(String).join(" ");
56
+ if (line.includes("[plan-telemetry]")) {
57
+ lines.push(line);
58
+ }
59
+ };
60
+ try {
61
+ fn();
62
+ }
63
+ finally {
64
+ console.warn = original;
65
+ }
66
+ return lines;
50
67
  }
51
- beforeEach(() => {
52
- resetPlanSessionRegistryForTest();
53
- });
54
68
  describe("createPlanToolResultMiddleware: 非 plan 工具直接放行", () => {
55
- it("does not touch sendText or getPlanById for unrelated tools", () => {
69
+ it("does not touch getPlanById or emit telemetry for unrelated tools", () => {
56
70
  const deps = new RecordingDeps();
71
+ let getPlanByIdCalled = false;
72
+ deps.getPlanById = (planId) => {
73
+ getPlanByIdCalled = true;
74
+ return deps.planById.get(planId);
75
+ };
57
76
  const handler = createPlanToolResultMiddleware(deps);
58
77
  const event = makeEvent({
59
78
  toolName: "some_other_tool",
60
79
  details: { ok: true, data: 123 },
61
80
  });
62
- const result = handler(event, FAKE_CTX);
63
- assert.equal(result, undefined);
64
- assert.equal(deps.calls.length, 0);
81
+ const lines = captureTelemetryLines(() => {
82
+ const result = handler(event, FAKE_CTX);
83
+ assert.equal(result, undefined);
84
+ });
85
+ assert.equal(getPlanByIdCalled, false);
86
+ assert.equal(lines.length, 0);
65
87
  });
66
- it("does not push even when a non-plan tool's details is a structurally valid plan payload (pins the name filter)", () => {
88
+ it("does not emit telemetry even when a non-plan tool's details is a structurally valid plan payload (pins the name filter)", () => {
67
89
  const deps = new RecordingDeps();
68
90
  const handler = createPlanToolResultMiddleware(deps);
69
- // 表中已登记该 toolCallId,若名字过滤被删掉,结构守卫会放行并触发推送
70
- registerToolCallTarget("call-evil", { groupId: "g-evil", token: "t-evil" });
71
91
  const plan = makePlan({ tasks: [{ title: "备份旧配置", status: "blocked", note: "缺少权限" }] });
72
92
  const event = makeEvent({
73
93
  toolCallId: "call-evil",
74
94
  toolName: "some_evil_tool",
75
95
  details: makeSuccessPayload(plan),
76
96
  });
77
- const result = handler(event, FAKE_CTX);
78
- assert.equal(result, undefined);
79
- assert.equal(deps.calls.length, 0);
97
+ const lines = captureTelemetryLines(() => {
98
+ const result = handler(event, FAKE_CTX);
99
+ assert.equal(result, undefined);
100
+ });
101
+ assert.equal(lines.length, 0);
80
102
  });
81
103
  });
82
104
  describe("createPlanToolResultMiddleware: details 路径", () => {
83
- it("pushes a blocked notice when details carries a valid plan", () => {
105
+ it("emits a telemetry line when details carries a valid plan with a blocked task", () => {
84
106
  const deps = new RecordingDeps();
85
107
  const handler = createPlanToolResultMiddleware(deps);
86
- registerToolCallTarget("call-1", { groupId: "g1", token: "t1" });
87
108
  const plan = makePlan({
88
109
  tasks: [{ title: "备份旧配置", status: "blocked", note: "缺少权限" }],
89
110
  });
@@ -92,19 +113,19 @@ describe("createPlanToolResultMiddleware: details 路径", () => {
92
113
  toolName: "xg_plan_write",
93
114
  details: makeSuccessPayload(plan),
94
115
  });
95
- const result = handler(event, FAKE_CTX);
96
- assert.equal(result, undefined);
97
- assert.equal(deps.calls.length, 1);
98
- assert.equal(deps.calls[0].target.groupId, "g1");
99
- assert.ok(deps.calls[0].content.includes("备份旧配置"));
100
- assert.ok(deps.calls[0].content.includes("缺少权限"));
116
+ const lines = captureTelemetryLines(() => {
117
+ const result = handler(event, FAKE_CTX);
118
+ assert.equal(result, undefined);
119
+ });
120
+ assert.equal(lines.length, 1);
121
+ assert.ok(lines[0].includes("备份旧配置"));
122
+ assert.ok(lines[0].includes("缺少权限"));
101
123
  });
102
124
  });
103
125
  describe("createPlanToolResultMiddleware: text 回退路径", () => {
104
126
  it("falls back to content[0].text when details is undefined", () => {
105
127
  const deps = new RecordingDeps();
106
128
  const handler = createPlanToolResultMiddleware(deps);
107
- registerToolCallTarget("call-2", { groupId: "g2", token: "t2" });
108
129
  const plan = makePlan({
109
130
  planId: "plan-2",
110
131
  tasks: [{ title: "校验数据", status: "blocked", note: "依赖未就绪" }],
@@ -116,15 +137,16 @@ describe("createPlanToolResultMiddleware: text 回退路径", () => {
116
137
  details: undefined,
117
138
  text: rawBody,
118
139
  });
119
- const result = handler(event, FAKE_CTX);
120
- assert.equal(result, undefined);
121
- assert.equal(deps.calls.length, 1);
122
- assert.ok(deps.calls[0].content.includes("校验数据"));
140
+ const lines = captureTelemetryLines(() => {
141
+ const result = handler(event, FAKE_CTX);
142
+ assert.equal(result, undefined);
143
+ });
144
+ assert.equal(lines.length, 1);
145
+ assert.ok(lines[0].includes("校验数据"));
123
146
  });
124
147
  it("uses getPlanById authoritative state when details is missing (D5/RULING-1 §3)", () => {
125
148
  const deps = new RecordingDeps();
126
149
  const handler = createPlanToolResultMiddleware(deps);
127
- registerToolCallTarget("call-3", { groupId: "g3", token: "t3" });
128
150
  // text 路径拿到的 plan 里没有 blocked task,但权威反查里有
129
151
  const textPlan = makePlan({ planId: "plan-3", tasks: [{ title: "t1", status: "pending" }] });
130
152
  const authoritativePlan = makePlan({
@@ -139,40 +161,43 @@ describe("createPlanToolResultMiddleware: text 回退路径", () => {
139
161
  details: undefined,
140
162
  text: rawBody,
141
163
  });
142
- handler(event, FAKE_CTX);
143
- assert.equal(deps.calls.length, 1);
144
- assert.ok(deps.calls[0].content.includes("authoritative 才有的阻塞"));
164
+ const lines = captureTelemetryLines(() => {
165
+ handler(event, FAKE_CTX);
166
+ });
167
+ assert.equal(lines.length, 1);
168
+ assert.ok(lines[0].includes("authoritative 才有的阻塞"));
145
169
  });
146
170
  });
147
171
  describe("createPlanToolResultMiddleware: 守卫拒绝畸形 payload", () => {
148
- it("does not push for ok:false", () => {
172
+ it("does not emit telemetry for ok:false", () => {
149
173
  const deps = new RecordingDeps();
150
174
  const handler = createPlanToolResultMiddleware(deps);
151
- registerToolCallTarget("call-4", { groupId: "g4", token: "t4" });
152
175
  const event = makeEvent({
153
176
  toolCallId: "call-4",
154
177
  toolName: "xg_plan_write",
155
178
  details: { ok: false, error: { code: "PLAN_NOT_FOUND" } },
156
179
  });
157
- assert.equal(handler(event, FAKE_CTX), undefined);
158
- assert.equal(deps.calls.length, 0);
180
+ const lines = captureTelemetryLines(() => {
181
+ assert.equal(handler(event, FAKE_CTX), undefined);
182
+ });
183
+ assert.equal(lines.length, 0);
159
184
  });
160
- it("does not push when planId is missing", () => {
185
+ it("does not emit telemetry when planId is missing", () => {
161
186
  const deps = new RecordingDeps();
162
187
  const handler = createPlanToolResultMiddleware(deps);
163
- registerToolCallTarget("call-5", { groupId: "g5", token: "t5" });
164
188
  const event = makeEvent({
165
189
  toolCallId: "call-5",
166
190
  toolName: "xg_plan_write",
167
191
  details: { ok: true, plan: makePlan() },
168
192
  });
169
- assert.equal(handler(event, FAKE_CTX), undefined);
170
- assert.equal(deps.calls.length, 0);
193
+ const lines = captureTelemetryLines(() => {
194
+ assert.equal(handler(event, FAKE_CTX), undefined);
195
+ });
196
+ assert.equal(lines.length, 0);
171
197
  });
172
- it("does not push when tasks is not an array", () => {
198
+ it("does not emit telemetry when tasks is not an array", () => {
173
199
  const deps = new RecordingDeps();
174
200
  const handler = createPlanToolResultMiddleware(deps);
175
- registerToolCallTarget("call-6", { groupId: "g6", token: "t6" });
176
201
  const event = makeEvent({
177
202
  toolCallId: "call-6",
178
203
  toolName: "xg_plan_write",
@@ -182,33 +207,19 @@ describe("createPlanToolResultMiddleware: 守卫拒绝畸形 payload", () => {
182
207
  plan: { planId: "plan-6", goal: "g", createdAt: "t", updatedAt: "t", tasks: "not-an-array" },
183
208
  },
184
209
  });
185
- assert.equal(handler(event, FAKE_CTX), undefined);
186
- assert.equal(deps.calls.length, 0);
210
+ const lines = captureTelemetryLines(() => {
211
+ assert.equal(handler(event, FAKE_CTX), undefined);
212
+ });
213
+ assert.equal(lines.length, 0);
187
214
  });
188
215
  });
189
216
  describe("createPlanToolResultMiddleware: handler 内部出错不外抛", () => {
190
- it("resolves normally even when sendText throws synchronously", () => {
191
- const deps = new RecordingDeps();
192
- deps.sendTextImpl = () => {
193
- throw new Error("boom");
194
- };
195
- const handler = createPlanToolResultMiddleware(deps);
196
- registerToolCallTarget("call-7", { groupId: "g7", token: "t7" });
197
- const plan = makePlan({ tasks: [{ title: "t1", status: "blocked", note: "n" }] });
198
- const event = makeEvent({
199
- toolCallId: "call-7",
200
- toolName: "xg_plan_write",
201
- details: makeSuccessPayload(plan),
202
- });
203
- assert.doesNotThrow(() => handler(event, FAKE_CTX));
204
- });
205
217
  it("resolves normally even when getPlanById throws", () => {
206
218
  const deps = new RecordingDeps();
207
219
  deps.getPlanById = () => {
208
220
  throw new Error("boom");
209
221
  };
210
222
  const handler = createPlanToolResultMiddleware(deps);
211
- registerToolCallTarget("call-8", { groupId: "g8", token: "t8" });
212
223
  const plan = makePlan({ planId: "plan-8", tasks: [{ title: "t1", status: "blocked", note: "n" }] });
213
224
  const rawBody = JSON.stringify(makeSuccessPayload(plan), null, 2);
214
225
  const event = makeEvent({
@@ -220,11 +231,12 @@ describe("createPlanToolResultMiddleware: handler 内部出错不外抛", () =>
220
231
  assert.doesNotThrow(() => handler(event, FAKE_CTX));
221
232
  });
222
233
  });
223
- describe("createPlanToolResultMiddleware: 恒返回 void", () => {
224
- it("handler's return value is undefined", () => {
234
+ describe("createPlanToolResultMiddleware: 恒返回 void(同步性断言)", () => {
235
+ // 本任务 handler 已无异步出口(推群没了)。TASK-2x-4 引入 sendPlanStat
236
+ // fire-and-forget 之后,这条要恢复成"even when 内部 promise 永不 resolve 仍立即返回"的真实用例。
237
+ it("handler's return value is undefined and the call itself is synchronous", () => {
225
238
  const deps = new RecordingDeps();
226
239
  const handler = createPlanToolResultMiddleware(deps);
227
- registerToolCallTarget("call-9", { groupId: "g9", token: "t9" });
228
240
  const plan = makePlan({ tasks: [{ title: "t1", status: "blocked", note: "n" }] });
229
241
  const event = makeEvent({
230
242
  toolCallId: "call-9",
@@ -235,95 +247,242 @@ describe("createPlanToolResultMiddleware: 恒返回 void", () => {
235
247
  assert.equal(result, undefined);
236
248
  });
237
249
  });
238
- describe("createPlanToolResultMiddleware: 合成 id 未命中 → 静默降级 (RULING-2 追加约束 2)", () => {
239
- it("does not push and does not throw when toolCallId is a synthetic openclaw-<uuid> not present in the table", () => {
250
+ describe("createPlanToolResultMiddleware: [plan-telemetry] 遥测行为(D2)", () => {
251
+ it("plan 1 blocked task 恰好打 1 行,内容含 planId/taskIndex/taskTitle/note/goal", () => {
240
252
  const deps = new RecordingDeps();
241
253
  const handler = createPlanToolResultMiddleware(deps);
242
- // 故意不 registerToolCallTarget,模拟合成 id 未命中
243
- const plan = makePlan({ tasks: [{ title: "t1", status: "blocked", note: "n" }] });
254
+ const plan = makePlan({
255
+ planId: "plan-telemetry-1",
256
+ goal: "迁移配置到新版本",
257
+ tasks: [{ title: "备份旧配置", status: "blocked", note: "缺少权限" }],
258
+ });
259
+ const event = makeEvent({
260
+ toolCallId: "call-t1",
261
+ toolName: "xg_plan_execute",
262
+ details: makeSuccessPayload(plan),
263
+ });
264
+ const lines = captureTelemetryLines(() => {
265
+ handler(event, FAKE_CTX);
266
+ });
267
+ assert.equal(lines.length, 1);
268
+ const jsonPart = lines[0].slice(lines[0].indexOf("{"));
269
+ const parsed = JSON.parse(jsonPart);
270
+ assert.equal(parsed.planId, "plan-telemetry-1");
271
+ assert.equal(parsed.taskIndex, 0);
272
+ assert.equal(parsed.taskTitle, "备份旧配置");
273
+ assert.equal(parsed.note, "缺少权限");
274
+ assert.equal(parsed.goal, "迁移配置到新版本");
275
+ assert.equal(parsed.toolName, "xg_plan_execute");
276
+ });
277
+ it("plan 含 2 个 blocked task → 打 2 行,顺序与 tasks 下标一致", () => {
278
+ const deps = new RecordingDeps();
279
+ const handler = createPlanToolResultMiddleware(deps);
280
+ const plan = makePlan({
281
+ tasks: [
282
+ { title: "备份旧配置", status: "blocked", note: "缺少权限" },
283
+ { title: "校验数据", status: "pending" },
284
+ { title: "切换流量", status: "blocked", note: "依赖未就绪" },
285
+ ],
286
+ });
244
287
  const event = makeEvent({
245
- toolCallId: "openclaw-3f9a7c2e-1234-4a1b-9abc-000000000000",
288
+ toolCallId: "call-t2",
246
289
  toolName: "xg_plan_write",
247
290
  details: makeSuccessPayload(plan),
248
291
  });
249
- assert.doesNotThrow(() => {
250
- const result = handler(event, FAKE_CTX);
251
- assert.equal(result, undefined);
292
+ const lines = captureTelemetryLines(() => {
293
+ handler(event, FAKE_CTX);
252
294
  });
253
- assert.equal(deps.calls.length, 0);
295
+ assert.equal(lines.length, 2);
296
+ const first = JSON.parse(lines[0].slice(lines[0].indexOf("{")));
297
+ const second = JSON.parse(lines[1].slice(lines[1].indexOf("{")));
298
+ assert.equal(first.taskIndex, 0);
299
+ assert.equal(second.taskIndex, 2);
254
300
  });
255
- });
256
- describe("createPlanToolResultMiddleware: fire-and-forget", () => {
257
- it("resolves immediately even when sendText returns a never-resolving promise", () => {
301
+ it("无 blocked task → 不打任何遥测行", () => {
258
302
  const deps = new RecordingDeps();
259
- deps.sendTextImpl = () => new Promise(() => { });
260
303
  const handler = createPlanToolResultMiddleware(deps);
261
- registerToolCallTarget("call-10", { groupId: "g10", token: "t10" });
262
- const plan = makePlan({ tasks: [{ title: "t1", status: "blocked", note: "n" }] });
304
+ const plan = makePlan({
305
+ tasks: [{ title: "t1", status: "pending" }, { title: "t2", status: "completed" }],
306
+ });
263
307
  const event = makeEvent({
264
- toolCallId: "call-10",
308
+ toolCallId: "call-t3",
265
309
  toolName: "xg_plan_write",
266
310
  details: makeSuccessPayload(plan),
267
311
  });
268
- // handler 内部 await 了 sendText,这行会挂起整个测试进程(超时失败);
269
- // handler 是同步函数,必须立即返回 undefined。
270
- const result = handler(event, FAKE_CTX);
271
- assert.equal(result, undefined);
312
+ const lines = captureTelemetryLines(() => {
313
+ handler(event, FAKE_CTX);
314
+ });
315
+ assert.equal(lines.length, 0);
272
316
  });
273
- });
274
- describe("createPlanToolResultMiddleware: 查表未命中不得毒化去重状态 (FINDING-1)", () => {
275
- it("a miss does not mark the notice as sent — a later call with a freshly-registered toolCallId for the same blocked key must still push", () => {
317
+ it("🔴 同一 plan、同一 blocked、连续两次 middleware 事件 → 打 2 行(钉住不去重)", () => {
276
318
  const deps = new RecordingDeps();
277
319
  const handler = createPlanToolResultMiddleware(deps);
278
320
  const plan = makePlan({
279
- planId: "plan-finding1",
321
+ planId: "plan-no-dedup",
280
322
  tasks: [{ title: "备份旧配置", status: "blocked", note: "缺少权限" }],
281
323
  });
282
- // 第一次:不登记 toolCallId,模拟未命中(合成 id / TTL 过期 / onToolStart 早退)
283
- const missEvent = makeEvent({
284
- toolCallId: "call-miss",
324
+ const event = makeEvent({
325
+ toolCallId: "call-t4",
326
+ toolName: "xg_plan_write",
327
+ details: makeSuccessPayload(plan),
328
+ });
329
+ const lines = captureTelemetryLines(() => {
330
+ handler(event, FAKE_CTX);
331
+ handler(event, FAKE_CTX);
332
+ });
333
+ assert.equal(lines.length, 2, "不去重:同一 blocked 连续两次事件应各打一行");
334
+ });
335
+ it("plan 带 origin → 日志行含 channel/to/sessionKey", () => {
336
+ const deps = new RecordingDeps();
337
+ const handler = createPlanToolResultMiddleware(deps);
338
+ const plan = makePlan({
339
+ tasks: [{ title: "t1", status: "blocked", note: "n" }],
340
+ origin: { channel: "xg_cwork_im", to: "g-123", sessionKey: "sess-1" },
341
+ });
342
+ const event = makeEvent({
343
+ toolCallId: "call-t5",
285
344
  toolName: "xg_plan_write",
286
345
  details: makeSuccessPayload(plan),
287
346
  });
288
- handler(missEvent, FAKE_CTX);
289
- assert.equal(deps.calls.length, 0, "未命中时不应有任何推送");
290
- // 第二次:同一 planId、同一 task、同一 note(key 完全相同),
291
- // 但 toolCallId 换成新登记的 call-new——模拟 onToolStart 用新 toolCallId 重新登记
292
- registerToolCallTarget("call-new", { groupId: "g-new", token: "t-new" });
293
- const hitEvent = makeEvent({
294
- toolCallId: "call-new",
347
+ const lines = captureTelemetryLines(() => {
348
+ handler(event, FAKE_CTX);
349
+ });
350
+ assert.equal(lines.length, 1);
351
+ const parsed = JSON.parse(lines[0].slice(lines[0].indexOf("{")));
352
+ assert.equal(parsed.channel, "xg_cwork_im");
353
+ assert.equal(parsed.to, "g-123");
354
+ assert.equal(parsed.sessionKey, "sess-1");
355
+ });
356
+ it("🔴 plan 无 origin(旧数据)→ 日志行不含这几个键,且照常打日志、不抛、不跳过", () => {
357
+ const deps = new RecordingDeps();
358
+ const handler = createPlanToolResultMiddleware(deps);
359
+ const plan = makePlan({
360
+ tasks: [{ title: "t1", status: "blocked", note: "n" }],
361
+ });
362
+ const event = makeEvent({
363
+ toolCallId: "call-t6",
295
364
  toolName: "xg_plan_write",
296
365
  details: makeSuccessPayload(plan),
297
366
  });
298
- handler(hitEvent, FAKE_CTX);
299
- assert.equal(deps.calls.length, 1, "未命中不应污染去重状态,换新 toolCallId 后必须能重推");
300
- assert.equal(deps.calls[0].target.groupId, "g-new");
301
- assert.ok(deps.calls[0].content.includes("备份旧配置"));
302
- assert.ok(deps.calls[0].content.includes("缺少权限"));
367
+ const lines = captureTelemetryLines(() => {
368
+ assert.doesNotThrow(() => handler(event, FAKE_CTX));
369
+ });
370
+ assert.equal(lines.length, 1);
371
+ const parsed = JSON.parse(lines[0].slice(lines[0].indexOf("{")));
372
+ assert.equal("channel" in parsed, false);
373
+ assert.equal("to" in parsed, false);
374
+ assert.equal("sessionKey" in parsed, false);
303
375
  });
304
- it("does not push again for the same key once it has actually been sent (dedup regression guard)", () => {
376
+ it("blocked task note 为空/空白 该条不产出遥测", () => {
305
377
  const deps = new RecordingDeps();
306
378
  const handler = createPlanToolResultMiddleware(deps);
307
379
  const plan = makePlan({
308
- planId: "plan-finding1-dedup",
309
- tasks: [{ title: "备份旧配置", status: "blocked", note: "缺少权限" }],
380
+ tasks: [
381
+ { title: "无 note", status: "blocked" },
382
+ { title: "空白 note", status: "blocked", note: " " },
383
+ ],
384
+ });
385
+ const event = makeEvent({
386
+ toolCallId: "call-t7",
387
+ toolName: "xg_plan_write",
388
+ details: makeSuccessPayload(plan),
389
+ });
390
+ const lines = captureTelemetryLines(() => {
391
+ handler(event, FAKE_CTX);
392
+ });
393
+ assert.equal(lines.length, 0);
394
+ });
395
+ });
396
+ describe("createPlanToolResultMiddleware: PLAN_STAT 增量推送(D3)", () => {
397
+ it("plan_write 成功 → 发 1 条 PLAN_STAT,source === \"tool\"", () => {
398
+ const deps = new RecordingDeps();
399
+ const handler = createPlanToolResultMiddleware(deps);
400
+ const plan = makePlan({ tasks: [{ title: "t1", status: "pending" }] });
401
+ const event = makeEvent({
402
+ toolCallId: "call-ps1",
403
+ toolName: "xg_plan_write",
404
+ details: makeSuccessPayload(plan),
405
+ });
406
+ handler(event, FAKE_CTX);
407
+ assert.equal(deps.planStatCalls.length, 1);
408
+ assert.equal(deps.planStatCalls[0].source, "tool");
409
+ assert.equal(deps.planStatCalls[0].plan.planId, plan.planId);
410
+ });
411
+ it("plan_execute 成功(start_task/block_task/complete_task)→ 各发 1 条", () => {
412
+ const actions = [
413
+ { toolCallId: "call-ps2", plan: makePlan({ tasks: [{ title: "t1", status: "in_progress" }] }) },
414
+ {
415
+ toolCallId: "call-ps3",
416
+ plan: makePlan({ tasks: [{ title: "t1", status: "blocked", note: "缺少权限" }] }),
417
+ },
418
+ { toolCallId: "call-ps4", plan: makePlan({ tasks: [{ title: "t1", status: "completed" }] }) },
419
+ ];
420
+ for (const { toolCallId, plan } of actions) {
421
+ const deps = new RecordingDeps();
422
+ const handler = createPlanToolResultMiddleware(deps);
423
+ const event = makeEvent({
424
+ toolCallId,
425
+ toolName: "xg_plan_execute",
426
+ details: makeSuccessPayload(plan),
427
+ });
428
+ handler(event, FAKE_CTX);
429
+ assert.equal(deps.planStatCalls.length, 1, `action status=${plan.tasks[0].status} 应发 1 条`);
430
+ assert.equal(deps.planStatCalls[0].source, "tool");
431
+ }
432
+ });
433
+ it("🔴 工具返回 ok:false → 不发 PLAN_STAT(失败不发)", () => {
434
+ const deps = new RecordingDeps();
435
+ const handler = createPlanToolResultMiddleware(deps);
436
+ const event = makeEvent({
437
+ toolCallId: "call-ps5",
438
+ toolName: "xg_plan_write",
439
+ details: { ok: false, error: { code: "PLAN_NOT_FOUND" } },
310
440
  });
311
- registerToolCallTarget("call-first", { groupId: "g-first", token: "t-first" });
312
- const firstEvent = makeEvent({
313
- toolCallId: "call-first",
441
+ handler(event, FAKE_CTX);
442
+ assert.equal(deps.planStatCalls.length, 0);
443
+ });
444
+ it("🔴 非 plan 工具 → 不发 PLAN_STAT", () => {
445
+ const deps = new RecordingDeps();
446
+ const handler = createPlanToolResultMiddleware(deps);
447
+ const plan = makePlan({ tasks: [{ title: "t1", status: "pending" }] });
448
+ const event = makeEvent({
449
+ toolCallId: "call-ps6",
450
+ toolName: "some_other_tool",
451
+ details: makeSuccessPayload(plan),
452
+ });
453
+ handler(event, FAKE_CTX);
454
+ assert.equal(deps.planStatCalls.length, 0);
455
+ });
456
+ it("🔴 sendPlanStat 内部抛异常 → handler 不外抛、仍返回 void(红线回归)", () => {
457
+ const deps = new RecordingDeps();
458
+ deps.sendPlanStatImpl = () => {
459
+ throw new Error("boom");
460
+ };
461
+ const handler = createPlanToolResultMiddleware(deps);
462
+ const plan = makePlan({ tasks: [{ title: "t1", status: "pending" }] });
463
+ const event = makeEvent({
464
+ toolCallId: "call-ps7",
314
465
  toolName: "xg_plan_write",
315
466
  details: makeSuccessPayload(plan),
316
467
  });
317
- handler(firstEvent, FAKE_CTX);
318
- assert.equal(deps.calls.length, 1, "首次命中应推送一次");
319
- registerToolCallTarget("call-second", { groupId: "g-second", token: "t-second" });
320
- const secondEvent = makeEvent({
321
- toolCallId: "call-second",
468
+ assert.doesNotThrow(() => {
469
+ const result = handler(event, FAKE_CTX);
470
+ assert.equal(result, undefined);
471
+ });
472
+ });
473
+ it("🔴 跨调用序列:同一 plan 连续 3 次成功调用 → 发 3 条(全量幂等,不去重)", () => {
474
+ const deps = new RecordingDeps();
475
+ const handler = createPlanToolResultMiddleware(deps);
476
+ const plan = makePlan({ planId: "plan-stat-no-dedup", tasks: [{ title: "t1", status: "pending" }] });
477
+ const event = makeEvent({
478
+ toolCallId: "call-ps8",
322
479
  toolName: "xg_plan_write",
323
480
  details: makeSuccessPayload(plan),
324
481
  });
325
- handler(secondEvent, FAKE_CTX);
326
- assert.equal(deps.calls.length, 1, "同一 key 已成功推送过,不应重复推送");
482
+ handler(event, FAKE_CTX);
483
+ handler(event, FAKE_CTX);
484
+ handler(event, FAKE_CTX);
485
+ assert.equal(deps.planStatCalls.length, 3, "不去重:同一 plan 连续 3 次成功调用应各发一条");
327
486
  });
328
487
  });
329
488
  //# sourceMappingURL=plan-tool-middleware.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan-tool-middleware.test.js","sourceRoot":"","sources":["../../src/plan-tool-middleware.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-tool-middleware.test.js","sourceRoot":"","sources":["../../src/plan-tool-middleware.test.ts"],"names":[],"mappings":"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"}