@xgjktech/xg_cwork_im 1.16.45 → 1.17.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.
Files changed (63) hide show
  1. package/README.md +433 -433
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +27 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/connection.js +2 -2
  6. package/dist/src/connection.js.map +1 -1
  7. package/dist/src/deliver-text.test.js +22 -22
  8. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  9. package/dist/src/dispatch-mentioned-reply.js +8 -0
  10. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  11. package/dist/src/plan-blocked-notice.d.ts +15 -0
  12. package/dist/src/plan-blocked-notice.d.ts.map +1 -0
  13. package/dist/src/plan-blocked-notice.js +28 -0
  14. package/dist/src/plan-blocked-notice.js.map +1 -0
  15. package/dist/src/plan-blocked-notice.test.d.ts +2 -0
  16. package/dist/src/plan-blocked-notice.test.d.ts.map +1 -0
  17. package/dist/src/plan-blocked-notice.test.js +80 -0
  18. package/dist/src/plan-blocked-notice.test.js.map +1 -0
  19. package/dist/src/plan-event-subscription.d.ts +26 -0
  20. package/dist/src/plan-event-subscription.d.ts.map +1 -0
  21. package/dist/src/plan-event-subscription.js +121 -0
  22. package/dist/src/plan-event-subscription.js.map +1 -0
  23. package/dist/src/plan-event-subscription.test.d.ts +2 -0
  24. package/dist/src/plan-event-subscription.test.d.ts.map +1 -0
  25. package/dist/src/plan-event-subscription.test.js +257 -0
  26. package/dist/src/plan-event-subscription.test.js.map +1 -0
  27. package/dist/src/plan-session-registry.d.ts +24 -0
  28. package/dist/src/plan-session-registry.d.ts.map +1 -0
  29. package/dist/src/plan-session-registry.js +84 -0
  30. package/dist/src/plan-session-registry.js.map +1 -0
  31. package/dist/src/plan-session-registry.test.d.ts +2 -0
  32. package/dist/src/plan-session-registry.test.d.ts.map +1 -0
  33. package/dist/src/plan-session-registry.test.js +109 -0
  34. package/dist/src/plan-session-registry.test.js.map +1 -0
  35. package/dist/src/plan-store-access.d.ts +16 -0
  36. package/dist/src/plan-store-access.d.ts.map +1 -0
  37. package/dist/src/plan-store-access.js +76 -0
  38. package/dist/src/plan-store-access.js.map +1 -0
  39. package/dist/src/plan-store-access.test.d.ts +2 -0
  40. package/dist/src/plan-store-access.test.d.ts.map +1 -0
  41. package/dist/src/plan-store-access.test.js +139 -0
  42. package/dist/src/plan-store-access.test.js.map +1 -0
  43. package/dist/src/plan-tool-middleware.d.ts +20 -0
  44. package/dist/src/plan-tool-middleware.d.ts.map +1 -0
  45. package/dist/src/plan-tool-middleware.js +99 -0
  46. package/dist/src/plan-tool-middleware.js.map +1 -0
  47. package/dist/src/plan-tool-middleware.test.d.ts +2 -0
  48. package/dist/src/plan-tool-middleware.test.d.ts.map +1 -0
  49. package/dist/src/plan-tool-middleware.test.js +329 -0
  50. package/dist/src/plan-tool-middleware.test.js.map +1 -0
  51. package/dist/src/plan-tool-result.d.ts +20 -0
  52. package/dist/src/plan-tool-result.d.ts.map +1 -0
  53. package/dist/src/plan-tool-result.js +78 -0
  54. package/dist/src/plan-tool-result.js.map +1 -0
  55. package/dist/src/plan-tool-result.test.d.ts +2 -0
  56. package/dist/src/plan-tool-result.test.d.ts.map +1 -0
  57. package/dist/src/plan-tool-result.test.js +107 -0
  58. package/dist/src/plan-tool-result.test.js.map +1 -0
  59. package/dist/src/subagent-monitor.js +11 -17
  60. package/dist/src/subagent-monitor.js.map +1 -1
  61. package/dist/src/turn-deliver-buffer.test.js +25 -25
  62. package/openclaw.plugin.json +27 -26
  63. package/package.json +76 -72
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-session-registry.test.js","sourceRoot":"","sources":["../../src/plan-session-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Plan, PlanSummary } from "@xgjktech/xg-openclaw-shared";
2
+ /** 注入 stateDir(来自 api.runtime.state.resolveStateDir())。register(api) 时调用一次。 */
3
+ export declare function setPlanStateDir(dir: string): void;
4
+ /** 测试用:重置模块级缓存与 stateDir */
5
+ export declare function resetPlanStoreAccessForTest(): void;
6
+ /**
7
+ * 按 planId 反查完整计划。
8
+ * 库不存在 / 打开失败 / 读取异常 → 返回 undefined 并记 warn 日志,绝不抛。
9
+ */
10
+ export declare function getPlanById(planId: string): Plan | undefined;
11
+ /**
12
+ * 列出全部计划摘要(重启恢复用)。
13
+ * 异常同上 → 返回空数组,绝不抛。
14
+ */
15
+ export declare function listPlanSummaries(): PlanSummary[];
16
+ //# sourceMappingURL=plan-store-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-store-access.d.ts","sourceRoot":"","sources":["../../src/plan-store-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAWtE,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIjD;AAED,4BAA4B;AAC5B,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAyBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAY5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,EAAE,CAYjD"}
@@ -0,0 +1,76 @@
1
+ import { openPlanStoreReadonly, resolvePlanDbPath } from "@xgjktech/xg-openclaw-shared";
2
+ const LOG_PREFIX = "[xg_cwork_im] [plan-store]";
3
+ let stateDir;
4
+ let handle;
5
+ let warnedNoStateDir = false;
6
+ /** 注入 stateDir(来自 api.runtime.state.resolveStateDir())。register(api) 时调用一次。 */
7
+ export function setPlanStateDir(dir) {
8
+ stateDir = dir;
9
+ handle = undefined;
10
+ warnedNoStateDir = false;
11
+ }
12
+ /** 测试用:重置模块级缓存与 stateDir */
13
+ export function resetPlanStoreAccessForTest() {
14
+ stateDir = undefined;
15
+ handle = undefined;
16
+ warnedNoStateDir = false;
17
+ }
18
+ function getHandle() {
19
+ if (handle) {
20
+ return handle;
21
+ }
22
+ if (!stateDir) {
23
+ if (!warnedNoStateDir) {
24
+ console.warn(`${LOG_PREFIX} stateDir 未设置,无法打开计划库`);
25
+ warnedNoStateDir = true;
26
+ }
27
+ return undefined;
28
+ }
29
+ let dbPath = "<unresolved>";
30
+ try {
31
+ dbPath = resolvePlanDbPath(stateDir);
32
+ handle = openPlanStoreReadonly(dbPath);
33
+ return handle;
34
+ }
35
+ catch (cause) {
36
+ console.warn(`${LOG_PREFIX} 打开计划库失败 dbPath=${dbPath} 原因=${String(cause)}`);
37
+ return undefined;
38
+ }
39
+ }
40
+ /**
41
+ * 按 planId 反查完整计划。
42
+ * 库不存在 / 打开失败 / 读取异常 → 返回 undefined 并记 warn 日志,绝不抛。
43
+ */
44
+ export function getPlanById(planId) {
45
+ const h = getHandle();
46
+ if (!h) {
47
+ return undefined;
48
+ }
49
+ try {
50
+ return h.get(planId);
51
+ }
52
+ catch (cause) {
53
+ console.warn(`${LOG_PREFIX} 读取 plan 失败 planId=${planId} 原因=${String(cause)}`);
54
+ handle = undefined;
55
+ return undefined;
56
+ }
57
+ }
58
+ /**
59
+ * 列出全部计划摘要(重启恢复用)。
60
+ * 异常同上 → 返回空数组,绝不抛。
61
+ */
62
+ export function listPlanSummaries() {
63
+ const h = getHandle();
64
+ if (!h) {
65
+ return [];
66
+ }
67
+ try {
68
+ return h.list();
69
+ }
70
+ catch (cause) {
71
+ console.warn(`${LOG_PREFIX} 列出 plan 列表失败 原因=${String(cause)}`);
72
+ handle = undefined;
73
+ return [];
74
+ }
75
+ }
76
+ //# sourceMappingURL=plan-store-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-store-access.js","sourceRoot":"","sources":["../../src/plan-store-access.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAIxF,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEhD,IAAI,QAA4B,CAAC;AACjC,IAAI,MAA2C,CAAC;AAChD,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,GAAW;IACvC,QAAQ,GAAG,GAAG,CAAC;IACf,MAAM,GAAG,SAAS,CAAC;IACnB,gBAAgB,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,2BAA2B;IACvC,QAAQ,GAAG,SAAS,CAAC;IACrB,MAAM,GAAG,SAAS,CAAC;IACnB,gBAAgB,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS;IACd,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,uBAAuB,CAAC,CAAC;YACnD,gBAAgB,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,GAAG,cAAc,CAAC;IAC5B,IAAI,CAAC;QACD,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,mBAAmB,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACtC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC;QACD,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,sBAAsB,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,GAAG,SAAS,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC7B,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,oBAAoB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,GAAG,SAAS,CAAC;QACnB,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan-store-access.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-store-access.test.d.ts","sourceRoot":"","sources":["../../src/plan-store-access.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { after, afterEach, beforeEach, describe, it } from "node:test";
6
+ import { resolvePlanDbPath, SqlitePlanStore } from "@xgjktech/xg-openclaw-shared";
7
+ import { getPlanById, listPlanSummaries, resetPlanStoreAccessForTest, setPlanStateDir, } from "./plan-store-access.js";
8
+ const tempDirs = [];
9
+ function makeTempStateDir() {
10
+ const dir = mkdtempSync(join(tmpdir(), "xg-plan-store-access-test-"));
11
+ tempDirs.push(dir);
12
+ return dir;
13
+ }
14
+ function makePlan(overrides = {}) {
15
+ return {
16
+ planId: "plan-1",
17
+ goal: "迁移配置到新版本",
18
+ createdAt: "2026-07-27T00:00:00.000Z",
19
+ updatedAt: "2026-07-27T00:00:00.000Z",
20
+ tasks: [],
21
+ ...overrides,
22
+ };
23
+ }
24
+ beforeEach(() => {
25
+ resetPlanStoreAccessForTest();
26
+ });
27
+ afterEach(() => {
28
+ resetPlanStoreAccessForTest();
29
+ });
30
+ after(() => {
31
+ for (const dir of tempDirs) {
32
+ rmSync(dir, { recursive: true, force: true });
33
+ }
34
+ });
35
+ describe("getPlanById / listPlanSummaries: 缺库降级 (F4)", () => {
36
+ it("returns undefined / [] without throwing when plans.sqlite does not exist", () => {
37
+ const stateDir = makeTempStateDir();
38
+ setPlanStateDir(stateDir);
39
+ assert.equal(getPlanById("x"), undefined);
40
+ assert.deepEqual(listPlanSummaries(), []);
41
+ });
42
+ });
43
+ describe("getPlanById: 后建库恢复 (F5)", () => {
44
+ it("recovers once the harness plugin later creates and writes the db, without resetting module state", () => {
45
+ const stateDir = makeTempStateDir();
46
+ setPlanStateDir(stateDir);
47
+ // T1: 库不存在时先调用一次,期望降级为 undefined 且不缓存失败
48
+ assert.equal(getPlanById("plan-1"), undefined);
49
+ // T2: harness 侧后建库并写入
50
+ const dbPath = resolvePlanDbPath(stateDir);
51
+ const writer = new SqlitePlanStore(dbPath);
52
+ writer.set(makePlan({ planId: "plan-1", goal: "后建库恢复" }));
53
+ writer.close();
54
+ // T3: 不重置模块状态,再次调用应能读到(验证未缓存"打开失败")
55
+ const plan = getPlanById("plan-1");
56
+ assert.ok(plan);
57
+ assert.equal(plan.planId, "plan-1");
58
+ assert.equal(plan.goal, "后建库恢复");
59
+ });
60
+ });
61
+ describe("getPlanById: 正常反查", () => {
62
+ it("round-trips a plan with blocked task (note) and steps", () => {
63
+ const stateDir = makeTempStateDir();
64
+ setPlanStateDir(stateDir);
65
+ const dbPath = resolvePlanDbPath(stateDir);
66
+ const writer = new SqlitePlanStore(dbPath);
67
+ writer.set(makePlan({
68
+ planId: "plan-2",
69
+ goal: "带阻塞任务的计划",
70
+ tasks: [
71
+ {
72
+ title: "备份旧配置",
73
+ status: "blocked",
74
+ note: "缺少权限",
75
+ steps: [{ text: "导出 json", status: "completed" }],
76
+ },
77
+ { title: "校验数据", status: "pending" },
78
+ ],
79
+ }));
80
+ writer.close();
81
+ const plan = getPlanById("plan-2");
82
+ assert.ok(plan);
83
+ assert.equal(plan.goal, "带阻塞任务的计划");
84
+ assert.equal(plan.tasks.length, 2);
85
+ assert.equal(plan.tasks[0].status, "blocked");
86
+ assert.equal(plan.tasks[0].note, "缺少权限");
87
+ assert.deepEqual(plan.tasks[0].steps, [{ text: "导出 json", status: "completed" }]);
88
+ assert.equal(plan.tasks[1].status, "pending");
89
+ });
90
+ it("returns undefined for an unknown planId (normal case, not an error)", () => {
91
+ const stateDir = makeTempStateDir();
92
+ setPlanStateDir(stateDir);
93
+ const dbPath = resolvePlanDbPath(stateDir);
94
+ const writer = new SqlitePlanStore(dbPath);
95
+ writer.set(makePlan({ planId: "plan-exists" }));
96
+ writer.close();
97
+ assert.equal(getPlanById("plan-does-not-exist"), undefined);
98
+ });
99
+ });
100
+ describe("listPlanSummaries", () => {
101
+ it("lists all plans with correct taskCounts", () => {
102
+ const stateDir = makeTempStateDir();
103
+ setPlanStateDir(stateDir);
104
+ const dbPath = resolvePlanDbPath(stateDir);
105
+ const writer = new SqlitePlanStore(dbPath);
106
+ writer.set(makePlan({
107
+ planId: "plan-a",
108
+ goal: "计划 A",
109
+ tasks: [
110
+ { title: "t1", status: "completed" },
111
+ { title: "t2", status: "blocked", note: "n" },
112
+ { title: "t3", status: "in_progress" },
113
+ { title: "t4", status: "pending" },
114
+ ],
115
+ }));
116
+ writer.set(makePlan({
117
+ planId: "plan-b",
118
+ goal: "计划 B",
119
+ tasks: [{ title: "t1", status: "completed" }],
120
+ }));
121
+ writer.close();
122
+ const summaries = listPlanSummaries();
123
+ assert.equal(summaries.length, 2);
124
+ const byId = new Map(summaries.map((s) => [s.planId, s]));
125
+ const a = byId.get("plan-a");
126
+ assert.ok(a);
127
+ assert.deepEqual(a.taskCounts, { total: 4, completed: 1, blocked: 1, inProgress: 1 });
128
+ const b = byId.get("plan-b");
129
+ assert.ok(b);
130
+ assert.deepEqual(b.taskCounts, { total: 1, completed: 1, blocked: 0, inProgress: 0 });
131
+ });
132
+ });
133
+ describe("未设置 stateDir", () => {
134
+ it("getPlanById returns undefined without throwing", () => {
135
+ assert.equal(getPlanById("x"), undefined);
136
+ assert.deepEqual(listPlanSummaries(), []);
137
+ });
138
+ });
139
+ //# sourceMappingURL=plan-store-access.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-store-access.test.js","sourceRoot":"","sources":["../../src/plan-store-access.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
+ import type { Plan } from "@xgjktech/xg-openclaw-shared";
3
+ import { type ToolCallTarget } from "./plan-session-registry.js";
4
+ export type AgentToolResultMiddleware = Parameters<OpenClawPluginApi["registerAgentToolResultMiddleware"]>[0];
5
+ export interface PlanMiddlewareDeps {
6
+ /** 推群。实现方注入,内部走 sendTextMessage */
7
+ sendText: (target: ToolCallTarget, content: string) => Promise<void>;
8
+ /** details 缺失时按 planId 反查权威状态(注入 TASK-2 的 getPlanById) */
9
+ getPlanById: (planId: string) => Plan | undefined;
10
+ }
11
+ /**
12
+ * 创建计划工具结果的 middleware handler。
13
+ *
14
+ * 三条硬约束(RULING-1 §2 / DESIGN.md D1b,红线):
15
+ * 1. 绝不抛异常:全身 try/catch,捕获后记 warn 并正常返回。
16
+ * 2. 绝不修改结果:恒返回 void,不 mutate event.result。
17
+ * 3. 不在 handler 内 await 网络 IO:推群走 fire-and-forget,handler 立即返回。
18
+ */
19
+ export declare function createPlanToolResultMiddleware(deps: PlanMiddlewareDeps): AgentToolResultMiddleware;
20
+ //# sourceMappingURL=plan-tool-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-tool-middleware.d.ts","sourceRoot":"","sources":["../../src/plan-tool-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAGzD,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEhH,MAAM,MAAM,yBAAyB,GAAG,UAAU,CAC9C,iBAAiB,CAAC,mCAAmC,CAAC,CACzD,CAAC,CAAC,CAAC,CAAC;AAML,MAAM,WAAW,kBAAkB;IAC/B,mCAAmC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,0DAA0D;IAC1D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC;CACrD;AA2CD;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,kBAAkB,GAAG,yBAAyB,CA2DlG"}
@@ -0,0 +1,99 @@
1
+ import { collectBlockedNotices } from "./plan-blocked-notice.js";
2
+ import { parsePlanToolResultFromValue } from "./plan-tool-result.js";
3
+ import { diffAndMarkBlockedNotices, takeToolCallTarget } from "./plan-session-registry.js";
4
+ const PLAN_TOOL_NAMES = new Set(["xg_plan_write", "xg_plan_execute"]);
5
+ const LOG_PREFIX = "[xg_cwork_im] [plan-tool-middleware]";
6
+ function firstTextContent(result) {
7
+ const first = result.content[0];
8
+ if (!first || first.type !== "text" || typeof first.text !== "string") {
9
+ return undefined;
10
+ }
11
+ return first.text;
12
+ }
13
+ /**
14
+ * 从 middleware 事件中取 plan(优先级见 DESIGN.md D1):
15
+ * 1. `event.result.details`(结构守卫,纯对象无需 JSON.parse)
16
+ * 2. 回退解析 `event.result.content[0].text`
17
+ * 都拿不到 → undefined
18
+ */
19
+ function extractPlanToolResult(event) {
20
+ const fromDetails = parsePlanToolResultFromValue(event.result.details);
21
+ if (fromDetails) {
22
+ return { parsed: fromDetails, fromDetails: true };
23
+ }
24
+ const text = firstTextContent(event.result);
25
+ if (text === undefined) {
26
+ return undefined;
27
+ }
28
+ const fromText = parsePlanToolResultFromValue(safeJsonParse(text));
29
+ if (fromText) {
30
+ return { parsed: fromText, fromDetails: false };
31
+ }
32
+ return undefined;
33
+ }
34
+ function safeJsonParse(text) {
35
+ try {
36
+ return JSON.parse(text);
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ }
42
+ /**
43
+ * 创建计划工具结果的 middleware handler。
44
+ *
45
+ * 三条硬约束(RULING-1 §2 / DESIGN.md D1b,红线):
46
+ * 1. 绝不抛异常:全身 try/catch,捕获后记 warn 并正常返回。
47
+ * 2. 绝不修改结果:恒返回 void,不 mutate event.result。
48
+ * 3. 不在 handler 内 await 网络 IO:推群走 fire-and-forget,handler 立即返回。
49
+ */
50
+ export function createPlanToolResultMiddleware(deps) {
51
+ return (event, _ctx) => {
52
+ try {
53
+ if (!PLAN_TOOL_NAMES.has(event.toolName)) {
54
+ return;
55
+ }
56
+ const extracted = extractPlanToolResult(event);
57
+ if (!extracted) {
58
+ console.warn(`${LOG_PREFIX} 无法从工具返回中解析出合法 plan toolName=${event.toolName} toolCallId=${event.toolCallId}`);
59
+ return;
60
+ }
61
+ const { parsed, fromDetails } = extracted;
62
+ let plan = parsed.plan;
63
+ // 仅当 details 缺失(走了回退路径且仍拿不到完整 plan)时,才用权威反查
64
+ if (!fromDetails) {
65
+ const authoritative = deps.getPlanById(parsed.planId);
66
+ if (authoritative) {
67
+ plan = authoritative;
68
+ }
69
+ }
70
+ const notices = collectBlockedNotices(plan);
71
+ // 查表必须在 diffAndMarkBlockedNotices 之前:后者是标记即生效的副作用,
72
+ // 若先标记、查表再未命中(合成 id / TTL 过期 / onToolStart 早退,均为
73
+ // RULING-2 已确认的真实路径),通知会被误标记为「已推送」但从未送达,
74
+ // 导致同一 blocked key 后续永远不再重推(FINDING-1)。未命中时尚未标记,
75
+ // 下一次工具调用(onToolStart 用新 toolCallId 重新登记)能天然获得重推机会。
76
+ const target = takeToolCallTarget(event.toolCallId);
77
+ if (!target) {
78
+ console.warn(`${LOG_PREFIX} toolCallId 未命中投递目标,放弃本次推群 toolCallId=${event.toolCallId} planId=${parsed.planId}`);
79
+ return;
80
+ }
81
+ // 标记仍在 send 之前:异步 send 失败不重推,是 at-most-once 的有意设计(防刷屏)。
82
+ const fresh = diffAndMarkBlockedNotices(parsed.planId, notices);
83
+ if (fresh.length === 0) {
84
+ return;
85
+ }
86
+ for (const notice of fresh) {
87
+ void deps.sendText(target, notice.content).catch((err) => {
88
+ console.warn(`${LOG_PREFIX} 推群失败 planId=${parsed.planId} taskIndex=${notice.taskIndex}: ${String(err)}`);
89
+ });
90
+ }
91
+ return;
92
+ }
93
+ catch (err) {
94
+ console.warn(`${LOG_PREFIX} handler 内部异常,已吞: ${String(err)}`);
95
+ return;
96
+ }
97
+ };
98
+ }
99
+ //# sourceMappingURL=plan-tool-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-tool-middleware.js","sourceRoot":"","sources":["../../src/plan-tool-middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan-tool-middleware.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-tool-middleware.test.d.ts","sourceRoot":"","sources":["../../src/plan-tool-middleware.test.ts"],"names":[],"mappings":""}