@xgjktech/xg_cwork_im 1.16.44 → 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 (59) 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/deliver-text.test.js +22 -22
  6. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  7. package/dist/src/dispatch-mentioned-reply.js +8 -0
  8. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  9. package/dist/src/plan-blocked-notice.d.ts +15 -0
  10. package/dist/src/plan-blocked-notice.d.ts.map +1 -0
  11. package/dist/src/plan-blocked-notice.js +28 -0
  12. package/dist/src/plan-blocked-notice.js.map +1 -0
  13. package/dist/src/plan-blocked-notice.test.d.ts +2 -0
  14. package/dist/src/plan-blocked-notice.test.d.ts.map +1 -0
  15. package/dist/src/plan-blocked-notice.test.js +80 -0
  16. package/dist/src/plan-blocked-notice.test.js.map +1 -0
  17. package/dist/src/plan-event-subscription.d.ts +26 -0
  18. package/dist/src/plan-event-subscription.d.ts.map +1 -0
  19. package/dist/src/plan-event-subscription.js +121 -0
  20. package/dist/src/plan-event-subscription.js.map +1 -0
  21. package/dist/src/plan-event-subscription.test.d.ts +2 -0
  22. package/dist/src/plan-event-subscription.test.d.ts.map +1 -0
  23. package/dist/src/plan-event-subscription.test.js +257 -0
  24. package/dist/src/plan-event-subscription.test.js.map +1 -0
  25. package/dist/src/plan-session-registry.d.ts +24 -0
  26. package/dist/src/plan-session-registry.d.ts.map +1 -0
  27. package/dist/src/plan-session-registry.js +84 -0
  28. package/dist/src/plan-session-registry.js.map +1 -0
  29. package/dist/src/plan-session-registry.test.d.ts +2 -0
  30. package/dist/src/plan-session-registry.test.d.ts.map +1 -0
  31. package/dist/src/plan-session-registry.test.js +109 -0
  32. package/dist/src/plan-session-registry.test.js.map +1 -0
  33. package/dist/src/plan-store-access.d.ts +16 -0
  34. package/dist/src/plan-store-access.d.ts.map +1 -0
  35. package/dist/src/plan-store-access.js +76 -0
  36. package/dist/src/plan-store-access.js.map +1 -0
  37. package/dist/src/plan-store-access.test.d.ts +2 -0
  38. package/dist/src/plan-store-access.test.d.ts.map +1 -0
  39. package/dist/src/plan-store-access.test.js +139 -0
  40. package/dist/src/plan-store-access.test.js.map +1 -0
  41. package/dist/src/plan-tool-middleware.d.ts +20 -0
  42. package/dist/src/plan-tool-middleware.d.ts.map +1 -0
  43. package/dist/src/plan-tool-middleware.js +99 -0
  44. package/dist/src/plan-tool-middleware.js.map +1 -0
  45. package/dist/src/plan-tool-middleware.test.d.ts +2 -0
  46. package/dist/src/plan-tool-middleware.test.d.ts.map +1 -0
  47. package/dist/src/plan-tool-middleware.test.js +329 -0
  48. package/dist/src/plan-tool-middleware.test.js.map +1 -0
  49. package/dist/src/plan-tool-result.d.ts +20 -0
  50. package/dist/src/plan-tool-result.d.ts.map +1 -0
  51. package/dist/src/plan-tool-result.js +78 -0
  52. package/dist/src/plan-tool-result.js.map +1 -0
  53. package/dist/src/plan-tool-result.test.d.ts +2 -0
  54. package/dist/src/plan-tool-result.test.d.ts.map +1 -0
  55. package/dist/src/plan-tool-result.test.js +107 -0
  56. package/dist/src/plan-tool-result.test.js.map +1 -0
  57. package/dist/src/turn-deliver-buffer.test.js +25 -25
  58. package/openclaw.plugin.json +27 -26
  59. package/package.json +76 -72
@@ -0,0 +1,20 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,78 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan-tool-result.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-tool-result.test.d.ts","sourceRoot":"","sources":["../../src/plan-tool-result.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-tool-result.test.js","sourceRoot":"","sources":["../../src/plan-tool-result.test.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,36 @@
1
1
  import assert from "node:assert/strict";
2
2
  import { describe, it } from "node:test";
3
3
  import { isDeliverPayloadSendable, isDeliverTextRevision, snapshotSupersedesBufferText, TurnDeliverBuffer, } from "./turn-deliver-buffer.js";
