@xgjktech/xg_cwork_im 1.17.0 → 1.17.2

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 (69) hide show
  1. package/README.md +433 -433
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +0 -27
  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.d.ts.map +1 -1
  8. package/dist/src/deliver-text.js +16 -4
  9. package/dist/src/deliver-text.js.map +1 -1
  10. package/dist/src/deliver-text.test.js +22 -22
  11. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  12. package/dist/src/dispatch-mentioned-reply.js +0 -8
  13. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  14. package/dist/src/send-service.d.ts.map +1 -1
  15. package/dist/src/send-service.js +4 -1
  16. package/dist/src/send-service.js.map +1 -1
  17. package/dist/src/subagent-monitor.js +17 -11
  18. package/dist/src/subagent-monitor.js.map +1 -1
  19. package/dist/src/turn-deliver-buffer.test.js +25 -25
  20. package/openclaw.plugin.json +26 -27
  21. package/package.json +72 -76
  22. package/dist/src/plan-blocked-notice.d.ts +0 -15
  23. package/dist/src/plan-blocked-notice.d.ts.map +0 -1
  24. package/dist/src/plan-blocked-notice.js +0 -28
  25. package/dist/src/plan-blocked-notice.js.map +0 -1
  26. package/dist/src/plan-blocked-notice.test.d.ts +0 -2
  27. package/dist/src/plan-blocked-notice.test.d.ts.map +0 -1
  28. package/dist/src/plan-blocked-notice.test.js +0 -80
  29. package/dist/src/plan-blocked-notice.test.js.map +0 -1
  30. package/dist/src/plan-event-subscription.d.ts +0 -26
  31. package/dist/src/plan-event-subscription.d.ts.map +0 -1
  32. package/dist/src/plan-event-subscription.js +0 -121
  33. package/dist/src/plan-event-subscription.js.map +0 -1
  34. package/dist/src/plan-event-subscription.test.d.ts +0 -2
  35. package/dist/src/plan-event-subscription.test.d.ts.map +0 -1
  36. package/dist/src/plan-event-subscription.test.js +0 -257
  37. package/dist/src/plan-event-subscription.test.js.map +0 -1
  38. package/dist/src/plan-session-registry.d.ts +0 -24
  39. package/dist/src/plan-session-registry.d.ts.map +0 -1
  40. package/dist/src/plan-session-registry.js +0 -84
  41. package/dist/src/plan-session-registry.js.map +0 -1
  42. package/dist/src/plan-session-registry.test.d.ts +0 -2
  43. package/dist/src/plan-session-registry.test.d.ts.map +0 -1
  44. package/dist/src/plan-session-registry.test.js +0 -109
  45. package/dist/src/plan-session-registry.test.js.map +0 -1
  46. package/dist/src/plan-store-access.d.ts +0 -16
  47. package/dist/src/plan-store-access.d.ts.map +0 -1
  48. package/dist/src/plan-store-access.js +0 -76
  49. package/dist/src/plan-store-access.js.map +0 -1
  50. package/dist/src/plan-store-access.test.d.ts +0 -2
  51. package/dist/src/plan-store-access.test.d.ts.map +0 -1
  52. package/dist/src/plan-store-access.test.js +0 -139
  53. package/dist/src/plan-store-access.test.js.map +0 -1
  54. package/dist/src/plan-tool-middleware.d.ts +0 -20
  55. package/dist/src/plan-tool-middleware.d.ts.map +0 -1
  56. package/dist/src/plan-tool-middleware.js +0 -99
  57. package/dist/src/plan-tool-middleware.js.map +0 -1
  58. package/dist/src/plan-tool-middleware.test.d.ts +0 -2
  59. package/dist/src/plan-tool-middleware.test.d.ts.map +0 -1
  60. package/dist/src/plan-tool-middleware.test.js +0 -329
  61. package/dist/src/plan-tool-middleware.test.js.map +0 -1
  62. package/dist/src/plan-tool-result.d.ts +0 -20
  63. package/dist/src/plan-tool-result.d.ts.map +0 -1
  64. package/dist/src/plan-tool-result.js +0 -78
  65. package/dist/src/plan-tool-result.js.map +0 -1
  66. package/dist/src/plan-tool-result.test.d.ts +0 -2
  67. package/dist/src/plan-tool-result.test.d.ts.map +0 -1
  68. package/dist/src/plan-tool-result.test.js +0 -107
  69. package/dist/src/plan-tool-result.test.js.map +0 -1