4
- const HOUTONG_BODY_LOOSE = `确实是这个问题:昨天那版虽然用了内嵌 SVG,但你现在的文档预览器没有把 SVG 正常渲染出来,所以流程看不到。
5
-
6
- 我已经重新生成了一版**纯 Markdown 可读版**:
7
-
8
- - 不用 SVG
9
- 新文件:
10
-
4
+ const HOUTONG_BODY_LOOSE = `确实是这个问题:昨天那版虽然用了内嵌 SVG,但你现在的文档预览器没有把 SVG 正常渲染出来,所以流程看不到。
5
+
6
+ 我已经重新生成了一版**纯 Markdown 可读版**:
7
+
8
+ - 不用 SVG
9
+ 新文件:
10
+
11
11
  -----`;
12
- const HOUTONG_BODY_TIGHT = `确实是这个问题:昨天那版虽然用了内嵌 SVG,但你现在的文档预览器没有把 SVG 正常渲染出来,所以流程看不到。
13
- 我已经重新生成了一版**纯 Markdown 可读版**:
14
- - 不用 SVG
12
+ const HOUTONG_BODY_TIGHT = `确实是这个问题:昨天那版虽然用了内嵌 SVG,但你现在的文档预览器没有把 SVG 正常渲染出来,所以流程看不到。
13
+ 我已经重新生成了一版**纯 Markdown 可读版**:
14
+ - 不用 SVG
15
15
  新文件:`;
16
- const WORLD_CUP_PARTIAL = `| 场次 | 时间 |
17
- | --- | --- |
18
- | 1 | 21:00 |
16
+ const WORLD_CUP_PARTIAL = `| 场次 | 时间 |
17
+ | --- | --- |
18
+ | 1 | 21:00 |
19
19
  | 2 |`;
20
- const WORLD_CUP_FULL = `| 场次 | 时间 |
21
- | --- | --- |
22
- | 1 | 21:00 |
23
- | 2 | 00:00 |
20
+ const WORLD_CUP_FULL = `| 场次 | 时间 |
21
+ | --- | --- |
22
+ | 1 | 21:00 |
23
+ | 2 | 00:00 |
24
24
  | 3 | 03:00 |`;
25
- const RT002_PART1 = `BEGIN_123
26
-
27
- ## 一、背景
28
-
25
+ const RT002_PART1 = `BEGIN_123
26
+
27
+ ## 一、背景
28
+
29
29
  随着人工智能技术的快速发展,企业级AI助手在提升工作效率中发挥着日益重要的作用。`;
30
- const RT002_PART2 = `- 工具调用的完整日志必须被记录,包括调用时间、调用者、工具名称。
31
-
32
- ## 六、审计
33
-
30
+ const RT002_PART2 = `- 工具调用的完整日志必须被记录,包括调用时间、调用者、工具名称。
31
+
32
+ ## 六、审计
33
+
34
34
  审计是AI助手治理的监督机制。`;
35
35
  function entry(textPart, hasMedia = false) {
36
36
  return {
@@ -1,27 +1,28 @@
1
- {
2
- "id": "xg_cwork_im",
3
- "channels": [
4
- "xg_cwork_im"
5
- ],
6
- "channelConfigs": {
7
- "xg_cwork_im": {
8
- "schema": {
9
- "type": "object",
10
- "additionalProperties": true,
11
- "properties": {}
12
- }
13
- }
14
- },
15
- "configSchema": {
16
- "type": "object",
17
- "additionalProperties": true,
18
- "properties": {}
19
- },
20
- "contracts": {
21
- "tools": [
22
- "xg_cwork_im_get_group_chat_history",
23
- "xg_cwork_im_send_group_message",
24
- "xg_cwork_im_send_file"
25
- ]
26
- }
1
+ {
2
+ "id": "xg_cwork_im",
3
+ "channels": [
4
+ "xg_cwork_im"
5
+ ],
6
+ "channelConfigs": {
7
+ "xg_cwork_im": {
8
+ "schema": {
9
+ "type": "object",
10
+ "additionalProperties": true,
11
+ "properties": {}
12
+ }
13
+ }
14
+ },
15
+ "configSchema": {
16
+ "type": "object",
17
+ "additionalProperties": true,
18
+ "properties": {}
19
+ },
20
+ "contracts": {
21
+ "tools": [
22
+ "xg_cwork_im_get_group_chat_history",
23
+ "xg_cwork_im_send_group_message",
24
+ "xg_cwork_im_send_file"
25
+ ],
26
+ "agentToolResultMiddleware": ["openclaw"]
27
+ }
27
28
  }
package/package.json CHANGED
@@ -1,72 +1,76 @@
1
- {
2
- "name": "@xgjktech/xg_cwork_im",
3
- "version": "1.16.44",
4
- "description": "XG CWork IM channel plugin for OpenClaw",
5
- "keywords": [
6
- "bot",
7
- "channel",
8
- "openclaw",
9
- "xg_cwork_im",
10
- "im"
11
- ],
12
- "license": "MIT",
13
- "type": "module",
14
- "main": "dist/index.js",
15
- "types": "dist/index.d.ts",
16
- "files": [
17
- ".npmrc",
18
- "dist/**/*",
19
- "openclaw.plugin.json"
20
- ],
21
- "scripts": {
22
- "build": "tsc -p tsconfig.json",
23
- "type-check": "tsc -p tsconfig.json --noEmit",
24
- "lint": "tsc -p tsconfig.json --noEmit",
25
- "test": "npm run build && node --test dist/src/inbound-terminal-state.test.js dist/src/user-facing-errors.test.js dist/src/deliver-text.test.js dist/src/agent-context-types.test.js dist/src/block-streaming-config.test.js dist/src/per-message-fallback-notice.test.js dist/src/thinking-ws-progress.test.js dist/src/resource-file.test.js dist/src/turn-deliver-buffer.test.js dist/src/run-usage.test.js dist/src/ws-run-event-unmapped.test.js dist/src/send-service.test.js dist/src/send-file-tool.test.js",
26
- "install:prod": "npm install --omit=dev",
27
- "prepublishOnly": "npm run build"
28
- },
29
- "dependencies": {
30
- "@sinclair/typebox": "^0.32.0",
31
- "axios": "^1.6.0",
32
- "ws": "^8.17.0",
33
- "zod": "^3.22.0"
34
- },
35
- "devDependencies": {
36
- "@types/node": "^20.0.0",
37
- "@types/ws": "^8.5.10",
38
- "openclaw": "^2026.6.10",
39
- "typescript": "^5.3.0"
40
- },
41
- "peerDependencies": {
42
- "openclaw": ">=2026.6.10"
43
- },
44
- "peerDependenciesMeta": {
45
- "openclaw": {
46
- "optional": true
47
- }
48
- },
49
- "openclaw": {
50
- "extensions": [
51
- "./dist/index.js"
52
- ],
53
- "channels": [
54
- "xg_cwork_im"
55
- ],
56
- "installDependencies": false,
57
- "channel": {
58
- "id": "xg_cwork_im",
59
- "label": "XG CWork IM",
60
- "selectionLabel": "XG CWork IM (工作说说)",
61
- "blurb": "工作说说 IM 机器人 Channel 插件,通过 WebSocket 长连接接收消息。",
62
- "aliases": [
63
- "xg_cwork_im",
64
- "im"
65
- ]
66
- },
67
- "install": {
68
- "localPath": ".",
69
- "defaultChoice": "local"
70
- }
71
- }
72
- }
1
+ {
2
+ "name": "@xgjktech/xg_cwork_im",
3
+ "version": "1.17.0",
4
+ "description": "XG CWork IM channel plugin for OpenClaw",
5
+ "keywords": [
6
+ "bot",
7
+ "channel",
8
+ "openclaw",
9
+ "xg_cwork_im",
10
+ "im"
11
+ ],
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "main": "dist/index.js",
15
+ "types": "dist/index.d.ts",
16
+ "engines": {
17
+ "node": ">=22.19.0"
18
+ },
19
+ "files": [
20
+ ".npmrc",
21
+ "dist/**/*",
22
+ "openclaw.plugin.json"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "type-check": "tsc -p tsconfig.json --noEmit",
27
+ "lint": "tsc -p tsconfig.json --noEmit",
28
+ "test": "npm run build && node --test dist/src/inbound-terminal-state.test.js dist/src/user-facing-errors.test.js dist/src/deliver-text.test.js dist/src/agent-context-types.test.js dist/src/block-streaming-config.test.js dist/src/per-message-fallback-notice.test.js dist/src/thinking-ws-progress.test.js dist/src/resource-file.test.js dist/src/turn-deliver-buffer.test.js dist/src/run-usage.test.js dist/src/ws-run-event-unmapped.test.js dist/src/send-service.test.js dist/src/send-file-tool.test.js dist/src/plan-tool-result.test.js dist/src/plan-blocked-notice.test.js dist/src/plan-store-access.test.js dist/src/plan-session-registry.test.js dist/src/plan-tool-middleware.test.js dist/src/plan-event-subscription.test.js",
29
+ "install:prod": "npm install --omit=dev",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "dependencies": {
33
+ "@sinclair/typebox": "^0.32.0",
34
+ "@xgjktech/xg-openclaw-shared": "^0.1.0",
35
+ "axios": "^1.6.0",
36
+ "ws": "^8.17.0",
37
+ "zod": "^3.22.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^22.19.0",
41
+ "@types/ws": "^8.5.10",
42
+ "openclaw": "^2026.6.10",
43
+ "typescript": "^5.3.0"
44
+ },
45
+ "peerDependencies": {
46
+ "openclaw": ">=2026.6.10"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "openclaw": {
50
+ "optional": true
51
+ }
52
+ },
53
+ "openclaw": {
54
+ "extensions": [
55
+ "./dist/index.js"
56
+ ],
57
+ "channels": [
58
+ "xg_cwork_im"
59
+ ],
60
+ "installDependencies": false,
61
+ "channel": {
62
+ "id": "xg_cwork_im",
63
+ "label": "XG CWork IM",
64
+ "selectionLabel": "XG CWork IM (工作说说)",
65
+ "blurb": "工作说说 IM 机器人 Channel 插件,通过 WebSocket 长连接接收消息。",
66
+ "aliases": [
67
+ "xg_cwork_im",
68
+ "im"
69
+ ]
70
+ },
71
+ "install": {
72
+ "localPath": ".",
73
+ "defaultChoice": "local"
74
+ }
75
+ }
76
+ }