@@ -1,20 +0,0 @@
1
- import type { Plan } from "@xgjktech/xg-openclaw-shared";
2
- export interface ParsedPlanToolResult {
3
- planId: string;
4
- plan: Plan;
5
- /** plan_execute 的返回带 event 字段,plan_write 没有——用于日志区分,不参与正确性判定 */
6
- hasEventField: boolean;
7
- }
8
- /**
9
- * 从已解析的值(如 JSON.parse 结果、middleware 的 `event.result.details`)中
10
- * 结构校验并提取计划工具的成功返回。不是计划工具返回、ok:false 一律返回 undefined。
11
- * 供 `parsePlanToolResult`(字符串输入)与 middleware(对象输入)共用同一份判定,
12
- * 避免两份校验漂移。
13
- */
14
- export declare function parsePlanToolResultFromValue(value: unknown): ParsedPlanToolResult | undefined;
15
- /**
16
- * 从工具返回 JSON 文本中解析计划工具的成功返回。
17
- * 不是计划工具返回、解析失败、ok:false 一律返回 undefined(绝不抛异常)。
18
- */
19
- export declare function parsePlanToolResult(rawBody: string): ParsedPlanToolResult | undefined;
20
- //# sourceMappingURL=plan-tool-result.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan-tool-result.d.ts","sourceRoot":"","sources":["../../src/plan-tool-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,8BAA8B,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,gEAAgE;IAChE,aAAa,EAAE,OAAO,CAAC;CAC1B;AA4CD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAmB7F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CASrF"}
@@ -1,78 +0,0 @@
1
- const TASK_STATUSES = [
2
- "pending",
3
- "in_progress",
4
- "completed",
5
- "blocked",
6
- ];
7
- function isTaskStatus(value) {
8
- return typeof value === "string" && TASK_STATUSES.includes(value);
9
- }
10
- function isPlainObject(value) {
11
- return typeof value === "object" && value !== null && !Array.isArray(value);
12
- }
13
- function isValidPlan(value) {
14
- if (!isPlainObject(value)) {
15
- return false;
16
- }
17
- if (typeof value.planId !== "string" || value.planId === "") {
18
- return false;
19
- }
20
- if (typeof value.goal !== "string") {
21
- return false;
22
- }
23
- if (!Array.isArray(value.tasks)) {
24
- return false;
25
- }
26
- for (const task of value.tasks) {
27
- if (!isPlainObject(task)) {
28
- return false;
29
- }
30
- if (typeof task.title !== "string") {
31
- return false;
32
- }
33
- if (!isTaskStatus(task.status)) {
34
- return false;
35
- }
36
- }
37
- return true;
38
- }
39
- /**
40
- * 从已解析的值(如 JSON.parse 结果、middleware 的 `event.result.details`)中
41
- * 结构校验并提取计划工具的成功返回。不是计划工具返回、ok:false 一律返回 undefined。
42
- * 供 `parsePlanToolResult`(字符串输入)与 middleware(对象输入)共用同一份判定,
43
- * 避免两份校验漂移。
44
- */
45
- export function parsePlanToolResultFromValue(value) {
46
- if (!isPlainObject(value)) {
47
- return undefined;
48
- }
49
- if (value.ok !== true) {
50
- return undefined;
51
- }
52
- if (typeof value.planId !== "string" || value.planId === "") {
53
- return undefined;
54
- }
55
- if (!isValidPlan(value.plan)) {
56
- return undefined;
57
- }
58
- return {
59
- planId: value.planId,
60
- plan: value.plan,
61
- hasEventField: "event" in value,
62
- };
63
- }
64
- /**
65
- * 从工具返回 JSON 文本中解析计划工具的成功返回。
66
- * 不是计划工具返回、解析失败、ok:false 一律返回 undefined(绝不抛异常)。
67
- */
68
- export function parsePlanToolResult(rawBody) {
69
- let parsed;
70
- try {
71
- parsed = JSON.parse(rawBody);
72
- }
73
- catch {
74
- return undefined;
75
- }
76
- return parsePlanToolResultFromValue(parsed);
77
- }
78
- //# sourceMappingURL=plan-tool-result.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan-tool-result.js","sourceRoot":"","sources":["../../src/plan-tool-result.ts"],"names":[],"mappings":"AASA,MAAM,aAAa,GAA0B;IACzC,SAAS;IACT,aAAa;IACb,WAAW;IACX,SAAS;CACZ,CAAC;AAEF,SAAS,YAAY,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IAC/B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACvD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,OAAO,IAAI,KAAK;KAClC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IAC/C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=plan-tool-result.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan-tool-result.test.d.ts","sourceRoot":"","sources":["../../src/plan-tool-result.test.ts"],"names":[],"mappings":""}
@@ -1,107 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { describe, it } from "node:test";
3
- import { parsePlanToolResult } from "./plan-tool-result.js";
4
- const PLAN_WRITE_SUCCESS = JSON.stringify({
5
- ok: true,
6
- planId: "db3b57e4-aaaa-bbbb-cccc-000000000001",
7
- plan: {
8
- planId: "db3b57e4-aaaa-bbbb-cccc-000000000001",
9
- goal: "迁移配置到新版本",
10
- createdAt: "2026-07-27T00:00:00.000Z",
11
- updatedAt: "2026-07-27T00:00:00.000Z",
12
- tasks: [
13
- {
14
- title: "备份旧配置",
15
- status: "blocked",
16
- note: "阻塞原因",
17
- steps: [{ text: "导出 json", status: "pending" }],
18
- },
19
- ],
20
- },
21
- }, null, 2);
22
- const PLAN_EXECUTE_SUCCESS = JSON.stringify({
23
- ok: true,
24
- planId: "db3b57e4-aaaa-bbbb-cccc-000000000002",
25
- plan: {
26
- planId: "db3b57e4-aaaa-bbbb-cccc-000000000002",
27
- goal: "迁移配置到新版本",
28
- createdAt: "2026-07-27T00:00:00.000Z",
29
- updatedAt: "2026-07-27T00:01:00.000Z",
30
- tasks: [
31
- {
32
- title: "备份旧配置",
33
- status: "completed",
34
- steps: [{ text: "导出 json", status: "completed" }],
35
- },
36
- ],
37
- },
38
- event: { emitted: false, reason: "no runId" },
39
- }, null, 2);
40
- describe("parsePlanToolResult", () => {
41
- it("parses a real plan_write success body", () => {
42
- const result = parsePlanToolResult(PLAN_WRITE_SUCCESS);
43
- assert.ok(result);
44
- assert.equal(result.planId, "db3b57e4-aaaa-bbbb-cccc-000000000001");
45
- assert.equal(result.plan.goal, "迁移配置到新版本");
46
- assert.equal(result.hasEventField, false);
47
- });
48
- it("parses a real plan_execute success body with event field", () => {
49
- const result = parsePlanToolResult(PLAN_EXECUTE_SUCCESS);
50
- assert.ok(result);
51
- assert.equal(result.planId, "db3b57e4-aaaa-bbbb-cccc-000000000002");
52
- assert.equal(result.hasEventField, true);
53
- });
54
- for (const code of [
55
- "PLAN_NOT_FOUND",
56
- "INDEX_OUT_OF_RANGE",
57
- "NOTE_REQUIRED",
58
- "STEP_INDEX_REQUIRED",
59
- "INVARIANT_VIOLATION",
60
- "STORE_ERROR",
61
- ]) {
62
- it(`returns undefined for ok:false with code ${code}`, () => {
63
- const body = JSON.stringify({ ok: false, error: { code, detail: "可选" } }, null, 2);
64
- assert.equal(parsePlanToolResult(body), undefined);
65
- });
66
- }
67
- it("returns undefined for empty string / non-json / non-object json", () => {
68
- assert.equal(parsePlanToolResult(""), undefined);
69
- assert.equal(parsePlanToolResult("not json"), undefined);
70
- assert.equal(parsePlanToolResult("[]"), undefined);
71
- assert.equal(parsePlanToolResult("123"), undefined);
72
- assert.equal(parsePlanToolResult("null"), undefined);
73
- });
74
- it("does not misfire on an unrelated tool's ok:true body", () => {
75
- const body = JSON.stringify({ ok: true, data: 123 }, null, 2);
76
- assert.equal(parsePlanToolResult(body), undefined);
77
- });
78
- it("returns undefined when plan.tasks contains an invalid status", () => {
79
- const body = JSON.stringify({
80
- ok: true,
81
- planId: "p1",
82
- plan: {
83
- planId: "p1",
84
- goal: "g",
85
- createdAt: "t",
86
- updatedAt: "t",
87
- tasks: [{ title: "x", status: "unknown_status" }],
88
- },
89
- }, null, 2);
90
- assert.equal(parsePlanToolResult(body), undefined);
91
- });
92
- it("returns undefined when planId is missing or empty", () => {
93
- const body = JSON.stringify({
94
- ok: true,
95
- planId: "",
96
- plan: {
97
- planId: "p1",
98
- goal: "g",
99
- createdAt: "t",
100
- updatedAt: "t",
101
- tasks: [],
102
- },
103
- }, null, 2);
104
- assert.equal(parsePlanToolResult(body), undefined);
105
- });
106
- });
107
- //# sourceMappingURL=plan-tool-result.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan-tool-result.test.js","sourceRoot":"","sources":["../../src/plan-tool-result.test.ts"],"names":[],"mappings":"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"}